serv 6.77 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
	# use external distro_info if internal one is missed
52
	DISTRVENDOR=$PROGDIR/distr_info
53 54 55 56
	[ -x $DISTRVENDOR ] || DISTRVENDOR=distro_info

	# Fill for use: PMTYPE, DISTRNAME, DISTRVERSION, PKGFORMAT, PKGVENDOR, RPMVENDOR
	[ -n "$DISTRNAME" ] || DISTRNAME=$($DISTRVENDOR -d) || fatal "Can't get distro name from $DISTRVENDOR."
57 58 59 60 61 62 63
	[ -n "$DISTRVERSION" ] || DISTRVERSION=$($DISTRVENDOR -v)
	set_target_pkg_env

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

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

102 103 104
# override system control detection result
[ -n "$FORCESERVICE" ] && CMD=$FORCESERVICE

105
SERVICETYPE=$CMD
106

107
ANYSERVICE=$(which anyservice 2>/dev/null)
108

109 110
}

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


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

 Options:
$(get_help HELPOPT)
"
}

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

144 145 146
progname="${0##*/}"

Usage="Usage: $progname [options] [<service>] [<command>] [params]..."
147 148 149 150 151 152 153 154 155 156 157
Descr="serv - Service manager"

set_service_type

verbose=
quiet=
non_interactive=
show_command_only=
serv_cmd=
service_name=
params=
158
withoutservicename=
159

160 161 162
# load system wide config
[ -f /etc/eepm/serv.conf ] && . /etc/eepm/serv.conf

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

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