Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
executable file 150 lines (122 sloc) 3.36 KB
#!/bin/bash
#
# Copyright (C) 2012 Sourcepole.ch
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (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
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA
#
# On Debian systems, a copy of the GNU General Public License may be
# found in /usr/share/common-licenses/GPL.
function help()
{
cat<<-EOH
$0 [-h|--help] [-n] [-a]
Try to restart services, as indicated by checkrestart.
Options:
-h, --help ... help
-s, --simulate ... simulate, do nothing, just print actions
-a ... script is run by apt-get, add headers to output
Return codes:
0 ... OK
1 ... error
2 ... warning
EOH
exit 0
}
# Path to checkrestart
PATH_CHECKRESTART="/usr/sbin/checkrestart"
# Required binaries/scripts
NEED="egrep sed"
function warning()
{
echo "! Warning: $@" 1>&2
EXIT=2
}
function error()
{
echo "!! Error: $@" 1>&2
exit 1
}
function message()
{
echo "$@"
}
function xeval()
{
local cmd="$1"
local ret_func="$2"
local ret_str="Command \"$cmd\" returns"
[ -z "$ret_func" ] && ret_func="error"
message "$cmd"
[ "$DRYRUN" == "1" ] && cmd=":"
eval "$cmd" || $ret_func "$ret_str $?"
}
# starting exit code
EXIT=0
# arguments parsing
while [ "$#" != "0" ]; do
case "$1" in
-s|--simulate)
DRYRUN="1"
;;
-a)
APTGET="1"
;;
-h|--help)
help
;;
esac
shift
done
# header to apt-get output
[ "$APTGET" == "1" ] && message "--- start $0"
# check paths
[ ! -x "$PATH_CHECKRESTART" ] &&
error "Can not execute $PATH_CHECKRESTART"
# check required binaries/scripts
for bin in $NEED; do
which "$bin" >& /dev/null || \
error "Required binary/script not found $@"
done
# get output of checkrestart
output="`xeval $PATH_CHECKRESTART`"
# write output
message "$output"
# check output
[ -z "$output" ] &&
error "Output of $PATH_CHECKRESTART was empty"
# count number of processes to restart
no_procs="`echo \"$output\" | \
egrep '^Found [0-9]+ processes using old versions of upgraded files' | \
sed 's/^Found \([0-9]*\).*/\1/'`"
# restart services
echo ""
[ "$no_procs" != "0" ] && message "Trying to restart services..."
IFS="
"
no_services=0
for service in `echo "$output" | sed "/^These are the init scripts:/,//!d" | egrep "^service "`; do
xeval "$service" "warning"
no_services="$((no_services+1))"
done
# check if no of processes is equal to no of services
# if [ "$no_services" != "$no_procs" ]; then
# warning "Number of processes ($no_procs) is not equal to number of services ($no_services)"
# fi
# last messages
[ "$EXIT" == "0" ] && \
message "Completed without problems" || \
warning "Completed with some warnings see above"
# header to apt-get output
[ "$APTGET" == "1" ] && message "--- end $0"
exit $EXIT