Merge branch 'master' into storageareas
This commit is contained in:
commit
a594a1b6f1
|
@ -559,7 +559,7 @@ CREATE TABLE `Servers` (
|
|||
`Name` varchar(64) NOT NULL default '',
|
||||
`State_Id` int(10) unsigned,
|
||||
`Status` enum('Unknown','NotRunning','Running') NOT NULL default 'Unknown',
|
||||
`Load` DECIMAL(5,1),
|
||||
`CpuLoad` DECIMAL(5,1) default NULL,
|
||||
`TotalMem` bigint unsigned default null,
|
||||
`FreeMem` bigint unsigned default null,
|
||||
`TotalSwap` bigint unsigned default null,
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
DROP TABLE IF EXISTS `Monitor_Status`;
|
||||
CREATE TABLE `Monitor_Status` (
|
||||
`MonitorId` int(10) unsigned NOT NULL,
|
||||
`Status` enum('Unknown','NotRunning','Running','Connected','Signal') NOT NULL default 'Unknown',
|
||||
`CaptureFPS` DECIMAL(10,2) NOT NULL default 0,
|
||||
`AnalysisFPS` DECIMAL(5,2) NOT NULL default 0,
|
||||
PRIMARY KEY (`MonitorId`)
|
||||
) ENGINE=MEMORY;
|
||||
|
||||
SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
|
||||
|
||||
SET @s = (SELECT IF(
|
||||
(SELECT COUNT(*) FROM Storage WHERE Name = 'Default' AND Id=0 AND Path='/var/cache/zoneminder/events'
|
||||
) > 0,
|
||||
"SELECT 'Default Storage Area already exists.'",
|
||||
"INSERT INTO Storage (Id,Name,Path,Scheme,ServerId) VALUES (0,'Default','/var/cache/zoneminder/events','Medium',NULL)"
|
||||
));
|
||||
|
||||
PREPARE stmt FROM @s;
|
||||
EXECUTE stmt;
|
|
@ -85,7 +85,7 @@ New installs
|
|||
When in doubt, proceed with the default:
|
||||
|
||||
sudo ln -s /etc/zm/www/zoneminder.conf /etc/httpd/conf.d/
|
||||
sudo dnf install mod_ssl
|
||||
sudo yum install mod_ssl
|
||||
|
||||
7. Now start the web server:
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ sub zmDbConnect {
|
|||
, $Config{ZM_DB_PASS}
|
||||
);
|
||||
};
|
||||
if ( !$dbh or $@ ) {
|
||||
if ( !$dbh or $@ ) {
|
||||
Error("Error reconnecting to db: errstr:$DBI::errstr error val:$@");
|
||||
} else {
|
||||
$dbh->{AutoCommit} = 1;
|
||||
|
|
|
@ -307,7 +307,7 @@ sub Sql {
|
|||
if ( $self->{AutoMessage} ) {
|
||||
# Include all events, including events that are still ongoing
|
||||
# and have no EndTime yet
|
||||
$sql .= ' AND ( '.$self->{Sql}.' )';
|
||||
$sql .= ' WHERE ( '.$self->{Sql}.' )';
|
||||
} else {
|
||||
# Only include closed events (events with valid EndTime)
|
||||
$sql .= ' WHERE (E.EndTime IS NOT NULL) AND ( '.$self->{Sql}.' )';
|
||||
|
|
|
@ -198,6 +198,7 @@ sub initialise( @ ) {
|
|||
my $this = shift;
|
||||
my %options = @_;
|
||||
|
||||
$this->{hasTerm} = -t STDERR;
|
||||
$this->{id} = $options{id} if defined($options{id});
|
||||
|
||||
$this->{logPath} = $options{logPath} if defined($options{logPath});
|
||||
|
@ -557,7 +558,7 @@ sub logPrint {
|
|||
if ( ! ( $this->{dbh} and $this->{dbh}->ping() ) ) {
|
||||
$this->{sth} = undef;
|
||||
if ( ! ( $this->{dbh} = ZoneMinder::Database::zmDbConnect() ) ) {
|
||||
print(STDERR "Can't log to database: ");
|
||||
#print(STDERR "Can't log to database: ");
|
||||
$this->{databaseLevel} = NOLOG;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -172,7 +172,7 @@ if ( !$server_up ) {
|
|||
exit();
|
||||
} elsif ( $command ne 'startup' ) {
|
||||
print("Unable to connect to server using socket at " . SOCK_FILE . "\n");
|
||||
exit( -1 );
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
# The server isn't there
|
||||
|
@ -210,7 +210,7 @@ if ( ($command eq 'check') && !$daemon ) {
|
|||
|
||||
# The server is there, connect to it
|
||||
CLIENT->autoflush();
|
||||
my $message = join(';', $command, ( $daemon ? $daemon : () ), @args );
|
||||
my $message = join(';', $command, ( $daemon ? $daemon : () ), @args);
|
||||
print(CLIENT $message);
|
||||
shutdown(CLIENT, 1);
|
||||
while( my $line = <CLIENT> ) {
|
||||
|
@ -242,6 +242,7 @@ use constant KILL_DELAY => 60; # seconds to wait between sending TERM and sendin
|
|||
our %cmd_hash;
|
||||
our %pid_hash;
|
||||
our %terminating_processes;
|
||||
our %pids_to_reap;
|
||||
our $zm_terminate = 0;
|
||||
|
||||
sub run {
|
||||
|
@ -280,7 +281,7 @@ sub run {
|
|||
bind(SERVER, $saddr) or Fatal("Can't bind to " . main::SOCK_FILE . ": $!");
|
||||
listen(SERVER, SOMAXCONN) or Fatal("Can't listen: $!");
|
||||
|
||||
$SIG{CHLD} = \&reaper;
|
||||
$SIG{CHLD} = \&chld_sig_handler;
|
||||
$SIG{INT} = \&shutdown_sig_handler;
|
||||
$SIG{TERM} = \&shutdown_sig_handler;
|
||||
$SIG{ABRT} = \&shutdown_sig_handler;
|
||||
|
@ -291,22 +292,15 @@ sub run {
|
|||
my $win = $rin;
|
||||
my $ein = $win;
|
||||
my $timeout = 1;
|
||||
my $Server = undef;
|
||||
my $secs_count = 0;
|
||||
|
||||
if ( $Config{ZM_SERVER_ID} ) {
|
||||
require ZoneMinder::Server;
|
||||
$Server = new ZoneMinder::Server($Config{ZM_SERVER_ID});
|
||||
dPrint(ZoneMinder::Logger::INFO, 'Loading Server record have ' . $$Server{Name});
|
||||
}
|
||||
|
||||
while( !$zm_terminate ) {
|
||||
|
||||
if ( $Config{ZM_SERVER_ID} ) {
|
||||
if ( ! ( $secs_count % 60 ) ) {
|
||||
Debug("Connecting");
|
||||
while ( (!$zm_terminate) and !($dbh and $dbh->ping()) ) {
|
||||
Warning("Not connected to db ($dbh)".($dbh?" ping(".$dbh->ping().")":''). ($DBI::errstr?" errstr($DBI::errstr)":'').' Reconnecting');
|
||||
Warning("Not connected to db ($dbh)".($dbh?' ping('.$dbh->ping().')':''). ($DBI::errstr?" errstr($DBI::errstr)":'').' Reconnecting');
|
||||
$dbh = zmDbConnect();
|
||||
}
|
||||
my @cpuload = CpuLoad();
|
||||
|
@ -340,7 +334,7 @@ sub run {
|
|||
# Do nothing, this is all we're here for
|
||||
dPrint(ZoneMinder::Logger::WARNING, "Already running, ignoring command '$command'\n");
|
||||
} elsif ( $command eq 'shutdown' ) {
|
||||
# Breka out of while loop
|
||||
# Break out of while loop
|
||||
last;
|
||||
} elsif ( $command eq 'check' ) {
|
||||
check($daemon, @args);
|
||||
|
@ -374,8 +368,8 @@ sub run {
|
|||
}
|
||||
|
||||
restartPending();
|
||||
check_for_processes_to_kill();
|
||||
|
||||
check_for_processes_to_kill() if %terminating_processes;
|
||||
reaper() if %pids_to_reap;
|
||||
} # end while
|
||||
|
||||
dPrint(ZoneMinder::Logger::INFO, 'Server exiting at '
|
||||
|
@ -392,6 +386,7 @@ sub run {
|
|||
}
|
||||
|
||||
sub cPrint {
|
||||
# One thought here, if no client exists to read these... does it block?
|
||||
if ( fileno(CLIENT) ) {
|
||||
print CLIENT @_
|
||||
}
|
||||
|
@ -400,10 +395,7 @@ sub cPrint {
|
|||
# I think the purpose of this is to echo the logs to the client process so it can then display them.
|
||||
sub dPrint {
|
||||
my $logLevel = shift;
|
||||
# One thought here, if no client exists to read these... does it block?
|
||||
if ( fileno(CLIENT) ) {
|
||||
print CLIENT @_
|
||||
}
|
||||
cPrint(@_);
|
||||
if ( $logLevel == ZoneMinder::Logger::DEBUG ) {
|
||||
Debug(@_);
|
||||
} elsif ( $logLevel == ZoneMinder::Logger::INFO ) {
|
||||
|
@ -438,7 +430,11 @@ sub start {
|
|||
my $sigset = POSIX::SigSet->new;
|
||||
my $blockset = POSIX::SigSet->new(SIGCHLD);
|
||||
sigprocmask(SIG_BLOCK, $blockset, $sigset) or Fatal("Can't block SIGCHLD: $!");
|
||||
# Apparently the child closing the db connection can affect the parent.
|
||||
zmDbDisconnect();
|
||||
if ( my $cpid = fork() ) {
|
||||
|
||||
$dbh = zmDbConnect(1);
|
||||
# This logReinit is required. Not sure why.
|
||||
#logReinit();
|
||||
|
||||
|
@ -454,7 +450,9 @@ sub start {
|
|||
$cmd_hash{$process->{command}} = $pid_hash{$cpid} = $process;
|
||||
sigprocmask(SIG_SETMASK, $sigset) or Fatal("Can't restore SIGCHLD: $!");
|
||||
} elsif ( defined($cpid) ) {
|
||||
# Force reconnection to the db.
|
||||
# Child process
|
||||
|
||||
# Force reconnection to the db. $dbh got copied, but isn't really valid anymore.
|
||||
$dbh = zmDbConnect(1);
|
||||
logReinit();
|
||||
|
||||
|
@ -471,7 +469,7 @@ sub start {
|
|||
|
||||
my @good_args;
|
||||
foreach my $arg ( @args ) {
|
||||
# Detaint arguments, if they look ok
|
||||
# Detaint arguments, if they look ok
|
||||
if ( $arg =~ /^(-{0,2}[\w\/?&=.-]+)$/ ) {
|
||||
push @good_args, $1;
|
||||
} else {
|
||||
|
@ -487,8 +485,8 @@ sub start {
|
|||
POSIX::close($fd++);
|
||||
}
|
||||
|
||||
# Child process
|
||||
$SIG{CHLD} = 'DEFAULT';
|
||||
$SIG{HUP} = 'DEFAULT';
|
||||
$SIG{INT} = 'DEFAULT';
|
||||
$SIG{TERM} = 'DEFAULT';
|
||||
$SIG{ABRT} = 'DEFAULT';
|
||||
|
@ -634,15 +632,24 @@ sub shutdown_sig_handler {
|
|||
$zm_terminate = 1;
|
||||
}
|
||||
|
||||
sub reaper {
|
||||
sub chld_sig_handler {
|
||||
my $saved_status = $!;
|
||||
|
||||
# Wait for a child to terminate
|
||||
while ( (my $cpid = waitpid(-1, WNOHANG)) > 0 ) {
|
||||
my $status = $?;
|
||||
$pids_to_reap{$cpid} = { status=>$?, stopped=>time() };
|
||||
} # end while waitpid
|
||||
$SIG{CHLD} = \&chld_sig_handler;
|
||||
$! = $saved_status;
|
||||
}
|
||||
|
||||
sub reaper {
|
||||
foreach my $cpid ( keys %pids_to_reap ) {
|
||||
my $process = $pid_hash{$cpid};
|
||||
delete $pid_hash{$cpid};
|
||||
my $reap_info = $pids_to_reap{$cpid};
|
||||
my ( $status, $stopped ) = @$reap_info{'status','stopped'};
|
||||
delete $pids_to_reap{$cpid};
|
||||
|
||||
if ( !$process ) {
|
||||
dPrint(ZoneMinder::Logger::INFO, "Can't find child with pid of '$cpid'\n");
|
||||
|
@ -651,7 +658,7 @@ sub reaper {
|
|||
delete $terminating_processes{$$process{command}};
|
||||
delete $$process{term_sent_at};
|
||||
|
||||
$process->{stopped} = time();
|
||||
$process->{stopped} = $stopped;
|
||||
$process->{runtime} = ($process->{stopped}-$process->{started});
|
||||
delete $process->{pid};
|
||||
|
||||
|
@ -704,10 +711,8 @@ sub reaper {
|
|||
} else {
|
||||
delete $cmd_hash{$$process{command}};
|
||||
}
|
||||
} # end while waitpid
|
||||
$SIG{CHLD} = \&reaper;
|
||||
$! = $saved_status;
|
||||
}
|
||||
} # end foreach pid_to_reap
|
||||
} # end sub reaper
|
||||
|
||||
sub restartPending {
|
||||
# Restart any pending processes, we list them first because cmd_hash may change in foreach
|
||||
|
@ -727,6 +732,8 @@ sub shutdownAll {
|
|||
send_stop(1, $pid_hash{$pid});
|
||||
}
|
||||
while ( keys %terminating_processes ) {
|
||||
|
||||
reaper() if %pids_to_reap;
|
||||
check_for_processes_to_kill();
|
||||
if ( %terminating_processes ) {
|
||||
Debug("Still " . %terminating_processes . ' to die. sleeping');
|
||||
|
|
|
@ -311,7 +311,7 @@ sub checkFilter {
|
|||
}
|
||||
if ( $Config{ZM_OPT_MESSAGE} && $filter->{AutoMessage} ) {
|
||||
if ( !$event->{Messaged} ) {
|
||||
$delete_ok = undef if !sendMessage($filter, $event);
|
||||
$delete_ok = undef if !sendMessage($filter, $Event);
|
||||
}
|
||||
}
|
||||
if ( $Config{ZM_OPT_UPLOAD} && $filter->{AutoUpload} ) {
|
||||
|
@ -835,7 +835,7 @@ sub sendEmail {
|
|||
|
||||
sub sendMessage {
|
||||
my $filter = shift;
|
||||
my $event = shift;
|
||||
my $Event = shift;
|
||||
|
||||
if ( ! $Config{ZM_FROM_EMAIL} ) {
|
||||
Error('No from email address defined, not sending message');
|
||||
|
@ -848,10 +848,10 @@ sub sendMessage {
|
|||
|
||||
Info('Creating notification message');
|
||||
|
||||
my $subject = substituteTags($Config{ZM_MESSAGE_SUBJECT}, $filter, $event);
|
||||
my $subject = substituteTags($Config{ZM_MESSAGE_SUBJECT}, $filter, $Event);
|
||||
return 0 if !$subject;
|
||||
my @attachments;
|
||||
my $body = substituteTags($Config{ZM_MESSAGE_BODY}, $filter, $event, \@attachments);
|
||||
my $body = substituteTags($Config{ZM_MESSAGE_BODY}, $filter, $Event, \@attachments);
|
||||
return 0 if !$body;
|
||||
|
||||
Info("Sending notification message '$subject'");
|
||||
|
@ -932,11 +932,11 @@ sub sendMessage {
|
|||
my $sql = 'UPDATE Events SET Messaged = 1 WHERE Id = ?';
|
||||
my $sth = $dbh->prepare_cached($sql)
|
||||
or Fatal("Unable toprepare '$sql': ".$dbh->errstr());
|
||||
my $res = $sth->execute($event->{Id})
|
||||
my $res = $sth->execute($Event->{Id})
|
||||
or Fatal("Unable toexecute '$sql': ".$dbh->errstr());
|
||||
|
||||
return 1;
|
||||
}
|
||||
} # end sub sendMessage
|
||||
|
||||
sub executeCommand {
|
||||
my $filter = shift;
|
||||
|
|
|
@ -85,7 +85,10 @@ public:
|
|||
|
||||
bool CanCapture() const { return( capture ); }
|
||||
|
||||
bool SupportsNativeVideo() const { return( (type == FFMPEG_SRC )||(type == REMOTE_SRC)); }
|
||||
bool SupportsNativeVideo() const {
|
||||
return (type == FFMPEG_SRC);
|
||||
//return (type == FFMPEG_SRC )||(type == REMOTE_SRC);
|
||||
}
|
||||
|
||||
virtual int PrimeCapture() { return( 0 ); }
|
||||
virtual int PreCapture()=0;
|
||||
|
|
|
@ -533,7 +533,7 @@ int RemoteCameraRtsp::CaptureAndRecord(Image &image, timeval recording, char* ev
|
|||
zm_av_packet_unref( &packet );
|
||||
} // end while ! framecomplete and buffer.size()
|
||||
if(frameComplete)
|
||||
return (0);
|
||||
return (1);
|
||||
} /* getFrame() */
|
||||
|
||||
} // end while true
|
||||
|
|
|
@ -17,12 +17,15 @@
|
|||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
//
|
||||
|
||||
#define __STDC_FORMAT_MACROS 1
|
||||
#include <cinttypes>
|
||||
#include "zm.h"
|
||||
#include "zm_db.h"
|
||||
#include "zm_zone.h"
|
||||
#include "zm_image.h"
|
||||
#include "zm_monitor.h"
|
||||
|
||||
|
||||
void Zone::Setup(
|
||||
Monitor *p_monitor,
|
||||
int p_id,
|
||||
|
|
|
@ -257,11 +257,14 @@ execpackpack () {
|
|||
fi
|
||||
|
||||
if [ "${TRAVIS}" == "true" ]; then
|
||||
utils/packpack/heartbeat.sh &
|
||||
mypid=$!
|
||||
packpack/packpack $parms > buildlog.txt 2>&1
|
||||
kill $mypid
|
||||
tail -n 3000 buildlog.txt | grep -v ONVIF
|
||||
# Travis will fail the build if the output gets too long
|
||||
# To mitigate that, use grep to filter out some of the noise
|
||||
if [ "${ARCH}" != "armhf" ]; then
|
||||
packpack/packpack $parms | grep -Ev '^(-- Installing:|-- Up-to-date:|Skip blib|Manifying|Installing /build|cp lib|writing output...|copying images...|reading sources...|[Working])'
|
||||
else
|
||||
# Travis never ceases to amaze. For the case of arm emulation, Travis fails the build due to too little output over a 10 minute period. Facepalm.
|
||||
packpack/packpack $parms | grep -Ev '^(-- Installing:|-- Up-to-date:|Skip blib|Installing /build|cp lib|writing output...|copying images...|reading sources...|[Working])'
|
||||
fi
|
||||
else
|
||||
packpack/packpack $parms
|
||||
fi
|
||||
|
|
|
@ -335,13 +335,13 @@ private $control_fields = array(
|
|||
}
|
||||
|
||||
if ( $mode == 'stop' ) {
|
||||
daemonControl( 'stop', 'zmc', $zmcArgs );
|
||||
daemonControl('stop', 'zmc', $zmcArgs);
|
||||
} else {
|
||||
if ( $mode == 'restart' ) {
|
||||
daemonControl( 'stop', 'zmc', $zmcArgs );
|
||||
daemonControl('stop', 'zmc', $zmcArgs);
|
||||
}
|
||||
if ( $this->{'Function'} != 'None' ) {
|
||||
daemonControl( 'start', 'zmc', $zmcArgs );
|
||||
daemonControl('start', 'zmc', $zmcArgs);
|
||||
}
|
||||
}
|
||||
} else if ( $this->ServerId() ) {
|
||||
|
@ -378,6 +378,8 @@ private $control_fields = array(
|
|||
} catch ( Exception $e ) {
|
||||
Error("Except $e thrown trying to restart zmc");
|
||||
}
|
||||
} else {
|
||||
Error("Server not assigned to Monitor in a multi-server setup. Please assign a server to the Monitor.");
|
||||
}
|
||||
} // end function zmcControl
|
||||
|
||||
|
@ -385,9 +387,9 @@ private $control_fields = array(
|
|||
if ( (!defined('ZM_SERVER_ID')) or ( array_key_exists('ServerId', $this) and (ZM_SERVER_ID==$this->{'ServerId'}) ) ) {
|
||||
if ( $this->{'Function'} == 'None' || $this->{'Function'} == 'Monitor' || $mode == 'stop' ) {
|
||||
if ( ZM_OPT_CONTROL ) {
|
||||
daemonControl( 'stop', 'zmtrack.pl', '-m '.$this->{'Id'} );
|
||||
daemonControl('stop', 'zmtrack.pl', '-m '.$this->{'Id'});
|
||||
}
|
||||
daemonControl( 'stop', 'zma', '-m '.$this->{'Id'} );
|
||||
daemonControl('stop', 'zma', '-m '.$this->{'Id'});
|
||||
} else {
|
||||
if ( $mode == 'restart' ) {
|
||||
if ( ZM_OPT_CONTROL ) {
|
||||
|
@ -404,7 +406,8 @@ private $control_fields = array(
|
|||
}
|
||||
}
|
||||
} // end if we are on the recording server
|
||||
}
|
||||
} // end public function zmaControl
|
||||
|
||||
public function GroupIds( $new='') {
|
||||
if ( $new != '' ) {
|
||||
if(!is_array($new)) {
|
||||
|
|
|
@ -492,8 +492,8 @@ if ( canEdit( 'Monitors' ) ) {
|
|||
|
||||
# If we change anything that changes the shared mem size, zma can complain. So let's stop first.
|
||||
if ( $monitor['Type'] != 'WebSite' ) {
|
||||
zmaControl( $monitor, 'stop' );
|
||||
zmcControl( $monitor, 'stop' );
|
||||
zmaControl($monitor, 'stop');
|
||||
zmcControl($monitor, 'stop');
|
||||
}
|
||||
dbQuery( 'UPDATE Monitors SET '.implode( ', ', $changes ).' WHERE Id=?', array($mid) );
|
||||
// Groups will be added below
|
||||
|
@ -567,6 +567,8 @@ if ( canEdit( 'Monitors' ) ) {
|
|||
}
|
||||
|
||||
$restart = true;
|
||||
} else {
|
||||
Logger::Debug("No action due to no changes to Monitor");
|
||||
} # end if count(changes)
|
||||
|
||||
if (
|
||||
|
|
|
@ -182,7 +182,7 @@ function refreshParentWindow() {
|
|||
}
|
||||
}
|
||||
|
||||
if ( currentView != 'none' ) {
|
||||
if ( currentView != 'none' && currentView != 'login' ) {
|
||||
$j.ajaxSetup ({timeout: AJAX_TIMEOUT }); //sets timeout for all getJSON.
|
||||
|
||||
$j(document).ready(function() {
|
||||
|
@ -197,6 +197,8 @@ if ( currentView != 'none' ) {
|
|||
.fail(function( jqxhr, textStatus, error ) {
|
||||
var err = textStatus + ", " + error;
|
||||
console.log( "Request Failed: " + err );
|
||||
// The idea is that this should only fail due to auth, so reload the page
|
||||
// which should go to login if it can't stay logged in.
|
||||
window.location.href = thisUrl;
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue