sed/awk kérdés

Fórumok

Helló lenne 1 kérdésem:

a minap csináltam 1 rpm csomagot (link a blogomra: http://hup.hu/node/28803 ) és a csomag postinstall/postuninstall részéhez kellene némi segítség, mivel seg/awk téren nagyon tudatlan vagyok.

A kérdés 3 szóban: "konfigurációs file módosítás"

a /etc/nsswitch.conf -ot kellene szerkeszteni, de oly módon, hogy egyfelől a fontos bejegyzések intaktak maradjanak, másfelől, hogy a segítségül benthagyott kommentek se változzanak meg.

az eredeti sor kb ilyen:

hosts: files dns

és ebbe kéne bele eszkábálni pár új bejegyzést, de ugye triv, hogy másnál nem szükségszerúűen ugyanez a sor. Ettől független az új bejegyzések helye jól meg van határozva:

hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4

amin jól látszik az új bejegyzések helye. egynek mindenképp a dns előtt, egynek meg utána, vagy a legvégén kell lennie.

A segítséget előre is köszönöm.

Gergely Gábor

Hozzászólások

Huhh huhh huhh... nehéz kérdés.
Triviális és egyben NAGYON KEZDŐ megoldás:
sed -i 's/\(hosts:.*\)dns/\1mdns4_minimal [NOTFOUND=return] dns mdns4/' /etc/nsswitch.conf

Mit csinál? Azokat a sorokat, melyek illeszkednek a hosts:.*dns mintára (két / jel közti rész, a \( és \) karakterekkel most ne törődjünk), azokat kicseréli a következő két / közti kódra, aholis \1 helyébe a \(...\)-on belüli részt teszi, vagyis azt ami a dns szó előtt áll a sorban. A dns utáni részt (ha volt) békén hagyja.

Hogy mik vele a problémák?

Részben ezzel a sed paranccsal:
- Szarul működik, ha a "dns" sztring a fájl ezen sorában máshol is szerepel, akár egy hosszabb szó részeként.
- Ebből adódóan szarul működik, ha az RPM-et befrissíted vagy újból felrakod (újra beszúrja a bejegyzéseket amiket nem kéne mert már ott vannak)
- Ha eltávolítod az RPM-et, nem szedi ki.
- Fene tudja mi a teendő, ha a dns nem is szerepelt a hosts sorban
- Nem támogat egyéb szintaxisokat (például bevezető szóközök a sor elején) amiket a glibc valószínűleg elfogad.

Olyan postinst és postrm szkriptet írni, ami mindenféle eshetőségre jól felkészül, és tűri a stressz-tesztet (akárhányszor lefuttatható a szkript, nem kezdi el hízlalni a fájlt) egyáltalán nem könnyű, most nincs hozzá lelkierőm. Ehhez sed helyett inkább valami komolyabb nyelv (pl. awk) lehet hasznos, amivel az adott sort tokenekre szabdalod, megnézed hogy az első "hosts:"-e, ha igen, van-e "dns", és az elé-mögé berakod ha még nincs ott.
Ja, és ha már RPM, a verify szkriptről se feledkezzünk meg! :-)

Részben pedig az egész koncepcióval:
Én személy szerint utálom az ilyen gányolásokat. Persze lehet mondani hogy ettől lesz user-friendly meg minden, és hogy csak felrakod az rpm-et és már működik is, nade itt a rendszer egy nagyon alap tulajdonságába piszkítunk bele. Nem vagyok meggyőződve arról, hogy ezt jó dolog automatizáltan megtenni. Mi van, ha ezzek elromlik egy addig jól működő rendszer? Azért, mert valaki telepít egy csomagot, még egyáltalán nem is biztos, hogy használni akarja, vagy ha akarja, akkor sem biztos, hogy abban a pillanatban akarja használatba venni, nem mondjuk a dokumentáció alapos átrágása után, másnap tiszta fejjel. Én sokkal jobban szimpatizálok a világos, tiszta, jó időben megjelenített README-vel vagy bármiféle user-tájékoztatóval, ami leírja, hogy ha be akarod illeszteni a rendszerbe a modult, ezt meg azt tedd.

Nos, ezzel most megnyugtattál, hogy enm is olyan gáz a kis gagyi rpm csomagocskám :) bár a verify scriptnek nyoma sincs még... de lesz majd az is :)

Tehát marad a szerkesszed magad. Ez mondjuk a zeérókonfságát kissé csökkenti a zérókonf backend csomagnak, de sebaj :) mégsem MAC-en vagyunk.

workaround-et majdnem erre keszitettem.
van egy template csomag ami feltesze a ket config falt mondjuk xxx-1 xxx-2 neven, azatn maga a csomag installkor cat xxx-1 > valami.conf eltavolitakor pedig cat xxx-2 > valami.conf

szvsz talan ez az egyik megoldas ami nem nagyon kavar be.