3fac9de25083dd713bdc3b2cabf5cb386207b8a2
[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         ;;
56   u)    condition="(User-Name == $OPTARG)"
57         ;;
58   ?)    usage
59         ;;
60   esac
61 done
62 shift $(($OPTIND - 1))
63
64 radmin="radmin $extra"
65
66 #
67 #  Start off by turning off debugging.
68 #  If there's a problem, die.
69 #
70 $radmin -e "debug condition"
71 if [ "$?" != "0" ]; then
72   exit 1
73 fi
74
75 #
76 #  Debug to a file, and then tell us where the file is.
77 #
78 outfile=`$radmin -e "debug file radmin.debug.$$" -e "show debug file"`
79
80 #
81 #  If there was an error setting the debug output, re-set the
82 #  debug condition, echo the error, and exit.
83 #
84 echo $outfile | grep 'ERROR' >/dev/null 2>&1
85 if [ "$?" = "0" ]; then
86   $radmin -e "debug condition"
87   echo $outfile
88   exit 1
89 fi
90
91 #
92 #  Truncate the file, and ensure it's writable by radiusd
93 #
94 cp /dev/null $outfile
95 chmod g+w $outfile
96
97 #
98 #  Set the trap to clean up on exit and any interrupts.
99 #
100 trap '$radmin -e "debug condition" -e "debug file"; rm -f $outfile; exit 0' 0 1 2 15
101
102 #
103 #  Set the debug condition
104 #
105 $radmin -e "debug condition \"$condition\""
106
107 #
108 #  Print the output, and wait for "timeout".  Then, stop printing.
109 #
110 (tail -f $outfile | sed 's/^.*Debug: //') &
111 sleep $timeout
112 kill -INT %1