serv 5.61 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2012-2013  Etersoft
# Copyright (C) 2012-2013  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 35 36 37 38 39 40 41 42
}

load_helper epm-sh-functions

PATH=$PATH:/sbin:/usr/sbin

set_sudo

check_tty

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

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

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

55 56 57 58 59 60 61
is_active_systemd()
{
	SYSTEMCTL=/bin/systemctl
	SYSTEMD_CGROUP_DIR=/sys/fs/cgroup/systemd
	[ -x "$SYSTEMCTL" ] && [ -d "$SYSTEMD_CGROUP_DIR" ] && mountpoint -q "$SYSTEMD_CGROUP_DIR"
}

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

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

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

104
SERVICETYPE=$CMD
105

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
}



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

 Options:
$(get_help HELPOPT)
"
}

print_version()
{
        echo "Service manager version @VERSION@"
        echo "Running on $($DISTRVENDOR)"
        echo "Copyright (c) Etersoft 2012, 2013"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
127
        echo "This program may be freely redistributed under the terms of the GNU AGPLv3."
128 129
}

130 131 132
progname="${0##*/}"

Usage="Usage: $progname [options] [<service>] [<command>] [params]..."
133 134 135 136 137 138 139 140 141 142 143
Descr="serv - Service manager"

set_service_type

verbose=
quiet=
non_interactive=
show_command_only=
serv_cmd=
service_name=
params=
144
withoutservicename=
145

146 147 148 149 150 151 152 153 154
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
155 156
    usage)                    # HELPCMD: print out usage of the service
        serv_cmd=usage
157
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
158
        ;;
159 160
    #restart)                 # HELPCMD: restart service
    #reload)                  # HELPCMD: reload service
161 162 163
    start)                    # HELPCMD: start service
        serv_cmd=start
        ;;
164 165 166
    try-restart|condrestart)  # HELPCMD: Restart service if running
        serv_cmd=try_restart
        ;;
167 168 169
    stop)                     # HELPCMD: stop service
        serv_cmd=stop
        ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
170 171
    list)                     # HELPCMD: list running services
        serv_cmd=list
172
        withoutservicename=1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
173
        ;;
174 175
    list-all)                 # HELPCMD: list all available services
        serv_cmd=list_all
176
        withoutservicename=1
177 178 179
        ;;
    list-startup)             # HELPCMD: list all services to run on startup
        serv_cmd=list_startup
180
        withoutservicename=1
181
        ;;
182 183
    on|enable)                # HELPCMD: add service to run on startup and start it now
        serv_cmd=enable
184
        ;;
185 186
    off|disable)              # HELPCMD: remove service to run on startup and stop it now
        serv_cmd=disable
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 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
        ;;
    *)
        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
236
if [ -z "$withoutservicename" ] && [ -z "$service_name" ] ; then
237 238
    print_version
    echo
239
    fatal "Run $ $progname --help for get help"
240 241 242 243 244 245 246 247 248 249
fi

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)