View previous topic :: View next topic |
Author |
Message |
nic0000 l33t
Joined: 25 Sep 2005 Posts: 658
|
Posted: Thu Apr 27, 2006 5:23 pm Post subject: Will unkompliziert Änderungen in Konfigs machen (bash) |
|
|
Auch auf die Gefahr hier gleich gesteingt zu werden:
Ich suche eine unkomplizierte&&zuverlässige&&idiot-proof Methode um aus der bash bzw. bashskripten herraus an config-Dateinen zu manipulieren.
Beispiel :
Code: | poseidon ~ # cat /etc/portage/package.use
sys-apps/hal acpi
net-misc/openssh chroot sftplogging
app-misc/mc 7zip -X
net-print/foomatic-db ppds |
# Mache Voodoo (String löschen)
Code: | sys-apps/hal acpi
net-misc/openssh chroot sftplogging
app-misc/mc 7zip
net-print/foomatic-db ppds |
oder
# Mache Voodoo (String ersetzen)
Code: | sys-apps/hal acpi
net-misc/openssh chroot sftplogging
app-misc/mc -X
net-print/foomatic-db ppds |
OK, normale weise wird so etwas mit awk oder sed gemacht, das ist mir aber zu kompliziert bzw. ein kleiner Fehler in dem Ausdruck führt leicht zum GAU. (Ich will aber nicht alles wieder überprüfen müssen, ich will mich einfach verlassen können.)
Geht das eventuell noch einfacher bzw. kennt jemand ein Framework welches genau für diese Problem gemacht ist?
Ich weiß das die frage trivial erscheint aber für mich hat sich noch keine zufriedenstellende Lösung ergeben.
tnx _________________ grüße
nico |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5328
|
Posted: Thu Apr 27, 2006 10:30 pm Post subject: |
|
|
für diese geschichte habe ich mir ein "kleines" script geschrieben, welches auch sed verwendet.
sed wird hier nur für die eigentliche ersetzten der zeile gebraucht.
adduse.sh
Code: | #!/bin/bash
printusage()
{
echo "usage:"
echo "$0 <package> <use1> <use2> ... <usen>"
echo ""
echo "use1...n: specify the USE-flags to be used (eg. kde, xml)"
echo "package: packages which to add to the /etc/portage/package.keywords file"
echo " with the given <uses>"
}
if [ $# -eq 1 ]; then
echo "not enought parmeters"
printusage
fi
PACKAGE=$1
PACKAGE_USE_FILE="/etc/portage/package.use"
shift
# check if the package is already in the file
ALREADY_IN=`grep $PACKAGE $PACKAGE_USE_FILE`
if [ -z "${ALREADY_IN}" ]; then
echo "add \"$PACKAGE\" to $PACKAGE_USE_FILE with \"$@\" as use-flags"
echo "${PACKAGE} ${@}" >> ${PACKAGE_USE_FILE}
else
USES=${ALREADY_IN/${PACKAGE} /""}
# escape the "/" and whitespaces for sed
ALREADY_IN=${ALREADY_IN//\//'\/'}
ALREADY_IN=${ALREADY_IN//\ /'\ '}
USEADD=""
CHANGE="false"
# check if some of the useflags already set for the package and remove them from the to set list
for use in "$@"; do
if [ "${use:0:1}" == "-" ]; then
CHECK_UNSET=`echo $USES | grep -oe "$use" `
if [ -z "$CHECK_UNSET" ]; then
use1=${use/\-/""}
CHECK=`echo $USES | grep -oe "$use1" `
if [ -n "$CHECK" ]; then
use1=${use/\-/""}
USES=${USES/$use1/\-$use1}
CHANGE="true"
else
USEADD="$USEADD $use"
fi
fi
else
CHECK=`echo $USES | grep -oe "$use"`
CHECK_UNSET=`echo $USES | grep -oe "-$use" `
if [ "$CHECK_UNSET" ]; then
USES=${USES/\-$use/$use}
CHANGE="true"
elif [ -z "$CHECK" ]; then
USEADD="$USEADD $use"
fi
fi
done
if [ -z "$USEADD" -a "$CHANGE" == "false" ]; then
echo "the useflags \"$@\" for the package \"$PACKAGE\" already set"
else
USES="$USES $USEADD"
L=${#USES}
let "L -= 1"
if [ "${USES:$L:1}" == " " ]; then
USES=${USES:0:$L}
fi
#replace double whitespaces with one
USES=${USES/\ \ /' '}
LINE="${PACKAGE} $USES"
# escape the "/" and whitespaces for sed
LINE=${LINE//\//'\/'}
LINE=${LINE//\ /'\ '}
LINE=${LINE#\ /''}
echo "replace \"$PACKAGE\" entry in $PACKAGE_USE_FILE with following useflags \"$USES\""
sed "s/${ALREADY_IN}/${LINE}/1" ${PACKAGE_USE_FILE} > ${PACKAGE_USE_FILE}1
mv ${PACKAGE_USE_FILE}1 ${PACKAGE_USE_FILE}
fi
fi |
_________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
nic0000 l33t
Joined: 25 Sep 2005 Posts: 658
|
Posted: Fri Apr 28, 2006 1:59 pm Post subject: |
|
|
Vielen Dank firefly für dein nützliches Skript welches mir schon bisschen weiterhilft.
Ich mag es ja kaum glauben, das es kein Framework gibt mit dem auf einfache weise jegliche Art von Ersetzung/Hinzufügung/Entfernung von Strings innerhalb einer Datei gibt. Oder vielleicht formuliere ich meine Frage einfach nur verkehrt??
Ich beschreibe mal was ich erreichen will, eventuell ist selbst mein Ansatz schon fürn A*sch:
Ich möchte mehrere Workstations verwalten. Die Workstations sind ähnlich aber nicht zwingend 100% gleich.
Zu diesem Zweck möchte ich in einem Ordner "/irgendwo/my-etc" (welcher eine unvollständige Kopie des Ordners /etc ist) Dateien liegen haben welche nur die von mir "global" kontrollierten Parameter haben sollen. Alles was nicht dadrin steht kann sich auf den Workstations unterscheiden.
Jetzt soll ein Voodoo Skript die Order Vergleichen und wenn es eine Datei mit gleichen Namen in /irgendwo/my-etc findet, dann soll es die Workstation "auf Kurs" bringen.
Eine Konfigurationsdatei ist "immer" eine OPTION=WERT Zuweisung.
Dadurch haben wir immer einen Marker (OPTION)
Hier die einzelnen usecases die mir so spontan einfallen und in Klammern die Technik welche _mir_ dazu einfällt.
usecase: Komplette Ersetzung der Datei (cp)
Code: | cp /irgendwo/my-etc/datei /etc/datei |
usecase: Komplette Ersetzung einer Zeile(diff):
Zeile X wird gegen Zeile Y getauscht.
Code: | OPTION=WERT1 WERT2 WERT3
wird zu
OPTION=NEUERWERT1 GANZNEUERWERT2 |
usecase: Teilweise Ersetzung einer Zeile (sed):
(es gibt mehrere Werte aber nur einer soll geändert werden)
Code: | OPTION=WERT1 WERT2 WERT3
wird zu
OPTION=NEUERWERT1 WERT2 WERT3 |
Wobei die letzten Beiden nicht ohne aktives zu tun des Admins sich lösen lassen, denn woher soll das Voodoo-Skript denn wissen was es jetzt tun soll?
Dann gibt es noch solches Händling wie z.B. was soll passieren wenn eine OPTION nicht gefunden wird? Anlegen oder ignorieren? Wenn Anlegen dann wo?
Als besondere Anforderung gilt es die Struktur des Dokumentes nicht zu verändern
Ich gebe zu das dieses Problem nicht trivial ist und schon sehr viel dazu gehört eine "gute Lösung" (tm) dafür zu finden.
Ich dachte aber es gibt es schon etwas, was bisschen leichter zu bedienen ist als sed, awk und wo nicht immer überlegt werden muss um was ein case es sich handelt.
Zumal ein Backupsystem und eine Benachrichtigung via Mail oder zumindest ein Log vom Vorteil währe
Fällt jemanden noch etwas ein? _________________ grüße
nico |
|
Back to top |
|
|
smg Veteran
Joined: 13 Aug 2004 Posts: 1402 Location: /home/stephan
|
Posted: Fri Apr 28, 2006 2:40 pm Post subject: |
|
|
Sorry, aber:
?
Bye. _________________ GnuPG-Key-ID: 0xF8C275D4
Fingerprint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Code: | perl -WTe '($")=$/;print qq(@{[reverse('0'..'100')]}$/BOOM!$/);' |
|
|
Back to top |
|
|
nic0000 l33t
Joined: 25 Sep 2005 Posts: 658
|
Posted: Fri Apr 28, 2006 3:31 pm Post subject: |
|
|
smg wrote: | Sorry, aber:
? |
Brauchst dich nicht zu Entschuldigen.
Ich suche ein Framework oder ein Programm welches für den oben beschreibende Prozedur _optimiert_ ist und nicht ein Schweizer Taschenmesser. _________________ grüße
nico |
|
Back to top |
|
|
toskala Advocate
Joined: 14 Dec 2002 Posts: 2080 Location: hamburg, germany
|
Posted: Thu May 11, 2006 7:31 pm Post subject: |
|
|
ich weiss nich genau was dein wunsch-tool an deinem eingänglichen beispiel anders macht als $EDITOR?
edit: auch nach mehrfachem durchlesen erschließt sich mir nicht, was an $EDITOR _nicht_ deinen wünschen entspricht. _________________ adopt an unanswered post
erst denken, dann posten |
|
Back to top |
|
|
nic0000 l33t
Joined: 25 Sep 2005 Posts: 658
|
Posted: Thu May 11, 2006 8:36 pm Post subject: |
|
|
toskala wrote: | ich weiss nich genau was dein wunsch-tool an deinem eingänglichen beispiel anders macht als $EDITOR? |
Das kann ich schnell beantworten: $EDITOR bedeutet jedes File per Hand anzufassen.
toskala wrote: | edit: auch nach mehrfachem durchlesen erschließt sich mir nicht, was an $EDITOR _nicht_ deinen wünschen entspricht. |
Das ich jedes File interaktiv anfassen muss.
Also noch einmal, (denn vielleicht reicht ja mein deutsch nicht aus um sich verständlich zu machen) was ich machen will:
Ich habe z.B. 100 Workstations.
Alle diese Workstations haben Gentoo drauf.
Die meisten sind gleich, aber einige sind bisschen anderes andere USE, mehr Programme, andere Parameter in Configs usw.
Angenommen ich möchte global eine Änderung an einer X-beliebigen Parameter in einer X-beliebigen $CONFIG machen?
Z.B einen Wert ändern:
Code: | */15 * * * * root rdate -s timeserver.1.tld 2>&1 >/dev/null
|
in
Code: | */15 * * * * root rdate -s timeserver.10.tld 2>&1 >/dev/null
|
Oder
Einen String löschen möchte, oder einen String an einer bestimmten Stelle einfügen möchte ....
dann tue ich es per sed, awk oder, wenn ich mir ganz sicher bin, per diff.
mittlerweile habe ich das hier gefunden und stricke mir selbst ein Framework für diese Aufgabe.
http://www.jjj.de/shell/replacepage.html
PS.
Diese Aufgabe ist unter Windows mit seiner Registry so etwas von trivial, das Windows Coder sich über die vergleichsweise komplizierte Manipulation unter UN*X lustig machen.
danke fürs kommen _________________ grüße
nico |
|
Back to top |
|
|
mrsteven Veteran
Joined: 04 Jul 2003 Posts: 1939
|
Posted: Thu May 11, 2006 8:48 pm Post subject: |
|
|
nic0000 wrote: | PS.
Diese Aufgabe ist unter Windows mit seiner Registry so etwas von trivial, das Windows Coder sich über die vergleichsweise komplizierte Manipulation unter UN*X lustig machen. |
Dann lass den Windows-Leuten doch einmal ihren Spaß. Wenn Windows wegen einer kaputten Registry mal wieder nicht booten will lachen wir Linuxmenschen wieder... |
|
Back to top |
|
|
toskala Advocate
Joined: 14 Dec 2002 Posts: 2080 Location: hamburg, germany
|
Posted: Fri May 12, 2006 12:36 pm Post subject: |
|
|
ah, so langsam verstehe ich was du willst.
aus deinem ausgangsposting habe ich vermutet, dass du einfach ein "idioten-tool" willst, damit generischer depp in den config files rumwursteln kann ohne was kaputt zu machen.
mir ist nichts bekannt, was genau diesen zweck erfüllt, also zumindest nicht out-of-the-box.
aber mit den üblichen verdächtigen sollte man sowas schnell zusammengescripted haben.
welchen umfang soll das denn bekommen?
ich meine wenn wir mal kurz bei deinem beispiel "100 workstations unter gentoo" bleiben, dann muss so ein tool schon da ansetzen wo du die kisten installiert hast. sprich die installation muss schon entsprechend vorbereitet sein, etc.
welchen funktionsumfang soll es denn kriegen?
cheerios,
toskala _________________ adopt an unanswered post
erst denken, dann posten |
|
Back to top |
|
|
misterjack Veteran
Joined: 03 Oct 2004 Posts: 1657
|
Posted: Fri May 12, 2006 1:27 pm Post subject: |
|
|
Code: | diff=`diff localdatei globaldatei`;
if [ "$diff" != "" ]; then cp globaldatei localdatei; fi |
alles andere wäre mir eindeutig zu kompliziert und zu aufwendig für den zweck _________________ „Meine Meinung steht fest! Bitte verwirren Sie mich nicht mit Tatsachen.“ |
|
Back to top |
|
|
nic0000 l33t
Joined: 25 Sep 2005 Posts: 658
|
Posted: Fri May 12, 2006 3:14 pm Post subject: |
|
|
toskala wrote: | ah, so langsam verstehe ich was du willst. |
Ich kann mich ja doch noch verständlich machen
toskala wrote: | aus deinem ausgangsposting habe ich vermutet, dass du einfach ein "idioten-tool" willst, damit generischer depp in den config files rumwursteln kann ohne was kaputt zu machen. |
Also wenn du mich als den "generischer depp" Prototypen ansiehst, dann stimmt das sogar
toskala wrote: | mir ist nichts bekannt, was genau diesen zweck erfüllt, also zumindest nicht out-of-the-box. |
toskala wrote: | aber mit den üblichen verdächtigen sollte man sowas schnell zusammengescripted haben. |
Also ich tue mir gerade ziemlich schwer damit.
toskala wrote: | ich meine wenn wir mal kurz bei deinem beispiel "100 workstations unter gentoo" bleiben, dann muss so ein tool schon da ansetzen wo du die kisten installiert hast. sprich die installation muss schon entsprechend vorbereitet sein, etc. |
Also der Plan sieht so aus:
Die Hardware ist auf wenige Typen beschränkt:
Dell Optiplex SX270 sowie ein paar Laptop-Modelle. Später soll das mehr werden, aber zu Zeit beschränke ich mich auf die SX Teile.
Bei mir zu Hause habe ich ein Referenz-System von welchen eine Bauanleitung und die Configs als Basis genommen werden.
Eine Stage 4 Installation über NFS bei welcher der Client über PXE in Kanotix hochgefahren wird.
Ich starte dann per Hand ssh, vergebe Passwort für root und gehe zurück an meinen Rechner um anschließend ein Skript herüber zu kopieren und anzustoßen.
(Kann bestimmt noch einfacher gemacht werden, ich hätte gerne eine angepasste Kanotix, welche alles automatisch macht)
Hätte ich mehr Geld zu Verfügung, dann würde ich 10 gleiche HDD kaufen und spiegeln.
Damit haben die Kisten schon mal gleiche Basis, aber natürlich lerne ich dazu und die älteren Installationen sollen die Änderungen mitbekommen.
Also schlägt jetzt dieses Szenario zu (Wird gerade entwickelt):
Mein Internet-Server synct gegen eine offizielle Gentoo.org Quelle.
Über diesen Eintrag in der /etc/make.conf wird
Code: | RSYNC_EXCLUDEFROM=/etc/portage/rsync_excludes |
Code: | hal9000plus ~ # cat /etc/portage/rsync_excludes
overlays |
Spare ich einen Ordner aus
Wieder in der /etc/make.conf werden diese Overleys eingetragen
Code: | PORTDIR_OVERLAY="/usr/portage/overlays/local \
/usr/portage/overlays/hoppix-org \
/usr/portage/overlays/hoppix-beta \
/usr/portage/overlays/hoppix-dev \
/usr/portage/overlays/hoppix-test \
/usr/portage/overlays/gentoo-de" |
Die Workstations Syncen alle gegen meinen Server:
/etc/make.conf
Code: | SYNC="rsync://rsync.hoppix.org/gentoo-portage" |
In meinen Intranet funktioniert das schon mal alles sehr gut.
Jetzt will ich eigene ebuilds bauen lernen um eigene Pakete in das System zu schleusen zu können.
Z.B ein eigenes baselayout, default_configs, eigene_menu, eigene_übersetzungen ...
damit ist dann die Möglichkeit gegeben dispatch-conf zu nutzen.
Also diff. Aber das reicht nicht, denn diff arbeitet nicht immer so wie erwartet.
Aber es wird ca 75% der Fälle wohl schon mal abdecken können.
Deshalb brauche ich ein Tool welches zusätzlich Arbeit abnimmt und kompliziertere Aufgaben übernehmen kann.
Angenommen es soll nicht global etwas verändert werden, dann greift diff nicht mehr.
Irgendwo wo "individuelle" Parameter nicht überschrieben sondern modifiziert werden sollen.
Änderung des Hostname, IPs, oder ganz besonders irgendwelche Konfigurationen im $HOME.
Das macht mir richtig Kopfzebrechen, denn ich weiß nicht wie die kmail.conf des Benutzers XYZ aussieht.
Diese kann schon ziemlich Wüst aussehen und trotzdem muß ich da ran. Bei 99,99% geht es gut, aber wenn es nur bei 1 GAU gibt, dann kann ich nicht wie üblich die Schuld auf M$ schieben.
toskala wrote: | welchen funktionsumfang soll es denn kriegen? |
Den Umfang, daß ich eigentlich gehofft habe jemand hat es schon vor mir gemacht
(Oder das es jemand für mich tut)
Wir haben z.Z aktiv 16 Workstations im Pilotprojekt in Fernwartung über Internet am laufen. Das war nur eine Machbarkeitsstudie ob überhaupt Linux für "normale" Benutzer genug leistet ob sie damit klarkommen, etc... Dank des Schwerpunktes auf Schulung & persönliche Betreuung sowie eine Einsteiger Zielgruppe sieht das sehr gut aus.
Jetzt wollen wir in die Produktion gehen
Es sollen aber bis ende des Jahres ~50 werden. Wobei das Projekt schon ausgelegt wird auf mehre 100 bis paar 1000 Workstations. Ob das technisch und finanziell als Verein machbar ist weiß ich nicht, aber ich habe mir fest vorgenommen Linux in meinen Umfeld zum Standard zu machen. _________________ grüße
nico |
|
Back to top |
|
|
Earthwings Bodhisattva
Joined: 14 Apr 2003 Posts: 7753 Location: Germany
|
|
Back to top |
|
|
nic0000 l33t
Joined: 25 Sep 2005 Posts: 658
|
Posted: Mon May 15, 2006 10:56 am Post subject: |
|
|
Earthwings wrote: | http://www.libelektra.org |
Danke, werde ich mir mal genauer Anschauen. Auf dem ersten Blick kann ich nicht sagen ob es mein Problem trifft _________________ grüße
nico |
|
Back to top |
|
|
|