diff --git a/docs/api.rst b/docs/api.rst
index 53c6d155b..9546a279a 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -130,6 +130,28 @@ depend on it.
curl -XDELETE http://server/zm/api/monitors/1.json
+Arm/Disarm monitors
+^^^^^^^^^^^^^^^^^^^^
+
+This command will force an alarm on Monitor 1:
+
+::
+
+ curl http://server/zm/api/monitors/alarm/id:1/command:on.json
+
+This command will disable the alarm on Monitor 1:
+
+::
+
+ curl http://server/zm/api/monitors/alarm/id:1/command:off.json
+
+This command will report the status of the alarm Monitor 1:
+
+::
+
+ curl http://server/zm/api/monitors/alarm/id:1/command:status.json
+
+
Return a list of all events
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -216,6 +238,26 @@ Return a list of events for all monitors within a specified date/time range
curl -XGET "http://server/zm/api/events/index/StartTime%20>=:2015-05-15%2018:43:56/EndTime%20<=:208:43:56.json"
+Return event count based on times and conditions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The API also supports a handy mechanism to return a count of events for a period of time.
+
+This returns number of events per monitor that were recorded in the last one hour
+
+::
+
+ curl "http://server/zm/api/events/consoleEvents/1%20hour.json"
+
+This returns number of events per monitor that were recorded in the last day where there were atleast 10 frames that were alarms"
+
+::
+
+ curl "http://server/zm/api/events/consoleEvents/1%20day.json/AlarmFrames >=: 10.json"
+
+
+
+
Configuration Apis
^^^^^^^^^^^^^^^^^^^
diff --git a/scripts/ZoneMinder/lib/ZoneMinder.pm b/scripts/ZoneMinder/lib/ZoneMinder.pm
index 6d8b3bfc8..87a6b14b7 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder.pm
@@ -81,11 +81,6 @@ our @EXPORT = ( @EXPORT_OK );
our $VERSION = $ZoneMinder::Base::VERSION;
-BEGIN {
- ZoneMinder::Config::zmConfigLoad();
- ZoneMinder::Database::zmDbConnect();
-}
-
1;
__END__
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in
index 754e4a591..0cc8081d2 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in
@@ -30,7 +30,6 @@ use warnings;
require Exporter;
require ZoneMinder::Base;
-require ZoneMinder::Database;
use ZoneMinder::ConfigData qw(:all);
our @ISA = qw(Exporter ZoneMinder::Base);
@@ -70,48 +69,39 @@ use constant ZM_CONFIG => "@ZM_CONFIG@"; # Path to the ZoneMinder config file
use Carp;
# Load the config from the database into the symbol table
-sub zmConfigLoad {
- %Config = ();
+BEGIN
+{
+ my $config_file = ZM_CONFIG;
+ open( my $CONFIG, "<", $config_file )
+ or croak( "Can't open config file '$config_file': $!" );
+ foreach my $str ( <$CONFIG> )
+ {
+ next if ( $str =~ /^\s*$/ );
+ next if ( $str =~ /^\s*#/ );
+ my ( $name, $value ) = $str =~ /^\s*([^=\s]+)\s*=\s*(.*?)\s*$/;
+ if ( ! $name ) {
+ print( STDERR "Warning, bad line in $config_file: $str\n" );
+ next;
+ } # end if
+ $name =~ tr/a-z/A-Z/;
+ $Config{$name} = $value;
+ }
+ close( $CONFIG );
- my $config_file = ZM_CONFIG;
- open( my $CONFIG, "<", $config_file )
- or croak( "Can't open config file '$config_file': $!" );
- foreach my $str ( <$CONFIG> ) {
- next if ( $str =~ /^\s*$/ );
- next if ( $str =~ /^\s*#/ );
- my ( $name, $value ) = $str =~ /^\s*([^=\s]+)\s*=\s*(.*?)\s*$/;
- if ( ! $name ) {
- print( STDERR "Warning, bad line in $config_file: $str\n" );
- next;
- } # end if
- $name =~ tr/a-z/A-Z/;
- $Config{$name} = $value;
- }
- close( $CONFIG );
-
- my $dbh = ZoneMinder::Database::zmDbConnect() or croak( "Can't connect to db" );
- my $sql = 'select * from Config';
- my $sth = $dbh->prepare_cached( $sql ) or croak( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute() or croak( "Can't execute: ".$sth->errstr() );
- while( my $config = $sth->fetchrow_hashref() ) {
- $Config{$config->{Name}} = $config->{Value};
- }
- $sth->finish();
-
- if ( ! exists $Config{ZM_SERVER_ID} ) {
- $Config{ZM_SERVER_ID} = undef;
- $sth = $dbh->prepare_cached( 'SELECT * FROM Servers WHERE Name=?' );
- if ( $Config{ZM_SERVER_NAME} ) {
- $res = $sth->execute( $Config{ZM_SERVER_NAME} );
- my $result = $sth->fetchrow_hashref();
- $Config{ZM_SERVER_ID} = $$result{Id};
- } elsif ( $Config{ZM_SERVER_HOST} ) {
- $res = $sth->execute( $Config{ZM_SERVER_HOST} );
- my $result = $sth->fetchrow_hashref();
- $Config{ZM_SERVER_ID} = $$result{Id};
+ use DBI;
+ my $dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME}
+ .";host=".$Config{ZM_DB_HOST}
+ , $Config{ZM_DB_USER}
+ , $Config{ZM_DB_PASS}
+ ) or croak( "Can't connect to db" );
+ my $sql = 'select * from Config';
+ my $sth = $dbh->prepare_cached( $sql ) or croak( "Can't prepare '$sql': ".$dbh->errstr() );
+ my $res = $sth->execute() or croak( "Can't execute: ".$sth->errstr() );
+ while( my $config = $sth->fetchrow_hashref() ) {
+ $Config{$config->{Name}} = $config->{Value};
}
$sth->finish();
- }
+ #$dbh->disconnect();
}
sub loadConfigFromDB {
@@ -228,8 +218,6 @@ sub saveConfigToDB {
$dbh->{AutoCommit} = $ac;
}
-1;
-__END__
1;
__END__
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Database.pm b/scripts/ZoneMinder/lib/ZoneMinder/Database.pm
index c49e291ac..0e8946798 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Database.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Database.pm
@@ -27,11 +27,9 @@ package ZoneMinder::Database;
use 5.006;
use strict;
use warnings;
-use DBI;
require Exporter;
require ZoneMinder::Base;
-require ZoneMinder::Config;
our @ISA = qw(Exporter ZoneMinder::Base);
@@ -66,6 +64,7 @@ our $VERSION = $ZoneMinder::Base::VERSION;
# ==========================================================================
use ZoneMinder::Logger qw(:all);
+use ZoneMinder::Config qw(:all);
use Carp;
@@ -83,19 +82,19 @@ sub zmDbConnect
if ( defined($port) )
{
- $dbh = DBI->connect( "DBI:mysql:database=".$ZoneMinder::Config::Config{ZM_DB_NAME}
+ $dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME}
.";host=".$host
.";port=".$port
- , $ZoneMinder::Config::Config{ZM_DB_USER}
- , $ZoneMinder::Config::Config{ZM_DB_PASS}
+ , $Config{ZM_DB_USER}
+ , $Config{ZM_DB_PASS}
);
}
else
{
- $dbh = DBI->connect( "DBI:mysql:database=".$ZoneMinder::Config::Config{ZM_DB_NAME}
- .";host=".$ZoneMinder::Config::Config{ZM_DB_HOST}
- , $ZoneMinder::Config::Config{ZM_DB_USER}
- , $ZoneMinder::Config::Config{ZM_DB_PASS}
+ $dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME}
+ .";host=".$Config{ZM_DB_HOST}
+ , $Config{ZM_DB_USER}
+ , $Config{ZM_DB_PASS}
);
}
$dbh->trace( 0 );
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm
index 7366ada90..a6a82db87 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm
@@ -30,9 +30,6 @@ use warnings;
require Exporter;
require ZoneMinder::Base;
-require ZoneMinder::Database;
-require ZoneMinder::Config;
-
our @ISA = qw(Exporter ZoneMinder::Base);
@@ -89,6 +86,8 @@ our $VERSION = $ZoneMinder::Base::VERSION;
#
# ==========================================================================
+use ZoneMinder::Config qw(:all);
+
use DBI;
use Carp;
use POSIX;
@@ -152,7 +151,7 @@ sub new
$this->{hasTerm} = -t STDERR;
( $this->{fileName} = $0 ) =~ s|^.*/||;
- $this->{logPath} = $ZoneMinder::Config::Config{ZM_PATH_LOGS};
+ $this->{logPath} = $Config{ZM_PATH_LOGS};
$this->{logFile} = $this->{logPath}."/".$this->{id}.".log";
$this->{trace} = 0;
@@ -165,7 +164,7 @@ sub BEGIN
{
# Fake the config variables that are used in case they are not defined yet
# Only really necessary to support upgrade from previous version
- if ( !eval('defined($ZoneMinder::Config::Config{ZM_LOG_DEBUG})') )
+ if ( !eval('defined($Config{ZM_LOG_DEBUG})') )
{
no strict 'subs';
no strict 'refs';
@@ -223,7 +222,7 @@ sub initialise( @ )
}
else
{
- $tempDatabaseLevel = $ZoneMinder::Config::Config{ZM_LOG_LEVEL_DATABASE};
+ $tempDatabaseLevel = $Config{ZM_LOG_LEVEL_DATABASE};
}
if ( defined($options{fileLevel}) )
{
@@ -231,7 +230,7 @@ sub initialise( @ )
}
else
{
- $tempFileLevel = $ZoneMinder::Config::Config{ZM_LOG_LEVEL_FILE};
+ $tempFileLevel = $Config{ZM_LOG_LEVEL_FILE};
}
if ( defined($options{syslogLevel}) )
{
@@ -239,7 +238,7 @@ sub initialise( @ )
}
else
{
- $tempSyslogLevel = $ZoneMinder::Config::Config{ZM_LOG_LEVEL_SYSLOG};
+ $tempSyslogLevel = $Config{ZM_LOG_LEVEL_SYSLOG};
}
if ( defined($ENV{'LOG_PRINT'}) )
@@ -255,9 +254,9 @@ sub initialise( @ )
$tempFileLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL_FILE')) );
$tempSyslogLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL_SYSLOG')) );
- if ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG} )
+ if ( $Config{ZM_LOG_DEBUG} )
{
- foreach my $target ( split( /\|/, $ZoneMinder::Config::Config{ZM_LOG_DEBUG_TARGET} ) )
+ foreach my $target ( split( /\|/, $Config{ZM_LOG_DEBUG_TARGET} ) )
{
if ( $target eq $this->{id}
|| $target eq "_".$this->{id}
@@ -266,12 +265,12 @@ sub initialise( @ )
|| $target eq ""
)
{
- if ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_LEVEL} > NOLOG )
+ if ( $Config{ZM_LOG_DEBUG_LEVEL} > NOLOG )
{
- $tempLevel = $this->limit( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_LEVEL} );
- if ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_FILE} ne "" )
+ $tempLevel = $this->limit( $Config{ZM_LOG_DEBUG_LEVEL} );
+ if ( $Config{ZM_LOG_DEBUG_FILE} ne "" )
{
- $tempLogFile = $ZoneMinder::Config::Config{ZM_LOG_DEBUG_FILE};
+ $tempLogFile = $Config{ZM_LOG_DEBUG_FILE};
$tempFileLevel = $tempLevel;
}
}
@@ -461,14 +460,32 @@ sub databaseLevel
{
if ( !$this->{dbh} )
{
- $this->{dbh} = ZoneMinder::Database::zmDbConnect();
+ my ( $host, $port ) = ( $Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ );
+
+ if ( defined($port) )
+ {
+ $this->{dbh} = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME}
+ .";host=".$host
+ .";port=".$port
+ , $Config{ZM_DB_USER}
+ , $Config{ZM_DB_PASS}
+ );
+ }
+ else
+ {
+ $this->{dbh} = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME}
+ .";host=".$Config{ZM_DB_HOST}
+ , $Config{ZM_DB_USER}
+ , $Config{ZM_DB_PASS}
+ );
+ }
if ( !$this->{dbh} )
{
$databaseLevel = NOLOG;
Error( "Unable to write log entries to DB, can't connect to database '"
- .$ZoneMinder::Config::Config{ZM_DB_NAME}
+ .$Config{ZM_DB_NAME}
."' on host '"
- .$ZoneMinder::Config::Config{ZM_DB_HOST}
+ .$Config{ZM_DB_HOST}
."'"
);
}
@@ -488,8 +505,7 @@ sub databaseLevel
{
if ( $this->{dbh} )
{
- # $this->dbh is now the global dbh, so don't close it.
- #$this->{dbh}->disconnect();
+ $this->{dbh}->disconnect();
undef($this->{dbh});
}
}
@@ -566,8 +582,8 @@ sub openFile
{
$LOGFILE->autoflush() if ( $this->{autoFlush} );
- my $webUid = (getpwnam( $ZoneMinder::Config::Config{ZM_WEB_USER} ))[2];
- my $webGid = (getgrnam( $ZoneMinder::Config::Config{ZM_WEB_GROUP} ))[2];
+ my $webUid = (getpwnam( $Config{ZM_WEB_USER} ))[2];
+ my $webGid = (getgrnam( $Config{ZM_WEB_GROUP} ))[2];
if ( $> == 0 )
{
chown( $webUid, $webGid, $this->{logFile} )
diff --git a/scripts/zmdc.pl.in b/scripts/zmdc.pl.in
index 9f881af12..1046c1b91 100644
--- a/scripts/zmdc.pl.in
+++ b/scripts/zmdc.pl.in
@@ -92,7 +92,7 @@ my @daemons = (
'zmwatch.pl',
'zmupdate.pl',
'zmtrack.pl',
- 'zmtelemetry.pl',
+ 'zmtelemetry.pl'
);
my $command = shift @ARGV;
diff --git a/scripts/zmtelemetry.pl.in b/scripts/zmtelemetry.pl.in
index c7bf4a3f3..5a5328829 100644
--- a/scripts/zmtelemetry.pl.in
+++ b/scripts/zmtelemetry.pl.in
@@ -71,7 +71,7 @@ if ( $Config{ZM_TELEMETRY_DATA} )
{
print( "Update agent starting at ".strftime( '%y/%m/%d %H:%M:%S', localtime() )."\n" );
- my $lastCheck = $Config{ZM_TELEMETRY_LAST_CHECK};
+ my $lastCheck = $Config{ZM_TELEMETRY_LAST_UPLOAD};
while( 1 ) {
my $now = time();
diff --git a/scripts/zmupdate.pl.in b/scripts/zmupdate.pl.in
index 176de10a6..ccc76ba02 100644
--- a/scripts/zmupdate.pl.in
+++ b/scripts/zmupdate.pl.in
@@ -67,7 +67,12 @@ use constant CHECK_INTERVAL => (1*24*60*60); # Interval between version checks
# ==========================================================================
@EXTRA_PERL_LIB@
-use ZoneMinder;
+use ZoneMinder::Base qw(:all);
+use ZoneMinder::Config qw(:all);
+use ZoneMinder::Logger qw(:all);
+use ZoneMinder::General qw(:all);
+use ZoneMinder::Database qw(:all);
+use ZoneMinder::ConfigAdmin qw( :functions );
use POSIX;
use DBI;
use Getopt::Long;
@@ -364,8 +369,8 @@ if ( $interactive ) {
my $sql = "ALTER TABLE $_ ENGINE = InnoDB";
my $sth = $dbh->prepare_cached( $sql ) or die( "Can't prepare '$sql': ".$dbh->errstr() );
my $res = $sth->execute() or die( "Can't execute: ".$sth->errstr() );
+ $sth->finish();
}
- $sth->finish();
$dbh->do(q|SET sql_mode=''|); # Set mode back to default
}
}
diff --git a/src/zm_rtp_ctrl.h b/src/zm_rtp_ctrl.h
index 2526f22ce..f487d1191 100644
--- a/src/zm_rtp_ctrl.h
+++ b/src/zm_rtp_ctrl.h
@@ -123,7 +123,7 @@ private:
} sdes;
// BYE
- struct Bye
+ struct
{
uint32_t srcN[]; // list of sources
// can't express trailing text for reason (what does this mean? it's not even english!)
diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php
index 893410ce8..7bf36de75 100644
--- a/web/api/app/Controller/MonitorsController.php
+++ b/web/api/app/Controller/MonitorsController.php
@@ -103,7 +103,7 @@ public function beforeFilter() {
$this->Monitor->create();
if ($this->Monitor->save($this->request->data)) {
- $this->daemonControl($this->Monitor->id, 'start', $this->request->data);
+ $this->daemonControl($this->Monitor->id, 'start');
return $this->flash(__('The monitor has been saved.'), array('action' => 'index'));
}
}
diff --git a/web/includes/functions.php b/web/includes/functions.php
index cea0897db..0c9339970 100644
--- a/web/includes/functions.php
+++ b/web/includes/functions.php
@@ -357,11 +357,11 @@ function getHelperStream( $id, $src, $width, $height, $title="" ) {
';
}
-function outputImageStill( $id, $src, $width, $height, $title="" )
-{
- ?>
-
- ';
}
function outputControlStill( $src, $width, $height, $monitor, $scale, $target )
@@ -2137,8 +2137,8 @@ function getStreamHTML( $monitor, $scale=100 ) {
return getHelperStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() );
} else {
$streamSrc = $monitor->getStreamSrc( array( 'mode=single', "scale=".$scale ) );
- outputImageStill( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() );
Info( "The system has fallen back to single jpeg mode for streaming. Consider enabling Cambozola or upgrading the client browser.");
+ return getImageStill( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() );
}
} // end function getStreamHTML
diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php
index 1e17d32a6..27f5e8a58 100644
--- a/web/skins/classic/views/zone.php
+++ b/web/skins/classic/views/zone.php
@@ -214,9 +214,9 @@ xhtmlHeaders(__FILE__, translate('Zone') );