Merge branch 'storageareas' into tesla
This commit is contained in:
commit
ef16393402
|
@ -216,6 +216,57 @@ CREATE TABLE `Events` (
|
||||||
KEY `Events_EndTime_DiskSpace` (`EndTime`,`DiskSpace`)
|
KEY `Events_EndTime_DiskSpace` (`EndTime`,`DiskSpace`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `Events_Hour`;
|
||||||
|
CREATE TABLE `Events_Hour` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Hour_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `Events_Day`;
|
||||||
|
CREATE TABLE `Events_Day` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Day_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `Events_Week`;
|
||||||
|
CREATE TABLE `Events_Week` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Week_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `Events_Month`;
|
||||||
|
CREATE TABLE `Events_Month` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Month_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `Events_Archived`;
|
||||||
|
CREATE TABLE `Events_Archived` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Month_MonitorId_idx` (`MonitorId`)
|
||||||
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `Filters`
|
-- Table structure for table `Filters`
|
||||||
--
|
--
|
||||||
|
@ -274,7 +325,7 @@ CREATE TABLE `Groups` (
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
--
|
--
|
||||||
--Table structure for table `Groups_Monitors`
|
-- Table structure for table `Groups_Monitors`
|
||||||
--
|
--
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `Groups_Monitors`;
|
DROP TABLE IF EXISTS `Groups_Monitors`;
|
||||||
|
@ -285,8 +336,8 @@ CREATE TABLE `Groups_Monitors` (
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
CREATE INDEX `Groups_Monitors_GroupId_idx` ON `Groups` (`GroupId`);
|
CREATE INDEX `Groups_Monitors_GroupId_idx` ON `Groups_Monitors` (`GroupId`);
|
||||||
CREATE INDEX `Groups_Monitors_MonitorId_idx` ON `Groups` (`MonitorId`);
|
CREATE INDEX `Groups_Monitors_MonitorId_idx` ON `Groups_Monitors` (`MonitorId`);
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `Logs`
|
-- Table structure for table `Logs`
|
||||||
|
@ -501,6 +552,9 @@ CREATE TABLE `Servers` (
|
||||||
`FreeMem` bigint unsigned default null,
|
`FreeMem` bigint unsigned default null,
|
||||||
`TotalSwap` bigint unsigned default null,
|
`TotalSwap` bigint unsigned default null,
|
||||||
`FreeSwap` bigint unsigned default null,
|
`FreeSwap` bigint unsigned default null,
|
||||||
|
`zmstats.pl` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
|
`zmaudit.pl` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
|
`zmtrigger.pl` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
@ -639,7 +693,7 @@ CREATE TABLE `Storage` (
|
||||||
`Name` varchar(64) NOT NULL default '',
|
`Name` varchar(64) NOT NULL default '',
|
||||||
`Type` enum('local','s3fs') NOT NULL default 'local',
|
`Type` enum('local','s3fs') NOT NULL default 'local',
|
||||||
`DiskSpace` bigint unsigned default NULL,
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
`Scheme enum('Deep','Medium','Shallow') NOT NULL default 'Medium',
|
`Scheme` enum('Deep','Medium','Shallow') NOT NULL default 'Medium',
|
||||||
`ServerId` int(10) unsigned,
|
`ServerId` int(10) unsigned,
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
@ -647,7 +701,7 @@ CREATE TABLE `Storage` (
|
||||||
--
|
--
|
||||||
-- Create a default storage location
|
-- Create a default storage location
|
||||||
--
|
--
|
||||||
insert into Storage VALUES (NULL, '/var/cache/zoneminder/events', 'Default', 'local', NULL );
|
insert into Storage VALUES (NULL, '/var/cache/zoneminder/events', 'Default', 'local', NULL, 'Medium', 0 );
|
||||||
|
|
||||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||||
|
@ -669,22 +723,6 @@ insert into Users VALUES (NULL,'admin',password('admin'),'',1,'View','Edit','Edi
|
||||||
--
|
--
|
||||||
-- Add a sample filter to purge the oldest 100 events when the disk is 95% full
|
-- Add a sample filter to purge the oldest 100 events when the disk is 95% full
|
||||||
--
|
--
|
||||||
`Id` int(10) unsigned NOT NULL auto_increment,
|
|
||||||
`Name` varchar(64) NOT NULL default '',
|
|
||||||
`Query` text NOT NULL,
|
|
||||||
`AutoArchive` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoVideo` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoUpload` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoEmail` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoMessage` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoExecute` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoExecuteCmd` tinytext,
|
|
||||||
`AutoDelete` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoMove` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`AutoMoveTo` smallint(5) unsigned NOT NULL default 0,
|
|
||||||
`UpdateDiskSpace` tinyint(3) unsigned NOT NULL default '0',
|
|
||||||
`Background` tinyint(1) unsigned NOT NULL default '0',
|
|
||||||
`Concurrent` tinyint(1) unsigned NOT NULL default '0',
|
|
||||||
|
|
||||||
insert into Filters values (NULL,'PurgeWhenFull','{"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="}],"limit":100,"sort_asc":1}',0/*AutoArchive*/,0/*AutoVideo*/,0/*AutoUpload*/,0/*AutoEmail*/,0/*AutoMessage*/,0/*AutoExecute*/,'',1/*AutoDelete*/,0/*AutoMove*/,0/*MoveTo*/,0/*UpdateDiskSpace*/,1/*Background*/,0/*Concurrent*/);
|
insert into Filters values (NULL,'PurgeWhenFull','{"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="}],"limit":100,"sort_asc":1}',0/*AutoArchive*/,0/*AutoVideo*/,0/*AutoUpload*/,0/*AutoEmail*/,0/*AutoMessage*/,0/*AutoExecute*/,'',1/*AutoDelete*/,0/*AutoMove*/,0/*MoveTo*/,0/*UpdateDiskSpace*/,1/*Background*/,0/*Concurrent*/);
|
||||||
insert into Filters values (NULL,'Update DiskSpace','{"terms":[{"attr":"DiskSpace","op":"IS","val":"NULL"}]}',0,0,0,0,0,0,'',0,0,0,1,1,0);
|
insert into Filters values (NULL,'Update DiskSpace','{"terms":[{"attr":"DiskSpace","op":"IS","val":"NULL"}]}',0,0,0,0,0,0,'',0,0,0,1,1,0);
|
||||||
|
@ -807,16 +845,20 @@ INSERT INTO ZonePresets VALUES (5,'Best, low sensitivity','Active','Percent','Bl
|
||||||
INSERT INTO ZonePresets VALUES (6,'Best, medium sensitivity','Active','Percent','Blobs',40,NULL,16,NULL,5,5,12,NULL,10,NULL,1,NULL,0,0);
|
INSERT INTO ZonePresets VALUES (6,'Best, medium sensitivity','Active','Percent','Blobs',40,NULL,16,NULL,5,5,12,NULL,10,NULL,1,NULL,0,0);
|
||||||
INSERT INTO ZonePresets VALUES (7,'Best, high sensitivity','Active','Percent','Blobs',20,NULL,8,NULL,3,3,6,NULL,5,NULL,1,NULL,0,0);
|
INSERT INTO ZonePresets VALUES (7,'Best, high sensitivity','Active','Percent','Blobs',20,NULL,8,NULL,3,3,6,NULL,5,NULL,1,NULL,0,0);
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS Maps;
|
||||||
|
|
||||||
CREATE TABLE Maps (
|
CREATE TABLE Maps (
|
||||||
`Id` int(10) unsigned NOT NULL auto_increment,
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
`Name` TEXT NOT NULL,
|
`Name` VARCHAR(64) NOT NULL,
|
||||||
`Filename` TEXT NOT NULL default '',
|
`Filename` VARCHAR(64) NOT NULL default '',
|
||||||
`NumCoords` tinyint(3) unsigned NOT NULL default '0',
|
`NumCoords` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`Coords` tinytext NOT NULL,
|
`Coords` tinytext NOT NULL,
|
||||||
`ParentId` int(1) unsigned,
|
`ParentId` int(1) unsigned,
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS MontageLayout;
|
||||||
|
|
||||||
CREATE TABLE MontageLayouts (
|
CREATE TABLE MontageLayouts (
|
||||||
`Id` int(10) unsigned NOT NULL auto_increment,
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
`Name` TEXT NOT NULL,
|
`Name` TEXT NOT NULL,
|
||||||
|
|
|
@ -0,0 +1,275 @@
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Events_Hour'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Events_Hour table exists'",
|
||||||
|
"
|
||||||
|
CREATE TABLE `Events_Hour` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Hour_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
);
|
||||||
|
"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Events_Day'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Events_Day table exists'",
|
||||||
|
"
|
||||||
|
CREATE TABLE `Events_Day` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Day_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
);
|
||||||
|
"));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Events_Week'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Events_Week table exists'",
|
||||||
|
"
|
||||||
|
CREATE TABLE `Events_Week` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Week_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
);
|
||||||
|
"));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Events_Month'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Events_Month table exists'",
|
||||||
|
"
|
||||||
|
CREATE TABLE `Events_Month` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`StartTime` datetime default NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Month_MonitorId_StartTime_idx` (`MonitorId`,`StartTime`)
|
||||||
|
);
|
||||||
|
"));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Events_Archived'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Events_Archived table exists'",
|
||||||
|
"
|
||||||
|
CREATE TABLE `Events_Archived` (
|
||||||
|
`EventId` int(10) unsigned NOT NULL,
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`DiskSpace` bigint unsigned default NULL,
|
||||||
|
PRIMARY KEY (`EventId`),
|
||||||
|
KEY `Events_Month_MonitorId_idx` (`MonitorId`)
|
||||||
|
);
|
||||||
|
"));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
drop trigger if exists event_update_trigger;
|
||||||
|
|
||||||
|
delimiter //
|
||||||
|
|
||||||
|
CREATE TRIGGER event_update_trigger AFTER UPDATE ON Events
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
declare diff BIGINT default 0;
|
||||||
|
|
||||||
|
set diff = NEW.DiskSpace - OLD.DiskSpace;
|
||||||
|
IF ( NEW.StorageId = OLD.StorageID ) THEN
|
||||||
|
IF ( diff ) THEN
|
||||||
|
call update_storage_stats(OLD.StorageId, diff);
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
IF ( NEW.DiskSpace ) THEN
|
||||||
|
call update_storage_stats(NEW.StorageId, NEW.DiskSpace);
|
||||||
|
END IF;
|
||||||
|
IF ( OLD.DiskSpace ) THEN
|
||||||
|
call update_storage_stats(OLD.StorageId, -OLD.DiskSpace);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
UPDATE Events_Hour SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
|
UPDATE Events_Day SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
|
UPDATE Events_Week SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
|
UPDATE Events_Month SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
|
IF ( NEW.Archived != OLD.Archived ) THEN
|
||||||
|
IF ( NEW.Archived ) THEN
|
||||||
|
INSERT INTO Events_Archived (EventId,MonitorId,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.DiskSpace);
|
||||||
|
UPDATE Monitors SET ArchivedEvents = ArchivedEvents+1, ArchivedEventDiskSpace = ArchivedEventDiskSpace + NEW.DiskSpace WHERE Id=NEW.MonitorId;
|
||||||
|
ELSEIF ( OLD.Archived ) THEN
|
||||||
|
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
||||||
|
UPDATE Monitors SET ArchivedEvents =ArchivedEvents-1, ArchivedEventDiskSpace = ArchivedEventDiskSpace - OLD.DiskSpace WHERE Id=OLD.MonitorId;
|
||||||
|
ELSE
|
||||||
|
IF ( OLD.DiskSpace != NEW.DiskSpace ) THEN
|
||||||
|
UPDATE Events_Archived SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
|
UPDATE Monitors SET
|
||||||
|
ArchivedEventDiskSpace = ArchivedEventDiskSpace - OLD.DiskSpace + NEW.DiskSpace
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF ( OLD.DiskSpace != NEW.DiskSpace ) THEN
|
||||||
|
UPDATE Monitors SET TotalEventDiskSpace = TotalEventDiskSpace - OLD.DiskSpace + NEW.DiskSpace WHERE Id=OLD.MonitorId;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
delimiter ;
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS event_insert_trigger;
|
||||||
|
|
||||||
|
delimiter //
|
||||||
|
create trigger event_insert_trigger after insert on Events
|
||||||
|
for each row
|
||||||
|
begin
|
||||||
|
|
||||||
|
INSERT INTO Events_Hour (EventId,MonitorId,StartTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartTime,0);
|
||||||
|
INSERT INTO Events_Day (EventId,MonitorId,StartTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartTime,0);
|
||||||
|
INSERT INTO Events_Week (EventId,MonitorId,StartTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartTime,0);
|
||||||
|
INSERT INTO Events_Month (EventId,MonitorId,StartTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartTime,0);
|
||||||
|
end;
|
||||||
|
//
|
||||||
|
|
||||||
|
delimiter ;
|
||||||
|
|
||||||
|
|
||||||
|
drop trigger if exists event_delete_trigger;
|
||||||
|
|
||||||
|
delimiter //
|
||||||
|
|
||||||
|
CREATE TRIGGER event_delete_trigger BEFORE DELETe on Events
|
||||||
|
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
call update_storage_stats(OLD.StorageId, -OLD.DiskSpace);
|
||||||
|
DELETE FROM Events_Hour WHERE EventId=OLD.Id;
|
||||||
|
DELETE FROM Events_Day WHERE EventId=OLD.Id;
|
||||||
|
DELETE FROM Events_Week WHERE EventId=OLD.Id;
|
||||||
|
DELETE FROM Events_Month WHERE EventId=OLD.Id;
|
||||||
|
IF ( OLD.Archived ) THEN
|
||||||
|
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
||||||
|
UPDATE Monitors SET
|
||||||
|
ArchivedEvents = ArchivedEvents - 1,
|
||||||
|
ArchivedEventDiskSpace = ArchivedEventDiskSpace - OLD.DiskSpace,
|
||||||
|
TotalEvents = TotalEvents - 1,
|
||||||
|
TotalEventDiskSpace = TotalEventDiskSpace - OLD.DiskSpace
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
ELSE
|
||||||
|
UPDATE Monitors SET
|
||||||
|
TotalEvents = TotalEvents-1,
|
||||||
|
TotalEventDiskSpace=TotalEventDiskSpace-OLD.DiskSpace
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
delimiter ;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'zmstats.pl'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column zmstats.pl already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `zmstats.pl` BOOLEAN NOT NULL DEFAULT FALSE AFTER `FreeSwap`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'zmaudit.pl'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column zmaudit.pl already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `zmaudit.pl` BOOLEAN NOT NULL DEFAULT FALSE AFTER `zmstats.pl`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'zmtrigger.pl'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column zmtrigger.pl already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `zmtrigger.pl` BOOLEAN NOT NULL DEFAULT FALSE AFTER `zmaudit.pl`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
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;
|
|
@ -4,7 +4,8 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=ZoneMinder CCTV recording and surveillance system
|
Description=ZoneMinder CCTV recording and surveillance system
|
||||||
After=network.target mysql.service
|
After=network.target mysql.service
|
||||||
Requires=mysql.service
|
# Remarked out so that it will start ZM on machines that don't have mysql installed
|
||||||
|
#Requires=mysql.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
#User=www-data
|
#User=www-data
|
||||||
|
@ -13,7 +14,10 @@ ExecStart=/usr/bin/zmpkg.pl start
|
||||||
ExecReload=/usr/bin/zmpkg.pl restart
|
ExecReload=/usr/bin/zmpkg.pl restart
|
||||||
ExecStop=/usr/bin/zmpkg.pl stop
|
ExecStop=/usr/bin/zmpkg.pl stop
|
||||||
PIDFile=/var/run/zm/zm.pid
|
PIDFile=/var/run/zm/zm.pid
|
||||||
Restart=on-abnormal
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
Environment=TZ=:/etc/localtime
|
||||||
|
TimeoutSec=600
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
|
@ -17,6 +17,7 @@ PIDFile=/var/run/zm/zm.pid
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=10
|
RestartSec=10
|
||||||
Environment=TZ=:/etc/localtime
|
Environment=TZ=:/etc/localtime
|
||||||
|
TimeoutSec=600
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
|
@ -14,6 +14,7 @@ configure_file(zmtrigger.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmtrigger.pl" @ONLY)
|
||||||
configure_file(zmupdate.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmupdate.pl" @ONLY)
|
configure_file(zmupdate.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmupdate.pl" @ONLY)
|
||||||
configure_file(zmvideo.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmvideo.pl" @ONLY)
|
configure_file(zmvideo.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmvideo.pl" @ONLY)
|
||||||
configure_file(zmwatch.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmwatch.pl" @ONLY)
|
configure_file(zmwatch.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmwatch.pl" @ONLY)
|
||||||
|
configure_file(zmstats.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmstats.pl" @ONLY)
|
||||||
configure_file(zmcamtool.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmcamtool.pl" @ONLY)
|
configure_file(zmcamtool.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmcamtool.pl" @ONLY)
|
||||||
configure_file(zmsystemctl.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmsystemctl.pl" @ONLY)
|
configure_file(zmsystemctl.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmsystemctl.pl" @ONLY)
|
||||||
configure_file(zmtelemetry.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmtelemetry.pl" @ONLY)
|
configure_file(zmtelemetry.pl.in "${CMAKE_CURRENT_BINARY_DIR}/zmtelemetry.pl" @ONLY)
|
||||||
|
@ -33,7 +34,7 @@ FOREACH(PERLSCRIPT ${perlscripts})
|
||||||
ENDFOREACH(PERLSCRIPT ${perlscripts})
|
ENDFOREACH(PERLSCRIPT ${perlscripts})
|
||||||
|
|
||||||
# Install the perl scripts
|
# Install the perl scripts
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmaudit.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcontrol.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmdc.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmfilter.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmpkg.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrack.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrigger.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmupdate.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmvideo.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmwatch.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcamtool.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtelemetry.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmaudit.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcontrol.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmdc.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmfilter.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmpkg.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrack.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrigger.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmupdate.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmvideo.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmwatch.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcamtool.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtelemetry.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmstats.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
if(NOT ZM_NO_X10)
|
if(NOT ZM_NO_X10)
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmx10.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmx10.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
endif(NOT ZM_NO_X10)
|
endif(NOT ZM_NO_X10)
|
||||||
|
|
|
@ -1451,6 +1451,17 @@ our @options = (
|
||||||
type => $types{boolean},
|
type => $types{boolean},
|
||||||
category => 'logging',
|
category => 'logging',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name => 'ZM_WEB_TITLE',
|
||||||
|
default => 'ZoneMinder',
|
||||||
|
description => 'The title displayed wherever the site references itself.',
|
||||||
|
help => q`
|
||||||
|
If you want the site to identify as something other than ZoneMinder, change this here.
|
||||||
|
It can be used to more accurately identify this installation from others.
|
||||||
|
`,
|
||||||
|
type => $types{string},
|
||||||
|
category => 'web',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name => 'ZM_WEB_TITLE_PREFIX',
|
name => 'ZM_WEB_TITLE_PREFIX',
|
||||||
default => 'ZM',
|
default => 'ZM',
|
||||||
|
@ -1464,6 +1475,27 @@ our @options = (
|
||||||
type => $types{string},
|
type => $types{string},
|
||||||
category => 'web',
|
category => 'web',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name => 'ZM_HOME_URL',
|
||||||
|
default => 'http://zoneminder.com',
|
||||||
|
description => 'The url used in the home/logo area of the navigation bar.',
|
||||||
|
help => q`
|
||||||
|
By default this takes you to the zoneminder.com website,
|
||||||
|
but perhaps you would prefer it to take you somewhere else.
|
||||||
|
`,
|
||||||
|
type => $types{string},
|
||||||
|
category => 'web',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name => 'ZM_HOME_CONTENT',
|
||||||
|
default => 'ZoneMinder',
|
||||||
|
description => 'The content of the home button.',
|
||||||
|
help => q`
|
||||||
|
You may wish to set this to empty if you are using css to put a background image on it.
|
||||||
|
`,
|
||||||
|
type => $types{string},
|
||||||
|
category => 'web',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name => 'ZM_WEB_CONSOLE_BANNER',
|
name => 'ZM_WEB_CONSOLE_BANNER',
|
||||||
default => '',
|
default => '',
|
||||||
|
@ -2367,6 +2399,17 @@ our @options = (
|
||||||
type => $types{integer},
|
type => $types{integer},
|
||||||
category => 'system',
|
category => 'system',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name => 'ZM_STATS_UPDATE_INTERVAL',
|
||||||
|
default => '60',
|
||||||
|
description => 'How often to update the database statistics',
|
||||||
|
help => q`
|
||||||
|
The zmstats daemon performs various db queries that may take
|
||||||
|
a long time in the background.
|
||||||
|
`,
|
||||||
|
type => $types{integer},
|
||||||
|
category => 'system',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name => 'ZM_WATCH_CHECK_INTERVAL',
|
name => 'ZM_WATCH_CHECK_INTERVAL',
|
||||||
default => '10',
|
default => '10',
|
||||||
|
|
|
@ -141,7 +141,8 @@ sub new {
|
||||||
$this->{idArgs} = '';
|
$this->{idArgs} = '';
|
||||||
|
|
||||||
$this->{level} = INFO;
|
$this->{level} = INFO;
|
||||||
if (-t STDIN) {
|
$this->{hasTerm} = -t STDERR;
|
||||||
|
if ( $this->{hasTerm} ) {
|
||||||
$this->{termLevel} = INFO;
|
$this->{termLevel} = INFO;
|
||||||
} else {
|
} else {
|
||||||
$this->{termLevel} = NOLOG;
|
$this->{termLevel} = NOLOG;
|
||||||
|
@ -152,7 +153,6 @@ if (-t STDIN) {
|
||||||
$this->{effectiveLevel} = INFO;
|
$this->{effectiveLevel} = INFO;
|
||||||
|
|
||||||
$this->{autoFlush} = 1;
|
$this->{autoFlush} = 1;
|
||||||
$this->{hasTerm} = -t STDERR;
|
|
||||||
|
|
||||||
( $this->{fileName} = $0 ) =~ s|^.*/||;
|
( $this->{fileName} = $0 ) =~ s|^.*/||;
|
||||||
$this->{logPath} = $Config{ZM_PATH_LOGS};
|
$this->{logPath} = $Config{ZM_PATH_LOGS};
|
||||||
|
|
|
@ -349,14 +349,15 @@ sub zmMemRead {
|
||||||
} elsif ( $type =~ /^uint8\[\d+\]$/ ) {
|
} elsif ( $type =~ /^uint8\[\d+\]$/ ) {
|
||||||
( $value ) = unpack( 'C'.$size, $data );
|
( $value ) = unpack( 'C'.$size, $data );
|
||||||
} else {
|
} else {
|
||||||
Fatal( "Unexpected type '".$type."' found for '".$field."'" );
|
Error( "Unexpected type '".$type."' found for '".$field."'" );
|
||||||
|
next;
|
||||||
}
|
}
|
||||||
push( @values, $value );
|
push @values, $value;
|
||||||
}
|
}
|
||||||
if ( wantarray() ) {
|
if ( wantarray() ) {
|
||||||
return( @values )
|
return @values;
|
||||||
}
|
}
|
||||||
return( $values[0] );
|
return $values[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
sub zmMemInvalidate {
|
sub zmMemInvalidate {
|
||||||
|
|
|
@ -77,19 +77,18 @@ sub zmMemAttach {
|
||||||
my ( $monitor, $size ) = @_;
|
my ( $monitor, $size ) = @_;
|
||||||
if ( ! $size ) {
|
if ( ! $size ) {
|
||||||
Error( "No size passed to zmMemAttach for monitor $$monitor{Id}\n" );
|
Error( "No size passed to zmMemAttach for monitor $$monitor{Id}\n" );
|
||||||
return( undef );
|
return undef;
|
||||||
}
|
}
|
||||||
if ( !defined($monitor->{MMapAddr}) ) {
|
if ( !defined($monitor->{MMapAddr}) ) {
|
||||||
|
|
||||||
my $mmap_file = $Config{ZM_PATH_MAP}."/zm.mmap.".$monitor->{Id};
|
my $mmap_file = $Config{ZM_PATH_MAP}.'/zm.mmap.'.$monitor->{Id};
|
||||||
if ( ! -e $mmap_file ) {
|
if ( ! -e $mmap_file ) {
|
||||||
Error( sprintf( "Memory map file '%s' does not exist. zmc might not be running."
|
Error( sprintf( "Memory map file '%s' does not exist. zmc might not be running."
|
||||||
, $mmap_file
|
, $mmap_file
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
return ( undef );
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $mmap_file_size = -s $mmap_file;
|
my $mmap_file_size = -s $mmap_file;
|
||||||
|
|
||||||
if ( $mmap_file_size < $size ) {
|
if ( $mmap_file_size < $size ) {
|
||||||
|
@ -99,25 +98,25 @@ sub zmMemAttach {
|
||||||
, $mmap_file_size
|
, $mmap_file_size
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
return ( undef );
|
return undef;
|
||||||
}
|
}
|
||||||
my $MMAP;
|
my $MMAP;
|
||||||
if ( !open( $MMAP, '+<', $mmap_file ) ) {
|
if ( !open( $MMAP, '+<', $mmap_file ) ) {
|
||||||
Error( sprintf( "Can't open memory map file '%s': $!\n", $mmap_file ) );
|
Error( sprintf( "Can't open memory map file '%s': $!", $mmap_file ) );
|
||||||
return( undef );
|
return undef;
|
||||||
}
|
}
|
||||||
my $mmap = undef;
|
my $mmap = undef;
|
||||||
my $mmap_addr = mmap( $mmap, $size, PROT_READ|PROT_WRITE, MAP_SHARED, $MMAP );
|
my $mmap_addr = mmap( $mmap, $size, PROT_READ|PROT_WRITE, MAP_SHARED, $MMAP );
|
||||||
if ( !$mmap_addr || !$mmap ) {
|
if ( !$mmap_addr || !$mmap ) {
|
||||||
Error( sprintf( "Can't mmap to file '%s': $!\n", $mmap_file ) );
|
Error( sprintf( "Can't mmap to file '%s': $!\n", $mmap_file ) );
|
||||||
close( $MMAP );
|
close( $MMAP );
|
||||||
return( undef );
|
return undef;
|
||||||
}
|
}
|
||||||
$monitor->{MMapHandle} = $MMAP;
|
$monitor->{MMapHandle} = $MMAP;
|
||||||
$monitor->{MMapAddr} = $mmap_addr;
|
$monitor->{MMapAddr} = $mmap_addr;
|
||||||
$monitor->{MMap} = \$mmap;
|
$monitor->{MMap} = \$mmap;
|
||||||
}
|
}
|
||||||
return( !undef );
|
return !undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub zmMemDetach {
|
sub zmMemDetach {
|
||||||
|
@ -149,10 +148,10 @@ sub zmMemGet {
|
||||||
, $monitor->{Id}
|
, $monitor->{Id}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
return( undef );
|
return undef;
|
||||||
}
|
}
|
||||||
my $data = substr( $$mmap, $offset, $size );
|
my $data = substr( $$mmap, $offset, $size );
|
||||||
return( $data );
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub zmMemPut {
|
sub zmMemPut {
|
||||||
|
|
|
@ -237,7 +237,7 @@ MAIN: while( $loop ) {
|
||||||
} elsif ( $$Storage{Scheme} eq 'Medium' ) {
|
} elsif ( $$Storage{Scheme} eq 'Medium' ) {
|
||||||
foreach my $event_dir ( glob("$monitor_dir/*/*") ) {
|
foreach my $event_dir ( glob("$monitor_dir/*/*") ) {
|
||||||
next if ! -d $event_dir;
|
next if ! -d $event_dir;
|
||||||
my ( $date, $event_id ) = $event_dir =~ /^$monitor_dir\/(\d{4}\-\d{2}\-\d{2})\/(\d\+)$/;
|
my ( $date, $event_id ) = $event_dir =~ /^$monitor_dir\/(\d{4}\-\d{2}\-\d{2})\/(\d+)$/;
|
||||||
if ( ! $event_id ) {
|
if ( ! $event_id ) {
|
||||||
Debug("Unable to parse date/event_id from $event_dir");
|
Debug("Unable to parse date/event_id from $event_dir");
|
||||||
next;
|
next;
|
||||||
|
|
|
@ -69,8 +69,6 @@ use POSIX;
|
||||||
use Socket;
|
use Socket;
|
||||||
use IO::Handle;
|
use IO::Handle;
|
||||||
use Time::HiRes qw(usleep);
|
use Time::HiRes qw(usleep);
|
||||||
use Sys::MemInfo qw(totalmem freemem totalswap freeswap);
|
|
||||||
use Sys::CpuLoad;
|
|
||||||
|
|
||||||
use autouse 'Pod::Usage'=>qw(pod2usage);
|
use autouse 'Pod::Usage'=>qw(pod2usage);
|
||||||
#use Data::Dumper;
|
#use Data::Dumper;
|
||||||
|
@ -101,6 +99,7 @@ my @daemons = (
|
||||||
'zmx10.pl',
|
'zmx10.pl',
|
||||||
'zmwatch.pl',
|
'zmwatch.pl',
|
||||||
'zmupdate.pl',
|
'zmupdate.pl',
|
||||||
|
'zmstats.pl',
|
||||||
'zmtrack.pl',
|
'zmtrack.pl',
|
||||||
'zmtelemetry.pl'
|
'zmtelemetry.pl'
|
||||||
);
|
);
|
||||||
|
@ -149,8 +148,11 @@ socket( CLIENT, PF_UNIX, SOCK_STREAM, 0 ) or Fatal( "Can't open socket: $!" );
|
||||||
|
|
||||||
my $saddr = sockaddr_un( SOCK_FILE );
|
my $saddr = sockaddr_un( SOCK_FILE );
|
||||||
my $server_up = connect( CLIENT, $saddr );
|
my $server_up = connect( CLIENT, $saddr );
|
||||||
|
|
||||||
if ( ! $server_up ) {
|
if ( ! $server_up ) {
|
||||||
if ( $Config{ZM_SERVER_ID} ) {
|
if ( $Config{ZM_SERVER_ID} ) {
|
||||||
|
use Sys::MemInfo qw(totalmem freemem totalswap freeswap);
|
||||||
|
use Sys::CpuLoad;
|
||||||
if ( ! defined $dbh->do(q{UPDATE Servers SET Status=?,TotalMem=?,FreeMem=?,TotalSwap=?,FreeSwap=? WHERE Id=?}, undef,
|
if ( ! defined $dbh->do(q{UPDATE Servers SET Status=?,TotalMem=?,FreeMem=?,TotalSwap=?,FreeSwap=? WHERE Id=?}, undef,
|
||||||
'NotRunning', &totalmem, &freemem, &totalswap, &freeswap, $Config{ZM_SERVER_ID} ) ) {
|
'NotRunning', &totalmem, &freemem, &totalswap, &freeswap, $Config{ZM_SERVER_ID} ) ) {
|
||||||
Error("Failed Updating status of Server record to Not RUnning for Id=$Config{ZM_SERVER_ID}" . $dbh->errstr());
|
Error("Failed Updating status of Server record to Not RUnning for Id=$Config{ZM_SERVER_ID}" . $dbh->errstr());
|
||||||
|
@ -234,6 +236,7 @@ use Sys::MemInfo qw(totalmem freemem totalswap freeswap);
|
||||||
use Sys::CpuLoad;
|
use Sys::CpuLoad;
|
||||||
#use Data::Dumper;
|
#use Data::Dumper;
|
||||||
|
|
||||||
|
# We count 100 of these, so total timeout is this value *100.
|
||||||
use constant KILL_DELAY => 100*1000; # 1/10th of a second
|
use constant KILL_DELAY => 100*1000; # 1/10th of a second
|
||||||
|
|
||||||
our %cmd_hash;
|
our %cmd_hash;
|
||||||
|
@ -281,14 +284,29 @@ sub run {
|
||||||
my $win = $rin;
|
my $win = $rin;
|
||||||
my $ein = $win;
|
my $ein = $win;
|
||||||
my $timeout = 1;
|
my $timeout = 1;
|
||||||
|
my $Server = undef;
|
||||||
|
my $secs_count = 0;
|
||||||
|
|
||||||
|
if ( $Config{ZM_SERVER_ID} ) {
|
||||||
|
require ZoneMinder::Server;
|
||||||
|
dPrint( ZoneMinder::Logger::INFO, 'Loading Server record' );
|
||||||
|
$Server = new ZoneMinder::Server( $Config{ZM_SERVER_ID} );
|
||||||
|
dPrint( ZoneMinder::Logger::INFO, 'Loading Server record have ' . $$Server{Name} );
|
||||||
|
}
|
||||||
|
|
||||||
while( 1 ) {
|
while( 1 ) {
|
||||||
|
|
||||||
if ( $Config{ZM_SERVER_ID} ) {
|
if ( $Config{ZM_SERVER_ID} ) {
|
||||||
$dbh = zmDbConnect() if ! $dbh->ping();
|
if ( $secs_count % 60 ) {
|
||||||
my @cpuload = Sys::CpuLoad::load();
|
$dbh = zmDbConnect() if ! $dbh->ping();
|
||||||
if ( ! defined $dbh->do(q{UPDATE Servers SET Status=?,CpuLoad=?,TotalMem=?,FreeMem=?,TotalSwap=?,FreeSwap=? WHERE Id=?}, undef,
|
my @cpuload = Sys::CpuLoad::load();
|
||||||
|
dPrint( ZoneMinder::Logger::INFO, 'Updating Server record' );
|
||||||
|
if ( ! defined $dbh->do(q{UPDATE Servers SET Status=?,CpuLoad=?,TotalMem=?,FreeMem=?,TotalSwap=?,FreeSwap=? WHERE Id=?}, undef,
|
||||||
'Running', $cpuload[0], &totalmem, &freemem, &totalswap, &freeswap, $Config{ZM_SERVER_ID} ) ) {
|
'Running', $cpuload[0], &totalmem, &freemem, &totalswap, &freeswap, $Config{ZM_SERVER_ID} ) ) {
|
||||||
Error("Failed Updating status of Server record for Id=$Config{ZM_SERVER_ID}".$dbh->errstr());
|
Error("Failed Updating status of Server record for Id=$Config{ZM_SERVER_ID}".$dbh->errstr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
$secs_count += 1;
|
||||||
}
|
}
|
||||||
my $nfound = select( my $rout = $rin, undef, undef, $timeout );
|
my $nfound = select( my $rout = $rin, undef, undef, $timeout );
|
||||||
if ( $nfound > 0 ) {
|
if ( $nfound > 0 ) {
|
||||||
|
@ -296,12 +314,16 @@ sub run {
|
||||||
my $paddr = accept( CLIENT, SERVER );
|
my $paddr = accept( CLIENT, SERVER );
|
||||||
my $message = <CLIENT>;
|
my $message = <CLIENT>;
|
||||||
|
|
||||||
next if ( !$message );
|
next if !$message;
|
||||||
|
|
||||||
my ( $command, $daemon, @args ) = split( /;/, $message );
|
my ( $command, $daemon, @args ) = split( /;/, $message );
|
||||||
|
|
||||||
if ( $command eq 'start' ) {
|
if ( $command eq 'start' ) {
|
||||||
start( $daemon, @args );
|
if ( $Server and exists $$Server{$daemon} and ! $$Server{$daemon} ) {
|
||||||
|
Debug("Not running $daemon because it is turned off for this server.");
|
||||||
|
} else {
|
||||||
|
start( $daemon, @args );
|
||||||
|
}
|
||||||
} elsif ( $command eq 'stop' ) {
|
} elsif ( $command eq 'stop' ) {
|
||||||
stop( $daemon, @args );
|
stop( $daemon, @args );
|
||||||
} elsif ( $command eq 'restart' ) {
|
} elsif ( $command eq 'restart' ) {
|
||||||
|
@ -505,7 +527,7 @@ sub kill_until_dead {
|
||||||
my $blockset = POSIX::SigSet->new(SIGCHLD);
|
my $blockset = POSIX::SigSet->new(SIGCHLD);
|
||||||
sigprocmask(SIG_BLOCK, $blockset, $sigset ) or die "dying at block...\n";
|
sigprocmask(SIG_BLOCK, $blockset, $sigset ) or die "dying at block...\n";
|
||||||
while( $process and $$process{pid} and kill( 0, $$process{pid} ) ) {
|
while( $process and $$process{pid} and kill( 0, $$process{pid} ) ) {
|
||||||
if ( $count++ > 50 ) {
|
if ( $count++ > 100 ) {
|
||||||
dPrint( ZoneMinder::Logger::WARNING, "'$$process{command}' has not stopped at "
|
dPrint( ZoneMinder::Logger::WARNING, "'$$process{command}' has not stopped at "
|
||||||
.strftime( '%y/%m/%d %H:%M:%S', localtime() )
|
.strftime( '%y/%m/%d %H:%M:%S', localtime() )
|
||||||
.". Sending KILL to pid $$process{pid}\n"
|
.". Sending KILL to pid $$process{pid}\n"
|
||||||
|
@ -527,7 +549,6 @@ sub _stop {
|
||||||
my $pid = send_stop( $final, $process );
|
my $pid = send_stop( $final, $process );
|
||||||
return if ! $pid;
|
return if ! $pid;
|
||||||
delete( $cmd_hash{$$process{command}} );
|
delete( $cmd_hash{$$process{command}} );
|
||||||
|
|
||||||
kill_until_dead( $process );
|
kill_until_dead( $process );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,7 +600,8 @@ sub reload {
|
||||||
sub logrot {
|
sub logrot {
|
||||||
logReinit();
|
logReinit();
|
||||||
foreach my $process ( values( %pid_hash ) ) {
|
foreach my $process ( values( %pid_hash ) ) {
|
||||||
if ( $process->{pid} && $process->{command} =~ /^zm.*\.pl/ ) {
|
if ( $process->{pid} ) {
|
||||||
|
# && $process->{command} =~ /^zm.*\.pl/ ) {
|
||||||
kill( 'HUP', $process->{pid} );
|
kill( 'HUP', $process->{pid} );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,173 @@
|
||||||
|
#!/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__
|
|
@ -69,56 +69,19 @@ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
|
||||||
logInit();
|
logInit();
|
||||||
logSetSignal();
|
logSetSignal();
|
||||||
|
|
||||||
Info( "Watchdog starting\n" );
|
Info( "Watchdog starting, pausing for ".START_DELAY." seconds\n" );
|
||||||
Info( "Watchdog pausing for ".START_DELAY." seconds\n" );
|
|
||||||
sleep( START_DELAY );
|
sleep( START_DELAY );
|
||||||
|
|
||||||
my $dbh = zmDbConnect();
|
my $dbh = zmDbConnect();
|
||||||
|
|
||||||
my $sql = $Config{ZM_SERVER_ID} ? 'SELECT * FROM Monitors WHERE ServerId=?' : 'SELECT * FROM Monitors';
|
my $sql = $Config{ZM_SERVER_ID} ? 'SELECT * FROM Monitors WHERE ServerId=?' : 'SELECT * FROM Monitors';
|
||||||
my $sth = $dbh->prepare_cached( $sql )
|
my $sth = $dbh->prepare_cached( $sql )
|
||||||
or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
|
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_sth = $dbh->prepare_cached( $eventcounts_sql );
|
|
||||||
|
|
||||||
while( 1 ) {
|
while( 1 ) {
|
||||||
$eventcounts_sth->execute() or Error( "Can't execute: ".$eventcounts_sth->errstr() );
|
|
||||||
|
|
||||||
my $res = $sth->execute( $Config{ZM_SERVER_ID} ? $Config{ZM_SERVER_ID} : () )
|
my $res = $sth->execute( $Config{ZM_SERVER_ID} ? $Config{ZM_SERVER_ID} : () )
|
||||||
or Fatal( "Can't execute: ".$sth->errstr() );
|
or Fatal( "Can't execute: ".$sth->errstr() );
|
||||||
while( my $monitor = $sth->fetchrow_hashref() ) {
|
while( my $monitor = $sth->fetchrow_hashref() ) {
|
||||||
|
|
||||||
my $now = time();
|
my $now = time();
|
||||||
next if $monitor->{Function} eq 'None';
|
next if $monitor->{Function} eq 'None';
|
||||||
my $restart = 0;
|
my $restart = 0;
|
||||||
|
@ -133,38 +96,41 @@ while( 1 ) {
|
||||||
}
|
}
|
||||||
Debug( "LastWriteTime is = $capture_time." );
|
Debug( "LastWriteTime is = $capture_time." );
|
||||||
if ( !$capture_time ) {
|
if ( !$capture_time ) {
|
||||||
my $startup_time = zmGetStartupTime( $monitor );
|
my $startup_time = zmGetStartupTime( $monitor );
|
||||||
if ( $now - $startup_time > $Config{ZM_WATCH_MAX_DELAY} ) {
|
if ( $now - $startup_time > $Config{ZM_WATCH_MAX_DELAY} ) {
|
||||||
Info( "Restarting capture daemon for ".$monitor->{Name}.", no image since startup. Startup time was $startup_time - now $now > $Config{ZM_WATCH_MAX_DELAY}\n" );
|
Info( "Restarting capture daemon for ".$monitor->{Name}.", no image since startup. Startup time was $startup_time - now $now > $Config{ZM_WATCH_MAX_DELAY}\n" );
|
||||||
$restart = 1;
|
$restart = 1;
|
||||||
} else {
|
} else {
|
||||||
# We can't get the last capture time so can't be sure it's died, it might just be starting up.
|
# We can't get the last capture time so can't be sure it's died, it might just be starting up.
|
||||||
zmMemInvalidate( $monitor );
|
zmMemInvalidate( $monitor );
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( ! $restart ) {
|
if ( ! $restart ) {
|
||||||
my $max_image_delay = ( $monitor->{MaxFPS}
|
my $max_image_delay = ( $monitor->{MaxFPS}
|
||||||
&&($monitor->{MaxFPS}>0)
|
&&($monitor->{MaxFPS}>0)
|
||||||
&&($monitor->{MaxFPS}<1)
|
&&($monitor->{MaxFPS}<1)
|
||||||
) ? (3/$monitor->{MaxFPS})
|
) ? (3/$monitor->{MaxFPS})
|
||||||
: $Config{ZM_WATCH_MAX_DELAY}
|
: $Config{ZM_WATCH_MAX_DELAY}
|
||||||
;
|
;
|
||||||
my $image_delay = $now-$capture_time;
|
my $image_delay = $now-$capture_time;
|
||||||
Debug( "Monitor $monitor->{Id} last captured $image_delay seconds ago, max is $max_image_delay\n" );
|
Debug( "Monitor $monitor->{Id} last captured $image_delay seconds ago, max is $max_image_delay\n" );
|
||||||
if ( $image_delay > $max_image_delay ) {
|
if ( $image_delay > $max_image_delay ) {
|
||||||
Info( "Restarting capture daemon for "
|
Info( "Restarting capture daemon for "
|
||||||
.$monitor->{Name}.", time since last capture $image_delay seconds ($now-$capture_time)\n"
|
.$monitor->{Name}.", time since last capture $image_delay seconds ($now-$capture_time)\n"
|
||||||
);
|
);
|
||||||
$restart = 1;
|
$restart = 1;
|
||||||
}
|
}
|
||||||
} # end if ! restart
|
} # end if ! restart
|
||||||
} else {
|
} else {
|
||||||
Info( "Restarting capture daemon for ".$monitor->{Name}.", shared data not valid\n" );
|
Info( "Restarting capture daemon for ".$monitor->{Name}.", shared data not valid\n" );
|
||||||
$restart = 1;
|
$restart = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $restart ) {
|
if ( $restart ) {
|
||||||
|
# Because zma depends on zmc, and zma can hold the shm in place, preventing zmc from using the space in /dev/shm,
|
||||||
|
# we need to stop zma before restarting zmc.
|
||||||
|
runCommand( "zmdc.pl stop zma -m $$monitor{Id}" ) if $monitor->{Function} ne 'Monitor';
|
||||||
my $command;
|
my $command;
|
||||||
if ( $monitor->{Type} eq 'Local' ) {
|
if ( $monitor->{Type} eq 'Local' ) {
|
||||||
$command = "zmdc.pl restart zmc -d $monitor->{Device}";
|
$command = "zmdc.pl restart zmc -d $monitor->{Device}";
|
||||||
|
@ -172,6 +138,7 @@ while( 1 ) {
|
||||||
$command = "zmdc.pl restart zmc -m $monitor->{Id}";
|
$command = "zmdc.pl restart zmc -m $monitor->{Id}";
|
||||||
}
|
}
|
||||||
runCommand( $command );
|
runCommand( $command );
|
||||||
|
runCommand( "zmdc.pl start zma -m $$monitor{Id}" ) if $monitor->{Function} ne 'Monitor';
|
||||||
} elsif ( $monitor->{Function} ne 'Monitor' ) {
|
} elsif ( $monitor->{Function} ne 'Monitor' ) {
|
||||||
# Now check analysis daemon
|
# Now check analysis daemon
|
||||||
$restart = 0;
|
$restart = 0;
|
||||||
|
@ -216,9 +183,8 @@ while( 1 ) {
|
||||||
sleep( $Config{ZM_WATCH_CHECK_INTERVAL} );
|
sleep( $Config{ZM_WATCH_CHECK_INTERVAL} );
|
||||||
} # end while (1)
|
} # end while (1)
|
||||||
|
|
||||||
$eventcounts_sth->finish();
|
|
||||||
|
|
||||||
Info( "Watchdog exiting\n" );
|
Info( "Watchdog exiting\n" );
|
||||||
exit();
|
exit();
|
||||||
|
|
||||||
1;
|
1;
|
||||||
__END__
|
__END__
|
||||||
|
|
|
@ -168,6 +168,8 @@ int main( int argc, char *argv[] ) {
|
||||||
|
|
||||||
if ( zm_reload ) {
|
if ( zm_reload ) {
|
||||||
monitor->Reload();
|
monitor->Reload();
|
||||||
|
logTerm();
|
||||||
|
logInit( log_id_string );
|
||||||
zm_reload = false;
|
zm_reload = false;
|
||||||
}
|
}
|
||||||
sigprocmask( SIG_UNBLOCK, &block_set, 0 );
|
sigprocmask( SIG_UNBLOCK, &block_set, 0 );
|
||||||
|
|
|
@ -313,6 +313,14 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
} // end foreach n_monitors
|
} // end foreach n_monitors
|
||||||
sigprocmask(SIG_UNBLOCK, &block_set, 0);
|
sigprocmask(SIG_UNBLOCK, &block_set, 0);
|
||||||
|
if ( zm_reload ) {
|
||||||
|
for ( int i = 0; i < n_monitors; i++ ) {
|
||||||
|
monitors[i]->Reload();
|
||||||
|
}
|
||||||
|
logTerm();
|
||||||
|
logInit( log_id_string );
|
||||||
|
zm_reload = false;
|
||||||
|
}
|
||||||
} // end while ! zm_terminate
|
} // end while ! zm_terminate
|
||||||
for ( int i = 0; i < n_monitors; i++ ) {
|
for ( int i = 0; i < n_monitors; i++ ) {
|
||||||
delete monitors[i];
|
delete monitors[i];
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1198,8 +1198,9 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&' ) {
|
||||||
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
||||||
if ( ! $StorageArea ) {
|
if ( ! $StorageArea ) {
|
||||||
for ( $j = 0; $j < count($terms); $j++ ) {
|
for ( $j = 0; $j < count($terms); $j++ ) {
|
||||||
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' ) {
|
if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
||||||
$StorageArea = new Storage( $terms[$j]['val'] );
|
$StorageArea = new Storage($terms[$j]['val']);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} // end foreach remaining term
|
} // end foreach remaining term
|
||||||
if ( ! $StorageArea ) $StorageArea = new Storage();
|
if ( ! $StorageArea ) $StorageArea = new Storage();
|
||||||
|
@ -1211,8 +1212,8 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&' ) {
|
||||||
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
// Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
|
||||||
if ( ! $StorageArea ) {
|
if ( ! $StorageArea ) {
|
||||||
for ( $j = $i; $j < count($terms); $j++ ) {
|
for ( $j = $i; $j < count($terms); $j++ ) {
|
||||||
if ( isset($terms[$i]['attr']) and $terms[$i]['attr'] == 'StorageId' ) {
|
if ( isset($terms[$i]['attr']) and $terms[$i]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
|
||||||
$StorageArea = new Storage( $terms[$i]['val'] );
|
$StorageArea = new Storage($terms[$i]['val']);
|
||||||
}
|
}
|
||||||
} // end foreach remaining term
|
} // end foreach remaining term
|
||||||
} // end no StorageArea found yet
|
} // end no StorageArea found yet
|
||||||
|
@ -1298,8 +1299,10 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&' ) {
|
||||||
|
|
||||||
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][op]").'='.urlencode($terms[$i]['op']);
|
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][op]").'='.urlencode($terms[$i]['op']);
|
||||||
$filter['fields'] .= "<input type=\"hidden\" name=\"filter[Query][terms][$i][op]\" value=\"".htmlspecialchars($terms[$i]['op'])."\"/>\n";
|
$filter['fields'] .= "<input type=\"hidden\" name=\"filter[Query][terms][$i][op]\" value=\"".htmlspecialchars($terms[$i]['op'])."\"/>\n";
|
||||||
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][val]").'='.urlencode($terms[$i]['val']);
|
if ( isset($terms[$i]['val']) ) {
|
||||||
$filter['fields'] .= "<input type=\"hidden\" name=\"filter[Query][terms][$i][val]\" value=\"".htmlspecialchars($terms[$i]['val'])."\"/>\n";
|
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][val]").'='.urlencode($terms[$i]['val']);
|
||||||
|
$filter['fields'] .= "<input type=\"hidden\" name=\"filter[Query][terms][$i][val]\" value=\"".htmlspecialchars($terms[$i]['val'])."\"/>\n";
|
||||||
|
}
|
||||||
} // end foreach term
|
} // end foreach term
|
||||||
if ( isset($terms[$i]['cbr']) ) {
|
if ( isset($terms[$i]['cbr']) ) {
|
||||||
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][cbr]").'='.urlencode($terms[$i]['cbr']);
|
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][cbr]").'='.urlencode($terms[$i]['cbr']);
|
||||||
|
@ -2145,7 +2148,8 @@ function cache_bust( $file ) {
|
||||||
# To defeat caching. Should probably use md5 hash
|
# To defeat caching. Should probably use md5 hash
|
||||||
$parts = pathinfo($file);
|
$parts = pathinfo($file);
|
||||||
global $css;
|
global $css;
|
||||||
$cacheFile = 'cache/'.$parts['filename'].'-'.$css.'-'.filemtime($file).'.'.$parts['extension'];
|
$dirname = preg_replace( '/\//', '_', $parts['dirname'] );
|
||||||
|
$cacheFile = 'cache/'.$dirname.'_'.$parts['filename'].'-'.$css.'-'.filemtime($file).'.'.$parts['extension'];
|
||||||
if ( file_exists( ZM_PATH_WEB.'/'.$cacheFile ) or symlink( ZM_PATH_WEB.'/'.$file, ZM_PATH_WEB.'/'.$cacheFile ) ) {
|
if ( file_exists( ZM_PATH_WEB.'/'.$cacheFile ) or symlink( ZM_PATH_WEB.'/'.$file, ZM_PATH_WEB.'/'.$cacheFile ) ) {
|
||||||
return $cacheFile;
|
return $cacheFile;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -151,5 +151,4 @@
|
||||||
width: 24px;
|
width: 24px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #016A9D;
|
|
||||||
}
|
}
|
|
@ -1,3 +1,7 @@
|
||||||
|
#options {
|
||||||
|
padding-top: 10px;
|
||||||
|
|
||||||
|
}
|
||||||
input.small {
|
input.small {
|
||||||
width: 6em;
|
width: 6em;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,14 +19,14 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
// Don't load in additional JS to these views
|
|
||||||
$bad_views = array('monitor', 'log');
|
|
||||||
|
|
||||||
function xhtmlHeaders( $file, $title ) {
|
function xhtmlHeaders( $file, $title ) {
|
||||||
global $css;
|
global $css;
|
||||||
global $skin;
|
global $skin;
|
||||||
$skinCssFile = getSkinFile( 'css/'.$css.'/skin.css' );
|
|
||||||
$skinCssFilejquery = getSkinFile( 'css/'.$css.'/jquery-ui-theme.css' );
|
# This idea is that we always include the classic css files,
|
||||||
|
# and then any different skin only needs to contain things that are different.
|
||||||
|
$baseCssPhpFile = getSkinFile( 'css/base/skin.css.php' );
|
||||||
|
|
||||||
$skinCssPhpFile = getSkinFile( 'css/'.$css.'/skin.css.php' );
|
$skinCssPhpFile = getSkinFile( 'css/'.$css.'/skin.css.php' );
|
||||||
|
|
||||||
$skinJsFile = getSkinFile( 'js/skin.js' );
|
$skinJsFile = getSkinFile( 'js/skin.js' );
|
||||||
|
@ -34,15 +34,22 @@ function xhtmlHeaders( $file, $title ) {
|
||||||
$cssJsFile = getSkinFile( 'js/'.$css.'.js' );
|
$cssJsFile = getSkinFile( 'js/'.$css.'.js' );
|
||||||
|
|
||||||
$basename = basename( $file, '.php' );
|
$basename = basename( $file, '.php' );
|
||||||
$viewCssFile = getSkinFile( '/css/'.$css.'/views/'.$basename.'.css' );
|
|
||||||
if ($basename == 'watch') {
|
|
||||||
$viewCssFileExtra = getSkinFile( '/css/'.$css.'/views/control.css' );
|
|
||||||
}
|
|
||||||
$viewCssPhpFile = getSkinFile( '/css/'.$css.'/views/'.$basename.'.css.php' );
|
$viewCssPhpFile = getSkinFile( '/css/'.$css.'/views/'.$basename.'.css.php' );
|
||||||
$viewJsFile = getSkinFile( 'views/js/'.$basename.'.js' );
|
$viewJsFile = getSkinFile( 'views/js/'.$basename.'.js' );
|
||||||
$viewJsPhpFile = getSkinFile( 'views/js/'.$basename.'.js.php' );
|
$viewJsPhpFile = getSkinFile( 'views/js/'.$basename.'.js.php' );
|
||||||
|
|
||||||
extract( $GLOBALS, EXTR_OVERWRITE );
|
extract( $GLOBALS, EXTR_OVERWRITE );
|
||||||
|
function output_link_if_exists( $files ) {
|
||||||
|
global $skin;
|
||||||
|
$html = array();
|
||||||
|
foreach ( $files as $file ) {
|
||||||
|
if ( getSkinFile( $file ) ) {
|
||||||
|
$html[] = '<link rel="stylesheet" href="'.cache_bust( 'skins/'.$skin.'/'.$file ).'" type="text/css"/>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return implode("\n", $html);
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
@ -66,19 +73,23 @@ if ( file_exists( "skins/$skin/css/$css/graphics/favicon.ico" ) ) {
|
||||||
<link rel="stylesheet" href="css/reset.css" type="text/css"/>
|
<link rel="stylesheet" href="css/reset.css" type="text/css"/>
|
||||||
<link rel="stylesheet" href="css/overlay.css" type="text/css"/>
|
<link rel="stylesheet" href="css/overlay.css" type="text/css"/>
|
||||||
<link rel="stylesheet" href="css/bootstrap.min.css" type="text/css"/>
|
<link rel="stylesheet" href="css/bootstrap.min.css" type="text/css"/>
|
||||||
<link rel="stylesheet" href="<?php echo cache_bust($skinCssFile) ?>" type="text/css" media="screen"/>
|
|
||||||
<link rel="stylesheet" href="<?php echo cache_bust($skinCssFilejquery) ?>" type="text/css" media="screen"/>
|
|
||||||
<?php
|
|
||||||
if ( $viewCssFile ) {
|
|
||||||
?>
|
|
||||||
<link rel="stylesheet" href="<?php echo cache_bust($viewCssFile) ?>" type="text/css" media="screen"/>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
if ( isset($viewCssFileExtra) ) {
|
|
||||||
?>
|
|
||||||
<link rel="stylesheet" href="<?php echo cache_bust($viewCssFileExtra) ?>" type="text/css" media="screen"/>
|
|
||||||
<?php
|
<?php
|
||||||
|
echo output_link_if_exists( array(
|
||||||
|
'css/base/skin.css',
|
||||||
|
'css/'.$css.'/skin.css',
|
||||||
|
'css/base/views/'.$basename.'.css',
|
||||||
|
'css/'.$css.'/views/'.$basename.'.css',
|
||||||
|
'/js/dateTimePicker/jquery-ui-timepicker-addon.css',
|
||||||
|
'/js/jquery-ui-structure.css',
|
||||||
|
'/css/'.$css.'/jquery-ui-theme.css',
|
||||||
|
'/js/chosen/chosen.min.css',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if ($basename == 'watch') {
|
||||||
|
echo output_link_if_exists( array(
|
||||||
|
'/css/base/views/control.css',
|
||||||
|
'/css/'.$css.'/views/control.css'
|
||||||
|
) );
|
||||||
}
|
}
|
||||||
if ( $viewCssPhpFile ) {
|
if ( $viewCssPhpFile ) {
|
||||||
?>
|
?>
|
||||||
|
@ -92,6 +103,7 @@ if ( file_exists( "skins/$skin/css/$css/graphics/favicon.ico" ) ) {
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<script type="text/javascript" src="tools/mootools/mootools-core.js"></script>
|
<script type="text/javascript" src="tools/mootools/mootools-core.js"></script>
|
||||||
<script type="text/javascript" src="tools/mootools/mootools-more.js"></script>
|
<script type="text/javascript" src="tools/mootools/mootools-more.js"></script>
|
||||||
<script type="text/javascript" src="js/mootools.ext.js"></script>
|
<script type="text/javascript" src="js/mootools.ext.js"></script>
|
||||||
|
@ -101,9 +113,6 @@ if ( file_exists( "skins/$skin/css/$css/graphics/favicon.ico" ) ) {
|
||||||
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/chosen/chosen.jquery.min.js"></script>
|
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/chosen/chosen.jquery.min.js"></script>
|
||||||
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/dateTimePicker/jquery-ui-timepicker-addon.js"></script>
|
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/dateTimePicker/jquery-ui-timepicker-addon.js"></script>
|
||||||
|
|
||||||
<link href="skins/<?php echo $skin ?>/js/dateTimePicker/jquery-ui-timepicker-addon.css" rel="stylesheet">
|
|
||||||
<link href="skins/<?php echo $skin ?>/js/jquery-ui-structure.css" rel="stylesheet">
|
|
||||||
<link href="skins/<?php echo $skin ?>/js/chosen/chosen.min.css" rel="stylesheet">
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//<![CDATA[
|
//<![CDATA[
|
||||||
<!--
|
<!--
|
||||||
|
@ -164,7 +173,7 @@ if ( file_exists( "skins/$skin/css/$css/graphics/favicon.ico" ) ) {
|
||||||
<?php
|
<?php
|
||||||
} else {
|
} else {
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" src="skins/classic/js/classic.js"></script>
|
<script type="text/javascript" src="skins/classic/js/base.js"></script>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<script type="text/javascript" src="<?php echo cache_bust($skinJsFile) ?>"></script>
|
<script type="text/javascript" src="<?php echo cache_bust($skinJsFile) ?>"></script>
|
||||||
<script type="text/javascript" src="js/logger.js"></script>
|
<script type="text/javascript" src="js/logger.js"></script>
|
||||||
|
@ -205,7 +214,7 @@ function getNavBarHTML($reload = null) {
|
||||||
?>
|
?>
|
||||||
<noscript>
|
<noscript>
|
||||||
<div style="background-color:red;color:white;font-size:x-large;">
|
<div style="background-color:red;color:white;font-size:x-large;">
|
||||||
ZoneMinder requires Javascript. Please enable Javascript in your browser for this site.
|
<?php echo ZM_WEB_TITLE ?> requires Javascript. Please enable Javascript in your browser for this site.
|
||||||
</div>
|
</div>
|
||||||
</noscript>
|
</noscript>
|
||||||
<div class="navbar navbar-inverse navbar-static-top">
|
<div class="navbar navbar-inverse navbar-static-top">
|
||||||
|
@ -217,10 +226,11 @@ ZoneMinder requires Javascript. Please enable Javascript in your browser for thi
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
<a class="navbar-brand" href="http://www.zoneminder.com" target="ZoneMinder">ZoneMinder</a>
|
<div class="navbar-brand"><a href="<?php echo ZM_HOME_URL?>" target="<?php echo ZM_WEB_TITLE ?>"><?php echo ZM_HOME_CONTENT ?></a></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="collapse navbar-collapse" id="main-header-nav">
|
<div class="collapse navbar-collapse" id="main-header-nav">
|
||||||
|
<?php if ( canView('Monitors') ) { ?>
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li><a href="?view=console"><?php echo translate('Console') ?></a></li>
|
<li><a href="?view=console"><?php echo translate('Console') ?></a></li>
|
||||||
<?php if ( canView( 'System' ) ) { ?>
|
<?php if ( canView( 'System' ) ) { ?>
|
||||||
|
@ -271,9 +281,10 @@ if (isset($_REQUEST['filter']['Query']['terms']['attr'])) {
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</ul>
|
</ul>
|
||||||
|
<?php } // end if canView('Monitors') ?>
|
||||||
|
|
||||||
<div class="navbar-right">
|
<div class="navbar-right">
|
||||||
<?php if ( ZM_OPT_USE_AUTH ) { ?>
|
<?php if ( ZM_OPT_USE_AUTH and $user ) { ?>
|
||||||
<p class="navbar-text"><?php echo translate('LoggedInAs') ?> <?php echo makePopupLink( '?view=logout', 'zmLogout', 'logout', $user['Username'], (ZM_AUTH_TYPE == "builtin") ) ?> </p>
|
<p class="navbar-text"><?php echo translate('LoggedInAs') ?> <?php echo makePopupLink( '?view=logout', 'zmLogout', 'logout', $user['Username'], (ZM_AUTH_TYPE == "builtin") ) ?> </p>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
|
@ -288,20 +299,22 @@ if (isset($_REQUEST['filter']['Query']['terms']['attr'])) {
|
||||||
</div> <!-- End .container-fluid -->
|
</div> <!-- End .container-fluid -->
|
||||||
<?php
|
<?php
|
||||||
}//end reload null. Runs on full page load
|
}//end reload null. Runs on full page load
|
||||||
|
|
||||||
|
if ( (!ZM_OPT_USE_AUTH) or $user ) {
|
||||||
if ($reload == 'reload') ob_start();
|
if ($reload == 'reload') ob_start();
|
||||||
?>
|
?>
|
||||||
<div id="reload" class="container-fluid">
|
<div id="reload" class="container-fluid">
|
||||||
<div class="pull-left">
|
<div id="Bandwidth" class="pull-left">
|
||||||
<?php echo makePopupLink( '?view=bandwidth', 'zmBandwidth', 'bandwidth', $bandwidth_options[$_COOKIE['zmBandwidth']] . ' ' . translate('BandwidthHead'), ($user && $user['MaxBandwidth'] != 'low' ) ) ?>
|
<?php echo makePopupLink( '?view=bandwidth', 'zmBandwidth', 'bandwidth', $bandwidth_options[$_COOKIE['zmBandwidth']] . ' ' . translate('BandwidthHead'), ($user && $user['MaxBandwidth'] != 'low' ) ) ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="pull-right">
|
<div id="Version" class="pull-right">
|
||||||
<?php echo makePopupLink( '?view=version', 'zmVersion', 'version', '<span class="'.$versionClass.'">v'.ZM_VERSION.'</span>', canEdit( 'System' ) ) ?>
|
<?php echo makePopupLink( '?view=version', 'zmVersion', 'version', '<span class="version '.$versionClass.'">v'.ZM_VERSION.'</span>', canEdit( 'System' ) ) ?>
|
||||||
<?php if ( defined('ZM_WEB_CONSOLE_BANNER') and ZM_WEB_CONSOLE_BANNER != '' ) { ?>
|
<?php if ( defined('ZM_WEB_CONSOLE_BANNER') and ZM_WEB_CONSOLE_BANNER != '' ) { ?>
|
||||||
<h3 id="development"><?php echo ZM_WEB_CONSOLE_BANNER ?></h3>
|
<h3 id="development"><?php echo ZM_WEB_CONSOLE_BANNER ?></h3>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-inline">
|
<ul class="list-inline">
|
||||||
<li><?php echo translate('Load') ?>: <?php echo getLoad() ?></li>
|
<li class="Load"><?php echo translate('Load') ?>: <?php echo getLoad() ?></li>
|
||||||
<?php
|
<?php
|
||||||
$connections = dbFetchOne( "SHOW status WHERE variable_name='threads_connected'", 'Value' );
|
$connections = dbFetchOne( "SHOW status WHERE variable_name='threads_connected'", 'Value' );
|
||||||
$max_connections = dbFetchOne( "SHOW variables WHERE variable_name='max_connections'", 'Value' );
|
$max_connections = dbFetchOne( "SHOW variables WHERE variable_name='max_connections'", 'Value' );
|
||||||
|
@ -330,6 +343,7 @@ if ($reload == 'reload') ob_start();
|
||||||
<!-- End .footer/reload --></div>
|
<!-- End .footer/reload --></div>
|
||||||
<?php
|
<?php
|
||||||
if ($reload == 'reload') return( ob_get_clean() );
|
if ($reload == 'reload') return( ob_get_clean() );
|
||||||
|
} // end if (!ZM_OPT_USE_AUTH) or $user )
|
||||||
?>
|
?>
|
||||||
</div><!-- End .navbar .navbar-default -->
|
</div><!-- End .navbar .navbar-default -->
|
||||||
<?php
|
<?php
|
||||||
|
|
|
@ -47,7 +47,7 @@ var popupSizes = {
|
||||||
'image': { 'addWidth': 48, 'addHeight': 80 },
|
'image': { 'addWidth': 48, 'addHeight': 80 },
|
||||||
'log': { 'width': 1080, 'height': 720 },
|
'log': { 'width': 1080, 'height': 720 },
|
||||||
'login': { 'width': 720, 'height': 480 },
|
'login': { 'width': 720, 'height': 480 },
|
||||||
'logout': { 'width': 260, 'height': 150 },
|
'logout': { 'width': 460, 'height': 300 },
|
||||||
'monitor': { 'width': 700, 'height': 680 },
|
'monitor': { 'width': 700, 'height': 680 },
|
||||||
'monitorpreset':{ 'width': 440, 'height': 200 },
|
'monitorpreset':{ 'width': 440, 'height': 200 },
|
||||||
'monitorprobe': { 'width': 500, 'height': 240 },
|
'monitorprobe': { 'width': 500, 'height': 240 },
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
//
|
|
||||||
// ZoneMinder base static javascript file, $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.
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
// This file should only contain static JavaScript and no php.
|
|
||||||
// Use skin.js.php for JavaScript that need pre-processing
|
|
||||||
//
|
|
||||||
|
|
||||||
// Javascript window sizes
|
|
||||||
var popupSizes = {
|
|
||||||
'bandwidth': { 'width': 300, 'height': 200 },
|
|
||||||
'console': { 'width': 750, 'height': 312 },
|
|
||||||
'control': { 'width': 380, 'height': 480 },
|
|
||||||
'controlcaps': { 'width': 780, 'height': 320 },
|
|
||||||
'controlcap': { 'width': 400, 'height': 400 },
|
|
||||||
'cycle': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 62 },
|
|
||||||
'device': { 'width': 260, 'height': 150 },
|
|
||||||
'devices': { 'width': 400, 'height': 240 },
|
|
||||||
'donate': { 'width': 500, 'height': 280 },
|
|
||||||
'download': { 'width': 350, 'height': 215 },
|
|
||||||
'event': { 'addWidth': 108, 'minWidth': 496, 'addHeight': 230, 'minHeight': 540 },
|
|
||||||
'eventdetail': { 'width': 600, 'height': 420 },
|
|
||||||
'events': { 'width': 960, 'height': 780 },
|
|
||||||
'export': { 'width': 400, 'height': 340 },
|
|
||||||
'filter': { 'width': 900, 'height': 700 },
|
|
||||||
'frame': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 200 },
|
|
||||||
'frames': { 'width': 600, 'height': 700 },
|
|
||||||
'function': { 'width': 300, 'height': 160 },
|
|
||||||
'group': { 'width': 360, 'height': 300 },
|
|
||||||
'groups': { 'width': 540, 'height': 420 },
|
|
||||||
'image': { 'addWidth': 48, 'addHeight': 80 },
|
|
||||||
'log': { 'width': 1080, 'height': 720 },
|
|
||||||
'login': { 'width': 720, 'height': 480 },
|
|
||||||
'logout': { 'width': 260, 'height': 300 },
|
|
||||||
'monitor': { 'width': 600, 'height': 780 },
|
|
||||||
'monitorpreset':{ 'width': 440, 'height': 200 },
|
|
||||||
'monitorprobe': { 'width': 500, 'height': 240 },
|
|
||||||
'monitorselect':{ 'width': 160, 'height': 200 },
|
|
||||||
'montage': { 'width': -1, 'height': -1 },
|
|
||||||
'onvifprobe': { 'width': 700, 'height': 500 },
|
|
||||||
'optionhelp': { 'width': 400, 'height': 320 },
|
|
||||||
'options': { 'width': 1000, 'height': 660 },
|
|
||||||
'preset': { 'width': 300, 'height': 120 },
|
|
||||||
'server': { 'width': 600, 'height': 405 },
|
|
||||||
'settings': { 'width': 220, 'height': 225 },
|
|
||||||
'state': { 'width': 370, 'height': 134 },
|
|
||||||
'stats': { 'width': 840, 'height': 200 },
|
|
||||||
'storage': { 'width': 600, 'height': 405 },
|
|
||||||
'timeline': { 'width': 760, 'height': 540 },
|
|
||||||
'user': { 'width': 360, 'height': 720 },
|
|
||||||
'version': { 'width': 360, 'height': 140 },
|
|
||||||
'video': { 'width': 420, 'height': 360 },
|
|
||||||
'videoview': { 'addWidth': 48, 'addHeight': 80 },
|
|
||||||
'watch': { 'addWidth': 96, 'minWidth': 420, 'addHeight': 384 },
|
|
||||||
'zone': { 'addWidth': 520, 'addHeight': 260, 'minHeight': 600 },
|
|
||||||
'zones': { 'addWidth': 72, 'addHeight': 232 }
|
|
||||||
};
|
|
|
@ -13,14 +13,11 @@ function getControlResponse( respObj, respText ) {
|
||||||
function controlCmd( control, event, xtell, ytell ) {
|
function controlCmd( control, event, xtell, ytell ) {
|
||||||
var locParms = "&id="+$('mid').get('value');
|
var locParms = "&id="+$('mid').get('value');
|
||||||
if ( event && (xtell || ytell) ) {
|
if ( event && (xtell || ytell) ) {
|
||||||
var xEvent = new Event( event );
|
var target = event.target;
|
||||||
var target = xEvent.target;
|
|
||||||
var coords = $(target).getCoordinates();
|
var coords = $(target).getCoordinates();
|
||||||
|
|
||||||
var l = coords.left;
|
var x = event.pageX - coords.left;
|
||||||
var t = coords.top;
|
var y = event.pageY - coords.top;
|
||||||
var x = xEvent.page.x - l;
|
|
||||||
var y = xEvent.page.y - t;
|
|
||||||
|
|
||||||
if ( xtell ) {
|
if ( xtell ) {
|
||||||
var xge = parseInt( (x*100)/coords.width );
|
var xge = parseInt( (x*100)/coords.width );
|
||||||
|
|
|
@ -6,7 +6,7 @@ function vjsReplay() {
|
||||||
case 'none':
|
case 'none':
|
||||||
break;
|
break;
|
||||||
case 'single':
|
case 'single':
|
||||||
player.play();
|
vid.play();
|
||||||
break;
|
break;
|
||||||
case 'all':
|
case 'all':
|
||||||
if (nextEventId == 0) {
|
if (nextEventId == 0) {
|
||||||
|
|
|
@ -541,14 +541,12 @@ function getControlResponse( respObj, respText ) {
|
||||||
function controlCmd( control, event, xtell, ytell ) {
|
function controlCmd( control, event, xtell, ytell ) {
|
||||||
var locParms = "";
|
var locParms = "";
|
||||||
if ( event && (xtell || ytell) ) {
|
if ( event && (xtell || ytell) ) {
|
||||||
var xEvent = new Event( event );
|
console.log(event);
|
||||||
var target = xEvent.target;
|
var target = event.target;
|
||||||
var coords = $(target).getCoordinates();
|
var coords = $(target).getCoordinates();
|
||||||
|
|
||||||
var l = coords.left;
|
var x = event.pageX - coords.left;
|
||||||
var t = coords.top;
|
var y = event.pageY - coords.top;
|
||||||
var x = xEvent.page.x - l;
|
|
||||||
var y = xEvent.page.y - t;
|
|
||||||
|
|
||||||
if ( xtell ) {
|
if ( xtell ) {
|
||||||
var xge = parseInt( (x*100)/coords.width );
|
var xge = parseInt( (x*100)/coords.width );
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
xhtmlHeaders(__FILE__, translate('Login') );
|
xhtmlHeaders(__FILE__, translate('Login') );
|
||||||
?>
|
?>
|
||||||
<body>
|
<body>
|
||||||
|
<?php echo getNavBarHTML(); ?>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<form class="center-block" name="loginForm" id="loginForm" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
|
<form class="center-block" name="loginForm" id="loginForm" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
|
||||||
<input type="hidden" name="action" value="login"/>
|
<input type="hidden" name="action" value="login"/>
|
||||||
|
@ -15,7 +16,7 @@ xhtmlHeaders(__FILE__, translate('Login') );
|
||||||
|
|
||||||
<div id="loginform">
|
<div id="loginform">
|
||||||
|
|
||||||
<h1>ZoneMinder <?php echo translate('Login') ?></h1>
|
<h1><?php echo ZM_WEB_TITLE . ' ' . translate('Login') ?></h1>
|
||||||
|
|
||||||
<label for="inputUsername" class="sr-only"><?php echo translate('Username') ?></label>
|
<label for="inputUsername" class="sr-only"><?php echo translate('Username') ?></label>
|
||||||
<input type="text" id="inputUsername" name="username" class="form-control" placeholder="Username" required autofocus />
|
<input type="text" id="inputUsername" name="username" class="form-control" placeholder="Username" required autofocus />
|
||||||
|
|
|
@ -25,7 +25,7 @@ xhtmlHeaders(__FILE__, translate('Logout') );
|
||||||
<body>
|
<body>
|
||||||
<div id="page">
|
<div id="page">
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<h1>ZoneMinder <?php echo translate('Logout') ?></h1>
|
<h1><?php echo ZM_WEB_TITLE . ' ' . translate('Logout') ?></h1>
|
||||||
</div>
|
</div>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<form name="contentForm" id="contentForm" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
|
<form name="contentForm" id="contentForm" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
|
||||||
|
|
|
@ -210,11 +210,16 @@ foreach( array_map( 'basename', glob('skins/'.$current_skin.'/css/*',GLOB_ONLYDI
|
||||||
<th class="colCpuLoad"><?php echo translate('CpuLoad') ?></th>
|
<th class="colCpuLoad"><?php echo translate('CpuLoad') ?></th>
|
||||||
<th class="colMemory"><?php echo translate('Free').'/'.translate('Total') . ' ' . translate('Memory') ?></th>
|
<th class="colMemory"><?php echo translate('Free').'/'.translate('Total') . ' ' . translate('Memory') ?></th>
|
||||||
<th class="colSwap"><?php echo translate('Free').'/'.translate('Total') . ' ' . translate('Swap') ?></th>
|
<th class="colSwap"><?php echo translate('Free').'/'.translate('Total') . ' ' . translate('Swap') ?></th>
|
||||||
|
<th class="colStats"><?php echo translate('RunStats') ?></th>
|
||||||
|
<th class="colAudit"><?php echo translate('RunAudit') ?></th>
|
||||||
|
<th class="colTrigger"><?php echo translate('RunTrigger') ?></th>
|
||||||
<th class="colMark"><?php echo translate('Mark') ?></th>
|
<th class="colMark"><?php echo translate('Mark') ?></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach( dbFetchAll( 'SELECT *,(SELECT COUNT(Id) FROM Monitors WHERE ServerId=Servers.Id) AS MonitorCount FROM Servers' ) as $row ) { ?>
|
<?php
|
||||||
|
foreach( dbFetchAll( 'SELECT *,(SELECT COUNT(Id) FROM Monitors WHERE ServerId=Servers.Id) AS MonitorCount FROM Servers ORDER BY Id' ) as $row ) {
|
||||||
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="colName"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Name']), $canEdit ) ?></td>
|
<td class="colName"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Name']), $canEdit ) ?></td>
|
||||||
<td class="colHostname"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Hostname']), $canEdit ) ?></td>
|
<td class="colHostname"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Hostname']), $canEdit ) ?></td>
|
||||||
|
@ -223,6 +228,9 @@ foreach( array_map( 'basename', glob('skins/'.$current_skin.'/css/*',GLOB_ONLYDI
|
||||||
<td class="colCpuLoad"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server',$row['CpuLoad'], $canEdit ) ?></td>
|
<td class="colCpuLoad"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server',$row['CpuLoad'], $canEdit ) ?></td>
|
||||||
<td class="colMemory"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeMem']) . ' / ' . human_filesize($row['TotalMem']), $canEdit ) ?></td>
|
<td class="colMemory"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeMem']) . ' / ' . human_filesize($row['TotalMem']), $canEdit ) ?></td>
|
||||||
<td class="colSwap"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeSwap']) . ' / ' . human_filesize($row['TotalSwap']) , $canEdit ) ?></td>
|
<td class="colSwap"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeSwap']) . ' / ' . human_filesize($row['TotalSwap']) , $canEdit ) ?></td>
|
||||||
|
<td class="colStats"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', $row['zmstats.pl'] ? 'yes' : 'no', $canEdit ) ?></td>
|
||||||
|
<td class="colAudit"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', $row['zmaudit.pl'] ? 'yes' : 'no', $canEdit ) ?></td>
|
||||||
|
<td class="colTrigger"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', $row['zmtrigger.pl'] ? 'yes' : 'no', $canEdit ) ?></td>
|
||||||
|
|
||||||
<td class="colMark"><input type="checkbox" name="markIds[]" value="<?php echo $row['Id'] ?>" onclick="configureDeleteButton( this );"<?php if ( !$canEdit ) { ?> disabled="disabled"<?php } ?>/></td>
|
<td class="colMark"><input type="checkbox" name="markIds[]" value="<?php echo $row['Id'] ?>" onclick="configureDeleteButton( this );"<?php if ( !$canEdit ) { ?> disabled="disabled"<?php } ?>/></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -58,6 +58,27 @@ xhtmlHeaders(__FILE__, translate('Server').' - '.$newServer['Name'] );
|
||||||
<th scope="row"><?php echo translate('Hostname') ?></th>
|
<th scope="row"><?php echo translate('Hostname') ?></th>
|
||||||
<td><input type="text" name="newServer[Hostname]" value="<?php echo $newServer['Hostname'] ?>"/></td>
|
<td><input type="text" name="newServer[Hostname]" value="<?php echo $newServer['Hostname'] ?>"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('RunStats') ?></th>
|
||||||
|
<td>
|
||||||
|
<input type="radio" name="newServer[zmstats.pl]" value="1"<?php echo $newServer['zmstats.pl'] ? ' checked="checked"' : '' ?>/> Yes
|
||||||
|
<input type="radio" name="newServer[zmstats.pl]" value="0"<?php echo $newServer['zmstats.pl'] ? '' : ' checked="checked"' ?>/> No
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('RunAudit') ?></th>
|
||||||
|
<td>
|
||||||
|
<input type="radio" name="newServer[zmaudit.pl]" value="1"<?php echo $newServer['zmaudit.pl'] ? ' checked="checked"' : '' ?>/> Yes
|
||||||
|
<input type="radio" name="newServer[zmaudit.pl]" value="0"<?php echo $newServer['zmaudit.pl'] ? '' : ' checked="checked"' ?>/> No
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('RunTrigger') ?></th>
|
||||||
|
<td>
|
||||||
|
<input type="radio" name="newServer[zmtrigger.pl]" value="1"<?php echo $newServer['zmtrigger.pl'] ? ' checked="checked"' : '' ?>/> Yes
|
||||||
|
<input type="radio" name="newServer[zmtrigger.pl]" value="0"<?php echo $newServer['zmtrigger.pl'] ? '' : ' checked="checked"' ?>/> No
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div id="contentButtons">
|
<div id="contentButtons">
|
||||||
|
|
Loading…
Reference in New Issue