Merge branch 'storageareas' into tesla

This commit is contained in:
Isaac Connor 2018-01-11 18:59:22 -08:00
commit ef16393402
65 changed files with 1508 additions and 1229 deletions

View File

@ -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`
-- --
@ -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,

275
db/zm_update-1.31.20.sql Normal file
View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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',

View File

@ -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};

View File

@ -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 {

View File

@ -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 {

View File

@ -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;

View File

@ -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,27 +284,46 @@ sub run {
my $win = $rin; my $win = $rin;
my $ein = $win; my $ein = $win;
my $timeout = 1; my $timeout = 1;
while( 1 ) { my $Server = undef;
my $secs_count = 0;
if ( $Config{ZM_SERVER_ID} ) { 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 ) {
if ( $Config{ZM_SERVER_ID} ) {
if ( $secs_count % 60 ) {
$dbh = zmDbConnect() if ! $dbh->ping(); $dbh = zmDbConnect() if ! $dbh->ping();
my @cpuload = Sys::CpuLoad::load(); 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, 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 ) {
if ( vec( $rout, fileno(SERVER), 1 ) ) { if ( vec( $rout, fileno(SERVER), 1 ) ) {
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' ) {
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 ); 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} );
} }
} }

173
scripts/zmstats.pl.in Normal file
View File

@ -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__

View File

@ -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;
@ -165,6 +128,9 @@ while( 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__

View File

@ -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 );

View File

@ -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];

View File

@ -1 +1 @@
1.31.19 1.31.20

View File

@ -1,47 +1,39 @@
<?php <?php
function buildControlCommand( $monitor ) function buildControlCommand( $monitor ) {
{ $ctrlCommand = ZM_PATH_BIN.'/zmcontrol.pl';
$ctrlCommand = ZM_PATH_BIN."/zmcontrol.pl";
if ( isset($_REQUEST['xge']) || isset($_REQUEST['yge']) ) if ( isset($_REQUEST['xge']) || isset($_REQUEST['yge']) ) {
{
$slow = 0.9; // Threshold for slow speed/timeouts $slow = 0.9; // Threshold for slow speed/timeouts
$turbo = 0.9; // Threshold for turbo speed $turbo = 0.9; // Threshold for turbo speed
if ( preg_match( '/^([a-z]+)([A-Z][a-z]+)([A-Za-z]+)+$/', $_REQUEST['control'], $matches ) ) if ( preg_match( '/^([a-z]+)([A-Z][a-z]+)([A-Za-z]+)+$/', $_REQUEST['control'], $matches ) ) {
{
$command = $matches[1]; $command = $matches[1];
$mode = $matches[2]; $mode = $matches[2];
$dirn = $matches[3]; $dirn = $matches[3];
switch( $command ) switch( $command ) {
{
case 'focus' : case 'focus' :
{ {
$factor = $_REQUEST['yge']/100; $factor = $_REQUEST['yge']/100;
if ( $monitor->HasFocusSpeed() ) if ( $monitor->HasFocusSpeed() ) {
{
$speed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$factor))); $speed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{ {
$step = intval(round($monitor->MinFocusStep()+(($monitor->MaxFocusStep()-$monitor->MinFocusStep())*$factor))); $step = intval(round($monitor->MinFocusStep()+(($monitor->MaxFocusStep()-$monitor->MinFocusStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
case 'Con' : case 'Con' :
{ {
if ( $monitor->AutoStopTimeout() ) if ( $monitor->AutoStopTimeout() ) {
{
$slowSpeed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$slow))); $slowSpeed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$slow)));
if ( $speed < $slowSpeed ) if ( $speed < $slowSpeed ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
break; break;
@ -50,104 +42,74 @@ function buildControlCommand( $monitor )
break; break;
} }
case 'zoom' : case 'zoom' :
{
$factor = $_REQUEST['yge']/100; $factor = $_REQUEST['yge']/100;
if ( $monitor->HasZoomSpeed() ) if ( $monitor->HasZoomSpeed() ) {
{
$speed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$factor))); $speed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinZoomStep()+(($monitor->MaxZoomStep()-$monitor->MinZoomStep())*$factor))); $step = intval(round($monitor->MinZoomStep()+(($monitor->MaxZoomStep()-$monitor->MinZoomStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
}
case 'Con' : case 'Con' :
{ if ( $monitor->AutoStopTimeout() ) {
if ( $monitor->AutoStopTimeout() )
{
$slowSpeed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$slow))); $slowSpeed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$slow)));
if ( $speed < $slowSpeed ) if ( $speed < $slowSpeed ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
break; break;
} }
}
break; break;
}
case 'iris' : case 'iris' :
{
$factor = $_REQUEST['yge']/100; $factor = $_REQUEST['yge']/100;
if ( $monitor->HasIrisSpeed() ) if ( $monitor->HasIrisSpeed() ) {
{
$speed = intval(round($monitor->MinIrisSpeed()+(($monitor->MaxIrisSpeed()-$monitor->MinIrisSpeed())*$factor))); $speed = intval(round($monitor->MinIrisSpeed()+(($monitor->MaxIrisSpeed()-$monitor->MinIrisSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinIrisStep()+(($monitor->MaxIrisStep()-$monitor->MinIrisStep())*$factor))); $step = intval(round($monitor->MinIrisStep()+(($monitor->MaxIrisStep()-$monitor->MinIrisStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
}
break; break;
}
case 'white' : case 'white' :
{
$factor = $_REQUEST['yge']/100; $factor = $_REQUEST['yge']/100;
if ( $monitor->HasWhiteSpeed() ) if ( $monitor->HasWhiteSpeed() ) {
{
$speed = intval(round($monitor->MinWhiteSpeed()+(($monitor->MaxWhiteSpeed()-$monitor->MinWhiteSpeed())*$factor))); $speed = intval(round($monitor->MinWhiteSpeed()+(($monitor->MaxWhiteSpeed()-$monitor->MinWhiteSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinWhiteStep()+(($monitor->MaxWhiteStep()-$monitor->MinWhiteStep())*$factor))); $step = intval(round($monitor->MinWhiteStep()+(($monitor->MaxWhiteStep()-$monitor->MinWhiteStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
}
break; break;
}
case 'gain' : case 'gain' :
{
$factor = $_REQUEST['yge']/100; $factor = $_REQUEST['yge']/100;
if ( $monitor->HasGainSpeed() ) if ( $monitor->HasGainSpeed() ) {
{
$speed = intval(round($monitor->MinGainSpeed()+(($monitor->MaxGainSpeed()-$monitor->MinGainSpeed())*$factor))); $speed = intval(round($monitor->MinGainSpeed()+(($monitor->MaxGainSpeed()-$monitor->MinGainSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinGainStep()+(($monitor->MaxGainStep()-$monitor->MinGainStep())*$factor))); $step = intval(round($monitor->MinGainStep()+(($monitor->MaxGainStep()-$monitor->MinGainStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
}
break; break;
}
case 'move' : case 'move' :
{
$xFactor = empty($_REQUEST['xge'])?0:$_REQUEST['xge']/100; $xFactor = empty($_REQUEST['xge'])?0:$_REQUEST['xge']/100;
$yFactor = empty($_REQUEST['yge'])?0:$_REQUEST['yge']/100; $yFactor = empty($_REQUEST['yge'])?0:$_REQUEST['yge']/100;
if ( $monitor->Orientation() != '0' ) if ( $monitor->Orientation() != '0' ) {
{
$conversions = array( $conversions = array(
'90' => array( '90' => array(
'Up' => 'Left', 'Up' => 'Left',
@ -205,91 +167,63 @@ function buildControlCommand( $monitor )
$dirn = $new_dirn; $dirn = $new_dirn;
} }
if ( $monitor->HasPanSpeed() && $xFactor ) if ( $monitor->HasPanSpeed() && $xFactor ) {
{ if ( $monitor->HasTurboPan() ) {
if ( $monitor->HasTurboPan() ) if ( $xFactor >= $turbo ) {
{
if ( $xFactor >= $turbo )
{
$panSpeed = $monitor->TurboPanSpeed(); $panSpeed = $monitor->TurboPanSpeed();
} } else {
else
{
$xFactor = $xFactor/$turbo; $xFactor = $xFactor/$turbo;
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
} } else {
else
{
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
$ctrlCommand .= " --panspeed=".$panSpeed; $ctrlCommand .= ' --panspeed='.$panSpeed;
} }
if ( $monitor->HasTiltSpeed() && $yFactor ) if ( $monitor->HasTiltSpeed() && $yFactor ) {
{ if ( $monitor->HasTurboTilt() ) {
if ( $monitor->HasTurboTilt() ) if ( $yFactor >= $turbo ) {
{
if ( $yFactor >= $turbo )
{
$tiltSpeed = $monitor->TurboTiltSpeed(); $tiltSpeed = $monitor->TurboTiltSpeed();
} } else {
else
{
$yFactor = $yFactor/$turbo; $yFactor = $yFactor/$turbo;
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
} } else {
else
{
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
$ctrlCommand .= " --tiltspeed=".$tiltSpeed; $ctrlCommand .= ' --tiltspeed='.$tiltSpeed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Rel' : case 'Rel' :
case 'Abs' : case 'Abs' :
{ if ( preg_match( '/(Left|Right)$/', $dirn ) ) {
if ( preg_match( '/(Left|Right)$/', $dirn ) )
{
$panStep = intval(round($monitor->MinPanStep()+(($monitor->MaxPanStep()-$monitor->MinPanStep())*$xFactor))); $panStep = intval(round($monitor->MinPanStep()+(($monitor->MaxPanStep()-$monitor->MinPanStep())*$xFactor)));
$ctrlCommand .= " --panstep=".$panStep; $ctrlCommand .= ' --panstep='.$panStep;
} }
if ( preg_match( '/^(Up|Down)/', $dirn ) ) if ( preg_match( '/^(Up|Down)/', $dirn ) ) {
{
$tiltStep = intval(round($monitor->MinTiltStep()+(($monitor->MaxTiltStep()-$monitor->MinTiltStep())*$yFactor))); $tiltStep = intval(round($monitor->MinTiltStep()+(($monitor->MaxTiltStep()-$monitor->MinTiltStep())*$yFactor)));
$ctrlCommand .= " --tiltstep=".$tiltStep; $ctrlCommand .= ' --tiltstep='.$tiltStep;
} }
break; break;
}
case 'Con' : case 'Con' :
{ if ( $monitor->AutoStopTimeout() ) {
if ( $monitor->AutoStopTimeout() )
{
$slowPanSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$slow))); $slowPanSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$slow)));
$slowTiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$slow))); $slowTiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$slow)));
if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) ) if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
break; break;
} }
} }
}
}
} else { } else {
Error("Invalid control parameter: " . $_REQUEST['control'] ); Error('Invalid control parameter: ' . $_REQUEST['control'] );
} }
} } elseif ( isset($_REQUEST['x']) && isset($_REQUEST['y']) ) {
elseif ( isset($_REQUEST['x']) && isset($_REQUEST['y']) ) if ( $_REQUEST['control'] == 'moveMap' ) {
{
if ( $_REQUEST['control'] == "moveMap" )
{
$x = deScale( $_REQUEST['x'], $_REQUEST['scale'] ); $x = deScale( $_REQUEST['x'], $_REQUEST['scale'] );
$y = deScale( $_REQUEST['y'], $_REQUEST['scale'] ); $y = deScale( $_REQUEST['y'], $_REQUEST['scale'] );
switch ( $monitor->Orientation() ) switch ( $monitor->Orientation() ) {
{
case '0' : case '0' :
case '180' : case '180' :
case 'hori' : case 'hori' :
@ -303,8 +237,7 @@ function buildControlCommand( $monitor )
$height = $monitor->Width(); $height = $monitor->Width();
break; break;
} }
switch ( $monitor->Orientation() ) switch ( $monitor->Orientation() ) {
{
case '90' : case '90' :
$tempY = $y; $tempY = $y;
$y = $height - $x; $y = $height - $x;
@ -328,9 +261,7 @@ function buildControlCommand( $monitor )
} }
//$ctrlCommand .= " --xcoord=$x --ycoord=$y --width=$width --height=$height"; //$ctrlCommand .= " --xcoord=$x --ycoord=$y --width=$width --height=$height";
$ctrlCommand .= " --xcoord=$x --ycoord=$y"; $ctrlCommand .= " --xcoord=$x --ycoord=$y";
} } elseif ( $_REQUEST['control'] == 'movePseudoMap' ) {
elseif ( $_REQUEST['control'] == "movePseudoMap" )
{
$x = deScale( $_REQUEST['x'], $_REQUEST['scale'] ); $x = deScale( $_REQUEST['x'], $_REQUEST['scale'] );
$y = deScale( $_REQUEST['y'], $_REQUEST['scale'] ); $y = deScale( $_REQUEST['y'], $_REQUEST['scale'] );
@ -339,8 +270,7 @@ function buildControlCommand( $monitor )
$xFactor = ($x - $halfWidth)/$halfWidth; $xFactor = ($x - $halfWidth)/$halfWidth;
$yFactor = ($y - $halfHeight)/$halfHeight; $yFactor = ($y - $halfHeight)/$halfHeight;
switch ( $monitor->Orientation() ) switch ( $monitor->Orientation() ) {
{
case '90' : case '90' :
$tempYFactor = $y; $tempYFactor = $y;
$yFactor = -$xFactor; $yFactor = -$xFactor;
@ -368,88 +298,61 @@ function buildControlCommand( $monitor )
$panControl = ''; $panControl = '';
$tiltControl = ''; $tiltControl = '';
if ( $xFactor > $blind ) if ( $xFactor > $blind ) {
{
$panControl = 'Right'; $panControl = 'Right';
} } elseif ( $xFactor < -$blind ) {
elseif ( $xFactor < -$blind )
{
$panControl = 'Left'; $panControl = 'Left';
} }
if ( $yFactor > $blind ) if ( $yFactor > $blind ) {
{
$tiltControl = 'Down'; $tiltControl = 'Down';
} } elseif ( $yFactor < -$blind ) {
elseif ( $yFactor < -$blind )
{
$tiltControl = 'Up'; $tiltControl = 'Up';
} }
$dirn = $tiltControl.$panControl; $dirn = $tiltControl.$panControl;
if ( !$dirn ) if ( !$dirn ) {
{
// No command, probably in blind spot in middle // No command, probably in blind spot in middle
$_REQUEST['control'] = 'null'; $_REQUEST['control'] = 'null';
return( false ); return( false );
} } else {
else
{
$_REQUEST['control'] = 'moveRel'.$dirn; $_REQUEST['control'] = 'moveRel'.$dirn;
$xFactor = abs($xFactor); $xFactor = abs($xFactor);
$yFactor = abs($yFactor); $yFactor = abs($yFactor);
if ( $monitor->HasPanSpeed() && $xFactor ) if ( $monitor->HasPanSpeed() && $xFactor ) {
{ if ( $monitor->HasTurboPan() ) {
if ( $monitor->HasTurboPan() ) if ( $xFactor >= $turbo ) {
{
if ( $xFactor >= $turbo )
{
$panSpeed = $monitor->TurboPanSpeed(); $panSpeed = $monitor->TurboPanSpeed();
} } else {
else
{
$xFactor = $xFactor/$turbo; $xFactor = $xFactor/$turbo;
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
} } else {
else
{
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
} }
if ( $monitor->HasTiltSpeed() && $yFactor ) if ( $monitor->HasTiltSpeed() && $yFactor ) {
{ if ( $monitor->HasTurboTilt() ) {
if ( $monitor->HasTurboTilt() ) if ( $yFactor >= $turbo ) {
{
if ( $yFactor >= $turbo )
{
$tiltSpeed = $monitor->TurboTiltSpeed(); $tiltSpeed = $monitor->TurboTiltSpeed();
} } else {
else
{
$yFactor = $yFactor/$turbo; $yFactor = $yFactor/$turbo;
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
} } else {
else
{
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
} }
if ( preg_match( '/(Left|Right)$/', $dirn ) ) if ( preg_match( '/(Left|Right)$/', $dirn ) ) {
{
$panStep = intval(round($monitor->MinPanStep()+(($monitor->MaxPanStep()-$monitor->MinPanStep())*$xFactor))); $panStep = intval(round($monitor->MinPanStep()+(($monitor->MaxPanStep()-$monitor->MinPanStep())*$xFactor)));
$ctrlCommand .= " --panstep=".$panStep." --panspeed=".$panSpeed; $ctrlCommand .= ' --panstep='.$panStep.' --panspeed='.$panSpeed;
} }
if ( preg_match( '/^(Up|Down)/', $dirn ) ) if ( preg_match( '/^(Up|Down)/', $dirn ) ) {
{
$tiltStep = intval(round($monitor->MinTiltStep()+(($monitor->MaxTiltStep()-$monitor->MinTiltStep())*$yFactor))); $tiltStep = intval(round($monitor->MinTiltStep()+(($monitor->MaxTiltStep()-$monitor->MinTiltStep())*$yFactor)));
$ctrlCommand .= " --tiltstep=".$tiltStep." --tiltspeed=".$tiltSpeed; $ctrlCommand .= ' --tiltstep='.$tiltStep.' --tiltspeed='.$tiltSpeed;
} }
} }
} } elseif ( $_REQUEST['control'] == 'moveConMap' ) {
elseif ( $_REQUEST['control'] == "moveConMap" )
{
$x = deScale( $_REQUEST['x'], $_REQUEST['scale'] ); $x = deScale( $_REQUEST['x'], $_REQUEST['scale'] );
$y = deScale( $_REQUEST['y'], $_REQUEST['scale'] ); $y = deScale( $_REQUEST['y'], $_REQUEST['scale'] );
@ -458,8 +361,7 @@ function buildControlCommand( $monitor )
$xFactor = ($x - $halfWidth)/$halfWidth; $xFactor = ($x - $halfWidth)/$halfWidth;
$yFactor = ($y - $halfHeight)/$halfHeight; $yFactor = ($y - $halfHeight)/$halfHeight;
switch ( $monitor->Orientation() ) switch ( $monitor->Orientation() ) {
{
case '90' : case '90' :
$tempYFactor = $y; $tempYFactor = $y;
$yFactor = -$xFactor; $yFactor = -$xFactor;
@ -488,316 +390,214 @@ function buildControlCommand( $monitor )
$panControl = ''; $panControl = '';
$tiltControl = ''; $tiltControl = '';
if ( $xFactor > $blind ) if ( $xFactor > $blind ) {
{
$panControl = 'Right'; $panControl = 'Right';
} } elseif ( $xFactor < -$blind ) {
elseif ( $xFactor < -$blind )
{
$panControl = 'Left'; $panControl = 'Left';
} }
if ( $yFactor > $blind ) if ( $yFactor > $blind ) {
{
$tiltControl = 'Down'; $tiltControl = 'Down';
} } elseif ( $yFactor < -$blind ) {
elseif ( $yFactor < -$blind )
{
$tiltControl = 'Up'; $tiltControl = 'Up';
} }
$dirn = $tiltControl.$panControl; $dirn = $tiltControl.$panControl;
if ( !$dirn ) if ( !$dirn ) {
{
// No command, probably in blind spot in middle // No command, probably in blind spot in middle
$_REQUEST['control'] = 'moveStop'; $_REQUEST['control'] = 'moveStop';
} } else {
else
{
$_REQUEST['control'] = 'moveCon'.$dirn; $_REQUEST['control'] = 'moveCon'.$dirn;
$xFactor = abs($xFactor); $xFactor = abs($xFactor);
$yFactor = abs($yFactor); $yFactor = abs($yFactor);
if ( $monitor->HasPanSpeed() && $xFactor ) if ( $monitor->HasPanSpeed() && $xFactor ) {
{ if ( $monitor->HasTurboPan() ) {
if ( $monitor->HasTurboPan() ) if ( $xFactor >= $turbo ) {
{
if ( $xFactor >= $turbo )
{
$panSpeed = $monitor->TurboPanSpeed(); $panSpeed = $monitor->TurboPanSpeed();
} } else {
else
{
$xFactor = $xFactor/$turbo; $xFactor = $xFactor/$turbo;
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
} } else {
else
{
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
} }
if ( $monitor->HasTiltSpeed() && $yFactor ) if ( $monitor->HasTiltSpeed() && $yFactor ) {
{ if ( $monitor->HasTurboTilt() ) {
if ( $monitor->HasTurboTilt() ) if ( $yFactor >= $turbo ) {
{
if ( $yFactor >= $turbo )
{
$tiltSpeed = $monitor->TurboTiltSpeed(); $tiltSpeed = $monitor->TurboTiltSpeed();
} } else {
else
{
$yFactor = $yFactor/$turbo; $yFactor = $yFactor/$turbo;
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
} } else {
else
{
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
} }
if ( preg_match( '/(Left|Right)$/', $dirn ) ) if ( preg_match( '/(Left|Right)$/', $dirn ) ) {
{ $ctrlCommand .= ' --panspeed='.$panSpeed;
$ctrlCommand .= " --panspeed=".$panSpeed;
} }
if ( preg_match( '/^(Up|Down)/', $dirn ) ) if ( preg_match( '/^(Up|Down)/', $dirn ) ) {
{ $ctrlCommand .= ' --tiltspeed='.$tiltSpeed;
$ctrlCommand .= " --tiltspeed=".$tiltSpeed;
} }
if ( $monitor->AutoStopTimeout() ) if ( $monitor->AutoStopTimeout() ) {
{
$slowPanSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$slow))); $slowPanSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$slow)));
$slowTiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$slow))); $slowTiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$slow)));
if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) ) if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
} }
} } else {
else
{
$slow = 0.9; // Threshold for slow speed/timeouts $slow = 0.9; // Threshold for slow speed/timeouts
$turbo = 0.9; // Threshold for turbo speed $turbo = 0.9; // Threshold for turbo speed
$long_y = 48; $long_y = 48;
$short_x = 32; $short_x = 32;
$short_y = 32; $short_y = 32;
if ( preg_match( '/^([a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)$/', $_REQUEST['control'], $matches ) ) if ( preg_match( '/^([a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)$/', $_REQUEST['control'], $matches ) ) {
{
$command = $matches[1]; $command = $matches[1];
$mode = $matches[2]; $mode = $matches[2];
$dirn = $matches[3]; $dirn = $matches[3];
switch( $command ) switch( $command ) {
{
case 'focus' : case 'focus' :
{ switch( $dirn ) {
switch( $dirn )
{
case 'Near' : case 'Near' :
{
$factor = ($long_y-($y+1))/$long_y; $factor = ($long_y-($y+1))/$long_y;
break; break;
}
case 'Far' : case 'Far' :
{
$factor = ($y+1)/$long_y; $factor = ($y+1)/$long_y;
break; break;
} }
} if ( $monitor->HasFocusSpeed() ) {
if ( $monitor->HasFocusSpeed() )
{
$speed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$factor))); $speed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinFocusStep()+(($monitor->MaxFocusStep()-$monitor->MinFocusStep())*$factor))); $step = intval(round($monitor->MinFocusStep()+(($monitor->MaxFocusStep()-$monitor->MinFocusStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
}
case 'Con' : case 'Con' :
{ if ( $monitor->AutoStopTimeout() ) {
if ( $monitor->AutoStopTimeout() )
{
$slowSpeed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$slow))); $slowSpeed = intval(round($monitor->MinFocusSpeed()+(($monitor->MaxFocusSpeed()-$monitor->MinFocusSpeed())*$slow)));
if ( $speed < $slowSpeed ) if ( $speed < $slowSpeed ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
break; break;
} }
}
break; break;
}
case 'zoom' : case 'zoom' :
{ switch( $dirn ) {
switch( $dirn )
{
case 'Tele' : case 'Tele' :
{
$factor = ($long_y-($y+1))/$long_y; $factor = ($long_y-($y+1))/$long_y;
break; break;
}
case 'Wide' : case 'Wide' :
{
$factor = ($y+1)/$long_y; $factor = ($y+1)/$long_y;
break; break;
} }
} if ( $monitor->HasZoomSpeed() ) {
if ( $monitor->HasZoomSpeed() )
{
$speed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$factor))); $speed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinZoomStep()+(($monitor->MaxZoomStep()-$monitor->MinZoomStep())*$factor))); $step = intval(round($monitor->MinZoomStep()+(($monitor->MaxZoomStep()-$monitor->MinZoomStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
}
case 'Con' : case 'Con' :
{ if ( $monitor->AutoStopTimeout() ) {
if ( $monitor->AutoStopTimeout() )
{
$slowSpeed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$slow))); $slowSpeed = intval(round($monitor->MinZoomSpeed()+(($monitor->MaxZoomSpeed()-$monitor->MinZoomSpeed())*$slow)));
if ( $speed < $slowSpeed ) if ( $speed < $slowSpeed ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
break; break;
} }
}
break; break;
}
case 'iris' : case 'iris' :
{ switch( $dirn ) {
switch( $dirn )
{
case 'Open' : case 'Open' :
{
$factor = ($long_y-($y+1))/$long_y; $factor = ($long_y-($y+1))/$long_y;
break; break;
}
case 'Close' : case 'Close' :
{
$factor = ($y+1)/$long_y; $factor = ($y+1)/$long_y;
break; break;
} }
} if ( $monitor->HasIrisSpeed() ) {
if ( $monitor->HasIrisSpeed() )
{
$speed = intval(round($monitor->MinIrisSpeed()+(($monitor->MaxIrisSpeed()-$monitor->MinIrisSpeed())*$factor))); $speed = intval(round($monitor->MinIrisSpeed()+(($monitor->MaxIrisSpeed()-$monitor->MinIrisSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinIrisStep()+(($monitor->MaxIrisStep()-$monitor->MinIrisStep())*$factor))); $step = intval(round($monitor->MinIrisStep()+(($monitor->MaxIrisStep()-$monitor->MinIrisStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
}
break; break;
}
case 'white' : case 'white' :
{ switch( $dirn ) {
switch( $dirn )
{
case 'In' : case 'In' :
{
$factor = ($long_y-($y+1))/$long_y; $factor = ($long_y-($y+1))/$long_y;
break; break;
}
case 'Out' : case 'Out' :
{
$factor = ($y+1)/$long_y; $factor = ($y+1)/$long_y;
break; break;
} }
} if ( $monitor->HasWhiteSpeed() ) {
if ( $monitor->HasWhiteSpeed() )
{
$speed = intval(round($monitor->MinWhiteSpeed()+(($monitor->MaxWhiteSpeed()-$monitor->MinWhiteSpeed())*$factor))); $speed = intval(round($monitor->MinWhiteSpeed()+(($monitor->MaxWhiteSpeed()-$monitor->MinWhiteSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinWhiteStep()+(($monitor->MaxWhiteStep()-$monitor->MinWhiteStep())*$factor))); $step = intval(round($monitor->MinWhiteStep()+(($monitor->MaxWhiteStep()-$monitor->MinWhiteStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
}
break; break;
}
case 'gain' : case 'gain' :
{ switch( $dirn ) {
switch( $dirn )
{
case 'Up' : case 'Up' :
{
$factor = ($long_y-($y+1))/$long_y; $factor = ($long_y-($y+1))/$long_y;
break; break;
}
case 'Down' : case 'Down' :
{
$factor = ($y+1)/$long_y; $factor = ($y+1)/$long_y;
break; break;
} }
} if ( $monitor->HasGainSpeed() ) {
if ( $monitor->HasGainSpeed() )
{
$speed = intval(round($monitor->MinGainSpeed()+(($monitor->MaxGainSpeed()-$monitor->MinGainSpeed())*$factor))); $speed = intval(round($monitor->MinGainSpeed()+(($monitor->MaxGainSpeed()-$monitor->MinGainSpeed())*$factor)));
$ctrlCommand .= " --speed=".$speed; $ctrlCommand .= ' --speed='.$speed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Abs' : case 'Abs' :
case 'Rel' : case 'Rel' :
{
$step = intval(round($monitor->MinGainStep()+(($monitor->MaxGainStep()-$monitor->MinGainStep())*$factor))); $step = intval(round($monitor->MinGainStep()+(($monitor->MaxGainStep()-$monitor->MinGainStep())*$factor)));
$ctrlCommand .= " --step=".$step; $ctrlCommand .= ' --step='.$step;
break; break;
} }
}
break; break;
}
case 'move' : case 'move' :
{
$xFactor = 0; $xFactor = 0;
$yFactor = 0; $yFactor = 0;
if ( preg_match( '/^Up/', $dirn ) ) if ( preg_match( '/^Up/', $dirn ) ) {
{
$yFactor = ($short_y-($y+1))/$short_y; $yFactor = ($short_y-($y+1))/$short_y;
} } elseif ( preg_match( '/^Down/', $dirn ) ) {
elseif ( preg_match( '/^Down/', $dirn ) )
{
$yFactor = ($y+1)/$short_y; $yFactor = ($y+1)/$short_y;
} }
if ( preg_match( '/Left$/', $dirn ) ) if ( preg_match( '/Left$/', $dirn ) ) {
{
$xFactor = ($short_x-($x+1))/$short_x; $xFactor = ($short_x-($x+1))/$short_x;
} } elseif ( preg_match( '/Right$/', $dirn ) ) {
elseif ( preg_match( '/Right$/', $dirn ) )
{
$xFactor = ($x+1)/$short_x; $xFactor = ($x+1)/$short_x;
} }
if ( $monitor->Orientation() != '0' ) if ( $monitor->Orientation() != '0' ) {
{
$conversions = array( $conversions = array(
'90' => array( '90' => array(
'Up' => 'Left', 'Up' => 'Left',
@ -855,72 +655,50 @@ function buildControlCommand( $monitor )
$dirn = $new_dirn; $dirn = $new_dirn;
} }
if ( $monitor->HasPanSpeed() && $xFactor ) if ( $monitor->HasPanSpeed() && $xFactor ) {
{ if ( $monitor->HasTurboPan() ) {
if ( $monitor->HasTurboPan() ) if ( $xFactor >= $turbo ) {
{
if ( $xFactor >= $turbo )
{
$panSpeed = $monitor->TurboPanSpeed(); $panSpeed = $monitor->TurboPanSpeed();
} } else {
else
{
$xFactor = $xFactor/$turbo; $xFactor = $xFactor/$turbo;
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
} } else {
else
{
$panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor))); $panSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$xFactor)));
} }
$ctrlCommand .= " --panspeed=".$panSpeed; $ctrlCommand .= ' --panspeed='.$panSpeed;
} }
if ( $monitor->HasTiltSpeed() && $yFactor ) if ( $monitor->HasTiltSpeed() && $yFactor ) {
{ if ( $monitor->HasTurboTilt() ) {
if ( $monitor->HasTurboTilt() ) if ( $yFactor >= $turbo ) {
{
if ( $yFactor >= $turbo )
{
$tiltSpeed = $monitor->TurboTiltSpeed(); $tiltSpeed = $monitor->TurboTiltSpeed();
} } else {
else
{
$yFactor = $yFactor/$turbo; $yFactor = $yFactor/$turbo;
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
} } else {
else
{
$tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor))); $tiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$yFactor)));
} }
$ctrlCommand .= " --tiltspeed=".$tiltSpeed; $ctrlCommand .= ' --tiltspeed='.$tiltSpeed;
} }
switch( $mode ) switch( $mode ) {
{
case 'Rel' : case 'Rel' :
case 'Abs' : case 'Abs' :
{ if ( preg_match( '/(Left|Right)$/', $dirn ) ) {
if ( preg_match( '/(Left|Right)$/', $dirn ) )
{
$panStep = intval(round($monitor->MinPanStep()+(($monitor->MaxPanStep()-$monitor->MinPanStep())*$xFactor))); $panStep = intval(round($monitor->MinPanStep()+(($monitor->MaxPanStep()-$monitor->MinPanStep())*$xFactor)));
$ctrlCommand .= " --panstep=".$panStep; $ctrlCommand .= ' --panstep='.$panStep;
} }
if ( preg_match( '/^(Up|Down)/', $dirn ) ) if ( preg_match( '/^(Up|Down)/', $dirn ) ) {
{
$tiltStep = intval(round($monitor->MinTiltStep()+(($monitor->MaxTiltStep()-$monitor->MinTiltStep())*$yFactor))); $tiltStep = intval(round($monitor->MinTiltStep()+(($monitor->MaxTiltStep()-$monitor->MinTiltStep())*$yFactor)));
$ctrlCommand .= " --tiltstep=".$tiltStep; $ctrlCommand .= ' --tiltstep='.$tiltStep;
} }
break; break;
}
case 'Con' : case 'Con' :
{ if ( $monitor->AutoStopTimeout() ) {
if ( $monitor->AutoStopTimeout() )
{
$slowPanSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$slow))); $slowPanSpeed = intval(round($monitor->MinPanSpeed()+(($monitor->MaxPanSpeed()-$monitor->MinPanSpeed())*$slow)));
$slowTiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$slow))); $slowTiltSpeed = intval(round($monitor->MinTiltSpeed()+(($monitor->MaxTiltSpeed()-$monitor->MinTiltSpeed())*$slow)));
if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) ) if ( (!isset($panSpeed) || ($panSpeed < $slowPanSpeed)) && (!isset($tiltSpeed) || ($tiltSpeed < $slowTiltSpeed)) ) {
{ $ctrlCommand .= ' --autostop';
$ctrlCommand .= " --autostop";
} }
} }
break; break;
@ -928,20 +706,13 @@ function buildControlCommand( $monitor )
} }
} }
} }
} } else {
} if ( preg_match( '/^presetGoto(\d+)$/', $_REQUEST['control'], $matches ) ) {
}
else
{
if ( preg_match( '/^presetGoto(\d+)$/', $_REQUEST['control'], $matches ) )
{
$_REQUEST['control'] = 'presetGoto'; $_REQUEST['control'] = 'presetGoto';
$ctrlCommand .= " --preset=".$matches[1]; $ctrlCommand .= ' --preset='.$matches[1];
} } elseif ( $_REQUEST['control'] == 'presetGoto' && !empty($_REQUEST['preset']) ) {
elseif ( $_REQUEST['control'] == "presetGoto" && !empty($_REQUEST['preset']) ) $ctrlCommand .= ' --preset='.$_REQUEST['preset'];
{ } elseif ( $_REQUEST['control'] == 'presetSet' ) {
$ctrlCommand .= " --preset=".$_REQUEST['preset'];
} elseif ( $_REQUEST['control'] == "presetSet" ) {
if ( canEdit( 'Control' ) ) { if ( canEdit( 'Control' ) ) {
$preset = validInt($_REQUEST['preset']); $preset = validInt($_REQUEST['preset']);
$newLabel = validJsStr($_REQUEST['newLabel']); $newLabel = validJsStr($_REQUEST['newLabel']);
@ -953,16 +724,14 @@ function buildControlCommand( $monitor )
dbQuery( 'DELETE FROM ControlPresets WHERE MonitorId = ? AND Preset = ?', array( $monitor->Id(), $preset ) ); dbQuery( 'DELETE FROM ControlPresets WHERE MonitorId = ? AND Preset = ?', array( $monitor->Id(), $preset ) );
} }
} }
$ctrlCommand .= " --preset=".$preset; $ctrlCommand .= ' --preset='.$preset;
} }
$ctrlCommand .= " --preset=".$preset; $ctrlCommand .= ' --preset='.$preset;
} } elseif ( $_REQUEST['control'] == 'moveMap' ) {
elseif ( $_REQUEST['control'] == "moveMap" )
{
$ctrlCommand .= " --xcoord=$x --ycoord=$y"; $ctrlCommand .= " --xcoord=$x --ycoord=$y";
} }
} }
$ctrlCommand .= " --command=".$_REQUEST['control']; $ctrlCommand .= ' --command='.$_REQUEST['control'];
return( $ctrlCommand ); return( $ctrlCommand );
} }
@ -970,12 +739,12 @@ function sendControlCommand($mid,$command) {
// Either connects to running zmcontrol.pl or runs zmcontrol.pl to send the command. // Either connects to running zmcontrol.pl or runs zmcontrol.pl to send the command.
$socket = socket_create( AF_UNIX, SOCK_STREAM, 0 ); $socket = socket_create( AF_UNIX, SOCK_STREAM, 0 );
if ( $socket < 0 ) { if ( $socket < 0 ) {
Fatal( "socket_create() failed: ".socket_strerror($socket) ); Fatal( 'socket_create() failed: '.socket_strerror($socket) );
} }
$sockFile = ZM_PATH_SOCKS.'/zmcontrol-'.$mid.'.sock'; $sockFile = ZM_PATH_SOCKS.'/zmcontrol-'.$mid.'.sock';
if ( @socket_connect( $socket, $sockFile ) ) { if ( @socket_connect( $socket, $sockFile ) ) {
$options = array(); $options = array();
foreach ( explode( " ", $command ) as $option ) { foreach ( explode( ' ', $command ) as $option ) {
if ( preg_match( '/--([^=]+)(?:=(.+))?/', $option, $matches ) ) { if ( preg_match( '/--([^=]+)(?:=(.+))?/', $option, $matches ) ) {
$options[$matches[1]] = $matches[2]?$matches[2]:1; $options[$matches[1]] = $matches[2]?$matches[2]:1;
} }

View File

@ -1198,8 +1198,9 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&amp;' ) {
// 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,7 +1212,7 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&amp;' ) {
// 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
@ -1298,8 +1299,10 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&amp;' ) {
$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";
if ( isset($terms[$i]['val']) ) {
$filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][val]").'='.urlencode($terms[$i]['val']); $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"; $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 {

View File

@ -151,5 +151,4 @@
width: 24px; width: 24px;
color: #ffffff; color: #ffffff;
text-align: center; text-align: center;
background-color: #016A9D;
} }

View File

@ -1,3 +1,7 @@
#options {
padding-top: 10px;
}
input.small { input.small {
width: 6em; width: 6em;
} }

View File

@ -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

View File

@ -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 },

View File

@ -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 }
};

View File

@ -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 );

View File

@ -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) {

View File

@ -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 );

View File

@ -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 />

View File

@ -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'] ?>">

View File

@ -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&amp;id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Name']), $canEdit ) ?></td> <td class="colName"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Name']), $canEdit ) ?></td>
<td class="colHostname"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Hostname']), $canEdit ) ?></td> <td class="colHostname"><?php echo makePopupLink( '?view=server&amp;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&amp;id='.$row['Id'], 'zmServer', 'server',$row['CpuLoad'], $canEdit ) ?></td> <td class="colCpuLoad"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server',$row['CpuLoad'], $canEdit ) ?></td>
<td class="colMemory"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeMem']) . ' / ' . human_filesize($row['TotalMem']), $canEdit ) ?></td> <td class="colMemory"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeMem']) . ' / ' . human_filesize($row['TotalMem']), $canEdit ) ?></td>
<td class="colSwap"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeSwap']) . ' / ' . human_filesize($row['TotalSwap']) , $canEdit ) ?></td> <td class="colSwap"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeSwap']) . ' / ' . human_filesize($row['TotalSwap']) , $canEdit ) ?></td>
<td class="colStats"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', $row['zmstats.pl'] ? 'yes' : 'no', $canEdit ) ?></td>
<td class="colAudit"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', $row['zmaudit.pl'] ? 'yes' : 'no', $canEdit ) ?></td>
<td class="colTrigger"><?php echo makePopupLink( '?view=server&amp;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>

View File

@ -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">