aboutsummaryrefslogtreecommitdiffstats
path: root/usr/sbin/service
blob: 5909934662e8765c358bf29d4e33cb2aa3b360c9 (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
#!/bin/bash

# Check whether file $1 is a backup or rpm-generated file and should be ignored
# Copy of the function from etc/rc.d/init.d/functions
is_ignored_file() {
    case "$1" in
    *~ | *.bak | *.old | *.orig | *.rpmnew | *.rpmorig | *.rpmsave)
        return 0
        ;;
    esac
    return 1
}

VERSION="$(basename $0) ver. 1.1"
USAGE="Usage: $(basename $0) < option > | --status-all | \
[ service_name [ command | --full-restart ] ]"
SERVICEDIR="/etc/init.d"
ACTIONDIR="/usr/libexec/initscripts/legacy-actions"
SERVICE=
ACTION=
OPTIONS=

if [ $# -eq 0 ]; then
   echo "${USAGE}" >&2
   exit 1
fi

cd /
while [ $# -gt 0 ]; do
    case "${1}" in
    --help | -h | --h* )
        echo "${USAGE}" >&2
        exit 0
        ;;
    --version | -V )
        echo "${VERSION}" >&2
        exit 0
        ;;
    --ignore-dependencies)
        export SYSTEMCTL_IGNORE_DEPENDENCIES=1
        shift
        ;;
    --skip-redirect)
        export SYSTEMCTL_SKIP_REDIRECT=1
        shift
        ;;
    *)
        if [ -z "${SERVICE}" ] && [ $# -eq 1 ] && [ "${1}" = "--status-all" ]; then
            # symlink /etc/init.d -> rc.d/init.d is provided by initscripts package
            cd ${SERVICEDIR} || { echo $"Support for initscripts isn't installed" >&2 ; exit 4 ; }
            for SERVICE in * ; do
                case "${SERVICE}" in
                functions | halt | killall | single| linuxconf| kudzu)
                    ;;
                *)
                    if ! is_ignored_file "${SERVICE}" \
                            && [ -x "${SERVICEDIR}/${SERVICE}" ]; then
                        env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status
                    fi
                    ;;
                esac
            done
            exit 0
        elif [ $# -eq 2 ] && [ "${2}" = "--full-restart" ]; then
            # symlink /etc/init.d -> rc.d/init.d is provided by initscripts package
            [ -L "${SERVICEDIR}" ] || { echo $"Support for initscripts isn't installed" >&2 ; exit 4 ; }

            SERVICE="${1}"
            if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
                env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop
                env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start
                exit $?
            fi
        elif [ -z "${SERVICE}" ]; then
            SERVICE="${1}"
        elif [ -z "${ACTION}" ]; then
            ACTION="${1}"
        else
            OPTIONS="${OPTIONS} ${1}"
        fi
        shift
        ;;
    esac
done

if [ -f "${SERVICEDIR}/${SERVICE}" ]; then
    # LSB daemons that dies abnormally in systemd looks alive in systemd's eyes due to RemainAfterExit=yes
    # lets reap them before next start
    if [ "${ACTION}" = 'start' ] && \
            [ "$(systemctl show -p ActiveState "${SERVICE}".service --value)" = 'active' ] && \
            [ "$(systemctl show -p SubState "${SERVICE}".service --value)" = 'exited' ]; then
        /bin/systemctl stop "${SERVICE}".service
    fi

    # Workaround to be able to "stop" network.service when it's in inactive state using service instead of systemctl
    # Useful for manual testing of network 
    if [ "${SERVICE}" = 'network' ] && [ "${ACTION}" = 'stop' ] && \
            [ "$(systemctl show -p ActiveState network.service --value)" = 'inactive' ] && \
            [ "$(systemctl show -p SourcePath network.service --value)" = '/etc/rc.d/init.d/network' ]; then
        export SYSTEMCTL_SKIP_REDIRECT=1
    fi

    env -i PATH="$PATH" TERM="$TERM" SYSTEMCTL_IGNORE_DEPENDENCIES="${SYSTEMCTL_IGNORE_DEPENDENCIES}" SYSTEMCTL_SKIP_REDIRECT="${SYSTEMCTL_SKIP_REDIRECT}" "${SERVICEDIR}/${SERVICE}" "${ACTION}" ${OPTIONS}
elif [ -n "${ACTION}" ] && [ -x "${ACTIONDIR}/${SERVICE}/${ACTION}" ]; then
    env -i PATH="$PATH" TERM="$TERM" SYSTEMCTL_IGNORE_DEPENDENCIES="${SYSTEMCTL_IGNORE_DEPENDENCIES}" SYSTEMCTL_SKIP_REDIRECT="${SYSTEMCTL_SKIP_REDIRECT}" "${ACTIONDIR}/${SERVICE}/${ACTION}" ${OPTIONS}
elif [[ $ACTION =~ ^(start|stop|restart|try-restart|reload|reload-or-restart|try-reload-or-restart|force-reload|status|condrestart)$ ]]; then
    SERVICE_MANGLED=$(/usr/bin/systemd-escape --mangle "${SERVICE}")
    echo $"Redirecting to /bin/systemctl ${ACTION} ${SERVICE_MANGLED}${OPTIONS:+ }${OPTIONS}" >&2
    exec /bin/systemctl "${ACTION}" "${SERVICE_MANGLED}" ${OPTIONS}
else
    echo $"The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, reload-or-restart, try-reload-or-restart, force-reload, status, condrestart). For other actions, please try to use systemctl." >&2
    exit 2
fi