Netzwerke, Laufwerke und seriellen Geräte funktionieren relativ einfach in der Containerumgebung. Mit Sound, Bluetooth, Wake on Lan usw. wird es schon schwieriger. Die sind nicht vorgesehen. Docker soll Softwarepakete/Applikationen isolieren und dicht "packen". Das man seine PC Umgebung dort hineinverlegt war so nicht unbedingt gedacht. Und es gibt natürlich "Übergangsbereiche" - Smarthome zum Beispiel. Ich habe ein paar Anforderungen für die ich eine Lösung brauche. Vielleicht ist es ja gar keine Behelfslösung sondern eine clevere Alternative? Folgende Themen habe ich bisher gefunden:
Sound
Ich habe ein paar Varianten gefunden, für mich aber beschlossen den Pulseaudioserver über das Netzwerk zu nutzen. Link.
Vorbereitung: Pulseaudio einrichten, als system-wide Service mit Netzwerkschnittstelle.
Im Docker Container ist nicht viel zu tun:
- Im Image selbst muss natürlich Pulseaudio enthalten sein, das bläht das Image leider erheblich auf (in meinen Versuchen mehr als 300 MB).
- Umgebungsvariable setzen: vor jede Applikation oder gleich beim Bau des Containers.
3 Beispiele: direkter Aufruf, docker run ..., docker-compose.yml
"PULSE_SERVER=hostname play https://cdn.smartersoft-group.com/various/pull-bell-short.mp3"
-e PULSE_SERVER=hostname
environment:
- PULSE_SERVER=hostname
Bei mir hat das ohne weitere Konfiguration sofort funktioniert.
Bluetooth - Anwesenheit feststellen
Bluetooth ist von der Technik her ein Netzwerkdienst, Netzwerkdienste haben eine besondere Behandlung im Docker, ein direktes Durchreichen der Hardware für Netzwerke ist nicht vorgesehen. Obwohl Bluetooth Hardware häufig über serielle Schnittstellen angebunden ist, ist auch vom Linux System die Zugänglichkeit von Bluetooth über ein serielles Interface nicht vorgesehen. Man muss also die Bluetooth Schnittstelle auf dem Host nutzen und die Ergebnisse zum Container weiterreichen, am einfachsten über Netzwerk. Für die Anwesenheitserkennung gibt es ein Perlscript welches auch eine Schnittstelle zum PRESENCE Modul hat. Ich zeige kurz wie man das Script als Systemd Dienst im Host installiert und die Abfrage im Docker einbindet.
Falls noch nicht erfolgt: bluetooth nachinstallieren.
sudo apt update
sudo apt install bluetooth
Das Perlscript presenced laden.
sudo -s <<EOI
mkdir -p /opt/scripts
wget -O /opt/scripts/presenced https://svn.fhem.de/fhem/trunk/fhem/contrib/PRESENCE/presenced
EOI
Einen Service einrichten
service=presenced
cat <<EOISERV |sudo SYSTEMD_EDITOR=tee systemctl edit --full --force $service
[Unit]
Description=$service Daemon
Wants=network.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/scripts
ExecStart=/usr/bin/perl presenced -d
Restart=always
[Install]
WantedBy=multi-user.target
EOISERV
Den Service aktivieren und starten
sudo systemctl enable --now $service
FHEM Device anlegen
define Name PRESENCE lan-bluetooth 11:22:33:44:55:66 192.168.x.x:5111
Mal sehen ob ich noch mehr finde.
Wake on Lan - oder Limitierungen im Netzwerk umgehen
UDP Broadcasts wie sie für WOL verwendet werden, funktionieren aus Docker heraus ins allgemeine Netzwerk nicht. Es gibt auch andere Applikationen, wo man auf einen anderen Rechner zugreifen muss. Der ssh Zugriff ist hierbei ein weitverbreitetes Mittel der Wahl. Damit man diesen Zugriff transparent im Hintergrund und trotzdem sicher machen kann, muss man den Prozess (User) mit einem Austausch der öffentlichen Schlüssel und Host Informationen einmalig einrichten. Ich habe die Einrichtung "ssh mit publickey" hier schon ausführlich beschrieben. Natürlich kann man aus dem Container auch auf den Dockerhost per ssh zugreifen. Viele Module in FHEM haben die Möglichkeit schon eingebaut.
Vorbereitung: ssh public key Zugriff auf den gewünschten Host (Dockerhost) einrichten. Auf dem Host selbst muss nichts extra installiert werden.
Der ssh Zugriff an sich ist vielseitig nutzbar. Viele FHEM Module haben die Nutzung direkt eingebaut. Ich zeige 3 Varianten für WOL, wobei Variante 2 nicht mit ssh arbeitet. Die Variante 1 kann völlig unabhängig auch für andere Aufgaben dienen. Ich habe deswegen auch den Einzeiler in einen Here String verpackt, man kann auf die Art in den meisten Fällen 1:1 den Code aus Shell Scripts übernehmen!
Variante 1 - sub in der myUtils
Für FHEM habe ich eine sub in der 99_myUtils verankert, die am Ende ein bash Script per ssh ausführt. Man hat hierbei die Schwierigkeit, in den einzelnen Schritten richtig mit Variablen und deren Auflösung umzugehen. Deswegen habe ich aus dem Shell Code eine function mit Aufrufparametern gemacht und diese in einen single quoted Here String gepackt. Am Ende habe ich diesen String um den Aufruf der function mit Parametern erweitert, da diese Erweiterung double quoted ist, werden die übergebenen Perl Variablen aufgelöst. Prinzipiell lässt sich über den "Here String" shell code 1:1 verwenden.
sub wol {
my $usage = 'use: wol \'user@host\',\'aa:bb:cc:11:22:33\'';
my $ziel = shift // return $usage;
my $mac = shift // return $usage;
my $broadcast = shift || '255.255.255.255';
my $port = shift || '9';
my $script = <<'EOF';
wake_on () { echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $1 | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b $2 $3 ; }
EOF
$script .= "wake_on $mac $broadcast $port";
system('ssh',$ziel,$script);
}
Beispielhaft die Definition in FHEM mit der Perl Sub
define myPC WOL 11:22:33:44:AB:CD 192.168.22.33 CMD
attr myPC wolCmd {wol ('user@host', '$MAC', '$BC')}
Variante 2 - Weckruf über die Fritzbox und tr064
Hat man eine Fritzbox kann man diese mit dem Fritzbox Modul für WOL verwenden.
attr myPC wolCmd get Fritzbox tr064Command Hosts:1 hosts X_AVM-DE_WakeOnLANByMACAddress NewMACAddress $MAC
ToDo: Voluminöse Rückmeldung des tr064 Kommandos unterdrücken.
Variante 3 - Script auf einem Host (Dockerhost) ausführen
Man kann ein Bash Script auch auf dem Dockerhost ablegen und dort per ssh ausführen.
Im Terminal auf dem Dockerhost das Script erzeugen, oder ein anderes Script herunterladen und dort ablegen (siehe Beitrag).
cat <<'EOF' > wake_on
echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $1 | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b $2 $3
EOF
Das Modul hat die ssh Möglichkeit eingebaut (separat für aufwachen und shutdown).
attr myPC sshHost user@192.168.2.22
attr myPC wolCmd "bash wake_on $MAC $BC 9"
Zu beachten ist, dass hier wolCmd den Regeln von Fhem Kommandos entspricht.
ToDo
noch zu tun?
Code Block
Das ist mein Platzhalter für Erweiterungen.
Keine Kommentare:
Kommentar veröffentlichen