2002-09-24 06:08:50 +08:00
|
|
|
//
|
2002-12-10 21:21:41 +08:00
|
|
|
// ZoneMinder Control Utility, $Date$, $Revision$
|
2008-07-25 17:33:23 +08:00
|
|
|
// Copyright (C) 2001-2008 Philip Coombes
|
2002-09-24 06:08:50 +08:00
|
|
|
//
|
|
|
|
// 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
|
2016-12-26 23:23:16 +08:00
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2002-09-24 06:08:50 +08:00
|
|
|
//
|
|
|
|
|
2015-06-21 06:11:20 +08:00
|
|
|
/*
|
|
|
|
|
|
|
|
=head1 NAME
|
|
|
|
|
|
|
|
zmc - The ZoneMinder Utility
|
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
|
|
zmu -d device_path [-v] [function] [-U<username> -P<password>]
|
|
|
|
zmu --device device_path [-v] [function] [-U<username> -P<password>]
|
|
|
|
|
|
|
|
zmu -m monitor_id [-v] [function] [-U<username> -P<password>]
|
|
|
|
zmu --monitor monitor_id [-v] [function] [-U<username> -P<password>]
|
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
2015-07-15 22:36:31 +08:00
|
|
|
This binary is a handy command line interface to several useful functions. It's
|
2015-06-21 06:11:20 +08:00
|
|
|
not really meant to be used by anyone except the web page (there's only limited
|
|
|
|
'help' in it so far) but can be if necessary, especially for debugging video
|
|
|
|
problems.
|
|
|
|
|
|
|
|
=head1 OPTIONS
|
|
|
|
|
|
|
|
General options:
|
|
|
|
-v, --verbose - Produce more verbose output
|
|
|
|
-l, --list - List the current status of active (or all with -v) monitors
|
|
|
|
-h, --help - Display usage information
|
|
|
|
-v, --version - Print the installed version of ZoneMinder
|
|
|
|
|
|
|
|
Options for use with devices:
|
|
|
|
-d, --device [device_path] - Get the current video device settings for [device_path] or all devices
|
|
|
|
-V, --version <V4L version> - Set the Video 4 Linux API version to use for the query, use 1 or 2
|
|
|
|
-q, --query - Query the current settings for the device
|
|
|
|
|
|
|
|
Options for use with monitors:
|
|
|
|
-m, --monitor <monitor_id> - Specify which monitor to address, default 1 if absent
|
|
|
|
-q, --query - Query the current settings for the monitor
|
|
|
|
-s, --state - Output the current monitor state, 0 = idle, 1 = prealarm, 2 = alarm,
|
|
|
|
3 = alert, 4 = tape
|
|
|
|
-B, --brightness [value] - Output the current brightness, set to value if given
|
|
|
|
-C, --contrast [value] - Output the current contrast, set to value if given
|
|
|
|
-H, --hue [value] - Output the current hue, set to value if given
|
|
|
|
-O, --colour [value] - Output the current colour, set to value if given
|
|
|
|
-i, --image [image_index] - Write captured image to disk as <monitor_name>.jpg, last image captured
|
|
|
|
or specified ring buffer index if given.
|
|
|
|
-S, --scale <scale_%%ge> - With --image specify any scaling (in %%) to be applied to the image
|
|
|
|
-t, --timestamp [image_index] - Output captured image timestamp, last image captured or specified
|
|
|
|
ring buffer index if given
|
|
|
|
-R, --read_index - Output ring buffer read index
|
|
|
|
-W, --write_index - Output ring buffer write index
|
|
|
|
-e, --event - Output last event index
|
|
|
|
-f, --fps - Output last Frames Per Second captured reading
|
|
|
|
-z, --zones - Write last captured image overlaid with zones to <monitor_name>-Zones.jpg
|
|
|
|
-a, --alarm - Force alarm in monitor, this will trigger recording until cancelled with -c
|
|
|
|
-n, --noalarm - Force no alarms in monitor, this will prevent alarms until cancelled with -c
|
|
|
|
-c, --cancel - Cancel a forced alarm/noalarm in monitor, required after being enabled with -a or -n
|
|
|
|
-L, --reload - Signal monitor to reload settings
|
|
|
|
-E, --enable - Enable detection, wake monitor up
|
|
|
|
-D, --disable - Disable detection, put monitor to sleep
|
|
|
|
-u, --suspend - Suspend detection, useful to prevent bogus alarms when panning etc
|
|
|
|
-r, --resume - Resume detection after a suspend
|
|
|
|
-U, --username <username> - When running in authenticated mode the username and
|
|
|
|
-P, --password <password> - password combination of the given user
|
|
|
|
-A, --auth <authentication> - Pass authentication hash string instead of user details
|
|
|
|
|
|
|
|
=cut
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2002-09-16 17:19:24 +08:00
|
|
|
#include <getopt.h>
|
2003-03-26 20:00:16 +08:00
|
|
|
|
2002-09-16 17:19:24 +08:00
|
|
|
#include "zm.h"
|
2003-03-26 20:00:16 +08:00
|
|
|
#include "zm_db.h"
|
2005-01-19 09:50:24 +08:00
|
|
|
#include "zm_user.h"
|
2006-04-05 20:22:27 +08:00
|
|
|
#include "zm_signal.h"
|
2003-03-26 20:00:16 +08:00
|
|
|
#include "zm_monitor.h"
|
|
|
|
#include "zm_local_camera.h"
|
2002-09-16 17:19:24 +08:00
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
void Usage( int status=-1 ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "zmu <-d device_path> [-v] [function] [-U<username> -P<password>]\n" );
|
|
|
|
fprintf( stderr, "zmu <-m monitor_id> [-v] [function] [-U<username> -P<password>]\n" );
|
|
|
|
fprintf( stderr, "General options:\n" );
|
|
|
|
fprintf( stderr, " -h, --help : This screen\n" );
|
|
|
|
fprintf( stderr, " -v, --verbose : Produce more verbose output\n" );
|
|
|
|
fprintf( stderr, " -l, --list : List the current status of active (or all with -v) monitors\n" );
|
|
|
|
fprintf( stderr, "Options for use with devices:\n" );
|
|
|
|
fprintf( stderr, " -d, --device [device_path] : Get the current video device settings for [device_path] or all devices\n" );
|
|
|
|
fprintf( stderr, " -V, --version <V4L version> : Set the Video 4 Linux API version to use for the query, use 1 or 2\n" );
|
|
|
|
fprintf( stderr, " -q, --query : Query the current settings for the device\n" );
|
|
|
|
fprintf( stderr, "Options for use with monitors:\n" );
|
|
|
|
fprintf( stderr, " -m, --monitor <monitor_id> : Specify which monitor to address, default 1 if absent\n" );
|
|
|
|
fprintf( stderr, " -q, --query : Query the current settings for the monitor\n" );
|
|
|
|
fprintf( stderr, " -s, --state : Output the current monitor state, 0 = idle, 1 = prealarm, 2 = alarm,\n" );
|
|
|
|
fprintf( stderr, " 3 = alert, 4 = tape\n" );
|
|
|
|
fprintf( stderr, " -B, --brightness [value] : Output the current brightness, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -C, --contrast [value] : Output the current contrast, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -H, --hue [value] : Output the current hue, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -O, --colour [value] : Output the current colour, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -i, --image [image_index] : Write captured image to disk as <monitor_name>.jpg, last image captured\n" );
|
|
|
|
fprintf( stderr, " or specified ring buffer index if given.\n" );
|
|
|
|
fprintf( stderr, " -S, --scale <scale_%%ge> : With --image specify any scaling (in %%) to be applied to the image\n" );
|
|
|
|
fprintf( stderr, " -t, --timestamp [image_index] : Output captured image timestamp, last image captured or specified\n" );
|
|
|
|
fprintf( stderr, " ring buffer index if given\n" );
|
|
|
|
fprintf( stderr, " -R, --read_index : Output ring buffer read index\n" );
|
|
|
|
fprintf( stderr, " -W, --write_index : Output ring buffer write index\n" );
|
|
|
|
fprintf( stderr, " -e, --event : Output last event index\n" );
|
|
|
|
fprintf( stderr, " -f, --fps : Output last Frames Per Second captured reading\n" );
|
|
|
|
fprintf( stderr, " -z, --zones : Write last captured image overlaid with zones to <monitor_name>-Zones.jpg\n" );
|
|
|
|
fprintf( stderr, " -a, --alarm : Force alarm in monitor, this will trigger recording until cancelled with -c\n" );
|
|
|
|
fprintf( stderr, " -n, --noalarm : Force no alarms in monitor, this will prevent alarms until cancelled with -c\n" );
|
|
|
|
fprintf( stderr, " -c, --cancel : Cancel a forced alarm/noalarm in monitor, required after being enabled with -a or -n\n" );
|
|
|
|
fprintf( stderr, " -L, --reload : Signal monitor to reload settings\n" );
|
|
|
|
fprintf( stderr, " -E, --enable : Enable detection, wake monitor up\n" );
|
|
|
|
fprintf( stderr, " -D, --disable : Disable detection, put monitor to sleep\n" );
|
|
|
|
fprintf( stderr, " -u, --suspend : Suspend detection, useful to prevent bogus alarms when panning etc\n" );
|
|
|
|
fprintf( stderr, " -r, --resume : Resume detection after a suspend\n" );
|
|
|
|
fprintf( stderr, " -U, --username <username> : When running in authenticated mode the username and\n" );
|
|
|
|
fprintf( stderr, " -P, --password <password> : password combination of the given user\n" );
|
|
|
|
fprintf( stderr, " -A, --auth <authentication> : Pass authentication hash string instead of user details\n" );
|
|
|
|
|
|
|
|
exit( status );
|
2002-11-01 06:12:53 +08:00
|
|
|
}
|
|
|
|
|
2003-07-04 22:48:51 +08:00
|
|
|
typedef enum {
|
2006-01-03 17:59:32 +08:00
|
|
|
ZMU_BOGUS = 0x00000000,
|
|
|
|
ZMU_STATE = 0x00000001,
|
|
|
|
ZMU_IMAGE = 0x00000002,
|
|
|
|
ZMU_TIME = 0x00000004,
|
|
|
|
ZMU_READ_IDX = 0x00000008,
|
|
|
|
ZMU_WRITE_IDX = 0x00000010,
|
|
|
|
ZMU_EVENT = 0x00000020,
|
|
|
|
ZMU_FPS = 0x00000040,
|
|
|
|
ZMU_ZONES = 0x00000080,
|
|
|
|
ZMU_ALARM = 0x00000100,
|
|
|
|
ZMU_NOALARM = 0x00000200,
|
|
|
|
ZMU_CANCEL = 0x00000400,
|
|
|
|
ZMU_QUERY = 0x00000800,
|
|
|
|
ZMU_BRIGHTNESS = 0x00001000,
|
|
|
|
ZMU_CONTRAST = 0x00002000,
|
|
|
|
ZMU_HUE = 0x00004000,
|
|
|
|
ZMU_COLOUR = 0x00008000,
|
|
|
|
ZMU_RELOAD = 0x00010000,
|
|
|
|
ZMU_ENABLE = 0x00100000,
|
|
|
|
ZMU_DISABLE = 0x00200000,
|
|
|
|
ZMU_SUSPEND = 0x00400000,
|
|
|
|
ZMU_RESUME = 0x00800000,
|
|
|
|
ZMU_LIST = 0x10000000,
|
2003-07-04 22:48:51 +08:00
|
|
|
} Function;
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
bool ValidateAccess( User *user, int mon_id, int function ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
bool allowed = true;
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & (ZMU_STATE|ZMU_IMAGE|ZMU_TIME|ZMU_READ_IDX|ZMU_WRITE_IDX|ZMU_FPS) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( user->getStream() < User::PERM_VIEW )
|
|
|
|
allowed = false;
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_EVENT ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( user->getEvents() < User::PERM_VIEW )
|
|
|
|
allowed = false;
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & (ZMU_ZONES|ZMU_QUERY|ZMU_LIST) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( user->getMonitors() < User::PERM_VIEW )
|
|
|
|
allowed = false;
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & (ZMU_ALARM|ZMU_NOALARM|ZMU_CANCEL|ZMU_RELOAD|ZMU_ENABLE|ZMU_DISABLE|ZMU_SUSPEND|ZMU_RESUME|ZMU_BRIGHTNESS|ZMU_CONTRAST|ZMU_HUE|ZMU_COLOUR) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( user->getMonitors() < User::PERM_EDIT )
|
|
|
|
allowed = false;
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( mon_id > 0 ) {
|
|
|
|
if ( !user->canAccess( mon_id ) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
allowed = false;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( !allowed ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, insufficient privileges for requested action\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
return( allowed );
|
2003-07-04 22:48:51 +08:00
|
|
|
}
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
int main( int argc, char *argv[] ) {
|
|
|
|
if ( access(ZM_CONFIG, R_OK) != 0 ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Can't open %s: %s\n", ZM_CONFIG, strerror(errno) );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
self = argv[0];
|
|
|
|
|
|
|
|
srand( getpid() * time( 0 ) );
|
|
|
|
|
|
|
|
static struct option long_options[] = {
|
|
|
|
{"device", 2, 0, 'd'},
|
|
|
|
{"monitor", 1, 0, 'm'},
|
|
|
|
{"verbose", 0, 0, 'v'},
|
|
|
|
{"image", 2, 0, 'i'},
|
|
|
|
{"scale", 1, 0, 'S'},
|
|
|
|
{"timestamp", 2, 0, 't'},
|
|
|
|
{"state", 0, 0, 's'},
|
|
|
|
{"brightness", 2, 0, 'B'},
|
|
|
|
{"contrast", 2, 0, 'C'},
|
|
|
|
{"hue", 2, 0, 'H'},
|
|
|
|
{"contrast", 2, 0, 'O'},
|
|
|
|
{"read_index", 0, 0, 'R'},
|
|
|
|
{"write_index", 0, 0, 'W'},
|
|
|
|
{"event", 0, 0, 'e'},
|
|
|
|
{"fps", 0, 0, 'f'},
|
|
|
|
{"zones", 2, 0, 'z'},
|
|
|
|
{"alarm", 0, 0, 'a'},
|
|
|
|
{"noalarm", 0, 0, 'n'},
|
|
|
|
{"cancel", 0, 0, 'c'},
|
|
|
|
{"reload", 0, 0, 'L'},
|
|
|
|
{"enable", 0, 0, 'E'},
|
|
|
|
{"disable", 0, 0, 'D'},
|
|
|
|
{"suspend", 0, 0, 'u'},
|
|
|
|
{"resume", 0, 0, 'r'},
|
|
|
|
{"query", 0, 0, 'q'},
|
|
|
|
{"username", 1, 0, 'U'},
|
|
|
|
{"password", 1, 0, 'P'},
|
|
|
|
{"auth", 1, 0, 'A'},
|
|
|
|
{"version", 1, 0, 'V'},
|
|
|
|
{"help", 0, 0, 'h'},
|
|
|
|
{"list", 0, 0, 'l'},
|
|
|
|
{0, 0, 0, 0}
|
|
|
|
};
|
|
|
|
|
|
|
|
const char *device = 0;
|
|
|
|
int mon_id = 0;
|
|
|
|
bool verbose = false;
|
|
|
|
int function = ZMU_BOGUS;
|
|
|
|
|
|
|
|
int image_idx = -1;
|
|
|
|
int scale = -1;
|
|
|
|
int brightness = -1;
|
|
|
|
int contrast = -1;
|
|
|
|
int hue = -1;
|
|
|
|
int colour = -1;
|
|
|
|
char *zoneString = 0;
|
|
|
|
char *username = 0;
|
|
|
|
char *password = 0;
|
|
|
|
char *auth = 0;
|
2011-02-16 05:59:06 +08:00
|
|
|
#if ZM_HAS_V4L
|
|
|
|
#if ZM_HAS_V4L2
|
2009-03-31 20:57:34 +08:00
|
|
|
int v4lVersion = 2;
|
2011-02-16 05:59:06 +08:00
|
|
|
#elif ZM_HAS_V4L1
|
2009-03-31 20:57:34 +08:00
|
|
|
int v4lVersion = 1;
|
2011-02-16 05:59:06 +08:00
|
|
|
#endif // ZM_HAS_V4L2/1
|
|
|
|
#endif // ZM_HAS_V4L
|
2017-06-01 01:55:21 +08:00
|
|
|
while (1) {
|
2016-04-04 22:11:48 +08:00
|
|
|
int option_index = 0;
|
|
|
|
|
|
|
|
int c = getopt_long (argc, argv, "d:m:vsEDLurwei::S:t::fz::ancqhlB::C::H::O::U:P:A:V:", long_options, &option_index);
|
2017-06-01 01:55:21 +08:00
|
|
|
if (c == -1) {
|
2016-04-04 22:11:48 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
switch (c) {
|
2016-04-04 22:11:48 +08:00
|
|
|
case 'd':
|
|
|
|
if ( optarg )
|
|
|
|
device = optarg;
|
|
|
|
break;
|
|
|
|
case 'm':
|
|
|
|
mon_id = atoi(optarg);
|
|
|
|
break;
|
|
|
|
case 'v':
|
|
|
|
verbose = true;
|
|
|
|
break;
|
|
|
|
case 's':
|
|
|
|
function |= ZMU_STATE;
|
|
|
|
break;
|
|
|
|
case 'i':
|
|
|
|
function |= ZMU_IMAGE;
|
|
|
|
if ( optarg )
|
|
|
|
image_idx = atoi( optarg );
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
scale = atoi(optarg);
|
|
|
|
break;
|
|
|
|
case 't':
|
|
|
|
function |= ZMU_TIME;
|
|
|
|
if ( optarg )
|
|
|
|
image_idx = atoi( optarg );
|
|
|
|
break;
|
|
|
|
case 'R':
|
|
|
|
function |= ZMU_READ_IDX;
|
|
|
|
break;
|
|
|
|
case 'W':
|
|
|
|
function |= ZMU_WRITE_IDX;
|
|
|
|
break;
|
|
|
|
case 'e':
|
|
|
|
function |= ZMU_EVENT;
|
|
|
|
break;
|
|
|
|
case 'f':
|
|
|
|
function |= ZMU_FPS;
|
|
|
|
break;
|
|
|
|
case 'z':
|
|
|
|
function |= ZMU_ZONES;
|
|
|
|
if ( optarg )
|
|
|
|
zoneString = optarg;
|
|
|
|
break;
|
|
|
|
case 'a':
|
|
|
|
function |= ZMU_ALARM;
|
|
|
|
break;
|
|
|
|
case 'n':
|
|
|
|
function |= ZMU_NOALARM;
|
|
|
|
break;
|
|
|
|
case 'c':
|
|
|
|
function |= ZMU_CANCEL;
|
|
|
|
break;
|
|
|
|
case 'L':
|
|
|
|
function |= ZMU_RELOAD;
|
|
|
|
break;
|
|
|
|
case 'E':
|
|
|
|
function |= ZMU_ENABLE;
|
|
|
|
break;
|
|
|
|
case 'D':
|
|
|
|
function |= ZMU_DISABLE;
|
|
|
|
break;
|
|
|
|
case 'u':
|
|
|
|
function |= ZMU_SUSPEND;
|
|
|
|
break;
|
|
|
|
case 'r':
|
|
|
|
function |= ZMU_RESUME;
|
|
|
|
break;
|
|
|
|
case 'q':
|
|
|
|
function |= ZMU_QUERY;
|
|
|
|
break;
|
|
|
|
case 'B':
|
|
|
|
function |= ZMU_BRIGHTNESS;
|
|
|
|
if ( optarg )
|
|
|
|
brightness = atoi( optarg );
|
|
|
|
break;
|
|
|
|
case 'C':
|
|
|
|
function |= ZMU_CONTRAST;
|
|
|
|
if ( optarg )
|
|
|
|
contrast = atoi( optarg );
|
|
|
|
break;
|
|
|
|
case 'H':
|
|
|
|
function |= ZMU_HUE;
|
|
|
|
if ( optarg )
|
|
|
|
hue = atoi( optarg );
|
|
|
|
break;
|
|
|
|
case 'O':
|
|
|
|
function |= ZMU_COLOUR;
|
|
|
|
if ( optarg )
|
|
|
|
colour = atoi( optarg );
|
|
|
|
break;
|
|
|
|
case 'U':
|
|
|
|
username = optarg;
|
|
|
|
break;
|
|
|
|
case 'P':
|
|
|
|
password = optarg;
|
|
|
|
break;
|
|
|
|
case 'A':
|
|
|
|
auth = optarg;
|
|
|
|
break;
|
2011-02-16 05:59:06 +08:00
|
|
|
#if ZM_HAS_V4L
|
2009-03-31 20:57:34 +08:00
|
|
|
case 'V':
|
|
|
|
v4lVersion = (atoi(optarg)==1)?1:2;
|
|
|
|
break;
|
2011-02-16 05:59:06 +08:00
|
|
|
#endif // ZM_HAS_V4L
|
2016-04-04 22:11:48 +08:00
|
|
|
case 'h':
|
|
|
|
Usage( 0 );
|
|
|
|
break;
|
|
|
|
case 'l':
|
|
|
|
function |= ZMU_LIST;
|
|
|
|
break;
|
|
|
|
case '?':
|
|
|
|
Usage();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
//fprintf( stderr, "?? getopt returned character code 0%o ??\n", c );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if (optind < argc) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Extraneous options, " );
|
|
|
|
while (optind < argc)
|
|
|
|
fprintf( stderr, "%s ", argv[optind++]);
|
|
|
|
fprintf( stderr, "\n");
|
|
|
|
Usage();
|
|
|
|
}
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( device && !(function&ZMU_QUERY) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, -d option cannot be used with this option\n" );
|
|
|
|
Usage();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( scale != -1 && !(function&ZMU_IMAGE) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, -S option cannot be used with this option\n" );
|
|
|
|
Usage();
|
|
|
|
}
|
|
|
|
//printf( "Monitor %d, Function %d\n", mon_id, function );
|
|
|
|
|
|
|
|
zmLoadConfig();
|
|
|
|
|
|
|
|
logInit( "zmu" );
|
|
|
|
|
|
|
|
zmSetDefaultTermHandler();
|
|
|
|
zmSetDefaultDieHandler();
|
|
|
|
|
|
|
|
User *user = 0;
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( config.opt_use_auth ) {
|
|
|
|
if ( strcmp( config.auth_relay, "none" ) == 0 ) {
|
|
|
|
if ( !username ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, username must be supplied\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( username ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
user = zmLoadUser( username );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
|
|
|
if ( !(username && password) && !auth ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, username and password or auth string must be supplied\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
//if ( strcmp( config.auth_relay, "hashed" ) == 0 )
|
|
|
|
{
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( auth ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
user = zmLoadAuthUser( auth, false );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//else if ( strcmp( config.auth_relay, "plain" ) == 0 )
|
|
|
|
{
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( username && password ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
user = zmLoadUser( username, password );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( !user ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, unable to authenticate user\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
ValidateAccess( user, mon_id, function );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( mon_id > 0 ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
Monitor *monitor = Monitor::Load( mon_id, function&(ZMU_QUERY|ZMU_ZONES), Monitor::QUERY );
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( monitor ) {
|
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
printf( "Monitor %d(%s)\n", monitor->Id(), monitor->Name() );
|
|
|
|
}
|
|
|
|
if ( ! monitor->connect() ) {
|
|
|
|
Error( "Can't connect to capture daemon: %d %s", monitor->Id(), monitor->Name() );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
char separator = ' ';
|
|
|
|
bool have_output = false;
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_STATE ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
Monitor::State state = monitor->GetState();
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Current state: %s\n", state==Monitor::ALARM?"Alarm":(state==Monitor::ALERT?"Alert":"Idle") );
|
2017-06-01 01:55:21 +08:00
|
|
|
else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", state );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_TIME ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
struct timeval timestamp = monitor->GetTimestamp( image_idx );
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
char timestamp_str[64] = "None";
|
|
|
|
if ( timestamp.tv_sec )
|
|
|
|
strftime( timestamp_str, sizeof(timestamp_str), "%Y-%m-%d %H:%M:%S", localtime( ×tamp.tv_sec ) );
|
|
|
|
if ( image_idx == -1 )
|
|
|
|
printf( "Time of last image capture: %s.%02ld\n", timestamp_str, timestamp.tv_usec/10000 );
|
|
|
|
else
|
|
|
|
printf( "Time of image %d capture: %s.%02ld\n", image_idx, timestamp_str, timestamp.tv_usec/10000 );
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%ld.%02ld", timestamp.tv_sec, timestamp.tv_usec/10000 );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_READ_IDX ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Last read index: %d\n", monitor->GetLastReadIndex() );
|
2017-06-01 01:55:21 +08:00
|
|
|
else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", monitor->GetLastReadIndex() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_WRITE_IDX ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Last write index: %d\n", monitor->GetLastWriteIndex() );
|
2017-06-01 01:55:21 +08:00
|
|
|
else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", monitor->GetLastWriteIndex() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_EVENT ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
2017-11-29 00:55:47 +08:00
|
|
|
printf( "Last event id: %d\n", monitor->GetLastEventId() );
|
2017-06-01 01:55:21 +08:00
|
|
|
else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
2017-11-29 00:55:47 +08:00
|
|
|
printf( "%d", monitor->GetLastEventId() );
|
2016-04-04 22:11:48 +08:00
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_FPS ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Current capture rate: %.2f frames per second\n", monitor->GetFPS() );
|
2017-06-01 01:55:21 +08:00
|
|
|
else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%.2f", monitor->GetFPS() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_IMAGE ) {
|
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( image_idx == -1 )
|
|
|
|
printf( "Dumping last image captured to Monitor%d.jpg", monitor->Id() );
|
|
|
|
else
|
|
|
|
printf( "Dumping buffer image %d to Monitor%d.jpg", image_idx, monitor->Id() );
|
|
|
|
if ( scale != -1 )
|
|
|
|
printf( ", scaling by %d%%", scale );
|
|
|
|
printf( "\n" );
|
|
|
|
}
|
|
|
|
monitor->GetImage( image_idx, scale>0?scale:100 );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_ZONES ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Dumping zone image to Zones%d.jpg\n", monitor->Id() );
|
|
|
|
monitor->DumpZoneImage( zoneString );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_ALARM ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Forcing alarm on\n" );
|
|
|
|
monitor->ForceAlarmOn( config.forced_alarm_score, "Forced Web" );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_NOALARM ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Forcing alarm off\n" );
|
|
|
|
monitor->ForceAlarmOff();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_CANCEL ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Cancelling forced alarm on/off\n" );
|
|
|
|
monitor->CancelForced();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_RELOAD ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Reloading monitor settings\n" );
|
|
|
|
monitor->actionReload();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_ENABLE ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Enabling event generation\n" );
|
|
|
|
monitor->actionEnable();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_DISABLE ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Disabling event generation\n" );
|
|
|
|
monitor->actionDisable();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_SUSPEND ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Suspending event generation\n" );
|
|
|
|
monitor->actionSuspend();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_RESUME ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( verbose )
|
|
|
|
printf( "Resuming event generation\n" );
|
|
|
|
monitor->actionResume();
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_QUERY ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
char monString[16382] = "";
|
|
|
|
monitor->DumpSettings( monString, verbose );
|
|
|
|
printf( "%s\n", monString );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_BRIGHTNESS ) {
|
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( brightness >= 0 )
|
|
|
|
printf( "New brightness: %d\n", monitor->actionBrightness( brightness ) );
|
|
|
|
else
|
|
|
|
printf( "Current brightness: %d\n", monitor->actionBrightness() );
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( brightness >= 0 )
|
|
|
|
printf( "%d", monitor->actionBrightness( brightness ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->actionBrightness() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_CONTRAST ) {
|
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( contrast >= 0 )
|
|
|
|
printf( "New brightness: %d\n", monitor->actionContrast( contrast ) );
|
|
|
|
else
|
|
|
|
printf( "Current contrast: %d\n", monitor->actionContrast() );
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( contrast >= 0 )
|
|
|
|
printf( "%d", monitor->actionContrast( contrast ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->actionContrast() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_HUE ) {
|
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( hue >= 0 )
|
|
|
|
printf( "New hue: %d\n", monitor->actionHue( hue ) );
|
|
|
|
else
|
|
|
|
printf( "Current hue: %d\n", monitor->actionHue() );
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( hue >= 0 )
|
|
|
|
printf( "%d", monitor->actionHue( hue ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->actionHue() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_COLOUR ) {
|
|
|
|
if ( verbose ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( colour >= 0 )
|
|
|
|
printf( "New colour: %d\n", monitor->actionColour( colour ) );
|
|
|
|
else
|
|
|
|
printf( "Current colour: %d\n", monitor->actionColour() );
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( colour >= 0 )
|
|
|
|
printf( "%d", monitor->actionColour( colour ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->actionColour() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( have_output ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
printf( "\n" );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( !function ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
Usage();
|
|
|
|
}
|
|
|
|
delete monitor;
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
fprintf( stderr, "Error, invalid monitor id %d\n", mon_id );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
|
|
|
if ( function & ZMU_QUERY ) {
|
2011-02-16 05:59:06 +08:00
|
|
|
#if ZM_HAS_V4L
|
2009-03-31 20:57:34 +08:00
|
|
|
char vidString[0x10000] = "";
|
|
|
|
bool ok = LocalCamera::GetCurrentSettings( device, vidString, v4lVersion, verbose );
|
|
|
|
printf( "%s", vidString );
|
|
|
|
exit( ok?0:-1 );
|
2011-02-16 05:59:06 +08:00
|
|
|
#else // ZM_HAS_V4L
|
|
|
|
fprintf( stderr, "Error, video4linux is required for device querying\n" );
|
|
|
|
exit( -1 );
|
|
|
|
#endif // ZM_HAS_V4L
|
2016-04-04 22:11:48 +08:00
|
|
|
}
|
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( function & ZMU_LIST ) {
|
2016-04-28 21:20:56 +08:00
|
|
|
std::string sql = "select Id, Function+0 from Monitors";
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( !verbose ) {
|
2016-04-28 21:20:56 +08:00
|
|
|
sql += "where Function != 'None'";
|
2016-04-04 22:11:48 +08:00
|
|
|
}
|
2016-04-28 21:20:56 +08:00
|
|
|
sql += " order by Id asc";
|
2016-04-04 22:11:48 +08:00
|
|
|
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( mysql_query( &dbconn, sql.c_str() ) ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
Error( "Can't run query: %s", mysql_error( &dbconn ) );
|
|
|
|
exit( mysql_errno( &dbconn ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
MYSQL_RES *result = mysql_store_result( &dbconn );
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( !result ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
Error( "Can't use query result: %s", mysql_error( &dbconn ) );
|
|
|
|
exit( mysql_errno( &dbconn ) );
|
|
|
|
}
|
2017-11-19 05:00:10 +08:00
|
|
|
Debug( 1, "Got %d monitors", mysql_num_rows( result ) );
|
2016-04-04 22:11:48 +08:00
|
|
|
|
|
|
|
printf( "%4s%5s%6s%9s%14s%6s%6s%8s%8s\n", "Id", "Func", "State", "TrgState", "LastImgTim", "RdIdx", "WrIdx", "LastEvt", "FrmRate" );
|
2017-06-01 01:55:21 +08:00
|
|
|
for( int i = 0; MYSQL_ROW dbrow = mysql_fetch_row( result ); i++ ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
int mon_id = atoi(dbrow[0]);
|
|
|
|
int function = atoi(dbrow[1]);
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( !user || user->canAccess( mon_id ) ) {
|
|
|
|
if ( function > 1 ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
Monitor *monitor = Monitor::Load( mon_id, false, Monitor::QUERY );
|
2017-06-01 01:55:21 +08:00
|
|
|
if ( monitor && monitor->connect() ) {
|
2016-04-04 22:11:48 +08:00
|
|
|
struct timeval tv = monitor->GetTimestamp();
|
|
|
|
printf( "%4d%5d%6d%9d%11ld.%02ld%6d%6d%8d%8.2f\n",
|
|
|
|
monitor->Id(),
|
|
|
|
function,
|
|
|
|
monitor->GetState(),
|
|
|
|
monitor->GetTriggerState(),
|
|
|
|
tv.tv_sec, tv.tv_usec/10000,
|
|
|
|
monitor->GetLastReadIndex(),
|
|
|
|
monitor->GetLastWriteIndex(),
|
2017-11-29 00:55:47 +08:00
|
|
|
monitor->GetLastEventId(),
|
2016-04-04 22:11:48 +08:00
|
|
|
monitor->GetFPS()
|
|
|
|
);
|
|
|
|
delete monitor;
|
|
|
|
}
|
2017-06-01 01:55:21 +08:00
|
|
|
} else {
|
2016-04-04 22:11:48 +08:00
|
|
|
struct timeval tv = { 0, 0 };
|
|
|
|
printf( "%4d%5d%6d%9d%11ld.%02ld%6d%6d%8d%8.2f\n",
|
|
|
|
mon_id,
|
|
|
|
function,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
tv.tv_sec, tv.tv_usec/10000,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0.0
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mysql_free_result( result );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
delete user;
|
|
|
|
|
|
|
|
logTerm();
|
|
|
|
zmDbClose();
|
|
|
|
|
|
|
|
return( 0 );
|
2002-09-16 17:19:24 +08:00
|
|
|
}
|