serv 7.69 KB
Newer Older
1
#!/usr/bin/env bash
2
#
3 4
# Copyright (C) 2012-2013, 2016, 2020, 2021, 2023  Etersoft
# Copyright (C) 2012-2013, 2016, 2020, 2021, 2023  Vitaly Lipatov <lav@etersoft.ru>
5
#
6 7 8
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
9 10 11 12 13
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
# GNU Affero General Public License for more details.
15
#
16 17
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
18 19
#

20 21 22
PROGDIR=$(dirname "$0")
PROGNAME=$(basename "$0")
[ -n "$EPMCURDIR" ] || export EPMCURDIR="$(pwd)"
23 24
CMDENV="/usr/bin/env"
[ -x "$CMDENV" ] && CMDSHELL="/usr/bin/env bash" || CMDSHELL="$SHELL"
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
# TODO: pwd for ./epm and which for epm
[ "$PROGDIR" = "." ] && PROGDIR="$EPMCURDIR"
if [ "$0" = "/dev/stdin" ] || [ "$0" = "sh" ] ; then
    PROGDIR=""
    PROGNAME=""
fi

# will replaced with /usr/share/eepm during install
SHAREDIR=$PROGDIR
# will replaced with /etc/eepm during install
CONFIGDIR=$PROGDIR/../etc

EPMVERSION="@VERSION@"

# package, single (file), pipe, git
EPMMODE="package"
[ "$SHAREDIR" = "$PROGDIR" ] && EPMMODE="single"
[ "$EPMVERSION" = "@""VERSION""@" ] && EPMMODE="git"
[ "$PROGNAME" = "" ] && EPMMODE="pipe"

if [ "$EPMMODE" = "git" ] ; then
    EPMVERSION=$(head $PROGDIR/../eepm.spec | grep "^Version: " | sed -e 's|Version: ||' )
fi
48

49 50 51

load_helper()
{
52 53 54 55
    local shieldname="loaded$(echo "$1" | sed -e 's|-||g')"
    # already loaded
    eval "test -n \"\$$shieldname\"" && debug "Already loaded $1" && return

56
    local CMD="$SHAREDIR/$1"
57 58 59 60
    # do not use fatal() here, it can be initial state
    [ -r "$CMD" ] || { echo "FATAL: Have no $CMD helper file" ; exit 1; }
    eval "$shieldname=1"
    # shellcheck disable=SC1090
61
    . $CMD
62 63
}

64

65 66
load_helper epm-sh-functions

67 68
INITDIR=/etc/init.d

69 70 71 72 73 74 75 76
PATH=$PATH:/sbin:/usr/sbin

set_sudo

check_tty

#############################

77 78
# FIXME: detect by real init system
# FIXME: add upstart support (Ubuntu?)
79 80
set_service_type()
{
81
    local CMD
82

83
    set_distro_info
84

85
case "$DISTRCONTROL" in
86 87 88 89 90 91
    sysvinit)
        CMD="service-chkconfig"
        ;;
    systemd)
        CMD="systemd"
        ;;
92
esac
93

94
# override system control detection result
95 96
[ -n "$SERV_BACKEND" ] && CMD="$SERV_BACKEND"
# obsoleted
97
[ -n "$FORCESERVICE" ] && CMD="$FORCESERVICE"
98

99
SERVICETYPE="$CMD"
100

101
ANYSERVICE=$(print_command_path anyservice)
102

103 104
}

105
# TODO: done it on anyservice part
106 107
is_anyservice()
{
108 109 110 111
    [ -n "$ANYSERVICE" ] || return
    [ -n "$1" ] || return
    # check if anyservice is exists and checkd returns true
    $ANYSERVICE "$1" checkd 2>/dev/null
112
}
113 114 115 116


phelp()
{
117
    echo "$Descr
118 119 120 121 122 123 124 125 126 127 128
$Usage
 Commands:
$(get_help HELPCMD)

 Options:
$(get_help HELPOPT)
"
}

print_version()
{
129
        local on_text="(host system)"
130 131
        local virt="$($DISTRVENDOR -i)"
        [ "$virt" = "(unknown)" ] || [ "$virt" = "(host system)" ] || on_text="(under $virt)"
132
        echo "Service manager version $EPMVERSION  https://wiki.etersoft.ru/Epm"
133
        echo "Running on $DISTRNAME/$DISTRVERSION $on_text with $SERVICETYPE"
134
        echo "Copyright (c) Etersoft 2012-2023"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
135
        echo "This program may be freely redistributed under the terms of the GNU AGPLv3."
136 137
}

138 139 140
progname="${0##*/}"

Usage="Usage: $progname [options] [<service>] [<command>] [params]..."
141 142 143 144 145 146
Descr="serv - Service manager"

set_service_type

verbose=
quiet=
147
short=
148 149 150 151 152
non_interactive=
show_command_only=
serv_cmd=
service_name=
params=
153
withoutservicename=
154

155 156 157
# load system wide config
[ -f /etc/eepm/serv.conf ] && . /etc/eepm/serv.conf

158 159 160 161 162 163 164 165 166
check_command()
{
    # do not override command
    [ -z "$serv_cmd" ] || return

    case $1 in
    status)                   # HELPCMD: show service status
        serv_cmd=status
        ;;
167 168 169
    restart)                 # HELPCMD: restart service
        serv_cmd=restart
        ;;
170 171 172
    reload)                  # HELPCMD: reload service
        serv_cmd=reload
        ;;
173 174 175 176 177 178
    start)                    # HELPCMD: start service
        serv_cmd=start
        ;;
    stop)                     # HELPCMD: stop service
        serv_cmd=stop
        ;;
179 180 181 182 183 184 185
    on)                       # HELPCMD: add service to run on startup and start it now
        serv_cmd=on
        ;;
    off)                      # HELPCMD: remove service to run on startup and stop it now
        serv_cmd=off
        ;;
    enable)                   # HELPCMD: add service to run on startup (see 'on' also)
Vitaly Lipatov's avatar
Vitaly Lipatov committed
186 187
        serv_cmd=enable
        ;;
188
    disable)                 # HELPCMD: remove service to run on startup (see 'off' also)
Vitaly Lipatov's avatar
Vitaly Lipatov committed
189 190 191 192 193 194 195 196
        serv_cmd=disable
        ;;
    log|journal)              # HELPCMD: print log for the service (-f - follow,  -r - reverse order)
        serv_cmd=log
        ;;
    cat)                      # HELPCMD: print out service file for the service
        serv_cmd=cat
        ;;
197 198 199
    exists)                   # HELPCMD: check if the service is installed on the system
        serv_cmd=exists
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
200 201 202 203 204 205
    edit)                     # HELPCMD: edit service file overload (use --full to edit full file)
        serv_cmd=edit
        ;;
    test|-t)                  # HELPCMD: test a config file of the service
        serv_cmd=test
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
206 207
    list)                     # HELPCMD: list running services
        serv_cmd=list
208
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
209
        ;;
210 211
    list-all)                 # HELPCMD: list all available services
        serv_cmd=list_all
212
        withoutservicename=1
213 214 215
        ;;
    list-startup)             # HELPCMD: list all services to run on startup
        serv_cmd=list_startup
216
        withoutservicename=1
217
        ;;
218 219 220 221
    list-failed|--failed)       # HELPCMD: list services failed on startup
        serv_cmd=list_failed
        withoutservicename=1
        ;;
222 223 224 225
    print)                    # HELPCMD: print some info
        serv_cmd=print
        withoutservicename=1
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
226 227
    try-restart|condrestart)  # HELPCMD: Restart service if running
        serv_cmd=try_restart
228
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
229 230 231
    usage)                    # HELPCMD: print out usage of the service
        serv_cmd=usage
        withoutservicename=1
232
        ;;
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
    *)
        return 1
        ;;
    esac
    return 0
}

check_option()
{
    case $1 in
    -h|--help|help)       # HELPOPT: this help
        phelp
        exit 0
        ;;
    -v|--version)         # HELPOPT: print version
        print_version
        exit 0
        ;;
    --verbose)            # HELPOPT: verbose mode
        verbose=1
        ;;
254 255 256
    --short)              # HELPOPT: short mode
        short=1
        ;;
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
    --show-command-only)  # HELPOPT: show command only, do not any action
        show_command_only=1
        ;;
    --quiet)              # HELPOPT: quiet mode (do not print commands before exec)
        quiet=1
        ;;
    --auto)               # HELPOPT: non interactive mode
        non_interactive=1
        ;;
    *)
        return 1
        ;;
    esac
    return 0
}

for opt in "$@" ; do
    check_command $opt && continue
    check_option $opt && continue
    [ -z "$service_name" ] && service_name=$opt && continue
    params="$params $opt"
done

echover "service: $service_name"
echover "command: $serv_cmd"

# Just printout help if run without args
284
if [ -z "$withoutservicename" ] && [ -z "$service_name" ] ; then
285 286
    print_version
    echo
287
    fatal "Run $ $progname --help for get help"
288 289
fi

Vitaly Lipatov's avatar
Vitaly Lipatov committed
290
# use common way if the command is unknown
291 292 293 294 295 296 297 298
if [ -z "$serv_cmd" ] ; then
    serv_cmd=common
fi

# Run helper for command
load_helper serv-$serv_cmd
serv_$serv_cmd $service_name $params
# return last error code (from subroutine)