Arp tool (#2155)
* let cmake set path to arp * declare cameras array * fix probeV4L function * typo * fix another typo - my machine is possessed. * update redhat, debian, ubuntu build dependencies
This commit is contained in:
parent
3d97b6343e
commit
18c3618e28
|
@ -802,6 +802,24 @@ if(WITH_SYSTEMD)
|
||||||
endif(NOT POLKIT_FOUND)
|
endif(NOT POLKIT_FOUND)
|
||||||
endif(WITH_SYSTEMD)
|
endif(WITH_SYSTEMD)
|
||||||
|
|
||||||
|
# Find the path to an arp compatible executable
|
||||||
|
if(ZM_PATH_ARP STREQUAL "")
|
||||||
|
find_program(ARP_EXECUTABLE arp)
|
||||||
|
if(ARP_EXECUTABLE)
|
||||||
|
set(ZM_PATH_ARP "${ARP_EXECUTABLE}")
|
||||||
|
mark_as_advanced(ARP_EXECUTABLE)
|
||||||
|
else(ARP_EXECUTABLE)
|
||||||
|
find_program(ARP_EXECUTABLE ip)
|
||||||
|
if(ARP_EXECUTABLE)
|
||||||
|
set(ZM_PATH_ARP "${ARP_EXECUTABLE} neigh")
|
||||||
|
mark_as_advanced(ARP_EXECUTABLE)
|
||||||
|
endif(ARP_EXECUTABLE)
|
||||||
|
endif(ARP_EXECUTABLE)
|
||||||
|
if(ARP_EXECUTABLE-NOTFOUND)
|
||||||
|
message(WARNING "Unable to find a compatible arp binary. Monitor probe will not function." )
|
||||||
|
endif(ARP_EXECUTABLE-NOTFOUND)
|
||||||
|
endif(ZM_PATH_ARP STREQUAL "")
|
||||||
|
|
||||||
# Some variables that zm expects
|
# Some variables that zm expects
|
||||||
set(ZM_PID "${ZM_RUNDIR}/zm.pid")
|
set(ZM_PID "${ZM_RUNDIR}/zm.pid")
|
||||||
set(ZM_CONFIG "${ZM_CONFIG_DIR}/zm.conf")
|
set(ZM_CONFIG "${ZM_CONFIG_DIR}/zm.conf")
|
||||||
|
|
|
@ -13,6 +13,7 @@ Build-Depends: debhelper (>= 9), cmake
|
||||||
, libv4l-dev (>= 0.8.3)
|
, libv4l-dev (>= 0.8.3)
|
||||||
, libbz2-dev
|
, libbz2-dev
|
||||||
, ffmpeg | libav-tools
|
, ffmpeg | libav-tools
|
||||||
|
, net-tools
|
||||||
, libnetpbm10-dev
|
, libnetpbm10-dev
|
||||||
, libvlccore-dev, libvlc-dev
|
, libvlccore-dev, libvlc-dev
|
||||||
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
||||||
|
|
|
@ -52,6 +52,7 @@ BuildRequires: pcre-devel
|
||||||
BuildRequires: libjpeg-turbo-devel
|
BuildRequires: libjpeg-turbo-devel
|
||||||
BuildRequires: findutils
|
BuildRequires: findutils
|
||||||
BuildRequires: coreutils
|
BuildRequires: coreutils
|
||||||
|
BuildRequires: net-tools
|
||||||
BuildRequires: perl
|
BuildRequires: perl
|
||||||
BuildRequires: perl-generators
|
BuildRequires: perl-generators
|
||||||
BuildRequires: perl(Archive::Tar)
|
BuildRequires: perl(Archive::Tar)
|
||||||
|
|
|
@ -11,6 +11,8 @@ Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apa
|
||||||
,libavformat-dev (>= 6:10~)
|
,libavformat-dev (>= 6:10~)
|
||||||
,libavutil-dev (>= 6:10~)
|
,libavutil-dev (>= 6:10~)
|
||||||
,libswscale-dev (>= 6:10~)
|
,libswscale-dev (>= 6:10~)
|
||||||
|
,ffmpeg | libav-tools
|
||||||
|
,net-tools
|
||||||
,libbz2-dev
|
,libbz2-dev
|
||||||
,libgcrypt-dev | libgcrypt11-dev
|
,libgcrypt-dev | libgcrypt11-dev
|
||||||
,libcurl4-gnutls-dev
|
,libcurl4-gnutls-dev
|
||||||
|
|
|
@ -26,7 +26,7 @@ if ( !canEdit('Monitors') ) {
|
||||||
// Probe Local Cameras
|
// Probe Local Cameras
|
||||||
function probeV4L() {
|
function probeV4L() {
|
||||||
|
|
||||||
$cameras = array();
|
$cameras = array();
|
||||||
|
|
||||||
$command = getZmuCommand(' --query --device');
|
$command = getZmuCommand(' --query --device');
|
||||||
if ( !empty($_REQUEST['device']) )
|
if ( !empty($_REQUEST['device']) )
|
||||||
|
@ -110,6 +110,7 @@ function probeV4L() {
|
||||||
$device['inputs'] = $inputs;
|
$device['inputs'] = $inputs;
|
||||||
$devices[] = $device;
|
$devices[] = $device;
|
||||||
} # end foreach output line
|
} # end foreach output line
|
||||||
|
return $cameras;
|
||||||
} # end function probeV4L
|
} # end function probeV4L
|
||||||
|
|
||||||
// Probe Network Cameras
|
// Probe Network Cameras
|
||||||
|
@ -206,7 +207,7 @@ function probeVivotek($ip) {
|
||||||
'Width' => 352,
|
'Width' => 352,
|
||||||
'Height' => 240,
|
'Height' => 240,
|
||||||
),
|
),
|
||||||
);
|
);t
|
||||||
if ( $lines = @file($url) ) {
|
if ( $lines = @file($url) ) {
|
||||||
foreach ( $lines as $line ) {
|
foreach ( $lines as $line ) {
|
||||||
$line = rtrim($line);
|
$line = rtrim($line);
|
||||||
|
@ -242,91 +243,70 @@ function probeWansview($ip) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function probeNetwork() {
|
function probeNetwork() {
|
||||||
// Calling arp without the full path was reported to fail on some systems
|
$cameras = array();
|
||||||
// Use the builtin unix command "type" to tell us where the command is
|
$arp_command = ZM_PATH_ARP;
|
||||||
$arp_command = '';
|
$result = explode(' ', $arp_command);
|
||||||
$result = explode(' ', ZM_PATH_ARP);
|
if ( !is_executable($result[0]) ) {
|
||||||
if ( !is_executable($result[0]) ) {
|
Error("ARP compatible binary not found or not executable by the web user account. Verify ZM_PATH_ARP points to a valid arp tool.");
|
||||||
if ( ZM_PATH_ARP ) {
|
return;
|
||||||
Warning("User assigned ARP tool not found. Verify ZM_PATH_ARP points to a valid arp tool and is executable by the web user account.");
|
}
|
||||||
}
|
|
||||||
$result = exec('type -p arp', $output, $status);
|
|
||||||
if ( $status ) {
|
|
||||||
Warning("Unable to determine path for arp command, type -p arp returned '$status' output is: " . implode("\n", $output));
|
|
||||||
unset($output);
|
|
||||||
$result = exec('which arp', $output, $status);
|
|
||||||
if ( $status ) {
|
|
||||||
Warning("Unable to determine path for arp command, which arp returned '$status'");
|
|
||||||
if ( file_exists('/usr/sbin/arp') ) {
|
|
||||||
$arp_command = '/usr/sbin/arp -a';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$arp_command = $output[0].' -a';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$arp_command = $output[0].' -a';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$arp_command = ZM_PATH_ARP;
|
|
||||||
}
|
|
||||||
// Now that we know where arp is, call it using the full path
|
|
||||||
unset($output);
|
|
||||||
$result = exec(escapeshellcmd($arp_command), $output, $status);
|
|
||||||
if ( $status ) {
|
|
||||||
Error("Unable to probe network cameras, status is '$status'");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$monitors = array();
|
$result = exec(escapeshellcmd($arp_command), $output, $status);
|
||||||
foreach ( dbFetchAll("SELECT Id, Name, Host FROM Monitors WHERE Type = 'Remote' ORDER BY Host") as $monitor ) {
|
if ( $status ) {
|
||||||
if ( preg_match('/^(.+)@(.+)$/', $monitor['Host'], $matches) ) {
|
Error("Unable to probe network cameras, status is '$status'");
|
||||||
//echo "1: ".$matches[2]." = ".gethostbyname($matches[2])."<br/>";
|
return;
|
||||||
$monitors[gethostbyname($matches[2])] = $monitor;
|
}
|
||||||
} else {
|
|
||||||
//echo "2: ".$monitor['Host']." = ".gethostbyname($monitor['Host'])."<br/>";
|
|
||||||
$monitors[gethostbyname($monitor['Host'])] = $monitor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$macBases = array(
|
$monitors = array();
|
||||||
'00:40:8c' => array('type'=>'Axis', 'probeFunc'=>'probeAxis'),
|
foreach ( dbFetchAll("SELECT Id, Name, Host FROM Monitors WHERE Type = 'Remote' ORDER BY Host") as $monitor ) {
|
||||||
'00:80:f0' => array('type'=>'Panasonic','probeFunc'=>'probePana'),
|
if ( preg_match('/^(.+)@(.+)$/', $monitor['Host'], $matches) ) {
|
||||||
'00:0f:7c' => array('type'=>'ACTi','probeFunc'=>'probeACTi'),
|
//echo "1: ".$matches[2]." = ".gethostbyname($matches[2])."<br/>";
|
||||||
'00:02:d1' => array('type'=>'Vivotek','probeFunc'=>'probeVivotek'),
|
$monitors[gethostbyname($matches[2])] = $monitor;
|
||||||
'7c:dd:90' => array('type'=>'Wansview','probeFunc'=>'probeWansview'),
|
} else {
|
||||||
'78:a5:dd' => array('type'=>'Wansview','probeFunc'=>'probeWansview')
|
//echo "2: ".$monitor['Host']." = ".gethostbyname($monitor['Host'])."<br/>";
|
||||||
);
|
$monitors[gethostbyname($monitor['Host'])] = $monitor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ( $output as $line ) {
|
$macBases = array(
|
||||||
if ( !preg_match('/(\d+\.\d+\.\d+\.\d+).*(([0-9a-f]{2}:){5})/', $line, $matches) )
|
'00:40:8c' => array('type'=>'Axis', 'probeFunc'=>'probeAxis'),
|
||||||
continue;
|
'00:80:f0' => array('type'=>'Panasonic','probeFunc'=>'probePana'),
|
||||||
$ip = $matches[1];
|
'00:0f:7c' => array('type'=>'ACTi','probeFunc'=>'probeACTi'),
|
||||||
$host = $ip;
|
'00:02:d1' => array('type'=>'Vivotek','probeFunc'=>'probeVivotek'),
|
||||||
$mac = $matches[2];
|
'7c:dd:90' => array('type'=>'Wansview','probeFunc'=>'probeWansview'),
|
||||||
//echo "I:$ip, H:$host, M:$mac<br/>";
|
'78:a5:dd' => array('type'=>'Wansview','probeFunc'=>'probeWansview')
|
||||||
$macRoot = substr($mac,0,8);
|
);
|
||||||
if ( isset($macBases[$macRoot]) ) {
|
|
||||||
$macBase = $macBases[$macRoot];
|
foreach ( $output as $line ) {
|
||||||
$camera = call_user_func($macBase['probeFunc'], $ip);
|
if ( !preg_match('/(\d+\.\d+\.\d+\.\d+).*(([0-9a-f]{2}:){5})/', $line, $matches) )
|
||||||
$sourceDesc = htmlspecialchars(serialize($camera['monitor']));
|
continue;
|
||||||
$sourceString = $camera['model'].' @ '.$host;
|
$ip = $matches[1];
|
||||||
if ( isset($monitors[$ip]) ) {
|
$host = $ip;
|
||||||
$monitor = $monitors[$ip];
|
$mac = $matches[2];
|
||||||
$sourceString .= ' ('.$monitor['Name'].')';
|
//echo "I:$ip, H:$host, M:$mac<br/>";
|
||||||
} else {
|
$macRoot = substr($mac,0,8);
|
||||||
$sourceString .= ' - '.translate('Available');
|
if ( isset($macBases[$macRoot]) ) {
|
||||||
}
|
$macBase = $macBases[$macRoot];
|
||||||
$cameras[$sourceDesc] = $sourceString;
|
$camera = call_user_func($macBase['probeFunc'], $ip);
|
||||||
}
|
$sourceDesc = htmlspecialchars(serialize($camera['monitor']));
|
||||||
} # end foreach output line
|
$sourceString = $camera['model'].' @ '.$host;
|
||||||
return $cameras;
|
if ( isset($monitors[$ip]) ) {
|
||||||
|
$monitor = $monitors[$ip];
|
||||||
|
$sourceString .= ' ('.$monitor['Name'].')';
|
||||||
|
} else {
|
||||||
|
$sourceString .= ' - '.translate('Available');
|
||||||
|
}
|
||||||
|
$cameras[$sourceDesc] = $sourceString;
|
||||||
|
}
|
||||||
|
} # end foreach output line
|
||||||
|
return $cameras;
|
||||||
} # end function probeNetwork()
|
} # end function probeNetwork()
|
||||||
|
|
||||||
$cameras = array();
|
$cameras = array();
|
||||||
$cameras[0] = translate('ChooseDetectedCamera');
|
$cameras[0] = translate('ChooseDetectedCamera');
|
||||||
|
|
||||||
if ( ZM_HAS_V4L2 )
|
if ( ZM_HAS_V4L2 )
|
||||||
$cameras += probeV4L();
|
$cameras += probeV4L();
|
||||||
$cameras += probeNetwork();
|
$cameras += probeNetwork();
|
||||||
|
|
||||||
if ( count($cameras) <= 1 )
|
if ( count($cameras) <= 1 )
|
||||||
|
|
Loading…
Reference in New Issue