Hallo zusammen =) Ich mal wieder.
Ich versuche mal so genau wie möglich zu beschreiben was ich machen will um Missverständnisse zu vermeiden oder für alternative Vorschläge
Das ganze ist momentan noch sehr unausgereift und ich versuche mich in die verschiedenen benötigten Befehle einzulesen. Ich möchte jedoch kein komplettes Script von euch sondern eher Tips welche Befehle ich mal nachschlagen sollte (Lieber einfach und etwas längerer code als komplex zu verstehen dafür kurz).
Ich möchte mir mittels Telegram eine Nachricht zukommen lassen sobald sich über openVPN jemand bei meinem Pi anmeldet. Da das logfile jedoch nur mit Rootrechten abgerufen werden kann dachte ich mir dies mittels sudo cat /var/log/openvpn-status.log >> /home/pi/logs/openVPN.txt in eine txt datei zu übergeben und nur diese zu prüfen damit nicht das ganze Script mit Rootrechten laufen muss. Diese txt möchte ich dann mittels Script erstmal auf Grösse beobachten. Wenn niemand verbunden ist ist das File immer gleich gross. Ändert sich also die Grösse muss eine Verbindung hergestellt worden sein. Wenn also die Dateigrösse nicht mehr der Vorgabe entspricht möchte ich die Datei nach CLIENT_LIST durchsuchen. Das CLIENT_LIST in der 3. Zeile möchte ich Ignorieren, ich brauche das aus Zeile 5 bzw ich möchte da den <ClientName> auslesen und diesen dann per Telegram weiterleiten.
Die Probleme die ich in diesem Denkansatz noch hab sind:
- Nach dem vorher beschriebenen Vorgehen würde das Script jedesmal auslösen wenn es die Datei überprüft so lange jemand angemeldet ist. Das soll ja nicht sein. Meine erste Idee war die geänderte Dateigrösse an eine globale Variabel weiterzugeben um diese beim nächsten run gegenzuprüfen und falls A=B dann Script schliessen. Nachdem ich mal etwas gegoogelt hab scheint mir die Idee eher schlecht da ganz klar von globalen Variablen abgeraten wird. Welche alternativen gibt es da? Eine andere Möglichkeit die ich in Batch-Dateien unter Windoof oft nutzte ist das zwischenspeichern der Variabel in einer temporären Datei, ich denke jedoch das geht auch besser?
- Der String CLIENT_LIST kommt offensichtlich mehrere male vor im log sobald jemand verbunden ist. Ist es möglich nur ab einer gewissen Zeile das Dokument zu untersuchen?
- Wenn sich mehrere Nutzer anmelden hab ich natürlich u.a. auch das erste genannte Problem aber das Script soll ja dann auch eine Zeile weiter unten den Clientnamen auslesen. Ich nehme an das könnte man mit einer Counterfunktion machen mit welcher die Prüfzeile angesteuert wird?
- Mit findstr unter Windoof konnte man Leerzeichen als Trennmarker verwenden um den Zeileninhalt als einzelne Variablen auszulesen. So konnte ich z.b. Den <ClientName> auslesen ohne zu wissen wie dieser genau eingetragen ist. Soetwas gibt es sicher auch in python. Welchen Befehl muss ich da nachschlagen?
- Selbige Probleme natürlich beim ausloggen. Dachte da an sowas wie: Wenn dateigrösse kleiner als zuvor setze counter=-1 und Wenn Dateigrösse = Leergrösse setze counter=0 jedoch ohne output. Damit meine ich dass ich keine Telegrammsg für ausloggen brauche sondern nur der Zeilencounter wieder reduziert oder geresetted werden soll damit beim nächsten run die richtige Zeile ausgelesen werden kann.
Den Befehl für die Telegramnachricht habe ich bereits die kann man mal aus dem Thread ausschliessen.
Das entsprechende Logfile befindet sich bei /var/log/openvpn-status.log Wenn niemand angemeldet ist sieht das Folgendermassen aus:
TITLE OpenVPN 2.4.0 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
TIME Fri Dec 22 18:13:01 2017 1513962781
HEADER CLIENT_LIST Common Name Real Address Virtual Address Virtual IPv6 Address Bytes Received Bytes Sent Connected Since Connected Since (time_t) Username Client ID Peer ID
HEADER ROUTING_TABLE Virtual Address Common Name Real Address Last Ref Last Ref (time_t)
GLOBAL_STATS Max bcast/mcast queue length 1
END
Sobald sich jemand connected ändert es sich folgendermassen (Zeile 4 + Zeile 6):
TITLE OpenVPN 2.4.0 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
TIME Fri Dec 22 17:59:59 2017 1513961999
HEADER CLIENT_LIST Common Name Real Address Virtual Address Virtual IPv6 Address Bytes Received Bytes Sent Connected Since Connected Since (time_t) Username Client ID Peer ID
CLIENT_LIST <ClientName> 123.45.67.89:12345 192.168.1.3 12345 12345 Fri Dec 22 17:59:24 2017 987654321 UNDEF 5 0
HEADER ROUTING_TABLE Virtual Address Common Name Real Address Last Ref Last Ref (time_t)
ROUTING_TABLE 192.168.1.3 <ClientName> 123.45.67.89:12345 Fri Dec 22 17:59:29 2017 987654321
GLOBAL_STATS Max bcast/mcast queue length 1
END
Soweit ich gelesen habe kann man bei wenig Text die Datei folgendermassen auslesen:
Hier müsste ich dann ja nur noch die Zeile definieren können dann hätt ich schon mal einen Anfang.
Danke schonmals für die Hilfestellungen
Grüsse Apop.