An/Abwesenheit mit Kombination fhem auf CentOS und FritzBox7270

Begonnen von wkarl, 01 Januar 2013, 16:07:03

Vorheriges Thema - Nächstes Thema

wkarl

Hallo,
ich denke das was ich vorhabe passt hier am besten rein.

Auch ist dieses Projekt noch nicht abgeschlossen möchte aber die erste Phase schon dokumentieren und teilen.
Ziel ist es, von fhem auf CentOS die Anwesenheit meines iPhones über ssh & ctlmgl_ctl auf der FB zu ermitteln.

Die groben Phasen sind:

    ssh Server auf FritzBox 7270 bereitstellen
    ssh Kommunikation CentOS und FB via rsa-keys (ohne Passwort)
    Auswertung aus fhem heraus


    Aufsetzen ssh-Server auf FritzBox 7270 mit dropbear
    dropbear hier downloaden
http://www.antary.de/wp-content/uploads/2012/12/dropbear.zip
das Packet auspacken
bei mir wird dropbear von einem USB-Stick gestartet. Also alles dort in das Verzeichnis dropbear kopieren
mit telnet an der Fritzbox anmelden
in das Verzeichnis /var/media/ftp/<USB-Gerätename>/dropbear wechseln
mit ./dropbearkey -t rsa -f dropbear_host_rsa.key den rsa-host-Schlüssel generieren[/list]
ssh Kommunikation CentOS und FB via rsa-keys (ohne Passwort)
    nun auf dem CentOS (ist der ssh client) mit
ssh-keygen -t rsa die client-Schlüssel generieren (zu finden in ~/.ssh Verzeichnis)
die .pub Datei nun auf den USB-Stick an der FritzBox in das Verzeichnis dropbear kopieren
auf der FritzBox mit mkdir /var/tmp/.ssh das benötigte .ssh-Verzeichnis anlegen
auf der FritzBox im /var/media/ftp/<USB-Gerätename>/dropbear Verzeichnis mit cat *.pub >> /var/tmp/.ssh/authorized_keys den ssh-Client key bekannt machen
in der /etc/passwd des home-Verzeichnis von root auf /var/tmp setzen (hat mich Stunden gekostet dies herauszufinden)
nun dropbear mit /var/media/ftp/<USB-Gerätename>/dropbear/dropbear -s -r /var/media/ftp/<USB-Gerätename>/dropbear/dropbear_rsa_host.key starten. Die Option -s unterbindet, dass ein Passwort abgefragt wird.
auf dem CentOS ssh Client kann man sich nun mit ssh -2 -i ~/.ssh/id_rsa root@<FB-IP oder FB-DNS-Name> ohne Passwort verbinden
mit ssh -2 -i ~/.ssh/id_rsa root@<FB-IP oder FB-DNS-Name> '/usr/bin/ctlmgr_ctl r landevice settings/landevice2/active' kann nun z.B. der Status eines LAN-Gerätes abgefragt werden[/list]
Auswertung von fhem heraus (TBD)[/list]

Für Fragen bzw Ergänzungsvorschlägen stehe ich gerne zur Verfügung.

ciao
walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Henry

Hallo und Danke für die Anleitung

