chiark / gitweb /
First version of hideous shell script.
[source-route-watch] / source-route-watch.sh
1 #! /bin/bash
2 set -ex
3
4 while true
5 do
6     stdbuf -oL ip monitor route | (
7         while read X
8         do
9             read -t 1 -N 100000 || true # clear stdin
10             for int in $( sed -n '/# local/,$ { /^[^#]/ s/.* // p }' /etc/iproute2/rt_tables )
11             do
12                 tab=$(ip -6 route list table "$int" |
13                              sed 's/\(dev [^ ]*\) .*/\1/')
14                 def=$(ip -6 route list match default |
15                              sed -n '/dev '"$int"'/ { 
16                                      s/\(dev [^ ]*\) .*/\1/
17                                      p
18                                      }')
19                 if [ "x$def" != "x$tab" ]
20                 then
21                     ip -6 route del $tab table "$int" || true
22                     ip -6 route add $def table "$int" || true
23                     ip -6 rule del table "$int" || true
24                     ip -6 rule add from $(
25                         ip -6 addr show "$int" scope global | sed -n '
26                              /inet6/ {
27                                  s/.*inet6 //
28                                  s/ .*//
29                                  p
30                                  }') table "$int"
31                 fi
32             done
33         done
34     )
35 done