* 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:
Andrew Bauer 2018-07-11 14:43:59 -05:00 committed by Isaac Connor
parent 3d97b6343e
commit 18c3618e28
5 changed files with 80 additions and 78 deletions

View File

@ -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")

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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 )