serv 7.2 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2012-2013, 2016, 2020, 2021  Etersoft
# Copyright (C) 2012-2013, 2016, 2020, 2021  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
#

PROGDIR=$(dirname $0)
21 22
[ "$PROGDIR" = "." ] && PROGDIR=$(pwd)

23 24
# will replaced to /usr/share/eepm during install
SHAREDIR=$(dirname $0)
25 26 27

load_helper()
{
28 29 30
    local CMD="$SHAREDIR/$1"
    [ -r "$CMD" ] || fatal "Have no $CMD helper file"
    . $CMD
31 32 33 34
}

load_helper epm-sh-functions

35 36
INITDIR=/etc/init.d

37 38 39 40 41 42 43 44
PATH=$PATH:/sbin:/usr/sbin

set_sudo

check_tty

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

45 46
# FIXME: detect by real init system
# FIXME: add upstart support (Ubuntu?)
47 48 49 50
set_service_type()
{
	local CMD

51
	set_distro_info
52 53
	set_target_pkg_env

54
# TODO: see Running in distro_info, check is_aсtive_systemd
55
case $DISTRNAME in
56
	ALTLinux|ALTServer)
57 58
		CMD="service-chkconfig"
		;;
59
	Ubuntu|Debian|Mint|AstraLinux)
60 61 62 63 64 65 66 67 68
		CMD="service-update"
		;;
	Mandriva|ROSA)
		CMD="service-chkconfig"
		;;
#	FreeBSD)
#		CMD="pkg_add"
#		;;
#	Gentoo)
69
#		CMD="eselect"
70 71 72 73
#		;;
#	ArchLinux)
#		CMD="pacman"
#		;;
74
	Fedora|LinuxXP|ASPLinux|CentOS|RHEL|Scientific|GosLinux|Amzn)
75 76
		CMD="service-chkconfig"
		;;
77 78 79
	VoidLinux)
		CMD="runit"
		;;
80 81 82
	Slackware)
		CMD="service-initd"
		;;
83
	SUSE|SLED|SLES)
84 85 86 87 88
		CMD="service-chkconfig"
		;;
#	Windows)
#		CMD="chocolatey"
#		;;
89 90 91
#	*)
#		fatal "Have no suitable DISTRNAME $DISTRNAME yet"
#		;;
92
esac
93 94 95 96

# Note: force systemd using if active
is_active_systemd && CMD="systemd"

97 98 99
# override system control detection result
[ -n "$FORCESERVICE" ] && CMD=$FORCESERVICE

100
SERVICETYPE=$CMD
101

102
ANYSERVICE=$(which anyservice 2>/dev/null)
103

104 105
}

106
# TODO: done it on anyservice part
107 108
is_anyservice()
{
109
	[ -n "$ANYSERVICE" ] || return
110
	[ -n "$1" ] || return
111 112
	# check if anyservice is exists and checkd returns true
	$ANYSERVICE "$1" checkd 2>/dev/null
113
}
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129


phelp()
{
	echo "$Descr
$Usage
 Commands:
$(get_help HELPCMD)

 Options:
$(get_help HELPOPT)
"
}

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

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

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

set_service_type

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

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

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

    case $1 in
    status)                   # HELPCMD: show service status
        serv_cmd=status
        ;;
168 169 170
    restart)                 # HELPCMD: restart service
        serv_cmd=restart
        ;;
171 172 173
    reload)                  # HELPCMD: reload service
        serv_cmd=reload
        ;;
174 175 176 177 178 179
    start)                    # HELPCMD: start service
        serv_cmd=start
        ;;
    stop)                     # HELPCMD: stop service
        serv_cmd=stop
        ;;
180 181 182 183 184 185 186
    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
187 188
        serv_cmd=enable
        ;;
189
    disable)                 # HELPCMD: remove service to run on startup (see 'off' also)
Vitaly Lipatov's avatar
Vitaly Lipatov committed
190 191 192 193 194 195 196 197
        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
        ;;
198 199 200
    exists)                   # HELPCMD: check if the service is installed on the system
        serv_cmd=exists
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
201 202 203 204 205 206
    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
207 208
    list)                     # HELPCMD: list running services
        serv_cmd=list
209
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
210
        ;;
211 212
    list-all)                 # HELPCMD: list all available services
        serv_cmd=list_all
213
        withoutservicename=1
214 215 216
        ;;
    list-startup)             # HELPCMD: list all services to run on startup
        serv_cmd=list_startup
217
        withoutservicename=1
218
        ;;
219 220 221 222
    list-failed|--failed)       # HELPCMD: list services failed on startup
        serv_cmd=list_failed
        withoutservicename=1
        ;;
223 224 225 226
    print)                    # HELPCMD: print some info
        serv_cmd=print
        withoutservicename=1
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
227 228
    try-restart|condrestart)  # HELPCMD: Restart service if running
        serv_cmd=try_restart
229
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
230 231 232
    usage)                    # HELPCMD: print out usage of the service
        serv_cmd=usage
        withoutservicename=1
233
        ;;
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
    *)
        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
        ;;
255 256 257
    --short)              # HELPOPT: short mode
        short=1
        ;;
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 284
    --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
285
if [ -z "$withoutservicename" ] && [ -z "$service_name" ] ; then
286 287
    print_version
    echo
288
    fatal "Run $ $progname --help for get help"
289 290
fi

Vitaly Lipatov's avatar
Vitaly Lipatov committed
291
# use common way if the command is unknown
292 293 294 295 296 297 298 299
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)