----- Ursprüngliche Mail ----
Von: Rico Koerner rico@netbreaker.de An: Linux-User-Group Dresden lug-dd@mailman.schlittermann.de Gesendet: Freitag, den 9. Juli 2010, 18:44:25 Uhr Betreff: awk-Rätsel
Hallo,
ich hab das Problem, daß auf dem IPCop die IPsec-Verbindungen nach Verbindungsproblemen nicht wieder neu aufgebaut werden. "Dead Peer Detection" ist zwar eingeschaltet, funktioniert aber nicht richtig. Für einen Workaround bin ich inzwischen soweit gekommen, daß ich mit
ipsec eroute | grep -v tun | awk '{print $4}' | awk -F / '{print $1}'
die fehlerhafte Verbindung identifiziere und die IP(s) der Gegenstelle(n) (rightsubnet ohne netmask) als Ergebnis erhalte. für die 2 awk-Aufrufe gibt es bestimmt auch hier eine bessere Lösung.
# ipsec eroute 362 192.168.0.0/24:0 -> 192.168.20.0/24:0 => tun0x1006@... 36 192.168.0.0/24:0 -> 10.129.4.128/25:0 => %trap ^^^^^^^^^^^^ Die 1. Verbindung steht, die 2. nicht mehr.
Damit kann ich mir aus der config wiederum die zugehörige Connection-ID holen.
Config-Schema: ConnID,aktiv,ConnName,...,rightsubnet,... 1,off,VPN-A,...,10.129.4.128/255.255.255.128,... 2,on,VPN-A2,...,10.129.4.128/255.255.255.128,... 4,on,VPN-B,...,192.168.20.0/255.255.255.0,...
Ich benötige hier demzufolge die Zeile 2, da Zeile 1 eine alte deaktivierte Config ist. Ein grep auf on kommt nicht in Frage, da es noch mehr on/off-Felder in den Zeilen gibt und u.U. auch in ConnName vorkommen könnte. Ein grep auf die IP möchte ich ebenfalls vermeiden, da es auch hier zu unerwünschten Nebeneffekten kommen kann. awk scheint hier erst recht das Mittel der Wahl zu sein:
for CONN in $FAILCONN; do awk -F , '($2 == "on") {printf "%s %s %s\n", $1, $3, $13}' $CONFIG done
ergibt pro fehlender Verbindung ($13 ist rightsubnet): 2 VPN-A2 10.129.4.128/255.255.255.128 4 VPN-B 192.168.20.0/255.255.255.0
Als Rückgabewert braucht ich lediglich $3 für logger bzw. $1 für den Neustart der Verbindung. $13 wird nur zum Vergleich benötigt.
Wie kann ich das jetzt in dem awk-Aufruf noch mit der IP 10.129.4.128 vergleichen? Ich bräuchte innerhalb der Bedingung so etwas wie: ($2 == "on" && $CONN == ( awk -F / '{print $1}' $13 ) )
Kann mir hier jemand auf die Sprünge helfen?
Also du willst prüfen ob in die Variablen CONN in der Spalte 13 enthalten ist?
$13~"'$CONN'"
kannst jetzt auch noch reguläre ausdrücke bemühen
$13 ~/^'$CONN'/
hoffe habe verstanden was du wolltest
ansonsten frag noch mal nach
andreas
Gruß Rico