Rev 2278 | Rev 2394 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log
Rev | Author | Line No. | Line |
---|---|---|---|
1535 | richard | 1 | #!/bin/bash |
64 | franck | 2 | # $Id: alcasar-watchdog.sh 2376 2017-08-16 18:46:50Z tom.houdayer $ |
672 | richard | 3 | |
4 | # alcasar-watchdog.sh |
||
790 | richard | 5 | # by Rexy |
672 | richard | 6 | # This script is distributed under the Gnu General Public License (GPL) |
2108 | richard | 7 | # - Ce script prévient les usagers de l'indisponibilité de l'accès Internet |
8 | # - Il déconnecte les usagers dont les équipements réseau ne répondent plus (leur onglet 'status.php' a été fermé) |
||
9 | # - Il deconnecte les usagers dont les adresses MAC sont usurpées |
||
10 | # |
||
11 | # - This script tells users that Internet access is down |
||
12 | # - It logs out users whose PCs are quiet (their status tab is closed) |
||
13 | # - It logs out users whose MAC address is used by other systems (usurped) |
||
672 | richard | 14 | |
1469 | richard | 15 | CONF_FILE="/usr/local/etc/alcasar.conf" |
16 | EXTIF=`grep ^EXTIF= $CONF_FILE|cut -d"=" -f2` # EXTernal InterFace |
||
17 | INTIF=`grep ^INTIF= $CONF_FILE|cut -d"=" -f2` # INTernal InterFace |
||
18 | private_ip_mask=`grep PRIVATE_IP= $CONF_FILE|cut -d"=" -f2` |
||
786 | richard | 19 | private_ip_mask=${private_ip_mask:=192.168.182.1/24} |
2250 | tom.houday | 20 | PRIVATE_IP=`echo "$private_ip_mask" |cut -d"/" -f1` # @ip du portail (côté LAN) |
1157 | stephane | 21 | PRIVATE_IP=${PRIVATE_IP:=192.168.182.1} |
2250 | tom.houday | 22 | current_users_file="/var/tmp/havp/current_users.txt" # file containing active users with their "status.php" tab open |
316 | richard | 23 | DIR_WEB="/var/www/html" |
360 | richard | 24 | Index_Page="$DIR_WEB/index.php" |
1472 | richard | 25 | IPTABLES="/sbin/iptables" |
2250 | tom.houday | 26 | TUNIF="tun0" # listen device for chilli daemon |
597 | richard | 27 | OLDIFS=$IFS |
1 | root | 28 | IFS=$'\n' |
308 | richard | 29 | |
783 | richard | 30 | function lan_down_alert () |
1157 | stephane | 31 | # users are redirected on ALCASAR IP address if a LAN problem is detected |
308 | richard | 32 | { |
783 | richard | 33 | case $LAN_DOWN in |
308 | richard | 34 | "1") |
1469 | richard | 35 | logger "$EXTIF (WAN card) link down" |
1474 | richard | 36 | echo "$EXTIF (WAN card) link down" |
1469 | richard | 37 | /bin/sed -i "s?diagnostic =.*?diagnostic = \"$EXTIF (WAN card) link down\";?g" $Index_Page |
308 | richard | 38 | ;; |
39 | "2") |
||
40 | logger "can't contact the default router" |
||
987 | richard | 41 | echo "can't contact the default router" |
363 | richard | 42 | /bin/sed -i "s?diagnostic =.*?diagnostic = \"can't contact the default router\";?g" $Index_Page |
308 | richard | 43 | ;; |
44 | esac |
||
2250 | tom.houday | 45 | net_pb=`grep "network_pb = true;" $Index_Page|wc -l` |
1472 | richard | 46 | if [ $net_pb = "0" ] # user alert (only the first time) |
308 | richard | 47 | then |
2250 | tom.houday | 48 | /bin/sed -i "s?^\$network_pb.*?\$network_pb = true;?g" $Index_Page |
1472 | richard | 49 | $IPTABLES -I PREROUTING -t nat -i $TUNIF -p udp --dport domain -j REDIRECT --to-port 56 |
308 | richard | 50 | fi |
51 | } |
||
52 | |||
783 | richard | 53 | function lan_test () |
54 | # LAN connectiivity testing |
||
55 | { |
||
784 | richard | 56 | watchdog_process=`ps -C alcasar-watchdog.sh|wc -l` |
57 | if [[ $(expr $watchdog_process) -gt 3 ]] |
||
58 | then |
||
59 | echo "ALCASAR watchdog is already running" |
||
60 | exit 0 |
||
61 | fi |
||
783 | richard | 62 | # EXTIF testing |
63 | LAN_DOWN="0" |
||
1472 | richard | 64 | if [ `/sbin/ip link | grep $EXTIF|grep "NO-CARRIER" | wc -l` -eq "1" ] |
783 | richard | 65 | then |
66 | LAN_DOWN="1" |
||
308 | richard | 67 | fi |
783 | richard | 68 | # Default GW testing |
69 | if [ $LAN_DOWN -eq "0" ] |
||
308 | richard | 70 | then |
783 | richard | 71 | IP_GW=`/sbin/ip route list|grep ^default|cut -d" " -f3` |
72 | arp_reply=`/usr/sbin/arping -I$EXTIF -c1 $IP_GW|grep response|cut -d" " -f2` |
||
73 | if [ $arp_reply -eq "0" ] |
||
2376 | tom.houday | 74 | then |
783 | richard | 75 | LAN_DOWN="2" |
76 | fi |
||
308 | richard | 77 | fi |
783 | richard | 78 | # if LAN pb detected, users are warned |
79 | if [ $LAN_DOWN != "0" ] |
||
80 | then |
||
81 | lan_down_alert |
||
82 | # else switch in normal mode |
||
83 | else |
||
987 | richard | 84 | echo "Internet access is OK for now" |
2250 | tom.houday | 85 | net_pb=`grep "network_pb = true;" $Index_Page|wc -l` |
783 | richard | 86 | if [ $net_pb != "0" ] |
87 | then |
||
2250 | tom.houday | 88 | /bin/sed -i "s?^\$network_pb.*?\$network_pb = false;?g" $Index_Page |
1472 | richard | 89 | $IPTABLES -D PREROUTING -t nat -i $TUNIF -p udp --dport domain -j REDIRECT --to-port 56 |
783 | richard | 90 | fi |
91 | fi |
||
92 | } |
||
93 | |||
94 | usage="Usage: alcasar-watchdog.sh {-lt --lan_test}" |
||
95 | case $1 in |
||
96 | -\? | -h* | --h*) |
||
97 | echo "$usage" |
||
98 | exit 0 |
||
99 | ;; |
||
100 | -lt | --lan_test) |
||
101 | lan_test |
||
102 | exit 0 |
||
103 | ;; |
||
104 | *) |
||
105 | lan_test |
||
2108 | richard | 106 | # We disconnect inactive users (its means that their 'status.php' tab has been closed --> their ip address isn't in $current_users_file) |
107 | # process each equipment known by chilli to check if IP address is usurped (with arping) |
||
783 | richard | 108 | for system in `/usr/sbin/chilli_query list |grep -v "\.0\.0\.0"` |
109 | do |
||
110 | active_ip=`echo $system |cut -d" " -f2` |
||
111 | active_session=`echo $system |cut -d" " -f5` |
||
112 | active_mac=`echo $system | cut -d" " -f1` |
||
840 | richard | 113 | active_user=`echo $system |cut -d" " -f6` |
2107 | raphael.pi | 114 | #We disconnect inactive user here : |
115 | #We check if this is not an auth @MAC and if he is still connected |
||
2108 | richard | 116 | if [ "$active_user" != "$active_mac" ] && [ $(expr $active_session) -eq 1 ]; then |
2107 | raphael.pi | 117 | if [ -e $current_users_file ]; then |
118 | # We check if user @IP is in 'current_users.txt' |
||
2376 | tom.houday | 119 | cmp_user_ok=$(cat $current_users_file | grep "^$active_ip\$" -c) |
2108 | richard | 120 | # If not we disconnect this user. |
2107 | raphael.pi | 121 | if [ $cmp_user_ok -eq 0 ]; then |
2113 | richard | 122 | logger "alcasar-watchdog : $active_ip ($active_mac) can't be contact. We disconnects the user ($active_user)." |
2107 | raphael.pi | 123 | /usr/sbin/chilli_query logout $active_mac |
2376 | tom.houday | 124 | else |
125 | # Remove the user's IP from 'current_users.txt'. Every user need to insert their @IP everytime to prove their connectivity. |
||
126 | sed -i "/^$active_ip\$/d" $current_users_file |
||
2107 | raphael.pi | 127 | fi |
2278 | richard | 128 | else # "current_user.txt" does not exists. We disconnect every users. |
2113 | richard | 129 | logger "alcasar-watchdog : The file /var/tmp/havp/current_users.txt doen't' exist. We disconnects the user $active_user" |
2107 | raphael.pi | 130 | /usr/sbin/chilli_query logout $active_mac |
131 | fi |
||
132 | fi |
||
2108 | richard | 133 | # IP usurpation test : process only equipment with an authenticated user |
783 | richard | 134 | if [[ $(expr $active_session) -eq 1 ]] |
1157 | stephane | 135 | then |
2278 | richard | 136 | arp_reply=`/usr/sbin/arping -b -I$INTIF -s$PRIVATE_IP -c1 -w4 $active_ip|grep -c "Unicast reply"` |
137 | # disconnect users whose equipement is usurped. For example, if there are 2 same @MAC it will make 2 lines in output. |
||
138 | if [[ $(expr $arp_reply) -gt 1 ]] |
||
2376 | tom.houday | 139 | then |
1500 | richard | 140 | echo "$(date "+[%x-%X] : ")alcasar-watchdog : $active_ip is usurped ($active_mac). Alcasar disconnect the user ($active_user)." >> /var/Save/security/watchdog.log |
840 | richard | 141 | logger "alcasar-watchdog : $active_ip is usurped ($active_mac). Alcasar disconnect the user ($active_user)." |
783 | richard | 142 | /usr/sbin/chilli_query logout $active_mac |
1500 | richard | 143 | chmod 644 /var/Save/security/watchdog.log |
783 | richard | 144 | fi |
145 | fi |
||
146 | done |
||
147 | ;; |
||
148 | esac |
||
597 | richard | 149 | IFS=$OLDIFS |