Merge branch 'master' into remove_default_view
This commit is contained in:
commit
278abbc201
|
@ -1,23 +1,43 @@
|
||||||
You should only file an issue if you found a bug. Feature and enhancement requests, general discussions and support questions should occur in one of the following areas:
|
**THIS FORUM IS FOR BUG REPORTS ONLY**
|
||||||
|
|
||||||
|
Do not post feature or enhancement requests, general discussions or support questions here.
|
||||||
|
|
||||||
|
Feature and enhancement requests, general discussions, and support questions should occur in one of the following areas:
|
||||||
|
|
||||||
- The [ZoneMinder-Chat Slack channel](https://zoneminder-chat.herokuapp.com/)
|
- The [ZoneMinder-Chat Slack channel](https://zoneminder-chat.herokuapp.com/)
|
||||||
- The [ZoneMinder Forum](https://forums.zoneminder.com/)
|
- The [ZoneMinder Forum](https://forums.zoneminder.com/)
|
||||||
|
|
||||||
**Do not post feature or enhancement requests, general discussions or support questions here.**
|
|
||||||
|
|
||||||
Docker related issues should be posted here: https://github.com/ZoneMinder/zmdockerfiles
|
Docker related issues should be posted here: https://github.com/ZoneMinder/zmdockerfiles
|
||||||
|
|
||||||
Make sure you are running the latest version of ZoneMinder before reporting an issue.
|
In order to submit a bug report, please populate the fields below. This is required.
|
||||||
|
|
||||||
**ZoneMinder Version (`zmaudit.pl -v`):**
|
**Describe Your Environment**
|
||||||
|
- Version of ZoneMinder [release version, development version, or commit]
|
||||||
|
- How you installed ZoneMinder [e.g. PPA, RPMFusion, from-source, etc]
|
||||||
|
- Full name and version of OS
|
||||||
|
|
||||||
**Are you using a development snapshot / git checkout? If so, what is the latest commit? (`git rev-parse HEAD`):**
|
**If the issue concerns a camera**
|
||||||
|
- Make and Model
|
||||||
|
- frame rate
|
||||||
|
- resolution
|
||||||
|
- ZoneMinder Source Type:
|
||||||
|
|
||||||
**Linux Distribution and Version (`cat /etc/os-release` or `cat /etc/redhat-release`):**
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
**If the issue concerns a camera, provide the make, model, frame rate, resolution and ZoneMinder Source Type:**
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
**Relevant log lines:**
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Debug Logs**
|
||||||
```
|
```
|
||||||
log lines here
|
|
||||||
|
<insert debug logs here, please make sure they are within the ``` quotes so they are formatted properly>
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Configuration for welcome - https://github.com/behaviorbot/welcome
|
||||||
|
|
||||||
|
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
|
||||||
|
|
||||||
|
# Comment to be posted to on first time issues
|
||||||
|
newIssueWelcomeComment: >
|
||||||
|
Thanks for opening your first issue here! Just a reminder, this forum is for Bug Reports only. Be sure to follow the issue template!
|
||||||
|
|
||||||
|
# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
|
||||||
|
|
||||||
|
# Comment to be posted to on PRs from first time contributors in your repository
|
||||||
|
#newPRWelcomeComment: >
|
||||||
|
# Thanks for opening this pull request! Please check out our contributing guidelines.
|
||||||
|
|
||||||
|
# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
|
||||||
|
|
||||||
|
# Comment to be posted to on pull requests merged by a first time user
|
||||||
|
#firstPRMergeComment: >
|
||||||
|
# Congrats on merging your first pull request! We here at behaviorbot are proud of you!
|
||||||
|
|
||||||
|
# It is recommend to include as many gifs and emojis as possible
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Configuration for probot-no-response - https://github.com/probot/no-response
|
||||||
|
|
||||||
|
# Number of days of inactivity before an Issue is closed for lack of response
|
||||||
|
daysUntilClose: 7
|
||||||
|
# Label requiring a response
|
||||||
|
responseRequiredLabel: more-information-needed
|
||||||
|
# Comment to post when closing an Issue for lack of response. Set to `false` to disable
|
||||||
|
closeComment: >
|
||||||
|
This issue has been automatically closed because there has been no response
|
||||||
|
to our request for more information from the original author. With only the
|
||||||
|
information that is currently in the issue, we don't have enough information
|
||||||
|
to take action. Please reach out if you have or find the answers we need so
|
||||||
|
that we can investigate further.
|
|
@ -555,7 +555,12 @@ INSERT INTO States (Name,Definition,IsActive) VALUES ('default','','1');
|
||||||
DROP TABLE IF EXISTS `Servers`;
|
DROP TABLE IF EXISTS `Servers`;
|
||||||
CREATE TABLE `Servers` (
|
CREATE TABLE `Servers` (
|
||||||
`Id` int(10) unsigned NOT NULL auto_increment,
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
|
`Protocol` TEXT,
|
||||||
`Hostname` TEXT,
|
`Hostname` TEXT,
|
||||||
|
`Port` INTEGER UNSIGNED,
|
||||||
|
`PathToIndex` TEXT,
|
||||||
|
`PathToZMS` TEXT,
|
||||||
|
`PathToApi` TEXT,
|
||||||
`Name` varchar(64) NOT NULL default '',
|
`Name` varchar(64) NOT NULL default '',
|
||||||
`State_Id` int(10) unsigned,
|
`State_Id` int(10) unsigned,
|
||||||
`Status` enum('Unknown','NotRunning','Running') NOT NULL default 'Unknown',
|
`Status` enum('Unknown','NotRunning','Running') NOT NULL default 'Unknown',
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
ALTER TABLE Frames MODIFY COLUMN EventId bigint unsigned NOT NULL;
|
ALTER TABLE Frames MODIFY COLUMN EventId bigint unsigned NOT NULL;
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,361 @@
|
||||||
-- This updates a 1.32.2 database to 1.32.3
|
-- This updates a 1.32.2 database to 1.32.3
|
||||||
--
|
--
|
||||||
|
|
||||||
|
delimiter //
|
||||||
|
DROP TRIGGER IF EXISTS Events_Hour_delete_trigger//
|
||||||
|
CREATE TRIGGER Events_Hour_delete_trigger BEFORE DELETE ON Events_Hour
|
||||||
|
FOR EACH ROW BEGIN
|
||||||
|
UPDATE Monitors SET
|
||||||
|
HourEvents = COALESCE(HourEvents,1)-1,
|
||||||
|
HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Events_Hour_update_trigger//
|
||||||
|
|
||||||
|
CREATE TRIGGER Events_Hour_update_trigger AFTER UPDATE ON Events_Hour
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
declare diff BIGINT default 0;
|
||||||
|
|
||||||
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
|
IF ( diff ) THEN
|
||||||
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
|
UPDATE Monitors SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0) WHERE Monitors.Id=OLD.MonitorId;
|
||||||
|
UPDATE Monitors SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)-COALESCE(NEW.DiskSpace,0) WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
ELSE
|
||||||
|
UPDATE Monitors SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)+diff WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
delimiter //
|
||||||
|
DROP TRIGGER IF EXISTS Events_Day_delete_trigger//
|
||||||
|
CREATE TRIGGER Events_Day_delete_trigger BEFORE DELETE ON Events_Day
|
||||||
|
FOR EACH ROW BEGIN
|
||||||
|
UPDATE Monitors SET
|
||||||
|
DayEvents = COALESCE(DayEvents,1)-1,
|
||||||
|
DayEventDiskSpace=COALESCE(DayEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Events_Day_update_trigger;
|
||||||
|
CREATE TRIGGER Events_Day_update_trigger AFTER UPDATE ON Events_Day
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
declare diff BIGINT default 0;
|
||||||
|
|
||||||
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
|
IF ( diff ) THEN
|
||||||
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
|
UPDATE Monitors SET DayEventDiskSpace=COALESCE(DayEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0) WHERE Monitors.Id=OLD.MonitorId;
|
||||||
|
UPDATE Monitors SET DayEventDiskSpace=COALESCE(DayEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
ELSE
|
||||||
|
UPDATE Monitors SET DayEventDiskSpace=COALESCE(DayEventDiskSpace,0)+diff WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Events_Week_delete_trigger//
|
||||||
|
CREATE TRIGGER Events_Week_delete_trigger BEFORE DELETE ON Events_Week
|
||||||
|
FOR EACH ROW BEGIN
|
||||||
|
UPDATE Monitors SET
|
||||||
|
WeekEvents = COALESCE(WeekEvents,1)-1,
|
||||||
|
WeekEventDiskSpace=COALESCE(WeekEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Events_Week_update_trigger;
|
||||||
|
CREATE TRIGGER Events_Week_update_trigger AFTER UPDATE ON Events_Week
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
declare diff BIGINT default 0;
|
||||||
|
|
||||||
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
|
IF ( diff ) THEN
|
||||||
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
|
UPDATE Monitors SET WeekEventDiskSpace=COALESCE(WeekEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0) WHERE Monitors.Id=OLD.MonitorId;
|
||||||
|
UPDATE Monitors SET WeekEventDiskSpace=COALESCE(WeekEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
ELSE
|
||||||
|
UPDATE Monitors SET WeekEventDiskSpace=COALESCE(WeekEventDiskSpace,0)+diff WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Events_Month_delete_trigger//
|
||||||
|
CREATE TRIGGER Events_Month_delete_trigger BEFORE DELETE ON Events_Month
|
||||||
|
FOR EACH ROW BEGIN
|
||||||
|
UPDATE Monitors SET
|
||||||
|
MonthEvents = COALESCE(MonthEvents,1)-1,
|
||||||
|
MonthEventDiskSpace=COALESCE(MonthEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Events_Month_update_trigger;
|
||||||
|
CREATE TRIGGER Events_Month_update_trigger AFTER UPDATE ON Events_Month
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
declare diff BIGINT default 0;
|
||||||
|
|
||||||
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
|
IF ( diff ) THEN
|
||||||
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
|
UPDATE Monitors SET MonthEventDiskSpace=COALESCE(MonthEventDiskSpace,0)-COALESCE(OLD.DiskSpace) WHERE Monitors.Id=OLD.MonitorId;
|
||||||
|
UPDATE Monitors SET MonthEventDiskSpace=COALESCE(MonthEventDiskSpace,0)+COALESCE(NEW.DiskSpace) WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
ELSE
|
||||||
|
UPDATE Monitors SET MonthEventDiskSpace=COALESCE(MonthEventDiskSpace,0)+diff WHERE Monitors.Id=NEW.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
drop procedure if exists update_storage_stats//
|
||||||
|
|
||||||
|
drop trigger if exists event_update_trigger//
|
||||||
|
|
||||||
|
CREATE TRIGGER event_update_trigger AFTER UPDATE ON Events
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
declare diff BIGINT default 0;
|
||||||
|
|
||||||
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
|
IF ( NEW.StorageId = OLD.StorageID ) THEN
|
||||||
|
IF ( diff ) THEN
|
||||||
|
UPDATE Storage SET DiskSpace = COALESCE(DiskSpace,0) + diff WHERE Id = OLD.StorageId;
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
IF ( NEW.DiskSpace ) THEN
|
||||||
|
UPDATE Storage SET DiskSpace = COALESCE(DiskSpace,0) + NEW.DiskSpace WHERE Id = NEW.StorageId;
|
||||||
|
END IF;
|
||||||
|
IF ( OLD.DiskSpace ) THEN
|
||||||
|
UPDATE Storage SET DiskSpace = COALESCE(DiskSpace,0) - OLD.DiskSpace WHERE Id = OLD.StorageId;
|
||||||
|
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 = COALESCE(ArchivedEvents,0)+1, ArchivedEventDiskSpace = COALESCE(ArchivedEventDiskSpace,0) + COALESCE(NEW.DiskSpace,0) WHERE Id=NEW.MonitorId;
|
||||||
|
ELSEIF ( OLD.Archived ) THEN
|
||||||
|
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
||||||
|
UPDATE Monitors SET ArchivedEvents = COALESCE(ArchivedEvents,0)-1, ArchivedEventDiskSpace = COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) 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 = COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + COALESCE(NEW.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
ELSEIF ( NEW.Archived AND diff ) THEN
|
||||||
|
UPDATE Events_Archived SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF ( diff ) THEN
|
||||||
|
UPDATE Monitors SET TotalEventDiskSpace = COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + COALESCE(NEW.DiskSpace,0) WHERE Id=OLD.MonitorId;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
delimiter ;
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS event_insert_trigger;
|
||||||
|
|
||||||
|
delimiter //
|
||||||
|
/* The assumption is that when an Event is inserted, it has no size yet, so don't bother updating the DiskSpace, just the count.
|
||||||
|
* The DiskSpace will get update in the Event Update Trigger
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
UPDATE Monitors SET
|
||||||
|
HourEvents = COALESCE(HourEvents,0)+1,
|
||||||
|
DayEvents = COALESCE(DayEvents,0)+1,
|
||||||
|
WeekEvents = COALESCE(WeekEvents,0)+1,
|
||||||
|
MonthEvents = COALESCE(MonthEvents,0)+1,
|
||||||
|
TotalEvents = COALESCE(TotalEvents,0)+1
|
||||||
|
WHERE Id=NEW.MonitorId;
|
||||||
|
END;
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS event_delete_trigger//
|
||||||
|
|
||||||
|
CREATE TRIGGER event_delete_trigger BEFORE DELETE ON Events
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF ( OLD.DiskSpace ) THEN
|
||||||
|
UPDATE Storage SET DiskSpace = COALESCE(DiskSpace,0) - CAST(OLD.DiskSpace AS SIGNED) WHERE Id = OLD.StorageId;
|
||||||
|
END IF;
|
||||||
|
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 = COALESCE(ArchivedEvents,1) - 1,
|
||||||
|
ArchivedEventDiskSpace = COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),
|
||||||
|
TotalEvents = COALESCE(TotalEvents,1) - 1,
|
||||||
|
TotalEventDiskSpace = COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
ELSE
|
||||||
|
UPDATE Monitors SET
|
||||||
|
TotalEvents = COALESCE(TotalEvents,1)-1,
|
||||||
|
TotalEventDiskSpace=COALESCE(TotalEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0)
|
||||||
|
WHERE Id=OLD.MonitorId;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS Zone_Insert_Trigger//
|
||||||
|
CREATE TRIGGER Zone_Insert_Trigger AFTER INSERT ON Zones
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE Monitors SET ZoneCount=(SELECT COUNT(*) FROM Zones WHERE MonitorId=NEW.MonitorId) WHERE Id=NEW.MonitorID;
|
||||||
|
END
|
||||||
|
//
|
||||||
|
DROP TRIGGER IF EXISTS Zone_Delete_Trigger//
|
||||||
|
CREATE TRIGGER Zone_Delete_Trigger AFTER DELETE ON Zones
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE Monitors SET ZoneCount=(SELECT COUNT(*) FROM Zones WHERE MonitorId=OLD.MonitorId) WHERE Id=OLD.MonitorID;
|
||||||
|
END
|
||||||
|
//
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
REPLACE INTO Events_Day SELECT Id,MonitorId,StartTime,DiskSpace FROM Events WHERE StartTime > DATE_SUB(NOW(), INTERVAL 1 day);
|
||||||
|
REPLACE INTO Events_Week SELECT Id,MonitorId,StartTime,DiskSpace FROM Events WHERE StartTime > DATE_SUB(NOW(), INTERVAL 1 week);
|
||||||
|
REPLACE INTO Events_Month SELECT Id,MonitorId,StartTime,DiskSpace FROM Events WHERE StartTime > DATE_SUB(NOW(), INTERVAL 1 month);
|
||||||
|
REPLACE INTO Events_Archived SELECT Id,MonitorId,DiskSpace FROM Events WHERE Archived=1;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Add some additional monitor preset values
|
-- Add Protocol column to Storage
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO MonitorPresets VALUES (NULL,'D-link DCS-930L, 640x480, mjpeg','Remote','http',0,0,'http','simple','<ip-address>',80,'/mjpeg.cgi',NULL,640,480,3,NULL,0,NULL,NULL,NULL,100,100);
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'Protocol'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column Protocol already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `Protocol` TEXT AFTER `Id`"
|
||||||
|
));
|
||||||
|
|
||||||
ALTER TABLE Monitors DROP COLUMN DefaultView;
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Add PathToIndex column to Storage
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'PathToIndex'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column PathToIndex already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `PathToIndex` TEXT AFTER `Hostname`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Add PathToZMS column to Storage
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'PathToZMS'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column PathToZMS already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `PathToZMS` TEXT AFTER `PathToIndex`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Add PathToApi column to Storage
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'PathToApi'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column PathToApi already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `PathToApi` TEXT AFTER `PathToZMS`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Add Port column to Storage
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Servers'
|
||||||
|
AND column_name = 'Port'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column Port already exists in Servers'",
|
||||||
|
"ALTER TABLE Servers ADD `Port` INTEGER UNSIGNED AFTER `Hostname`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
# CMakeLists.txt for the Redhat Target Distros.
|
# CMakeLists.txt for the Redhat Target Distros.
|
||||||
|
|
||||||
|
#
|
||||||
|
# General strategy is to configure and install all files specific to Apache and Nginx
|
||||||
|
# Then let the rpm specfile sort them into the appropriate sub-package
|
||||||
|
#
|
||||||
|
|
||||||
# Display a message to show the RHEL build options are being processed.
|
# Display a message to show the RHEL build options are being processed.
|
||||||
if(ZM_TARGET_DISTRO MATCHES "^el")
|
if(ZM_TARGET_DISTRO MATCHES "^el")
|
||||||
message([STATUS] "Starting RHEL Build Options" ...)
|
message([STATUS] "Starting RHEL Build Options" ...)
|
||||||
|
@ -9,33 +14,39 @@ else(ZM_TARGET_DISTRO MATCHES "^el")
|
||||||
message([WARNING] "Unknown Build Option Detected" ...)
|
message([WARNING] "Unknown Build Option Detected" ...)
|
||||||
endif(ZM_TARGET_DISTRO MATCHES "^el")
|
endif(ZM_TARGET_DISTRO MATCHES "^el")
|
||||||
|
|
||||||
if((NOT ZM_TARGET_DISTRO MATCHES "^fc") AND (ZM_WEB_USER STREQUAL "nginx"))
|
#
|
||||||
message([FATAL_ERROR] "Experimental Nginx support is currently only supported on Fedora" ...)
|
# CONFIGURE STAGE
|
||||||
endif((NOT ZM_TARGET_DISTRO MATCHES "^fc") AND (ZM_WEB_USER STREQUAL "nginx"))
|
#
|
||||||
|
|
||||||
# Configure the zoneminder service files
|
# Configure the common zoneminder files
|
||||||
configure_file(systemd/zoneminder.logrotate.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.logrotate @ONLY)
|
configure_file(common/zoneminder.logrotate.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.logrotate @ONLY)
|
||||||
if(ZM_WEB_USER STREQUAL "nginx")
|
configure_file(common/zoneminder.service.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.service @ONLY)
|
||||||
configure_file(nginx/zoneminder.service.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.service @ONLY)
|
|
||||||
configure_file(nginx/zoneminder.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.conf @ONLY)
|
|
||||||
configure_file(nginx/zoneminder.tmpfiles.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.tmpfiles @ONLY)
|
|
||||||
configure_file(nginx/zoneminder.php-fpm.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.php-fpm.conf @ONLY)
|
|
||||||
configure_file(nginx/README.Fedora ${CMAKE_CURRENT_SOURCE_DIR}/readme/README COPYONLY)
|
|
||||||
else(ZM_WEB_USER STREQUAL "nginx")
|
|
||||||
configure_file(systemd/zoneminder.service.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.service @ONLY)
|
|
||||||
configure_file(apache/zoneminder.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.conf @ONLY)
|
|
||||||
configure_file(systemd/zoneminder.tmpfiles.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.tmpfiles @ONLY)
|
|
||||||
if( ZM_TARGET_DISTRO MATCHES "^fc")
|
|
||||||
configure_file(readme/README.Fedora ${CMAKE_CURRENT_SOURCE_DIR}/readme/README COPYONLY)
|
|
||||||
else( ZM_TARGET_DISTRO MATCHES "^fc")
|
|
||||||
configure_file(readme/README.Redhat7 ${CMAKE_CURRENT_SOURCE_DIR}/readme/README COPYONLY)
|
|
||||||
endif( ZM_TARGET_DISTRO MATCHES "^fc")
|
|
||||||
endif(ZM_WEB_USER STREQUAL "nginx")
|
|
||||||
|
|
||||||
# Create several empty folders
|
|
||||||
file(MAKE_DIRECTORY sock swap zoneminder zoneminder-upload events images temp)
|
file(MAKE_DIRECTORY sock swap zoneminder zoneminder-upload events images temp)
|
||||||
|
|
||||||
# Install the empty folders
|
# Configure the Apache zoneminder files
|
||||||
|
configure_file(httpd/zm-httpd.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/zm-httpd.conf @ONLY)
|
||||||
|
configure_file(httpd/zoneminder.httpd.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.httpd.conf @ONLY)
|
||||||
|
configure_file(httpd/zoneminder.httpd.tmpfiles.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.httpd.tmpfiles.conf @ONLY)
|
||||||
|
configure_file(httpd/com.zoneminder.systemctl.rules.httpd.in ${CMAKE_CURRENT_SOURCE_DIR}/com.zoneminder.systemctl.rules.httpd @ONLY)
|
||||||
|
|
||||||
|
# Configure the Nginx zoneminder files
|
||||||
|
configure_file(nginx/zm-nginx.conf ${CMAKE_CURRENT_SOURCE_DIR}/zm-nginx.conf COPYONLY)
|
||||||
|
configure_file(nginx/zoneminder.nginx.conf.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.nginx.conf @ONLY)
|
||||||
|
configure_file(nginx/redirect.nginx.conf ${CMAKE_CURRENT_SOURCE_DIR}/redirect.nginx.conf COPYONLY)
|
||||||
|
configure_file(nginx/zoneminder.nginx.tmpfiles.in ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.nginx.tmpfiles.conf @ONLY)
|
||||||
|
configure_file(nginx/zm-web-user.conf ${CMAKE_CURRENT_SOURCE_DIR}/zm-web-user.conf COPYONLY)
|
||||||
|
configure_file(nginx/zoneminder.php-fpm.conf ${CMAKE_CURRENT_SOURCE_DIR}/zoneminder.php-fpm.conf COPYONLY)
|
||||||
|
configure_file(nginx/com.zoneminder.systemctl.rules.nginx ${CMAKE_CURRENT_SOURCE_DIR}/com.zoneminder.systemctl.rules.nginx COPYONLY)
|
||||||
|
|
||||||
|
#
|
||||||
|
# INSTALLATION STAGE
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# Install the common zoneminder files
|
||||||
|
install(FILES zoneminder.logrotate DESTINATION /etc/logrotate.d RENAME zoneminder PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zoneminder.service DESTINATION /usr/lib/systemd/system PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
|
||||||
install(DIRECTORY sock swap DESTINATION /var/lib/zoneminder DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(DIRECTORY sock swap DESTINATION /var/lib/zoneminder DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
install(DIRECTORY zoneminder DESTINATION /var/log DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(DIRECTORY zoneminder DESTINATION /var/log DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
install(DIRECTORY zoneminder DESTINATION /var/run DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(DIRECTORY zoneminder DESTINATION /var/run DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
|
@ -43,6 +54,23 @@ install(DIRECTORY zoneminder DESTINATION /var/cache DIRECTORY_PERMISSIONS OWNER_
|
||||||
install(DIRECTORY zoneminder-upload DESTINATION /var/spool DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(DIRECTORY zoneminder-upload DESTINATION /var/spool DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
install(DIRECTORY events images temp DESTINATION /var/lib/zoneminder DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(DIRECTORY events images temp DESTINATION /var/lib/zoneminder DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
|
|
||||||
|
# Install the Apache zoneminder files
|
||||||
|
install(FILES zm-httpd.conf DESTINATION /usr/lib/systemd/system/zoneminder.service.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zoneminder.httpd.conf DESTINATION /etc/zm/www PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zoneminder.httpd.tmpfiles.conf DESTINATION /usr/lib/tmpfiles.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES com.zoneminder.systemctl.rules.httpd DESTINATION /etc/zm/www PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
|
||||||
|
# Install the Nginx zoneminder files
|
||||||
|
install(FILES zm-nginx.conf DESTINATION /usr/lib/systemd/system/zoneminder.service.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zoneminder.nginx.conf DESTINATION /etc/zm/www PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES redirect.nginx.conf DESTINATION /etc/zm/www PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zoneminder.nginx.tmpfiles.conf DESTINATION /usr/lib/tmpfiles.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES com.zoneminder.systemctl.rules.nginx DESTINATION /etc/zm/www PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zm-web-user.conf DESTINATION /etc/zm/conf.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
install(FILES zoneminder.php-fpm.conf DESTINATION /etc/php-fpm.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
|
||||||
|
# Miscellaneous
|
||||||
|
|
||||||
# Symlink the cake php temp folder to the ZoneMinder temp folder
|
# Symlink the cake php temp folder to the ZoneMinder temp folder
|
||||||
install(CODE "execute_process(COMMAND ln -sf ../../../../../../var/lib/zoneminder/temp \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/api/app/tmp\")")
|
install(CODE "execute_process(COMMAND ln -sf ../../../../../../var/lib/zoneminder/temp \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/api/app/tmp\")")
|
||||||
|
|
||||||
|
@ -50,16 +78,5 @@ install(CODE "execute_process(COMMAND ln -sf ../../../../../../var/lib/zoneminde
|
||||||
install(CODE "execute_process(COMMAND ln -sf ../../java/cambozola.jar \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/cambozola.jar\")")
|
install(CODE "execute_process(COMMAND ln -sf ../../java/cambozola.jar \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/cambozola.jar\")")
|
||||||
|
|
||||||
# Install auxiliary files
|
# Install auxiliary files
|
||||||
install(FILES misc/redalert.wav DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/sounds PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(FILES common/redalert.wav DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/sounds PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
|
|
||||||
# Install zoneminder service files
|
|
||||||
install(FILES zoneminder.logrotate DESTINATION /etc/logrotate.d RENAME zoneminder PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
|
||||||
install(FILES zoneminder.conf DESTINATION /etc/zm/www PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
|
||||||
|
|
||||||
if(ZM_WEB_USER STREQUAL "nginx")
|
|
||||||
install(FILES zoneminder.php-fpm.conf DESTINATION /etc/php-fpm.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ RENAME zoneminder.conf)
|
|
||||||
endif(ZM_WEB_USER STREQUAL "nginx")
|
|
||||||
|
|
||||||
install(FILES zoneminder.service DESTINATION /usr/lib/systemd/system PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
|
||||||
install(FILES zoneminder.tmpfiles DESTINATION /usr/lib/tmpfiles.d RENAME zoneminder.conf PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
@ZM_LOGDIR@/*.log {
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
sharedscripts
|
||||||
|
delaycompress
|
||||||
|
compress
|
||||||
|
postrotate
|
||||||
|
@BINDIR@/zmpkg.pl logrot > /dev/null 2>/dev/null || true
|
||||||
|
endscript
|
||||||
|
daily
|
||||||
|
rotate 7
|
||||||
|
}
|
|
@ -1,13 +1,12 @@
|
||||||
# ZoneMinder systemd unit file for RedHat distros and clones
|
# ZoneMinder systemd unit file for RedHat distros and clones
|
||||||
|
# See drop-in folder for additional config directives
|
||||||
|
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=ZoneMinder CCTV recording and security system
|
Description=ZoneMinder CCTV recording and security system
|
||||||
After=network.target mariadb.service httpd.service
|
After=network.target mariadb.service
|
||||||
Requires=mariadb.service httpd.service
|
Requires=mariadb.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
User=@WEB_USER@
|
|
||||||
Group=@WEB_GROUP@
|
|
||||||
Type=forking
|
Type=forking
|
||||||
ExecStart=@BINDIR@/zmpkg.pl start
|
ExecStart=@BINDIR@/zmpkg.pl start
|
||||||
ExecReload=@BINDIR@/zmpkg.pl restart
|
ExecReload=@BINDIR@/zmpkg.pl restart
|
|
@ -0,0 +1,7 @@
|
||||||
|
polkit.addRule(function(action, subject) {
|
||||||
|
if (action.id == "com.zoneminder.policykit.pkexec.run-zmsystemctl" &&
|
||||||
|
subject.user != "@WEB_USER@") {
|
||||||
|
return polkit.Result.NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Additional config directives for ZoneMinder with Apache web server
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
After=httpd.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=@WEB_USER@
|
||||||
|
Group=@WEB_GROUP@
|
|
@ -3,3 +3,4 @@ D @ZM_SOCKDIR@ 0755 @WEB_USER@ @WEB_GROUP@
|
||||||
D @ZM_CACHEDIR@ 0755 @WEB_USER@ @WEB_GROUP@
|
D @ZM_CACHEDIR@ 0755 @WEB_USER@ @WEB_GROUP@
|
||||||
d @ZM_DIR_EVENTS@ 0755 @WEB_USER@ @WEB_GROUP@
|
d @ZM_DIR_EVENTS@ 0755 @WEB_USER@ @WEB_GROUP@
|
||||||
D @ZM_DIR_IMAGES@ 0755 @WEB_USER@ @WEB_GROUP@
|
D @ZM_DIR_IMAGES@ 0755 @WEB_USER@ @WEB_GROUP@
|
||||||
|
|
|
@ -1,125 +0,0 @@
|
||||||
module local_zoneminder 1.2;
|
|
||||||
|
|
||||||
require {
|
|
||||||
type afs_ka_port_t;
|
|
||||||
type netsupport_port_t;
|
|
||||||
type port_t;
|
|
||||||
type presence_port_t;
|
|
||||||
type postfix_master_t;
|
|
||||||
type postfix_qmgr_t;
|
|
||||||
type postfix_pickup_t;
|
|
||||||
type httpd_t;
|
|
||||||
type var_lib_t;
|
|
||||||
type ionixnetmon_port_t;
|
|
||||||
type glance_port_t;
|
|
||||||
type mmcc_port_t;
|
|
||||||
type postfix_master_t;
|
|
||||||
type commplex_port_t;
|
|
||||||
type syslogd_port_t;
|
|
||||||
type dcc_port_t;
|
|
||||||
type sip_port_t;
|
|
||||||
type amqp_port_t;
|
|
||||||
type condor_port_t;
|
|
||||||
type afs_fs_port_t;
|
|
||||||
type nodejs_debug_port_t;
|
|
||||||
type httpd_var_lib_t;
|
|
||||||
type websm_port_t;
|
|
||||||
type afs_pt_port_t;
|
|
||||||
type postfix_qmgr_t;
|
|
||||||
type git_port_t;
|
|
||||||
type ipp_port_t;
|
|
||||||
type aol_port_t;
|
|
||||||
type unconfined_t;
|
|
||||||
type kernel_t;
|
|
||||||
type init_t;
|
|
||||||
type auditd_t;
|
|
||||||
type mysqld_t;
|
|
||||||
type httpd_log_t;
|
|
||||||
type syslogd_t;
|
|
||||||
type httpd_t;
|
|
||||||
type initrc_state_t;
|
|
||||||
type initrc_t;
|
|
||||||
type var_lib_t;
|
|
||||||
type udev_t;
|
|
||||||
type mysqld_safe_t;
|
|
||||||
type sshd_t;
|
|
||||||
type crond_t;
|
|
||||||
type getty_t;
|
|
||||||
type httpd_var_lib_t;
|
|
||||||
type initrc_var_run_t;
|
|
||||||
type tmpfs_t;
|
|
||||||
type dhcpc_t;
|
|
||||||
type v4l_device_t;
|
|
||||||
type file_t;
|
|
||||||
class sock_file { write create unlink };
|
|
||||||
class unix_stream_socket { read connectto };
|
|
||||||
class lnk_file { write create getattr read lock unlink };
|
|
||||||
class dir {search getattr };
|
|
||||||
class udp_socket name_bind;
|
|
||||||
class file { write getattr read lock unlink open };
|
|
||||||
class shm { unix_read unix_write associate read write getattr };
|
|
||||||
class chr_file getattr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#============= httpd_t ==============
|
|
||||||
allow httpd_t auditd_t:dir { search getattr };
|
|
||||||
allow httpd_t auditd_t:file { read getattr open };
|
|
||||||
allow httpd_t crond_t:dir { search getattr };
|
|
||||||
allow httpd_t crond_t:file { read getattr open };
|
|
||||||
allow httpd_t dhcpc_t:dir { search getattr };
|
|
||||||
allow httpd_t dhcpc_t:file { read getattr open };
|
|
||||||
allow httpd_t getty_t:dir { search getattr };
|
|
||||||
allow httpd_t getty_t:file { read getattr open };
|
|
||||||
allow httpd_t httpd_log_t:file write;
|
|
||||||
allow httpd_t httpd_var_lib_t:lnk_file { write getattr read lock unlink };
|
|
||||||
allow httpd_t init_t:dir { search getattr };
|
|
||||||
allow httpd_t init_t:file { read getattr open };
|
|
||||||
#!!!! The source type 'httpd_t' can write to a 'file' of the following types:
|
|
||||||
#squirrelmail_spool_t, mirrormanager_var_run_t, dirsrvadmin_config_t, httpd_lock_t, httpd_tmp_t, dirsrv_config_t, dirsrvadmin_tmp_t, httpd_cache_t, httpd_tmpfs_t, httpd_squirrelmail_t, dirsrv_var_run_t, dirsrv_var_log_t, httpd_var_lib_t, httpd_var_run_t, zarafa_var_lib_t, httpd_prewikka_rw_content_t, httpd_mediawiki_rw_content_t, httpd_squid_rw_content_t, passenger_var_run_t, httpd_smokeping_cgi_rw_content_t, httpd_openshift_rw_content_t, httpd_dirsrvadmin_rw_content_t, httpd_w3c_validator_rw_content_t, httpd_collectd_rw_content_t, cluster_var_lib_t, cluster_var_run_t, httpd_user_rw_content_t, httpd_awstats_rw_content_t, httpdcontent, root_t, httpd_cobbler_rw_content_t, httpd_munin_rw_content_t, cluster_conf_t, httpd_bugzilla_rw_content_t, passenger_tmp_t, httpd_cvs_rw_content_t, httpd_git_rw_content_t, httpd_sys_rw_content_t, httpd_sys_rw_content_t, httpd_nagios_rw_content_t, httpd_apcupsd_cgi_rw_content_t, httpd_nutups_cgi_rw_content_t, httpd_dspam_rw_content_t
|
|
||||||
|
|
||||||
allow httpd_t initrc_state_t:file { read write getattr unlink open };
|
|
||||||
allow httpd_t initrc_t:unix_stream_socket connectto;
|
|
||||||
allow httpd_t initrc_t:shm { unix_read unix_write associate read write getattr };
|
|
||||||
allow httpd_t initrc_var_run_t:file { write read lock open };
|
|
||||||
allow httpd_t kernel_t:dir { search getattr };
|
|
||||||
allow httpd_t kernel_t:file { read getattr open };
|
|
||||||
allow httpd_t mysqld_safe_t:dir { search getattr };
|
|
||||||
allow httpd_t mysqld_safe_t:file { read getattr open };
|
|
||||||
allow httpd_t mysqld_t:dir { search getattr };
|
|
||||||
allow httpd_t mysqld_t:file { read getattr open };
|
|
||||||
allow httpd_t sshd_t:dir { search getattr };
|
|
||||||
allow httpd_t sshd_t:file { read getattr open };
|
|
||||||
allow httpd_t syslogd_t:dir { search getattr };
|
|
||||||
allow httpd_t syslogd_t:file { read getattr open };
|
|
||||||
allow httpd_t tmpfs_t:sock_file write;
|
|
||||||
allow httpd_t udev_t:dir { search getattr };
|
|
||||||
allow httpd_t udev_t:file { read getattr open };
|
|
||||||
allow httpd_t unconfined_t:dir { search getattr };
|
|
||||||
allow httpd_t unconfined_t:file { read getattr open };
|
|
||||||
allow httpd_t var_lib_t:lnk_file { write getattr read lock unlink };
|
|
||||||
allow httpd_t var_lib_t:sock_file { write unlink };
|
|
||||||
allow httpd_t v4l_device_t:chr_file getattr;
|
|
||||||
allow httpd_t afs_fs_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t afs_ka_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t afs_pt_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t amqp_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t aol_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t commplex_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t condor_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t dcc_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t git_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t glance_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t httpd_var_lib_t:lnk_file create;
|
|
||||||
allow httpd_t ionixnetmon_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t ipp_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t mmcc_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t netsupport_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t nodejs_debug_port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t port_t:udp_socket name_bind;
|
|
||||||
allow httpd_t postfix_master_t:dir { search getattr };
|
|
||||||
allow httpd_t postfix_master_t:file { read getattr open };
|
|
||||||
allow httpd_t postfix_pickup_t:dir { search getattr };
|
|
||||||
allow httpd_t postfix_pickup_t:file { read getattr open };
|
|
||||||
allow httpd_t postfix_qmgr_t:dir { search getattr };
|
|
||||||
allow httpd_t postfix_qmgr_t:file { read getattr open };
|
|
||||||
allow httpd_t presence_port_t:udp_socket name_bind;
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
polkit.addRule(function(action, subject) {
|
||||||
|
if (action.id == "com.zoneminder.policykit.pkexec.run-zmsystemctl" &&
|
||||||
|
subject.user != "nginx") {
|
||||||
|
return polkit.Result.NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Auto redirect to https
|
||||||
|
return 301 https://$host$request_uri;
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Additional config directives for ZoneMinder with Nginx web server
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
After=nginx.service php-fpm.service fcgiwrap.service
|
||||||
|
Requires=php-fpm.service fcgiwrap@nginx.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=nginx
|
||||||
|
Group=nginx
|
|
@ -0,0 +1,3 @@
|
||||||
|
ZM_WEB_USER=nginx
|
||||||
|
ZM_WEB_GROUP=nginx
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
listen 443 ssl;
|
|
||||||
listen [::]:443 ssl;
|
|
||||||
|
|
||||||
ssl_certificate "/etc/pki/tls/certs/localhost.crt";
|
|
||||||
ssl_certificate_key "/etc/pki/tls/private/localhost.key";
|
|
||||||
ssl_session_cache shared:SSL:1m;
|
|
||||||
ssl_session_timeout 10m;
|
|
||||||
ssl_ciphers PROFILE=SYSTEM;
|
|
||||||
ssl_prefer_server_ciphers on;
|
|
||||||
|
|
||||||
# Auto-redirect HTTP requests to HTTPS
|
|
||||||
if ($scheme != "https") {
|
|
||||||
rewrite ^/?(zm)(.*)$ https://$host/$1$2 permanent;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /cgi-bin-zm {
|
|
||||||
gzip off;
|
|
||||||
alias "@ZM_CGIDIR@";
|
|
||||||
|
|
||||||
include /etc/nginx/fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
|
||||||
fastcgi_pass unix:/run/fcgiwrap.sock;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /zm/cache {
|
|
||||||
alias "@ZM_CACHEDIR@";
|
|
||||||
}
|
|
||||||
|
|
||||||
location /zm {
|
|
||||||
gzip off;
|
|
||||||
alias "@ZM_WEBDIR@";
|
|
||||||
index index.php;
|
|
||||||
|
|
||||||
location ~ \.php$ {
|
|
||||||
if (!-f $request_filename) { return 404; }
|
|
||||||
expires epoch;
|
|
||||||
include /etc/nginx/fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
fastcgi_pass unix:/run/php-fpm/www.sock;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.(jpg|jpeg|gif|png|ico)$ {
|
|
||||||
access_log off;
|
|
||||||
expires 33d;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /zm/api/ {
|
|
||||||
alias "@ZM_WEBDIR@";
|
|
||||||
rewrite ^/zm/api(.+)$ /zm/api/index.php?p=$1 last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
server {
|
||||||
|
listen 443 ssl default_server;
|
||||||
|
listen [::]:443 ssl default_server;
|
||||||
|
server_name = localhost $hostname;
|
||||||
|
|
||||||
|
ssl_certificate "/etc/pki/tls/certs/localhost.crt";
|
||||||
|
ssl_certificate_key "/etc/pki/tls/private/localhost.key";
|
||||||
|
ssl_session_cache shared:SSL:1m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
ssl_ciphers PROFILE=SYSTEM;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
# Auto redirect to server/zm when no url suffix was given
|
||||||
|
location = / {
|
||||||
|
return 301 zm;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /cgi-bin-zm {
|
||||||
|
gzip off;
|
||||||
|
alias "@ZM_CGIDIR@";
|
||||||
|
|
||||||
|
include /etc/nginx/fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||||
|
fastcgi_pass unix:/run/fcgiwrap.sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zm/cache {
|
||||||
|
alias "@ZM_CACHEDIR@";
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zm {
|
||||||
|
gzip off;
|
||||||
|
alias "@ZM_WEBDIR@";
|
||||||
|
index index.php;
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
expires epoch;
|
||||||
|
include /etc/nginx/fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_pass unix:/run/php-fpm/www.sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.(jpg|jpeg|gif|png|ico)$ {
|
||||||
|
access_log off;
|
||||||
|
expires 33d;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zm/api/ {
|
||||||
|
alias "@ZM_WEBDIR@";
|
||||||
|
rewrite ^/zm/api(.+)$ /zm/api/app/webroot/index.php?p=$1 last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
D @ZM_TMPDIR@ 0755 nginx nginx
|
||||||
|
D @ZM_SOCKDIR@ 0755 nginx nginx
|
||||||
|
D @ZM_CACHEDIR@ 0755 nginx nginx
|
||||||
|
d @ZM_DIR_EVENTS@ 0755 nginx nginx
|
||||||
|
D @ZM_DIR_IMAGES@ 0755 nginx nginx
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
; This config file is needed when using ZoneMinder with web servers other
|
||||||
|
; than Apache. You can ignore this file if you are using Apache web server.
|
||||||
; Change the user and group of the default pool to the web server account
|
; Change the user and group of the default pool to the web server account
|
||||||
[www]
|
[www]
|
||||||
|
|
||||||
user = @WEB_USER@
|
user = nginx
|
||||||
group = @WEB_GROUP@
|
group = nginx
|
||||||
|
|
||||||
; These parameters are typically a tradoff between performance and memory
|
; These parameters are typically a tradoff between performance and memory
|
||||||
; consumption. See the contents of www.conf for details.
|
; consumption. See the contents of www.conf for details.
|
|
@ -1,22 +0,0 @@
|
||||||
# ZoneMinder systemd unit file for Fedora
|
|
||||||
# Replace mariadb with community-mysql if using mysql service instead of mariadb
|
|
||||||
|
|
||||||
[Unit]
|
|
||||||
Description=ZoneMinder CCTV recording and security system
|
|
||||||
After=network.target mariadb.service nginx.service php-fpm.service fcgiwrap.service
|
|
||||||
Requires=mariadb.service nginx.service php-fpm.service fcgiwrap.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
User=@WEB_USER@
|
|
||||||
Group=@WEB_GROUP@
|
|
||||||
Type=forking
|
|
||||||
ExecStart=@BINDIR@/zmpkg.pl start
|
|
||||||
ExecReload=@BINDIR@/zmpkg.pl restart
|
|
||||||
ExecStop=@BINDIR@/zmpkg.pl stop
|
|
||||||
PIDFile=@ZM_RUNDIR@/zm.pid
|
|
||||||
Environment=TZ=/etc/localtime
|
|
||||||
RuntimeDirectory=zoneminder
|
|
||||||
RuntimeDirectoryMode=0755
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
|
@ -1,8 +0,0 @@
|
||||||
D @ZM_TMPDIR@ 0755 @WEB_USER@ @WEB_GROUP@
|
|
||||||
D @ZM_SOCKDIR@ 0755 @WEB_USER@ @WEB_GROUP@
|
|
||||||
D @ZM_CACHEDIR@ 0755 @WEB_USER@ @WEB_GROUP@
|
|
||||||
d @ZM_DIR_EVENTS@ 0755 @WEB_USER@ @WEB_GROUP@
|
|
||||||
D @ZM_DIR_IMAGES@ 0755 @WEB_USER@ @WEB_GROUP@
|
|
||||||
D /var/lib/php/session 770 root @WEB_GROUP@
|
|
||||||
D /var/lib/php/wsdlcache 770 root @WEB_GROUP@
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
What's New
|
||||||
|
==========
|
||||||
|
|
||||||
|
1. See the ZoneMinder release notes for a list of new features:
|
||||||
|
https://github.com/ZoneMinder/zoneminder/releases
|
||||||
|
|
||||||
|
2. The contents of the ZoneMinder Apache config file have changed. In
|
||||||
|
addition, this ZoneMinder package now requires you to manually symlink the
|
||||||
|
ZoneMinder Apache config file. See new install step 6 and upgrade step 3
|
||||||
|
in the appropriate README for details.
|
||||||
|
|
||||||
|
3. This package has been split into sub-packages to allow compatibility with
|
||||||
|
other web servers. Here is a breakdown of the available packages:
|
||||||
|
|
||||||
|
zoneminder - Meta-package installs zoneminder-common and zoneminder-httpd
|
||||||
|
This exists soley for backwards compatibility.
|
||||||
|
zoneminder-common - Common files that do not differ based on the web server
|
||||||
|
zoneminder-httpd - Files needed for compatibility with the Apache web server
|
||||||
|
zoneminder-nginx - Files needed for compatibility with the Nginx web server
|
||||||
|
|
||||||
|
You can switch between different subpackages with dnf/yum. Be advised that,
|
||||||
|
switching between httpd <-> nginx requires manaully changing ownership of
|
||||||
|
all event folders and the php session folder after the change.
|
||||||
|
|
||||||
|
4. If you have installed ZoneMinder from the FedBerry repositories, this build
|
||||||
|
of ZoneMinder has support for Raspberry Pi hardware acceleration when using
|
||||||
|
ffmpeg. Unforunately, there is a problem with the same hardware acceleration
|
||||||
|
when using libvlc. Consequently, libvlc support in this build of ZoneMinder
|
||||||
|
has been disabled until the problem is resolved. See the following bug
|
||||||
|
report for details: https://trac.videolan.org/vlc/ticket/18594
|
||||||
|
|
||||||
|
5. Continue on to the next README that corresponds to the chosen webserver:
|
||||||
|
|
||||||
|
README.httpd - Follow these steps when using Apache
|
||||||
|
README.nginx - Follow these steps when using Nginx
|
||||||
|
|
|
@ -1,175 +0,0 @@
|
||||||
What's New
|
|
||||||
==========
|
|
||||||
|
|
||||||
1. See the ZoneMinder release notes for a list of new features:
|
|
||||||
https://github.com/ZoneMinder/zoneminder/releases
|
|
||||||
|
|
||||||
2. The contents of the ZoneMinder Apache config file have changed. In
|
|
||||||
addition, this ZoneMinder package now requires you to manually symlink the
|
|
||||||
ZoneMinder Apache config file. See new install step 6 and upgrade step 3
|
|
||||||
below for details.
|
|
||||||
|
|
||||||
New installs
|
|
||||||
============
|
|
||||||
|
|
||||||
1. Unless you are already using MariaDB server, you need to ensure that the
|
|
||||||
server is configured to start during boot and properly secured by running:
|
|
||||||
|
|
||||||
sudo yum install mariadb-server
|
|
||||||
sudo systemctl enable mariadb
|
|
||||||
sudo systemctl start mariadb.service
|
|
||||||
mysql_secure_installation
|
|
||||||
|
|
||||||
2. Using the password for the root account set during the previous step, you
|
|
||||||
will need to create the ZoneMinder database and configure a database
|
|
||||||
account for ZoneMinder to use:
|
|
||||||
|
|
||||||
mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
|
|
||||||
mysql -uroot -p -e "grant all on zm.* to \
|
|
||||||
'zmuser'@localhost identified by 'zmpass';"
|
|
||||||
mysqladmin -uroot -p reload
|
|
||||||
|
|
||||||
The database account credentials, zmuser/zmpass, are arbitrary. Set them to
|
|
||||||
anything that suits your environment.
|
|
||||||
|
|
||||||
3. If you have chosen to change the zoneminder database account credentials to
|
|
||||||
something other than zmuser/zmpass, you must now create a config file under
|
|
||||||
/etc/zm/conf.d and set your credentials there. For example, create the file
|
|
||||||
/etc/zm/conf.d/zm-db-user.conf and add the following content to it:
|
|
||||||
|
|
||||||
ZM_DB_USER = {username of the sql account you want to use}
|
|
||||||
ZM_DB_PASS = {password of the sql account you want to use}
|
|
||||||
|
|
||||||
Once the file has been saved, set proper file & ownership permissions on it:
|
|
||||||
|
|
||||||
sudo chown root:apache *.conf
|
|
||||||
sudo chmod 640 *.conf
|
|
||||||
|
|
||||||
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
|
||||||
timezone. PHP will complain loudly if this is not set, or if it is set
|
|
||||||
incorrectly, and these complaints will show up in the zoneminder logging
|
|
||||||
system as errors.
|
|
||||||
|
|
||||||
If you are not sure of the proper timezone specification to use, look at
|
|
||||||
http://php.net/date.timezone
|
|
||||||
|
|
||||||
5. Disable SELinux
|
|
||||||
|
|
||||||
We currently do not have the resources to create and maintain an accurate
|
|
||||||
SELinux policy for ZoneMinder on CentOS 7. We will gladly accept pull
|
|
||||||
reqeusts from anyone who wishes to do the work. In the meantime, SELinux
|
|
||||||
will need to be disabled or put into permissive mode.
|
|
||||||
|
|
||||||
To immediately disbale SELinux for the current seesion, issue the following
|
|
||||||
from the command line:
|
|
||||||
|
|
||||||
sudo setenforce 0
|
|
||||||
|
|
||||||
To permanently disable SELinux, edit /etc/selinux/config and change the
|
|
||||||
SELINUX line from "enforcing" to "disabled". This change will take
|
|
||||||
effect after a reboot.
|
|
||||||
|
|
||||||
6. Configure the web server
|
|
||||||
|
|
||||||
This package uses the HTTPS protocol by default to access the web portal,
|
|
||||||
using the default self signed certificate on your system. Requests using
|
|
||||||
HTTP will auto-redirect to HTTPS.
|
|
||||||
|
|
||||||
Inspect the web server configuration file and verify it meets your needs:
|
|
||||||
|
|
||||||
/etc/zm/www/zoneminder.conf
|
|
||||||
|
|
||||||
If you are running other web enabled services then you may need to edit
|
|
||||||
this file to suite. See README.https to learn about other alternatives.
|
|
||||||
|
|
||||||
When in doubt, proceed with the default:
|
|
||||||
|
|
||||||
sudo ln -s /etc/zm/www/zoneminder.conf /etc/httpd/conf.d/
|
|
||||||
sudo yum install mod_ssl
|
|
||||||
|
|
||||||
7. Now start the web server:
|
|
||||||
|
|
||||||
sudo systemctl enable httpd
|
|
||||||
sudo systemctl start httpd
|
|
||||||
|
|
||||||
8. Now start zoneminder:
|
|
||||||
|
|
||||||
sudo systemctl enable zoneminder
|
|
||||||
sudo systemctl start zoneminder
|
|
||||||
|
|
||||||
9. Optionally configure the firewall
|
|
||||||
|
|
||||||
All Redhat distros ship with the firewall enabled. That means you will not
|
|
||||||
be able to access the ZoneMinder web console from a remote machine until
|
|
||||||
changes are made to the firewall.
|
|
||||||
|
|
||||||
What follows are a set of minimal commands to allow remote access to the
|
|
||||||
ZoneMinder web console and also allow ZoneMinder's ONVIF discovery to
|
|
||||||
work. The following commands do not put any restrictions on which remote
|
|
||||||
machine(s) have access to the listed ports or services.
|
|
||||||
|
|
||||||
sudo firewall-cmd --permanent --zone=public --add-service=http
|
|
||||||
sudo firewall-cmd --permanent --zone=public --add-service=https
|
|
||||||
sudo firewall-cmd --permanent --zone=public --add-port=3702/udp
|
|
||||||
sudo firewall-cmd --reload
|
|
||||||
|
|
||||||
Additional changes to the firewall may be required, depending on your
|
|
||||||
security requirements and how you use the system. It is up to you to verify
|
|
||||||
these commands are sufficient.
|
|
||||||
|
|
||||||
10. Access the ZoneMinder web console
|
|
||||||
|
|
||||||
You may now access the ZoneMinder web console from your web browser using
|
|
||||||
an appropriate url. Here are some examples:
|
|
||||||
|
|
||||||
http://localhost/zm (works from the local machine only)
|
|
||||||
http://{machine name}/zm (works only if dns is configured for your network)
|
|
||||||
http://{ip address}/zm
|
|
||||||
|
|
||||||
Upgrades
|
|
||||||
========
|
|
||||||
|
|
||||||
1. Conf.d folder support has been added to ZoneMinder. Any custom
|
|
||||||
changes previously made to zm.conf must now be made in one or more custom
|
|
||||||
config files, created under the conf.d folder. Do this now. See
|
|
||||||
/etc/zm/conf.d/README for details. Once you recreate any custom config changes
|
|
||||||
under the conf.d folder, they will remain in place indefinitely.
|
|
||||||
|
|
||||||
2. Verify permissions of the zmuser account.
|
|
||||||
|
|
||||||
Over time, the database account permissions required for normal operation
|
|
||||||
have increased. Verify the zmuser database account has been granted all
|
|
||||||
permission to the ZoneMinder database:
|
|
||||||
|
|
||||||
mysql -uroot -p -e "show grants for zmuser@localhost;"
|
|
||||||
|
|
||||||
See step 2 of the Installation section to add missing permissions.
|
|
||||||
|
|
||||||
3. Verify the ZoneMinder Apache configuration file in the folder
|
|
||||||
/etc/zm/www. You will have a file called "zoneminder.conf" and there
|
|
||||||
may also be a file called "zoneminder.conf.rpmnew". If an rpmnew file
|
|
||||||
exists, inspect it and merge anything new in that file with zoneminder.conf.
|
|
||||||
Verify the SSL REquirements meet your needs. Read README.https if necessary.
|
|
||||||
|
|
||||||
The contents of this file must be merged into your Apache configuration.
|
|
||||||
See step 6 of the installation section if you have not already done this
|
|
||||||
during a previous upgrade.
|
|
||||||
|
|
||||||
4. Upgrade the database before starting ZoneMinder.
|
|
||||||
|
|
||||||
Most upgrades can be performed by executing the following command:
|
|
||||||
|
|
||||||
sudo zmupdate.pl
|
|
||||||
|
|
||||||
Recent versions of ZoneMinder don't require any parameters added to the
|
|
||||||
zmupdate command. However, if ZoneMinder complains, you may need to call
|
|
||||||
zmupdate in the following manner:
|
|
||||||
|
|
||||||
sudo zmupdate.pl --user=root --pass=<mysql_root_pwd> --version=<from version>
|
|
||||||
|
|
||||||
5. Now restart the web server then start zoneminder:
|
|
||||||
|
|
||||||
sudo systemctl restart httpd
|
|
||||||
sudo systemctl start zoneminder
|
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,8 @@
|
||||||
What's New
|
|
||||||
==========
|
|
||||||
|
|
||||||
1. See the ZoneMinder release notes for a list of new features:
|
|
||||||
https://github.com/ZoneMinder/zoneminder/releases
|
|
||||||
|
|
||||||
2. The contents of the ZoneMinder Apache config file have changed. In
|
|
||||||
addition, this ZoneMinder package now requires you to manually symlink the
|
|
||||||
ZoneMinder Apache config file. See new install step 6 and upgrade step 3
|
|
||||||
below for details.
|
|
||||||
|
|
||||||
New installs
|
New installs
|
||||||
============
|
============
|
||||||
|
|
||||||
|
NOTE: EL7 users should replace "dnf" with "yum" in the instructions below.
|
||||||
|
|
||||||
1. Unless you are already using MariaDB server, you need to ensure that the
|
1. Unless you are already using MariaDB server, you need to ensure that the
|
||||||
server is configured to start during boot and properly secured by running:
|
server is configured to start during boot and properly secured by running:
|
||||||
|
|
||||||
|
@ -77,14 +68,14 @@ New installs
|
||||||
|
|
||||||
Inspect the web server configuration file and verify it meets your needs:
|
Inspect the web server configuration file and verify it meets your needs:
|
||||||
|
|
||||||
/etc/zm/www/zoneminder.conf
|
/etc/zm/www/zoneminder.httpd.conf
|
||||||
|
|
||||||
If you are running other web enabled services then you may need to edit
|
If you are running other web enabled services then you may need to edit
|
||||||
this file to suite. See README.https to learn about other alternatives.
|
this file to suite. See README.https to learn about other alternatives.
|
||||||
|
|
||||||
When in doubt, proceed with the default:
|
When in doubt, proceed with the default:
|
||||||
|
|
||||||
sudo ln -s /etc/zm/www/zoneminder.conf /etc/httpd/conf.d/
|
sudo ln -sf /etc/zm/www/zoneminder.httpd.conf /etc/httpd/conf.d/
|
||||||
sudo dnf install mod_ssl
|
sudo dnf install mod_ssl
|
||||||
|
|
||||||
7. Now start the web server:
|
7. Now start the web server:
|
||||||
|
@ -146,15 +137,23 @@ Upgrades
|
||||||
See step 2 of the Installation section to add missing permissions.
|
See step 2 of the Installation section to add missing permissions.
|
||||||
|
|
||||||
3. Verify the ZoneMinder Apache configuration file in the folder
|
3. Verify the ZoneMinder Apache configuration file in the folder
|
||||||
/etc/zm/www. You will have a file called "zoneminder.conf" and there
|
/etc/zm/www. You will have a file called "zoneminder.httpd.conf" and there
|
||||||
may also be a file called "zoneminder.conf.rpmnew". If the rpmnew file
|
may also be one or more files with "rpmnew" extenstion. If the rpmnew file
|
||||||
exists, inspect it and merge anything new in that file with zoneminder.conf.
|
exists, inspect it and merge anything new in that file with zoneminder.conf.
|
||||||
Verify the SSL REquirements meet your needs. Read README.https if necessary.
|
Verify the SSL Requirements meet your needs. Read README.https if necessary.
|
||||||
|
|
||||||
The contents of this file must be merged into your Apache configuration.
|
The contents of this file must be merged into your Apache configuration.
|
||||||
See step 6 of the installation section if you have not already done this
|
See step 6 of the installation section if you have not already done this
|
||||||
during a previous upgrade.
|
during a previous upgrade.
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
If this step is not performed correctly, the web console will appear
|
||||||
|
mostly empty and/or significantly corrupted post-upgrade.
|
||||||
|
=======
|
||||||
|
IMPORTANT: Failure to complete this step properly will result in a mostly
|
||||||
|
empty or significantly corrupted web console post-upgrade.
|
||||||
|
>>>>>>> 5b211d250910918782d20bf32b0e33a38a0df4dd
|
||||||
|
|
||||||
4. Upgrade the database before starting ZoneMinder.
|
4. Upgrade the database before starting ZoneMinder.
|
||||||
|
|
||||||
Most upgrades can be performed by executing the following command:
|
Most upgrades can be performed by executing the following command:
|
|
@ -20,7 +20,8 @@ experience.
|
||||||
to do this: https://wiki.centos.org/HowTos/Https . Additionally, Googling
|
to do this: https://wiki.centos.org/HowTos/Https . Additionally, Googling
|
||||||
"centos certificate" reveals many articles on the subject.
|
"centos certificate" reveals many articles on the subject.
|
||||||
|
|
||||||
3. You can turn off HTTPS entirely by simply commenting out the SSLRequireSSL
|
3. When using Apache, you can turn off HTTPS entirely by simply commenting
|
||||||
directives found in /etc/httpd/conf.d/zoneminder.conf. You should also
|
out the SSLRequireSSL directives found in
|
||||||
comment out the HTTP -> HTTPS Rewrite rule.
|
/etc/zm/www/zoneminder.apache.conf. You should also comment out the
|
||||||
|
HTTP -> HTTPS Rewrite rule.
|
||||||
|
|
||||||
|
|
|
@ -1,24 +1,3 @@
|
||||||
What's New
|
|
||||||
==========
|
|
||||||
|
|
||||||
1. See the ZoneMinder release notes for a list of new features:
|
|
||||||
https://github.com/ZoneMinder/zoneminder/releases
|
|
||||||
|
|
||||||
2. The contents of the ZoneMinder Apache config file have changed. In
|
|
||||||
addition, this ZoneMinder package now requires you to manually symlink the
|
|
||||||
ZoneMinder Apache config file. See new install step 6 and upgrade step 3
|
|
||||||
below for details.
|
|
||||||
|
|
||||||
3. This is an experimental build of ZoneMinder supporting nginx, rather than
|
|
||||||
apache web server.
|
|
||||||
|
|
||||||
4. If you have installed ZoneMinder from the FedBerry repositories, this build
|
|
||||||
of ZoneMinder has support for Raspberry Pi hardware acceleration when using
|
|
||||||
ffmpeg. Unforunately, there is a problem with the same hardware acceleration
|
|
||||||
when using libvlc. Consequently, libvlc support in this build of ZoneMinder
|
|
||||||
has been disabled until the problem is resolved. See the following bug
|
|
||||||
report for details: https://trac.videolan.org/vlc/ticket/18594
|
|
||||||
|
|
||||||
New installs
|
New installs
|
||||||
============
|
============
|
||||||
|
|
||||||
|
@ -52,7 +31,7 @@ New installs
|
||||||
|
|
||||||
Once the file has been saved, set proper file & ownership permissions on it:
|
Once the file has been saved, set proper file & ownership permissions on it:
|
||||||
|
|
||||||
sudo chown root:apache *.conf
|
sudo chown root:nginx *.conf
|
||||||
sudo chmod 640 *.conf
|
sudo chmod 640 *.conf
|
||||||
|
|
||||||
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
||||||
|
@ -82,8 +61,7 @@ New installs
|
||||||
6. Configure the web server
|
6. Configure the web server
|
||||||
|
|
||||||
This package uses the HTTPS protocol by default to access the web portal,
|
This package uses the HTTPS protocol by default to access the web portal,
|
||||||
using the default self signed certificate on your system. Requests using
|
using the default self signed certificate on your system.
|
||||||
HTTP will auto-redirect to HTTPS.
|
|
||||||
|
|
||||||
Inspect the web server configuration file and verify it meets your needs:
|
Inspect the web server configuration file and verify it meets your needs:
|
||||||
|
|
||||||
|
@ -92,23 +70,15 @@ New installs
|
||||||
If you are running other web enabled services then you may need to edit
|
If you are running other web enabled services then you may need to edit
|
||||||
this file to suite. See README.https to learn about other alternatives.
|
this file to suite. See README.https to learn about other alternatives.
|
||||||
|
|
||||||
|
If you wish http requests to auto-redirect to https requests, then link or
|
||||||
|
copy /etc/zm/www/redirect.nginx.conf into /etc/nginx/default.d folder.
|
||||||
|
|
||||||
When in doubt, proceed with the default:
|
When in doubt, proceed with the default:
|
||||||
|
|
||||||
sudo ln -s /etc/zm/www/zoneminder.conf /etc/nginx/default.d/
|
sudo ln -sf /etc/zm/www/zoneminder.nginx.conf /etc/nginx/conf.d/
|
||||||
|
sudo ln -sf /etc/zm/www/redirect.nginx.conf /etc/nginx/default.d/
|
||||||
|
|
||||||
7. Fcgiwrap is required when using ZoneMinder with Nginx. At the time of this
|
7. Edit /etc/sysconfig/fcgiwrap and set DAEMON_PROCS to the maximum number of
|
||||||
writing, fcgiwrap is not yet available in the Fedora repos. Until it
|
|
||||||
becomes available, you may install it from my Copr repository:
|
|
||||||
|
|
||||||
https://copr.fedorainfracloud.org/coprs/kni/fcgiwrap/
|
|
||||||
|
|
||||||
Follow the intructions on that site to enable the repo. Once enabled,
|
|
||||||
install fcgiwrap:
|
|
||||||
|
|
||||||
sudo dnf install fcgiwrap
|
|
||||||
|
|
||||||
After fcgiwrap is installed, it must be configured. Edit
|
|
||||||
/etc/sysconfig/fcgiwrap and set DAEMON_PROCS to the maximum number of
|
|
||||||
simulatneous streams the server should support. Generally, a good minimum
|
simulatneous streams the server should support. Generally, a good minimum
|
||||||
value for this equals the total number of cameras you expect to view at the
|
value for this equals the total number of cameras you expect to view at the
|
||||||
same time.
|
same time.
|
||||||
|
@ -193,7 +163,7 @@ Upgrades
|
||||||
|
|
||||||
sudo zmupdate.pl --user=root --pass=<mysql_root_pwd> --version=<from version>
|
sudo zmupdate.pl --user=root --pass=<mysql_root_pwd> --version=<from version>
|
||||||
|
|
||||||
5. Now restart nginx and php-fpm then start and zoneminder:
|
5. Now restart nginx and php-fpm then start zoneminder:
|
||||||
|
|
||||||
sudo systemctl restart nginx
|
sudo systemctl restart nginx
|
||||||
sudo systemctl restart php-fpm
|
sudo systemctl restart php-fpm
|
|
@ -1,8 +0,0 @@
|
||||||
@ZM_LOGDIR@/*.log {
|
|
||||||
missingok
|
|
||||||
notifempty
|
|
||||||
sharedscripts
|
|
||||||
postrotate
|
|
||||||
@BINDIR@/zmpkg.pl logrot 2> /dev/null > /dev/null || :
|
|
||||||
endscript
|
|
||||||
}
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# Leaving this to allow one to build zoneminder-http subpackage using arbitrary user account
|
||||||
%global zmuid_final apache
|
%global zmuid_final apache
|
||||||
%global zmgid_final apache
|
%global zmgid_final apache
|
||||||
|
|
||||||
|
@ -7,10 +8,6 @@
|
||||||
# CakePHP-Enum-Behavior is configured as a git submodule
|
# CakePHP-Enum-Behavior is configured as a git submodule
|
||||||
%global ceb_version 1.0-zm
|
%global ceb_version 1.0-zm
|
||||||
|
|
||||||
%if "%{zmuid_final}" == "nginx"
|
|
||||||
%global with_nginx 1
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%global sslcert %{_sysconfdir}/pki/tls/certs/localhost.crt
|
%global sslcert %{_sysconfdir}/pki/tls/certs/localhost.crt
|
||||||
%global sslkey %{_sysconfdir}/pki/tls/private/localhost.key
|
%global sslkey %{_sysconfdir}/pki/tls/private/localhost.key
|
||||||
|
|
||||||
|
@ -22,10 +19,11 @@
|
||||||
%global with_apcu_bc 1
|
%global with_apcu_bc 1
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
# The default for everything but el7 these days
|
||||||
%global _hardened_build 1
|
%global _hardened_build 1
|
||||||
|
|
||||||
Name: zoneminder
|
Name: zoneminder
|
||||||
Version: 1.32.2
|
Version: 1.32.3
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: A camera monitoring and analysis tool
|
Summary: A camera monitoring and analysis tool
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
|
@ -44,7 +42,7 @@ BuildRequires: systemd-devel
|
||||||
BuildRequires: mariadb-devel
|
BuildRequires: mariadb-devel
|
||||||
BuildRequires: perl-podlators
|
BuildRequires: perl-podlators
|
||||||
BuildRequires: polkit-devel
|
BuildRequires: polkit-devel
|
||||||
BuildRequires: cmake >= 2.8.7
|
BuildRequires: cmake3
|
||||||
BuildRequires: gnutls-devel
|
BuildRequires: gnutls-devel
|
||||||
BuildRequires: bzip2-devel
|
BuildRequires: bzip2-devel
|
||||||
BuildRequires: pcre-devel
|
BuildRequires: pcre-devel
|
||||||
|
@ -74,6 +72,7 @@ BuildRequires: vlc-devel
|
||||||
BuildRequires: libcurl-devel
|
BuildRequires: libcurl-devel
|
||||||
BuildRequires: libv4l-devel
|
BuildRequires: libv4l-devel
|
||||||
BuildRequires: desktop-file-utils
|
BuildRequires: desktop-file-utils
|
||||||
|
BuildRequires: gzip
|
||||||
|
|
||||||
# ZoneMinder looks for and records the location of the ffmpeg binary during build
|
# ZoneMinder looks for and records the location of the ffmpeg binary during build
|
||||||
BuildRequires: ffmpeg
|
BuildRequires: ffmpeg
|
||||||
|
@ -83,10 +82,25 @@ BuildRequires: ffmpeg-devel
|
||||||
BuildRequires: libmp4v2-devel
|
BuildRequires: libmp4v2-devel
|
||||||
BuildRequires: x264-devel
|
BuildRequires: x264-devel
|
||||||
|
|
||||||
%{?with_nginx:Requires: nginx}
|
# Allow existing user base to seamlessly transition to sub-packages
|
||||||
%{?with_nginx:Requires: php-fpm}
|
Requires: %{name}-common%{?_isa} = %{version}-%{release}
|
||||||
%{!?with_nginx:Requires: httpd}
|
Requires: %{name}-httpd%{?_isa} = %{version}-%{release}
|
||||||
%{!?with_nginx:Requires: php}
|
|
||||||
|
%description
|
||||||
|
ZoneMinder is a set of applications which is intended to provide a complete
|
||||||
|
solution allowing you to capture, analyze, record and monitor any cameras you
|
||||||
|
have attached to a Linux based machine. It is designed to run on kernels which
|
||||||
|
support the Video For Linux (V4L) interface and has been tested with cameras
|
||||||
|
attached to BTTV cards, various USB cameras and IP network cameras. It is
|
||||||
|
designed to support as many cameras as you can attach to your computer without
|
||||||
|
too much degradation of performance.
|
||||||
|
|
||||||
|
This is a meta package for backwards compatibility with the existing
|
||||||
|
ZoneMinder user base.
|
||||||
|
|
||||||
|
%package common
|
||||||
|
Summary: Common files for ZoneMinder, not tied to a specific web server
|
||||||
|
|
||||||
Requires: php-mysqli
|
Requires: php-mysqli
|
||||||
Requires: php-common
|
Requires: php-common
|
||||||
Requires: php-gd
|
Requires: php-gd
|
||||||
|
@ -111,16 +125,12 @@ Requires: perl(Net::FTP)
|
||||||
Requires: perl(LWP::Protocol::https)
|
Requires: perl(LWP::Protocol::https)
|
||||||
Requires: ca-certificates
|
Requires: ca-certificates
|
||||||
Requires: zip
|
Requires: zip
|
||||||
|
%{?systemd_requires}
|
||||||
Requires(post): systemd
|
|
||||||
Requires(post): systemd-sysv
|
|
||||||
Requires(preun): systemd
|
|
||||||
Requires(postun): systemd
|
|
||||||
|
|
||||||
Requires(post): %{_bindir}/gpasswd
|
Requires(post): %{_bindir}/gpasswd
|
||||||
Requires(post): %{_bindir}/less
|
Requires(post): %{_bindir}/chown
|
||||||
|
|
||||||
%description
|
%description common
|
||||||
ZoneMinder is a set of applications which is intended to provide a complete
|
ZoneMinder is a set of applications which is intended to provide a complete
|
||||||
solution allowing you to capture, analyze, record and monitor any cameras you
|
solution allowing you to capture, analyze, record and monitor any cameras you
|
||||||
have attached to a Linux based machine. It is designed to run on kernels which
|
have attached to a Linux based machine. It is designed to run on kernels which
|
||||||
|
@ -129,15 +139,57 @@ attached to BTTV cards, various USB cameras and IP network cameras. It is
|
||||||
designed to support as many cameras as you can attach to your computer without
|
designed to support as many cameras as you can attach to your computer without
|
||||||
too much degradation of performance.
|
too much degradation of performance.
|
||||||
|
|
||||||
|
This is a meta-package that exists solely to allow the existing user base to
|
||||||
|
seamlessly transition to sub-packages.
|
||||||
|
|
||||||
|
%package httpd
|
||||||
|
Summary: ZoneMinder configuration for Apache web server
|
||||||
|
Requires: %{name}-common%{?_isa} = %{version}-%{release}
|
||||||
|
Requires: httpd
|
||||||
|
Requires: php
|
||||||
|
|
||||||
|
Conflicts: %{name}-nginx
|
||||||
|
|
||||||
|
%description httpd
|
||||||
|
ZoneMinder is a set of applications which is intended to provide a complete
|
||||||
|
solution allowing you to capture, analyze, record and monitor any cameras you
|
||||||
|
have attached to a Linux based machine. It is designed to run on kernels which
|
||||||
|
support the Video For Linux (V4L) interface and has been tested with cameras
|
||||||
|
attached to BTTV cards, various USB cameras and IP network cameras. It is
|
||||||
|
designed to support as many cameras as you can attach to your computer without
|
||||||
|
too much degradation of performance.
|
||||||
|
|
||||||
|
This sub-package contains configuration specific to Apache web server
|
||||||
|
|
||||||
|
%package nginx
|
||||||
|
Summary: ZoneMinder configuration for Nginx web server
|
||||||
|
Requires: %{name}-common%{?_isa} = %{version}-%{release}
|
||||||
|
Requires: nginx
|
||||||
|
Requires: php-fpm
|
||||||
|
Requires: fcgiwrap
|
||||||
|
|
||||||
|
Conflicts: %{name}-httpd
|
||||||
|
|
||||||
|
%description nginx
|
||||||
|
ZoneMinder is a set of applications which is intended to provide a complete
|
||||||
|
solution allowing you to capture, analyze, record and monitor any cameras you
|
||||||
|
have attached to a Linux based machine. It is designed to run on kernels which
|
||||||
|
support the Video For Linux (V4L) interface and has been tested with cameras
|
||||||
|
attached to BTTV cards, various USB cameras and IP network cameras. It is
|
||||||
|
designed to support as many cameras as you can attach to your computer without
|
||||||
|
too much degradation of performance.
|
||||||
|
|
||||||
|
This sub-package contains support for ZoneMinder with the Nginx web server
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%autosetup -p 1 -a 1
|
%autosetup -p 1 -a 1
|
||||||
%{__rm} -rf ./web/api/app/Plugin/Crud
|
rm -rf ./web/api/app/Plugin/Crud
|
||||||
%{__mv} -f crud-%{crud_version} ./web/api/app/Plugin/Crud
|
mv -f crud-%{crud_version} ./web/api/app/Plugin/Crud
|
||||||
|
|
||||||
# The all powerful autosetup macro does not work after the second source tarball
|
# The all powerful autosetup macro does not work after the second source tarball
|
||||||
%{__gzip} -dc %{_sourcedir}/cakephp-enum-behavior-%{ceb_version}.tar.gz | tar -xvvf -
|
gzip -dc %{_sourcedir}/cakephp-enum-behavior-%{ceb_version}.tar.gz | tar -xvvf -
|
||||||
%{__rm} -rf ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
rm -rf ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
||||||
%{__mv} -f CakePHP-Enum-Behavior-%{ceb_version} ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
mv -f CakePHP-Enum-Behavior-%{ceb_version} ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
||||||
|
|
||||||
# Change the following default values
|
# Change the following default values
|
||||||
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes
|
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes
|
||||||
|
@ -148,9 +200,9 @@ too much degradation of performance.
|
||||||
./utils/zmeditconfigdata.sh ZM_OPT_FAST_DELETE no
|
./utils/zmeditconfigdata.sh ZM_OPT_FAST_DELETE no
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%cmake \
|
%cmake3 \
|
||||||
-DZM_WEB_USER="%{zmuid_final}" \
|
-DZM_WEB_USER="%{zmuid_final}" \
|
||||||
-DZM_WEB_GROUP="%{zmuid_final}" \
|
-DZM_WEB_GROUP="%{zmgid_final}" \
|
||||||
-DZM_TARGET_DISTRO="%{zmtargetdistro}" \
|
-DZM_TARGET_DISTRO="%{zmtargetdistro}" \
|
||||||
.
|
.
|
||||||
|
|
||||||
|
@ -172,10 +224,13 @@ find %{buildroot} \( -name .htaccess -or -name .editorconfig -or -name .packlist
|
||||||
find %{buildroot}%{_datadir}/zoneminder/www/api \( -name cake -or -name cake.php \) -type f -exec sed -i 's\^#!/usr/bin/env bash$\#!%{_buildshell}\' {} \; -exec %{__chmod} 755 {} \;
|
find %{buildroot}%{_datadir}/zoneminder/www/api \( -name cake -or -name cake.php \) -type f -exec sed -i 's\^#!/usr/bin/env bash$\#!%{_buildshell}\' {} \; -exec %{__chmod} 755 {} \;
|
||||||
|
|
||||||
# Use the system cacert file rather then the one bundled with CakePHP
|
# Use the system cacert file rather then the one bundled with CakePHP
|
||||||
%{__rm} -f %{buildroot}%{_datadir}/zoneminder/www/api/lib/Cake/Config/cacert.pem
|
rm -f %{buildroot}%{_datadir}/zoneminder/www/api/lib/Cake/Config/cacert.pem
|
||||||
%{__ln_s} ../../../../../../../..%{_sysconfdir}/pki/tls/certs/ca-bundle.crt %{buildroot}%{_datadir}/zoneminder/www/api/lib/Cake/Config/cacert.pem
|
ln -s ../../../../../../../..%{_sysconfdir}/pki/tls/certs/ca-bundle.crt %{buildroot}%{_datadir}/zoneminder/www/api/lib/Cake/Config/cacert.pem
|
||||||
|
|
||||||
%post
|
# Handle the polkit file differently for web server agnostic support (see post)
|
||||||
|
rm -f %{buildroot}%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules
|
||||||
|
|
||||||
|
%post common
|
||||||
# Initial installation
|
# Initial installation
|
||||||
if [ $1 -eq 1 ] ; then
|
if [ $1 -eq 1 ] ; then
|
||||||
%systemd_post %{name}.service
|
%systemd_post %{name}.service
|
||||||
|
@ -183,28 +238,48 @@ fi
|
||||||
|
|
||||||
# Upgrade from a previous version of zoneminder
|
# Upgrade from a previous version of zoneminder
|
||||||
if [ $1 -eq 2 ] ; then
|
if [ $1 -eq 2 ] ; then
|
||||||
|
|
||||||
# Add any new PTZ control configurations to the database (will not overwrite)
|
# Add any new PTZ control configurations to the database (will not overwrite)
|
||||||
%{_bindir}/zmcamtool.pl --import >/dev/null 2>&1 || :
|
%{_bindir}/zmcamtool.pl --import >/dev/null 2>&1 || :
|
||||||
|
|
||||||
# Freshen the database
|
# Freshen the database
|
||||||
%{_bindir}/zmupdate.pl -f >/dev/null 2>&1 || :
|
%{_bindir}/zmupdate.pl -f >/dev/null 2>&1 || :
|
||||||
|
|
||||||
# We can't run this automatically when new sql account permissions need to
|
|
||||||
# be manually added first
|
|
||||||
# Run zmupdate non-interactively
|
|
||||||
# zmupdate.pl --nointeractive
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Warn the end user to read the README file
|
||||||
|
echo -e "\nVERY IMPORTANT: Before starting ZoneMinder, you must read the README file\nto finish the installation or upgrade!"
|
||||||
|
echo -e "\nThe README file is located here: %{_pkgdocdir}-common/README\n"
|
||||||
|
|
||||||
|
%post httpd
|
||||||
|
# For the case of changing from nginx <-> httpd, files in these folders must change ownership if they exist
|
||||||
|
%{_bindir}/chown -R %{zmuid_final}:%{zmgid_final} %{_sharedstatedir}/php/session/* >/dev/null 2>&1 || :
|
||||||
|
%{_bindir}/chown -R %{zmuid_final}:%{zmgid_final} %{_localstatedir}/log/zoneminder/* >/dev/null 2>&1 || :
|
||||||
|
|
||||||
|
ln -sf %{_sysconfdir}/zm/www/com.zoneminder.systemctl.rules.httpd %{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules
|
||||||
|
# backwards compatibility
|
||||||
|
ln -sf %{_sysconfdir}/zm/www/zoneminder.httpd.conf %{_sysconfdir}/zm/www/zoneminder.conf
|
||||||
|
|
||||||
# Allow zoneminder access to local video sources, serial ports, and x10
|
# Allow zoneminder access to local video sources, serial ports, and x10
|
||||||
%{_bindir}/gpasswd -a %{zmuid_final} video >/dev/null 2>&1 || :
|
%{_bindir}/gpasswd -a %{zmuid_final} video >/dev/null 2>&1 || :
|
||||||
%{_bindir}/gpasswd -a %{zmuid_final} dialout >/dev/null 2>&1 || :
|
%{_bindir}/gpasswd -a %{zmuid_final} dialout >/dev/null 2>&1 || :
|
||||||
|
|
||||||
# Warn the end user to read the README file
|
%post nginx
|
||||||
echo -e "\nVERY IMPORTANT: Before starting ZoneMinder, you must read the README file\nto finish the installation or upgrade!"
|
|
||||||
echo -e "\nThe README file is located here: %{_pkgdocdir}/README\n"
|
# Php package owns the session folder and sets group ownership to apache account
|
||||||
|
# We could override the folder permission, but adding nginx to the apache group works better
|
||||||
|
%{_bindir}/gpasswd -a nginx apache >/dev/null 2>&1 || :
|
||||||
|
|
||||||
|
# For the case of changing from httpd <-> nginx, files in these folders must change ownership if they exist
|
||||||
|
%{_bindir}/chown -R nginx:nginx %{_sharedstatedir}/php/session/* >/dev/null 2>&1 || :
|
||||||
|
%{_bindir}/chown -R nginx:nginx %{_localstatedir}/log/zoneminder/* >/dev/null 2>&1 || :
|
||||||
|
|
||||||
|
ln -sf %{_sysconfdir}/zm/www/com.zoneminder.systemctl.rules.nginx %{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules
|
||||||
|
# backwards compatibility
|
||||||
|
ln -sf %{_sysconfdir}/zm/www/zoneminder.nginx.conf %{_sysconfdir}/zm/www/zoneminder.conf
|
||||||
|
|
||||||
|
# Allow zoneminder access to local video sources, serial ports, and x10
|
||||||
|
%{_bindir}/gpasswd -a nginx video >/dev/null 2>&1 || :
|
||||||
|
%{_bindir}/gpasswd -a nginx dialout >/dev/null 2>&1 || :
|
||||||
|
|
||||||
%if 0%{?with_nginx}
|
|
||||||
# Nginx does not create an SSL certificate like the apache package does so lets do that here
|
# Nginx does not create an SSL certificate like the apache package does so lets do that here
|
||||||
if [ -f %{sslkey} -o -f %{sslcert} ]; then
|
if [ -f %{sslkey} -o -f %{sslcert} ]; then
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -230,7 +305,6 @@ SomeOrganizationalUnit
|
||||||
${FQDN}
|
${FQDN}
|
||||||
root@${FQDN}
|
root@${FQDN}
|
||||||
EOF
|
EOF
|
||||||
%endif
|
|
||||||
|
|
||||||
%preun
|
%preun
|
||||||
%systemd_preun %{name}.service
|
%systemd_preun %{name}.service
|
||||||
|
@ -238,19 +312,12 @@ EOF
|
||||||
%postun
|
%postun
|
||||||
%systemd_postun_with_restart %{name}.service
|
%systemd_postun_with_restart %{name}.service
|
||||||
|
|
||||||
%triggerun -- zoneminder < 1.25.0-4
|
|
||||||
# Save the current service runlevel info
|
|
||||||
# User must manually run systemd-sysv-convert --apply zoneminder
|
|
||||||
# to migrate them to systemd targets
|
|
||||||
%{_bindir}/systemd-sysv-convert --save zoneminder >/dev/null 2>&1 ||:
|
|
||||||
|
|
||||||
# Run these because the SysV package being removed won't do them
|
|
||||||
/sbin/chkconfig --del zoneminder >/dev/null 2>&1 || :
|
|
||||||
/bin/systemctl try-restart zoneminder.service >/dev/null 2>&1 || :
|
|
||||||
|
|
||||||
%files
|
%files
|
||||||
|
# nothing
|
||||||
|
|
||||||
|
%files common
|
||||||
%license COPYING
|
%license COPYING
|
||||||
%doc AUTHORS README.md distros/redhat/readme/README distros/redhat/readme/README.https
|
%doc AUTHORS README.md distros/redhat/readme/README distros/redhat/readme/README.httpd distros/redhat/readme/README.nginx distros/redhat/readme/README.https
|
||||||
|
|
||||||
# We want these two folders to have "normal" read permission
|
# We want these two folders to have "normal" read permission
|
||||||
# compared to the folder contents
|
# compared to the folder contents
|
||||||
|
@ -260,21 +327,11 @@ EOF
|
||||||
# Config folder contents contain sensitive info
|
# Config folder contents contain sensitive info
|
||||||
# and should not be readable by normal users
|
# and should not be readable by normal users
|
||||||
%{_sysconfdir}/zm/conf.d/README
|
%{_sysconfdir}/zm/conf.d/README
|
||||||
%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/zm.conf
|
|
||||||
%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/conf.d/*.conf
|
|
||||||
%ghost %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/conf.d/zmcustom.conf
|
|
||||||
|
|
||||||
%config(noreplace) %attr(644,root,root) /etc/zm/www/zoneminder.conf
|
|
||||||
%config(noreplace) %{_sysconfdir}/logrotate.d/zoneminder
|
%config(noreplace) %{_sysconfdir}/logrotate.d/zoneminder
|
||||||
|
|
||||||
%if 0%{?with_nginx}
|
|
||||||
%config(noreplace) %{_sysconfdir}/php-fpm.d/zoneminder.conf
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%{_tmpfilesdir}/zoneminder.conf
|
|
||||||
%{_unitdir}/zoneminder.service
|
%{_unitdir}/zoneminder.service
|
||||||
%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy
|
%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy
|
||||||
%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules
|
|
||||||
%{_bindir}/zmsystemctl.pl
|
%{_bindir}/zmsystemctl.pl
|
||||||
|
|
||||||
%{_bindir}/zma
|
%{_bindir}/zma
|
||||||
|
@ -307,6 +364,17 @@ EOF
|
||||||
%{_datadir}/zoneminder/
|
%{_datadir}/zoneminder/
|
||||||
%{_datadir}/applications/*zoneminder.desktop
|
%{_datadir}/applications/*zoneminder.desktop
|
||||||
|
|
||||||
|
%files httpd
|
||||||
|
%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/zm.conf
|
||||||
|
%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/conf.d/0*.conf
|
||||||
|
%ghost %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/conf.d/zmcustom.conf
|
||||||
|
%config(noreplace) %{_sysconfdir}/zm/www/zoneminder.httpd.conf
|
||||||
|
%ghost %{_sysconfdir}/zm/www/zoneminder.conf
|
||||||
|
%config(noreplace) %{_sysconfdir}/zm/www/com.zoneminder.systemctl.rules.httpd
|
||||||
|
%ghost %{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules
|
||||||
|
|
||||||
|
%{_unitdir}/zoneminder.service.d/zm-httpd.conf
|
||||||
|
%{_tmpfilesdir}/zoneminder.httpd.tmpfiles.conf
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder
|
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder/events
|
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder/events
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder/images
|
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_sharedstatedir}/zoneminder/images
|
||||||
|
@ -316,9 +384,41 @@ EOF
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/cache/zoneminder
|
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/cache/zoneminder
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/log/zoneminder
|
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/log/zoneminder
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/spool/zoneminder-upload
|
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/spool/zoneminder-upload
|
||||||
%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/run/zoneminder
|
|
||||||
|
%files nginx
|
||||||
|
%config(noreplace) %attr(640,root,nginx) %{_sysconfdir}/zm/zm.conf
|
||||||
|
%config(noreplace) %attr(640,root,nginx) %{_sysconfdir}/zm/conf.d/*.conf
|
||||||
|
%ghost %attr(640,root,nginx) %{_sysconfdir}/zm/conf.d/zmcustom.conf
|
||||||
|
%config(noreplace) %{_sysconfdir}/zm/www/zoneminder.nginx.conf
|
||||||
|
%config(noreplace) %{_sysconfdir}/zm/www/redirect.nginx.conf
|
||||||
|
%ghost %{_sysconfdir}/zm/www/zoneminder.conf
|
||||||
|
%config(noreplace) %{_sysconfdir}/zm/www/com.zoneminder.systemctl.rules.nginx
|
||||||
|
%ghost %{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules
|
||||||
|
|
||||||
|
%config(noreplace) %{_sysconfdir}/php-fpm.d/zoneminder.php-fpm.conf
|
||||||
|
|
||||||
|
|
||||||
|
%{_unitdir}/zoneminder.service.d/zm-nginx.conf
|
||||||
|
%{_tmpfilesdir}/zoneminder.nginx.tmpfiles.conf
|
||||||
|
%dir %attr(755,nginx,nginx) %{_sharedstatedir}/zoneminder
|
||||||
|
%dir %attr(755,nginx,nginx) %{_sharedstatedir}/zoneminder/events
|
||||||
|
%dir %attr(755,nginx,nginx) %{_sharedstatedir}/zoneminder/images
|
||||||
|
%dir %attr(755,nginx,nginx) %{_sharedstatedir}/zoneminder/sock
|
||||||
|
%dir %attr(755,nginx,nginx) %{_sharedstatedir}/zoneminder/swap
|
||||||
|
%dir %attr(755,nginx,nginx) %{_sharedstatedir}/zoneminder/temp
|
||||||
|
%dir %attr(755,nginx,nginx) %{_localstatedir}/cache/zoneminder
|
||||||
|
%dir %attr(755,nginx,nginx) %{_localstatedir}/log/zoneminder
|
||||||
|
%dir %attr(755,nginx,nginx) %{_localstatedir}/spool/zoneminder-upload
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Dec 08 2018 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.32.3-1
|
||||||
|
- 1.32.3 Release
|
||||||
|
- Break into sub-packages
|
||||||
|
|
||||||
|
* Tue Nov 13 2018 Antonio Trande <sagitter@fedoraproject.org> - 1.32.2-2
|
||||||
|
- Rebuild for ffmpeg-3.4.5 on el7
|
||||||
|
- Use CMake3
|
||||||
|
|
||||||
* Sat Oct 13 2018 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.32.2-1
|
* Sat Oct 13 2018 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.32.2-1
|
||||||
- 1.32.2 release
|
- 1.32.2 release
|
||||||
- Bug fix release
|
- Bug fix release
|
||||||
|
|
|
@ -3,7 +3,7 @@ Section: net
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Dmitry Smirnov <onlyjob@debian.org>
|
Maintainer: Dmitry Smirnov <onlyjob@debian.org>
|
||||||
Uploaders: Vagrant Cascadian <vagrant@debian.org>
|
Uploaders: Vagrant Cascadian <vagrant@debian.org>
|
||||||
Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apache2-dev, dh-linktree
|
Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apache2-dev, dh-linktree, dh-systemd, dh-apache2
|
||||||
,cmake
|
,cmake
|
||||||
,libx264-dev, libmp4v2-dev
|
,libx264-dev, libmp4v2-dev
|
||||||
,libavdevice-dev (>= 6:10~)
|
,libavdevice-dev (>= 6:10~)
|
||||||
|
@ -41,7 +41,7 @@ Package: zoneminder
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
||||||
,javascript-common
|
,javascript-common
|
||||||
,libmp4v2-2, libx264-142|libx264-148|libx264-152, libswscale-ffmpeg3|libswscale4|libswscale3
|
,libmp4v2-2, libx264-142|libx264-148|libx264-152, libswscale-ffmpeg3|libswscale4|libswscale3|libswscale5
|
||||||
,ffmpeg | libav-tools
|
,ffmpeg | libav-tools
|
||||||
,libdate-manip-perl, libmime-lite-perl, libmime-tools-perl
|
,libdate-manip-perl, libmime-lite-perl, libmime-tools-perl
|
||||||
,libdbd-mysql-perl
|
,libdbd-mysql-perl
|
||||||
|
|
|
@ -311,7 +311,7 @@ There are a number of specific reasons why processor loads can be high either by
|
||||||
|
|
||||||
The main causes are.
|
The main causes are.
|
||||||
|
|
||||||
* Using a video palette other than greyscale or RGB24. This can cause a relatively minor performace hit, though still significant. Although some cameras and cards require using planar palettes ZM currently doesn't support this format internally and each frame is converted to an RGB representation prior to processing. Unless you have compelling reasons for using YUV or reduced RGB type palettes such as hitting USB transfer limits I would experiment to see if RGB24 or greyscale is quicker. Put your monitors into 'Monitor' mode so that only the capture daemons are running and monitor the process load of these (the 'zmc' processes) using top. Try it with various palettes to see if it makes a difference.
|
* Using a video palette other than greyscale or RGB24. This can cause a relatively minor performance hit, though still significant. Although some cameras and cards require using planar palettes ZM currently doesn't support this format internally and each frame is converted to an RGB representation prior to processing. Unless you have compelling reasons for using YUV or reduced RGB type palettes such as hitting USB transfer limits I would experiment to see if RGB24 or greyscale is quicker. Put your monitors into 'Monitor' mode so that only the capture daemons are running and monitor the process load of these (the 'zmc' processes) using top. Try it with various palettes to see if it makes a difference.
|
||||||
* Big image sizes. A image of 640x480 requires at least four times the processing of a 320x240 image. Experiment with different sizes to see what effect it may have. Sometimes a large image is just two interlaced smaller frames so has no real benefit anyway. This is especially true for analog cameras/cards as image height over 320 (NTSC) or 352 PAL) are invariably interlaced.
|
* Big image sizes. A image of 640x480 requires at least four times the processing of a 320x240 image. Experiment with different sizes to see what effect it may have. Sometimes a large image is just two interlaced smaller frames so has no real benefit anyway. This is especially true for analog cameras/cards as image height over 320 (NTSC) or 352 PAL) are invariably interlaced.
|
||||||
* Capture frame rates. Unless there's a compelling reason in your case there is often little benefit in running cameras at 25fps when 5-10fps would often get you results just as good. Try changing your monitor settings to limit your cameras to lower frame rates. You can still configure ZM to ignore these limits and capture as fast as possible when motion is detected.
|
* Capture frame rates. Unless there's a compelling reason in your case there is often little benefit in running cameras at 25fps when 5-10fps would often get you results just as good. Try changing your monitor settings to limit your cameras to lower frame rates. You can still configure ZM to ignore these limits and capture as fast as possible when motion is detected.
|
||||||
* Run function. Obviously running in Record or Mocord modes or in Modect with lots of events generates a lot of DB and file activity and so CPU and load will increase.
|
* Run function. Obviously running in Record or Mocord modes or in Modect with lots of events generates a lot of DB and file activity and so CPU and load will increase.
|
||||||
|
|
|
@ -58,7 +58,7 @@ Maximum FPS
|
||||||
Alarm Maximum FPS
|
Alarm Maximum FPS
|
||||||
If you have specified a Maximum FPS it may be that you don’t want this limitation to apply when your monitor is recording motion or other event. This setting allows you to override the Maximum FPS value if this circumstance occurs. As with the Maximum FPS setting leaving this blank implies no limit so if you have set a maximum fps in the previous option then when an alarm occurs this limit would be ignored and ZoneMinder would capture as fast as possible for the duration of the alarm, returning to the limited value after the alarm has concluded. Equally you could set this to the same, or higher (or even lower) value than Maximum FPS for more precise control over the capture rate in the event of an alarm.
|
If you have specified a Maximum FPS it may be that you don’t want this limitation to apply when your monitor is recording motion or other event. This setting allows you to override the Maximum FPS value if this circumstance occurs. As with the Maximum FPS setting leaving this blank implies no limit so if you have set a maximum fps in the previous option then when an alarm occurs this limit would be ignored and ZoneMinder would capture as fast as possible for the duration of the alarm, returning to the limited value after the alarm has concluded. Equally you could set this to the same, or higher (or even lower) value than Maximum FPS for more precise control over the capture rate in the event of an alarm.
|
||||||
|
|
||||||
**IMPORTANT:** This field is subject to the same limitations as the Maxium FPS field. Ignoring these limitations will produce undesriable results.
|
**IMPORTANT:** This field is subject to the same limitations as the Maximum FPS field. Ignoring these limitations will produce undesriable results.
|
||||||
|
|
||||||
Reference Image Blend %ge
|
Reference Image Blend %ge
|
||||||
Each analysed image in ZoneMinder is a composite of previous images and is formed by applying the current image as a certain percentage of the previous reference image. Thus, if we entered the value of 10 here, each image’s part in the reference image will diminish by a factor of 0.9 each time round. So a typical reference image will be 10% the previous image, 9% the one before that and then 8.1%, 7.2%, 6.5% and so on of the rest of the way. An image will effectively vanish around 25 images later than when it was added. This blend value is what is specified here and if higher will make slower progressing events less detectable as the reference image would change more quickly. Similarly events will be deemed to be over much sooner as the reference image adapts to the new images more quickly. In signal processing terms the higher this value the steeper the event attack and decay of the signal. It depends on your particular requirements what the appropriate value would be for you but start with 10 here and adjust it (usually down) later if necessary.
|
Each analysed image in ZoneMinder is a composite of previous images and is formed by applying the current image as a certain percentage of the previous reference image. Thus, if we entered the value of 10 here, each image’s part in the reference image will diminish by a factor of 0.9 each time round. So a typical reference image will be 10% the previous image, 9% the one before that and then 8.1%, 7.2%, 6.5% and so on of the rest of the way. An image will effectively vanish around 25 images later than when it was added. This blend value is what is specified here and if higher will make slower progressing events less detectable as the reference image would change more quickly. Similarly events will be deemed to be over much sooner as the reference image adapts to the new images more quickly. In signal processing terms the higher this value the steeper the event attack and decay of the signal. It depends on your particular requirements what the appropriate value would be for you but start with 10 here and adjust it (usually down) later if necessary.
|
||||||
|
@ -205,7 +205,8 @@ Warm-up Frames
|
||||||
Pre/Post Event Image Buffer
|
Pre/Post Event Image Buffer
|
||||||
These options determine how many frames from before and after an event should be preserved with it. This allows you to view what happened immediately prior and subsequent to the event. A value of 10 for both of these will get you started but if you get a lot of short events and would prefer them to run together to form fewer longer ones then increase the Post Event buffer size. The pre-event buffer is a true buffer and should not really exceed half the ring buffer size. However the post-event buffer is just a count that is applied to captured frames and so can be managed more flexibly. You should also bear in mind the frame rate of the camera when choosing these values. For instance a network camera capturing at 1FPS will give you 10 seconds before and after each event if you chose 10 here. This may well be too much and pad out events more than necessary. However a fast video card may capture at 25FPS and you will want to ensure that this setting enables you to view a reasonable time frame pre and post event.
|
These options determine how many frames from before and after an event should be preserved with it. This allows you to view what happened immediately prior and subsequent to the event. A value of 10 for both of these will get you started but if you get a lot of short events and would prefer them to run together to form fewer longer ones then increase the Post Event buffer size. The pre-event buffer is a true buffer and should not really exceed half the ring buffer size. However the post-event buffer is just a count that is applied to captured frames and so can be managed more flexibly. You should also bear in mind the frame rate of the camera when choosing these values. For instance a network camera capturing at 1FPS will give you 10 seconds before and after each event if you chose 10 here. This may well be too much and pad out events more than necessary. However a fast video card may capture at 25FPS and you will want to ensure that this setting enables you to view a reasonable time frame pre and post event.
|
||||||
Stream Replay Image Buffer
|
Stream Replay Image Buffer
|
||||||
This option ...
|
The number of frames buffered to allow pausing and rewinding of the stream when live viewing a monitor. A value of 0 disables the feature.
|
||||||
|
Frames are buffered to ZM_PATH_SWAP. If this path points to a physical drive, a lot of IO will be caused during live view / montage. If you experience high system load in those situations, either disable the feature or use a RAM drive for ZM_PATH_SWAP.
|
||||||
Alarm Frame Count
|
Alarm Frame Count
|
||||||
This option allows you to specify how many consecutive alarm frames must occur before an alarm event is generated. The usual, and default, value is 1 which implies that any alarm frame will cause or participate in an event. You can enter any value up to 16 here to eliminate bogus events caused perhaps by screen flickers or other transients. Values over 3 or 4 are unlikely to be useful however. Please note that if you have statistics recording enabled then currently statistics are not recorded for the first ‘Alarm Frame Count’-1 frames of an event. So if you set this value to 5 then the first 4 frames will be missing statistics whereas the more usual value of 1 will ensure that all alarm frames have statistics recorded.
|
This option allows you to specify how many consecutive alarm frames must occur before an alarm event is generated. The usual, and default, value is 1 which implies that any alarm frame will cause or participate in an event. You can enter any value up to 16 here to eliminate bogus events caused perhaps by screen flickers or other transients. Values over 3 or 4 are unlikely to be useful however. Please note that if you have statistics recording enabled then currently statistics are not recorded for the first ‘Alarm Frame Count’-1 frames of an event. So if you set this value to 5 then the first 4 frames will be missing statistics whereas the more usual value of 1 will ensure that all alarm frames have statistics recorded.
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
# Create files from the .in files
|
# Create files from the .in files
|
||||||
configure_file(apache.conf.in "${CMAKE_CURRENT_BINARY_DIR}/apache.conf" @ONLY)
|
configure_file(apache.conf.in "${CMAKE_CURRENT_BINARY_DIR}/apache.conf" @ONLY)
|
||||||
|
configure_file(nginx.conf.in "${CMAKE_CURRENT_BINARY_DIR}/nginx.conf" @ONLY)
|
||||||
configure_file(logrotate.conf.in "${CMAKE_CURRENT_BINARY_DIR}/logrotate.conf" @ONLY)
|
configure_file(logrotate.conf.in "${CMAKE_CURRENT_BINARY_DIR}/logrotate.conf" @ONLY)
|
||||||
configure_file(syslog.conf.in "${CMAKE_CURRENT_BINARY_DIR}/syslog.conf" @ONLY)
|
configure_file(syslog.conf.in "${CMAKE_CURRENT_BINARY_DIR}/syslog.conf" @ONLY)
|
||||||
configure_file(com.zoneminder.systemctl.policy.in "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.policy" @ONLY)
|
configure_file(com.zoneminder.systemctl.policy.in "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.policy" @ONLY)
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
#
|
||||||
|
# PLEASE NOTE THAT THIS FILE IS INTENDED FOR GUIDANCE ONLY AND MAY NOT BE APPROPRIATE FOR YOUR DISTRIBUTION
|
||||||
|
#
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl default_server;
|
||||||
|
listen [::]:443 ssl default_server;
|
||||||
|
server_name = localhost $hostname;
|
||||||
|
|
||||||
|
ssl_certificate "/etc/pki/tls/certs/localhost.crt";
|
||||||
|
ssl_certificate_key "/etc/pki/tls/private/localhost.key";
|
||||||
|
ssl_session_cache shared:SSL:1m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
ssl_ciphers PROFILE=SYSTEM;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
# Auto redirect to server/zm when no url suffix was given
|
||||||
|
location = / {
|
||||||
|
return 301 zm;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /cgi-bin-zm {
|
||||||
|
gzip off;
|
||||||
|
alias "@ZM_CGIDIR@";
|
||||||
|
|
||||||
|
include /etc/nginx/fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||||
|
fastcgi_pass unix:/run/fcgiwrap.sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zm/cache {
|
||||||
|
alias "@ZM_CACHEDIR@";
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zm {
|
||||||
|
gzip off;
|
||||||
|
alias "@ZM_WEBDIR@";
|
||||||
|
index index.php;
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
expires epoch;
|
||||||
|
include /etc/nginx/fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_pass unix:/run/php-fpm/www.sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.(jpg|jpeg|gif|png|ico)$ {
|
||||||
|
access_log off;
|
||||||
|
expires 33d;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /zm/api/ {
|
||||||
|
alias "@ZM_WEBDIR@";
|
||||||
|
rewrite ^/zm/api(.+)$ /zm/api/app/webroot/index.php?p=$1 last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -25,9 +25,7 @@ sub GetServices {
|
||||||
soap_action => 'http://www.onvif.org/ver10/device/wsdl/GetServices',
|
soap_action => 'http://www.onvif.org/ver10/device/wsdl/GetServices',
|
||||||
style => 'document',
|
style => 'document',
|
||||||
body => {
|
body => {
|
||||||
|
use => 'literal',
|
||||||
|
|
||||||
'use' => 'literal',
|
|
||||||
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
||||||
encodingStyle => '',
|
encodingStyle => '',
|
||||||
parts => [qw( ONVIF::Device::Elements::GetServices )],
|
parts => [qw( ONVIF::Device::Elements::GetServices )],
|
||||||
|
@ -50,9 +48,7 @@ sub GetServiceCapabilities {
|
||||||
soap_action => 'http://www.onvif.org/ver10/device/wsdl/GetServiceCapabilities',
|
soap_action => 'http://www.onvif.org/ver10/device/wsdl/GetServiceCapabilities',
|
||||||
style => 'document',
|
style => 'document',
|
||||||
body => {
|
body => {
|
||||||
|
use => 'literal',
|
||||||
|
|
||||||
'use' => 'literal',
|
|
||||||
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
|
||||||
encodingStyle => '',
|
encodingStyle => '',
|
||||||
parts => [qw( ONVIF::Device::Elements::GetServiceCapabilities )],
|
parts => [qw( ONVIF::Device::Elements::GetServiceCapabilities )],
|
||||||
|
@ -3059,7 +3055,7 @@ Returns a L<ONVIF::Device::Elements::SetClientCertificateModeResponse|ONVIF::Dev
|
||||||
|
|
||||||
=head3 GetRelayOutputs
|
=head3 GetRelayOutputs
|
||||||
|
|
||||||
This method has been depricated with version 2.0. Refer to the DeviceIO service.
|
This method has been deprecated with version 2.0. Refer to the DeviceIO service.
|
||||||
|
|
||||||
Returns a L<ONVIF::Device::Elements::GetRelayOutputsResponse|ONVIF::Device::Elements::GetRelayOutputsResponse> object.
|
Returns a L<ONVIF::Device::Elements::GetRelayOutputsResponse|ONVIF::Device::Elements::GetRelayOutputsResponse> object.
|
||||||
|
|
||||||
|
@ -3069,7 +3065,7 @@ Returns a L<ONVIF::Device::Elements::GetRelayOutputsResponse|ONVIF::Device::Elem
|
||||||
|
|
||||||
=head3 SetRelayOutputSettings
|
=head3 SetRelayOutputSettings
|
||||||
|
|
||||||
This method has been depricated with version 2.0. Refer to the DeviceIO service.
|
This method has been deprecated with version 2.0. Refer to the DeviceIO service.
|
||||||
|
|
||||||
Returns a L<ONVIF::Device::Elements::SetRelayOutputSettingsResponse|ONVIF::Device::Elements::SetRelayOutputSettingsResponse> object.
|
Returns a L<ONVIF::Device::Elements::SetRelayOutputSettingsResponse|ONVIF::Device::Elements::SetRelayOutputSettingsResponse> object.
|
||||||
|
|
||||||
|
@ -3085,7 +3081,7 @@ Returns a L<ONVIF::Device::Elements::SetRelayOutputSettingsResponse|ONVIF::Devic
|
||||||
|
|
||||||
=head3 SetRelayOutputState
|
=head3 SetRelayOutputState
|
||||||
|
|
||||||
This method has been depricated with version 2.0. Refer to the DeviceIO service.
|
This method has been deprecated with version 2.0. Refer to the DeviceIO service.
|
||||||
|
|
||||||
Returns a L<ONVIF::Device::Elements::SetRelayOutputStateResponse|ONVIF::Device::Elements::SetRelayOutputStateResponse> object.
|
Returns a L<ONVIF::Device::Elements::SetRelayOutputStateResponse|ONVIF::Device::Elements::SetRelayOutputStateResponse> object.
|
||||||
|
|
||||||
|
|
|
@ -830,7 +830,7 @@ Returns a L<ONVIF::PTZ::Elements::SetPresetResponse|ONVIF::PTZ::Elements::SetPre
|
||||||
|
|
||||||
=head3 RemovePreset
|
=head3 RemovePreset
|
||||||
|
|
||||||
Operation to remove a PTZ preset for the Node in the selected profile. The operation is supported if the PresetPosition capability exists for teh Node in the selected profile.
|
Operation to remove a PTZ preset for the Node in the selected profile. The operation is supported if the PresetPosition capability exists for the Node in the selected profile.
|
||||||
|
|
||||||
Returns a L<ONVIF::PTZ::Elements::RemovePresetResponse|ONVIF::PTZ::Elements::RemovePresetResponse> object.
|
Returns a L<ONVIF::PTZ::Elements::RemovePresetResponse|ONVIF::PTZ::Elements::RemovePresetResponse> object.
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
#
|
#
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
#
|
#
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
#
|
#
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
#
|
#
|
||||||
|
|
|
@ -208,7 +208,7 @@ sub zmDbGetMonitor {
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
my $res = $sth->execute($id);
|
my $res = $sth->execute($id);
|
||||||
if ( $res ) {
|
if ( !$res ) {
|
||||||
Error("Can't execute '$sql': ".$sth->errstr());
|
Error("Can't execute '$sql': ".$sth->errstr());
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
|
@ -812,7 +812,7 @@ shared_data The general mapped memory section
|
||||||
size The size, in bytes, of this section
|
size The size, in bytes, of this section
|
||||||
valid Flag indicating whether this section has been initialised
|
valid Flag indicating whether this section has been initialised
|
||||||
active Flag indicating whether this monitor is active (enabled/disabled)
|
active Flag indicating whether this monitor is active (enabled/disabled)
|
||||||
signal Flag indicating whether this monitor is reciving a valid signal
|
signal Flag indicating whether this monitor is receiving a valid signal
|
||||||
state The current monitor state, see the STATE constants below
|
state The current monitor state, see the STATE constants below
|
||||||
last_write_index The last index, in the image buffer, that an image has been saved to
|
last_write_index The last index, in the image buffer, that an image has been saved to
|
||||||
last_read_index The last index, in the image buffer, that an image has been analysed from
|
last_read_index The last index, in the image buffer, that an image has been analysed from
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
#
|
#
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
#
|
#
|
||||||
|
|
|
@ -454,6 +454,12 @@ MAIN: while( $loop ) {
|
||||||
my $Event = $fs_events->{$fs_event_id};
|
my $Event = $fs_events->{$fs_event_id};
|
||||||
|
|
||||||
if ( ! defined( $db_events->{$fs_event_id} ) ) {
|
if ( ! defined( $db_events->{$fs_event_id} ) ) {
|
||||||
|
# Long running zmaudits can find events that were created after we loaded all db events.
|
||||||
|
# So do a secondary lookup
|
||||||
|
if ( ZoneMinder::Event->find_one(Id=>$fs_event_id) ) {
|
||||||
|
Debug("$$Event{Id} found in secondary lookup.");
|
||||||
|
next;
|
||||||
|
}
|
||||||
my $age = $Event->age();
|
my $age = $Event->age();
|
||||||
|
|
||||||
if ( $age > $Config{ZM_AUDIT_MIN_AGE} ) {
|
if ( $age > $Config{ZM_AUDIT_MIN_AGE} ) {
|
||||||
|
|
|
@ -438,7 +438,7 @@ sub start {
|
||||||
|
|
||||||
$dbh = zmDbConnect(1);
|
$dbh = zmDbConnect(1);
|
||||||
# This logReinit is required. Not sure why.
|
# This logReinit is required. Not sure why.
|
||||||
#logReinit();
|
logReinit();
|
||||||
|
|
||||||
$process->{pid} = $cpid;
|
$process->{pid} = $cpid;
|
||||||
$process->{started} = time();
|
$process->{started} = time();
|
||||||
|
|
|
@ -353,8 +353,8 @@ if ( $version ) {
|
||||||
$version = $detaint_version;
|
$version = $detaint_version;
|
||||||
|
|
||||||
if ( ZM_VERSION eq $version ) {
|
if ( ZM_VERSION eq $version ) {
|
||||||
print( "\nDatabase already at version $version, update aborted.\n\n" );
|
print("\nDatabase already at version $version, update skipped.\n\n");
|
||||||
exit( 0 );
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
print( "\nInitiating database upgrade to version ".ZM_VERSION." from version $version\n" );
|
print( "\nInitiating database upgrade to version ".ZM_VERSION." from version $version\n" );
|
||||||
|
|
|
@ -174,7 +174,7 @@ Event::Event(
|
||||||
Error("Can't mkdir %s: %s", path, strerror(errno));
|
Error("Can't mkdir %s: %s", path, strerror(errno));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
path_ptr += snprintf(path, sizeof(path), "/%" PRIu64, id);
|
snprintf(path, sizeof(path), "/%" PRIu64, id);
|
||||||
if ( mkdir(path, 0755) ) {
|
if ( mkdir(path, 0755) ) {
|
||||||
if ( errno != EEXIST )
|
if ( errno != EEXIST )
|
||||||
Error("Can't mkdir %s: %s", path, strerror(errno));
|
Error("Can't mkdir %s: %s", path, strerror(errno));
|
||||||
|
|
|
@ -749,7 +749,7 @@ void Monitor::AddPrivacyBitmask( Zone *p_zones[] ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Monitor::State Monitor::GetState() const {
|
Monitor::State Monitor::GetState() const {
|
||||||
return( (State)shared_data->state );
|
return (State)shared_data->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Monitor::GetImage( int index, int scale ) {
|
int Monitor::GetImage( int index, int scale ) {
|
||||||
|
|
|
@ -238,7 +238,7 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
avformat_new_stream(oc, (AVCodec *)audio_in_ctx->codec);
|
avformat_new_stream(oc, (AVCodec *)audio_in_ctx->codec);
|
||||||
#endif
|
#endif
|
||||||
if ( !audio_out_stream ) {
|
if ( !audio_out_stream ) {
|
||||||
Error("Unable to create audio out stream\n");
|
Error("Unable to create audio out stream");
|
||||||
audio_out_stream = NULL;
|
audio_out_stream = NULL;
|
||||||
} else {
|
} else {
|
||||||
Debug(2, "setting parameters");
|
Debug(2, "setting parameters");
|
||||||
|
@ -265,7 +265,6 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
Debug(2, "Setting audio codec tag to %d",
|
Debug(2, "Setting audio codec tag to %d",
|
||||||
audio_out_ctx->codec_tag);
|
audio_out_ctx->codec_tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
audio_out_ctx = audio_out_stream->codec;
|
audio_out_ctx = audio_out_stream->codec;
|
||||||
ret = avcodec_copy_context(audio_out_ctx, audio_in_ctx);
|
ret = avcodec_copy_context(audio_out_ctx, audio_in_ctx);
|
||||||
|
@ -287,7 +286,7 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
} // end if is AAC
|
} // end if is AAC
|
||||||
|
|
||||||
if ( audio_out_stream ) {
|
if ( audio_out_stream ) {
|
||||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
if ( oc->oformat->flags & AVFMT_GLOBALHEADER ) {
|
||||||
#if LIBAVCODEC_VERSION_CHECK(56, 35, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(56, 35, 0, 64, 0)
|
||||||
audio_out_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
audio_out_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
|
||||||
#else
|
#else
|
||||||
|
@ -297,7 +296,6 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
}
|
}
|
||||||
} // end if audio_in_stream
|
} // end if audio_in_stream
|
||||||
|
|
||||||
|
|
||||||
video_last_pts = 0;
|
video_last_pts = 0;
|
||||||
video_last_dts = 0;
|
video_last_dts = 0;
|
||||||
audio_last_pts = 0;
|
audio_last_pts = 0;
|
||||||
|
@ -310,12 +308,11 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
|
|
||||||
bool VideoStore::open() {
|
bool VideoStore::open() {
|
||||||
/* open the out file, if needed */
|
/* open the out file, if needed */
|
||||||
if (!(out_format->flags & AVFMT_NOFILE)) {
|
if ( !(out_format->flags & AVFMT_NOFILE) ) {
|
||||||
ret = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE, NULL, NULL);
|
ret = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE, NULL, NULL);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
Error("Could not open out file '%s': %s\n", filename,
|
Error("Could not open out file '%s': %s\n", filename,
|
||||||
av_make_error_string(ret).c_str());
|
av_make_error_string(ret).c_str());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -339,9 +336,9 @@ bool VideoStore::open() {
|
||||||
} else if (av_dict_count(opts) != 0) {
|
} else if (av_dict_count(opts) != 0) {
|
||||||
Warning("some options not set\n");
|
Warning("some options not set\n");
|
||||||
}
|
}
|
||||||
if (opts) av_dict_free(&opts);
|
if ( opts ) av_dict_free(&opts);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
Error("Error occurred when writing out file header to %s: %s\n",
|
Error("Error occurred when writing out file header to %s: %s",
|
||||||
filename, av_make_error_string(ret).c_str());
|
filename, av_make_error_string(ret).c_str());
|
||||||
/* free the stream */
|
/* free the stream */
|
||||||
avio_closep(&oc->pb);
|
avio_closep(&oc->pb);
|
||||||
|
@ -506,13 +503,13 @@ bool VideoStore::setup_resampler() {
|
||||||
avcodec_find_decoder(audio_in_ctx->codec_id);
|
avcodec_find_decoder(audio_in_ctx->codec_id);
|
||||||
#endif
|
#endif
|
||||||
ret = avcodec_open2(audio_in_ctx, audio_in_codec, NULL);
|
ret = avcodec_open2(audio_in_ctx, audio_in_codec, NULL);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
Error("Can't open in codec!");
|
Error("Can't open in codec!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
audio_out_codec = avcodec_find_encoder(AV_CODEC_ID_AAC);
|
audio_out_codec = avcodec_find_encoder(AV_CODEC_ID_AAC);
|
||||||
if (!audio_out_codec) {
|
if ( !audio_out_codec ) {
|
||||||
Error("Could not find codec for AAC");
|
Error("Could not find codec for AAC");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -521,7 +518,6 @@ bool VideoStore::setup_resampler() {
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
// audio_out_ctx = audio_out_stream->codec;
|
// audio_out_ctx = audio_out_stream->codec;
|
||||||
audio_out_ctx = avcodec_alloc_context3(audio_out_codec);
|
audio_out_ctx = avcodec_alloc_context3(audio_out_codec);
|
||||||
|
|
||||||
if ( !audio_out_ctx ) {
|
if ( !audio_out_ctx ) {
|
||||||
Error("could not allocate codec ctx for AAC");
|
Error("could not allocate codec ctx for AAC");
|
||||||
audio_out_stream = NULL;
|
audio_out_stream = NULL;
|
||||||
|
@ -530,7 +526,7 @@ bool VideoStore::setup_resampler() {
|
||||||
|
|
||||||
Debug(2, "Have audio_out_ctx");
|
Debug(2, "Have audio_out_ctx");
|
||||||
// Now copy them to the out stream
|
// Now copy them to the out stream
|
||||||
audio_out_stream = avformat_new_stream(oc, NULL);
|
audio_out_stream = avformat_new_stream(oc, audio_out_codec);
|
||||||
#else
|
#else
|
||||||
audio_out_stream = avformat_new_stream(oc, NULL);
|
audio_out_stream = avformat_new_stream(oc, NULL);
|
||||||
audio_out_ctx = audio_out_stream->codec;
|
audio_out_ctx = audio_out_stream->codec;
|
||||||
|
@ -554,28 +550,27 @@ bool VideoStore::setup_resampler() {
|
||||||
audio_out_ctx->channel_layout = av_get_default_channel_layout(audio_out_ctx->channels);
|
audio_out_ctx->channel_layout = av_get_default_channel_layout(audio_out_ctx->channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_out_codec->supported_samplerates) {
|
if ( audio_out_codec->supported_samplerates ) {
|
||||||
int found = 0;
|
int found = 0;
|
||||||
for (unsigned int i = 0; audio_out_codec->supported_samplerates[i];
|
for ( unsigned int i = 0; audio_out_codec->supported_samplerates[i]; i++) {
|
||||||
i++) {
|
if ( audio_out_ctx->sample_rate ==
|
||||||
if (audio_out_ctx->sample_rate ==
|
audio_out_codec->supported_samplerates[i] ) {
|
||||||
audio_out_codec->supported_samplerates[i]) {
|
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found) {
|
if ( found ) {
|
||||||
Debug(3, "Sample rate is good");
|
Debug(3, "Sample rate is good");
|
||||||
} else {
|
} else {
|
||||||
audio_out_ctx->sample_rate =
|
audio_out_ctx->sample_rate =
|
||||||
audio_out_codec->supported_samplerates[0];
|
audio_out_codec->supported_samplerates[0];
|
||||||
Debug(1, "Sampel rate is no good, setting to (%d)",
|
Debug(1, "Sample rate is no good, setting to (%d)",
|
||||||
audio_out_codec->supported_samplerates[0]);
|
audio_out_codec->supported_samplerates[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check that the encoder supports s16 pcm in */
|
/* check that the encoder supports s16 pcm in */
|
||||||
if (!check_sample_fmt(audio_out_codec, audio_out_ctx->sample_fmt)) {
|
if ( !check_sample_fmt(audio_out_codec, audio_out_ctx->sample_fmt) ) {
|
||||||
Debug(3, "Encoder does not support sample format %s, setting to FLTP",
|
Debug(3, "Encoder does not support sample format %s, setting to FLTP",
|
||||||
av_get_sample_fmt_name(audio_out_ctx->sample_fmt));
|
av_get_sample_fmt_name(audio_out_ctx->sample_fmt));
|
||||||
audio_out_ctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
audio_out_ctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
||||||
|
@ -584,16 +579,6 @@ bool VideoStore::setup_resampler() {
|
||||||
audio_out_ctx->time_base =
|
audio_out_ctx->time_base =
|
||||||
(AVRational){1, audio_out_ctx->sample_rate};
|
(AVRational){1, audio_out_ctx->sample_rate};
|
||||||
|
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
|
||||||
ret = avcodec_parameters_from_context(audio_out_stream->codecpar,
|
|
||||||
audio_out_ctx);
|
|
||||||
if (ret < 0) {
|
|
||||||
Error("Could not initialize stream parameteres");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
AVDictionary *opts = NULL;
|
AVDictionary *opts = NULL;
|
||||||
if ( (ret = av_dict_set(&opts, "strict", "experimental", 0)) < 0 ) {
|
if ( (ret = av_dict_set(&opts, "strict", "experimental", 0)) < 0 ) {
|
||||||
Error("Couldn't set experimental");
|
Error("Couldn't set experimental");
|
||||||
|
@ -608,6 +593,15 @@ bool VideoStore::setup_resampler() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
ret = avcodec_parameters_from_context(
|
||||||
|
audio_out_stream->codecpar, audio_out_ctx);
|
||||||
|
if ( ret < 0 ) {
|
||||||
|
Error("Could not initialize stream parameteres");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Debug(1,
|
Debug(1,
|
||||||
"Audio out bit_rate (%d) sample_rate(%d) channels(%d) fmt(%d) "
|
"Audio out bit_rate (%d) sample_rate(%d) channels(%d) fmt(%d) "
|
||||||
"layout(%d) frame_size(%d)",
|
"layout(%d) frame_size(%d)",
|
||||||
|
@ -616,13 +610,13 @@ bool VideoStore::setup_resampler() {
|
||||||
audio_out_ctx->channel_layout, audio_out_ctx->frame_size);
|
audio_out_ctx->channel_layout, audio_out_ctx->frame_size);
|
||||||
|
|
||||||
/** Create a new frame to store the audio samples. */
|
/** Create a new frame to store the audio samples. */
|
||||||
if (!(in_frame = zm_av_frame_alloc())) {
|
if ( !(in_frame = zm_av_frame_alloc()) ) {
|
||||||
Error("Could not allocate in frame");
|
Error("Could not allocate in frame");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a new frame to store the audio samples. */
|
/** Create a new frame to store the audio samples. */
|
||||||
if (!(out_frame = zm_av_frame_alloc())) {
|
if ( !(out_frame = zm_av_frame_alloc()) ) {
|
||||||
Error("Could not allocate out frame");
|
Error("Could not allocate out frame");
|
||||||
av_frame_free(&in_frame);
|
av_frame_free(&in_frame);
|
||||||
return false;
|
return false;
|
||||||
|
@ -630,20 +624,20 @@ bool VideoStore::setup_resampler() {
|
||||||
|
|
||||||
// Setup the audio resampler
|
// Setup the audio resampler
|
||||||
resample_ctx = avresample_alloc_context();
|
resample_ctx = avresample_alloc_context();
|
||||||
if (!resample_ctx) {
|
if ( !resample_ctx ) {
|
||||||
Error("Could not allocate resample ctx\n");
|
Error("Could not allocate resample ctx");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some formats (i.e. WAV) do not produce the proper channel layout
|
// Some formats (i.e. WAV) do not produce the proper channel layout
|
||||||
if (audio_in_ctx->channel_layout == 0) {
|
uint64_t layout = av_get_channel_layout("mono");
|
||||||
uint64_t layout = av_get_channel_layout("mono");
|
if ( audio_in_ctx->channel_layout == 0 ) {
|
||||||
av_opt_set_int(resample_ctx, "in_channel_layout",
|
av_opt_set_int(resample_ctx, "in_channel_layout", layout, 0);
|
||||||
av_get_channel_layout("mono"), 0);
|
Debug(1, "Bad in channel layout. Need to set it to mono (%d).", layout);
|
||||||
Debug(1, "Bad channel layout. Need to set it to mono (%d).", layout);
|
|
||||||
} else {
|
} else {
|
||||||
av_opt_set_int(resample_ctx, "in_channel_layout",
|
av_opt_set_int(resample_ctx, "in_channel_layout",
|
||||||
audio_in_ctx->channel_layout, 0);
|
audio_in_ctx->channel_layout, 0);
|
||||||
|
layout = audio_in_ctx->channel_layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_opt_set_int(resample_ctx, "in_sample_fmt",
|
av_opt_set_int(resample_ctx, "in_sample_fmt",
|
||||||
|
@ -655,7 +649,7 @@ bool VideoStore::setup_resampler() {
|
||||||
// av_opt_set_int( resample_ctx, "out_channel_layout",
|
// av_opt_set_int( resample_ctx, "out_channel_layout",
|
||||||
// audio_out_ctx->channel_layout, 0);
|
// audio_out_ctx->channel_layout, 0);
|
||||||
av_opt_set_int(resample_ctx, "out_channel_layout",
|
av_opt_set_int(resample_ctx, "out_channel_layout",
|
||||||
av_get_channel_layout("mono"), 0);
|
layout, 0);
|
||||||
av_opt_set_int(resample_ctx, "out_sample_fmt",
|
av_opt_set_int(resample_ctx, "out_sample_fmt",
|
||||||
audio_out_ctx->sample_fmt, 0);
|
audio_out_ctx->sample_fmt, 0);
|
||||||
av_opt_set_int(resample_ctx, "out_sample_rate",
|
av_opt_set_int(resample_ctx, "out_sample_rate",
|
||||||
|
@ -664,38 +658,13 @@ bool VideoStore::setup_resampler() {
|
||||||
audio_out_ctx->channels, 0);
|
audio_out_ctx->channels, 0);
|
||||||
|
|
||||||
ret = avresample_open(resample_ctx);
|
ret = avresample_open(resample_ctx);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
Error("Could not open resample ctx\n");
|
Error("Could not open resample ctx");
|
||||||
return false;
|
return false;
|
||||||
|
} else {
|
||||||
|
Debug(2, "Success opening resampler");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
* Allocate as many pointers as there are audio channels.
|
|
||||||
* Each pointer will later point to the audio samples of the corresponding
|
|
||||||
* channels (although it may be NULL for interleaved formats).
|
|
||||||
*/
|
|
||||||
if (!( converted_in_samples = reinterpret_cast<uint8_t *>calloc( audio_out_ctx->channels, sizeof(*converted_in_samples))) ) {
|
|
||||||
Error("Could not allocate converted in sample pointers\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Allocate memory for the samples of all channels in one consecutive
|
|
||||||
* block for convenience.
|
|
||||||
*/
|
|
||||||
if ( (ret = av_samples_alloc( &converted_in_samples, NULL,
|
|
||||||
audio_out_ctx->channels,
|
|
||||||
audio_out_ctx->frame_size,
|
|
||||||
audio_out_ctx->sample_fmt, 0)) < 0 ) {
|
|
||||||
Error("Could not allocate converted in samples (error '%s')\n",
|
|
||||||
av_make_error_string(ret).c_str());
|
|
||||||
|
|
||||||
av_freep(converted_in_samples);
|
|
||||||
free(converted_in_samples);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out_frame->nb_samples = audio_out_ctx->frame_size;
|
out_frame->nb_samples = audio_out_ctx->frame_size;
|
||||||
out_frame->format = audio_out_ctx->sample_fmt;
|
out_frame->format = audio_out_ctx->sample_fmt;
|
||||||
out_frame->channel_layout = audio_out_ctx->channel_layout;
|
out_frame->channel_layout = audio_out_ctx->channel_layout;
|
||||||
|
@ -703,21 +672,24 @@ bool VideoStore::setup_resampler() {
|
||||||
// The codec gives us the frame size, in samples, we calculate the size of the
|
// The codec gives us the frame size, in samples, we calculate the size of the
|
||||||
// samples buffer in bytes
|
// samples buffer in bytes
|
||||||
unsigned int audioSampleBuffer_size = av_samples_get_buffer_size(
|
unsigned int audioSampleBuffer_size = av_samples_get_buffer_size(
|
||||||
NULL, audio_out_ctx->channels, audio_out_ctx->frame_size,
|
NULL, audio_out_ctx->channels,
|
||||||
|
audio_out_ctx->frame_size,
|
||||||
audio_out_ctx->sample_fmt, 0);
|
audio_out_ctx->sample_fmt, 0);
|
||||||
converted_in_samples = (uint8_t *)av_malloc(audioSampleBuffer_size);
|
converted_in_samples = (uint8_t *)av_malloc(audioSampleBuffer_size);
|
||||||
|
|
||||||
if (!converted_in_samples) {
|
if ( !converted_in_samples ) {
|
||||||
Error("Could not allocate converted in sample pointers\n");
|
Error("Could not allocate converted in sample pointers");
|
||||||
return false;
|
return false;
|
||||||
|
} else {
|
||||||
|
Debug(2, "Frame Size %d, sample buffer size %d", audio_out_ctx->frame_size, audioSampleBuffer_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the data pointers in the AVFrame
|
// Setup the data pointers in the AVFrame
|
||||||
if (avcodec_fill_audio_frame(out_frame, audio_out_ctx->channels,
|
if ( avcodec_fill_audio_frame(out_frame, audio_out_ctx->channels,
|
||||||
audio_out_ctx->sample_fmt,
|
audio_out_ctx->sample_fmt,
|
||||||
(const uint8_t *)converted_in_samples,
|
(const uint8_t *)converted_in_samples,
|
||||||
audioSampleBuffer_size, 0) < 0) {
|
audioSampleBuffer_size, 0) < 0) {
|
||||||
Error("Could not allocate converted in sample pointers\n");
|
Error("Could not allocate converted in sample pointers");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
src/zmu.cpp
13
src/zmu.cpp
|
@ -463,10 +463,10 @@ int main(int argc, char *argv[]) {
|
||||||
} // end if auth
|
} // end if auth
|
||||||
|
|
||||||
if ( mon_id > 0 ) {
|
if ( mon_id > 0 ) {
|
||||||
fprintf(stderr,"Monitor %d\n", mon_id);
|
//fprintf(stderr,"Monitor %d\n", mon_id);
|
||||||
Monitor *monitor = Monitor::Load(mon_id, function&(ZMU_QUERY|ZMU_ZONES), Monitor::QUERY);
|
Monitor *monitor = Monitor::Load(mon_id, function&(ZMU_QUERY|ZMU_ZONES), Monitor::QUERY);
|
||||||
if ( monitor ) {
|
if ( monitor ) {
|
||||||
fprintf(stderr,"Monitor %d(%s)\n", monitor->Id(), monitor->Name());
|
//fprintf(stderr,"Monitor %d(%s)\n", monitor->Id(), monitor->Name());
|
||||||
if ( verbose ) {
|
if ( verbose ) {
|
||||||
printf("Monitor %d(%s)\n", monitor->Id(), monitor->Name());
|
printf("Monitor %d(%s)\n", monitor->Id(), monitor->Name());
|
||||||
}
|
}
|
||||||
|
@ -479,9 +479,9 @@ int main(int argc, char *argv[]) {
|
||||||
bool have_output = false;
|
bool have_output = false;
|
||||||
if ( function & ZMU_STATE ) {
|
if ( function & ZMU_STATE ) {
|
||||||
Monitor::State state = monitor->GetState();
|
Monitor::State state = monitor->GetState();
|
||||||
if ( verbose )
|
if ( verbose ) {
|
||||||
printf("Current state: %s\n", state==Monitor::ALARM?"Alarm":(state==Monitor::ALERT?"Alert":"Idle"));
|
printf("Current state: %s\n", state==Monitor::ALARM?"Alarm":(state==Monitor::ALERT?"Alert":"Idle"));
|
||||||
else {
|
} else {
|
||||||
if ( have_output ) printf("%c", separator);
|
if ( have_output ) printf("%c", separator);
|
||||||
printf("%d", state);
|
printf("%d", state);
|
||||||
have_output = true;
|
have_output = true;
|
||||||
|
@ -560,6 +560,11 @@ int main(int argc, char *argv[]) {
|
||||||
if ( verbose )
|
if ( verbose )
|
||||||
printf( "Forcing alarm on\n" );
|
printf( "Forcing alarm on\n" );
|
||||||
monitor->ForceAlarmOn( config.forced_alarm_score, "Forced Web" );
|
monitor->ForceAlarmOn( config.forced_alarm_score, "Forced Web" );
|
||||||
|
while ( monitor->GetState() != Monitor::ALARM ) {
|
||||||
|
// Wait for monitor to notice.
|
||||||
|
usleep(1000);
|
||||||
|
}
|
||||||
|
printf( "Alarmed event id: %" PRIu64 "\n", monitor->GetLastEventId() );
|
||||||
}
|
}
|
||||||
if ( function & ZMU_NOALARM ) {
|
if ( function & ZMU_NOALARM ) {
|
||||||
if ( verbose )
|
if ( verbose )
|
||||||
|
|
|
@ -76,7 +76,7 @@ fi;
|
||||||
|
|
||||||
if [ "$DISTROS" == "" ]; then
|
if [ "$DISTROS" == "" ]; then
|
||||||
if [ "$RELEASE" != "" ]; then
|
if [ "$RELEASE" != "" ]; then
|
||||||
DISTROS="xenial,bionic,trusty"
|
DISTROS="xenial,bionic,cosmic,disco,trusty"
|
||||||
else
|
else
|
||||||
DISTROS=`lsb_release -a 2>/dev/null | grep Codename | awk '{print $2}'`;
|
DISTROS=`lsb_release -a 2>/dev/null | grep Codename | awk '{print $2}'`;
|
||||||
fi;
|
fi;
|
||||||
|
|
|
@ -65,18 +65,17 @@ class HostController extends AppController {
|
||||||
$isZmAuth = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH')))['Config']['Value'];
|
$isZmAuth = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH')))['Config']['Value'];
|
||||||
|
|
||||||
if ( $isZmAuth ) {
|
if ( $isZmAuth ) {
|
||||||
|
// In future, we may want to completely move to AUTH_HASH_LOGINS and return &auth= for all cases
|
||||||
require_once "../../../includes/auth.php"; # in the event we directly call getCredentials.json
|
require_once "../../../includes/auth.php"; # in the event we directly call getCredentials.json
|
||||||
$this->Session->read('user'); # this is needed for command line/curl to recognize a session
|
$this->Session->read('user'); # this is needed for command line/curl to recognize a session
|
||||||
$zmAuthRelay = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_RELAY')))['Config']['Value'];
|
$zmAuthRelay = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_RELAY')))['Config']['Value'];
|
||||||
if ( $zmAuthRelay == 'hashed' ) {
|
if ( $zmAuthRelay == 'hashed' ) {
|
||||||
$zmAuthHashIps = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_HASH_IPS')))['Config']['Value'];
|
$zmAuthHashIps = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_HASH_IPS')))['Config']['Value'];
|
||||||
$credentials = 'auth='.generateAuthHash($zmAuthHashIps);
|
$credentials = 'auth='.generateAuthHash($zmAuthHashIps);
|
||||||
} else if ( $zmAuthRelay == 'plain' ) {
|
} else {
|
||||||
// user will need to append the store password here
|
// user will need to append the store password here
|
||||||
$credentials = 'user='.$this->Session->read('user.Username').'&pass=';
|
$credentials = 'user='.$this->Session->read('user.Username').'&pass=';
|
||||||
$appendPassword = 1;
|
$appendPassword = 1;
|
||||||
} else if ( $zmAuthRelay == 'none' ) {
|
|
||||||
$credentials = 'user='.$this->Session->read('user.Username');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return array($credentials, $appendPassword);
|
return array($credentials, $appendPassword);
|
||||||
|
|
|
@ -100,7 +100,7 @@ class Event extends AppModel {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
public function Relative_Path($event) {
|
public function Relative_Path($event) {
|
||||||
$event_path = '';
|
$event_path = '';
|
||||||
|
|
||||||
if ( $event['Scheme'] == 'Deep' ) {
|
if ( $event['Scheme'] == 'Deep' ) {
|
||||||
|
|
|
@ -198,32 +198,34 @@ class Event {
|
||||||
|
|
||||||
public function getStreamSrc( $args=array(), $querySep='&' ) {
|
public function getStreamSrc( $args=array(), $querySep='&' ) {
|
||||||
|
|
||||||
$streamSrc = ZM_BASE_PROTOCOL.'://';
|
$streamSrc = '';
|
||||||
|
$Server = null;
|
||||||
if ( $this->Storage()->ServerId() ) {
|
if ( $this->Storage()->ServerId() ) {
|
||||||
|
# The Event may have been moved to Storage on another server,
|
||||||
|
# So prefer viewing the Event from the Server that is actually
|
||||||
|
# storing the video
|
||||||
$Server = $this->Storage()->Server();
|
$Server = $this->Storage()->Server();
|
||||||
$streamSrc .= $Server->Hostname();
|
|
||||||
if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= ':'.(ZM_MIN_STREAMING_PORT+$this->{'MonitorId'});
|
|
||||||
}
|
|
||||||
} else if ( $this->Monitor()->ServerId() ) {
|
} else if ( $this->Monitor()->ServerId() ) {
|
||||||
# Assume that the server that recorded it has it
|
# Assume that the server that recorded it has it
|
||||||
$Server = $this->Monitor()->Server();
|
$Server = $this->Monitor()->Server();
|
||||||
$streamSrc .= $Server->Hostname();
|
|
||||||
if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= ':'.(ZM_MIN_STREAMING_PORT+$this->{'MonitorId'});
|
|
||||||
}
|
|
||||||
} else if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= $_SERVER['SERVER_NAME'].':'.(ZM_MIN_STREAMING_PORT+$this->{'MonitorId'});
|
|
||||||
} else {
|
} else {
|
||||||
$streamSrc .= $_SERVER['HTTP_HOST'];
|
# A default Server will result in the use of ZM_DIR_EVENTS
|
||||||
|
$Server = new Server();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# If we are in a multi-port setup, then use the multiport, else by
|
||||||
|
# passing null Server->Url will use the Port set in the Server setting
|
||||||
|
$streamSrc .= $Server->Url(
|
||||||
|
ZM_MIN_STREAMING_PORT ?
|
||||||
|
ZM_MIN_STREAMING_PORT+$this->{'MonitorId'} :
|
||||||
|
null);
|
||||||
|
|
||||||
if ( $this->{'DefaultVideo'} and $args['mode'] != 'jpeg' ) {
|
if ( $this->{'DefaultVideo'} and $args['mode'] != 'jpeg' ) {
|
||||||
$streamSrc .= ( ZM_BASE_PATH != '/' ? ZM_BASE_PATH : '' ).'/index.php';
|
$streamSrc .= $Server->PathToIndex();
|
||||||
$args['eid'] = $this->{'Id'};
|
$args['eid'] = $this->{'Id'};
|
||||||
$args['view'] = 'view_video';
|
$args['view'] = 'view_video';
|
||||||
} else {
|
} else {
|
||||||
$streamSrc .= ZM_PATH_ZMS;
|
$streamSrc .= $Server->PathToZMS();
|
||||||
|
|
||||||
$args['source'] = 'event';
|
$args['source'] = 'event';
|
||||||
$args['event'] = $this->{'Id'};
|
$args['event'] = $this->{'Id'};
|
||||||
|
@ -238,10 +240,10 @@ class Event {
|
||||||
if ( ZM_OPT_USE_AUTH ) {
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
||||||
$args['auth'] = generateAuthHash(ZM_AUTH_HASH_IPS);
|
$args['auth'] = generateAuthHash(ZM_AUTH_HASH_IPS);
|
||||||
} elseif ( ZM_AUTH_RELAY == 'plain' ) {
|
} else if ( ZM_AUTH_RELAY == 'plain' ) {
|
||||||
$args['user'] = $_SESSION['username'];
|
$args['user'] = $_SESSION['username'];
|
||||||
$args['pass'] = $_SESSION['password'];
|
$args['pass'] = $_SESSION['password'];
|
||||||
} elseif ( ZM_AUTH_RELAY == 'none' ) {
|
} else if ( ZM_AUTH_RELAY == 'none' ) {
|
||||||
$args['user'] = $_SESSION['username'];
|
$args['user'] = $_SESSION['username'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,27 +330,21 @@ class Event {
|
||||||
# The thumbnail is theoretically the image with the most motion.
|
# The thumbnail is theoretically the image with the most motion.
|
||||||
# We always store at least 1 image when capturing
|
# We always store at least 1 image when capturing
|
||||||
|
|
||||||
$streamSrc = ZM_BASE_PROTOCOL.'://';
|
$streamSrc = '';
|
||||||
|
$Server = null;
|
||||||
if ( $this->Storage()->ServerId() ) {
|
if ( $this->Storage()->ServerId() ) {
|
||||||
$Server = $this->Storage()->Server();
|
$Server = $this->Storage()->Server();
|
||||||
$streamSrc .= $Server->Hostname();
|
|
||||||
if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= ':'.(ZM_MIN_STREAMING_PORT+$this->{'MonitorId'});
|
|
||||||
}
|
|
||||||
} else if ( $this->Monitor()->ServerId() ) {
|
} else if ( $this->Monitor()->ServerId() ) {
|
||||||
|
# Assume that the server that recorded it has it
|
||||||
$Server = $this->Monitor()->Server();
|
$Server = $this->Monitor()->Server();
|
||||||
$streamSrc .= $Server->Hostname();
|
|
||||||
if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= ':'.(ZM_MIN_STREAMING_PORT+$this->{'MonitorId'});
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= $_SERVER['SERVER_NAME'].':'.(ZM_MIN_STREAMING_PORT+$this->{'MonitorId'});
|
|
||||||
} else {
|
} else {
|
||||||
$streamSrc .= $_SERVER['HTTP_HOST'];
|
$Server = new Server();
|
||||||
}
|
}
|
||||||
|
$streamSrc .= $Server->UrlToIndex(
|
||||||
|
ZM_MIN_STREAMING_PORT ?
|
||||||
|
ZM_MIN_STREAMING_PORT+$this->{'MonitorId'} :
|
||||||
|
null);
|
||||||
|
|
||||||
$streamSrc .= ( ZM_BASE_PATH != '/' ? ZM_BASE_PATH : '' ).'/index.php';
|
|
||||||
$args['eid'] = $this->{'Id'};
|
$args['eid'] = $this->{'Id'};
|
||||||
$args['fid'] = 'snapshot';
|
$args['fid'] = 'snapshot';
|
||||||
$args['view'] = 'image';
|
$args['view'] = 'image';
|
||||||
|
@ -358,10 +354,10 @@ class Event {
|
||||||
if ( ZM_OPT_USE_AUTH ) {
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
||||||
$args['auth'] = generateAuthHash(ZM_AUTH_HASH_IPS);
|
$args['auth'] = generateAuthHash(ZM_AUTH_HASH_IPS);
|
||||||
} elseif ( ZM_AUTH_RELAY == 'plain' ) {
|
} else if ( ZM_AUTH_RELAY == 'plain' ) {
|
||||||
$args['user'] = $_SESSION['username'];
|
$args['user'] = $_SESSION['username'];
|
||||||
$args['pass'] = $_SESSION['password'];
|
$args['pass'] = $_SESSION['password'];
|
||||||
} elseif ( ZM_AUTH_RELAY == 'none' ) {
|
} else if ( ZM_AUTH_RELAY == 'none' ) {
|
||||||
$args['user'] = $_SESSION['username'];
|
$args['user'] = $_SESSION['username'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -576,7 +572,7 @@ class Event {
|
||||||
$Server = $Storage->ServerId() ? $Storage->Server() : $this->Monitor()->Server();
|
$Server = $Storage->ServerId() ? $Storage->Server() : $this->Monitor()->Server();
|
||||||
if ( $Server->Id() != ZM_SERVER_ID ) {
|
if ( $Server->Id() != ZM_SERVER_ID ) {
|
||||||
|
|
||||||
$url = $Server->Url() . '/zm/api/events/'.$this->{'Id'}.'.json';
|
$url = $Server->UrlToApi() . '/events/'.$this->{'Id'}.'.json';
|
||||||
if ( ZM_OPT_USE_AUTH ) {
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
||||||
$url .= '?auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
$url .= '?auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
||||||
|
@ -620,7 +616,7 @@ class Event {
|
||||||
$Server = $Storage->ServerId() ? $Storage->Server() : $this->Monitor()->Server();
|
$Server = $Storage->ServerId() ? $Storage->Server() : $this->Monitor()->Server();
|
||||||
if ( $Server->Id() != ZM_SERVER_ID ) {
|
if ( $Server->Id() != ZM_SERVER_ID ) {
|
||||||
|
|
||||||
$url = $Server->Url() . '/zm/api/events/'.$this->{'Id'}.'.json';
|
$url = $Server->UrlToApi() . '/events/'.$this->{'Id'}.'.json';
|
||||||
if ( ZM_OPT_USE_AUTH ) {
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
||||||
$url .= '?auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
$url .= '?auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
||||||
|
|
|
@ -280,21 +280,12 @@ private $control_fields = array(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getStreamSrc( $args, $querySep='&' ) {
|
public function getStreamSrc($args, $querySep='&') {
|
||||||
|
|
||||||
$streamSrc = ZM_BASE_PROTOCOL.'://';
|
$streamSrc = $this->Server()->UrlToZMS(
|
||||||
if ( isset($this->{'ServerId'}) and $this->{'ServerId'} ) {
|
ZM_MIN_STREAMING_PORT ?
|
||||||
$Server = new Server( $this->{'ServerId'} );
|
ZM_MIN_STREAMING_PORT+$this->{'Id'} :
|
||||||
$streamSrc .= $Server->Hostname();
|
null);
|
||||||
if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= ':'.(ZM_MIN_STREAMING_PORT+$this->{'Id'});
|
|
||||||
}
|
|
||||||
} else if ( ZM_MIN_STREAMING_PORT ) {
|
|
||||||
$streamSrc .= $_SERVER['SERVER_NAME'].':'.(ZM_MIN_STREAMING_PORT+$this->{'Id'});
|
|
||||||
} else {
|
|
||||||
$streamSrc .= $_SERVER['HTTP_HOST'];
|
|
||||||
}
|
|
||||||
$streamSrc .= ZM_PATH_ZMS;
|
|
||||||
|
|
||||||
$args['monitor'] = $this->{'Id'};
|
$args['monitor'] = $this->{'Id'};
|
||||||
|
|
||||||
|
@ -315,9 +306,9 @@ private $control_fields = array(
|
||||||
$args['rand'] = time();
|
$args['rand'] = time();
|
||||||
}
|
}
|
||||||
|
|
||||||
$streamSrc .= '?'.http_build_query( $args,'', $querySep );
|
$streamSrc .= '?'.http_build_query($args,'', $querySep);
|
||||||
|
|
||||||
return( $streamSrc );
|
return $streamSrc;
|
||||||
} // end function getStreamSrc
|
} // end function getStreamSrc
|
||||||
|
|
||||||
public function Width($new = null) {
|
public function Width($new = null) {
|
||||||
|
@ -460,7 +451,7 @@ private $control_fields = array(
|
||||||
} else if ( $this->ServerId() ) {
|
} else if ( $this->ServerId() ) {
|
||||||
$Server = $this->Server();
|
$Server = $this->Server();
|
||||||
|
|
||||||
$url = ZM_BASE_PROTOCOL . '://'.$Server->Hostname().'/zm/api/monitors/'.$this->{'Id'}.'.json';
|
$url = $Server->UrlToApi().'/monitors/'.$this->{'Id'}.'.json';
|
||||||
if ( ZM_OPT_USE_AUTH ) {
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
||||||
$url .= '?auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
$url .= '?auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
||||||
|
@ -600,13 +591,15 @@ private $control_fields = array(
|
||||||
$source = preg_replace( '/^.*\//', '', $this->{'Path'} );
|
$source = preg_replace( '/^.*\//', '', $this->{'Path'} );
|
||||||
} elseif ( $this->{'Type'} == 'Ffmpeg' || $this->{'Type'} == 'Libvlc' || $this->{'Type'} == 'WebSite' ) {
|
} elseif ( $this->{'Type'} == 'Ffmpeg' || $this->{'Type'} == 'Libvlc' || $this->{'Type'} == 'WebSite' ) {
|
||||||
$url_parts = parse_url( $this->{'Path'} );
|
$url_parts = parse_url( $this->{'Path'} );
|
||||||
if ( ZM_WEB_FILTER_SOURCE == 'Hostname' ) { # Filter out everything but the hostname
|
if ( ZM_WEB_FILTER_SOURCE == 'Hostname' ) {
|
||||||
|
# Filter out everything but the hostname
|
||||||
if ( isset($url_parts['host']) ) {
|
if ( isset($url_parts['host']) ) {
|
||||||
$source = $url_parts['host'];
|
$source = $url_parts['host'];
|
||||||
} else {
|
} else {
|
||||||
$source = $this->{'Path'};
|
$source = $this->{'Path'};
|
||||||
}
|
}
|
||||||
} elseif ( ZM_WEB_FILTER_SOURCE == "NoCredentials" ) { # Filter out sensitive and common items
|
} elseif ( ZM_WEB_FILTER_SOURCE == "NoCredentials" ) {
|
||||||
|
# Filter out sensitive and common items
|
||||||
unset($url_parts['user']);
|
unset($url_parts['user']);
|
||||||
unset($url_parts['pass']);
|
unset($url_parts['pass']);
|
||||||
#unset($url_parts['scheme']);
|
#unset($url_parts['scheme']);
|
||||||
|
@ -625,8 +618,8 @@ private $control_fields = array(
|
||||||
return $source;
|
return $source;
|
||||||
} // end function Source
|
} // end function Source
|
||||||
|
|
||||||
public function Url() {
|
public function UrlToIndex() {
|
||||||
return $this->Server()->Url( ZM_MIN_STREAMING_PORT ? (ZM_MIN_STREAMING_PORT+$this->Id()) : null );
|
return $this->Server()->UrlToIndex(ZM_MIN_STREAMING_PORT ? (ZM_MIN_STREAMING_PORT+$this->Id()) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end class Monitor
|
} // end class Monitor
|
||||||
|
|
|
@ -5,23 +5,27 @@ $server_cache = array();
|
||||||
|
|
||||||
class Server {
|
class Server {
|
||||||
private $defaults = array(
|
private $defaults = array(
|
||||||
'Id' => null,
|
'Id' => null,
|
||||||
'Name' => '',
|
'Name' => '',
|
||||||
'Hostname' => '',
|
'Protocol' => '',
|
||||||
'zmaudit' => 1,
|
'Hostname' => '',
|
||||||
'zmstats' => 1,
|
'Port' => null,
|
||||||
'zmtrigger' => 0,
|
'PathToIndex' => '/zm/index.php',
|
||||||
|
'PathToZMS' => ZM_PATH_ZMS,
|
||||||
|
'PathToApi' => '/zm/api',
|
||||||
|
'zmaudit' => 1,
|
||||||
|
'zmstats' => 1,
|
||||||
|
'zmtrigger' => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public function __construct($IdOrRow = NULL) {
|
||||||
public function __construct( $IdOrRow = NULL ) {
|
global $server_cache;
|
||||||
global $server_cache;
|
|
||||||
$row = NULL;
|
$row = NULL;
|
||||||
if ( $IdOrRow ) {
|
if ( $IdOrRow ) {
|
||||||
if ( is_integer($IdOrRow) or ctype_digit($IdOrRow) ) {
|
if ( is_integer($IdOrRow) or ctype_digit($IdOrRow) ) {
|
||||||
$row = dbFetchOne('SELECT * FROM Servers WHERE Id=?', NULL, array($IdOrRow));
|
$row = dbFetchOne('SELECT * FROM Servers WHERE Id=?', NULL, array($IdOrRow));
|
||||||
if ( !$row ) {
|
if ( !$row ) {
|
||||||
Error("Unable to load Server record for Id=" . $IdOrRow);
|
Error('Unable to load Server record for Id='.$IdOrRow);
|
||||||
}
|
}
|
||||||
} elseif ( is_array($IdOrRow) ) {
|
} elseif ( is_array($IdOrRow) ) {
|
||||||
$row = $IdOrRow;
|
$row = $IdOrRow;
|
||||||
|
@ -33,32 +37,95 @@ class Server {
|
||||||
}
|
}
|
||||||
$server_cache[$row['Id']] = $this;
|
$server_cache[$row['Id']] = $this;
|
||||||
} else {
|
} else {
|
||||||
$this->{'Name'} = '';
|
# Set defaults
|
||||||
$this->{'Hostname'} = '';
|
foreach ( $this->defaults as $k => $v ) $this->{$k} = $v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function Hostname( $new = null ) {
|
||||||
|
if ( $new != null )
|
||||||
|
$this->{'Hostname'} = $new;
|
||||||
|
|
||||||
|
if ( isset( $this->{'Hostname'}) and ( $this->{'Hostname'} != '' ) ) {
|
||||||
|
return $this->{'Hostname'};
|
||||||
|
} else if ( $this->Id() ) {
|
||||||
|
return $this->{'Name'};
|
||||||
|
}
|
||||||
|
$result = explode(':',$_SERVER['HTTP_HOST']);
|
||||||
|
return $result[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Protocol( $new = null ) {
|
||||||
|
if ( $new != null )
|
||||||
|
$this->{'Protocol'} = $new;
|
||||||
|
|
||||||
|
if ( isset($this->{'Protocol'}) and ( $this->{'Protocol'} != '' ) ) {
|
||||||
|
return $this->{'Protocol'};
|
||||||
|
}
|
||||||
|
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Port( $new = '' ) {
|
||||||
|
if ( $new != '' )
|
||||||
|
$this->{'Port'} = $new;
|
||||||
|
|
||||||
|
if ( isset($this->{'Port'}) and $this->{'Port'} ) {
|
||||||
|
return $this->{'Port'};
|
||||||
|
}
|
||||||
|
return $_SERVER['SERVER_PORT'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function PathToZMS( $new = null ) {
|
||||||
|
if ( $new != null )
|
||||||
|
$this{'PathToZMS'} = $new;
|
||||||
|
if ( $this->Id() and $this->{'PathToZMS'} ) {
|
||||||
|
return $this->{'PathToZMS'};
|
||||||
|
} else {
|
||||||
|
return ZM_PATH_ZMS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function UrlToZMS( $port = null ) {
|
||||||
|
return $this->Url($port).$this->PathToZMS();
|
||||||
|
}
|
||||||
|
|
||||||
public function Url( $port = null ) {
|
public function Url( $port = null ) {
|
||||||
$url = ZM_BASE_PROTOCOL . '://';
|
$url = $this->Protocol().'://';
|
||||||
if ( $this->Id() ) {
|
$url .= $this->Hostname();
|
||||||
$url .= $this->Hostname();
|
|
||||||
} else {
|
|
||||||
$url .= $_SERVER['SERVER_NAME'];
|
|
||||||
}
|
|
||||||
if ( $port ) {
|
if ( $port ) {
|
||||||
$url .= ':'.$port;
|
$url .= ':'.$port;
|
||||||
} else {
|
} else {
|
||||||
$url .= ':'.$_SERVER['SERVER_PORT'];
|
$url .= ':'.$this->Port();
|
||||||
}
|
}
|
||||||
$url .= $_SERVER['PHP_SELF'];
|
|
||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
public function Hostname() {
|
|
||||||
if ( isset( $this->{'Hostname'} ) and ( $this->{'Hostname'} != '' ) ) {
|
public function PathToIndex( $new = null ) {
|
||||||
return $this->{'Hostname'};
|
if ( $new != null )
|
||||||
}
|
$this->{'PathToIndex'} = $new;
|
||||||
return $this->{'Name'};
|
|
||||||
}
|
if ( isset($this->{'PathToIndex'}) and $this->{'PathToIndex'} ) {
|
||||||
|
return $this->{'PathToIndex'};
|
||||||
|
}
|
||||||
|
return $_SERVER['PHP_SELF'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function UrlToIndex( $port=null ) {
|
||||||
|
return $this->Url($port).$this->PathToIndex();
|
||||||
|
}
|
||||||
|
public function UrlToApi( $port=null ) {
|
||||||
|
return $this->Url($port).$this->PathToApi();
|
||||||
|
}
|
||||||
|
public function PathToApi( $new = null ) {
|
||||||
|
if ( $new != null )
|
||||||
|
$this->{'PathToApi'} = $new;
|
||||||
|
|
||||||
|
if ( isset($this->{'PathToApi'}) and $this->{'PathToApi'} ) {
|
||||||
|
return $this->{'PathToApi'};
|
||||||
|
}
|
||||||
|
return '/zm/api';
|
||||||
|
}
|
||||||
|
|
||||||
public function __call($fn, array $args){
|
public function __call($fn, array $args){
|
||||||
if ( count($args) ) {
|
if ( count($args) ) {
|
||||||
$this->{$fn} = $args[0];
|
$this->{$fn} = $args[0];
|
||||||
|
@ -66,13 +133,13 @@ class Server {
|
||||||
if ( array_key_exists($fn, $this) ) {
|
if ( array_key_exists($fn, $this) ) {
|
||||||
return $this->{$fn};
|
return $this->{$fn};
|
||||||
} else {
|
} else {
|
||||||
if ( array_key_exists( $fn, $this->defaults ) ) {
|
if ( array_key_exists($fn, $this->defaults) ) {
|
||||||
return $this->defaults{$fn};
|
return $this->defaults{$fn};
|
||||||
} else {
|
} else {
|
||||||
$backTrace = debug_backtrace();
|
$backTrace = debug_backtrace();
|
||||||
$file = $backTrace[1]['file'];
|
$file = $backTrace[1]['file'];
|
||||||
$line = $backTrace[1]['line'];
|
$line = $backTrace[1]['line'];
|
||||||
Warning( "Unknown function call Server->$fn from $file:$line" );
|
Warning("Unknown function call Server->$fn from $file:$line");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +184,7 @@ class Server {
|
||||||
}
|
}
|
||||||
$results = dbFetchAll( $sql, NULL, $values );
|
$results = dbFetchAll( $sql, NULL, $values );
|
||||||
if ( $results ) {
|
if ( $results ) {
|
||||||
return array_map( function($id){ return new Server($id); }, $results );
|
return array_map(function($id){ return new Server($id); }, $results);
|
||||||
}
|
}
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
@ -137,5 +204,5 @@ class Server {
|
||||||
return $results[0];
|
return $results[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} # end class Server
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -617,7 +617,7 @@ if ( canEdit('Monitors') ) {
|
||||||
$new_monitor = new Monitor($mid);
|
$new_monitor = new Monitor($mid);
|
||||||
//fixDevices();
|
//fixDevices();
|
||||||
|
|
||||||
if ( $monitor['Type'] != 'WebSite' ) {
|
if ( $new_monitor->Type() != 'WebSite' ) {
|
||||||
$new_monitor->zmcControl('start');
|
$new_monitor->zmcControl('start');
|
||||||
$new_monitor->zmaControl('start');
|
$new_monitor->zmaControl('start');
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,9 +47,13 @@ function CORSHeaders() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
foreach( $Servers as $Server ) {
|
foreach( $Servers as $Server ) {
|
||||||
if ( preg_match('/^(https?:\/\/)?'.preg_quote($Server->Hostname(),'/').'/', $_SERVER['HTTP_ORIGIN']) ) {
|
if (
|
||||||
|
preg_match('/^(https?:\/\/)?'.preg_quote($Server->Hostname(),'/').'/i', $_SERVER['HTTP_ORIGIN'])
|
||||||
|
or
|
||||||
|
preg_match('/^(https?:\/\/)?'.preg_quote($Server->Name(),'/').'/i', $_SERVER['HTTP_ORIGIN'])
|
||||||
|
) {
|
||||||
$valid = true;
|
$valid = true;
|
||||||
Logger::Debug("Setting Access-Controll-Allow-Origin from " . $_SERVER['HTTP_ORIGIN']);
|
Logger::Debug("Setting Access-Control-Allow-Origin from " . $_SERVER['HTTP_ORIGIN']);
|
||||||
header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
|
header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
|
||||||
header('Access-Control-Allow-Headers: x-requested-with,x-request');
|
header('Access-Control-Allow-Headers: x-requested-with,x-request');
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
class Server {
|
||||||
|
constructor(json) {
|
||||||
|
for( var k in json ) {
|
||||||
|
this[k] = json[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url(port=0){
|
||||||
|
return location.protocol+'//'+this.Hostname+
|
||||||
|
(port ? ':'+port : '') +
|
||||||
|
( ( this.PathPrefix && this.PathPrefix != 'null') ? this.PathPrefix : '');
|
||||||
|
}
|
||||||
|
};
|
|
@ -584,6 +584,9 @@ $SLANG = array(
|
||||||
'Parameter' => 'Parameter',
|
'Parameter' => 'Parameter',
|
||||||
'Password' => 'Password',
|
'Password' => 'Password',
|
||||||
'PasswordsDifferent' => 'The new and confirm passwords are different',
|
'PasswordsDifferent' => 'The new and confirm passwords are different',
|
||||||
|
'PathToIndex' => 'Path To Index',
|
||||||
|
'PathToZMS' => 'Path To ZMS',
|
||||||
|
'PathToApi' => 'Path To Api',
|
||||||
'Paths' => 'Paths',
|
'Paths' => 'Paths',
|
||||||
'Pause' => 'Pause',
|
'Pause' => 'Pause',
|
||||||
'PhoneBW' => 'Phone B/W',
|
'PhoneBW' => 'Phone B/W',
|
||||||
|
|
|
@ -1,410 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery UI CSS Framework 1.11.3
|
|
||||||
* http://jqueryui.com
|
|
||||||
*
|
|
||||||
* Copyright jQuery Foundation and other contributors
|
|
||||||
* Released under the MIT license.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://api.jqueryui.com/category/theming/
|
|
||||||
*
|
|
||||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Component containers
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-widget {
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget .ui-widget {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget input,
|
|
||||||
.ui-widget select,
|
|
||||||
.ui-widget textarea,
|
|
||||||
.ui-widget button {
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget-content {
|
|
||||||
border: 1px solid #dddddd;
|
|
||||||
background: #ffffff;
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
.ui-widget-content a {
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
.ui-widget-header {
|
|
||||||
border: 1px solid #dddddd;
|
|
||||||
background: #e9e9e9;
|
|
||||||
color: #333333;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.ui-widget-header a {
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interaction states
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-state-default,
|
|
||||||
.ui-widget-content .ui-state-default,
|
|
||||||
.ui-widget-header .ui-state-default {
|
|
||||||
border: 1px solid #c5c5c5;
|
|
||||||
background: #f6f6f6;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #454545;
|
|
||||||
}
|
|
||||||
.ui-state-default a,
|
|
||||||
.ui-state-default a:link,
|
|
||||||
.ui-state-default a:visited {
|
|
||||||
color: #454545;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ui-state-hover,
|
|
||||||
.ui-widget-content .ui-state-hover,
|
|
||||||
.ui-widget-header .ui-state-hover,
|
|
||||||
.ui-state-focus,
|
|
||||||
.ui-widget-content .ui-state-focus,
|
|
||||||
.ui-widget-header .ui-state-focus {
|
|
||||||
border: 1px solid #cccccc;
|
|
||||||
background: #ededed;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #2b2b2b;
|
|
||||||
}
|
|
||||||
.ui-state-hover a,
|
|
||||||
.ui-state-hover a:hover,
|
|
||||||
.ui-state-hover a:link,
|
|
||||||
.ui-state-hover a:visited,
|
|
||||||
.ui-state-focus a,
|
|
||||||
.ui-state-focus a:hover,
|
|
||||||
.ui-state-focus a:link,
|
|
||||||
.ui-state-focus a:visited {
|
|
||||||
color: #2b2b2b;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ui-state-active,
|
|
||||||
.ui-widget-content .ui-state-active,
|
|
||||||
.ui-widget-header .ui-state-active {
|
|
||||||
border: 1px solid #003eff;
|
|
||||||
background: #007fff;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
.ui-state-active a,
|
|
||||||
.ui-state-active a:link,
|
|
||||||
.ui-state-active a:visited {
|
|
||||||
color: #ffffff;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interaction Cues
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-state-highlight,
|
|
||||||
.ui-widget-content .ui-state-highlight,
|
|
||||||
.ui-widget-header .ui-state-highlight {
|
|
||||||
border: 1px solid #dad55e;
|
|
||||||
background: #fffa90;
|
|
||||||
color: #777620;
|
|
||||||
}
|
|
||||||
.ui-state-highlight a,
|
|
||||||
.ui-widget-content .ui-state-highlight a,
|
|
||||||
.ui-widget-header .ui-state-highlight a {
|
|
||||||
color: #777620;
|
|
||||||
}
|
|
||||||
.ui-state-error,
|
|
||||||
.ui-widget-content .ui-state-error,
|
|
||||||
.ui-widget-header .ui-state-error {
|
|
||||||
border: 1px solid #f1a899;
|
|
||||||
background: #fddfdf;
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-state-error a,
|
|
||||||
.ui-widget-content .ui-state-error a,
|
|
||||||
.ui-widget-header .ui-state-error a {
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-state-error-text,
|
|
||||||
.ui-widget-content .ui-state-error-text,
|
|
||||||
.ui-widget-header .ui-state-error-text {
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-priority-primary,
|
|
||||||
.ui-widget-content .ui-priority-primary,
|
|
||||||
.ui-widget-header .ui-priority-primary {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.ui-priority-secondary,
|
|
||||||
.ui-widget-content .ui-priority-secondary,
|
|
||||||
.ui-widget-header .ui-priority-secondary {
|
|
||||||
opacity: .7;
|
|
||||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
.ui-state-disabled,
|
|
||||||
.ui-widget-content .ui-state-disabled,
|
|
||||||
.ui-widget-header .ui-state-disabled {
|
|
||||||
opacity: .35;
|
|
||||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
.ui-state-disabled .ui-icon {
|
|
||||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Icons
|
|
||||||
----------------------------------*/
|
|
||||||
|
|
||||||
/* states and images */
|
|
||||||
.ui-icon {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
.ui-icon,
|
|
||||||
.ui-widget-content .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_444444_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-widget-header .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_444444_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-default .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-hover .ui-icon,
|
|
||||||
.ui-state-focus .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_555555_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-active .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_ffffff_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-highlight .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777620_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-error .ui-icon,
|
|
||||||
.ui-state-error-text .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_cc0000_256x240.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* positioning */
|
|
||||||
.ui-icon-blank { background-position: 16px 16px; }
|
|
||||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
|
||||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
|
||||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
|
||||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
|
||||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
|
||||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
|
||||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
|
||||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
|
||||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
|
||||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
|
||||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
|
||||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
|
||||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
|
||||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
|
||||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
|
||||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
|
||||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
|
||||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
|
||||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
|
||||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
|
||||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
|
||||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
|
||||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
|
||||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
|
||||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
|
||||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
|
||||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
|
||||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
|
||||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
|
||||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
|
||||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
|
||||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
|
||||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
|
||||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
|
||||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
|
||||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
|
||||||
.ui-icon-extlink { background-position: -32px -80px; }
|
|
||||||
.ui-icon-newwin { background-position: -48px -80px; }
|
|
||||||
.ui-icon-refresh { background-position: -64px -80px; }
|
|
||||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
|
||||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
|
||||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
|
||||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
|
||||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
|
||||||
.ui-icon-document { background-position: -32px -96px; }
|
|
||||||
.ui-icon-document-b { background-position: -48px -96px; }
|
|
||||||
.ui-icon-note { background-position: -64px -96px; }
|
|
||||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
|
||||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
|
||||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
|
||||||
.ui-icon-comment { background-position: -128px -96px; }
|
|
||||||
.ui-icon-person { background-position: -144px -96px; }
|
|
||||||
.ui-icon-print { background-position: -160px -96px; }
|
|
||||||
.ui-icon-trash { background-position: -176px -96px; }
|
|
||||||
.ui-icon-locked { background-position: -192px -96px; }
|
|
||||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
|
||||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
|
||||||
.ui-icon-tag { background-position: -240px -96px; }
|
|
||||||
.ui-icon-home { background-position: 0 -112px; }
|
|
||||||
.ui-icon-flag { background-position: -16px -112px; }
|
|
||||||
.ui-icon-calendar { background-position: -32px -112px; }
|
|
||||||
.ui-icon-cart { background-position: -48px -112px; }
|
|
||||||
.ui-icon-pencil { background-position: -64px -112px; }
|
|
||||||
.ui-icon-clock { background-position: -80px -112px; }
|
|
||||||
.ui-icon-disk { background-position: -96px -112px; }
|
|
||||||
.ui-icon-calculator { background-position: -112px -112px; }
|
|
||||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
|
||||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
|
||||||
.ui-icon-search { background-position: -160px -112px; }
|
|
||||||
.ui-icon-wrench { background-position: -176px -112px; }
|
|
||||||
.ui-icon-gear { background-position: -192px -112px; }
|
|
||||||
.ui-icon-heart { background-position: -208px -112px; }
|
|
||||||
.ui-icon-star { background-position: -224px -112px; }
|
|
||||||
.ui-icon-link { background-position: -240px -112px; }
|
|
||||||
.ui-icon-cancel { background-position: 0 -128px; }
|
|
||||||
.ui-icon-plus { background-position: -16px -128px; }
|
|
||||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
|
||||||
.ui-icon-minus { background-position: -48px -128px; }
|
|
||||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
|
||||||
.ui-icon-close { background-position: -80px -128px; }
|
|
||||||
.ui-icon-closethick { background-position: -96px -128px; }
|
|
||||||
.ui-icon-key { background-position: -112px -128px; }
|
|
||||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
|
||||||
.ui-icon-scissors { background-position: -144px -128px; }
|
|
||||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
|
||||||
.ui-icon-copy { background-position: -176px -128px; }
|
|
||||||
.ui-icon-contact { background-position: -192px -128px; }
|
|
||||||
.ui-icon-image { background-position: -208px -128px; }
|
|
||||||
.ui-icon-video { background-position: -224px -128px; }
|
|
||||||
.ui-icon-script { background-position: -240px -128px; }
|
|
||||||
.ui-icon-alert { background-position: 0 -144px; }
|
|
||||||
.ui-icon-info { background-position: -16px -144px; }
|
|
||||||
.ui-icon-notice { background-position: -32px -144px; }
|
|
||||||
.ui-icon-help { background-position: -48px -144px; }
|
|
||||||
.ui-icon-check { background-position: -64px -144px; }
|
|
||||||
.ui-icon-bullet { background-position: -80px -144px; }
|
|
||||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
|
||||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
|
||||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
|
||||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
|
||||||
.ui-icon-play { background-position: 0 -160px; }
|
|
||||||
.ui-icon-pause { background-position: -16px -160px; }
|
|
||||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
|
||||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
|
||||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
|
||||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
|
||||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
|
||||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
|
||||||
.ui-icon-stop { background-position: -96px -160px; }
|
|
||||||
.ui-icon-eject { background-position: -112px -160px; }
|
|
||||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
|
||||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
|
||||||
.ui-icon-power { background-position: 0 -176px; }
|
|
||||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
|
||||||
.ui-icon-signal { background-position: -32px -176px; }
|
|
||||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
|
||||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
|
||||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
|
||||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
|
||||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
|
||||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
|
||||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
|
||||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
|
||||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
|
||||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
|
||||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
|
||||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
|
||||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
|
||||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
|
||||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
|
||||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
|
||||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
|
||||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
|
||||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
|
||||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
|
||||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
|
||||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
|
||||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
|
||||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
|
||||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
|
||||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
|
||||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
|
||||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
|
||||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
|
||||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
|
||||||
|
|
||||||
|
|
||||||
/* Misc visuals
|
|
||||||
----------------------------------*/
|
|
||||||
|
|
||||||
/* Corner radius */
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-top,
|
|
||||||
.ui-corner-left,
|
|
||||||
.ui-corner-tl {
|
|
||||||
border-top-left-radius: 3px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-top,
|
|
||||||
.ui-corner-right,
|
|
||||||
.ui-corner-tr {
|
|
||||||
border-top-right-radius: 3px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-bottom,
|
|
||||||
.ui-corner-left,
|
|
||||||
.ui-corner-bl {
|
|
||||||
border-bottom-left-radius: 3px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-bottom,
|
|
||||||
.ui-corner-right,
|
|
||||||
.ui-corner-br {
|
|
||||||
border-bottom-right-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Overlays */
|
|
||||||
.ui-widget-overlay {
|
|
||||||
background: #aaaaaa;
|
|
||||||
opacity: .3;
|
|
||||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
|
||||||
}
|
|
||||||
.ui-widget-shadow {
|
|
||||||
margin: 0px 0 0 0px;
|
|
||||||
padding: 5px;
|
|
||||||
background: #666666;
|
|
||||||
opacity: .3;
|
|
||||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
|
@ -150,6 +150,7 @@ input,textarea,select,button,.btn-primary {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
|
background-color: #f8f8f8;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,410 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery UI CSS Framework 1.11.3
|
|
||||||
* http://jqueryui.com
|
|
||||||
*
|
|
||||||
* Copyright jQuery Foundation and other contributors
|
|
||||||
* Released under the MIT license.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://api.jqueryui.com/category/theming/
|
|
||||||
*
|
|
||||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Component containers
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-widget {
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget .ui-widget {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget input,
|
|
||||||
.ui-widget select,
|
|
||||||
.ui-widget textarea,
|
|
||||||
.ui-widget button {
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget-content {
|
|
||||||
border: 1px solid #dddddd;
|
|
||||||
background: #ffffff;
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
.ui-widget-content a {
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
.ui-widget-header {
|
|
||||||
border: 1px solid #dddddd;
|
|
||||||
background: #e9e9e9;
|
|
||||||
color: #333333;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.ui-widget-header a {
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interaction states
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-state-default,
|
|
||||||
.ui-widget-content .ui-state-default,
|
|
||||||
.ui-widget-header .ui-state-default {
|
|
||||||
border: 1px solid #c5c5c5;
|
|
||||||
background: #f6f6f6;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #454545;
|
|
||||||
}
|
|
||||||
.ui-state-default a,
|
|
||||||
.ui-state-default a:link,
|
|
||||||
.ui-state-default a:visited {
|
|
||||||
color: #454545;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ui-state-hover,
|
|
||||||
.ui-widget-content .ui-state-hover,
|
|
||||||
.ui-widget-header .ui-state-hover,
|
|
||||||
.ui-state-focus,
|
|
||||||
.ui-widget-content .ui-state-focus,
|
|
||||||
.ui-widget-header .ui-state-focus {
|
|
||||||
border: 1px solid #cccccc;
|
|
||||||
background: #ededed;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #2b2b2b;
|
|
||||||
}
|
|
||||||
.ui-state-hover a,
|
|
||||||
.ui-state-hover a:hover,
|
|
||||||
.ui-state-hover a:link,
|
|
||||||
.ui-state-hover a:visited,
|
|
||||||
.ui-state-focus a,
|
|
||||||
.ui-state-focus a:hover,
|
|
||||||
.ui-state-focus a:link,
|
|
||||||
.ui-state-focus a:visited {
|
|
||||||
color: #2b2b2b;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ui-state-active,
|
|
||||||
.ui-widget-content .ui-state-active,
|
|
||||||
.ui-widget-header .ui-state-active {
|
|
||||||
border: 1px solid #003eff;
|
|
||||||
background: #007fff;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
.ui-state-active a,
|
|
||||||
.ui-state-active a:link,
|
|
||||||
.ui-state-active a:visited {
|
|
||||||
color: #ffffff;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interaction Cues
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-state-highlight,
|
|
||||||
.ui-widget-content .ui-state-highlight,
|
|
||||||
.ui-widget-header .ui-state-highlight {
|
|
||||||
border: 1px solid #dad55e;
|
|
||||||
background: #fffa90;
|
|
||||||
color: #777620;
|
|
||||||
}
|
|
||||||
.ui-state-highlight a,
|
|
||||||
.ui-widget-content .ui-state-highlight a,
|
|
||||||
.ui-widget-header .ui-state-highlight a {
|
|
||||||
color: #777620;
|
|
||||||
}
|
|
||||||
.ui-state-error,
|
|
||||||
.ui-widget-content .ui-state-error,
|
|
||||||
.ui-widget-header .ui-state-error {
|
|
||||||
border: 1px solid #f1a899;
|
|
||||||
background: #fddfdf;
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-state-error a,
|
|
||||||
.ui-widget-content .ui-state-error a,
|
|
||||||
.ui-widget-header .ui-state-error a {
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-state-error-text,
|
|
||||||
.ui-widget-content .ui-state-error-text,
|
|
||||||
.ui-widget-header .ui-state-error-text {
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-priority-primary,
|
|
||||||
.ui-widget-content .ui-priority-primary,
|
|
||||||
.ui-widget-header .ui-priority-primary {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.ui-priority-secondary,
|
|
||||||
.ui-widget-content .ui-priority-secondary,
|
|
||||||
.ui-widget-header .ui-priority-secondary {
|
|
||||||
opacity: .7;
|
|
||||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
.ui-state-disabled,
|
|
||||||
.ui-widget-content .ui-state-disabled,
|
|
||||||
.ui-widget-header .ui-state-disabled {
|
|
||||||
opacity: .35;
|
|
||||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
.ui-state-disabled .ui-icon {
|
|
||||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Icons
|
|
||||||
----------------------------------*/
|
|
||||||
|
|
||||||
/* states and images */
|
|
||||||
.ui-icon {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
.ui-icon,
|
|
||||||
.ui-widget-content .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_444444_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-widget-header .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_444444_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-default .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-hover .ui-icon,
|
|
||||||
.ui-state-focus .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_555555_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-active .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_ffffff_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-highlight .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777620_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-error .ui-icon,
|
|
||||||
.ui-state-error-text .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_cc0000_256x240.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* positioning */
|
|
||||||
.ui-icon-blank { background-position: 16px 16px; }
|
|
||||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
|
||||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
|
||||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
|
||||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
|
||||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
|
||||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
|
||||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
|
||||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
|
||||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
|
||||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
|
||||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
|
||||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
|
||||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
|
||||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
|
||||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
|
||||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
|
||||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
|
||||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
|
||||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
|
||||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
|
||||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
|
||||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
|
||||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
|
||||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
|
||||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
|
||||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
|
||||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
|
||||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
|
||||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
|
||||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
|
||||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
|
||||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
|
||||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
|
||||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
|
||||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
|
||||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
|
||||||
.ui-icon-extlink { background-position: -32px -80px; }
|
|
||||||
.ui-icon-newwin { background-position: -48px -80px; }
|
|
||||||
.ui-icon-refresh { background-position: -64px -80px; }
|
|
||||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
|
||||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
|
||||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
|
||||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
|
||||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
|
||||||
.ui-icon-document { background-position: -32px -96px; }
|
|
||||||
.ui-icon-document-b { background-position: -48px -96px; }
|
|
||||||
.ui-icon-note { background-position: -64px -96px; }
|
|
||||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
|
||||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
|
||||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
|
||||||
.ui-icon-comment { background-position: -128px -96px; }
|
|
||||||
.ui-icon-person { background-position: -144px -96px; }
|
|
||||||
.ui-icon-print { background-position: -160px -96px; }
|
|
||||||
.ui-icon-trash { background-position: -176px -96px; }
|
|
||||||
.ui-icon-locked { background-position: -192px -96px; }
|
|
||||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
|
||||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
|
||||||
.ui-icon-tag { background-position: -240px -96px; }
|
|
||||||
.ui-icon-home { background-position: 0 -112px; }
|
|
||||||
.ui-icon-flag { background-position: -16px -112px; }
|
|
||||||
.ui-icon-calendar { background-position: -32px -112px; }
|
|
||||||
.ui-icon-cart { background-position: -48px -112px; }
|
|
||||||
.ui-icon-pencil { background-position: -64px -112px; }
|
|
||||||
.ui-icon-clock { background-position: -80px -112px; }
|
|
||||||
.ui-icon-disk { background-position: -96px -112px; }
|
|
||||||
.ui-icon-calculator { background-position: -112px -112px; }
|
|
||||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
|
||||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
|
||||||
.ui-icon-search { background-position: -160px -112px; }
|
|
||||||
.ui-icon-wrench { background-position: -176px -112px; }
|
|
||||||
.ui-icon-gear { background-position: -192px -112px; }
|
|
||||||
.ui-icon-heart { background-position: -208px -112px; }
|
|
||||||
.ui-icon-star { background-position: -224px -112px; }
|
|
||||||
.ui-icon-link { background-position: -240px -112px; }
|
|
||||||
.ui-icon-cancel { background-position: 0 -128px; }
|
|
||||||
.ui-icon-plus { background-position: -16px -128px; }
|
|
||||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
|
||||||
.ui-icon-minus { background-position: -48px -128px; }
|
|
||||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
|
||||||
.ui-icon-close { background-position: -80px -128px; }
|
|
||||||
.ui-icon-closethick { background-position: -96px -128px; }
|
|
||||||
.ui-icon-key { background-position: -112px -128px; }
|
|
||||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
|
||||||
.ui-icon-scissors { background-position: -144px -128px; }
|
|
||||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
|
||||||
.ui-icon-copy { background-position: -176px -128px; }
|
|
||||||
.ui-icon-contact { background-position: -192px -128px; }
|
|
||||||
.ui-icon-image { background-position: -208px -128px; }
|
|
||||||
.ui-icon-video { background-position: -224px -128px; }
|
|
||||||
.ui-icon-script { background-position: -240px -128px; }
|
|
||||||
.ui-icon-alert { background-position: 0 -144px; }
|
|
||||||
.ui-icon-info { background-position: -16px -144px; }
|
|
||||||
.ui-icon-notice { background-position: -32px -144px; }
|
|
||||||
.ui-icon-help { background-position: -48px -144px; }
|
|
||||||
.ui-icon-check { background-position: -64px -144px; }
|
|
||||||
.ui-icon-bullet { background-position: -80px -144px; }
|
|
||||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
|
||||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
|
||||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
|
||||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
|
||||||
.ui-icon-play { background-position: 0 -160px; }
|
|
||||||
.ui-icon-pause { background-position: -16px -160px; }
|
|
||||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
|
||||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
|
||||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
|
||||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
|
||||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
|
||||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
|
||||||
.ui-icon-stop { background-position: -96px -160px; }
|
|
||||||
.ui-icon-eject { background-position: -112px -160px; }
|
|
||||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
|
||||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
|
||||||
.ui-icon-power { background-position: 0 -176px; }
|
|
||||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
|
||||||
.ui-icon-signal { background-position: -32px -176px; }
|
|
||||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
|
||||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
|
||||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
|
||||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
|
||||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
|
||||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
|
||||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
|
||||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
|
||||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
|
||||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
|
||||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
|
||||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
|
||||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
|
||||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
|
||||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
|
||||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
|
||||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
|
||||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
|
||||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
|
||||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
|
||||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
|
||||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
|
||||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
|
||||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
|
||||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
|
||||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
|
||||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
|
||||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
|
||||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
|
||||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
|
||||||
|
|
||||||
|
|
||||||
/* Misc visuals
|
|
||||||
----------------------------------*/
|
|
||||||
|
|
||||||
/* Corner radius */
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-top,
|
|
||||||
.ui-corner-left,
|
|
||||||
.ui-corner-tl {
|
|
||||||
border-top-left-radius: 3px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-top,
|
|
||||||
.ui-corner-right,
|
|
||||||
.ui-corner-tr {
|
|
||||||
border-top-right-radius: 3px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-bottom,
|
|
||||||
.ui-corner-left,
|
|
||||||
.ui-corner-bl {
|
|
||||||
border-bottom-left-radius: 3px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-bottom,
|
|
||||||
.ui-corner-right,
|
|
||||||
.ui-corner-br {
|
|
||||||
border-bottom-right-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Overlays */
|
|
||||||
.ui-widget-overlay {
|
|
||||||
background: #aaaaaa;
|
|
||||||
opacity: .3;
|
|
||||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
|
||||||
}
|
|
||||||
.ui-widget-shadow {
|
|
||||||
margin: 0px 0 0 0px;
|
|
||||||
padding: 5px;
|
|
||||||
background: #666666;
|
|
||||||
opacity: .3;
|
|
||||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
|
@ -86,6 +86,7 @@ input,textarea,select,button {
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
|
background-color: #eeeeee;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text], input[type=password], textarea {
|
input[type=text], input[type=password], textarea {
|
||||||
|
|
|
@ -1,410 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery UI CSS Framework 1.11.4
|
|
||||||
* http://jqueryui.com
|
|
||||||
*
|
|
||||||
* Copyright jQuery Foundation and other contributors
|
|
||||||
* Released under the MIT license.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://api.jqueryui.com/category/theming/
|
|
||||||
*
|
|
||||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=2px&bgColorHeader=%23222222&bgTextureHeader=flat&borderColorHeader=%23222222&fcHeader=%23eeeeee&iconColorHeader=%23777777&bgColorContent=%23222222&bgTextureContent=flat&borderColorContent=%23dddddd&fcContent=%23dddddd&iconColorContent=%23444444&bgColorDefault=%23444444&bgTextureDefault=flat&borderColorDefault=%23444444&fcDefault=%23eeeeee&iconColorDefault=%23777777&bgColorHover=%23555555&bgTextureHover=flat&borderColorHover=%23444444&fcHover=%23eeeeee&iconColorHover=%23777777&bgColorActive=%23666666&bgTextureActive=flat&borderColorActive=%23666666&fcActive=%23eeeeee&iconColorActive=%23777777&bgColorHighlight=%23222222&bgTextureHighlight=flat&borderColorHighlight=%23777777&fcHighlight=%23eeeeee&iconColorHighlight=%23777777&bgColorError=%23fddfdf&bgTextureError=flat&borderColorError=%23f1a899&fcError=%235f3f3f&iconColorError=%23cc0000&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px&bgImgOpacityHeader=&bgImgOpacityContent=&bgImgOpacityDefault=&bgImgOpacityHover=&bgImgOpacityActive=&bgImgOpacityHighlight=&bgImgOpacityError=
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Component containers
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-widget {
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget .ui-widget {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget input,
|
|
||||||
.ui-widget select,
|
|
||||||
.ui-widget textarea,
|
|
||||||
.ui-widget button {
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
.ui-widget-content {
|
|
||||||
border: 1px solid #dddddd;
|
|
||||||
background: #222222;
|
|
||||||
color: #dddddd;
|
|
||||||
}
|
|
||||||
.ui-widget-content a {
|
|
||||||
color: #dddddd;
|
|
||||||
}
|
|
||||||
.ui-widget-header {
|
|
||||||
border: 1px solid #222222;
|
|
||||||
background: #222222;
|
|
||||||
color: #eeeeee;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.ui-widget-header a {
|
|
||||||
color: #eeeeee;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interaction states
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-state-default,
|
|
||||||
.ui-widget-content .ui-state-default,
|
|
||||||
.ui-widget-header .ui-state-default {
|
|
||||||
border: 1px solid #444444;
|
|
||||||
background: #444444;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #eeeeee;
|
|
||||||
}
|
|
||||||
.ui-state-default a,
|
|
||||||
.ui-state-default a:link,
|
|
||||||
.ui-state-default a:visited {
|
|
||||||
color: #eeeeee;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ui-state-hover,
|
|
||||||
.ui-widget-content .ui-state-hover,
|
|
||||||
.ui-widget-header .ui-state-hover,
|
|
||||||
.ui-state-focus,
|
|
||||||
.ui-widget-content .ui-state-focus,
|
|
||||||
.ui-widget-header .ui-state-focus {
|
|
||||||
border: 1px solid #444444;
|
|
||||||
background: #555555;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #eeeeee;
|
|
||||||
}
|
|
||||||
.ui-state-hover a,
|
|
||||||
.ui-state-hover a:hover,
|
|
||||||
.ui-state-hover a:link,
|
|
||||||
.ui-state-hover a:visited,
|
|
||||||
.ui-state-focus a,
|
|
||||||
.ui-state-focus a:hover,
|
|
||||||
.ui-state-focus a:link,
|
|
||||||
.ui-state-focus a:visited {
|
|
||||||
color: #eeeeee;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.ui-state-active,
|
|
||||||
.ui-widget-content .ui-state-active,
|
|
||||||
.ui-widget-header .ui-state-active {
|
|
||||||
border: 1px solid #666666;
|
|
||||||
background: #666666;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #eeeeee;
|
|
||||||
}
|
|
||||||
.ui-state-active a,
|
|
||||||
.ui-state-active a:link,
|
|
||||||
.ui-state-active a:visited {
|
|
||||||
color: #eeeeee;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Interaction Cues
|
|
||||||
----------------------------------*/
|
|
||||||
.ui-state-highlight,
|
|
||||||
.ui-widget-content .ui-state-highlight,
|
|
||||||
.ui-widget-header .ui-state-highlight {
|
|
||||||
border: 1px solid #777777;
|
|
||||||
background: #222222;
|
|
||||||
color: #eeeeee;
|
|
||||||
}
|
|
||||||
.ui-state-highlight a,
|
|
||||||
.ui-widget-content .ui-state-highlight a,
|
|
||||||
.ui-widget-header .ui-state-highlight a {
|
|
||||||
color: #eeeeee;
|
|
||||||
}
|
|
||||||
.ui-state-error,
|
|
||||||
.ui-widget-content .ui-state-error,
|
|
||||||
.ui-widget-header .ui-state-error {
|
|
||||||
border: 1px solid #f1a899;
|
|
||||||
background: #fddfdf;
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-state-error a,
|
|
||||||
.ui-widget-content .ui-state-error a,
|
|
||||||
.ui-widget-header .ui-state-error a {
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-state-error-text,
|
|
||||||
.ui-widget-content .ui-state-error-text,
|
|
||||||
.ui-widget-header .ui-state-error-text {
|
|
||||||
color: #5f3f3f;
|
|
||||||
}
|
|
||||||
.ui-priority-primary,
|
|
||||||
.ui-widget-content .ui-priority-primary,
|
|
||||||
.ui-widget-header .ui-priority-primary {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.ui-priority-secondary,
|
|
||||||
.ui-widget-content .ui-priority-secondary,
|
|
||||||
.ui-widget-header .ui-priority-secondary {
|
|
||||||
opacity: .7;
|
|
||||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
.ui-state-disabled,
|
|
||||||
.ui-widget-content .ui-state-disabled,
|
|
||||||
.ui-widget-header .ui-state-disabled {
|
|
||||||
opacity: .35;
|
|
||||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
.ui-state-disabled .ui-icon {
|
|
||||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Icons
|
|
||||||
----------------------------------*/
|
|
||||||
|
|
||||||
/* states and images */
|
|
||||||
.ui-icon {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
.ui-icon,
|
|
||||||
.ui-widget-content .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_444444_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-widget-header .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-default .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-hover .ui-icon,
|
|
||||||
.ui-state-focus .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-active .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-highlight .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_777777_256x240.png");
|
|
||||||
}
|
|
||||||
.ui-state-error .ui-icon,
|
|
||||||
.ui-state-error-text .ui-icon {
|
|
||||||
background-image: url("../skins/classic/graphics/ui-icons_cc0000_256x240.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* positioning */
|
|
||||||
.ui-icon-blank { background-position: 16px 16px; }
|
|
||||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
|
||||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
|
||||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
|
||||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
|
||||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
|
||||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
|
||||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
|
||||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
|
||||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
|
||||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
|
||||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
|
||||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
|
||||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
|
||||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
|
||||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
|
||||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
|
||||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
|
||||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
|
||||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
|
||||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
|
||||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
|
||||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
|
||||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
|
||||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
|
||||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
|
||||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
|
||||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
|
||||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
|
||||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
|
||||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
|
||||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
|
||||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
|
||||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
|
||||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
|
||||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
|
||||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
|
||||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
|
||||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
|
||||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
|
||||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
|
||||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
|
||||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
|
||||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
|
||||||
.ui-icon-extlink { background-position: -32px -80px; }
|
|
||||||
.ui-icon-newwin { background-position: -48px -80px; }
|
|
||||||
.ui-icon-refresh { background-position: -64px -80px; }
|
|
||||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
|
||||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
|
||||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
|
||||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
|
||||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
|
||||||
.ui-icon-document { background-position: -32px -96px; }
|
|
||||||
.ui-icon-document-b { background-position: -48px -96px; }
|
|
||||||
.ui-icon-note { background-position: -64px -96px; }
|
|
||||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
|
||||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
|
||||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
|
||||||
.ui-icon-comment { background-position: -128px -96px; }
|
|
||||||
.ui-icon-person { background-position: -144px -96px; }
|
|
||||||
.ui-icon-print { background-position: -160px -96px; }
|
|
||||||
.ui-icon-trash { background-position: -176px -96px; }
|
|
||||||
.ui-icon-locked { background-position: -192px -96px; }
|
|
||||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
|
||||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
|
||||||
.ui-icon-tag { background-position: -240px -96px; }
|
|
||||||
.ui-icon-home { background-position: 0 -112px; }
|
|
||||||
.ui-icon-flag { background-position: -16px -112px; }
|
|
||||||
.ui-icon-calendar { background-position: -32px -112px; }
|
|
||||||
.ui-icon-cart { background-position: -48px -112px; }
|
|
||||||
.ui-icon-pencil { background-position: -64px -112px; }
|
|
||||||
.ui-icon-clock { background-position: -80px -112px; }
|
|
||||||
.ui-icon-disk { background-position: -96px -112px; }
|
|
||||||
.ui-icon-calculator { background-position: -112px -112px; }
|
|
||||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
|
||||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
|
||||||
.ui-icon-search { background-position: -160px -112px; }
|
|
||||||
.ui-icon-wrench { background-position: -176px -112px; }
|
|
||||||
.ui-icon-gear { background-position: -192px -112px; }
|
|
||||||
.ui-icon-heart { background-position: -208px -112px; }
|
|
||||||
.ui-icon-star { background-position: -224px -112px; }
|
|
||||||
.ui-icon-link { background-position: -240px -112px; }
|
|
||||||
.ui-icon-cancel { background-position: 0 -128px; }
|
|
||||||
.ui-icon-plus { background-position: -16px -128px; }
|
|
||||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
|
||||||
.ui-icon-minus { background-position: -48px -128px; }
|
|
||||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
|
||||||
.ui-icon-close { background-position: -80px -128px; }
|
|
||||||
.ui-icon-closethick { background-position: -96px -128px; }
|
|
||||||
.ui-icon-key { background-position: -112px -128px; }
|
|
||||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
|
||||||
.ui-icon-scissors { background-position: -144px -128px; }
|
|
||||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
|
||||||
.ui-icon-copy { background-position: -176px -128px; }
|
|
||||||
.ui-icon-contact { background-position: -192px -128px; }
|
|
||||||
.ui-icon-image { background-position: -208px -128px; }
|
|
||||||
.ui-icon-video { background-position: -224px -128px; }
|
|
||||||
.ui-icon-script { background-position: -240px -128px; }
|
|
||||||
.ui-icon-alert { background-position: 0 -144px; }
|
|
||||||
.ui-icon-info { background-position: -16px -144px; }
|
|
||||||
.ui-icon-notice { background-position: -32px -144px; }
|
|
||||||
.ui-icon-help { background-position: -48px -144px; }
|
|
||||||
.ui-icon-check { background-position: -64px -144px; }
|
|
||||||
.ui-icon-bullet { background-position: -80px -144px; }
|
|
||||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
|
||||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
|
||||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
|
||||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
|
||||||
.ui-icon-play { background-position: 0 -160px; }
|
|
||||||
.ui-icon-pause { background-position: -16px -160px; }
|
|
||||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
|
||||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
|
||||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
|
||||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
|
||||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
|
||||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
|
||||||
.ui-icon-stop { background-position: -96px -160px; }
|
|
||||||
.ui-icon-eject { background-position: -112px -160px; }
|
|
||||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
|
||||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
|
||||||
.ui-icon-power { background-position: 0 -176px; }
|
|
||||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
|
||||||
.ui-icon-signal { background-position: -32px -176px; }
|
|
||||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
|
||||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
|
||||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
|
||||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
|
||||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
|
||||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
|
||||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
|
||||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
|
||||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
|
||||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
|
||||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
|
||||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
|
||||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
|
||||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
|
||||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
|
||||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
|
||||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
|
||||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
|
||||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
|
||||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
|
||||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
|
||||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
|
||||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
|
||||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
|
||||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
|
||||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
|
||||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
|
||||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
|
||||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
|
||||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
|
||||||
|
|
||||||
|
|
||||||
/* Misc visuals
|
|
||||||
----------------------------------*/
|
|
||||||
|
|
||||||
/* Corner radius */
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-top,
|
|
||||||
.ui-corner-left,
|
|
||||||
.ui-corner-tl {
|
|
||||||
border-top-left-radius: 2px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-top,
|
|
||||||
.ui-corner-right,
|
|
||||||
.ui-corner-tr {
|
|
||||||
border-top-right-radius: 2px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-bottom,
|
|
||||||
.ui-corner-left,
|
|
||||||
.ui-corner-bl {
|
|
||||||
border-bottom-left-radius: 2px;
|
|
||||||
}
|
|
||||||
.ui-corner-all,
|
|
||||||
.ui-corner-bottom,
|
|
||||||
.ui-corner-right,
|
|
||||||
.ui-corner-br {
|
|
||||||
border-bottom-right-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Overlays */
|
|
||||||
.ui-widget-overlay {
|
|
||||||
background: #aaaaaa;
|
|
||||||
opacity: .3;
|
|
||||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
|
||||||
}
|
|
||||||
.ui-widget-shadow {
|
|
||||||
margin: 0px 0 0 0px;
|
|
||||||
padding: 5px;
|
|
||||||
background: #666666;
|
|
||||||
opacity: .3;
|
|
||||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
|
@ -81,10 +81,10 @@ echo output_link_if_exists( array(
|
||||||
'css/'.$css.'/skin.css',
|
'css/'.$css.'/skin.css',
|
||||||
'css/base/views/'.$basename.'.css',
|
'css/base/views/'.$basename.'.css',
|
||||||
'css/'.$css.'/views/'.$basename.'.css',
|
'css/'.$css.'/views/'.$basename.'.css',
|
||||||
'/js/dateTimePicker/jquery-ui-timepicker-addon.css',
|
'js/dateTimePicker/jquery-ui-timepicker-addon.css',
|
||||||
'/js/jquery-ui-1.12.1/jquery-ui.structure.min.css',
|
'js/jquery-ui-1.12.1/jquery-ui.structure.min.css',
|
||||||
'/css/jquery-ui-1.12.1/jquery-ui.theme.min.css',
|
'js/jquery-ui-1.12.1/jquery-ui.theme.min.css',
|
||||||
'/css/'.$css.'/jquery-ui-theme.css',
|
'css/'.$css.'/jquery-ui-theme.css',
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
?>
|
?>
|
||||||
|
@ -119,6 +119,7 @@ echo output_link_if_exists( array(
|
||||||
<script src="skins/<?php echo $skin; ?>/js/chosen/chosen.jquery.min.js"></script>
|
<script src="skins/<?php echo $skin; ?>/js/chosen/chosen.jquery.min.js"></script>
|
||||||
<script src="skins/<?php echo $skin; ?>/js/dateTimePicker/jquery-ui-timepicker-addon.js"></script>
|
<script src="skins/<?php echo $skin; ?>/js/dateTimePicker/jquery-ui-timepicker-addon.js"></script>
|
||||||
|
|
||||||
|
<script src="<?php echo cache_bust('js/Server.js'); ?>"></script>
|
||||||
<script>
|
<script>
|
||||||
jQuery(document).ready(function(){
|
jQuery(document).ready(function(){
|
||||||
jQuery("#flip").click(function(){
|
jQuery("#flip").click(function(){
|
||||||
|
@ -127,16 +128,8 @@ echo output_link_if_exists( array(
|
||||||
Cookie.write( 'zmHeaderFlip', jQuery('#flip').hasClass('glyphicon-menu-up') ? 'up' : 'down', { duration: 10*365 } );
|
Cookie.write( 'zmHeaderFlip', jQuery('#flip').hasClass('glyphicon-menu-up') ? 'up' : 'down', { duration: 10*365 } );
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
//<![CDATA[
|
|
||||||
<!--
|
|
||||||
var $j = jQuery.noConflict();
|
var $j = jQuery.noConflict();
|
||||||
// $j is now an alias to the jQuery function; creating the new alias is optional.
|
// $j is now an alias to the jQuery function; creating the new alias is optional.
|
||||||
|
|
||||||
//-->
|
|
||||||
//]]>
|
|
||||||
</script>
|
</script>
|
||||||
<script src="skins/<?php echo $skin; ?>/views/js/state.js"></script>
|
<script src="skins/<?php echo $skin; ?>/views/js/state.js"></script>
|
||||||
<?php
|
<?php
|
||||||
|
|
|
@ -40,7 +40,7 @@ var popupSizes = {
|
||||||
'export': { 'width': 400, 'height': 340 },
|
'export': { 'width': 400, 'height': 340 },
|
||||||
'filter': { 'width': 900, 'height': 700 },
|
'filter': { 'width': 900, 'height': 700 },
|
||||||
'frame': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 200 },
|
'frame': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 200 },
|
||||||
'frames': { 'width': 600, 'height': 600 },
|
'frames': { 'addWidth': 600, 'addHeight': 600 },
|
||||||
'function': { 'width': 350, 'height': 260 },
|
'function': { 'width': 350, 'height': 260 },
|
||||||
'group': { 'width': 760, 'height': 600 },
|
'group': { 'width': 760, 'height': 600 },
|
||||||
'groups': { 'width': 540, 'height': 420 },
|
'groups': { 'width': 540, 'height': 420 },
|
||||||
|
|
|
@ -205,7 +205,6 @@ if ( currentView != 'none' && currentView != 'login' ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function setNavBar(data) {
|
function setNavBar(data) {
|
||||||
console.log(data);
|
|
||||||
if ( data.auth ) {
|
if ( data.auth ) {
|
||||||
if ( data.auth != auth_hash ) {
|
if ( data.auth != auth_hash ) {
|
||||||
// Update authentication token.
|
// Update authentication token.
|
||||||
|
|
|
@ -31,6 +31,7 @@ var navBarRefresh = <?php echo 1000*ZM_WEB_REFRESH_NAVBAR ?>;
|
||||||
var currentView = '<?php echo $view ?>';
|
var currentView = '<?php echo $view ?>';
|
||||||
var thisUrl = "<?php echo ZM_BASE_URL.$_SERVER['PHP_SELF'] ?>";
|
var thisUrl = "<?php echo ZM_BASE_URL.$_SERVER['PHP_SELF'] ?>";
|
||||||
var skinPath = "<?php echo ZM_SKIN_PATH ?>";
|
var skinPath = "<?php echo ZM_SKIN_PATH ?>";
|
||||||
|
var serverId = '<?php echo defined('ZM_SERVER_ID') ? ZM_SERVER_ID : '' ?>';
|
||||||
|
|
||||||
var canEditSystem = <?php echo canEdit('System' )?'true':'false' ?>;
|
var canEditSystem = <?php echo canEdit('System' )?'true':'false' ?>;
|
||||||
var canViewSystem = <?php echo canView('System' )?'true':'false' ?>;
|
var canViewSystem = <?php echo canView('System' )?'true':'false' ?>;
|
||||||
|
|
|
@ -38,6 +38,8 @@ $Monitor = $Event->Monitor();
|
||||||
|
|
||||||
if (isset($_REQUEST['rate'])) {
|
if (isset($_REQUEST['rate'])) {
|
||||||
$rate = validInt($_REQUEST['rate']);
|
$rate = validInt($_REQUEST['rate']);
|
||||||
|
} else if ( isset($_COOKIE['zmEventRate']) ) {
|
||||||
|
$rate = $_COOKIE['zmEventRate'];
|
||||||
} else {
|
} else {
|
||||||
$rate = reScale(RATE_BASE, $Monitor->DefaultRate(), ZM_WEB_DEFAULT_RATE);
|
$rate = reScale(RATE_BASE, $Monitor->DefaultRate(), ZM_WEB_DEFAULT_RATE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
//
|
//
|
||||||
|
|
||||||
if ( !canView( 'Events' ) ) {
|
if ( !canView('Events') ) {
|
||||||
$view = 'error';
|
$view = 'error';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ $eid = validInt($_REQUEST['eid']);
|
||||||
if ( !empty($_REQUEST['fid']) )
|
if ( !empty($_REQUEST['fid']) )
|
||||||
$fid = validInt($_REQUEST['fid']);
|
$fid = validInt($_REQUEST['fid']);
|
||||||
|
|
||||||
$Event = new Event( $eid );
|
$Event = new Event($eid);
|
||||||
$Monitor = $Event->Monitor();
|
$Monitor = $Event->Monitor();
|
||||||
|
|
||||||
if ( !empty($fid) ) {
|
if ( !empty($fid) ) {
|
||||||
|
@ -39,7 +39,7 @@ if ( !empty($fid) ) {
|
||||||
} else {
|
} else {
|
||||||
$frame = dbFetchOne( 'SELECT * FROM Frames WHERE EventId = ? AND Score = ?', NULL, array( $eid, $Event->MaxScore() ) );
|
$frame = dbFetchOne( 'SELECT * FROM Frames WHERE EventId = ? AND Score = ?', NULL, array( $eid, $Event->MaxScore() ) );
|
||||||
}
|
}
|
||||||
$Frame = new Frame( $frame );
|
$Frame = new Frame($frame);
|
||||||
|
|
||||||
$maxFid = $Event->Frames();
|
$maxFid = $Event->Frames();
|
||||||
|
|
||||||
|
@ -91,10 +91,10 @@ xhtmlHeaders(__FILE__, translate('Frame').' - '.$Event->Id()." - ".$Frame->Frame
|
||||||
<?php if ( canEdit( 'Events' ) ) { ?><a href="?view=none&action=delete&markEid=<?php echo $Event->Id() ?>"><?php echo translate('Delete') ?></a><?php } ?>
|
<?php if ( canEdit( 'Events' ) ) { ?><a href="?view=none&action=delete&markEid=<?php echo $Event->Id() ?>"><?php echo translate('Delete') ?></a><?php } ?>
|
||||||
<a href="#" onclick="closeWindow(); return( false );"><?php echo translate('Close') ?></a>
|
<a href="#" onclick="closeWindow(); return( false );"><?php echo translate('Close') ?></a>
|
||||||
</div>
|
</div>
|
||||||
<div id="scaleControl"><label for="scale"><?php echo translate('Scale') ?></label><?php echo buildSelect( "scale", $scales, "changeScale();" ); ?></div>
|
<div id="scaleControl"><label for="scale"><?php echo translate('Scale') ?></label><?php echo buildSelect('scale', $scales, 'changeScale();'); ?></div>
|
||||||
<h2><?php echo translate('Frame') ?> <?php echo $Event->Id()."-".$Frame->FrameId()." (".$Frame->Score().")" ?></h2>
|
<h2><?php echo translate('Frame') ?> <?php echo $Event->Id().'-'.$Frame->FrameId().' ('.$Frame->Score().')' ?></h2>
|
||||||
<input type="hidden" name="base_width" id="base_width" value="<?php echo $Event->Width(); ?>"/>
|
<input type="hidden" name="base_width" id="base_width" value="<?php echo $Event->Width(); ?>"/>
|
||||||
<input type="hidden" name="base_height" id="base_height" value="<?php echo $Event->Height(); ?>"/>
|
<input type="hidden" name="base_height" id="base_height" value="<?php echo $Event->Height(); ?>"/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
|
@ -109,11 +109,13 @@ xhtmlHeaders(__FILE__, translate('Frame').' - '.$Event->Id()." - ".$Frame->Frame
|
||||||
</p>
|
</p>
|
||||||
<p id="controls">
|
<p id="controls">
|
||||||
<?php if ( $Frame->FrameId() > 1 ) { ?>
|
<?php if ( $Frame->FrameId() > 1 ) { ?>
|
||||||
<a id="firstLink" href="?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $firstFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>"><?php echo translate('First') ?></a>
|
<button type="button" id="firstLink" onclick="window.location='?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $firstFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>';"><?php echo translate('First') ?></button>
|
||||||
<a id="prevLink" href="?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $prevFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>"><?php echo translate('Prev') ?></a>
|
<button type="button" id="prevLink" onclick="window.location='?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $prevFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>';"><?php echo translate('Prev') ?></button>
|
||||||
<?php } if ( $Frame->FrameId() < $maxFid ) { ?>
|
<?php
|
||||||
<a id="nextLink" href="?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $nextFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>"><?php echo translate('Next') ?></a>
|
}
|
||||||
<a id="lastLink" href="?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $lastFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>"><?php echo translate('Last') ?></a>
|
if ( $Frame->FrameId() < $maxFid ) { ?>
|
||||||
|
<button type="button" id="nextLink" onclick="window.location='?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $nextFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>';"><?php echo translate('Next') ?></button>
|
||||||
|
<button type="button" id="lastLink" onclick="window.location='?view=frame&eid=<?php echo $Event->Id() ?>&fid=<?php echo $lastFid ?>&scale=<?php echo $scale ?>&show=<?php echo $show ?>';"><?php echo translate('Last') ?></button>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</p>
|
</p>
|
||||||
<?php if (file_exists ($dImagePath)) { ?>
|
<?php if (file_exists ($dImagePath)) { ?>
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
//
|
//
|
||||||
|
|
||||||
if ( !canView( 'Events' ) ) {
|
if ( !canView('Events') ) {
|
||||||
$view = 'error';
|
$view = 'error';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
require_once( 'includes/Frame.php' );
|
require_once('includes/Frame.php');
|
||||||
$Event = new Event( $_REQUEST['eid'] );
|
$Event = new Event( $_REQUEST['eid'] );
|
||||||
|
|
||||||
$sql = 'SELECT *, unix_timestamp( TimeStamp ) AS UnixTimeStamp FROM Frames WHERE EventID = ? ORDER BY FrameId';
|
$sql = 'SELECT *, unix_timestamp( TimeStamp ) AS UnixTimeStamp FROM Frames WHERE EventID = ? ORDER BY FrameId';
|
||||||
|
@ -30,7 +30,7 @@ $frames = dbFetchAll( $sql, NULL, array( $_REQUEST['eid'] ) );
|
||||||
|
|
||||||
$focusWindow = true;
|
$focusWindow = true;
|
||||||
|
|
||||||
xhtmlHeaders(__FILE__, translate('Frames')." - ".$Event->Id() );
|
xhtmlHeaders(__FILE__, translate('Frames').' - '.$Event->Id() );
|
||||||
?>
|
?>
|
||||||
<body>
|
<body>
|
||||||
<div id="page">
|
<div id="page">
|
||||||
|
|
|
@ -235,6 +235,7 @@ function getCmdResponse( respObj, respText ) {
|
||||||
streamPause( );
|
streamPause( );
|
||||||
} else {
|
} else {
|
||||||
$j('#rateValue').html(streamStatus.rate);
|
$j('#rateValue').html(streamStatus.rate);
|
||||||
|
Cookie.write('zmEventRate', streamStatus.rate*100, {duration: 10*365});
|
||||||
streamPlay( );
|
streamPlay( );
|
||||||
}
|
}
|
||||||
$j('#progressValue').html(secsToTime(parseInt(streamStatus.progress)));
|
$j('#progressValue').html(secsToTime(parseInt(streamStatus.progress)));
|
||||||
|
@ -274,7 +275,8 @@ function pauseClicked() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function vjsPause() {
|
function vjsPause() {
|
||||||
stopFastRev();
|
if ( intervalRewind )
|
||||||
|
stopFastRev();
|
||||||
streamPause();
|
streamPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,8 +305,10 @@ function playClicked( ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function vjsPlay() { //catches if we change mode programatically
|
function vjsPlay() { //catches if we change mode programatically
|
||||||
stopFastRev();
|
if ( intervalRewind )
|
||||||
|
stopFastRev();
|
||||||
$j('#rateValue').html(vid.playbackRate());
|
$j('#rateValue').html(vid.playbackRate());
|
||||||
|
Cookie.write('zmEventRate', vid.playbackRate()*100, {duration: 10*365});
|
||||||
streamPlay();
|
streamPlay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,6 +335,7 @@ function streamFastFwd( action ) {
|
||||||
if ( rates.indexOf(vid.playbackRate()*100)-1 == -1 )
|
if ( rates.indexOf(vid.playbackRate()*100)-1 == -1 )
|
||||||
setButtonState($('fastFwdBtn'), 'unavail');
|
setButtonState($('fastFwdBtn'), 'unavail');
|
||||||
$j('#rateValue').html(vid.playbackRate());
|
$j('#rateValue').html(vid.playbackRate());
|
||||||
|
Cookie.write('zmEventRate', vid.playbackRate()*100, {duration: 10*365});
|
||||||
} else {
|
} else {
|
||||||
streamReq.send(streamParms+"&command="+CMD_FASTFWD);
|
streamReq.send(streamParms+"&command="+CMD_FASTFWD);
|
||||||
}
|
}
|
||||||
|
@ -359,6 +364,7 @@ function streamSlowRev( action ) {
|
||||||
function stopFastRev() {
|
function stopFastRev() {
|
||||||
clearInterval(intervalRewind);
|
clearInterval(intervalRewind);
|
||||||
vid.playbackRate(1);
|
vid.playbackRate(1);
|
||||||
|
Cookie.write('zmEventRate', vid.playbackRate()*100, {duration: 10*365});
|
||||||
revSpeed = .5;
|
revSpeed = .5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,13 +375,14 @@ function streamFastRev( action ) {
|
||||||
setButtonState( $('slowFwdBtn'), 'unavail' );
|
setButtonState( $('slowFwdBtn'), 'unavail' );
|
||||||
setButtonState( $('slowRevBtn'), 'unavail' );
|
setButtonState( $('slowRevBtn'), 'unavail' );
|
||||||
setButtonState( $('fastRevBtn'), 'active' );
|
setButtonState( $('fastRevBtn'), 'active' );
|
||||||
if ( vid ) { //There is no reverse play with mp4. Set the speed to 0 and manualy set the time back.
|
if ( vid ) { //There is no reverse play with mp4. Set the speed to 0 and manually set the time back.
|
||||||
revSpeed = rates[rates.indexOf(revSpeed*100)-1]/100;
|
revSpeed = rates[rates.indexOf(revSpeed*100)-1]/100;
|
||||||
if ( rates.indexOf(revSpeed*100) == 0 ) {
|
if ( rates.indexOf(revSpeed*100) == 0 ) {
|
||||||
setButtonState( $('fastRevBtn'), 'unavail' );
|
setButtonState( $('fastRevBtn'), 'unavail' );
|
||||||
}
|
}
|
||||||
clearInterval(intervalRewind);
|
clearInterval(intervalRewind);
|
||||||
$j('#rateValue').html(-revSpeed);
|
$j('#rateValue').html(-revSpeed);
|
||||||
|
Cookie.write('zmEventRate', vid.playbackRate()*100, {duration: 10*365});
|
||||||
intervalRewind = setInterval(function() {
|
intervalRewind = setInterval(function() {
|
||||||
if (vid.currentTime() <= 0) {
|
if (vid.currentTime() <= 0) {
|
||||||
clearInterval(intervalRewind);
|
clearInterval(intervalRewind);
|
||||||
|
@ -569,7 +576,7 @@ function getEventResponse( respObj, respText ) {
|
||||||
drawProgressBar();
|
drawProgressBar();
|
||||||
}
|
}
|
||||||
nearEventsQuery( eventData.Id );
|
nearEventsQuery( eventData.Id );
|
||||||
}
|
} // end function getEventResponse
|
||||||
|
|
||||||
var eventReq = new Request.JSON( { url: thisUrl, method: 'get', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getEventResponse } );
|
var eventReq = new Request.JSON( { url: thisUrl, method: 'get', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getEventResponse } );
|
||||||
|
|
||||||
|
@ -887,7 +894,7 @@ function unarchiveEvent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function showEventFrames() {
|
function showEventFrames() {
|
||||||
createPopup( '?view=frames&eid='+eventData.Id, 'zmFrames', 'frames' );
|
createPopup( '?view=frames&eid='+eventData.Id, 'zmFrames', 'frames', WEB_LIST_THUMB_WIDTH, WEB_LIST_THUMB_HEIGHT );
|
||||||
}
|
}
|
||||||
|
|
||||||
function showStream() {
|
function showStream() {
|
||||||
|
@ -997,8 +1004,13 @@ function initPage() {
|
||||||
vid.on('pause', vjsPause);
|
vid.on('pause', vjsPause);
|
||||||
vid.on('click', function(event){handleClick(event);});
|
vid.on('click', function(event){handleClick(event);});
|
||||||
vid.on('timeupdate', function (){$j('#progressValue').html(secsToTime(Math.floor(vid.currentTime())))});
|
vid.on('timeupdate', function (){$j('#progressValue').html(secsToTime(Math.floor(vid.currentTime())))});
|
||||||
|
|
||||||
|
if ( rate > 1 ) {
|
||||||
|
// rate should be 100 = 1x, etc.
|
||||||
|
vid.playbackRate(rate/100);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
progressBarNav ();
|
progressBarNav();
|
||||||
streamCmdTimer = streamQuery.delay( 250 );
|
streamCmdTimer = streamQuery.delay( 250 );
|
||||||
if ( canStreamNative ) {
|
if ( canStreamNative ) {
|
||||||
var imageFeed = $('imageFeed');
|
var imageFeed = $('imageFeed');
|
||||||
|
|
|
@ -41,6 +41,7 @@ var filterQuery = '<?php echo isset($filterQuery)?validJsStr(htmlspecialchars_de
|
||||||
var sortQuery = '<?php echo isset($sortQuery)?validJsStr(htmlspecialchars_decode($sortQuery)):'' ?>';
|
var sortQuery = '<?php echo isset($sortQuery)?validJsStr(htmlspecialchars_decode($sortQuery)):'' ?>';
|
||||||
|
|
||||||
var rates = <?php echo json_encode(array_keys($rates)) ?>;
|
var rates = <?php echo json_encode(array_keys($rates)) ?>;
|
||||||
|
var rate = '<?php echo $rate ?>'; // really only used when setting up initial playback rate.
|
||||||
var scale = "<?php echo $scale ?>";
|
var scale = "<?php echo $scale ?>";
|
||||||
var LabelFormat = "<?php echo validJsStr($Monitor->LabelFormat())?>";
|
var LabelFormat = "<?php echo validJsStr($Monitor->LabelFormat())?>";
|
||||||
|
|
||||||
|
@ -55,3 +56,5 @@ var streamMode = '<?php echo $streamMode ?>';
|
||||||
//
|
//
|
||||||
var deleteString = "<?php echo translate('Delete') ?>";
|
var deleteString = "<?php echo translate('Delete') ?>";
|
||||||
var causeString = "<?php echo translate('AttrCause') ?>";
|
var causeString = "<?php echo translate('AttrCause') ?>";
|
||||||
|
var WEB_LIST_THUMB_WIDTH = '<?php echo ZM_WEB_LIST_THUMB_WIDTH ?>';
|
||||||
|
var WEB_LIST_THUMB_HEIGHT = '<?php echo ZM_WEB_LIST_THUMB_HEIGHT ?>';
|
||||||
|
|
|
@ -35,7 +35,7 @@ monitorData[monitorData.length] = {
|
||||||
'connKey': <?php echo $monitor->connKey() ?>,
|
'connKey': <?php echo $monitor->connKey() ?>,
|
||||||
'width': <?php echo $monitor->Width() ?>,
|
'width': <?php echo $monitor->Width() ?>,
|
||||||
'height':<?php echo $monitor->Height() ?>,
|
'height':<?php echo $monitor->Height() ?>,
|
||||||
'url': '<?php echo $monitor->Url() ?>',
|
'url': '<?php echo $monitor->UrlToIndex() ?>',
|
||||||
'onclick': function(){createPopup( '?view=watch&mid=<?php echo $monitor->Id() ?>', 'zmWatch<?php echo $monitor->Id() ?>', 'watch', <?php echo reScale( $monitor->Width(), $monitor->PopupScale() ); ?>, <?php echo reScale( $monitor->Height(), $monitor->PopupScale() ); ?> );},
|
'onclick': function(){createPopup( '?view=watch&mid=<?php echo $monitor->Id() ?>', 'zmWatch<?php echo $monitor->Id() ?>', 'watch', <?php echo reScale( $monitor->Width(), $monitor->PopupScale() ); ?>, <?php echo reScale( $monitor->Height(), $monitor->PopupScale() ); ?> );},
|
||||||
'type': '<?php echo $monitor->Type() ?>',
|
'type': '<?php echo $monitor->Type() ?>',
|
||||||
'refresh': '<?php echo $monitor->Refresh() ?>'
|
'refresh': '<?php echo $monitor->Refresh() ?>'
|
||||||
|
|
|
@ -117,24 +117,21 @@ function getImageSource( monId, time ) {
|
||||||
Event = events[Frame.EventId];
|
Event = events[Frame.EventId];
|
||||||
|
|
||||||
var storage = Storage[Event.StorageId];
|
var storage = Storage[Event.StorageId];
|
||||||
if ( storage.ServerId ) {
|
var server = storage.ServerId ? Servers[storage.ServerId] : Servers[serverId];
|
||||||
var server = Servers[storage.ServerId];
|
if ( server ) {
|
||||||
if ( server ) {
|
return server.url() +
|
||||||
//console.log( server.Hostname + " for event " + eId[i] );
|
//location.protocol + '//' + server.Hostname +
|
||||||
return location.protocol + '//' + server.Hostname +
|
//'/cgi-bin/zms?mode=jpeg&replay=single&event=' + event_id +
|
||||||
//'/cgi-bin/zms?mode=jpeg&replay=single&event=' + event_id +
|
//'&frame='+Frame.FrameId +
|
||||||
//'&frame='+Frame.FrameId +
|
'/index.php?view=image&eid=' + Frame.EventId + '&fid='+Frame.FrameId +
|
||||||
'/zm/index.php?view=image&eid=' + Frame.EventId + '&fid='+Frame.FrameId +
|
"&width=" + monitorCanvasObj[monId].width +
|
||||||
"&width=" + monitorCanvasObj[monId].width +
|
"&height=" + monitorCanvasObj[monId].height;
|
||||||
"&height=" + monitorCanvasObj[monId].height;
|
|
||||||
} else {
|
|
||||||
console.log("No server found for " + storage.ServerId );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
console.log("No server found for " + ( storage.ServerId ? storage.ServerId : serverId ));
|
||||||
//console.log("No storage found for " + eStorageId[i] );
|
//console.log("No storage found for " + eStorageId[i] );
|
||||||
return '/zm/index.php?view=image&eid=' + Frame.EventId + '&fid='+frame_id + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height;
|
return '/zm/index.php?view=image&eid=' + Frame.EventId + '&fid='+frame_id + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height;
|
||||||
//return "/cgi-bin/zms?mode=single&replay=single&event=" + Frame.EventId + '&time='+time+ "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height;
|
//return "/cgi-bin/zms?mode=single&replay=single&event=" + Frame.EventId + '&time='+time+ "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height;
|
||||||
return "/cgi-bin/zms?mode=jpeg&replay=single&event=" + Frame.EventId + '&frame='+frame_id + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height;
|
//return "/cgi-bin/zms?mode=jpeg&replay=single&event=" + Frame.EventId + '&frame='+frame_id + "&width=" + monitorCanvasObj[monId].width + "&height=" + monitorCanvasObj[monId].height;
|
||||||
} // end found Frame
|
} // end found Frame
|
||||||
return '';
|
return '';
|
||||||
//return "no data";
|
//return "no data";
|
||||||
|
@ -168,7 +165,7 @@ function imagedone( obj, monId, success ) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ( monitorLoadingStageURL[monId] == "" ) {
|
if ( monitorLoadingStageURL[monId] == "" ) {
|
||||||
console.log("Not showing image for " + monId );
|
//console.log("Not showing image for " + monId );
|
||||||
// This means that there wasn't a loading image placeholder.
|
// This means that there wasn't a loading image placeholder.
|
||||||
// So we weren't actually loading an image... which seems weird.
|
// So we weren't actually loading an image... which seems weird.
|
||||||
return;
|
return;
|
||||||
|
@ -246,7 +243,7 @@ console.log("Current time " + currentTimeSecs + " + " + playSecsperInterval + "
|
||||||
setSpeed(0);
|
setSpeed(0);
|
||||||
outputUpdate(currentTimeSecs);
|
outputUpdate(currentTimeSecs);
|
||||||
} else {
|
} else {
|
||||||
console.log("Current time " + currentTimeSecs + " + " + playSecsperInterval );
|
//console.log("Current time " + currentTimeSecs + " + " + playSecsperInterval );
|
||||||
outputUpdate(playSecsperInterval + currentTimeSecs);
|
outputUpdate(playSecsperInterval + currentTimeSecs);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -368,7 +365,7 @@ function drawGraph() {
|
||||||
underSlider=undefined;
|
underSlider=undefined;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var rowHeight=parseInt(cHeight / (numMonitors + 1) ); // Leave room for a scale of some sort
|
var rowHeight = parseInt(cHeight / (numMonitors + 1) ); // Leave room for a scale of some sort
|
||||||
|
|
||||||
// first fill in the bars for the events (not alarms)
|
// first fill in the bars for the events (not alarms)
|
||||||
|
|
||||||
|
@ -473,7 +470,7 @@ function outputUpdate(time) {
|
||||||
drawSliderOnGraph(time);
|
drawSliderOnGraph(time);
|
||||||
for ( var i=0; i < numMonitors; i++ ) {
|
for ( var i=0; i < numMonitors; i++ ) {
|
||||||
var src = getImageSource(monitorPtr[i],time);
|
var src = getImageSource(monitorPtr[i],time);
|
||||||
console.log("New image src: " + src);
|
//console.log("New image src: " + src);
|
||||||
loadImage2Monitor(monitorPtr[i],src);
|
loadImage2Monitor(monitorPtr[i],src);
|
||||||
}
|
}
|
||||||
currentTimeSecs = time;
|
currentTimeSecs = time;
|
||||||
|
|
|
@ -118,13 +118,13 @@ echo " };\n";
|
||||||
echo "var maxScore=$maxScore;\n"; // used to skip frame load if we find no alarms.
|
echo "var maxScore=$maxScore;\n"; // used to skip frame load if we find no alarms.
|
||||||
} // end if initialmodeislive
|
} // end if initialmodeislive
|
||||||
|
|
||||||
echo "var Storage = [];\n";
|
echo "\nvar Storage = [];\n";
|
||||||
foreach ( Storage::find() as $Storage ) {
|
foreach ( Storage::find() as $Storage ) {
|
||||||
echo 'Storage[' . $Storage->Id() . '] = ' . json_encode($Storage). ";\n";
|
echo 'Storage[' . $Storage->Id() . '] = ' . json_encode($Storage). ";\n";
|
||||||
}
|
}
|
||||||
echo "\nvar Servers = [];\n";
|
echo "\nvar Servers = [];\n";
|
||||||
foreach ( Server::find() as $Server ) {
|
foreach ( Server::find() as $Server ) {
|
||||||
echo 'Servers[' . $Server->Id() . '] = ' . json_encode($Server). ";\n";
|
echo 'Servers[' . $Server->Id() . '] = new Server(' . json_encode($Server). ");\n";
|
||||||
}
|
}
|
||||||
echo '
|
echo '
|
||||||
var monitorName = [];
|
var monitorName = [];
|
||||||
|
|
|
@ -501,11 +501,11 @@ function getEventCmdResponse( respObj, respText ) {
|
||||||
|
|
||||||
var cells = row.getElements( 'td' );
|
var cells = row.getElements( 'td' );
|
||||||
|
|
||||||
var link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&terms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1&popup=1', event.Width, event.Height ] ) } });
|
var link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&filter[Query][terms][0][attr]=MonitorId&filter[Query][terms][0][op]=%3d&filter[Query][terms][0][val]='+monitorId+'&page=1&popup=1', event.Width, event.Height ] ) } });
|
||||||
link.set( 'text', event.Id );
|
link.set( 'text', event.Id );
|
||||||
link.inject( row.getElement( 'td.colId' ) );
|
link.inject( row.getElement( 'td.colId' ) );
|
||||||
|
|
||||||
link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&terms=1&attr1=MonitorId&op1=%3d&val1='+monitorId+'&page=1&popup=1', event.Width, event.Height ] ) } });
|
link = new Element( 'a', { 'href': '#', 'events': { 'click': createEventPopup.pass( [ event.Id, '&filter[Query][terms][0][attr]=MonitorId&filter[Query][terms][0][op]=%3d&filter[Query][terms][0][val]='+monitorId+'&page=1&popup=1', event.Width, event.Height ] ) } });
|
||||||
link.set( 'text', event.Name );
|
link.set( 'text', event.Name );
|
||||||
link.inject( row.getElement( 'td.colName' ) );
|
link.inject( row.getElement( 'td.colName' ) );
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ var maxDisplayEvents = <?php echo 2 * MAX_EVENTS ?>;
|
||||||
var monitorId = <?php echo $monitor->Id() ?>;
|
var monitorId = <?php echo $monitor->Id() ?>;
|
||||||
var monitorWidth = <?php echo $monitor->Width() ?>;
|
var monitorWidth = <?php echo $monitor->Width() ?>;
|
||||||
var monitorHeight = <?php echo $monitor->Height() ?>;
|
var monitorHeight = <?php echo $monitor->Height() ?>;
|
||||||
var monitorUrl = '<?php echo $monitor->Url(); ?>';
|
var monitorUrl = '<?php echo $monitor->UrlToIndex(); ?>';
|
||||||
var monitorType = '<?php echo ( $monitor->Type() ) ?>';
|
var monitorType = '<?php echo ( $monitor->Type() ) ?>';
|
||||||
var monitorRefresh = '<?php echo ( $monitor->Refresh() ) ?>';
|
var monitorRefresh = '<?php echo ( $monitor->Refresh() ) ?>';
|
||||||
|
|
||||||
|
|
|
@ -471,6 +471,8 @@ function setAlarmState( currentAlarmState ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var streamCmdParms = "view=request&request=stream&connkey="+connKey;
|
var streamCmdParms = "view=request&request=stream&connkey="+connKey;
|
||||||
|
if ( auth_hash )
|
||||||
|
streamCmdParms += '&auth='+auth_hash;
|
||||||
var streamCmdReq = new Request.JSON( {
|
var streamCmdReq = new Request.JSON( {
|
||||||
url: monitorUrl,
|
url: monitorUrl,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
|
@ -552,6 +554,8 @@ function streamCmdQuery() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate";
|
var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate";
|
||||||
|
if ( auth_hash )
|
||||||
|
statusCmdParms += '&auth='+auth_hash;
|
||||||
var statusCmdReq = new Request.JSON( {
|
var statusCmdReq = new Request.JSON( {
|
||||||
url: monitorUrl,
|
url: monitorUrl,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
|
|
|
@ -101,7 +101,7 @@ var streamMode = "<?php echo $streamMode ?>";
|
||||||
var connKey = '<?php echo $connkey ?>';
|
var connKey = '<?php echo $connkey ?>';
|
||||||
|
|
||||||
var monitorId = <?php echo $monitor->Id() ?>;
|
var monitorId = <?php echo $monitor->Id() ?>;
|
||||||
var monitorUrl = '<?php echo ( $monitor->Url() ) ?>';
|
var monitorUrl = '<?php echo ( $monitor->UrlToIndex() ) ?>';
|
||||||
|
|
||||||
var streamSrc = "<?php echo preg_replace( '/&/', '&', $streamSrc ) ?>";
|
var streamSrc = "<?php echo preg_replace( '/&/', '&', $streamSrc ) ?>";
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
var connKey = '<?php echo $connkey ?>';
|
var connKey = '<?php echo $connkey ?>';
|
||||||
var monitorUrl = '<?php echo ( $monitor->Url() ) ?>';
|
var monitorUrl = '<?php echo ( $monitor->UrlToIndex() ) ?>';
|
||||||
var CMD_QUIT = <?php echo CMD_QUIT ?>;
|
var CMD_QUIT = <?php echo CMD_QUIT ?>;
|
||||||
|
|
||||||
|
|
|
@ -208,7 +208,10 @@ foreach ( array_map('basename', glob('skins/'.$current_skin.'/css/*',GLOB_ONLYDI
|
||||||
<thead class="thead-highlight">
|
<thead class="thead-highlight">
|
||||||
<tr>
|
<tr>
|
||||||
<th class="colName"><?php echo translate('Name') ?></th>
|
<th class="colName"><?php echo translate('Name') ?></th>
|
||||||
<th class="colHostname"><?php echo translate('Hostname') ?></th>
|
<th class="colUrl"><?php echo translate('Url') ?></th>
|
||||||
|
<th class="colPathToIndex"><?php echo translate('PathToIndex') ?></th>
|
||||||
|
<th class="colPathToZMS"><?php echo translate('PathToZMS') ?></th>
|
||||||
|
<th class="colPathToApi"><?php echo translate('PathToApi') ?></th>
|
||||||
<th class="colStatus"><?php echo translate('Status') ?></th>
|
<th class="colStatus"><?php echo translate('Status') ?></th>
|
||||||
<th class="colMonitorCount"><?php echo translate('Monitors') ?></th>
|
<th class="colMonitorCount"><?php echo translate('Monitors') ?></th>
|
||||||
<th class="colCpuLoad"><?php echo translate('CpuLoad') ?></th>
|
<th class="colCpuLoad"><?php echo translate('CpuLoad') ?></th>
|
||||||
|
@ -222,27 +225,34 @@ foreach ( array_map('basename', glob('skins/'.$current_skin.'/css/*',GLOB_ONLYDI
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php
|
<?php
|
||||||
foreach( dbFetchAll( 'SELECT *,(SELECT COUNT(Id) FROM Monitors WHERE ServerId=Servers.Id) AS MonitorCount FROM Servers ORDER BY Id' ) as $row ) {
|
$monitor_counts = dbFetchAssoc('SELECT Id,(SELECT COUNT(Id) FROM Monitors WHERE ServerId=Servers.Id) AS MonitorCount FROM Servers', 'Id', 'MonitorCount');
|
||||||
|
foreach ( Server::find() as $Server ) {
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="colName"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Name']), $canEdit ) ?></td>
|
<td class="colName"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($Server->Name()), $canEdit) ?></td>
|
||||||
<td class="colHostname"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Hostname']), $canEdit ) ?></td>
|
<td class="colUrl"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($Server->Url()), $canEdit) ?></td>
|
||||||
<td class="colStatus
|
<td class="colPathToIndex"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($Server->PathToIndex()), $canEdit) ?></td>
|
||||||
<?php if ( $row['Status'] == 'NotRunning' ) { echo 'danger'; } ?>
|
<td class="colPathToZMS"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($Server->PathToZMS()), $canEdit) ?></td>
|
||||||
"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Status']), $canEdit ) ?></td>
|
<td class="colPathToApi"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($Server->PathToApi()), $canEdit) ?></td>
|
||||||
<td class="colMonitorCount"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['MonitorCount']), $canEdit ) ?></td>
|
<td class="colStatus <?php if ( $Server->Status() == 'NotRunning' ) { echo 'danger'; } ?>">
|
||||||
<td class="colCpuLoad
|
<?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($Server->Status()), $canEdit) ?></td>
|
||||||
<?php if ( $row['CpuLoad'] > 5 ) { echo 'danger'; } ?>
|
<td class="colMonitorCount">
|
||||||
"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server',$row['CpuLoad'], $canEdit ) ?></td>
|
<?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', validHtmlStr($monitor_counts[$Server->Id()]), $canEdit) ?>
|
||||||
<td class="colMemory
|
</td>
|
||||||
<?php if ( $row['FreeMem']/$row['TotalMem'] < .1 ) { echo 'danger'; } ?>"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeMem']) . ' / ' . human_filesize($row['TotalMem']), $canEdit ) ?></td>
|
<td class="colCpuLoad <?php if ( $Server->CpuLoad() > 5 ) { echo 'danger'; } ?>">
|
||||||
<td class="colSwap
|
<?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server',$Server->CpuLoad(), $canEdit) ?>
|
||||||
<?php if ( (!$row['TotalSwap']) or ($row['FreeSwap']/$row['TotalSwap'] < .1) ) { echo 'danger'; } ?>"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', human_filesize($row['FreeSwap']) . ' / ' . human_filesize($row['TotalSwap']) , $canEdit ) ?></td>
|
</td>
|
||||||
<td class="colStats"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', $row['zmstats'] ? 'yes' : 'no', $canEdit ) ?></td>
|
<td class="colMemory <?php if ( $Server->FreeMem()/$Server->TotalMem() < .1 ) { echo 'danger'; } ?>">
|
||||||
<td class="colAudit"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', $row['zmaudit'] ? 'yes' : 'no', $canEdit ) ?></td>
|
<?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', human_filesize($Server->FreeMem()) . ' / ' . human_filesize($Server->TotalMem()), $canEdit) ?>
|
||||||
<td class="colTrigger"><?php echo makePopupLink( '?view=server&id='.$row['Id'], 'zmServer', 'server', $row['zmtrigger'] ? 'yes' : 'no', $canEdit ) ?></td>
|
</td>
|
||||||
|
<td class="colSwap <?php if ( (!$Server->TotalSwap()) or ($Server->FreeSwap()/$Server->TotalSwap() < .1) ) { echo 'danger'; } ?>">
|
||||||
|
<?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', human_filesize($Server->FreeSwap()) . ' / ' . human_filesize($Server->TotalSwap()) , $canEdit) ?>
|
||||||
|
</td>
|
||||||
|
<td class="colStats"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', $Server->zmstats() ? 'yes' : 'no', $canEdit) ?></td>
|
||||||
|
<td class="colAudit"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', $Server->zmaudit() ? 'yes' : 'no', $canEdit) ?></td>
|
||||||
|
<td class="colTrigger"><?php echo makePopupLink('?view=server&id='.$Server->Id(), 'zmServer', 'server', $Server->zmtrigger() ? '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 $Server->Id() ?>" onclick="configureDeleteButton(this);"<?php if ( !$canEdit ) { ?> disabled="disabled"<?php } ?>/></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php } #end foreach Server ?>
|
<?php } #end foreach Server ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -23,31 +23,23 @@ if ( !canEdit('System') ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $_REQUEST['id'] ) {
|
$Server = new Server($_REQUEST['id']);
|
||||||
if ( !($newServer = dbFetchOne('SELECT * FROM Servers WHERE Id = ?', NULL, ARRAY($_REQUEST['id'])) ) ) {
|
if ( $_REQUEST['id'] and ! $Server->Id() ) {
|
||||||
$view = 'error';
|
$view = 'error';
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$newServer = array();
|
|
||||||
$newServer['Name'] = translate('NewServer');
|
|
||||||
$newServer['Hostname'] = '';
|
|
||||||
$newServer['zmstats'] = '';
|
|
||||||
$newServer['zmaudit'] = '';
|
|
||||||
$newServer['zmtrigger'] = '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$focusWindow = true;
|
$focusWindow = true;
|
||||||
|
|
||||||
xhtmlHeaders(__FILE__, translate('Server').' - '.$newServer['Name']);
|
xhtmlHeaders(__FILE__, translate('Server').' - '.$Server->Name());
|
||||||
?>
|
?>
|
||||||
<body>
|
<body>
|
||||||
<div id="page">
|
<div id="page">
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<h2><?php echo translate('Server').' - '.$newServer['Name'] ?></h2>
|
<h2><?php echo translate('Server').' - '.$Server->Name() ?></h2>
|
||||||
</div>
|
</div>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<form name="contentForm" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" onsubmit="return validateForm(this, <?php echo empty($newServer['Name'])?'true':'false' ?>)">
|
<form name="contentForm" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" onsubmit="return validateForm(this, <?php echo empty($Server->Name())?'true':'false' ?>)">
|
||||||
<input type="hidden" name="view" value="<?php echo $view ?>"/>
|
<input type="hidden" name="view" value="<?php echo $view ?>"/>
|
||||||
<input type="hidden" name="object" value="server"/>
|
<input type="hidden" name="object" value="server"/>
|
||||||
<input type="hidden" name="id" value="<?php echo validHtmlStr($_REQUEST['id']) ?>"/>
|
<input type="hidden" name="id" value="<?php echo validHtmlStr($_REQUEST['id']) ?>"/>
|
||||||
|
@ -55,31 +47,51 @@ xhtmlHeaders(__FILE__, translate('Server').' - '.$newServer['Name']);
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><?php echo translate('Name') ?></th>
|
<th scope="row"><?php echo translate('Name') ?></th>
|
||||||
<td><input type="text" name="newServer[Name]" value="<?php echo $newServer['Name'] ?>"/></td>
|
<td><input type="text" name="newServer[Name]" value="<?php echo $Server->Name() ?>"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('Protocol') ?></th>
|
||||||
|
<td><input type="text" name="newServer[Protocol]" value="<?php echo $Server->Protocol() ?>"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<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 $Server->Hostname() ?>"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('Port') ?></th>
|
||||||
|
<td><input type="number" name="newServer[Port]" value="<?php echo $Server->Port() ?>"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('PathToIndex') ?></th>
|
||||||
|
<td><input type="text" name="newServer[PathToIndex]" value="<?php echo $Server->PathToIndex() ?>"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('PathToZMS') ?></th>
|
||||||
|
<td><input type="text" name="newServer[PathToZMS]" value="<?php echo $Server->PathToZMS() ?>"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><?php echo translate('PathToApi') ?></th>
|
||||||
|
<td><input type="text" name="newServer[PathToApi]" value="<?php echo $Server->PathToApi() ?>"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><?php echo translate('RunStats') ?></th>
|
<th scope="row"><?php echo translate('RunStats') ?></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="radio" name="newServer[zmstats]" value="1"<?php echo $newServer['zmstats'] ? ' checked="checked"' : '' ?>/> Yes
|
<input type="radio" name="newServer[zmstats]" value="1"<?php echo $Server->zmstats() ? ' checked="checked"' : '' ?>/> Yes
|
||||||
<input type="radio" name="newServer[zmstats]" value="0"<?php echo $newServer['zmstats'] ? '' : ' checked="checked"' ?>/> No
|
<input type="radio" name="newServer[zmstats]" value="0"<?php echo $Server->zmstats() ? '' : ' checked="checked"' ?>/> No
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><?php echo translate('RunAudit') ?></th>
|
<th scope="row"><?php echo translate('RunAudit') ?></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="radio" name="newServer[zmaudit]" value="1"<?php echo $newServer['zmaudit'] ? ' checked="checked"' : '' ?>/> Yes
|
<input type="radio" name="newServer[zmaudit]" value="1"<?php echo $Server->zmaudit() ? ' checked="checked"' : '' ?>/> Yes
|
||||||
<input type="radio" name="newServer[zmaudit]" value="0"<?php echo $newServer['zmaudit'] ? '' : ' checked="checked"' ?>/> No
|
<input type="radio" name="newServer[zmaudit]" value="0"<?php echo $Server->zmaudit() ? '' : ' checked="checked"' ?>/> No
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><?php echo translate('RunTrigger') ?></th>
|
<th scope="row"><?php echo translate('RunTrigger') ?></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="radio" name="newServer[zmtrigger]" value="1"<?php echo $newServer['zmtrigger'] ? ' checked="checked"' : '' ?>/> Yes
|
<input type="radio" name="newServer[zmtrigger]" value="1"<?php echo $Server->zmtrigger() ? ' checked="checked"' : '' ?>/> Yes
|
||||||
<input type="radio" name="newServer[zmtrigger]" value="0"<?php echo $newServer['zmtrigger'] ? '' : ' checked="checked"' ?>/> No
|
<input type="radio" name="newServer[zmtrigger]" value="0"<?php echo $Server->zmtrigger() ? '' : ' checked="checked"' ?>/> No
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
//
|
//
|
||||||
|
|
||||||
if ( !canEdit( 'System' ) ) {
|
if ( !canEdit( 'System' ) ) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ if ( canView('Control') && $monitor->Type() == 'Local' ) {
|
||||||
?>
|
?>
|
||||||
<div id="scaleControl"><?php echo translate('Scale') ?>: <?php echo buildSelect( "scale", $scales, "changeScale( this );" ); ?></div>
|
<div id="scaleControl"><?php echo translate('Scale') ?>: <?php echo buildSelect( "scale", $scales, "changeScale( this );" ); ?></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="closeControl"><a href="#" onclick="<?php echo $popup ? 'window.close()' : 'window.history.back()' ?>"><?php echo $popup ? translate('Close') : translate('Back') ?></a></div>
|
<div id="closeControl"><a href="#" onclick="<?php echo $popup ? 'window.close()' : 'history.go(-1);return false;' ?>"><?php echo $popup ? translate('Close') : translate('Back') ?></a></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<div id="imageFeed"><?php echo getStreamHTML( $monitor, array('scale'=>$scale) ); ?></div>
|
<div id="imageFeed"><?php echo getStreamHTML( $monitor, array('scale'=>$scale) ); ?></div>
|
||||||
|
|
|
@ -62,39 +62,39 @@ $minY = 0;
|
||||||
$maxY = $monitor->Height()-1;
|
$maxY = $monitor->Height()-1;
|
||||||
|
|
||||||
if ( !isset($newZone) ) {
|
if ( !isset($newZone) ) {
|
||||||
if ( $zid > 0 ) {
|
if ( $zid > 0 ) {
|
||||||
$zone = dbFetchOne( 'SELECT * FROM Zones WHERE MonitorId = ? AND Id=?', NULL, array( $monitor->Id(), $zid ) );
|
$zone = dbFetchOne( 'SELECT * FROM Zones WHERE MonitorId = ? AND Id=?', NULL, array( $monitor->Id(), $zid ) );
|
||||||
} else {
|
} else {
|
||||||
$zone = array(
|
$zone = array(
|
||||||
'Id' => 0,
|
'Id' => 0,
|
||||||
'Name' => translate('New'),
|
'Name' => translate('New'),
|
||||||
'Type' => 'Active',
|
'Type' => 'Active',
|
||||||
'MonitorId' => $monitor->Id(),
|
'MonitorId' => $monitor->Id(),
|
||||||
'NumCoords' => 4,
|
'NumCoords' => 4,
|
||||||
'Coords' => sprintf( "%d,%d %d,%d, %d,%d %d,%d", $minX, $minY, $maxX, $minY, $maxX, $maxY, $minX, $maxY ),
|
'Coords' => sprintf( "%d,%d %d,%d, %d,%d %d,%d", $minX, $minY, $maxX, $minY, $maxX, $maxY, $minX, $maxY ),
|
||||||
'Area' => $monitor->Width() * $monitor->Height(),
|
'Area' => $monitor->Width() * $monitor->Height(),
|
||||||
'AlarmRGB' => 0xff0000,
|
'AlarmRGB' => 0xff0000,
|
||||||
'CheckMethod' => 'Blobs',
|
'CheckMethod' => 'Blobs',
|
||||||
'MinPixelThreshold' => '',
|
'MinPixelThreshold' => '',
|
||||||
'MaxPixelThreshold' => '',
|
'MaxPixelThreshold' => '',
|
||||||
'MinAlarmPixels' => '',
|
'MinAlarmPixels' => '',
|
||||||
'MaxAlarmPixels' => '',
|
'MaxAlarmPixels' => '',
|
||||||
'FilterX' => '',
|
'FilterX' => '',
|
||||||
'FilterY' => '',
|
'FilterY' => '',
|
||||||
'MinFilterPixels' => '',
|
'MinFilterPixels' => '',
|
||||||
'MaxFilterPixels' => '',
|
'MaxFilterPixels' => '',
|
||||||
'MinBlobPixels' => '',
|
'MinBlobPixels' => '',
|
||||||
'MaxBlobPixels' => '',
|
'MaxBlobPixels' => '',
|
||||||
'MinBlobs' => '',
|
'MinBlobs' => '',
|
||||||
'MaxBlobs' => '',
|
'MaxBlobs' => '',
|
||||||
'OverloadFrames' => '',
|
'OverloadFrames' => '',
|
||||||
'ExtendAlarmFrames' => '',
|
'ExtendAlarmFrames' => '',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
$zone['Points'] = coordsToPoints( $zone['Coords'] );
|
$zone['Points'] = coordsToPoints( $zone['Coords'] );
|
||||||
$zone['AreaCoords'] = preg_replace( '/\s+/', ',', $zone['Coords'] );
|
$zone['AreaCoords'] = preg_replace( '/\s+/', ',', $zone['Coords'] );
|
||||||
|
|
||||||
$newZone = $zone;
|
$newZone = $zone;
|
||||||
} # end if new Zone
|
} # end if new Zone
|
||||||
|
|
||||||
# Ensure Zone fits within the limits of the Monitor
|
# Ensure Zone fits within the limits of the Monitor
|
||||||
|
|
Loading…
Reference in New Issue