Back-off exponentially on scan failures
[khome.git] / home / bin / arp-recon
index bee996d..6444a38 100755 (executable)
@@ -44,14 +44,22 @@ debug() {
 }
 
 log() {
-    local -r interval="$1"
+    local -r interval_init="$1"
     local -r log_file="$2"
+    local    interval_curr="$interval_init"
 
     while :; do
         debug '(>) scan'
-        sudo arp-scan --localnet;
-        debug '(.) scan'
-        sleep "$interval";
+        if sudo arp-scan --localnet; then
+            debug '(.) scan ok'
+            interval_curr="$interval_init"
+        else
+            error '(.) scan failure'
+            interval_curr=$(( interval_curr * 2 ))
+        fi
+        debug '(>) sleep for %d seconds' "$interval_curr"
+        sleep "$interval_curr";
+        debug '(.) sleep'
     done \
     | stdbuf -o L awk '
         /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {
@@ -67,8 +75,8 @@ status() {
     local -r log_file="$1"
 
     (
-        echo 'mac ip last first freq dist'
-        echo '--- -- ---- ----- ---- ----'
+        echo 'mac ip staleness_cur staleness_avg age freq dist'
+        echo '--- -- ------------- ------------- --- ---- ----'
         sort -n -k 1 "$log_file" \
         | awk -v now="$(date '+%s')" \
             '
@@ -77,6 +85,7 @@ status() {
                     mac = $2
                     ip = $3
 
+                    interval[mac, ip, intervals[mac, ip]++] = ts - seen_last[mac, ip]
                     freq[mac, ip]++
                     if (!seen_last[mac, ip]  || ts > seen_last[mac, ip] ) seen_last[mac, ip]  = ts
                     if (!seen_first[mac, ip] || ts < seen_first[mac, ip]) seen_first[mac, ip] = ts
@@ -87,14 +96,19 @@ status() {
                         split(key, macip, SUBSEP)
                         mac = macip[1]
                         ip  = macip[2]
-                        last = now - seen_last[mac, ip]
-                        first = now - seen_first[mac, ip]
+                        staleness_cur = now - seen_last[mac, ip]
+                        age = now - seen_first[mac, ip]
                         dist = 100 * (freq[mac, ip] / NR)
+                        intervals_sum = 0
+                        for (i=1; i<=intervals[mac, ip]; i++)
+                            intervals_sum += interval[mac, ip, i]
+                        staleness_avg = intervals_sum / intervals[mac, ip]
                         print \
                             mac, \
                             ip, \
-                            sprintf("%d", last), \
-                            sprintf("%d", first), \
+                            sprintf("%d", staleness_cur), \
+                            sprintf("%d", staleness_avg), \
+                            sprintf("%d", age), \
                             freq[mac, ip], \
                             sprintf("%d", dist)
                     }
This page took 0.03428 seconds and 4 git commands to generate.