1#!/usr/afsws/bin/pagsh
2#
3#   Get a Kerbos authentication ticket for AFS for Bacula, then run
4#      the Bacula client.  See AFS-README for documentation.
5#
6# NAME          afs_bacula
7# AUTHOR        Lucas Mingarro <lucas@easytech.com.ar>
8# PURPOSE       Run an AFS authenticated program.
9#               Get a PAG, get the user's token,
10#               then exec user's command
11#
12TEXTDOMAIN=initscripts
13TEXTDOMAINDIR=/etc/locale
14
15# Make sure umask is sane
16umask 022
17
18# First set up a default search path.
19export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
20
21# Get a sane screen width
22[ -z "$COLUMNS" ] && COLUMNS=80
23
24if [ -f /etc/sysconfig/i18n -a -z "$NOLOCALE" ] ; then
25   . /etc/sysconfig/i18n
26   if [ "$LANG" = "ja_JP.eucJP" -a "`/sbin/consoletype`" != "pty" ]; then
27     unset LANG
28   else
29     export LANG
30   fi
31fi
32
33# Read in our configuration
34if [ -z "$BOOTUP" ]; then
35   if [ -f /etc/sysconfig/init ]; then
36       . /etc/sysconfig/init
37   else
38     # This all seem confusing? Look in /etc/sysconfig/init,
39     # or in /usr/doc/initscripts-*/sysconfig.txt
40     BOOTUP=color
41     RES_COL=60
42     MOVE_TO_COL="echo -en \\033[${RES_COL}G"
43     SETCOLOR_SUCCESS="echo -en \\033[1;32m"
44     SETCOLOR_FAILURE="echo -en \\033[1;31m"
45     SETCOLOR_WARNING="echo -en \\033[1;33m"
46     SETCOLOR_NORMAL="echo -en \\033[0;39m"
47     LOGLEVEL=1
48   fi
49   if [ -x /sbin/consoletype ]; then
50     if [ "`consoletype`" = "serial" ]; then
51       BOOTUP=serial
52       MOVE_TO_COL=
53       SETCOLOR_SUCCESS=
54       SETCOLOR_FAILURE=
55       SETCOLOR_WARNING=
56       SETCOLOR_NORMAL=
57     fi
58   fi
59fi
60
61if [ "$BOOTUP" != "verbose" ]; then
62    INITLOG_ARGS="-q"
63else
64    INITLOG_ARGS=
65fi
66
67# Check if $pid (could be plural) are running
68checkpid() {
69         while [ "$1" ]; do
70            [ -d /proc/$1 ] && return 0
71            shift
72         done
73         return 1
74}
75
76
77# A function to start a program.
78daemon() {
79         # Test syntax.
80         local gotbase=
81         local base= user= nice= bg= pid
82         nicelevel=0
83         while [ "$1" != "${1##[-+]}" ]; do
84           case $1 in
85             '')    echo $"$0: Usage: daemon [+/-nicelevel] {program}"
86                    return 1;;
87             --check)
88                    base=$2
89                    gotbase="yes"
90                    shift 2
91                    ;;
92             --check=?*)
93                    base=${1#--user=}
94                    shift
95                    ;;
96             --user)
97                    user=$2
98                    shift 2
99                    ;;
100             --user=?*)
101                    user=${1#--user=}
102                    shift
103                    ;;
104             [-+][0-9]*)
105                    nice="nice -n $1"
106                    shift
107                    ;;
108             *)     echo $"$0: Usage: daemon [+/-nicelevel] {program}"
109                    return 1;;
110           esac
111         done
112
113         # Save basename.
114         [ -z $gotbase ] && base=${1##*/}
115
116         # See if it's already running. Look *only* at the pid file.
117         pidlist=`pidfileofproc $base`
118
119         [ -n "$pid" ] && return
120
121         # make sure it doesn't core dump anywhere; while this could mask
122         # problems with the daemon, it also closes some security problems
123         ulimit -S -c 0 >/dev/null 2>&1
124
125         # Echo daemon
126         [ "$BOOTUP" = "verbose" ] && echo -n " $base"
127
128         # And start it up.
129         if [ -z "$user" ]; then
130            $nice initlog $INITLOG_ARGS -c "$*"
131         else
132            $nice initlog $INITLOG_ARGS -c "su - $user -c \"$*\"" &&
133success $"$base startup" || failure $"$base startup"
134         fi
135         [ $? = 0 ] && success $"$base startup" || failure $"$base startup"
136}
137
138
139# A function to find the pid of a program. Looks *only* at the pidfile
140pidfileofproc() {
141         local base=${1##*/}
142         local pid
143
144         # Test syntax.
145         if [ $# = 0 ] ; then
146                 echo $"Usage: pidfileofproc {program}"
147                 return 1
148         fi
149
150         # First try "/var/run/*.pid" files
151         if [ -f /var/run/${base}.pid ] ; then
152                 read pid < /var/run/${base}.pid
153                 for p in $line ; do
154                        [ -z "${p//[0-9]/}" -a -d /proc/$p ] &&
155pid="$pid $p"
156                 done
157                 if [ -n "$pid" ] ; then
158                         echo $pid
159                         return 0
160                 fi
161         fi
162}
163
164echo_success() {
165   [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
166   echo -n "[  "
167   [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
168   echo -n $"OK"
169   [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
170   echo -n "  ]"
171   echo -ne "\r"
172   return 0
173}
174
175echo_failure() {
176   [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
177   echo -n "["
178   [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
179   echo -n $"FAILED"
180   [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
181   echo -n "]"
182   echo -ne "\r"
183   return 1
184}
185
186echo_passed() {
187   [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
188   echo -n "["
189   [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
190   echo -n $"PASSED"
191   [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
192   echo -n "]"
193   echo -ne "\r"
194   return 1
195}
196
197# Log that something succeeded
198success() {
199   if [ -z "$IN_INITLOG" ]; then
200      initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
201   else
202      # silly hack to avoid EPIPE killing rc.sysinit
203      trap "" SIGPIPE
204      echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
205      trap - SIGPIPE
206   fi
207   [ "$BOOTUP" != "verbose" ] && echo_success
208   return 0
209}
210
211# Log that something failed
212failure() {
213   rc=$?
214   if [ -z "$IN_INITLOG" ]; then
215      initlog $INITLOG_ARGS -n $0 -s "$1" -e 2
216   else
217      trap "" SIGPIPE
218      echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 2" >&21
219      trap - SIGPIPE
220   fi
221   [ "$BOOTUP" != "verbose" ] && echo_failure
222   return $rc
223}
224
225# Log that something passed, but may have had errors. Useful for fsck
226passed() {
227   rc=$?
228   if [ -z "$IN_INITLOG" ]; then
229      initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
230   else
231      trap "" SIGPIPE
232      echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
233      trap - SIGPIPE
234   fi
235   [ "$BOOTUP" != "verbose" ] && echo_passed
236   return $rc
237}
238
239# Run some action. Log its output.
240action() {
241   STRING=$1
242   echo -n "$STRING "
243   shift
244   initlog $INITLOG_ARGS -c "$*" && success $"$STRING" || failure $"$STRING"
245   rc=$?
246   echo
247   return $rc
248}
249
250# returns OK if $1 contains $2
251strstr() {
252   [ "$1" = "$2" ] && return 0
253   slice=${1#*$2*}
254   [ "$slice" = "$1" ] && return 1
255   return 0
256}
257
258# Confirm whether we really want to run this service
259confirm() {
260   local YES=$"yY"
261   local NO=$"nN"
262   local CONT=$"cC"
263
264   while : ; do
265       echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
266       read answer
267       if strstr "$YES" "$answer" || [ "$answer" = "" ] ; then
268          return 0
269       elif strstr "$CONT" "$answer" ; then
270          return 2
271       elif strstr "$NO" "$answer" ; then
272          return 1
273       fi
274   done
275}
276
277# Here is the authentication with the kas server
278
279CMD=`basename ${0}`
280PRINCIPAL='bacula'
281passwordfile='/etc/security/afs_bacula.pw'
282klog $PRINCIPAL -pipe < ${passwordfile}
283command_line="$*"
284command=`echo ${command_line} | awk '{print $1}'`
285# Check if we can run the command.
286# If we got this far, it is likely that the command name is correct
287# but there may be a problem in accessing the command file.
288# If there is an error, log it via syslog (logger) rather than ">&2"
289
290   #if [ ! -x "${command}" ]; then
291     #M="error: unable to execute command ${command}"
292     #logger -i -t "${CMD}" "${M}"
293     #exit 1
294   #fi
295#fi
296$command_line
297