il devuanizzato Steve Litt <slitt@???> il 06-07-19 07:24:37 ha scritto:
>> Instead it's possible
>> inject in all daemon's install a piece of posix shell?
>> Workaround script on event "DPkg::Post-Invoke" as I said in the
>> previous email?
>
>You know much more than I do about packaging. Given something like
>event "DPkg::Post-Invoke", all it would need to do is call a
>shellscript, with the argument of the daemon name, and the shellscript
>could make the necessary symlinks or whatever. All the heavy lifting
>would still be done in the runit-runscripts package.
Put my code here.
Work for epoch init system but it is adaptable to any other such as
runit, s6 and so on...
Run script on event Pre-Invoke and Post-Invoke:
====================================
#/etc/apt/apt.conf.d/99_dpkg_init_script
DPkg::Pre-Invoke { "/usr/local/bin/dpkg_init_script 1"; };
DPkg::Post-Invoke { "/usr/local/bin/dpkg_init_script 2"; };
====================================
The script (it should run for apt, apt-get, aptitude invoke and so on...):
====================================
#!/bin/sh
#/usr/local/bin/dpkg_init_script
HIGH_EVID="\033[31m"
HIGH_NORM="\033[0m"
MOD_INSTALL=1
MOD_REMOVE=2
MOD_PURGE=3
# Scan command line and find command
command()
{
if [ "$#" -eq "1" ]; then
CMD=$1
if [ "$CMD" = "install" ]; then
return $MOD_INSTALL
elif [ "$CMD" = "remove" ]; then
return $MOD_REMOVE
elif [ "$CMD" = "purge" ]; then
return $MOD_PURGE
else
return 0
fi
return 0
else
return 0
fi
}
# Epoch init system install/remove
epoch()
{
if [ "$#" -eq "2" ]; then
ACTION=$1
PACKAGE=$2
INIT_EPOCH_BIN="/usr/local/sbin/epoch"
INIT_EPOCH_ETC="/etc/epoch/epoch.conf"
INIT_EPOCH_PKG_DIR="/etc/epoch/object/"
INIT_EPOCH_PKG_DIRESC="\/etc\/epoch\/object\/"
INIT_EPOCH_PKG_REP="/etc/epoch/repo/"
# If not present epoch do not do nothing
if [ -x "$INIT_EPOCH_BIN" -a -f "$INIT_EPOCH_ETC" -a -d "$INIT_EPOCH_PKG_DIR" -a -d "$INIT_EPOCH_PKG_REP" -a -f "$INIT_EPOCH_PKG_REP$PACKAGE.conf" ]; then
if [ "$ACTION" -eq "$MOD_INSTALL" ]; then
echo cp $INIT_EPOCH_PKG_REP$PACKAGE.conf $INIT_EPOCH_PKG_DIR$PACKAGE.conf
cp $INIT_EPOCH_PKG_REP$PACKAGE.conf $INIT_EPOCH_PKG_DIR$PACKAGE.conf
echo sed -i "\$aImport $INIT_EPOCH_PKG_DIR$PACKAGE.conf" $INIT_EPOCH_ETC
sed -i "\$aImport $INIT_EPOCH_PKG_DIR$PACKAGE.conf" $INIT_EPOCH_ETC
elif [ "$ACTION" -eq "$MOD_REMOVE" -o "$ACTION" -eq "$MOD_PURGE" ]; then
echo rm $INIT_EPOCH_PKG_DIR$PACKAGE.conf
rm $INIT_EPOCH_PKG_DIR$PACKAGE.conf
echo sed -i "/Import $INIT_EPOCH_PKG_DIRESC$PACKAGE.conf/d" $INIT_EPOCH_ETC
sed -i "/Import $INIT_EPOCH_PKG_DIRESC$PACKAGE.conf/d" $INIT_EPOCH_ETC
fi
fi
fi
}
if [ "$#" -eq "1" ]; then
DPKG_PHASE=$1
else
echo "arg err"
exit
fi
APTPID=$( ps -ho ppid "${PPID}" | sed 's/^ *//' | sed 's/ *$//' )
APTCMD=$( ps -ho args "${APTPID}" | sed 's/^ *//' | sed 's/ *$//' )
VAR=$APTCMD
while test -n "$VAR" ; do
IFS=' ' read -r VAR ALL <<- XXX
$VAR
XXX
command $VAR
ACTION=$?
if [ "$ACTION" -ne "0" ]; then
VAR=$ALL
break;
fi
VAR=$ALL
done
EXDPKG=`dpkg-query -W -f='${binary:Package}\t${db:Status-Abbrev}\n' $ALL 2>/dev/null`
echo exdpkg: $EXDPKG
if [ "$DPKG_PHASE" -eq "1" ]; then
printf "${HIGH_EVID}Pre-invoke${HIGH_NORM}\n"
#printf "%s\n" $EXDPKG |
dpkg-query -W -f='${binary:Package}\t${db:Status-Abbrev}\n' $ALL 2>/dev/null |
while read PACKAGE STATUS
do
printf "${HIGH_EVID}Package %s Status %s${HIGH_NORM}\n" $PACKAGE $STATUS
if [ "$ACTION" -eq "$MOD_REMOVE" -o "$ACTION" -eq "$MOD_PURGE" ]; then
if [ "$STATUS" = "ii" -o "$STATUS" = "ri" -o "$STATUS" = "pi" ]; then
# If exists package, is remove command and package is installed, remove script
# aptitude return "pi" instead of "ii", remove alike
printf "${HIGH_EVID}Remove script${HIGH_NORM}\n" $PACKAGE $STATUS
# Epoch init system
epoch $ACTION $PACKAGE
# Runit
#runit $ACTION $PACKAGE
# Other init
#otherinit $ACTION $PACKAGE
fi
fi
done
elif [ "$DPKG_PHASE" -eq "2" ]; then
printf "${HIGH_EVID}Post-invoke${HIGH_NORM}\n"
#printf "%s\n" $EXDPKG |
dpkg-query -W -f='${binary:Package}\t${db:Status-Abbrev}\n' $ALL 2>/dev/null |
while read PACKAGE STATUS
do
echo Package $PACKAGE Status $STATUS
if [ "$ACTION" -eq "$MOD_INSTALL" ]; then
if [ "$STATUS" = "ii" ]; then
# If exist package, is install command and package it was just installed, install script
printf "${HIGH_EVID}Install script${HIGH_NORM}\n" $PACKAGE $STATUS
# Epoch init system
epoch $ACTION $PACKAGE
# Runit
#runit $ACTION $PACKAGE
# Other init
#otherinit $ACTION $PACKAGE
fi
fi
done
else
echo "nothing"
fi
====================================
For epoch init system it run epoch function.
In /etc/epoch/ there are 2 dir, "repo" and "object".
repo is an "object repository" (objects collection).
When user install a package, if exist in repo/package.conf
copy it in object directory. I don't use symbolic links
because in "repo" there are object distro but in "object"
there are object which can be modified and customized by the user.
Then use the "Import" attribute to generate a row that import object.
When user remove a package, just before remove package, delete object.
Then remove the "Import" attribute generate previously.
For runit simply create a function and copy/remove your files.
For all init system that we intend to support create a function and do
stuff.
Below my epoch.conf:
====================================
#/etc/epoch/epoch.conf
#Epoch Init System Configuration for Devuan
BootBannerText=Hello world!
BootBannerColor=CYAN
Hostname=FILE /etc/hostname
DefaultRunlevel=boot
EnableLogging=true
DisableCAD=true
BlankLogOnBoot=true
# DEFINE PRIORITY CONSTANTS
DefinePriority=Start_Sysclock 1
DefinePriority=Start_Fs_H 4
DefinePriority=Start_Fs_M 5
DefinePriority=Start_Fs_L 6
DefinePriority=Start_Daemon_First 9
DefinePriority=Start_Log 10
DefinePriority=Start_Daemon_H 11
DefinePriority=Start_Daemon_M 14
DefinePriority=Start_Daemon_L 18
DefinePriority=Start_Network 19
DefinePriority=Start_Network_Daemon_H 20
DefinePriority=Start_Network_Daemon_M 24
DefinePriority=Start_Network_Daemon_L 28
DefinePriority=Start_Other_Daemon_H 31
DefinePriority=Start_Other_Daemon_M 34
DefinePriority=Start_Other_Daemon_L 37
DefinePriority=Start_Early_Getty 40
DefinePriority=Start_Getty 45
DefinePriority=Start_Display_Manager 49
DefinePriority=Stop_Display_Manager 51
DefinePriority=Stop_Daemon_H 51
DefinePriority=Stop_Daemon_M 55
DefinePriority=Stop_Daemon_L 59
DefinePriority=Stop_Log 65
DefinePriority=Stop_Network 70
DefinePriority=Stop_Sysclock 80
DefinePriority=Stop_Kill_Soft 95
DefinePriority=Stop_Kill 96
DefinePriority=Stop_Fs_H 97
DefinePriority=Stop_Fs_M 98
DefinePriority=Stop_Fs_L 99
Import /etc/epoch/object/acpid.conf
Import /etc/epoch/object/anacron.conf
Import /etc/epoch/object/at.conf
Import /etc/epoch/object/clamav-freshclam.conf
Import /etc/epoch/object/console-setup.conf
Import /etc/epoch/object/coreutils.conf
Import /etc/epoch/object/cron.conf
Import /etc/epoch/object/dbus.conf
Import /etc/epoch/object/gpm.conf
Import /etc/epoch/object/ifupdown.conf
Import /etc/epoch/object/irqbalance.conf
Import /etc/epoch/object/openssh-server.conf
Import /etc/epoch/object/pcscd.conf
Import /etc/epoch/object/rsyslog.conf
Import /etc/epoch/object/smartmontools.conf
Import /etc/epoch/object/util-linux.conf
Import /etc/epoch/object/xinetd.conf
Import /etc/epoch/object/xorg.conf
====================================
I tested above scripts in my computers but they should be well tested.
I consider them a workaround more than a "clean" solution.
--
viverna