2014-04-23 11:13:56 +08:00
|
|
|
<?php
|
|
|
|
App::uses('AppModel', 'Model');
|
|
|
|
/**
|
|
|
|
* Monitor Model
|
|
|
|
*
|
|
|
|
* @property Event $Event
|
|
|
|
* @property Zone $Zone
|
|
|
|
*/
|
|
|
|
class Monitor extends AppModel {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use table
|
|
|
|
*
|
|
|
|
* @var mixed False or table name
|
|
|
|
*/
|
|
|
|
public $useTable = 'Monitors';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Primary key field
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $primaryKey = 'Id';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Display field
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $displayField = 'Name';
|
|
|
|
|
2015-06-11 10:58:58 +08:00
|
|
|
public $recursive = -1;
|
|
|
|
|
2014-04-23 11:13:56 +08:00
|
|
|
/**
|
|
|
|
* Validation rules
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
public $validate = array(
|
|
|
|
'Id' => array(
|
|
|
|
'numeric' => array(
|
|
|
|
'rule' => array('numeric'),
|
|
|
|
//'message' => 'Your custom message here',
|
|
|
|
//'allowEmpty' => false,
|
|
|
|
//'required' => false,
|
|
|
|
//'last' => false, // Stop validation after this rule
|
|
|
|
//'on' => 'create', // Limit validation to 'create' or 'update' operations
|
|
|
|
),
|
|
|
|
),
|
2019-11-02 20:30:25 +08:00
|
|
|
'Name' => array(
|
|
|
|
'required' => array(
|
|
|
|
'on' => 'create',
|
2019-11-20 22:32:19 +08:00
|
|
|
'rule' => 'notBlank',
|
2019-11-02 20:30:25 +08:00
|
|
|
'message' => 'Monitor Name must be specified for creation',
|
|
|
|
'required' => true,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
);
|
2014-04-23 11:13:56 +08:00
|
|
|
|
|
|
|
//The Associations below have been created with all possible keys, those that are not needed can be removed
|
|
|
|
|
|
|
|
/**
|
|
|
|
* hasMany associations
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
public $hasMany = array(
|
|
|
|
'Event' => array(
|
|
|
|
'className' => 'Event',
|
|
|
|
'foreignKey' => 'MonitorId',
|
|
|
|
'dependent' => false,
|
|
|
|
'conditions' => '',
|
|
|
|
'fields' => '',
|
|
|
|
'order' => '',
|
|
|
|
'limit' => '',
|
|
|
|
'offset' => '',
|
|
|
|
'exclusive' => '',
|
|
|
|
'finderQuery' => '',
|
|
|
|
'counterQuery' => ''
|
|
|
|
),
|
|
|
|
'Zone' => array(
|
|
|
|
'className' => 'Zone',
|
|
|
|
'foreignKey' => 'MonitorId',
|
2014-04-25 10:33:02 +08:00
|
|
|
'dependent' => true,
|
2014-04-23 11:13:56 +08:00
|
|
|
'conditions' => '',
|
|
|
|
'fields' => '',
|
|
|
|
'order' => '',
|
|
|
|
'limit' => '',
|
|
|
|
'offset' => '',
|
|
|
|
'exclusive' => '',
|
|
|
|
'finderQuery' => '',
|
|
|
|
'counterQuery' => ''
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
2017-12-05 04:52:16 +08:00
|
|
|
/**
|
2018-01-02 03:43:02 +08:00
|
|
|
* hasMany associations
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
2017-12-05 04:52:16 +08:00
|
|
|
public $hasAndBelongsToMany = array(
|
|
|
|
'Group' => array(
|
|
|
|
'className' => 'Group',
|
|
|
|
'joinTable' => 'Groups_Monitors',
|
|
|
|
'foreignKey' => 'MonitorId',
|
|
|
|
'associationForeignKey' => 'GroupId',
|
|
|
|
'unique' => true,
|
|
|
|
'dependent' => false,
|
|
|
|
'conditions' => '',
|
|
|
|
'fields' => '',
|
|
|
|
'order' => '',
|
|
|
|
'limit' => '',
|
|
|
|
'offset' => '',
|
|
|
|
'exclusive' => '',
|
|
|
|
'finderQuery' => '',
|
|
|
|
'counterQuery' => ''
|
|
|
|
),
|
|
|
|
);
|
2018-01-02 03:43:02 +08:00
|
|
|
public $actsAs = array(
|
|
|
|
'CakePHP-Enum-Behavior.Enum' => array(
|
2020-03-26 14:21:34 +08:00
|
|
|
'Type' => array('Local','Remote','File','Ffmpeg','Libvlc','cURL','WebSite', 'VNC'),
|
2019-11-30 03:26:03 +08:00
|
|
|
'Function' => array('None','Monitor','Modect','Record','Mocord','Nodect'),
|
2019-11-30 02:48:02 +08:00
|
|
|
'Orientation' => array('ROTATE_0','ROTATE_90','ROTATE_180','ROTATE_270','FLIP_HORI','FLIP_VERT'),
|
2019-11-30 03:26:03 +08:00
|
|
|
'OutputCodec' => array('h264','mjpeg','mpeg1','mpeg2'),
|
|
|
|
'OutputContainer' => array('auto','mp4','mkv'),
|
|
|
|
'DefaultView' => array('Events','Control'),
|
2018-10-31 23:08:44 +08:00
|
|
|
#'Status' => array('Unknown','NotRunning','Running','NoSignal','Signal'),
|
2018-01-02 03:43:02 +08:00
|
|
|
)
|
|
|
|
);
|
2017-12-05 04:52:16 +08:00
|
|
|
|
2018-10-31 23:08:44 +08:00
|
|
|
public $hasOne = array(
|
|
|
|
'Monitor_Status' => array(
|
|
|
|
'className' => 'Monitor_Status',
|
|
|
|
'foreignKey' => 'MonitorId',
|
|
|
|
'joinTable' => 'Monitor_Status',
|
|
|
|
)
|
|
|
|
);
|
2020-12-24 02:48:12 +08:00
|
|
|
|
|
|
|
public function daemonControl($monitor, $command, $daemon=null) {
|
|
|
|
if ( $monitor['Function'] == 'None' ) {
|
|
|
|
ZM\Debug('Calling daemonControl when Function == None');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ( defined('ZM_SERVER_ID') and ($monitor['ServerId']!=ZM_SERVER_ID) ) {
|
2021-01-28 00:44:25 +08:00
|
|
|
ZM\Error('Calling daemonControl for Monitor assigned to different server. Our server id '.ZM_SERVER_ID.' != '.$monitor['ServerId']);
|
2020-12-24 02:48:12 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$daemons = array();
|
|
|
|
if ( ! $daemon ) {
|
2021-02-02 06:29:16 +08:00
|
|
|
array_push($daemons, 'zmc');
|
2020-12-24 02:48:12 +08:00
|
|
|
} else {
|
|
|
|
array_push($daemons, $daemon);
|
|
|
|
}
|
|
|
|
|
|
|
|
$status_text = '';
|
|
|
|
foreach ( $daemons as $daemon ) {
|
|
|
|
$args = '';
|
|
|
|
if ( $daemon == 'zmc' and $monitor['Type'] == 'Local' ) {
|
|
|
|
$args = '-d ' . $monitor['Device'];
|
|
|
|
} else if ( $daemon == 'zmcontrol.pl' ) {
|
|
|
|
$args = '--id '.$monitor['Id'];
|
|
|
|
} else {
|
|
|
|
$args = '-m ' . $monitor['Id'];
|
|
|
|
}
|
|
|
|
|
|
|
|
$shellcmd = escapeshellcmd(ZM_PATH_BIN.'/zmdc.pl '.$command.' '.$daemon.' '.$args);
|
|
|
|
ZM\Debug("Command $shellcmd");
|
|
|
|
$status = exec($shellcmd);
|
|
|
|
$status_text .= $status.PHP_EOL;
|
|
|
|
} # end foreach daemon
|
|
|
|
return $status_text;
|
|
|
|
} # end function daemonControl
|
2014-04-23 11:13:56 +08:00
|
|
|
}
|