(gelöst) DHCP Server auf dem RPI & Presence per SNMP

Begonnen von Dirk070, 24 November 2014, 20:15:03

Vorheriges Thema - Nächstes Thema

Dirk070

Hallo zusammen,

hat schon jemand probiert, den DHCP-Server auf dem RPI zu installieren und dann mit dem Presence-Modul per SNMP zu arbeiten? Für Erfahrungswerte wäre ich sehr dankbar.

Schöne Grüße, Dirk


Schöne Grüße, Dirk

betateilchen

DHCP Server auf dem Raspi ist Schnullerpulle... das läuft völlig problemlos. Aber was man mit SNMP auf dem Raspi will, ist mir unklar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk070

Nun: iPhone bekommt vom RPI-DHCP eine IP und mit FHEM-Presence-Modul fragt man per SNMP ab. Im Wiki wird das von einer AirPort abgefragt, aber die neue Extreme unterstützt kein SNMP mehr. Daher die Idee, den RPI als DHCP zu nutzen.


Schöne Grüße, Dirk

Dirk070

So, der DHCP-Server läuft.
Nun muss ich noch den SNMP-Server ans Laufen bekommen und dann die Abfrage der Leases hinbekommen.
Sollte da jemand Input liefern können, immer her damit

flocko

#4
Hallo,

ich hänge da auch gerade dran. Selbes Problem wie bei dir. Die neue TimeCapsule unterstützt kein SNMP.
Ich habe DHCPD und SNMPD auf dem Cubietruck installiert. Ausserdem habe ich meine TimeCapsule in den "NAT Only" Modus versetzt. So wie hier beschrieben: https://www.autoitconsulting.com/site/networking/configuring-an-airport-extreme-for-nat-only-mode/

Ein
$ snmpwalk -c public -v 1 10.0.0.16 .1.3.6.1.2.1.3.1.1.2
gibt mir
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.1 = Hex-STRING: 90 72 40 01 XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.3 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.5 = Hex-STRING: 84 38 35 46 XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.6 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.12 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.30 = Hex-STRING: 02 43 09 C0 XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.109 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.187 = Hex-STRING: 00 17 88 15 XX XX


Das funktioniert aber leider nur so halb.
In der DHCP.leases stehen z.B. folgende Einträge:

lease 10.0.0.188 {
  starts 2 2014/11/25 00:51:57;
  ends 2 2014/12/02 00:51:57;
  cltt 2 2014/11/25 00:51:57;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet b8:78:2e:3f:XX:XX;
  uid "\001\270x.?\027\340";
  client-hostname "TEST";


Dieser Client taucht zum Beispiel nie beim SNMPWALK auf und somit auch nicht in FHEM auf. Weiß jemand warum?

FHEM zeigt mir die Geräte manchmal als Present. Wenn ich dann aber zum Testen Offline gehe, dauert es ca. 5 Minuten und sie sind Absent. Allerdings komme ich von da an nicht mehr in "Present". Ich geh Online mit dem iPhone oder dem Android Tablet und selbst nach einiger Zeit zeigt der oben genannte SNMPWALK nicht das Device an. Und somit natürlich leider auch nicht FHEM.

Ich hoffe ich konnte dir ein wenig helfen? Bist du weiter gekommen?
Weiß jemand was da bei mir schief läuft?

Viele Grüße
Volker


EDIT:
Ah, eventuell liegt es an meiner TimeCapsule. Ich habe die Vermutung, dass die Clients die dort gelistet sind für den DHCPD Server inaktiv sind und deswegen nicht angezeigt werden. Merkwürdig. Ich werde morgen mal testen die TimeCapsule komplett als Bridge laufen zu lassen und das NAT über IPTABLES zu machen. Ich werde mich da mal reinfuchsen.

Dirk070

Mein aktueller Stand:

Aus dem Web:
SNMP-Server installieren

sudo apt-get install snmpd snmp
sudo nano /etc/snmp/snmpd.conf
Change the agentAddress
agentAddress 161
Below the line:
#rocommunity public localhost
add:
rocommunity public        (without the initial #)

Restart the SNMP deamon:
sudo /etc/init.d/snmpd restart

Nach dieser Installation bekomme ich schonmal eine Antwort auf den snmpwalk.

snmpwalk -c public -v 1 192.168.1.11 .1.3.6.1.2.1.3.1.1.2

In FHEM bleibt es aber dauerhaft beim Status "absent", die WLAN-Adresse aus dem iPhone habe ich geprüft (alle Buchstaben klein, Doppelpunkte raus, ein 0x davor).....

Also leider noch keine endgültige Lösung  :'(

Dirk070

Offenbar prüft FHEM auch beim Restart erst nach dem Zeitintervall.
Nun habe ich ein "Present".

HURRA! :) :)

flocko

