aboutsummaryrefslogtreecommitdiffstats
path: root/add-service
blob: 4561f121167fcdab04b5129001d2de76b6b921ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/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] <pkg name> <number installed> [<service name>] [<unit name> ...]" 1>&2
    exit 1
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"
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
                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" ]; 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. systemd units are restarted in postun
    [ -n "$srv" ] || exit 0

    # if the service is activated, add it again to be able to handle
    # changes in start/stop levels. This does not change enabled/disabled
    # state, so we do not do it for systemd where dependencies are handled
    # automatically.

    # Restart only SysV services here only if no additional systemd
    # units are defined or systemd is not active. Otherwise user is expected
    # to add postun script that handles systemd units.

    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

    if ! /bin/mountpoint -q /sys/fs/cgroup/systemd; then
        # 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