· 7 years ago · Dec 26, 2018, 03:48 AM
1#!/bin/sh
2REFRESH_RATE="$1"
3if [ -z "$REFRESH_RATE" ];
4then
5 REFRESH_RATE=1
6fi
7
8# Bandwidth Download/Upload Rate Counter
9LAN_IFACE=$(nvram get lan_ifname)
10LAN_TYPE=$(nvram get lan_ipaddr | awk ' { FS="."; print $1"."$2 }')
11
12if [ -f /tmp/traffic_monitor.lock ];
13then
14 if [ ! -d /proc/$(cat /tmp/traffic_monitor.lock) ]; then
15 echo "WARNING : Lockfile detected but process $(cat /tmp/traffic_monitor.lock) does not exist. Reinitialising lock file!"
16 rm -f /tmp/traffic_monitor.lock
17 else
18 echo "WARNING : Process is already running as $(cat /tmp/traffic_monitor.lock), aborting!"
19 exit
20 fi
21fi
22
23echo $$ > /tmp/traffic_monitor.lock
24echo "Monitoring network ${LAN_TYPE}.x.255"
25
26# Check the number of ip_conntrack fields
27CONNTRACK=$(tail -n1 /proc/net/ip_conntrack | awk 'END { print NF; }')
28
29while :
30do
31 #Create the RRDIPT CHAIN (it doesn't matter if it already exists).
32 iptables -N RRDIPT 2> /dev/null
33
34 #Add the RRDIPT CHAIN to the FORWARD chain (if non existing).
35 iptables -L FORWARD --line-numbers -n | grep "RRDIPT" | grep "1" > /dev/null
36 if [ $? -ne 0 ]; then
37 iptables -L FORWARD -n | grep "RRDIPT" > /dev/null
38 if [ $? -eq 0 ]; then
39 iptables -D FORWARD -j RRDIPT
40 fi
41 iptables -I FORWARD -j RRDIPT
42 fi
43
44 #For each host in the ARP table
45 grep ${LAN_TYPE} /proc/net/arp | while read IP TYPE FLAGS MAC MASK IFACE
46 do
47 #Add iptable rules (if non existing).
48 iptables -nL RRDIPT | grep "${IP}[[:space:]]" > /dev/null
49 if [ $? -ne 0 ]; then
50 iptables -I RRDIPT -d ${IP} -j RETURN
51 iptables -I RRDIPT -s ${IP} -j RETURN
52 fi
53 done
54
55 grep ${LAN_TYPE} /proc/net/arp | awk 'BEGIN { printf "{arp::"} { printf "'\''%s'\'','\''%s'\'',",$1,$4; } END { print "'\''-'\''}"}' >> /tmp/traffic.dat
56 #awk 'BEGIN { printf "{hosts::"} { printf "'\''%s'\'','\''%s'\'',",$1,$2; } END { print "'\''<% show_wanipinfo(); %>'\''}"}' /tmp/hosts >> /tmp/traffic.dat
57 if [ $CONNTRACK -eq 19 ]; then
58 awk 'BEGIN { printf "{ip_conntrack::"} { gsub(/(src|dst|sport|dport|mark)=/, ""); printf "'\''%s'\'','\''%s'\'','\''%s'\'','\''%s'\'','\''%s'\'',%s,",$1,$1 == "tcp" ? $5 : $4,$1 == "tcp" ? $7 : $6,$1 == "tcp" ? $6 : $5,$1 == "tcp" ? $8 : $7,$(NF-1); } END { print "'\''-'\''}"}' /proc/net/ip_conntrack >> /tmp/traffic.dat
59 else
60 awk 'BEGIN { printf "{ip_conntrack::"} { gsub(/(src|dst|sport|dport|mark)=/, ""); printf "'\''%s'\'','\''%s'\'','\''%s'\'','\''%s'\'','\''%s'\'',%s,",$1,$1 == "tcp" ? $5 : $4,$1 == "tcp" ? $7 : $6,$1 == "tcp" ? $6 : $5,$1 == "tcp" ? $8 : $7,$(NF-2); } END { print "'\''-'\''}"}' /proc/net/ip_conntrack >> /tmp/traffic.dat
61 fi
62 iptables -L RRDIPT -vnx -t filter | grep ${LAN_TYPE} | awk 'BEGIN { printf "{bw_table::" } { if (NR % 2 == 1) printf "'\''%s'\'','\''%s'\'',",$8,$2; else printf "'\''%s'\'',",$2;}' >> /tmp/traffic.dat
63 uptime | awk '{ printf "'\''-'\'','\''%s'\''}\n{uptime::%s}\n", $1, $0 } END { print "{ipinfo::<% show_wanipinfo(); %>}" }' >> /tmp/traffic.dat
64 # enable below to log every update to syslog (going to use a LOT of disk space on your syslog server
65 #cat /tmp/traffic.dat | logger
66 mv -f /tmp/traffic.dat /tmp/www/traffic.asp
67 sleep $REFRESH_RATE
68done