dodawanie i usuwanie grup w pakietach

Tomasz Kłoczko kloczek w rudy.mif.pg.gda.pl
Czw, 8 Maj 2003, 14:36:55 CEST


On Thu, 8 May 2003, Andrzej Krzysztofowicz wrote:
[..]
> > Czyli mam zainstlowany server tftpd bez uzytkownika tftp. Cale podejscie
> > jest po prostu bledne z prostej przyczyny: pakiet1 nie wie, ze pakiet2
> > potrzebuje danego uzytkownika/grupy.
> 
> Od dluzszego czasu pare osob zwraca uwage, ze aby to dzialalo trzeba miec
> w kazdym sposrod n pakietow wymagajacych tego usera n-1 triggerow...
> Tylko nie ma komuy tego zrobic. Mysle, ze do tego czasu nalezaloby
> wykomentowac usuwanie uzytkownika.

Dobra spróbowałem sie z tym zmierzyć.

Wyniki: wzioałem tftp.spec i utftpd.spec. W utftpd.spec dodałem poniższe i 
symetrycznie w tftp.spec.

$ cvs diff -u utftpd.spec
Index: utftpd.spec
===================================================================
RCS file: /cvsroot/SPECS/utftpd.spec,v
retrieving revision 1.54
diff -u -r1.54 utftpd.spec
--- utftpd.spec 22 Nov 2002 10:15:19 -0000      1.54
+++ utftpd.spec 8 May 2003 12:09:34 -0000
@@ -138,6 +138,7 @@
 fi
 
 %post -n utftpd
+echo "*** post utftpd."
 if [ -f /var/lock/subsys/rc-inetd ]; then
        /etc/rc.d/init.d/rc-inetd restart 1>&2
 else
@@ -148,6 +149,7 @@
 echo "done"
 
 %postun -n utftpd
+echo "*** postun utftpd."
 if [ -f /var/lock/subsys/rc-inetd ]; then
        /etc/rc.d/init.d/rc-inetd restart
 fi
@@ -155,6 +157,16 @@
 if [ "$1" = "0" ]; then
        echo "Removing user tftp."
        /usr/sbin/userdel tftp
+fi
+
+%triggerin -- tftpd
+echo "*** trigger in utftpd for tftpd"
+echo "Adding user tftp UID=15."
+/usr/sbin/useradd -u 15 -r -d /var/lib/tftp -s /bin/false -c "TFTP User" -g ftp tftp 1>&2
+if [ -f /var/lock/subsys/rc-inetd ]; then
+       /etc/rc.d/init.d/rc-inetd restart 1>&2
+else
+       echo "Type \"/etc/rc.d/init.d/rc-inetd start\" to start inet server." 1>&2
 fi
 
 %files

Czyli powyższe zawiera wypisywanie komunikatów kontrolnych (żeby było
widać oc sie dizeje + wywołanie skryptu króry wydawało mi się ze powinien
działać jak należy czyli że przy usuwaniou tftpd o ile jest instalwoany 
utftpd powinien ponownie dodać użytkownika i na wszelki wypadek 
zrestartować rc-inetd.
Analogicznie jak powyzsza modyfikacja wyglada poprawka dla tft.spec.

Budowanie -> rpm -i utftpd -> rpm -U tftpd

Wynik:

# rpm -U tftpd-0.17-21.i686.rpm
*** post tftpd.
Generating /etc/rlinetd.conf for rlinetd...........................[ ZROBIONE ]
Reload rlinetd service configuration...............................[ ZROBIONE ]
*** trigger in utftpd for tftpd
Adding user tftp UID=15.
useradd: użytkownik tftp istnieje
Zatrzymywanie uslugi rlinetd.......................................[ ZROBIONE ]
Generating /etc/rlinetd.conf for rlinetd...........................[ ZROBIONE ]
Uruchamianie uslugi rlinetd........................................[ ZROBIONE ]
*** postun utftpd.
Zatrzymywanie uslugi rlinetd.......................................[ ZROBIONE ]
Generating /etc/rlinetd.conf for rlinetd...........................[ ZROBIONE ]
Uruchamianie uslugi rlinetd........................................[ ZROBIONE ]
Removing user tftp.

i w drugą stronę ..

# rpm -i utftpd-0.2.4-13.i686.rpm 
Adding user tftp UID=15.
*** post utftpd.
Zatrzymywanie uslugi rlinetd.......................................[ ZROBIONE ]
Generating /etc/rlinetd.conf for rlinetd...........................[ ZROBIONE ]
Uruchamianie uslugi rlinetd........................................[ ZROBIONE ]
Rebuilding utftpd configuration... done
*** trigger in utftpd for tftpd
Adding user tftp UID=15.
useradd: użytkownik tftp istnieje
Zatrzymywanie uslugi rlinetd.......................................[ ZROBIONE ]
Generating /etc/rlinetd.conf for rlinetd...........................[ ZROBIONE ]
Uruchamianie uslugi rlinetd........................................[ ZROBIONE ]

Hmm .. działa to troche inaczej niż się spodziewałem i trochę inaczej w 
związku ztym trzeba będzie do tego podejsć ale nadal wydaje się jest możliwe 
zrealizowanie odpowidniego podejścia wzorcowego.

Jeszcze muszę się temu przyjrzec i pomyśleć.

Z dokumentacji wynika że kolejnosć wykonywanai skryyptrów przy upgrade 
pakietu generuje nasepujaca kolejnosć wołań skryptów:

  new-%pre      for new version of package being installed
  ...           (all new files are installed)
  new-%post     for new version of package being installed

  any-%triggerin (%triggerin from other packages set off by new install)
  new-%triggerin
  old-%triggerun
  any-%triggerun (%triggerun from other packages set off by old uninstall)

  old-%preun    for old version of package being removed
  ...           (all old files are removed)
  old-%postun   for old version of package being removed

  old-%triggerpostun
  any-%triggerpostun (%triggerpostun from other packages set off by old un
                install)

Jakoś nie widzę nic w dok na temat kolejności wołania %postun gdy jeden
pakiet przez Obsoletes zastępuje się drugim (jak napisałęm powyższe to tylko
upgrade pakietu), a wychodzi z powyższego że %postun usuwanego pakietu jest
wykonywane na końcu a przed any-%triggerpostun (?) co umozliwiałoby w
%triggerpostun dodanei jeszcze raz użytkownika i wykonanie restartu.

Potencjalnie całość możnaby skrócić o ile od razu byłoby wiadomo że chodzi o
Obsoletes co możnaby przekazać przez jakis plik zakłądany touchem i
sprawdzany w %postun usuwanego pakietu. Tak czy inaczje do poprawnego
działania potrzebna jest pełna symetria rozwiązania.

Coś mi tu tak czy inaczej nie pasuje .. :>

kloczek
-- 
-----------------------------------------------------------
*Ludzie nie mają problemów, tylko sobie sami je stwarzają*
-----------------------------------------------------------
Tomasz Kłoczko, sys adm @zie.pg.gda.pl|*e-mail: kloczek w rudy.mif.pg.gda.pl*



Więcej informacji o liście dyskusyjnej pld-devel-pl