Glückwunsch. :)

Wenn du jetzt das iPhone WLAN abschaltest und wartest bist es in Absent geht und du es danach wieder aktivierst, geht er dann wieder in "Present"?

Das klappt nämlich bei mir nicht.
Ich gebe auf und nehme die einfache Lösung. Habe noch n alten TP-LINK Router hier rumfliegen mit Gigabit Switch. Der wird jetzt das Routing übernehmen und die TimeCapsule häng ich als Bridge dran fürs WLAN.

flocko

Status bei mir:
Funktioniert so wie es soll. Da schlage ich mir zwei Nächte um die Ohren um das hinzubekommen, und dann regelt es mein DDWRT Router ganz von alleine. Mit 2 Mausklicks DHCP und SNMP konfiguriert, eben in FHEM die IP geändert und es funktioniert alles wie ich will. Jetzt erstmal ausführlich testen. :)

Dirk070

Zitat von: flocko am 25 November 2014, 19:53:20
Glückwunsch. :)

Wenn du jetzt das iPhone WLAN abschaltest und wartest bist es in Absent geht und du es danach wieder aktivierst, geht er dann wieder in "Present"?

Das klappt nämlich bei mir nicht.

Schlimmer, es bleibt nun dauerhaft beim Present....
Vielleicht kann ja mal jemand helfen und das Coding aus der MyUtils erklären oder wie man das debuggen kann.
Offenbar wird der Status nicht sauber gelesen sondern nur, ob die MAC-Adresse in der DHCP-Liste auftaucht.
Shit, wäre ja auch zu schön gewesen. Für heute ist Schluss mit Hobby, morgen klingelt wieder der Wecker.

flocko

Ich glaube nicht dass es an dem Myutils Code liegt.
Was zeigt die Abfrage von snmpwalk -c public -v 1 192.168.1.11 .1.3.6.1.2.1.3.1.1.2

Der Wert muss da raus, dann wird es auch in FHEM absent angezeigt.

Allerdings hat es bei mir bis zu 10 Minuten gedauert bis der Lease beim snmpwalk nicht angezeigt wurde.

Aber genau das hat nicht funktioniert bei mir. Jetzt mit dem Billo Linux Router und der TimeCapsule nur als WLAN AccessPoint funktioniert es genau wie ich es mir gewünscht habe.

Dirk070

Schaut man sich die Leases des DHCP an (sudo nano /var/lib/dhcp/dhcpd.leases), kann man am Binding-State erkennen, ob das Gerät "active" oder "free" ist.
Diese Info müsste man per SNMP lesen können, dann könnte man die Utils entsprechend umbauen....

flocko

Kann man das nicht mit einem Cat grep per Script automatisch in eine Datei schreiben lassen und die info in FHEM einlesen? Ich mache sowas ähnliches bei meinen arduino scripts.

Dirk070

Ich überlege auch, die Datei mit einem Perl-Script (bin zwar auch Entwickler, aber kein Perl) zu lesen.
Hier hat jemand so was ähnliches schon gebaut: http://www.omar.org/opensource/reportdhcp/source.html

Da werden auch schon die Binding Stats gelesen. Wenn sich das mal jemand anschaut, der sich damit auskennt... ;) ;)

Dirk070

So was hier müsste man doch schon nutzen können, um die Infos zu splitten, oder?

# Reads and munges the leases file generated by dhcpd
sub ParseLeaseFile {

our %lease;
unless(open (IN, $dhcpfile)) {
print "\nError: unable to open file $dhcpfile: $! \n";
exit -1;
}
my @leases = <IN>;
my $data = "";
foreach $line (@leases) {
unless ($line =~ m/^#/) { # ignore commented lines
$data .= $line;
}
}
my @data = split (/lease /, $data); #split each lease into an array entry
foreach (@data) {                 #create hash of hashes keyed on ip from the array
my @temp = split(/{/, $_);
chop($temp[0]); # 0 is IP
chop($temp[1]); # 1 is the rest...
chop($temp[1]);
$temp[1] =~ tr/\t//d;
@t = split(/;\n/, $temp[1]); #split each lease on newline
my $i=0;
while ($t[$i]) {
my $string = $t[$i];
$string =~ tr/\n//d;
$string =~ s/^\s*//; # remove any leading spaces
@words = split(/\s+/, $string); #hashes keyed on first word

if ($words[0]) {
$key = shift(@words);
$lease{$temp[0]}{$key}="@words";
$lease{$temp[0]}{"hardware"}=~ s/ethernet//;
$lease{$temp[0]}{"binding"}=~ s/state //;
}
$i++;
}
}
my @temp = sort(keys(%lease));
my $prev = ""; # checks for duplicates
@ips=grep($_ ne $prev && (($prev) = $_), @temp);
$entries = @ips;
}