174 lines
6.3 KiB
Perl
174 lines
6.3 KiB
Perl
|
#!/usr/bin/perl -wT
|
||
|
#
|
||
|
# ==========================================================================
|
||
|
#
|
||
|
# ZoneMinder WatchDog Script, $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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||
|
#
|
||
|
# ==========================================================================
|
||
|
|
||
|
=head1 NAME
|
||
|
|
||
|
zmwatch.pl - ZoneMinder Stats Updating Script
|
||
|
|
||
|
=head1 SYNOPSIS
|
||
|
|
||
|
zmstats.pl
|
||
|
|
||
|
=head1 DESCRIPTION
|
||
|
|
||
|
This does background updating various stats in the db like event counts, diskspace, etc.
|
||
|
|
||
|
=cut
|
||
|
use strict;
|
||
|
use bytes;
|
||
|
|
||
|
# ==========================================================================
|
||
|
#
|
||
|
# These are the elements you can edit to suit your installation
|
||
|
#
|
||
|
# ==========================================================================
|
||
|
|
||
|
use constant START_DELAY => 30; # To give everything else time to start
|
||
|
|
||
|
# ==========================================================================
|
||
|
#
|
||
|
# Don't change anything below here
|
||
|
#
|
||
|
# ==========================================================================
|
||
|
|
||
|
@EXTRA_PERL_LIB@
|
||
|
use ZoneMinder;
|
||
|
use ZoneMinder::Storage;
|
||
|
use POSIX;
|
||
|
use DBI;
|
||
|
use autouse 'Data::Dumper'=>qw(Dumper);
|
||
|
|
||
|
$| = 1;
|
||
|
|
||
|
$ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
|
||
|
$ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
|
||
|
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
|
||
|
|
||
|
logInit();
|
||
|
logSetSignal();
|
||
|
|
||
|
Info( "Stats Daemon starting in ".START_DELAY." seconds\n" );
|
||
|
sleep( START_DELAY );
|
||
|
|
||
|
my $dbh = zmDbConnect();
|
||
|
|
||
|
my $sql = $Config{ZM_SERVER_ID} ? 'SELECT * FROM Monitors WHERE ServerId=?' : 'SELECT * FROM Monitors';
|
||
|
my $sth = $dbh->prepare_cached( $sql )
|
||
|
or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
|
||
|
|
||
|
my $eventcounts_sql = q`
|
||
|
UPDATE Monitors INNER JOIN (
|
||
|
SELECT MonitorId,
|
||
|
COUNT(Id) AS TotalEvents,
|
||
|
SUM(DiskSpace) AS TotalEventDiskSpace,
|
||
|
SUM(IF(Archived,1,0)) AS ArchivedEvents,
|
||
|
SUM(IF(Archived,DiskSpace,0)) AS ArchivedEventDiskSpace,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 hour),1,0)) AS HourEvents,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 hour),DiskSpace,0)) AS HourEventDiskSpace,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 day),1,0)) AS DayEvents,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 day),DiskSpace,0)) AS DayEventDiskSpace,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 week),1,0)) AS WeekEvents,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 week),DiskSpace,0)) AS WeekEventDiskSpace,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 month),1,0)) AS MonthEvents,
|
||
|
SUM(IF(StartTime > DATE_SUB(NOW(), INTERVAL 1 month),DiskSpace,0)) AS MonthEventDiskSpace
|
||
|
FROM Events GROUP BY MonitorId
|
||
|
) AS E ON E.MonitorId=Monitors.Id SET
|
||
|
Monitors.TotalEvents = E.TotalEvents,
|
||
|
Monitors.TotalEventDiskSpace = E.TotalEventDiskSpace,
|
||
|
Monitors.ArchivedEvents = E.ArchivedEvents,
|
||
|
Monitors.ArchivedEventDiskSpace = E.ArchivedEventDiskSpace,
|
||
|
Monitors.HourEvents = E.HourEvents,
|
||
|
Monitors.HourEventDiskSpace = E.HourEventDiskSpace,
|
||
|
Monitors.DayEvents = E.DayEvents,
|
||
|
Monitors.DayEventDiskSpace = E.DayEventDiskSpace,
|
||
|
Monitors.WeekEvents = E.WeekEvents,
|
||
|
Monitors.WeekEventDiskSpace = E.WeekEventDiskSpace,
|
||
|
Monitors.MonthEvents = E.MonthEvents,
|
||
|
Monitors.MonthEventDiskSpace = E.MonthEventDiskSpace
|
||
|
`;
|
||
|
|
||
|
|
||
|
my $eventcounts_hour_sql = q`
|
||
|
UPDATE Monitors INNER JOIN (
|
||
|
SELECT MonitorId, COUNT(*) AS HourEvents, SUM(DiskSpace) AS HourEventDiskSpace
|
||
|
FROM Events_Hour GROUP BY MonitorId
|
||
|
) AS E ON E.MonitorId=Monitors.Id SET
|
||
|
Monitors.HourEvents = E.HourEvents,
|
||
|
Monitors.HourEventDiskSpace = E.HourEventDiskSpace
|
||
|
`;
|
||
|
|
||
|
|
||
|
my $eventcounts_day_sql = q`
|
||
|
UPDATE Monitors INNER JOIN (
|
||
|
SELECT MonitorId, COUNT(*) AS DayEvents, SUM(DiskSpace) AS DayEventDiskSpace
|
||
|
FROM Events_Day GROUP BY MonitorId
|
||
|
) AS E ON E.MonitorId=Monitors.Id SET
|
||
|
Monitors.DayEvents = E.DayEvents,
|
||
|
Monitors.DayEventDiskSpace = E.DayEventDiskSpace
|
||
|
`;
|
||
|
|
||
|
my $eventcounts_week_sql = q`
|
||
|
UPDATE Monitors INNER JOIN (
|
||
|
SELECT MonitorId, COUNT(*) AS WeekEvents, SUM(DiskSpace) AS WeekEventDiskSpace
|
||
|
FROM Events_Week GROUP BY MonitorId
|
||
|
) AS E ON E.MonitorId=Monitors.Id SET
|
||
|
Monitors.WeekEvents = E.WeekEvents,
|
||
|
Monitors.WeekEventDiskSpace = E.WeekEventDiskSpace
|
||
|
`;
|
||
|
|
||
|
my $eventcounts_month_sql = q`
|
||
|
UPDATE Monitors INNER JOIN (
|
||
|
SELECT MonitorId, COUNT(*) AS MonthEvents, SUM(DiskSpace) AS MonthEventDiskSpace
|
||
|
FROM Events_Month GROUP BY MonitorId
|
||
|
) AS E ON E.MonitorId=Monitors.Id SET
|
||
|
Monitors.MonthEvents = E.MonthEvents,
|
||
|
Monitors.MonthEventDiskSpace = E.MonthEventDiskSpace
|
||
|
`;
|
||
|
|
||
|
|
||
|
my $eventcounts_sth = $dbh->prepare_cached( $eventcounts_sql );
|
||
|
my $eventcounts_hour_sth = $dbh->prepare_cached( $eventcounts_hour_sql );
|
||
|
my $eventcounts_day_sth = $dbh->prepare_cached( $eventcounts_day_sql );
|
||
|
my $eventcounts_week_sth = $dbh->prepare_cached( $eventcounts_week_sql );
|
||
|
my $eventcounts_month_sth = $dbh->prepare_cached( $eventcounts_month_sql );
|
||
|
|
||
|
while( 1 ) {
|
||
|
$dbh->ping();
|
||
|
|
||
|
$dbh->do('DELETE FROM Events_Hour WHERE StartTime < DATE_SUB(NOW(), INTERVAL 1 hour)');
|
||
|
$dbh->do('DELETE FROM Events_Day WHERE StartTime < DATE_SUB(NOW(), INTERVAL 1 day)');
|
||
|
$dbh->do('DELETE FROM Events_Week WHERE StartTime < DATE_SUB(NOW(), INTERVAL 1 week)');
|
||
|
$dbh->do('DELETE FROM Events_Month WHERE StartTime < DATE_SUB(NOW(), INTERVAL 1 month)');
|
||
|
$eventcounts_hour_sth->execute( ) or Error( "Can't execute: ".$eventcounts_sth->errstr() );
|
||
|
$eventcounts_day_sth->execute( ) or Error( "Can't execute: ".$eventcounts_sth->errstr() );
|
||
|
$eventcounts_week_sth->execute( ) or Error( "Can't execute: ".$eventcounts_sth->errstr() );
|
||
|
$eventcounts_month_sth->execute( ) or Error( "Can't execute: ".$eventcounts_sth->errstr() );
|
||
|
|
||
|
sleep( $Config{ZM_STATS_CHECK_INTERVAL} );
|
||
|
} # end while (1)
|
||
|
|
||
|
Info( "Stats Daemon exiting\n" );
|
||
|
exit();
|
||
|
1;
|
||
|
__END__
|