Various fixes
[freeradius.git] / scripts / raddebug
1 #!/bin/sh
2 ######################################################################
3 #
4 #    This program is free software; you can redistribute it and/or modify
5 #    it under the terms of the GNU General Public License as published by
6 #    the Free Software Foundation; either version 2 of the License, or
7 #    (at your option) any later version.
8 #
9 #    This program is distributed in the hope that it will be useful,
10 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
11 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 #    GNU General Public License for more details.
13 #
14 #    You should have received a copy of the GNU General Public License
15 #    along with this program; if not, write to the Free Software
16 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 #
18 #    Copyright (C) 2009 Network RADIUS SARL <info@networkradius.com>
19 #
20 ######################################################################
21 #
22 #  This script assumes that "radmin" is in PATH, and that the user
23 #  running this script has permission to connect to the radmin socket,
24 #  and to read/write files in the "logdir" directory.  If none of this is
25 #  true, then it won't work.
26 #
27 #   Usage: raddebug [-c condition] [-i client-ip-address] [-I client-ipv6-address] [-f socket_file] [-t timeout]  [-u username]
28 #
29 #
30
31 usage() {
32     printf "Usage: %s: [-c condition] [-d directory] [-i client-ip-address] [-I client-ipv6-address] [-f socket_file] [-t timeout] [-u user]\n" $(basename $0) >&2
33     exit 2
34 }
35
36 extra=
37 condition=1
38 timeout=60
39 while getopts 'd:c:i:I:f:t:u:' OPTION
40 do
41   case $OPTION in
42   c)    condition="$OPTARG"
43         ;;
44   d)    [ "$extra" = "" ] || usage
45         extra="-d $OPTARG"
46         ;;
47   i)    condition="(Packet-Src-IP-Address == $OPTARG)"
48         ;;
49   I)    condition="(Packet-Src-IPv6-Address == $OPTARG)"
50         ;;
51   f)    [ "$extra" = "" ] || usage
52         extra="-f $OPTARG"
53         ;;
54   t)    timeout="$OPTARG"
55         [ "$timout" = "0" ] && timeout=1000000
56         ;;
57   u)    condition="(User-Name == $OPTARG)"
58         ;;
59   ?)    usage
60         ;;
61   esac
62 done
63 shift $(($OPTIND - 1))
64
65 radmin="radmin $extra"
66
67 #
68 #  Start off by turning off debugging.
69 #  If there's a problem, die.
70 #
71 $radmin -e "debug condition"
72 if [ "$?" != "0" ]; then
73   exit 1
74 fi
75
76 #
77 #  Debug to a file, and then tell us where the file is.
78 #
79 outfile=`$radmin -e "debug file radmin.debug.$$" -e "show debug file"`
80
81 #
82 #  If there was an error setting the debug output, re-set the
83 #  debug condition, echo the error, and exit.
84 #
85 echo $outfile | grep 'ERROR' >/dev/null 2>&1
86 if [ "$?" = "0" ]; then
87   $radmin -e "debug condition"
88   echo $outfile
89   exit 1
90 fi
91
92 #
93 #  Truncate the file, and ensure it's writable by radiusd
94 #
95 cp /dev/null $outfile
96 chmod g+w $outfile
97
98 TAILPID=$$
99
100 #
101 #  Set the trap to clean up on exit and any interrupts.
102 #
103 trap '$radmin -e "debug condition" -e "debug file"; rm -f $outfile;kill -TERM $TAILPID;exit 0' 1 2 15
104
105 #
106 #  Set the debug condition
107 #
108 $radmin -e "debug condition \"$condition\""
109
110 #
111 #  Print the output, and wait for "timeout".  Then, stop printing.
112 #
113 tail -f $outfile &
114 TAILPID=$!
115 sleep $timeout
116 kill -TERM $TAILPID
117 $radmin -e "debug condition" -e "debug file"
118 rm -f $outfile