serv 6.11 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2012-2013, 2016  Etersoft
# Copyright (C) 2012-2013, 2016  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 51 52
set_service_type()
{
	local CMD

	# Fill for use: PMTYPE, DISTRNAME, DISTRVERSION, PKGFORMAT, PKGVENDOR, RPMVENDOR
	DISTRVENDOR=$PROGDIR/distr_info
53
	[ -n "$DISTRNAME" ] || DISTRNAME=$($DISTRVENDOR -d) || fatal "Can't get distro name."
54 55 56 57 58 59 60
	[ -n "$DISTRVERSION" ] || DISTRVERSION=$($DISTRVENDOR -v)
	set_target_pkg_env

case $DISTRNAME in
	ALTLinux)
		CMD="service-chkconfig"
		;;
61
	Ubuntu|Debian|Mint|AstraLinux)
62 63 64 65 66 67 68 69 70 71 72 73 74 75
		CMD="service-update"
		;;
	Mandriva|ROSA)
		CMD="service-chkconfig"
		;;
#	FreeBSD)
#		CMD="pkg_add"
#		;;
#	Gentoo)
#		CMD="emerge"
#		;;
#	ArchLinux)
#		CMD="pacman"
#		;;
76
	Fedora|LinuxXP|ASPLinux|CentOS|RHEL|Scientific|GosLinux)
77 78
		CMD="service-chkconfig"
		;;
79 80 81
	VoidLinux)
		CMD="runit"
		;;
82 83 84
	Slackware)
		CMD="service-initd"
		;;
85
	SUSE|SLED|SLES|Tumbleweed)
86 87 88 89 90 91
		CMD="service-chkconfig"
		;;
#	Windows)
#		CMD="chocolatey"
#		;;
	*)
92
		fatal "Have no suitable DISTRNAME $DISTRNAME yet"
93 94
		;;
esac
95 96 97 98

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

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

102
SERVICETYPE=$CMD
103

104
ANYSERVICE=$(which anyservice 2>/dev/null)
105

106 107
}

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


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

 Options:
$(get_help HELPOPT)
"
}

print_version()
{
        echo "Service manager version @VERSION@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
133
        echo "Running on $($DISTRVENDOR) with $SERVICETYPE"
134
        echo "Copyright (c) Etersoft 2012, 2013, 2016"
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 147 148 149 150 151
Descr="serv - Service manager"

set_service_type

verbose=
quiet=
non_interactive=
show_command_only=
serv_cmd=
service_name=
params=
152
withoutservicename=
153

154 155 156 157 158 159 160 161 162
check_command()
{
    # do not override command
    [ -z "$serv_cmd" ] || return

    case $1 in
    status)                   # HELPCMD: show service status
        serv_cmd=status
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
163 164
    usage)                    # HELPCMD: print out usage of the service
        serv_cmd=usage
165
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
166
        ;;
167 168 169
    restart)                 # HELPCMD: restart service
        serv_cmd=restart
        ;;
170 171 172
    reload)                  # HELPCMD: reload service
        serv_cmd=reload
        ;;
173 174 175
    start)                    # HELPCMD: start service
        serv_cmd=start
        ;;
176 177 178
    try-restart|condrestart)  # HELPCMD: Restart service if running
        serv_cmd=try_restart
        ;;
179 180 181
    stop)                     # HELPCMD: stop service
        serv_cmd=stop
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
182 183
    list)                     # HELPCMD: list running services
        serv_cmd=list
184
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
185
        ;;
186 187
    list-all)                 # HELPCMD: list all available services
        serv_cmd=list_all
188
        withoutservicename=1
189 190 191
        ;;
    list-startup)             # HELPCMD: list all services to run on startup
        serv_cmd=list_startup
192
        withoutservicename=1
193
        ;;
194 195
    on|enable)                # HELPCMD: add service to run on startup and start it now
        serv_cmd=enable
196
        ;;
197 198
    off|disable)              # HELPCMD: remove service to run on startup and stop it now
        serv_cmd=disable
199
        ;;
200 201 202 203
    print)                    # HELPCMD: print some info
        serv_cmd=print
        withoutservicename=1
        ;;
204 205 206
    log|journal)              # HELPCMD: print log for the service
        serv_cmd=log
        ;;
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 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
    *)
        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
255
if [ -z "$withoutservicename" ] && [ -z "$service_name" ] ; then
256 257
    print_version
    echo
258
    fatal "Run $ $progname --help for get help"
259 260
fi

Vitaly Lipatov's avatar
Vitaly Lipatov committed
261
# use common way if the command is unknown
262 263 264 265 266 267 268 269
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)