#!/usr/afsws/bin/pagsh
#
# Get a Kerbos authentication ticket for AFS for Bacula, then run
# the Bacula client. See AFS-README for documentation.
#
# NAME afs_bacula
# AUTHOR Lucas Mingarro <lucas@easytech.com.ar>
# PURPOSE Run an AFS authenticated program.
# Get a PAG, get the user's token,
# then exec user's command
#
TEXTDOMAIN=initscripts
TEXTDOMAINDIR=/etc/locale
# Make sure umask is sane
umask 022
# First set up a default search path.
export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
# Get a sane screen width
[ -z "$COLUMNS" ] && COLUMNS=80
if [ -f /etc/sysconfig/i18n -a -z "$NOLOCALE" ] ; then
. /etc/sysconfig/i18n
if [ "$LANG" = "ja_JP.eucJP" -a "`/sbin/consoletype`" != "pty" ]; then
unset LANG
else
export LANG
fi
fi
# Read in our configuration
if [ -z "$BOOTUP" ]; then
if [ -f /etc/sysconfig/init ]; then
. /etc/sysconfig/init
else
# This all seem confusing? Look in /etc/sysconfig/init,
# or in /usr/doc/initscripts-*/sysconfig.txt
BOOTUP=color
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"
LOGLEVEL=1
fi
if [ -x /sbin/consoletype ]; then
if [ "`consoletype`" = "serial" ]; then
BOOTUP=serial
MOVE_TO_COL=
SETCOLOR_SUCCESS=
SETCOLOR_FAILURE=
SETCOLOR_WARNING=
SETCOLOR_NORMAL=
fi
fi
fi
if [ "$BOOTUP" != "verbose" ]; then
INITLOG_ARGS="-q"
else
INITLOG_ARGS=
fi
# Check if $pid (could be plural) are running
checkpid() {
while [ "$1" ]; do
[ -d /proc/$1 ] && return 0
shift
done
return 1
}
# A function to start a program.
daemon() {
# Test syntax.
local gotbase=
local base= user= nice= bg= pid
nicelevel=0
while [ "$1" != "${1##[-+]}" ]; do
case $1 in
'') echo $"$0: Usage: daemon [+/-nicelevel] {program}"
return 1;;
--check)
base=$2
gotbase="yes"
shift 2
;;
--check=?*)
base=${1#--user=}
shift
;;
--user)
user=$2
shift 2
;;
--user=?*)
user=${1#--user=}
shift
;;
[-+][0-9]*)
nice="nice -n $1"
shift
;;
*) echo $"$0: Usage: daemon [+/-nicelevel] {program}"
return 1;;
esac
done
# Save basename.
[ -z $gotbase ] && base=${1##*/}
# See if it's already running. Look *only* at the pid file.
pidlist=`pidfileofproc $base`
[ -n "$pid" ] && return
# make sure it doesn't core dump anywhere; while this could mask
# problems with the daemon, it also closes some security problems
ulimit -S -c 0 >/dev/null 2>&1
# Echo daemon
[ "$BOOTUP" = "verbose" ] && echo -n " $base"
# And start it up.
if [ -z "$user" ]; then
$nice initlog $INITLOG_ARGS -c "$*"
else
$nice initlog $INITLOG_ARGS -c "su - $user -c \"$*\"" &&
success $"$base startup" || failure $"$base startup"
fi
[ $? = 0 ] && success $"$base startup" || failure $"$base startup"
}
# A function to find the pid of a program. Looks *only* at the pidfile
pidfileofproc() {
local base=${1##*/}
local pid
# Test syntax.
if [ $# = 0 ] ; then
echo $"Usage: pidfileofproc {program}"
return 1
fi
# First try "/var/run/*.pid" files
if [ -f /var/run/${base}.pid ] ; then
read pid < /var/run/${base}.pid
for p in $line ; do
[ -z "${p//[0-9]/}" -a -d /proc/$p ] &&
pid="$pid $p"
done
if [ -n "$pid" ] ; then
echo $pid
return 0
fi
fi
}
echo_success() {
[ "$BOOTUP" = "color" ] && $MOVE_TO_COL
echo -n "[ "
[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
echo -n $"OK"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo -n " ]"
echo -ne "\r"
return 0
}
echo_failure() {
[ "$BOOTUP" = "color" ] && $MOVE_TO_COL
echo -n "["
[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
echo -n $"FAILED"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo -n "]"
echo -ne "\r"
return 1
}
echo_passed() {
[ "$BOOTUP" = "color" ] && $MOVE_TO_COL
echo -n "["
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo -n $"PASSED"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo -n "]"
echo -ne "\r"
return 1
}
# Log that something succeeded
success() {
if [ -z "$IN_INITLOG" ]; then
initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
else
# silly hack to avoid EPIPE killing rc.sysinit
trap "" SIGPIPE
echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
trap - SIGPIPE
fi
[ "$BOOTUP" != "verbose" ] && echo_success
return 0
}
# Log that something failed
failure() {
rc=$?
if [ -z "$IN_INITLOG" ]; then
initlog $INITLOG_ARGS -n $0 -s "$1" -e 2
else
trap "" SIGPIPE
echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 2" >&21
trap - SIGPIPE
fi
[ "$BOOTUP" != "verbose" ] && echo_failure
return $rc
}
# Log that something passed, but may have had errors. Useful for fsck
passed() {
rc=$?
if [ -z "$IN_INITLOG" ]; then
initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
else
trap "" SIGPIPE
echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
trap - SIGPIPE
fi
[ "$BOOTUP" != "verbose" ] && echo_passed
return $rc
}
# Run some action. Log its output.
action() {
STRING=$1
echo -n "$STRING "
shift
initlog $INITLOG_ARGS -c "$*" && success $"$STRING" || failure $"$STRING"
rc=$?
echo
return $rc
}
# returns OK if $1 contains $2
strstr() {
[ "$1" = "$2" ] && return 0
slice=${1#*$2*}
[ "$slice" = "$1" ] && return 1
return 0
}
# Confirm whether we really want to run this service
confirm() {
local YES=$"yY"
local NO=$"nN"
local CONT=$"cC"
while : ; do
echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
read answer
if strstr "$YES" "$answer" || [ "$answer" = "" ] ; then
return 0
elif strstr "$CONT" "$answer" ; then
return 2
elif strstr "$NO" "$answer" ; then
return 1
fi
done
}
# Here is the authentication with the kas server
CMD=`basename ${0}`
PRINCIPAL='bacula'
passwordfile='/etc/security/afs_bacula.pw'
klog $PRINCIPAL -pipe < ${passwordfile}
command_line="$*"
command=`echo ${command_line} | awk '{print $1}'`
# Check if we can run the command.
# If we got this far, it is likely that the command name is correct
# but there may be a problem in accessing the command file.
# If there is an error, log it via syslog (logger) rather than ">&2"
#if [ ! -x "${command}" ]; then
#M="error: unable to execute command ${command}"
#logger -i -t "${CMD}" "${M}"
#exit 1
#fi
#fi
$command_line
syntax highlighted by Code2HTML, v. 0.9.1