aboutsummaryrefslogtreecommitdiffstats
path: root/add-service
blob: 26bc04ee5c5ec642d7ffe323224f49395111b4ea (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/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

# 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
                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