#!/bin/sh #--------------------------------------------------------------- # Project : Mandriva Linux # Module : rpm-helper # File : add-service # Version : $Id$ # Authors : Frederic Lepied, Andrey Borzenkov # Created On : Mon Jul 8 08:14:34 2002 # Purpose : helper script for rpm scriptlets to add a # service. #--------------------------------------------------------------- if [ x$1 = x--no-sysv ]; then do_sysv=no shift else do_sysv=yes fi if [ $# -lt 3 ]; then echo "usage: $0 [--no-sysv] [] [ ...]" 1>&2 exit 1 fi # What init system are we currently using? if /bin/mountpoint -q /sys/fs/cgroup/systemd; then init=systemd else init=sysvinit fi pkg=$1 # name of the package num=$2 # number of packages installed if [ $do_sysv = yes ]; then srv=$3 # name of the SysV script shift 3 else srv= shift 2 fi units="$*" # systemd units units_to_enable= # units enabled by msec # If only a sysvinit service is given, then deal with a systemd unit of the same # name. Specific specs can enable specific unit names as needed but this should # catch the most common usage. if [ -z "$units" ]; then units="$srv.service" # We need to normalise the systemd unit name as the native unit may not have # the same filename (sans it's .service suffix) as sysvinit script. # In this case, symlinks are used to mask the sysvinit file, but for enabling # and disabling units we must use the official name. SYSTEMUNITDIR=/lib/systemd/system USERUNITDIR=/etc/systemd/system RUNTIMEUNITDIR=/run/systemd/system searchunit= if [ -f "$SYSTEMUNITDIR/$units" ]; then searchunit=$(/usr/bin/readlink "$SYSTEMUNITDIR/$units") elif [ -f "$USERUNITDIR/$units" ]; then searchunit=$(/usr/bin/readlink "$USERUNITDIR/$units") elif [ -f "$RUNTIMEUNITDIR/$units" ]; then searchunit=$(/usr/bin/readlink "$RUNTIMEUNITDIR/$units") fi if [ -n "$searchunit" ]; then units=$searchunit fi fi add_service() { # Add the service if [ -r /etc/sysconfig/msec ]; then . /etc/sysconfig/msec fi # High security: add only authorized services LIST=/etc/security/msec/server # during the install the symlink isn't done so find the right file # by ourselves if [ -n "$DURING_INSTALL" -a ! -f $LIST ]; then LIST=/etc/security/msec/server.$SECURE_LEVEL fi # This is half-hearted support for msec: we check "srv" for a unit # with name "srv.service". This should account for most(?) common # case when SysV script srv is replaced by single unit srv.service # If SysV name was supplied, we assume units are equivalent and do # not need to be checked. # TODO should msec support full unit name? if [ -f $LIST ]; then if [ -n "$srv" ]; then if fgrep -qx "${srv}" $LIST; then units_to_enable="$units" else srv= fi else for i in $units; do [ $i != ${i%.service} ] && ! fgrep -qx ${i%.service} $LIST && continue [ $i != ${i%.socket} ] && ! fgrep -qx ${i%.socket} $LIST && continue [ $i != ${i%.path} ] && ! fgrep -qx ${i%.path} $LIST && continue units_to_enable="$units_to_enable $i" done fi else units_to_enable="$units" fi # Actually do enable/disable foo if [ -n "$units_to_enable" ]; then /bin/systemctl --quiet enable $units_to_enable fi if [ -n "$srv" -a -f /etc/rc.d/init.d/$srv ]; then /sbin/chkconfig --add $srv if [ -r /etc/sysconfig/system ]; then . /etc/sysconfig/system fi # TODO what to do with system units here? if [ -z "$ADD_SERVICES_TO_CURRENT_PROFILE_ONLY" ]; then # add the service to all the profiles at once if [ -d /etc/netprofile/profiles/default/services ]; then for dir in /etc/netprofile/profiles/*/services; do touch $dir/$srv done fi fi fi } if [ $num = 1 ]; then # First install mode add_service else # Upgrade mode. if [ x$init = xsystemd ]; then /bin/systemctl --quiet try-restart $units elif [ -f /etc/rc.d/init.d/$srv ]; then set -- /etc/rc3.d/S??$srv if [ $# -gt 1 ]; then echo 1>&2 "add-service: Error: $srv appears multiple times: $*" fi if [ -f "$1" ]; then /sbin/chkconfig --add $srv fi # restart the service if already running if [ -f /var/lock/subsys/$srv ]; then /sbin/service $srv restart > /dev/null || : fi fi fi # add-service ends here