Ich habe auf meiner Fritzbox 7270 nach der Anleitung ssh hin bekommen aber nur die Anmeldung per Passwort. :-(
Nach deiner Anleitung die ich genau befolgt habe bekomme ich aber ssh garnicht gestartet.
Es kommen auch keine Fehlermeldung im Telnet Fenster bei der eingabe aber wnen ich dann eine ssh Verbingung zur Box herstellen möchte bekomme ich das hier
root@Linuxserver ~ > ssh -2 -i ~/.ssh/id_rsa root@192.168.2.1 (root@192.168.2.1)
ssh: connect to host 192.168.2.1 port 22: Connection refused

Ich suche schon so lange eine Möglichkeit mein Fhem auf meinen Linuxserver mit meiner Fritbox zusammen zu bringen aber bis jetzt habe ich es noch nciht geschafft.
Sollte noch jemand einen tipp ich würde mich freuen..... und so lange versuce und teste ich weiter

viel Grüße Henry
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE

Henry

Zitat von: Henry schrieb am So, 06 Januar 2013 16:34Hallo und Danke für die Anleitung

Ich habe auf meiner Fritzbox 7270 nach der Anleitung ssh hin bekommen aber nur die Anmeldung per Passwort. :-(
Nach deiner Anleitung die ich genau befolgt habe bekomme ich aber ssh garnicht gestartet.
Es kommen auch keine Fehlermeldung im Telnet Fenster bei der eingabe aber wnen ich dann eine ssh Verbingung zur Box herstellen möchte bekomme ich das hier
root@Linuxserver ~ > ssh -2 -i ~/.ssh/id_rsa root@192.168.2.1 (root@192.168.2.1)
ssh: connect to host 192.168.2.1 port 22: Connection refused

Ich suche schon so lange eine Möglichkeit mein Fhem auf meinen Linuxserver mit meiner Fritbox zusammen zu bringen aber bis jetzt habe ich es noch nciht geschafft.
Sollte noch jemand einen tipp ich würde mich freuen..... und so lange versuce und teste ich weiter

viel Grüße Henry
Da "Edit" noch nicht geht mache ich es mal so
Habe es jettz geschafft, zwar über eine andere Anleitung, SSH auf meiner FB 7270 mit abfrage ohne Passwort vom Linuxserver auf dem Fhem läuft inzubekommen.
Die Beispiel Abfrage aus dem obrigen Beitrag könnte ich machen und bekam die antwort.
Ich hoffe sehr das es jetzt hier weiter geht und noch mehr interesse haben die Fhem auf einen Linuxrechner haben und ihre FB mit einbinden wollen.
Bin total gespannt.
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE

Sturi2011

Guten Abend...

dann will ich auch mal meinen Teil beitragen da mich das Thema auch Interessiert:

startdbear
#!/bin/sh

root=`df | sed -n -e '/ftp\//s/.*ftp\///p'`
home=/var/InternerSpeicher/$root/dropbear/
mkdir /var/tmp/.ssh
cd $home
cat *.pub >> /var/tmp/.ssh/authorized_keys
echo "root:x:0:0:root:/var/tmp:/bin/sh" > /etc/passwd
echo "boxusr80:any:1080:0:box user:/home-not-used:/bin/sh" >> /etc/passwd
echo "boxusr80int:any:2080:0:box user:/home-not-used:/bin/sh" >> /etc/passwd
./dropbear -s -r $home/dropbear_host_rsa.key


mit dem Folgenden Befehl kann ein Autostart des Dropbear Servers veranlasst werden.

echo "<path-of-the-stick>/dropbear/startdbear" > /var/flash/debug.cfg

Vorher sollte man auf jeden Fall ein cat /var/Flash/debug.cfg machen.

Das kleine Script richtet die Umgebung auf der Fritzbox entsprechend ein und startet den dropbear Server.
Nun muss nun noch eine neue 72_FB_CALLMONITOR_REMOTE.pm her, die das ganze sinnvoll nutzt.

Gruß Andreas

Sturi2011

Hi,

72_FB_CALLMONITOR_REMOTE.pm war natürlich quatsch aber da Edit nicht geht - FB Wlan/LAN Device Status war gemeint. gepatchte Version für 99_MyUtils folgt.

Gruß Andreas

Henry

Guten Abend
Schön das sind es ja schon drei bei dem ssh läuft
von meinen linuxserver wo Fhem läuft kann ich per
ssh root@fritz.box (root@fritz.box) ctlmgr_ctl r wlan settings/ap_enabled   <-- den Status auslesen bekomme 0 oder 1 ausgeben
ssh root@fritz.box (root@fritz.box) ctlmgr_ctl w wlan settings/ap_enabled 1 <-- WLan an und mit 0 WLan aus schalten
nur wie verpackt man das jetzt in perl damit fhem damit arbeiten kann?

Frage;
ist es angebracht über die Verarbeitung der Befehle in Fhem hier weiter  oder doch besser unter Anfängerfragen das ja das mehr Perl Profis sind  zu stellen?
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE

wkarl

Hallo Henry,

gut zu hören. Ich hätte mir Dir auch gerne das debugging meiner Beschreibung gemacht.

Mittlerweilen habe ich das ganze automatisiert. Hier nun die Vorgehensweise:

- unter /var/media/<USB device>files liegt meine modifizierte passwd:
Zitatroot:x:0:0:root:/var/tmp:/bin/sh
boxusr80:$1$wtaquih$5OXRZesTNZSuSqP.1kKJ//:1080:0:box user:/home-not-used:/bin/sh
boxusr80int:any:2080:0:box user:/home-not-used:/bin/sh

- auch unter files habe ich mir eine passende debug.cfg erstellt:
Zitat# Warten bis der Stick gemounted ist
sleep 20
# Name des USB-Sticks herausfinden und in Variable speichern
USBSTICK=$(mount | grep /var/media/ftp/ | sed -e "s|^.*ftp/||g" -e "s/ .*$//")

# Warten bis die FritzBox den Stick erreichen kann
while !(test -d /var/media/ftp/$USBSTICK/dropbear); do
        sleep 5
done

if !(test -d /var/tmp/.ssh); then
        mkdir /var/tmp/.ssh
        cp /var/media/ftp/$USBSTICK/dropbear/authorized_keys /var/tmp/.ssh
fi
chmod -R 600 /var/tmp/.ssh

# ist dropbear erreichbar
while !(test -f /var/media/ftp/$USBSTICK/dropbear/dropbear); do
        sleep 5
done

# ist /etc/passwd existent
while !(test -f /etc/passwd); do
        sleep 5
done
/bin/cat /var/media/ftp/$USBSTICK/files/passwd > /etc/passwd

# Dropbear starten
/var/media/ftp/$USBSTICK/dropbear/dropbear -m -s -r /var/media/ftp/$USBSTICK/dropbear/rsa_host_key -d /var/media/ftp/$USBSTICK/dropbear/dss_host_key

- bei meiner FB7270 funktioniert ein cp debug.cfg /var/flash/debug.cfg nicht immer, cat debug.cfg > /var/flash/debug.cfg ist die bessere Variante.

Damit wird bei jedem reboot ssh-dropbear automatisch gestartet.

Am nächsten Schritte arbeite ich gerade. Kommt demnächst.

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

wkarl

Hallo,

nächster Schritt - über ssh ein Kommando auf der FritzBox ausführen. Warum hat mir keiner gesagt, dass es ein SSH Perl Modul gibt?!?!?

Dafür ist das Net::SSH::Perl Modul per CPAN zu installieren.

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Henry

Zitat von: wkarl schrieb am Mi, 09 Januar 2013 20:51Hallo,

nächster Schritt - über ssh ein Kommando auf der FritzBox ausführen. Warum hat mir keiner gesagt, dass es ein SSH Perl Modul gibt?!?!?

Dafür ist das Net::SSH::Perl Modul per CPAN zu installieren.

ciao walter
Hallo  wkarl
Schön das du weiter kommst aber wäre es möglich das du uns über das Forum mit dran teilhaben lassen könntest?
Nach dem ich meine FB 7270 SSH tauglich gemacht habe  bin gerade am testen was ich so alles über die Shell der FB abfragen kann. Da ich in Perl nicht so (oder gar nicht) bewandert bin wäre es schön wenn man mit lernen könnte oder mit helfen könnte das ganze über linux voran zu treiben.
Dafür ist das Forum doch da und in der Linux Sparte ist es ja ehr ruhig :-)
Ich würde jedenfalls gerne mit helfen/machen     Henry
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE

wkarl

Hallo Henry,

sorry, da wollte ich noch mehr dazu schreiben. Hol ich hiermit nach. Die Lösung sieh nun wie folgt aus.

Da das iterative Abfragen über ssh zu zeitintensiv ist, habe ich mich entschossen auf der FB Perl zu installieren. Hierzu habe ich das Perl aus den FB-fhem Packet (http://fhem.de/fhem-5.3-fb7270.zip) genommen. Auspacken und das binary perl und das Verzeichnis lib auf den USB-Stick unter /var/media/ftp/<USB-Stick-Name/perl kopiert. Um die richtige Umgebung für Perl zu setzen, dient folgende Datei .profile:
#!/bin/sh

USBSTICK=$(mount | grep /var/media/ftp/ | sed -e "s|^.*ftp/||g" -e "s/ .*$
export PERL5LIB=/var/media/ftp/$USBSTICK/perl/lib/perl:/var/media/ftp/$USB
export PATH=/sbin:/usr/sbin:$PATH

Diese befindet sich im Verzeichnis /var/media/ftp/<USB-Stick-Name/files. Damit die Umgebung automatisch eingerichtet wird, habe ich meine debug.cfg wie folgt erweitert:
# Warten bis der Stick gemounted ist                                    
sleep 20                                                                
# Name des USB-Sticks herausfinden und in Variable speichern            
USBSTICK=$(mount | grep /var/media/ftp/ | sed -e "s|^.*ftp/||g" -e "s/ .
#                                                                      
export PERL5LIB=/var/media/ftp/$USBSTICK/perl/lib/perl:/var/media/ftp/$U
#                                                                      
# Warten bis die FritzBox den Stick erreichen kann                      
while !(test -d /var/media/ftp/$USBSTICK/dropbear); do                  
        sleep 5                                                        
done                                                                    
                                                                       
# ist /etc/passwd existent                                              
while !(test -f /etc/passwd); do                                        
        sleep 5                                                        
done                                                                    
/bin/cat /var/media/ftp/$USBSTICK/files/passwd > /etc/passwd            
                                                                       
if !(test -d /var/tmp/.ssh); then                                      
        mkdir /var/tmp/.ssh                                            
        cp /var/media/ftp/$USBSTICK/files/authorized_keys /var/tmp/.ssh
fi                                                                      
chmod -R 600 /var/tmp/.ssh                                              
                                                                       
#  shell Umgebung setzen                                                                    
cp /var/media/ftp/$USBSTICK/files/.profile /var/tmp                    
                                                                       
# ist dropbear erreichbar                                              
while !(test -f /var/media/ftp/$USBSTICK/dropbear/dropbear); do        
        sleep 5                                                        
done                                                                    
                                                                       
# Dropbear starten                                                      
/var/media/ftp/$USBSTICK/dropbear/dropbear -m -s -r /var/media/ftp/$USBS
~

Somit kann ich nun Perl-Programme auf der FB ausführen.
Das Perl-Programm LanDeviceActive.pl sieht wie folgt aus und liegt unter /var/media/ftp/<USB-Stick-Name/MyUtils:
#!/var/media/ftp/Storage-01/perl/perl -w

use warnings;
use strict;

my $ldnr = -1;
my $ldname = "";
my $ldsearch = $ARGV[0];
my $ldstatus = 0;

do {
        $ldnr++;
        $ldname = `/usr/bin/ctlmgr_ctl r landevice settings/landevice\"$ldnr\"/name`;
        chomp($ldname);
} until ($ldname eq "er" || $ldname eq "-1" || $ldname eq $ldsearch);

if ($ldname eq $ldsearch) {
        $ldstatus = int(`/usr/bin/ctlmgr_ctl r landevice settings/landevice\"$ldnr\"/active`);
}
elsif ($ldname eq "er") {                
        $ldstatus = 2;
}                                  
else {                            
        $ldstatus = 3;
}
exit $ldstatus;

Dem Program wird der FB LanDevice-Name übergeben und liefert dessen Status (0=nicht aktiv; 1=aktiv; 2=nicht gefunden; 3=unbekannter Fehler).

Auf meinen CentOS Server habe ich unter /opt/fhem/FHEM die Datei MyUtils.pm. Dort definiere ich meine eignen fhem Erweiterungen. Folgende Unterroutine dient zum Aufruf von Programmen/Befehlen auf der FB:
######## PersonPresent ##################################################
# What  : Checks active status of LAN device on FritzBox
# Call  : { PersonPresent('device name') }
# Source:
# Prereq: - script LanDeviceActive.sh on FritzBox
#
sub
PersonPresent($) {
my $host = "<ip der fritzbox>";
my $user = "root";
my $landevice = $_[0];
my $ssh2fritzbox = Net::SSH::Perl->new($host, debug=>0, identity_files=>["/root/.ssh/id_rsa"]);
$ssh2fritzbox->login($user);
my($stdout, $stderr, $exit) = $ssh2fritzbox->cmd(". ~/.profile; /var/media/ftp/Storage-01/MyUtils/LanDeviceActive.pl $landevice");
# Log 3, ">>> $exit";
return $exit;
}

Leider wird beim remote-Aufruf nicht die Benutzerumgebung geladen, so dass sie vor dem eigendlichen Kommado ge-sourced werden muss.

Die fhem Definition ist wie folgt:
################################################
#####
################################################
define WalterZuHause dummy
attr WalterZuHause room Server
################################################
define CheckWalterZuHause at +*00:15 { \
    use MyUtils;; \
    if (PersonPresent('iPhone-von-Walter') == 1) { \
        fhem("set WalterZuHause 1") \
    } \
    else { \
        fhem("set WalterZuHause 0") \
    } \
}
attr CheckWalterZuHause room Server


So das wars. Ich hoffe es hilft dem einen oder anderen. Da meine letzten professioniellen Programmierung ca 20 Jahre her sind, mag der vorliegende code etwas ungelenkt wirken. Für Verbesserungen bin jederzeit zu haben. Für Fragen natürlich auch ;-)

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Henry

Zitat von: wkarl schrieb am Do, 10 Januar 2013 08:59So das wars. Ich hoffe es hilft dem einen oder anderen. Da meine letzten professioniellen Programmierung ca 20 Jahre her sind, mag der vorliegende code etwas ungelenkt wirken. Für Verbesserungen bin jederzeit zu haben. Für Fragen natürlich auch ;-)

ciao walter
Hallo wkarl
Sofort habe ich mich ran gemacht das von dir vorgeschlagene um zusetzen. Die Vorbereitungen gingen auch ohne Fehlermeldungen über die Bühne  aber es funktioniert  nicht. Irrgend wo habe ich einen Fehler drinn und es Klasse wenn ihr mir bei der Fehlersuche helfen könntet.
Ich bekomme keinen Status angezeigt. Im Telnet erscheint schön alle 15min
Global global DELETED CheckWalterZuHause
Global global DEFINED CheckWalterZuHause

Aber in der .Log finde ich folgene Fehlermeldung
2013.01.10 20:15:59 3: MyUtils.pm did not return a true value at (eval 41) line 1.
BEGIN failed--compilation aborted at (eval 41) line 1.

Weiß jemand was da bemeckert wird???
Und noch zwei Fragen wie kann ich denn Prüfen
1. läuft Perl auf meiner FB7270 (also habe ich alles richtig gemacht auch wnen keien Fehlermeldung kam)?
2. wie kann ich Prüfen ob die zusammenarbeit Linux/FhemServer <--> FB7270 richtig klappt (mit der Perl Sache)?
SSH Verbindung und Komuniktion zwischen LinuxServer und FB7270 funktioniert und ist getestet.

Liebe Grüße und Dank im vorraus Henry
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE

wkarl

Hallo Henry,

dann lass uns das ganze mal Schritt für Schritt untersuchen.


    melde Dich von Deiner Linux Box an der FB mit ssh an (welche Linux Variante setzt Du denn ein?)
    rufe perl mit der Option -v auf (bei mir:
/var/media/ftp/Storage-01/perl/perl -v)# ./perl/perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for mipsel-linux

Copyright 1987-2011, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

jetzt der Test von LanDeviceActive.pl # ./MyUtils/LanDeviceActive.pl iPhone-von-Walter
# echo $?
1
# ./MyUtils/LanDeviceActive.pl NichtExistent
# echo $?
2
#
die Umgebungsvariable $? enthält den Exit code.
nun weiter auf der Linux Box [root@nashome ~]# /usr/bin/ssh -2 -t -i ~/.ssh/id_rsa -l root <ip von FB> '. ~/.profile;/var/media/ftp/Storage-01/MyUtils/LanDeviceActive.pl iPhone-von-Walter'
Connection to 192.168.178.1 closed.
[root@nashome ~]# echo $?
1
[root@nashome ~]# /usr/bin/ssh -2 -t -i ~/.ssh/id_rsa -l root <ip von FB> '. ~/.profile;/var/media/ftp/Storage-01/MyUtils/LanDeviceActive.pl NichtExistent'
Connection to 192.168.178.1 closed.
[root@nashome ~]# echo $?
2
[/list]
Wenn bisher kein Fehler auftritt, dann ist auf Systemebene alles in Ordnung.

Lass mich das Ergebnis wissen.

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Henry

Danke für deine Hilfe
***Kurzinfo***
Also Perl auf der FB läuft weil erster Test ok :-)

die LanDeciceActive.pl habe ich geändert und der aufruft:
ssh -2 -t -i ~/.ssh/id_rsa -l root 192.168.2.1 '. ~/.profile;/var/media/ftp/SanDisk-Cruzer-01/MyUtils/LanDeviceActive.pl LinuxServer'
Meldung:
/var/media/ftp/SanDisk-Cruzer-01/MyUtils/LanDeviceActive.pl: line 3: 1: not found
/var/media/ftp/SanDisk-Cruzer-01/MyUtils/LanDeviceActive.pl: line 6: 2: not found
Connection to 192.168.2.1 closed.

keine Ahnung aber irrgend etwas ist noch falsch
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE

wkarl

FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Henry

und hier kommt meine LanDeviceActive.pl

#!/var/media/ftp/SanDisk-Cruzer01/perl/perl -w

use warnings;
use strict;

my $ldnr = -1;
my $ldname = "";
my $ldsearch = $ARGV[0];
my $ldstatus = 0;

do {
        $ldnr++;
        $ldname = `/usr/bin/ctlmgr_ctl r landevice settings/landevice\"$ldnr\"/name`;
        chomp($ldname);
} until ($ldname eq "er" || $ldname eq "-1" || $ldname eq $ldsearch);

if ($ldname eq $ldsearch) {
        $ldstatus = int(`/usr/bin/ctlmgr_ctl r landevice settings/landevice\"$ldnr\"/active`);
}
elsif ($ldname eq "er") {                
        $ldstatus = 2;
}                                  
else {                            
        $ldstatus = 3;
}
exit $ldstatus;
DebianServer als FHEM-Plattform
FS20 über CUL868
Intertechno über Signalduino
Philips HUE