Aber ich sollte schonmal berücksichtigen, dass die IP eindeutig ist und der hostname nicht.
Habe Name und Wert vom Reading mal umgedreht und statt all_hosts($status) wird nun iget_ips($status) geprüft.
package main;
use strict;
use warnings;
use POSIX;
use Blocking;
use Nmap::Parser;
sub myUtils_Initialize($$) {
my ($hash) = @_;
}
sub nmapPingScan($$){
my ($name, $network) = @_;
my $hash = $defs{$name};
$hash->{helper}{RUNNING_PID} = BlockingCall("blocking_nmapPingScan", $name."|".$network, "nmapPingScan_Done", 300, "nmapPingScan_Aborted", $hash) unless(exists($hash->{helper}{RUNNING_PID}));
return;
}
sub blocking_nmapPingScan($$) {
my ($string) = @_;
my ($name, $network) = split("\\|", $string);
my $hash = $defs{$name};
my $np = new Nmap::Parser;
$np->parsescan("/usr/bin/nmap", "-sn", $network);
my @ret = $name;
my @hosts_up = $np->get_ips("up");
for (@hosts_up){
my $hostname = $_->hostname() ? $_->hostname() : $_->addr();
push(@ret, $_->addr()."|$hostname");
}
return join("||", @ret);
}
sub nmapPingScan_Done($) {
my ($string) = @_;
return unless(defined($string));
my @hosts_up = split("\\|\\|", $string);
my $name = shift @hosts_up;
my $hash = $defs{$name};
delete($hash->{helper}{RUNNING_PID});
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "hosts_up", int(@hosts_up));
for (@hosts_up){
my ($ip, $hostname) = split("\\|", $_);
fhem("trigger $name new host: $hostname ($ip)") if(!$hash->{READINGS}{$ip});
readingsBulkUpdate($hash, $ip, $hostname);
}
readingsEndUpdate($hash, 1);
return;
}
sub nmapPingScan_Aborted($) {
my ($hash) = @_;
delete($hash->{helper}{RUNNING_PID});
}
1;