1557 lines
70 KiB
PHP
1557 lines
70 KiB
PHP
<?php
|
|
//
|
|
// ZoneMinder web action file, $Date$, $Revision$
|
|
// Copyright (C) 2001-2008 Philip Coombes
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public License
|
|
// as published by the Free Software Foundation; either version 2
|
|
// of the License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
//
|
|
|
|
function getAffectedIds( $name )
|
|
{
|
|
$names = $name."s";
|
|
$ids = array();
|
|
if ( isset($_REQUEST[$names]) || isset($_REQUEST[$name]) )
|
|
{
|
|
if ( isset($_REQUEST[$names]) )
|
|
$ids = validInt($_REQUEST[$names]);
|
|
else if ( isset($_REQUEST[$name]) )
|
|
$ids[] = validInt($_REQUEST[$name]);
|
|
}
|
|
return( $ids );
|
|
}
|
|
|
|
if ( !empty($action) )
|
|
{
|
|
// General scope actions
|
|
if ( $action == "login" && isset($_REQUEST['username']) && ( ZM_AUTH_TYPE == "remote" || isset($_REQUEST['password']) ) )
|
|
{
|
|
$username = validStr( $_REQUEST['username'] );
|
|
$password = isset($_REQUEST['password'])?validStr($_REQUEST['password']):'';
|
|
userLogin( $username, $password );
|
|
}
|
|
elseif ( $action == "logout" )
|
|
{
|
|
userLogout();
|
|
$refreshParent = true;
|
|
$view = 'none';
|
|
}
|
|
elseif ( $action == "bandwidth" && isset($_REQUEST['newBandwidth']) )
|
|
{
|
|
$_COOKIE['zmBandwidth'] = validStr($_REQUEST['newBandwidth']);
|
|
setcookie( "zmBandwidth", validStr($_REQUEST['newBandwidth']), time()+3600*24*30*12*10 );
|
|
$refreshParent = true;
|
|
}
|
|
|
|
// Event scope actions, view permissions only required
|
|
if ( canView( 'Events' ) )
|
|
{
|
|
if ( $action == "filter" )
|
|
{
|
|
if ( !empty($_REQUEST['subaction']) )
|
|
{
|
|
if ( $_REQUEST['subaction'] == "addterm" )
|
|
$_REQUEST['filter'] = addFilterTerm( $_REQUEST['filter'], $_REQUEST['line'] );
|
|
elseif ( $_REQUEST['subaction'] == "delterm" )
|
|
$_REQUEST['filter'] = delFilterTerm( $_REQUEST['filter'], $_REQUEST['line'] );
|
|
}
|
|
elseif ( canEdit( 'Events' ) )
|
|
{
|
|
if ( !empty($_REQUEST['execute']) )
|
|
$tempFilterName = "_TempFilter".time();
|
|
if ( isset($tempFilterName) )
|
|
$filterName = $tempFilterName;
|
|
elseif ( !empty($_REQUEST['newFilterName']) )
|
|
$filterName = $_REQUEST['newFilterName'];
|
|
if ( !empty($filterName) )
|
|
{
|
|
$_REQUEST['filter']['sort_field'] = validStr($_REQUEST['sort_field']);
|
|
$_REQUEST['filter']['sort_asc'] = validStr($_REQUEST['sort_asc']);
|
|
$_REQUEST['filter']['limit'] = validInt($_REQUEST['limit']);
|
|
$sql = "replace into Filters set Name = '".dbEscape($filterName)."', Query = '".dbEscape(serialize($_REQUEST['filter']))."'";
|
|
if ( !empty($_REQUEST['autoArchive']) )
|
|
$sql .= ", AutoArchive = '".dbEscape($_REQUEST['autoArchive'])."'";
|
|
if ( !empty($_REQUEST['autoVideo']) )
|
|
$sql .= ", AutoVideo = '".dbEscape($_REQUEST['autoVideo'])."'";
|
|
if ( !empty($_REQUEST['autoUpload']) )
|
|
$sql .= ", AutoUpload = '".dbEscape($_REQUEST['autoUpload'])."'";
|
|
if ( !empty($_REQUEST['autoEmail']) )
|
|
$sql .= ", AutoEmail = '".dbEscape($_REQUEST['autoEmail'])."'";
|
|
if ( !empty($_REQUEST['autoMessage']) )
|
|
$sql .= ", AutoMessage = '".dbEscape($_REQUEST['autoMessage'])."'";
|
|
if ( !empty($_REQUEST['autoExecute']) && !empty($_REQUEST['autoExecuteCmd']) )
|
|
$sql .= ", AutoExecute = '".dbEscape($_REQUEST['autoExecute'])."', AutoExecuteCmd = '".dbEscape($_REQUEST['autoExecuteCmd'])."'";
|
|
if ( !empty($_REQUEST['autoDelete']) )
|
|
$sql .= ", AutoDelete = '".dbEscape($_REQUEST['autoDelete'])."'";
|
|
if ( !empty($_REQUEST['background']) )
|
|
$sql .= ", Background = '".dbEscape($_REQUEST['background'])."'";
|
|
dbQuery( $sql );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Event scope actions, edit permissions required
|
|
if ( canEdit( 'Events' ) )
|
|
{
|
|
if ( $action == "rename" && isset($_REQUEST['eventName']) && !empty($_REQUEST['eid']) )
|
|
{
|
|
dbQuery( "update Events set Name = '".dbEscape($_REQUEST['eventName'])."' where Id = '".dbEscape($_REQUEST['eid'])."'" );
|
|
}
|
|
else if ( $action == "eventdetail" )
|
|
{
|
|
if ( !empty($_REQUEST['eid']) )
|
|
{
|
|
dbQuery( "update Events set Cause = '".dbEscape($_REQUEST['newEvent']['Cause'])."', Notes = '".dbEscape($_REQUEST['newEvent']['Notes'])."' where Id = '".dbEscape($_REQUEST['eid'])."'" );
|
|
$refreshParent = true;
|
|
}
|
|
else
|
|
{
|
|
foreach( getAffectedIds( 'markEid' ) as $markEid )
|
|
{
|
|
dbQuery( "update Events set Cause = '".dbEscape($_REQUEST['newEvent']['Cause'])."', Notes = '".dbEscape($_REQUEST['newEvent']['Notes'])."' where Id = '".dbEscape($markEid)."'" );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
elseif ( $action == "archive" || $action == "unarchive" )
|
|
{
|
|
$archiveVal = ($action == "archive")?1:0;
|
|
if ( !empty($_REQUEST['eid']) )
|
|
{
|
|
dbQuery( "update Events set Archived = $archiveVal where Id = '".dbEscape($_REQUEST['eid'])."'" );
|
|
}
|
|
else
|
|
{
|
|
foreach( getAffectedIds( 'markEid' ) as $markEid )
|
|
{
|
|
dbQuery( "update Events set Archived = $archiveVal where Id = '".dbEscape($markEid)."'" );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
elseif ( $action == "delete" )
|
|
{
|
|
foreach( getAffectedIds( 'markEid' ) as $markEid )
|
|
{
|
|
deleteEvent( $markEid );
|
|
$refreshParent = true;
|
|
}
|
|
if ( !empty($_REQUEST['fid']) )
|
|
{
|
|
dbQuery( "delete from Filters where Name = '".dbEscape($_REQUEST['fid'])."'" );
|
|
//$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Monitor control actions, require a monitor id and control view permissions for that monitor
|
|
if ( !empty($_REQUEST['mid']) && canView( 'Control', $_REQUEST['mid'] ) )
|
|
{
|
|
$mid = validInt($_REQUEST['mid']);
|
|
if ( $action == "control" )
|
|
{
|
|
$control = validStr($_REQUEST['control']);
|
|
|
|
$monitor = dbFetchOne( "select C.*,M.* from Monitors as M inner join Controls as C on (M.ControlId = C.Id) where M.Id = '".dbEscape($mid)."'" );
|
|
|
|
$ctrlCommand = ZM_PATH_BIN."/zmcontrol.pl";
|
|
|
|
if ( isset($_REQUEST['x']) && isset($_REQUEST['y']) )
|
|
{
|
|
$x = validInt($_REQUEST['x']);
|
|
$y = validInt($_REQUEST['y']);
|
|
$scale = validInt($_REQUEST['scale']);
|
|
if ( $control == "moveMap" )
|
|
{
|
|
$x = deScale( $x, $scale );
|
|
$y = deScale( $y, $scale );
|
|
switch ( $monitor['Orientation'] )
|
|
{
|
|
case '0' :
|
|
case '180' :
|
|
case 'hori' :
|
|
case 'vert' :
|
|
$width = $monitor['Width'];
|
|
$height = $monitor['Height'];
|
|
break;
|
|
case '90' :
|
|
case '270' :
|
|
$width = $monitor['Height'];
|
|
$height = $monitor['Width'];
|
|
break;
|
|
}
|
|
switch ( $monitor['Orientation'] )
|
|
{
|
|
case '90' :
|
|
$tempY = $y;
|
|
$y = $height - $x;
|
|
$x = $tempY;
|
|
break;
|
|
case '180' :
|
|
$x = $width - $x;
|
|
$y = $height - $y;
|
|
break;
|
|
case '270' :
|
|
$tempX = $x;
|
|
$x = $width - $y;
|
|
$y = $tempX;
|
|
break;
|
|
case 'hori' :
|
|
$x = $width - $x;
|
|
break;
|
|
case 'vert' :
|
|
$y = $height - $y;
|
|
break;
|
|
}
|
|
$ctrlCommand .= " --xcoord=".$x." --ycoord=".$y." --width=".$width." --height=".$height;
|
|
}
|
|
elseif ( $control == "movePseudoMap" )
|
|
{
|
|
$x = deScale( $x, $scale );
|
|
$y = deScale( $y, $scale );
|
|
|
|
$halfWidth = $monitor['Width'] / 2;
|
|
$halfHeight = $monitor['Height'] / 2;
|
|
$xFactor = ($x - $halfWidth)/$halfWidth;
|
|
$yFactor = ($y - $halfHeight)/$halfHeight;
|
|
|
|
switch ( $monitor['Orientation'] )
|
|
{
|
|
case '90' :
|
|
$tempYFactor = $y;
|
|
$yFactor = -$xFactor;
|
|
$xFactor = $tempYFactor;
|
|
break;
|
|
case '180' :
|
|
$xFactor = -$xFactor;
|
|
$yFactor = -$yFactor;
|
|
break;
|
|
case '270' :
|
|
$tempXFactor = $x;
|
|
$xFactor = -$yFactor;
|
|
$yFactor = $tempXFactor;
|
|
break;
|
|
case 'hori' :
|
|
$xFactor = -$xFactor;
|
|
break;
|
|
case 'vert' :
|
|
$yFactor = -$yFactor;
|
|
break;
|
|
}
|
|
|
|
$turbo = 0.9; // Threshold for turbo speed
|
|
$blind = 0.1; // Threshold for blind spot
|
|
|
|
$panControl = '';
|
|
$tiltControl = '';
|
|
if ( $xFactor > $blind )
|
|
{
|
|
$panControl = 'Right';
|
|
}
|
|
elseif ( $xFactor < -$blind )
|
|
{
|
|
$panControl = 'Left';
|
|
}
|
|
if ( $yFactor > $blind )
|
|
{
|
|
$tiltControl = 'Down';
|
|
}
|
|
elseif ( $yFactor < -$blind )
|
|
{
|
|
$tiltControl = 'Up';
|
|
}
|
|
|
|
$dirn = $tiltControl.$panControl;
|
|
if ( !$dirn )
|
|
{
|
|
// No command, probably in blind spot in middle
|
|
$control = 'null';
|
|
}
|
|
else
|
|
{
|
|
$control = 'moveRel'.$dirn;
|
|
$xFactor = abs($xFactor);
|
|
$yFactor = abs($yFactor);
|
|
|
|
if ( $monitor['HasPanSpeed'] && $xFactor )
|
|
{
|
|
if ( $monitor['HasTurboPan'] )
|
|
{
|
|
if ( $xFactor >= $turbo )
|
|
{
|
|
$panSpeed = $monitor['TurboPanSpeed'];
|
|
}
|
|
else
|
|
{
|
|
$xFactor = $xFactor/$turbo;
|
|
$panSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$xFactor)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$panSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$xFactor)));
|
|
}
|
|
}
|
|
if ( $monitor['HasTiltSpeed'] && $yFactor )
|
|
{
|
|
if ( $monitor['HasTurboTilt'] )
|
|
{
|
|
if ( $yFactor >= $turbo )
|
|
{
|
|
$tiltSpeed = $monitor['TurboTiltSpeed'];
|
|
}
|
|
else
|
|
{
|
|
$yFactor = $yFactor/$turbo;
|
|
$tiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$yFactor)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$tiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$yFactor)));
|
|
}
|
|
}
|
|
if ( preg_match( '/(Left|Right)$/', $dirn ) )
|
|
{
|
|
$panStep = intval(round($monitor['MinPanStep']+(($monitor['MaxPanStep']-$monitor['MinPanStep'])*$xFactor)));
|
|
$ctrlCommand .= " --panstep=".$panStep." --panspeed=".$panSpeed;
|
|
}
|
|
if ( preg_match( '/^(Up|Down)/', $dirn ) )
|
|
{
|
|
$tiltStep = intval(round($monitor['MinTiltStep']+(($monitor['MaxTiltStep']-$monitor['MinTiltStep'])*$yFactor)));
|
|
$ctrlCommand .= " --tiltstep=".$tiltStep." --tiltspeed=".$tiltSpeed;
|
|
}
|
|
}
|
|
}
|
|
elseif ( $control == "moveConMap" )
|
|
{
|
|
$x = deScale( $x, $scale );
|
|
$y = deScale( $y, $scale );
|
|
|
|
$halfWidth = $monitor['Width'] / 2;
|
|
$halfHeight = $monitor['Height'] / 2;
|
|
$xFactor = ($x - $halfWidth)/$halfWidth;
|
|
$yFactor = ($y - $halfHeight)/$halfHeight;
|
|
|
|
switch ( $monitor['Orientation'] )
|
|
{
|
|
case '90' :
|
|
$tempYFactor = $y;
|
|
$yFactor = -$xFactor;
|
|
$xFactor = $tempYFactor;
|
|
break;
|
|
case '180' :
|
|
$xFactor = -$xFactor;
|
|
$yFactor = -$yFactor;
|
|
break;
|
|
case '270' :
|
|
$tempXFactor = $x;
|
|
$xFactor = -$yFactor;
|
|
$yFactor = $tempXFactor;
|
|
break;
|
|
case 'hori' :
|
|
$xFactor = -$xFactor;
|
|
break;
|
|
case 'vert' :
|
|
$yFactor = -$yFactor;
|
|
break;
|
|
}
|
|
|
|
$slow = 0.9; // Threshold for slow speed/timeouts
|
|
$turbo = 0.9; // Threshold for turbo speed
|
|
$blind = 0.1; // Threshold for blind spot
|
|
|
|
$panControl = '';
|
|
$tiltControl = '';
|
|
if ( $xFactor > $blind )
|
|
{
|
|
$panControl = 'Right';
|
|
}
|
|
elseif ( $xFactor < -$blind )
|
|
{
|
|
$panControl = 'Left';
|
|
}
|
|
if ( $yFactor > $blind )
|
|
{
|
|
$tiltControl = 'Down';
|
|
}
|
|
elseif ( $yFactor < -$blind )
|
|
{
|
|
$tiltControl = 'Up';
|
|
}
|
|
|
|
$dirn = $tiltControl.$panControl;
|
|
if ( !$dirn )
|
|
{
|
|
// No command, probably in blind spot in middle
|
|
$control = 'moveStop';
|
|
}
|
|
else
|
|
{
|
|
$control = 'moveCon'.$dirn;
|
|
$xFactor = abs($xFactor);
|
|
$yFactor = abs($yFactor);
|
|
|
|
if ( $monitor['HasPanSpeed'] && $xFactor )
|
|
{
|
|
if ( $monitor['HasTurboPan'] )
|
|
{
|
|
if ( $xFactor >= $turbo )
|
|
{
|
|
$panSpeed = $monitor['TurboPanSpeed'];
|
|
}
|
|
else
|
|
{
|
|
$xFactor = $xFactor/$turbo;
|
|
$panSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$xFactor)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$panSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$xFactor)));
|
|
}
|
|
}
|
|
if ( $monitor['HasTiltSpeed'] && $yFactor )
|
|
{
|
|
if ( $monitor['HasTurboTilt'] )
|
|
{
|
|
if ( $yFactor >= $turbo )
|
|
{
|
|
$tiltSpeed = $monitor['TurboTiltSpeed'];
|
|
}
|
|
else
|
|
{
|
|
$yFactor = $yFactor/$turbo;
|
|
$tiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$yFactor)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$tiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$yFactor)));
|
|
}
|
|
}
|
|
if ( preg_match( '/(Left|Right)$/', $dirn ) )
|
|
{
|
|
$ctrlCommand .= " --panspeed=".$panSpeed;
|
|
}
|
|
if ( preg_match( '/^(Up|Down)/', $dirn ) )
|
|
{
|
|
$ctrlCommand .= " --tiltspeed=".$tiltSpeed;
|
|
}
|
|
if ( $monitor['AutoStopTimeout'] )
|
|
{
|
|
$slowPanSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$slow)));
|
|
$slowTiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$slow)));
|
|
if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) )
|
|
{
|
|
$ctrlCommand .= " --autostop";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$slow = 0.9; // Threshold for slow speed/timeouts
|
|
$turbo = 0.9; // Threshold for turbo speed
|
|
$longY = 48;
|
|
$shortX = 32;
|
|
$shortY = 32;
|
|
|
|
if ( preg_match( '/^([a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)$/', $control, $matches ) )
|
|
{
|
|
$command = $matches[1];
|
|
$mode = $matches[2];
|
|
$dirn = $matches[3];
|
|
|
|
switch( $command )
|
|
{
|
|
case 'focus' :
|
|
{
|
|
switch( $dirn )
|
|
{
|
|
case 'Near' :
|
|
{
|
|
$factor = ($longY-($y+1))/$longY;
|
|
break;
|
|
}
|
|
case 'Far' :
|
|
{
|
|
$factor = ($y+1)/$longY;
|
|
break;
|
|
}
|
|
}
|
|
if ( $monitor['HasFocusSpeed'] )
|
|
{
|
|
$speed = intval(round($monitor['MinFocusSpeed']+(($monitor['MaxFocusSpeed']-$monitor['MinFocusSpeed'])*$factor)));
|
|
$ctrlCommand .= " --speed=".$speed;
|
|
}
|
|
switch( $mode )
|
|
{
|
|
case 'Abs' :
|
|
case 'Rel' :
|
|
{
|
|
$step = intval(round($monitor['MinFocusStep']+(($monitor['MaxFocusStep']-$monitor['MinFocusStep'])*$factor)));
|
|
$ctrlCommand .= " --step=".$step;
|
|
break;
|
|
}
|
|
case 'Con' :
|
|
{
|
|
if ( $monitor['AutoStopTimeout'] )
|
|
{
|
|
$slowSpeed = intval(round($monitor['MinFocusSpeed']+(($monitor['MaxFocusSpeed']-$monitor['MinFocusSpeed'])*$slow)));
|
|
if ( $speed < $slowSpeed )
|
|
{
|
|
$ctrlCommand .= " --autostop";
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 'zoom' :
|
|
{
|
|
switch( $dirn )
|
|
{
|
|
case 'Tele' :
|
|
{
|
|
$factor = ($longY-($y+1))/$longY;
|
|
break;
|
|
}
|
|
case 'Wide' :
|
|
{
|
|
$factor = ($y+1)/$longY;
|
|
break;
|
|
}
|
|
}
|
|
if ( $monitor['HasZoomSpeed'] )
|
|
{
|
|
$speed = intval(round($monitor['MinZoomSpeed']+(($monitor['MaxZoomSpeed']-$monitor['MinZoomSpeed'])*$factor)));
|
|
$ctrlCommand .= " --speed=".$speed;
|
|
}
|
|
switch( $mode )
|
|
{
|
|
case 'Abs' :
|
|
case 'Rel' :
|
|
{
|
|
$step = intval(round($monitor['MinZoomStep']+(($monitor['MaxZoomStep']-$monitor['MinZoomStep'])*$factor)));
|
|
$ctrlCommand .= " --step=".$step;
|
|
break;
|
|
}
|
|
case 'Con' :
|
|
{
|
|
if ( $monitor['AutoStopTimeout'] )
|
|
{
|
|
$slowSpeed = intval(round($monitor['MinZoomSpeed']+(($monitor['MaxZoomSpeed']-$monitor['MinZoomSpeed'])*$slow)));
|
|
if ( $speed < $slowSpeed )
|
|
{
|
|
$ctrlCommand .= " --autostop";
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 'iris' :
|
|
{
|
|
switch( $dirn )
|
|
{
|
|
case 'Open' :
|
|
{
|
|
$factor = ($longY-($y+1))/$longY;
|
|
break;
|
|
}
|
|
case 'Close' :
|
|
{
|
|
$factor = ($y+1)/$longY;
|
|
break;
|
|
}
|
|
}
|
|
if ( $monitor['HasIrisSpeed'] )
|
|
{
|
|
$speed = intval(round($monitor['MinIrisSpeed']+(($monitor['MaxIrisSpeed']-$monitor['MinIrisSpeed'])*$factor)));
|
|
$ctrlCommand .= " --speed=".$speed;
|
|
}
|
|
switch( $mode )
|
|
{
|
|
case 'Abs' :
|
|
case 'Rel' :
|
|
{
|
|
$step = intval(round($monitor['MinIrisStep']+(($monitor['MaxIrisStep']-$monitor['MinIrisStep'])*$factor)));
|
|
$ctrlCommand .= " --step=".$step;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 'white' :
|
|
{
|
|
switch( $dirn )
|
|
{
|
|
case 'In' :
|
|
{
|
|
$factor = ($longY-($y+1))/$longY;
|
|
break;
|
|
}
|
|
case 'Out' :
|
|
{
|
|
$factor = ($y+1)/$longY;
|
|
break;
|
|
}
|
|
}
|
|
if ( $monitor['HasWhiteSpeed'] )
|
|
{
|
|
$speed = intval(round($monitor['MinWhiteSpeed']+(($monitor['MaxWhiteSpeed']-$monitor['MinWhiteSpeed'])*$factor)));
|
|
$ctrlCommand .= " --speed=".$speed;
|
|
}
|
|
switch( $mode )
|
|
{
|
|
case 'Abs' :
|
|
case 'Rel' :
|
|
{
|
|
$step = intval(round($monitor['MinWhiteStep']+(($monitor['MaxWhiteStep']-$monitor['MinWhiteStep'])*$factor)));
|
|
$ctrlCommand .= " --step=".$step;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 'gain' :
|
|
{
|
|
switch( $dirn )
|
|
{
|
|
case 'Up' :
|
|
{
|
|
$factor = ($longY-($y+1))/$longY;
|
|
break;
|
|
}
|
|
case 'Down' :
|
|
{
|
|
$factor = ($y+1)/$longY;
|
|
break;
|
|
}
|
|
}
|
|
if ( $monitor['HasGainSpeed'] )
|
|
{
|
|
$speed = intval(round($monitor['MinGainSpeed']+(($monitor['MaxGainSpeed']-$monitor['MinGainSpeed'])*$factor)));
|
|
$ctrlCommand .= " --speed=".$speed;
|
|
}
|
|
switch( $mode )
|
|
{
|
|
case 'Abs' :
|
|
case 'Rel' :
|
|
{
|
|
$step = intval(round($monitor['MinGainStep']+(($monitor['MaxGainStep']-$monitor['MinGainStep'])*$factor)));
|
|
$ctrlCommand .= " --step=".$step;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 'move' :
|
|
{
|
|
$xFactor = 0;
|
|
$yFactor = 0;
|
|
|
|
if ( preg_match( '/^Up/', $dirn ) )
|
|
{
|
|
$yFactor = ($shortY-($y+1))/$shortY;
|
|
}
|
|
elseif ( preg_match( '/^Down/', $dirn ) )
|
|
{
|
|
$yFactor = ($y+1)/$shortY;
|
|
}
|
|
if ( preg_match( '/Left$/', $dirn ) )
|
|
{
|
|
$xFactor = ($shortX-($x+1))/$shortX;
|
|
}
|
|
elseif ( preg_match( '/Right$/', $dirn ) )
|
|
{
|
|
$xFactor = ($x+1)/$shortX;
|
|
}
|
|
|
|
if ( $monitor['Orientation'] != '0' )
|
|
{
|
|
$conversions = array(
|
|
'90' => array(
|
|
'Up' => 'Left',
|
|
'Down' => 'Right',
|
|
'Left' => 'Down',
|
|
'Right' => 'Up',
|
|
'UpLeft' => 'DownLeft',
|
|
'UpRight' => 'UpLeft',
|
|
'DownLeft' => 'DownRight',
|
|
'DownRight' => 'UpRight',
|
|
),
|
|
'180' => array(
|
|
'Up' => 'Down',
|
|
'Down' => 'Up',
|
|
'Left' => 'Right',
|
|
'Right' => 'Left',
|
|
'UpLeft' => 'DownRight',
|
|
'UpRight' => 'DownLeft',
|
|
'DownLeft' => 'UpRight',
|
|
'DownRight' => 'UpLeft',
|
|
),
|
|
'270' => array(
|
|
'Up' => 'Right',
|
|
'Down' => 'Left',
|
|
'Left' => 'Up',
|
|
'Right' => 'Down',
|
|
'UpLeft' => 'UpRight',
|
|
'UpRight' => 'DownRight',
|
|
'DownLeft' => 'UpLeft',
|
|
'DownRight' => 'DownLeft',
|
|
),
|
|
'hori' => array(
|
|
'Up' => 'Up',
|
|
'Down' => 'Down',
|
|
'Left' => 'Right',
|
|
'Right' => 'Left',
|
|
'UpLeft' => 'UpRight',
|
|
'UpRight' => 'UpLeft',
|
|
'DownLeft' => 'DownRight',
|
|
'DownRight' => 'DownLeft',
|
|
),
|
|
'vert' => array(
|
|
'Up' => 'Down',
|
|
'Down' => 'Up',
|
|
'Left' => 'Left',
|
|
'Right' => 'Right',
|
|
'UpLeft' => 'DownLeft',
|
|
'UpRight' => 'DownRight',
|
|
'DownLeft' => 'UpLeft',
|
|
'DownRight' => 'UpRight',
|
|
),
|
|
);
|
|
$newDirn = $conversions[$monitor['Orientation']][$dirn];
|
|
$control = preg_replace( "/_$dirn\$/", "_$newDirn", $control );
|
|
$dirn = $newDirn;
|
|
}
|
|
|
|
if ( $monitor['HasPanSpeed'] && $xFactor )
|
|
{
|
|
if ( $monitor['HasTurboPan'] )
|
|
{
|
|
if ( $xFactor >= $turbo )
|
|
{
|
|
$panSpeed = $monitor['TurboPanSpeed'];
|
|
}
|
|
else
|
|
{
|
|
$xFactor = $xFactor/$turbo;
|
|
$panSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$xFactor)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$panSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$xFactor)));
|
|
}
|
|
$ctrlCommand .= " --panspeed=".$panSpeed;
|
|
}
|
|
if ( $monitor['HasTiltSpeed'] && $yFactor )
|
|
{
|
|
if ( $monitor['HasTurboTilt'] )
|
|
{
|
|
if ( $yFactor >= $turbo )
|
|
{
|
|
$tiltSpeed = $monitor['TurboTiltSpeed'];
|
|
}
|
|
else
|
|
{
|
|
$yFactor = $yFactor/$turbo;
|
|
$tiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$yFactor)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$tiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$yFactor)));
|
|
}
|
|
$ctrlCommand .= " --tiltspeed=".$tiltSpeed;
|
|
}
|
|
switch( $mode )
|
|
{
|
|
case 'Rel' :
|
|
case 'Abs' :
|
|
{
|
|
if ( preg_match( '/(Left|Right)$/', $dirn ) )
|
|
{
|
|
$panStep = intval(round($monitor['MinPanStep']+(($monitor['MaxPanStep']-$monitor['MinPanStep'])*$xFactor)));
|
|
$ctrlCommand .= " --panstep=".$panStep;
|
|
}
|
|
if ( preg_match( '/^(Up|Down)/', $dirn ) )
|
|
{
|
|
$tiltStep = intval(round($monitor['MinTiltStep']+(($monitor['MaxTiltStep']-$monitor['MinTiltStep'])*$yFactor)));
|
|
$ctrlCommand .= " --tiltstep=".$tiltStep;
|
|
}
|
|
break;
|
|
}
|
|
case 'Con' :
|
|
{
|
|
if ( $monitor['AutoStopTimeout'] )
|
|
{
|
|
$slowPanSpeed = intval(round($monitor['MinPanSpeed']+(($monitor['MaxPanSpeed']-$monitor['MinPanSpeed'])*$slow)));
|
|
$slowTiltSpeed = intval(round($monitor['MinTiltSpeed']+(($monitor['MaxTiltSpeed']-$monitor['MinTiltSpeed'])*$slow)));
|
|
if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) )
|
|
{
|
|
$ctrlCommand .= " --autostop";
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( preg_match( '/^presetGoto(\d+)$/', $control, $matches ) )
|
|
{
|
|
$control = 'presetGoto';
|
|
$ctrlCommand .= " --preset=".$matches[1];
|
|
}
|
|
elseif ( $control == "presetSet" )
|
|
{
|
|
if ( canEdit( 'Control' ) )
|
|
{
|
|
$preset = validInt($_REQUEST['preset']);
|
|
$newLabel = validJsStr($_REQUEST['newLabel']);
|
|
$row = dbFetchOne( "select * from ControlPresets where MonitorId = '".$monitor['Id']."' and Preset = '".dbEscape($preset)."'" );
|
|
if ( $newLabel != $row['Label'] )
|
|
{
|
|
if ( $newLabel )
|
|
$sql = "replace into ControlPresets ( MonitorId, Preset, Label ) values ( '".$monitor['Id']."', '".dbEscape($preset)."', '".dbEscape($newLabel)."' )";
|
|
else
|
|
$sql = "delete from ControlPresets where MonitorId = '".$monitor['Id']."' and Preset = '".dbEscape($preset)."'";
|
|
dbQuery( $sql );
|
|
$refreshParent = true;
|
|
}
|
|
$ctrlCommand .= " --preset=".$preset;
|
|
}
|
|
$view = 'none';
|
|
}
|
|
}
|
|
if ( $control != 'null' )
|
|
{
|
|
$ctrlCommand .= " --command=".$control;
|
|
$socket = socket_create( AF_UNIX, SOCK_STREAM, 0 );
|
|
if ( $socket < 0 )
|
|
{
|
|
die( "socket_create() failed: ".socket_strerror($socket) );
|
|
}
|
|
$sockFile = ZM_PATH_SOCKS.'/zmcontrol-'.$monitor[Id].'.sock';
|
|
if ( @socket_connect( $socket, $sockFile ) )
|
|
{
|
|
$options = array();
|
|
foreach ( split( " ", $ctrlCommand ) as $option )
|
|
{
|
|
if ( preg_match( '/--([^=]+)(?:=(.+))?/', $option, $matches ) )
|
|
{
|
|
$options[$matches[1]] = $matches[2]?$matches[2]:1;
|
|
}
|
|
}
|
|
$optionString = serialize( $options );
|
|
if ( !socket_write( $socket, $optionString ) )
|
|
{
|
|
die( "Can't write to control socket: ".socket_strerror(socket_last_error($socket)) );
|
|
}
|
|
socket_close( $socket );
|
|
}
|
|
else
|
|
{
|
|
$ctrlCommand .= " --id=".$monitor['Id'];
|
|
|
|
// Can't connect so use script
|
|
$ctrlOutput = exec( escapeshellcmd( $ctrlCommand ) );
|
|
}
|
|
}
|
|
}
|
|
elseif ( $action == "settings" )
|
|
{
|
|
$zmuCommand = getZmuCommand( " -m ".$mid." -B".$_REQUEST['newBrightness']." -C".$_REQUEST['newContrast']." -H".$_REQUEST['newHue']." -O".$_REQUEST['newColour'] );
|
|
$zmuOutput = exec( escapeshellcmd( $zmuCommand ) );
|
|
list( $brightness, $contrast, $hue, $colour ) = split( ' ', $zmuOutput );
|
|
dbQuery( "update Monitors set Brightness = '".$brightness."', Contrast = '".$contrast."', Hue = '".$hue."', Colour = '".$colour."' where Id = '".$mid."'" );
|
|
}
|
|
}
|
|
|
|
// Control capability actions, require control edit permissions
|
|
if ( canEdit( 'Control' ) )
|
|
{
|
|
if ( $action == "controlcap" )
|
|
{
|
|
if ( !empty($_REQUEST['cid']) )
|
|
{
|
|
$control = dbFetchOne( "select * from Controls where Id = '".dbEscape($_REQUEST['cid'])."'" );
|
|
}
|
|
else
|
|
{
|
|
$control = array();
|
|
}
|
|
|
|
// Define a field type for anything that's not simple text equivalent
|
|
$types = array(
|
|
// Empty
|
|
);
|
|
|
|
$columns = getTableColumns( 'Controls' );
|
|
foreach ( $columns as $name=>$type )
|
|
{
|
|
if ( preg_match( '/^(Can|Has)/', $name ) )
|
|
{
|
|
$types[$name] = 'toggle';
|
|
}
|
|
}
|
|
$changes = getFormChanges( $control, $_REQUEST['newControl'], $types, $columns );
|
|
|
|
if ( count( $changes ) )
|
|
{
|
|
if ( !empty($_REQUEST['cid']) )
|
|
{
|
|
dbQuery( "update Controls set ".implode( ", ", $changes )." where Id = '".dbEscape($_REQUEST['cid'])."'" );
|
|
}
|
|
else
|
|
{
|
|
dbQuery( "insert into Controls set ".implode( ", ", $changes ) );
|
|
//$_REQUEST['cid'] = dbInsertId();
|
|
}
|
|
$refreshParent = true;
|
|
}
|
|
$view = 'none';
|
|
}
|
|
elseif ( $action == "delete" )
|
|
{
|
|
if ( isset($_REQUEST['markCids']) )
|
|
{
|
|
foreach( $_REQUEST['markCids'] as $markCid )
|
|
{
|
|
dbQuery( "delete from Controls where Id = '".dbEscape($markCid)."'" );
|
|
dbQuery( "update Monitors set Controllable = 0, ControlId = 0 where ControlId = '".dbEscape($markCid)."'" );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Monitor edit actions, require a monitor id and edit permissions for that monitor
|
|
if ( !empty($_REQUEST['mid']) && canEdit( 'Monitors', $_REQUEST['mid'] ) )
|
|
{
|
|
$mid = validInt($_REQUEST['mid']);
|
|
if ( $action == "function" )
|
|
{
|
|
$monitor = dbFetchOne( "select * from Monitors where Id = '".$mid."'" );
|
|
|
|
$newFunction = validStr($_REQUEST['newFunction']);
|
|
$newEnabled = validStr($_REQUEST['newEnabled']);
|
|
$oldFunction = $monitor['Function'];
|
|
$oldEnabled = $monitor['Enabled'];
|
|
if ( $newFunction != $oldFunction || $newEnabled != $oldEnabled )
|
|
{
|
|
dbQuery( "update Monitors set Function = '".dbEscape($newFunction)."', Enabled = '".$newEnabled."' where Id = '".$mid."'" );
|
|
|
|
$monitor['Function'] = $newFunction;
|
|
$monitor['Enabled'] = $newEnabled;
|
|
//if ( $cookies ) session_write_close();
|
|
if ( daemonCheck() )
|
|
{
|
|
$restart = ($oldFunction == 'None') || ($newFunction == 'None') || ($newEnabled != $oldEnabled);
|
|
zmcControl( $monitor, $restart?"restart":"" );
|
|
zmaControl( $monitor, "reload" );
|
|
}
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
elseif ( $action == "zone" && isset( $_REQUEST['zid'] ) )
|
|
{
|
|
$zid = validInt($_REQUEST['zid']);
|
|
$monitor = dbFetchOne( "select * from Monitors where Id = '".dbEscape($mid)."'" );
|
|
|
|
if ( !empty($zid) )
|
|
{
|
|
$zone = dbFetchOne( "select * from Zones where MonitorId = '".dbEscape($mid)."' and Id = '".dbEscape($zid)."'" );
|
|
}
|
|
else
|
|
{
|
|
$zone = array();
|
|
}
|
|
|
|
if ( $_REQUEST['newZone']['Units'] == 'Percent' )
|
|
{
|
|
$_REQUEST['newZone']['MinAlarmPixels'] = intval(($_REQUEST['newZone']['MinAlarmPixels']*$_REQUEST['newZone']['Area'])/100);
|
|
$_REQUEST['newZone']['MaxAlarmPixels'] = intval(($_REQUEST['newZone']['MaxAlarmPixels']*$_REQUEST['newZone']['Area'])/100);
|
|
if ( isset($_REQUEST['newZone']['MinFilterPixels']) )
|
|
$_REQUEST['newZone']['MinFilterPixels'] = intval(($_REQUEST['newZone']['MinFilterPixels']*$_REQUEST['newZone']['Area'])/100);
|
|
if ( isset($_REQUEST['newZone']['MaxFilterPixels']) )
|
|
$_REQUEST['newZone']['MaxFilterPixels'] = intval(($_REQUEST['newZone']['MaxFilterPixels']*$_REQUEST['newZone']['Area'])/100);
|
|
if ( isset($_REQUEST['newZone']['MinBlobPixels']) )
|
|
$_REQUEST['newZone']['MinBlobPixels'] = intval(($_REQUEST['newZone']['MinBlobPixels']*$_REQUEST['newZone']['Area'])/100);
|
|
if ( isset($_REQUEST['newZone']['MaxBlobPixels']) )
|
|
$_REQUEST['newZone']['MaxBlobPixels'] = intval(($_REQUEST['newZone']['MaxBlobPixels']*$_REQUEST['newZone']['Area'])/100);
|
|
}
|
|
|
|
unset( $_REQUEST['newZone']['Points'] );
|
|
$types = array();
|
|
$changes = getFormChanges( $zone, $_REQUEST['newZone'], $types );
|
|
|
|
if ( count( $changes ) )
|
|
{
|
|
if ( $zid > 0 )
|
|
{
|
|
$sql = "update Zones set ".implode( ", ", $changes )." where MonitorId = '".dbEscape($mid)."' and Id = '".dbEscape($zid)."'";
|
|
}
|
|
else
|
|
{
|
|
$sql = "insert into Zones set MonitorId = '".dbEscape($mid)."', ".implode( ", ", $changes );
|
|
}
|
|
dbQuery( $sql );
|
|
//if ( $cookies ) session_write_close();
|
|
if ( daemonCheck() )
|
|
{
|
|
zmaControl( $mid, "restart" );
|
|
}
|
|
$refreshParent = true;
|
|
}
|
|
$view = 'none';
|
|
}
|
|
elseif ( $action == "sequence" && isset($_REQUEST['smid']) )
|
|
{
|
|
$smid = validInt($_REQUEST['smid']);
|
|
$monitor = dbFetchOne( "select * from Monitors where Id = '".dbEscape($mid)."'" );
|
|
$smonitor = dbFetchOne( "select * from Monitors where Id = '".dbEscape($smid)."'" );
|
|
|
|
dbQuery( "update Monitors set Sequence = '".$smonitor['Sequence']."' where Id = '".$monitor['Id']."'" );
|
|
dbQuery( "update Monitors set Sequence = '".$monitor['Sequence']."' where Id = '".$smonitor['Id']."'" );
|
|
|
|
$refreshParent = true;
|
|
fixSequences();
|
|
}
|
|
if ( $action == "delete" )
|
|
{
|
|
if ( isset($_REQUEST['markZids']) )
|
|
{
|
|
$deletedZid = 0;
|
|
foreach( $_REQUEST['markZids'] as $markZid )
|
|
{
|
|
dbQuery( "delete from Zones where MonitorId = '".dbEscape($mid)."' && Id = '".dbEscape($markZid)."'" );
|
|
$deletedZid = 1;
|
|
}
|
|
if ( $deletedZid )
|
|
{
|
|
//if ( $cookies )
|
|
//session_write_close();
|
|
if ( daemonCheck() )
|
|
zmaControl( $mid, "restart" );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Monitor edit actions, monitor id derived, require edit permissions for that monitor
|
|
if ( canEdit( 'Monitors' ) )
|
|
{
|
|
if ( $action == "monitor" )
|
|
{
|
|
if ( !empty($_REQUEST['mid']) )
|
|
{
|
|
$mid = validInt($_REQUEST['mid']);
|
|
$monitor = dbFetchOne( "select * from Monitors where Id = '".dbEscape($mid)."'" );
|
|
|
|
if ( ZM_OPT_X10 )
|
|
{
|
|
$x10Monitor = dbFetchOne( "select * from TriggersX10 where MonitorId = '".dbEscape($mid)."'" );
|
|
if ( !$x10Monitor )
|
|
$x10Monitor = array();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$monitor = array();
|
|
if ( ZM_OPT_X10 )
|
|
{
|
|
$x10Monitor = array();
|
|
}
|
|
}
|
|
|
|
// Define a field type for anything that's not simple text equivalent
|
|
$types = array(
|
|
'Triggers' => 'set',
|
|
'Controllable' => 'toggle',
|
|
'TrackMotion' => 'toggle',
|
|
);
|
|
|
|
$columns = getTableColumns( 'Monitors' );
|
|
$changes = getFormChanges( $monitor, $_REQUEST['newMonitor'], $types, $columns );
|
|
|
|
if ( count( $changes ) )
|
|
{
|
|
if ( !empty($_REQUEST['mid']) )
|
|
{
|
|
$mid = validInt($_REQUEST['mid']);
|
|
$sql = "update Monitors set ".implode( ", ", $changes )." where Id = '".dbEscape($mid)."'";
|
|
dbQuery( $sql );
|
|
if ( isset($changes['Name']) )
|
|
{
|
|
exec( escapeshellcmd( "mv ".ZM_DIR_EVENTS."/".$monitor['Name']." ".ZM_DIR_EVENTS."/".$_REQUEST['newMonitor']['Name'] ) );
|
|
}
|
|
if ( isset($changes['Width']) || isset($changes['Height']) )
|
|
{
|
|
$newW = $_REQUEST['newMonitor']['Width'];
|
|
$newH = $_REQUEST['newMonitor']['Height'];
|
|
$newA = $newW * $newH;
|
|
$oldW = $monitor['Width'];
|
|
$oldH = $monitor['Height'];
|
|
$oldA = $oldW * $oldH;
|
|
|
|
$zones = dbFetchAll( "select * from Zones where MonitorId = '".dbEscape($mid)."'" );
|
|
foreach ( $zones as $zone )
|
|
{
|
|
$newZone = $zone;
|
|
$points = coordsToPoints( $zone['Coords'] );
|
|
for ( $i = 0; $i < count($points); $i++ )
|
|
{
|
|
$points[$i]['x'] = intval(($points[$i]['x']*($newW-1))/($oldW-1));
|
|
$points[$i]['y'] = intval(($points[$i]['y']*($newH-1))/($oldH-1));
|
|
}
|
|
$newZone['Coords'] = pointsToCoords( $points );
|
|
$newZone['Area'] = intval(round(($zone['Area']*$newA)/$oldA));
|
|
$newZone['MinAlarmPixels'] = intval(round(($newZone['MinAlarmPixels']*$newA)/$oldA));
|
|
$newZone['MaxAlarmPixels'] = intval(round(($newZone['MaxAlarmPixels']*$newA)/$oldA));
|
|
$newZone['MinFilterPixels'] = intval(round(($newZone['MinFilterPixels']*$newA)/$oldA));
|
|
$newZone['MaxFilterPixels'] = intval(round(($newZone['MaxFilterPixels']*$newA)/$oldA));
|
|
$newZone['MinBlobPixels'] = intval(round(($newZone['MinBlobPixels']*$newA)/$oldA));
|
|
$newZone['MaxBlobPixels'] = intval(round(($newZone['MaxBlobPixels']*$newA)/$oldA));
|
|
|
|
$changes = getFormChanges( $zone, $newZone, $types );
|
|
|
|
if ( count( $changes ) )
|
|
{
|
|
dbQuery( "update Zones set ".implode( ", ", $changes )." where MonitorId = '".dbEscape($mid)."' and Id = '".$zone['Id']."'" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
elseif ( !$user['MonitorIds'] )
|
|
{
|
|
$maxSeq = dbFetchOne( "select max(Sequence) as MaxSequence from Monitors", "MaxSequence" );
|
|
$changes[] = "Sequence = ".($maxSeq+1);
|
|
|
|
dbQuery( "insert into Monitors set ".implode( ", ", $changes ) );
|
|
$mid = dbInsertId();
|
|
$zoneArea = $_REQUEST['newMonitor']['Width'] * $_REQUEST['newMonitor']['Height'];
|
|
dbQuery( "insert into Zones set MonitorId = ".dbEscape($mid).", Name = 'All', Type = 'Active', Units = 'Percent', NumCoords = 4, Coords = '".sprintf( "%d,%d %d,%d %d,%d %d,%d", 0, 0, $_REQUEST['newMonitor']['Width']-1, 0, $_REQUEST['newMonitor']['Width']-1, $_REQUEST['newMonitor']['Height']-1, 0, $_REQUEST['newMonitor']['Height']-1 )."', Area = ".$zoneArea.", AlarmRGB = 0xff0000, CheckMethod = 'Blobs', MinPixelThreshold = 25, MinAlarmPixels = ".intval(($zoneArea*3)/100).", MaxAlarmPixels = ".intval(($zoneArea*75)/100).", FilterX = 3, FilterY = 3, MinFilterPixels = ".intval(($zoneArea*3)/100).", MaxFilterPixels = ".intval(($zoneArea*75)/100).", MinBlobPixels = ".intval(($zoneArea*2)/100).", MinBlobs = 1" );
|
|
//$view = 'none';
|
|
mkdir( ZM_DIR_EVENTS.'/'.$mid, 0755 );
|
|
symlink( $mid, ZM_DIR_EVENTS.'/'.$_REQUEST['newMonitor']['Name'] );
|
|
}
|
|
$restart = true;
|
|
}
|
|
|
|
if ( ZM_OPT_X10 )
|
|
{
|
|
$x10Changes = getFormChanges( $x10Monitor, $_REQUEST['newX10Monitor'] );
|
|
|
|
if ( count( $x10Changes ) )
|
|
{
|
|
if ( $x10Monitor && isset($_REQUEST['newX10Monitor']) )
|
|
{
|
|
dbQuery( "update TriggersX10 set ".implode( ", ", $x10Changes )." where MonitorId = '".dbEscape($_REQUEST['mid'])."'" );
|
|
}
|
|
elseif ( !$user['MonitorIds'] )
|
|
{
|
|
if ( !$x10Monitor )
|
|
{
|
|
dbQuery( "insert into TriggersX10 set MonitorId = '".dbEscape($_REQUEST['mid'])."', ".implode( ", ", $x10Changes ) );
|
|
}
|
|
else
|
|
{
|
|
dbQuery( "delete from TriggersX10 where MonitorId = '".dbEscape($_REQUEST['mid'])."'" );
|
|
}
|
|
}
|
|
$restart = true;
|
|
}
|
|
}
|
|
|
|
if ( $restart )
|
|
{
|
|
$monitor = dbFetchOne( "select * from Monitors where Id = '".dbEscape($_REQUEST['mid'])."'" );
|
|
fixDevices();
|
|
//if ( $cookies )
|
|
//session_write_close();
|
|
if ( daemonCheck() )
|
|
{
|
|
zmcControl( $monitor, "restart" );
|
|
zmaControl( $monitor, "restart" );
|
|
}
|
|
//daemonControl( 'restart', 'zmwatch.pl' );
|
|
$refreshParent = true;
|
|
}
|
|
$view = 'none';
|
|
}
|
|
if ( $action == "delete" )
|
|
{
|
|
if ( isset($_REQUEST['markMids']) && !$user['MonitorIds'] )
|
|
{
|
|
foreach( $_REQUEST['markMids'] as $markMid )
|
|
{
|
|
if ( canEdit( 'Monitors', $markMid ) )
|
|
{
|
|
$sql = "select * from Monitors where Id = '".dbEscape($markMid)."'";
|
|
if ( !($monitor = dbFetchOne( $sql )) )
|
|
continue;
|
|
|
|
zmaControl( $monitor, "stop" );
|
|
zmcControl( $monitor, "stop" );
|
|
|
|
$sql = "select Id from Events where MonitorId = '".dbEscape($markMid)."'";
|
|
$markEids = dbFetchAll( $sql, 'Id' );
|
|
foreach( $markEids as $markEid )
|
|
deleteEvent( $markEid );
|
|
|
|
unlink( ZM_DIR_EVENTS."/".$monitor['Name'] );
|
|
system( "rm -rf ".ZM_DIR_EVENTS."/".$monitor['Id'] );
|
|
|
|
dbQuery( "delete from Zones where MonitorId = '".dbEscape($markMid)."'" );
|
|
if ( ZM_OPT_X10 )
|
|
dbQuery( "delete from TriggersX10 where MonitorId = '".dbEscape($markMid)."'" );
|
|
dbQuery( "delete from Monitors where Id = '".dbEscape($markMid)."'" );
|
|
|
|
fixSequences();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Device view actions
|
|
if ( canEdit( 'Devices' ) )
|
|
{
|
|
if ( $action == "device" )
|
|
{
|
|
if ( !empty($_REQUEST['command']) )
|
|
{
|
|
setDeviceStatusX10( $_REQUEST['key'], $_REQUEST['command'] );
|
|
}
|
|
elseif ( isset( $_REQUEST['newDevice'] ) )
|
|
{
|
|
if ( isset($_REQUEST['did']) )
|
|
{
|
|
dbQuery( "update Devices set Name = '".dbEscape($_REQUEST['newDevice']['Name'])."', KeyString = '".dbEscape($_REQUEST['newDevice']['KeyString'])."' where Id = '".dbEscape($_REQUEST['did'])."'" );
|
|
}
|
|
else
|
|
{
|
|
dbQuery( "insert into Devices set Name = '".dbEscape($_REQUEST['newDevice']['Name'])."', KeyString = '".dbEscape($_REQUEST['newDevice']['KeyString'])."'" );
|
|
}
|
|
$refreshParent = true;
|
|
$view = 'none';
|
|
}
|
|
}
|
|
elseif ( $action == "delete" )
|
|
{
|
|
if ( isset($_REQUEST['markDids']) )
|
|
{
|
|
foreach( $_REQUEST['markDids'] as $markDid )
|
|
{
|
|
dbQuery( "delete from Devices where Id = '".dbEscape($markDid)."'" );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// System view actions
|
|
if ( canView( 'System' ) )
|
|
{
|
|
if ( $action == "setgroup" )
|
|
{
|
|
if ( !empty($_REQUEST['gid']) )
|
|
{
|
|
setcookie( "zmGroup", validInt($_REQUEST['gid']), time()+3600*24*30*12*10 );
|
|
}
|
|
else
|
|
{
|
|
setcookie( "zmGroup", "", time()-3600*24*2 );
|
|
}
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
|
|
// System edit actions
|
|
if ( canEdit( 'System' ) )
|
|
{
|
|
if ( $action == "version" && isset($_REQUEST['option']) )
|
|
{
|
|
$option = $_REQUEST['option'];
|
|
switch( $option )
|
|
{
|
|
case 'go' :
|
|
{
|
|
// Ignore this, the caller will open the page itself
|
|
break;
|
|
}
|
|
case 'ignore' :
|
|
{
|
|
dbQuery( "update Config set Value = '".ZM_DYN_LAST_VERSION."' where Name = 'ZM_DYN_CURR_VERSION'" );
|
|
break;
|
|
}
|
|
case 'hour' :
|
|
case 'day' :
|
|
case 'week' :
|
|
{
|
|
$nextReminder = time();
|
|
if ( $option == 'hour' )
|
|
{
|
|
$nextReminder += 60*60;
|
|
}
|
|
elseif ( $option == 'day' )
|
|
{
|
|
$nextReminder += 24*60*60;
|
|
}
|
|
elseif ( $option == 'week' )
|
|
{
|
|
$nextReminder += 7*24*60*60;
|
|
}
|
|
dbQuery( "update Config set Value = '".$nextReminder."' where Name = 'ZM_DYN_NEXT_REMINDER'" );
|
|
break;
|
|
}
|
|
case 'never' :
|
|
{
|
|
dbQuery( "update Config set Value = '0' where Name = 'ZM_CHECK_FOR_UPDATES'" );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( $action == "donate" && isset($_REQUEST['option']) )
|
|
{
|
|
$option = $_REQUEST['option'];
|
|
switch( $option )
|
|
{
|
|
case 'go' :
|
|
{
|
|
// Ignore this, the caller will open the page itself
|
|
break;
|
|
}
|
|
case 'hour' :
|
|
case 'day' :
|
|
case 'week' :
|
|
case 'month' :
|
|
{
|
|
$nextReminder = time();
|
|
if ( $option == 'hour' )
|
|
{
|
|
$nextReminder += 60*60;
|
|
}
|
|
elseif ( $option == 'day' )
|
|
{
|
|
$nextReminder += 24*60*60;
|
|
}
|
|
elseif ( $option == 'week' )
|
|
{
|
|
$nextReminder += 7*24*60*60;
|
|
}
|
|
elseif ( $option == 'month' )
|
|
{
|
|
$nextReminder += 30*24*60*60;
|
|
}
|
|
dbQuery( "update Config set Value = '".$nextReminder."' where Name = 'ZM_DYN_DONATE_REMINDER_TIME'" );
|
|
break;
|
|
}
|
|
case 'never' :
|
|
case 'already' :
|
|
{
|
|
dbQuery( "update Config set Value = '0' where Name = 'ZM_DYN_SHOW_DONATE_REMINDER'" );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( $action == "options" && isset($_REQUEST['tab']) )
|
|
{
|
|
$configCat = $configCats[$_REQUEST['tab']];
|
|
$changed = false;
|
|
foreach ( $configCat as $name=>$value )
|
|
{
|
|
unset( $newValue );
|
|
if ( $value['Type'] == "boolean" && empty($_REQUEST['newConfig'][$name]) )
|
|
$newValue = 0;
|
|
elseif ( isset($_REQUEST['newConfig'][$name]) )
|
|
$newValue = preg_replace( "/\r\n/", "\n", stripslashes( $_REQUEST['newConfig'][$name] ) );
|
|
|
|
if ( isset($newValue) && ($newValue != $value['Value']) )
|
|
{
|
|
dbQuery( "update Config set Value = '".$newValue."' where Name = '".$name."'" );
|
|
$changed = true;
|
|
}
|
|
}
|
|
if ( $changed )
|
|
{
|
|
switch( $_REQUEST['tab'] )
|
|
{
|
|
case "system" :
|
|
case "config" :
|
|
case "paths" :
|
|
$restartWarning = true;
|
|
break;
|
|
case "web" :
|
|
case "tools" :
|
|
break;
|
|
case "debug" :
|
|
case "network" :
|
|
case "mail" :
|
|
case "ftp" :
|
|
$restartWarning = true;
|
|
break;
|
|
case "highband" :
|
|
case "medband" :
|
|
case "lowband" :
|
|
case "phoneband" :
|
|
break;
|
|
}
|
|
}
|
|
loadConfig( false );
|
|
}
|
|
elseif ( $action == "user" )
|
|
{
|
|
if ( !empty($_REQUEST['uid']) )
|
|
$dbUser = dbFetchOne( "select * from Users where Id = '".dbEscape($_REQUEST['uid'])."'" );
|
|
else
|
|
$dbUser = array();
|
|
|
|
$types = array();
|
|
$changes = getFormChanges( $dbUser, $_REQUEST['newUser'], $types );
|
|
|
|
if ( $_REQUEST['newUser']['Password'] )
|
|
$changes['Password'] = "Password = password('".dbEscape($_REQUEST['newUser']['Password'])."')";
|
|
else
|
|
unset( $changes['Password'] );
|
|
|
|
if ( count( $changes ) )
|
|
{
|
|
if ( !empty($_REQUEST['uid']) )
|
|
{
|
|
$sql = "update Users set ".implode( ", ", $changes )." where Id = '".dbEscape($_REQUEST['uid'])."'";
|
|
}
|
|
else
|
|
{
|
|
$sql = "insert into Users set ".implode( ", ", $changes );
|
|
}
|
|
dbQuery( $sql );
|
|
$refreshParent = true;
|
|
if ( $dbUser['Username'] == $user['Username'] )
|
|
userLogin( $dbUser['Username'], $dbUser['Password'] );
|
|
}
|
|
$view = 'none';
|
|
}
|
|
elseif ( $action == "state" )
|
|
{
|
|
if ( !empty($_REQUEST['runState']) )
|
|
{
|
|
//if ( $cookies ) session_write_close();
|
|
packageControl( $_REQUEST['runState'] );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
elseif ( $action == "save" )
|
|
{
|
|
if ( !empty($_REQUEST['runState']) || !empty($_REQUEST['newState']) )
|
|
{
|
|
$sql = "select Id,Function,Enabled from Monitors order by Id";
|
|
$definitions = array();
|
|
foreach( dbFetchAll( $sql ) as $monitor )
|
|
{
|
|
$definitions[] = $monitor['Id'].":".$monitor['Function'].":".$monitor['Enabled'];
|
|
}
|
|
$definition = join( ',', $definitions );
|
|
if ( $_REQUEST['newState'] )
|
|
$_REQUEST['runState'] = $_REQUEST['newState'];
|
|
dbQuery( "replace into States set Name = '".dbEscape($_REQUEST['runState'])."', Definition = '".dbEscape($definition)."'" );
|
|
}
|
|
}
|
|
elseif ( $action == "group" )
|
|
{
|
|
if ( !empty($_REQUEST['gid']) )
|
|
{
|
|
$sql = "update Groups set Name = '".dbEscape($_REQUEST['newGroup']['Name'])."', MonitorIds = '".dbEscape(join(',',$_REQUEST['newGroup']['MonitorIds']))."' where Id = '".dbEscape($_REQUEST['gid'])."'";
|
|
}
|
|
else
|
|
{
|
|
$sql = "insert into Groups set Name = '".dbEscape($_REQUEST['newGroup']['Name'])."', MonitorIds = '".dbEscape(join(',',$_REQUEST['newGroup']['MonitorIds']))."'";
|
|
}
|
|
dbQuery( $sql );
|
|
$refreshParent = true;
|
|
$view = 'none';
|
|
}
|
|
elseif ( $action == "delete" )
|
|
{
|
|
if ( isset($_REQUEST['runState']) )
|
|
dbQuery( "delete from States where Name = '".dbEscape($_REQUEST['runState'])."'" );
|
|
|
|
if ( isset($_REQUEST['markUids']) )
|
|
{
|
|
foreach( $_REQUEST['markUids'] as $markUid )
|
|
dbQuery( "delete from Users where Id = '".dbEscape($markUid)."'" );
|
|
if ( $markUid == $user['Id'] )
|
|
userLogout();
|
|
}
|
|
if ( !empty($_REQUEST['gid']) )
|
|
{
|
|
dbQuery( "delete from Groups where Id = '".dbEscape($_REQUEST['gid'])."'" );
|
|
if ( $_REQUEST['gid'] == $_COOKIE['zmGroup'] )
|
|
{
|
|
unset( $_COOKIE['zmGroup'] );
|
|
setcookie( "zmGroup", "", time()-3600*24*2 );
|
|
$refreshParent = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ZM_USER_SELF_EDIT && $action == "user" )
|
|
{
|
|
$uid = $user['Id'];
|
|
|
|
$dbUser = dbFetchOne( "select Id, Password, Language from Users where Id = '".dbEscape($uid)."'" );
|
|
|
|
$types = array();
|
|
$changes = getFormChanges( $dbUser, $_REQUEST['newUser'], $types );
|
|
|
|
if ( !empty($_REQUEST['newUser']['Password']) )
|
|
$changes['Password'] = "Password = password('".dbEscape($_REQUEST['newUser']['Password'])."')";
|
|
else
|
|
unset( $changes['Password'] );
|
|
if ( count( $changes ) )
|
|
{
|
|
$sql = "update Users set ".implode( ", ", $changes )." where Id = '".dbEscape($uid)."'";
|
|
dbQuery( $sql );
|
|
$refreshParent = true;
|
|
}
|
|
$view = 'none';
|
|
}
|
|
}
|
|
|
|
if ( $action == "reset" )
|
|
{
|
|
$_SESSION['zmEventResetTime'] = strftime( STRF_FMT_DATETIME_DB );
|
|
setcookie( "zmEventResetTime", $_SESSION['zmEventResetTime'], time()+3600*24*30*12*10 );
|
|
//if ( $cookies ) session_write_close();
|
|
}
|
|
}
|
|
|
|
?>
|