Userspace programm ausführen wenn eingelogged und online

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Userspace programm ausführen wenn eingelogged und online

Beitrag von chr.gogolin » 04.09.2014 17:42:47

Ich habe ein Notebook das seine Internetverbindung je nach Umgebung per ifplugd/guessnet/wpa_supplicant über Lan oder Wlan aufbaut.

Was ist die sauberste Methode jedes mal nach dem Zustandekommen der Internetverbinung für alle angemeldenten Benutzer alle Scripts in einem vom jeweiligen Benutzer zu bestückenden Ordner (z.B. /home/[user]/opt/etc/network/if-up.d/) auszuführen?

Ein Shell-Script schreiben und unter /etc/network/if-up.d/ plazieren?

Das schreiben des Scripts bekomme ich hin, aber ist das der "richtige" Ansatz oder gibt es eine "elegantere" Lösung?
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von Livingston » 05.09.2014 02:55:30

Du könntest als non-root User inotifywait aus dem Paket Debianinotify-tools auf /sys/class/net/<iface>/carrier loslassen. Hilfreich könnte generell https://www.kernel.org/doc/Documentatio ... -class-net bzw. falls installiert die ABI-Dokumentation des Kernels sein.

EDIT: Ergänzung
Die sys-Datei /sys/class/net/<iface>/carrier sagt dir nur, ob die Karte einen Link hat oder nicht. Das heißt noch nicht, dass sie eine IP-Adresse bezogen hat. Die solltest Du natürlich in dem Script auch noch abfragen, z.B. mit

Code: Alles auswählen

#!/bin/sh
LANG=C /sbin/ifconfig|/bin/sed -n '/^eth0/,/^$/s/^[ \t]*inet addr:\([0-9\.]*\)[ \t].*/\1/p'
(Das geht bestimmt auch eleganter. LinuxCowboy, bitte übernehmen!) :wink:

chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von chr.gogolin » 09.09.2014 13:55:14

Ah, inotfiywait klingt nach einer super Lösung!

Leider schint es nicht zu funktionieren. Bei folgendem test erhalte ich lediglich

Code: Alles auswählen

$ while true; do inotifywait /sys/class/net/wlan0/carrier && cat /sys/class/net/wlan0/carrier; done
Setting up watches.
Watches established.
und dann nichts weiter. Auch wenn ich wlan0 (dis)connecte.

Stehe ich nur auf dem Schlauch?
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett

chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von chr.gogolin » 09.09.2014 15:58:05

Mh. Sieht so aus also ob inotifywait im sysfs nicht funktioniert:

http://osdir.com/ml/linux.c-programming ... 00015.html

Schade. Irgendwelche andere Ideen?
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von Livingston » 12.09.2014 01:14:43

Noch ein (ungetesteter) Einfall: Vielleicht klappt das Spiel ja mit /etc/network/interfaces/run/ifstate. Das Teilchen liegt nicht in einem virtuellen Dateisystem und ist für genau Deine Aufgabenstellung (wie) geschaffen.

chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von chr.gogolin » 12.09.2014 11:46:51

Gute Idee!

Du meinst wahrscheinlich etc/network/run/ifstate. Das funktioniert fast.

Leider setzt irgendwas die permissions von /etc/network/run/ifstate so dass ich es als user nur lesen kann wenn neben lo mindestens ein echtes interface up ist.

Code: Alles auswählen

$ ifdown wlan0 && sleep 5 && ls -l /etc/network/run/ifstate 
-rw------- 1 root root 6 Sep 12 11:39 /etc/network/run/ifstate
$ ifup wlan0 && sleep 5 && ls -l /etc/network/run/ifstate 
-rw-r--r-- 1 root root 20 Sep 12 11:40 /etc/network/run/ifstate
Ich verstehe überhaupt nicht wozu das gut sein soll, aber es verhindert dass ich inotifywait wie folgt

Code: Alles auswählen

while true; do inotifywait -e modify /etc/network/run/ifstate ; cat /etc/network/run/ifstate ; done
einsetzten kann, da ich während alle interfaces down sind dauernd die Fehlermeldung

Code: Alles auswählen

...
Couldn't watch /etc/network/run/ifstate: Permission denied
cat: /etc/network/run/ifstate: Permission denied
...
bekomme.

Arg...
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von pferdefreund » 12.09.2014 12:05:14

Die kann man doch mit 2>/dev/null abschalten und den $? auswerten.

chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von chr.gogolin » 12.09.2014 12:17:13

Das Problem ist eher dass inotifywait nicht wartet weil es keine watch establishen kann.
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Userspace programm ausführen wenn eingelogged und online

Beitrag von Livingston » 12.09.2014 19:16:27

Ich denke, Du solltest das Problem mit einem if-up.d/-Script erschlagen. Um root- und user-Welt getrennt zu halten, könnte das Script zum Beispiel im Verzeichnis /run eine allgemein-lesbare und damit inotifibierbare Datei anlegen, die von einem Script in if-down.d/ wieder entsorgt oder deren Inhalt verändert wird. Genau für so was ist /run ja schließlich da. Im übrigen ist garantiert, das Scripte, die nicht aus Debian-Paketen stammen, von apt / aptitude nicht angerührt werden. Du behältst also die volle Kontrolle über das Geschehen.

Antworten