· 9 years ago · Jan 08, 2017, 04:58 AM
1#!/usr/bin/env bash
2
3# todo: add time sync crontab
4# todo: add unreached handling
5
6date_regex='\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
7ipv4_regex='\(\d+\.\d+\.\d+\.\d+\)'
8
9if [ -n "$1" ]; then
10 gateway="$1"
11else
12 gateway='98.197.156.1'
13fi
14
15create_query="
16CREATE TABLE IF NOT EXISTS gateway_ping(
17 start_time TIMESTAMP,
18 end_time TIMESTAMP,
19 total_time INTEGER,
20 ip TEXT,
21 sent INTEGER,
22 received INTEGER,
23 loss REAL,
24 min REAL,
25 avg REAL,
26 max REAL,
27 mdev REAL
28);
29"
30sudo -u postgres psql -d urwinhome2 -c "$create_query"
31
32while true; do
33 # stty -a | grep intr
34 # intr = ^C; quit = ^\;
35 trap break INT; ping -O -w60 "$gateway" |
36 {
37 # ts -> moreutils
38 trap '' QUIT; ts '%Y-%m-%d %H:%M:%S |' | tee /dev/tty |
39 {
40 while read -r line; do
41 if grep -q 'PING' <<< "$line"; then
42 start=$(grep -oP "$date_regex" <<< "$line")
43 ip=$(grep -oP "$ipv4_regex" <<< "$line" | tr -d '()')
44 elif grep -q 'packets' <<< "$line"; then
45 end=$(grep -oP "$date_regex" <<< "$line")
46 sent=$(grep -oP '\d+ packets transmitted' <<< "$line" | tr -d ' packetstransmitted')
47 received=$(grep -oP '\d+ received' <<< "$line" | tr -d ' received')
48 loss=$(grep -oP '\d+% packet loss' <<< "$line" | tr -d ' %packetloss')
49 total=$(grep -oP 'time \d+ms' <<< "$line" | tr -d ' timems')
50 elif grep -q 'rtt' <<< "$line"; then
51 min=$(cut -d = -f 2 <<< "$line" | cut -d / -f 1 | tr -d ' ')
52 avg=$(cut -d = -f 2 <<< "$line" | cut -d / -f 2)
53 max=$(cut -d = -f 2 <<< "$line" | cut -d / -f 3)
54 mdev=$(cut -d = -f 2 <<< "$line" | cut -d / -f 4 | tr -d ' ms')
55 fi
56 done
57 insert_query="
58 INSERT INTO gateway_ping VALUES(
59 '$start',
60 '$end',
61 $total,
62 '$ip',
63 $sent,
64 $received,
65 $loss,
66 $min,
67 $avg,
68 $max,
69 $mdev
70 );
71 "
72 sudo -u postgres psql -d urwinhome2 -c "$insert_query"
73 }
74 }
75done