serv 6.74 KB
Newer Older
1 2
#!/bin/sh
#
Vitaly Lipatov's avatar
Vitaly Lipatov committed
3 4
# Copyright (C) 2012-2013, 2016, 2020  Etersoft
# Copyright (C) 2012-2013, 2016, 2020  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 56 57 58
case $DISTRNAME in
	ALTLinux)
		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-2019"
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 148 149 150 151 152
Descr="serv - Service manager"

set_service_type

verbose=
quiet=
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
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
    on|enable)                # HELPCMD: add service to run on startup and start it now
        serv_cmd=enable
        ;;
    off|disable)              # HELPCMD: remove service to run on startup and stop it now
        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
        ;;
    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
197 198
    list)                     # HELPCMD: list running services
        serv_cmd=list
199
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
200
        ;;
201 202
    list-all)                 # HELPCMD: list all available services
        serv_cmd=list_all
203
        withoutservicename=1
204 205 206
        ;;
    list-startup)             # HELPCMD: list all services to run on startup
        serv_cmd=list_startup
207
        withoutservicename=1
208
        ;;
209 210 211 212
    list-failed|--failed)       # HELPCMD: list services failed on startup
        serv_cmd=list_failed
        withoutservicename=1
        ;;
213 214 215 216
    print)                    # HELPCMD: print some info
        serv_cmd=print
        withoutservicename=1
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
217 218
    try-restart|condrestart)  # HELPCMD: Restart service if running
        serv_cmd=try_restart
219
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
220 221 222
    usage)                    # HELPCMD: print out usage of the service
        serv_cmd=usage
        withoutservicename=1
223
        ;;
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
    *)
        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
        ;;
    --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
272
if [ -z "$withoutservicename" ] && [ -z "$service_name" ] ; then
273 274
    print_version
    echo
275
    fatal "Run $ $progname --help for get help"
276 277
fi

Vitaly Lipatov's avatar
Vitaly Lipatov committed
278
# use common way if the command is unknown
279 280 281 282 283 284 285 286
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)