Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Will unkompliziert Änderungen in Konfigs machen (bash)
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
nic0000
l33t
l33t


Joined: 25 Sep 2005
Posts: 658

PostPosted: Thu Apr 27, 2006 5:23 pm    Post subject: Will unkompliziert Änderungen in Konfigs machen (bash) Reply with quote

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
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5206

PostPosted: Thu Apr 27, 2006 10:30 pm    Post subject: Reply with quote

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
View user's profile Send private message
nic0000
l33t
l33t


Joined: 25 Sep 2005
Posts: 658

PostPosted: Fri Apr 28, 2006 1:59 pm    Post subject: Reply with quote

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
View user's profile Send private message
smg
Veteran
Veteran


Joined: 13 Aug 2004
Posts: 1402
Location: /home/stephan

PostPosted: Fri Apr 28, 2006 2:40 pm    Post subject: Reply with quote

Sorry, aber:
Code:
man diff

?
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
View user's profile Send private message
nic0000
l33t
l33t


Joined: 25 Sep 2005
Posts: 658

PostPosted: Fri Apr 28, 2006 3:31 pm    Post subject: Reply with quote

smg wrote:
Sorry, aber:
Code:
man diff

?

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
View user's profile Send private message
toskala
Advocate
Advocate


Joined: 14 Dec 2002
Posts: 2080
Location: hamburg, germany

PostPosted: Thu May 11, 2006 7:31 pm    Post subject: Reply with quote

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
View user's profile Send private message
nic0000
l33t
l33t


Joined: 25 Sep 2005
Posts: 658

PostPosted: Thu May 11, 2006 8:36 pm    Post subject: Reply with quote

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
View user's profile Send private message
mrsteven
Veteran
Veteran


Joined: 04 Jul 2003
Posts: 1938

PostPosted: Thu May 11, 2006 8:48 pm    Post subject: Reply with quote

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... :wink:
_________________
Unix philosophy: "Do one thing and do it well."
systemd: "Do everything and do it wrong."
Back to top
View user's profile Send private message
toskala
Advocate
Advocate


Joined: 14 Dec 2002
Posts: 2080
Location: hamburg, germany

PostPosted: Fri May 12, 2006 12:36 pm    Post subject: Reply with quote

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
View user's profile Send private message
misterjack
Veteran
Veteran


Joined: 03 Oct 2004
Posts: 1655

PostPosted: Fri May 12, 2006 1:27 pm    Post subject: Reply with quote

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
View user's profile Send private message
nic0000
l33t
l33t


Joined: 25 Sep 2005
Posts: 658

PostPosted: Fri May 12, 2006 3:14 pm    Post subject: Reply with quote

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. :twisted:
_________________
grüße
nico
Back to top
View user's profile Send private message
Earthwings
Bodhisattva
Bodhisattva


Joined: 14 Apr 2003
Posts: 7753
Location: Germany

PostPosted: Sat May 13, 2006 7:03 pm    Post subject: Reply with quote

http://www.libelektra.org
_________________
KDE
Back to top
View user's profile Send private message
nic0000
l33t
l33t


Joined: 25 Sep 2005
Posts: 658

PostPosted: Mon May 15, 2006 10:56 am    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum