From 0268389907a681b072c9a3d57ec609b9e7c76c0f Mon Sep 17 00:00:00 2001 From: Knniggett Date: Sat, 7 Sep 2013 16:51:54 -0500 Subject: [PATCH 01/13] initial upload of files used to build rpm --- ZoneMinder | 1 + redhat/README.CentOS | 62 ++++ redhat/README.Fedora | 81 +++++ redhat/README.SuSE | 17 + redhat/local_zoneminder.te | 72 ++++ redhat/redalert.wav | Bin 0 -> 45404 bytes redhat/zm-init | 48 +++ redhat/zm-logrotate_d | 7 + redhat/zoneminder-1.25.0-installfix.patch | 22 ++ redhat/zoneminder-1.26.0-dbinstall.patch | 72 ++++ redhat/zoneminder-1.26.0-defaults.patch | 76 ++++ redhat/zoneminder-runlevel.patch | 11 + redhat/zoneminder.1.26.el6.spec | 409 ++++++++++++++++++++++ redhat/zoneminder.conf | 33 ++ 14 files changed, 911 insertions(+) create mode 160000 ZoneMinder create mode 100644 redhat/README.CentOS create mode 100644 redhat/README.Fedora create mode 100644 redhat/README.SuSE create mode 100644 redhat/local_zoneminder.te create mode 100755 redhat/redalert.wav create mode 100644 redhat/zm-init create mode 100644 redhat/zm-logrotate_d create mode 100644 redhat/zoneminder-1.25.0-installfix.patch create mode 100644 redhat/zoneminder-1.26.0-dbinstall.patch create mode 100644 redhat/zoneminder-1.26.0-defaults.patch create mode 100644 redhat/zoneminder-runlevel.patch create mode 100644 redhat/zoneminder.1.26.el6.spec create mode 100644 redhat/zoneminder.conf diff --git a/ZoneMinder b/ZoneMinder new file mode 160000 index 000000000..4d508d8be --- /dev/null +++ b/ZoneMinder @@ -0,0 +1 @@ +Subproject commit 4d508d8be232a4f84aefe37327b0e737196f58d1 diff --git a/redhat/README.CentOS b/redhat/README.CentOS new file mode 100644 index 000000000..319b8a7ab --- /dev/null +++ b/redhat/README.CentOS @@ -0,0 +1,62 @@ +================================================================================ + NEW INSTALLS +================================================================================ + +1. Unless you are already using MySQL server, you need to ensure that + the server is confired to start during boot and properly secured + by running: + + sudo service mysqld start + /usr/bin/mysql_secure_installation + sudo chkconfig mysqld on + +2. Using the password for the root account set during the previous step, you + will need to create the ZoneMinder database: + + mysql -uroot -p + mysql> create database zm; + mysql> grant select,insert,update,delete on zm.* to + 'zmuser'@localhost identified by 'zmpass'; + mysql> exit; + mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql + mysqladmin -uroot -p reload + +3. IMPORTANT: Edit /etc/php.ini and put in the appropriate timezone for + date.timezone! + +4. The ZoneMinder web interface is disabled by default, you will need + to edit this file to enable it: + + /etc/httpd/conf.d/zoneminder.conf + + HINT: Most users will want to simply delete the line that says + "Deny from all". + +5. Configure the web server to start automatically: + + sudo chkconfig httpd on + sudo service httpd start + +6. This package has automatically configured and installed an SELinux policy + called local_zoneminder. A copy of this policy is in the documentation + folder. + +7. Finally, you may start the ZoneMinder service: + + sudo service zoneminder start + + Then point your web browser to http:///zm + +================================================================================ + UPGRADES +================================================================================ + +1. You will need to upgrade the ZoneMinder database as described in the + manual. This command should be sufficient: + + sudo zmupdate.pl --user=root --pass= --version= + + It is recommended to backup your database and then upgrade your tables + to InnoDB when prompted. + + diff --git a/redhat/README.Fedora b/redhat/README.Fedora new file mode 100644 index 000000000..f1a4b587a --- /dev/null +++ b/redhat/README.Fedora @@ -0,0 +1,81 @@ +New installs +============ + +1. Unless you are already using the MySQL server or you are running it + remotely you will need to ensure that the server is installed and secured: + + yum install mysql-server + chkconfig mysql on + service mysql start + mysql_secure_installation + +2. You will need to create the ZoneMinder database. These commands should do + the trick, assuming your database server is local: + + mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql + mysqladmin reload + +3. The database needs a user. One is not created by default because this would + introduce an obvious security issue. The following should set this up: + + mysql -u root -p + grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass'; + + Obviously, change at least zmpass to an actual, secure password or + passphrase. You can change zmuser as well if you like. + +4. Edit /etc/zm.conf and, at the bottom, change ZM_DB_PASS and perhaps + ZM_DB_USER to match. + +5. Edit /etc/php.ini, uncomment the date.timezone line, and add your local + timezone. For whatever reason, 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 in + /etc/sysconfig/clock. + +6. This package probably does not work with SELinux enabled at the moment. It + may be necessary to disable SELinux for httpd, or even completely for + ZoneMinder to function. This will be addressed in a later release. Run + + setenforce 0 + + for testing, and edit /etc/sysconfig/selinux to disable it at boot time. + +7. Enable and start the zoneminder service: + + systemctl enable zoneminder.service + systemctl start zoneminder.service + +8. The ZoneMinder web interface is disabled by default (which makes it rather + useless but also secure by default), you will need to edit + /etc/httpd/conf.d/zoneminder.conf to enable it. Afterwards, you can start + the web server: + + systemctl enable httpd.service + systemctl start httpd.service + +9. You should immediately visit http://localhost/zm and secure the system if + it is network facing. To do this: + + a) click Options, then System. + b) check OPT_USE_AUTH. + c) set AUTH_HASH_SECRET to a random string. + d) click Save and refresh the main browser window. + e) You should be prompted to log in; the default username/password is admin/admin. + f) Open Options again, choose the newly visible Users tab. + g) click the admin user and set a password. + + +Upgrades +======== + +1. Update /etc/zm.conf. Check for any new settings and update the version + information. Comparing /etc/zm.conf and /etc/zm.conf.rpmnew should help to + do this. + +2. You will need to upgrade the ZoneMinder database as described in the + manual. This command should be sufficient when run as root: + + zmupdate.pl --version= diff --git a/redhat/README.SuSE b/redhat/README.SuSE new file mode 100644 index 000000000..ff7f64f95 --- /dev/null +++ b/redhat/README.SuSE @@ -0,0 +1,17 @@ +After install run "zm_database_init" to create +the database and the zm database user (zm_admin). +The config file is automaticly adjusted with the +entered password for zm_admin. + +If you want to use X10 thwn install the the required +perl module with cpan. + +information: +during the run of zm_database_init a .my.cnf will +be created/updated (in the home directory of root) +so that root can access the database without password. +It Does not delete the .my.cnf when it exists, but checks +whether it has an entry for the mysql client [client] which +contains as username root. When the entry not exist or +the username is not root the .my.cnf will be modified +to fit the above requirements. \ No newline at end of file diff --git a/redhat/local_zoneminder.te b/redhat/local_zoneminder.te new file mode 100644 index 000000000..d164af1c5 --- /dev/null +++ b/redhat/local_zoneminder.te @@ -0,0 +1,72 @@ + +module local_zoneminder 1.0; + +require { + 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; + class unix_stream_socket { read connectto }; + class lnk_file { write getattr read lock unlink }; + class dir search; + 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; +allow httpd_t auditd_t:file { read getattr open }; +allow httpd_t crond_t:dir search; +allow httpd_t crond_t:file { read getattr open }; +allow httpd_t dhcpc_t:dir search; +allow httpd_t dhcpc_t:file { read getattr open }; +allow httpd_t getty_t:dir search; +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; +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, dirsrvadmin_config_t, httpd_lock_t, dirsrv_config_t, httpd_tmp_t, dirsrvadmin_tmp_t, httpd_cache_t, httpd_tmpfs_t, httpd_squirrelmail_t, dirsrv_var_log_t, zarafa_var_lib_t, dirsrv_var_run_t, httpd_var_lib_t, httpd_var_run_t, passenger_tmp_t, httpd_nutups_cgi_rw_content_t, httpd_apcupsd_cgi_rw_content_t, httpd_dspam_rw_content_t, httpd_mediawiki_rw_content_t, httpd_squid_rw_content_t, httpd_prewikka_rw_content_t, httpd_smokeping_cgi_rw_content_t, passenger_var_run_t, httpd_openshift_rw_content_t, httpd_dirsrvadmin_rw_content_t, httpd_w3c_validator_rw_content_t, httpd_user_rw_content_t, httpd_awstats_rw_content_t, httpdcontent, httpd_cobbler_rw_content_t, root_t, httpd_munin_rw_content_t, httpd_bugzilla_rw_content_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 + +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 { read lock open }; +allow httpd_t kernel_t:dir search; +allow httpd_t kernel_t:file { read getattr open }; +allow httpd_t mysqld_safe_t:dir search; +allow httpd_t mysqld_safe_t:file { read getattr open }; +allow httpd_t mysqld_t:dir search; +allow httpd_t mysqld_t:file { read getattr open }; +allow httpd_t sshd_t:dir search; +allow httpd_t sshd_t:file { read getattr open }; +allow httpd_t syslogd_t:dir search; +allow httpd_t syslogd_t:file { read getattr open }; +allow httpd_t tmpfs_t:sock_file write; +allow httpd_t udev_t:dir search; +allow httpd_t udev_t:file { read getattr open }; +allow httpd_t unconfined_t:dir search; +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 v4l_device_t:chr_file getattr; diff --git a/redhat/redalert.wav b/redhat/redalert.wav new file mode 100755 index 0000000000000000000000000000000000000000..41e23e0794bdc42f187e51b454767b51727346c5 GIT binary patch literal 45404 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

6U=TqizX$fgf)Z8n=d!`^24;S9QoJQnr| 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 +chmod 600 $sql + +echo "CREATE DATABASE /*!32312 IF NOT EXISTS*/ $ZM_DB_NAME;" >>$sql +echo "USE $ZM_DB_NAME;" >>$sql + +echo "GRANT all on $ZM_DB_NAME.* TO '$ZM_DB_USER'@'$ClientHost' IDENTIFIED BY '$ZM_DB_PASS';" >>$sql + +echo -n "Enter MySQL Administrator username: " +read admin +cat $sql | mysql -B -h $ZM_DB_SERVER -u $admin -p +rm -f $sql + +cat /usr/lib/zm/init/zmschema.sql | mysql -h $ZM_DB_SERVER -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME +( cd $ZM_PATH/init; perl $ZM_PATH/init/zmoptions -f $ZM_PATH/init/zmconfig.txt ) diff --git a/redhat/zm-logrotate_d b/redhat/zm-logrotate_d new file mode 100644 index 000000000..61cc9d0eb --- /dev/null +++ b/redhat/zm-logrotate_d @@ -0,0 +1,7 @@ +/var/log/zoneminder/*log +{ + weekly + notifempty + missingok + create 660 http http +} diff --git a/redhat/zoneminder-1.25.0-installfix.patch b/redhat/zoneminder-1.25.0-installfix.patch new file mode 100644 index 000000000..61d360b63 --- /dev/null +++ b/redhat/zoneminder-1.25.0-installfix.patch @@ -0,0 +1,22 @@ +--- ./Makefile.am 2011-05-20 04:39:37.000000000 -0500 ++++ ./Makefile.am.installfix 2011-08-27 14:53:59.466635123 -0500 +@@ -21,12 +21,12 @@ EXTRA_DIST = \ + # Yes, you are correct. This is a HACK! + install-data-hook: + ( cd $(DESTDIR)$(sysconfdir); chown $(webuser):$(webgroup) $(sysconf_DATA); chmod 600 $(sysconf_DATA) ) +- ( if ! test -e $(ZM_RUNDIR); then mkdir -p $(ZM_RUNDIR); fi; if test "$(ZM_RUNDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(ZM_RUNDIR); chmod u+w $(ZM_RUNDIR); fi ) +- ( if ! test -e $(ZM_TMPDIR); then mkdir -m 700 -p $(ZM_TMPDIR); fi; if test "$(ZM_TMPDIR)" != "/tmp"; then chown $(webuser):$(webgroup) $(ZM_TMPDIR); chmod u+w $(ZM_TMPDIR); fi ) +- ( if ! test -e $(ZM_LOGDIR); then mkdir -p $(ZM_LOGDIR); fi; if test "$(ZM_LOGDIR)" != "/var/log"; then chown $(webuser):$(webgroup) $(ZM_LOGDIR); chmod u+w $(ZM_LOGDIR); fi ) ++ ( if ! test -e $(DESTDIR)$(ZM_RUNDIR); then mkdir -p $(DESTDIR)$(ZM_RUNDIR); fi; if test "$(DESTDIR)$(ZM_RUNDIR)" != "$(DESTDIR)/var/run"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_RUNDIR); chmod u+w $(DESTDIR)$(ZM_RUNDIR); fi ) ++ ( if ! test -e $(DESTDIR)$(ZM_TMPDIR); then mkdir -m 700 -p $(DESTDIR)$(ZM_TMPDIR); fi; if test "$(DESTDIR)$(ZM_TMPDIR)" != "$(DESTDIR)/tmp"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_TMPDIR); chmod u+w $(DESTDIR)$(ZM_TMPDIR); fi ) ++ ( if ! test -e $(DESTDIR)$(ZM_LOGDIR); then mkdir -p $(DESTDIR)$(ZM_LOGDIR); fi; if test "$(DESTDIR)$(ZM_LOGDIR)" != "$(DESTDIR)/var/log"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_LOGDIR); chmod u+w $(DESTDIR)$(ZM_LOGDIR); fi ) + + uninstall-hook: + @-( cd $(DESTDIR)$(webdir); rm -rf events graphics images sounds temp ) +- @-( if test "$(ZM_RUNDIR)" != "/var/run"; then rm -rf $(ZM_RUNDIR); fi ) +- @-( if test "$(ZM_TMPDIR)" != "/tmp"; then rm -rf $(ZM_TMPDIR); fi ) +- @-( if test "$(ZM_LOGDIR)" != "/var/log"; then rm -rf $(ZM_LOGDIR); fi ) ++ @-( if test "$(DESTDIR)$(ZM_RUNDIR)" != "$(DESTDIR)/var/run"; then rm -rf $(DESTDIR)$(ZM_RUNDIR); fi ) ++ @-( if test "$(DESTDIR)$(ZM_TMPDIR)" != "$(DESTDIR)/tmp"; then rm -rf $(DESTDIR)$(ZM_TMPDIR); fi ) ++ @-( if test "$(DESTDIR)$(ZM_LOGDIR)" != "$(DESTDIR)/var/log"; then rm -rf $(DESTDIR)$(ZM_LOGDIR); fi ) + diff --git a/redhat/zoneminder-1.26.0-dbinstall.patch b/redhat/zoneminder-1.26.0-dbinstall.patch new file mode 100644 index 000000000..5b688a75d --- /dev/null +++ b/redhat/zoneminder-1.26.0-dbinstall.patch @@ -0,0 +1,72 @@ +--- configure.ac 2013-09-05 10:33:08.000000000 -0500 ++++ configure.ac.dbinstall 2013-09-05 17:23:28.555553447 -0500 +@@ -1,13 +1,11 @@ + AC_PREREQ(2.59) +-AC_INIT(zm,1.26.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],ZoneMinder,http://www.zoneminder.com/downloads.html) ++AC_INIT(zm,1.26.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) + AM_INIT_AUTOMAKE + AC_CONFIG_SRCDIR(src/zm.h) + AC_CONFIG_HEADERS(config.h) + + AC_SUBST([AM_CXXFLAGS], [-D__STDC_CONSTANT_MACROS]) + +-PATH_BUILD=`pwd` +-AC_SUBST(PATH_BUILD) + TIME_BUILD=`date +'%s'` + AC_SUBST(TIME_BUILD) + +@@ -354,6 +352,8 @@ AC_PROG_PERL_MODULES(X10::ActiveHome,,AC + + AC_DEFINE_DIR([BINDIR],[bindir],[Expanded binary directory]) + AC_DEFINE_DIR([LIBDIR],[libdir],[Expanded library directory]) ++AC_DEFINE_DIR([DATADIR],[datadir],[Expanded data directory]) ++AC_SUBST(PKGDATADIR,"$DATADIR/$PACKAGE") + AC_SUBST(ZM_PID,"$ZM_RUNDIR/zm.pid") + AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) + AC_SUBST(ZM_CONFIG,"$SYSCONFDIR/zm.conf") +diff -up ./db/Makefile.am.dbinstall ./db/Makefile.am +--- ./db/Makefile.am.dbinstall 2009-10-14 04:42:46.000000000 -0500 ++++ ./db/Makefile.am 2011-03-24 22:50:14.173912137 -0500 +@@ -1,7 +1,16 @@ + AUTOMAKE_OPTIONS = gnu + ++zmdbdatadir = $(pkgdatadir)/db ++ + EXTRA_DIST = \ + zm_create.sql.in \ ++ $(dbupgrade_scripts) ++ ++dist_zmdbdata_DATA = \ ++ zm_create.sql \ ++ $(dbupgrade_scripts) ++ ++dbupgrade_scripts = \ + zm_update-0.0.1.sql \ + zm_update-0.9.7.sql \ + zm_update-0.9.8.sql \ +diff -up ./scripts/zmupdate.pl.in.dbinstall ./scripts/zmupdate.pl.in +--- ./scripts/zmupdate.pl.in.dbinstall 2011-08-27 15:44:05.335602405 -0500 ++++ ./scripts/zmupdate.pl.in 2011-08-26 02:51:37.000000000 -0500 +@@ -424,7 +424,7 @@ if ( $version ) + } + else + { +- $command .= ZM_PATH_BUILD."/db"; ++ $command .= ZM_PATH_DATA."/db"; + } + $command .= "/zm_update-".$version.".sql"; + +diff -up ./zm.conf.in.dbinstall ./zm.conf.in +--- ./zm.conf.in.dbinstall 2008-07-25 04:48:16.000000000 -0500 ++++ ./zm.conf.in 2011-03-24 22:50:14.175912077 -0500 +@@ -12,8 +12,8 @@ + # Current version of ZoneMinder + ZM_VERSION=@VERSION@ + +-# Path to build directory, used mostly for finding DB upgrade scripts +-ZM_PATH_BUILD=@PATH_BUILD@ ++# Path to installed data directory, used mostly for finding DB upgrade scripts ++ZM_PATH_DATA=@PKGDATADIR@ + + # Build time, used to record when to trigger various checks + ZM_TIME_BUILD=@TIME_BUILD@ diff --git a/redhat/zoneminder-1.26.0-defaults.patch b/redhat/zoneminder-1.26.0-defaults.patch new file mode 100644 index 000000000..3e5dda67c --- /dev/null +++ b/redhat/zoneminder-1.26.0-defaults.patch @@ -0,0 +1,76 @@ +--- configure.ac 2013-08-15 11:44:10.000000000 -0500 ++++ configure.ac.logdir 2013-08-17 09:20:07.326053328 -0500 +@@ -46,7 +46,7 @@ + AC_SUBST(ZM_TMPDIR,[/tmp/zm]) + fi + if test "$ZM_LOGDIR" == ""; then +- AC_SUBST(ZM_LOGDIR,[/var/log/zm]) ++ AC_SUBST(ZM_LOGDIR,[/var/log/zoneminder]) + fi + + LIB_ARCH=lib +--- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in 2013-08-01 18:14:45.175241378 -0500 ++++ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in.defaults 2013-08-07 18:57:42.525006149 -0500 +@@ -187,7 +187,7 @@ + }, + { + name => "ZM_PATH_ZMS", +- default => "/cgi-bin/nph-zms", ++ default => "/cgi-bin/zm/nph-zms", + description => "Web path to zms streaming server", + help => "The ZoneMinder streaming server is required to send streamed images to your browser. It will be installed into the cgi-bin path given at configuration time. This option determines what the web path to the server is rather than the local path on your machine. Ordinarily the streaming server runs in parser-header mode however if you experience problems with streaming you can change this to non-parsed-header (nph) mode by changing 'zms' to 'nph-zms'.", + type => $types{rel_path}, +@@ -276,7 +276,7 @@ + }, + { + name => "ZM_OPT_CAMBOZOLA", +- default => "no", ++ default => "yes", + description => "Is the (optional) cambozola java streaming client installed", + help => "Cambozola is a handy low fat cheese flavoured Java applet that ZoneMinder uses to view image streams on browsers such as Internet Explorer that don't natively support this format. If you use this browser it is highly recommended to install this from http://www.charliemouse.com/code/cambozola/ however if it is not installed still images at a lower refresh rate can still be viewed.", + type => $types{boolean}, +@@ -526,7 +526,7 @@ + }, + { + name => "ZM_LOG_DEBUG_FILE", +- default => "@ZM_TMPDIR@/zm_debug.log+", ++ default => "/var/log/zoneminder/zm_debug_log+", + description => "Where extra debug is output to", + help => "This option allows you to specify a different target for debug output. All components have a default log file which will norally be in /tmp or /var/log and this is where debug will be written to if this value is empty. Adding a path here will temporarily redirect debug, and other logging output, to this file. This option is a simple filename and you are debugging several components then they will all try and write to the same file with undesirable consequences. Appending a '+' to the filename will cause the file to be created with a '.' suffix containing your process id. In this way debug from each run of a component is kept separate. This is the recommended setting as it will also prevent subsequent runs from overwriting the same log. You should ensure that permissions are set up to allow writing to the file and directory specified here.", + requires => [ { name => "ZM_LOG_DEBUG", value => "yes" } ], +@@ -623,7 +623,7 @@ + }, + { + name => "ZM_PATH_SOCKS", +- default => "@ZM_TMPDIR@", ++ default => "/var/lib/zoneminder/sock", + description => "Path to the various Unix domain socket files that ZoneMinder uses", + help => "ZoneMinder generally uses Unix domain sockets where possible. This reduces the need for port assignments and prevents external applications from possibly compromising the daemons. However each Unix socket requires a .sock file to be created. This option indicates where those socket files go.", + type => $types{abs_path}, +@@ -639,7 +639,7 @@ + }, + { + name => "ZM_PATH_SWAP", +- default => "@ZM_TMPDIR@", ++ default => "/dev/shm", + description => "Path to location for temporary swap images used in streaming", + help => "Buffered playback requires temporary swap images to be stored for each instance of the streaming daemons. This option determines where these images will be stored. The images will actually be stored in sub directories beneath this location and will be automatically cleaned up after a period of time.", + type => $types{abs_path}, +@@ -902,7 +902,7 @@ + }, + { + name => "ZM_UPLOAD_FTP_LOC_DIR", +- default => "@ZM_TMPDIR@", ++ default => "/var/spool/zoneminder-upload", + description => "The local directory in which to create upload files", + help => "You can use filters to instruct ZoneMinder to upload events to a remote ftp server. This option indicates the local directory that ZoneMinder should use for temporary upload files. These are files that are created from events, uploaded and then deleted.", + requires => [ { name => "ZM_OPT_UPLOAD", value => "yes" } ], +@@ -1258,7 +1258,7 @@ + }, + { + name => "ZM_OPT_CONTROL", +- default => "no", ++ default => "yes", + description => "Support controllable (e.g. PTZ) cameras", + help => "ZoneMinder includes limited support for controllable cameras. A number of sample protocols are included and others can easily be added. If you wish to control your cameras via ZoneMinder then select this option otherwise if you only have static cameras or use other control methods then leave this option off.", + type => $types{boolean}, diff --git a/redhat/zoneminder-runlevel.patch b/redhat/zoneminder-runlevel.patch new file mode 100644 index 000000000..de7b49b0b --- /dev/null +++ b/redhat/zoneminder-runlevel.patch @@ -0,0 +1,11 @@ +diff -up ./scripts/zm.in.runlevel ./scripts/zm.in +--- ./scripts/zm.in.runlevel 2010-11-28 15:22:05.000000000 -0600 ++++ ./scripts/zm.in 2011-03-24 21:39:01.973010160 -0500 +@@ -1,6 +1,6 @@ + #!/bin/sh + # description: ZoneMinder is the top Linux video camera security and surveillance solution. ZoneMinder is intended for use in single or multi-camera video security applications.Copyright: Philip Coombes, Corey DeLasaux 2003-2008 +-# chkconfig: 2345 99 00 ++# chkconfig: - 99 00 + # processname: zmpkg.pl + + # Source function library. diff --git a/redhat/zoneminder.1.26.el6.spec b/redhat/zoneminder.1.26.el6.spec new file mode 100644 index 000000000..bf847056d --- /dev/null +++ b/redhat/zoneminder.1.26.el6.spec @@ -0,0 +1,409 @@ +%define cambrev 0.931 +%define moorev 1.3.2 +%define jscrev 1.0 + +%define zmuid $(id -un) +%define zmgid $(id -gn) +%define zmuid_final apache +%define zmgid_final apache + +Name: zoneminder +Version: 1.26.0 +Release: 1%{?dist} +Summary: A camera monitoring and analysis tool +Group: System Environment/Daemons +# jscalendar is LGPL (any version): http://www.dynarch.com/projects/calendar/ +# Mootools is inder the MIT license: http://mootools.net/ +# Cambozola is GPL: http://www.charliemouse.com/code/cambozola/ +License: GPLv2+ and LGPLv2+ and MIT +URL: http://www.zoneminder.com/ + +# Some of these sources to be added upstream. Will edit once that happens. +Source0: zoneminder-%{version}.tar.gz +Source2: zoneminder.conf +Source3: redalert.wav +Source4: README.CentOS +Source5: jscalendar-%{jscrev}.zip +#Source5: http://downloads.sourceforge.net/jscalendar/jscalendar-%{jscrev}.zip +Source6: mootools-core-%{moorev}-full-compat-yc.js +#Source6: http://mootools.net/download/get/mootools-core-%{moorev}-full-compat-yc.js +Source7: zm-init +Source8: zm-logrotate_d +Source9: local_zoneminder.te +Source10: cambozola-%{cambrev}.tar.gz +#Source10: http://www.andywilcock.com/code/cambozola/cambozola-%{cambrev}.tar.gz + +Patch1: zoneminder-1.26.0-dbinstall.patch +Patch2: zoneminder-runlevel.patch +Patch3: zoneminder-1.25.0-installfix.patch +Patch4: zoneminder-1.26.0-defaults.patch + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: automake gnutls-devel bzip2-devel libtool +BuildRequires: mysql-devel pcre-devel libjpeg-turbo-devel +BuildRequires: perl(Archive::Tar) perl(Archive::Zip) +BuildRequires: perl(Date::Manip) perl(DBD::mysql) +BuildRequires: perl(ExtUtils::MakeMaker) perl(LWP::UserAgent) +BuildRequires: perl(MIME::Entity) perl(MIME::Lite) +BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) +BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) +BuildRequires: perl(Expect) perl(X10::ActiveHome) perl(Astro::SunTime) +# Change this for distros compatible newer ffmpeg & gcc +BuildRequires: ffmpeg-devel >= 0.4.9 +BuildRequires: ffmpeg-devel <= 0.6.5 +BuildRequires: gcc < 4.7 + +Requires: httpd php php-mysql mysql-server libjpeg-turbo +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) +Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) +Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) +# Change this for distros compatible newer ffmpeg +Requires: ffmpeg >= 0.4.9 +Requires: ffmpeg <= 0.6.5 + +Requires(post): /sbin/chkconfig +Requires(post): /usr/bin/checkmodule +Requires(post): /usr/bin/semodule_package +Requires(post): /usr/sbin/semodule +Requires(post): /usr/bin/gpasswd +Requires(post): /usr/bin/less +Requires(preun): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /usr/sbin/semodule +Requires(postun): /sbin/service + + +%description +ZoneMinder is a set of applications which is intended to provide a complete +solution allowing you to capture, analyse, 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. + + +%prep +%setup -q -n zoneminder-%{version} + +# Unpack jscalendar and move some files around +%setup -q -D -T -a 5 -n zoneminder-%{version} +mkdir jscalendar-doc +pushd jscalendar-%{jscrev} +mv *html *php doc/* README ../jscalendar-doc +rmdir doc +popd + +# Unpack Cambozola and move some files around +%setup -q -D -T -a 10 -n zoneminder-%{version} +mkdir cambozola-doc +pushd cambozola-%{cambrev} +mv application.properties build.xml dist.sh *html LICENSE testPages/* ../cambozola-doc +rmdir testPages +popd + +%patch1 -p0 -b .dbinstall +%patch2 -p0 -b .runlevel +%patch3 -p0 -b .installfix +%patch4 -p0 + +cp %{SOURCE4} README.CentOS +cp %{SOURCE9} local_zoneminder.te + +%build +libtoolize --force +aclocal +autoheader +automake --force-missing --add-missing +autoconf +#autoreconf + +OPTS="" +%ifnarch %{ix86} x86_64 + OPTS="$OPTS --disable-crashtrace" +%endif + +%configure \ + --with-libarch=%{_lib} \ +%ifarch %{ix86} %{x8664} + --enable-crashtrace \ +%else + --disable-crashtrace \ +%endif + --with-mysql=%{_prefix} \ + --with-ffmpeg=%{_prefix} \ + --with-webdir=%{_datadir}/%{name}/www \ + --with-cgidir=%{_libexecdir}/%{name}/cgi-bin \ + --with-webuser=%{zmuid} \ + --with-webgroup=%{zmgid} \ + --enable-mmap=yes \ + --disable-debug \ + --with-webhost=zm.local \ + ZM_SSL_LIB="gnutls" \ + ZM_RUNDIR=/var/run/zoneminder \ + ZM_TMPDIR=/var/lib/zoneminder/temp \ + CXXFLAGS="-D__STDC_CONSTANT_MACROS -msse2" \ + --with-extralibs="" + +make %{?_smp_mflags} +%{__perl} -pi -e 's/(ZM_WEB_USER=).*$/${1}%{zmuid_final}/;' \ + -e 's/(ZM_WEB_GROUP=).*$/${1}%{zmgid_final}/;' zm.conf + +%install +install -d %{buildroot}/%{_localstatedir}/run +install -d %{buildroot}/etc/logrotate.d + +make install DESTDIR=%{buildroot} \ + INSTALLDIRS=vendor + +rm -rf %{buildroot}/%{perl_vendorarch} %{buildroot}/%{perl_archlib} + +install -m 755 -d %{buildroot}/%{_localstatedir}/log/zoneminder +for dir in events images temp +do + install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/$dir + rmdir %{buildroot}/%{_datadir}/%{name}/www/$dir + ln -sf ../../../..%{_localstatedir}/lib/zoneminder/$dir %{buildroot}/%{_datadir}/%{name}/www/$dir +done +install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/sock +install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/swap +install -m 755 -d %{buildroot}/%{_localstatedir}/spool/zoneminder-upload + +install -D -m 755 scripts/zm %{buildroot}/%{_initrddir}/zoneminder +install -D -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/httpd/conf.d/zoneminder.conf +install -D -m 755 %{SOURCE3} %{buildroot}/%{_datadir}/%{name}/www/sounds/redalert.wav +install %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name} + +# Install jscalendar +install -d -m 755 %{buildroot}/%{_datadir}/%{name}/www/jscalendar +cp -rp jscalendar-%{jscrev}/* %{buildroot}/%{_datadir}/%{name}/www/jscalendar + +# Install Cambozola +cp -rp cambozola-%{cambrev}/dist/cambozola.jar %{buildroot}/%{_datadir}/%{name}/www/ +rm -rf cambozola-%{cambrev} + +# Install mootools +pushd %{buildroot}/%{_datadir}/%{name}/www +install -m 644 %{SOURCE6} mootools-core-%{moorev}-full-compat-yc.js +ln -s mootools-core-%{moorev}-full-compat-yc.js mootools.js +popd + +%post +/sbin/chkconfig --add zoneminder +/sbin/chkconfig zoneminder on + +# Allow zoneminder access to local video sources +echo +/usr/bin/gpasswd -a apache video + +# Create and load zoneminder selinux policy module +echo -e "\nCreating and installing a ZoneMinder SELinux policy module. Please wait.\n" +/usr/bin/checkmodule -M -m -o %{_docdir}/%{name}-%{version}/local_zoneminder.mod %{_docdir}/%{name}-%{version}/local_zoneminder.te > /dev/null +/usr/bin/semodule_package -o %{_docdir}/%{name}-%{version}/local_zoneminder.pp -m %{_docdir}/%{name}-%{version}/local_zoneminder.mod > /dev/null +/usr/sbin/semodule -i %{_docdir}/%{name}-%{version}/local_zoneminder.pp > /dev/null + +# Display the README for post installation instructions +/usr/bin/less %{_docdir}/%{name}-%{version}/README.CentOS + +%preun +if [ $1 -eq 0 ]; then + /sbin/service zoneminder stop > /dev/null 2>&1 || : + /sbin/chkconfig --del zoneminder + echo -e "\nRemoving ZoneMinder SELinux policy module. Please wait.\n" + /usr/sbin/semodule -r local_zoneminder.pp +fi + + +%postun +if [ $1 -ge 1 ]; then + /sbin/service zoneminder condrestart > /dev/null 2>&1 || : +fi + + +%files +%defattr(-,root,root,-) +%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md README.CentOS jscalendar-doc cambozola-doc local_zoneminder.te +%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm.conf +%config(noreplace) %attr(644,root,root) %{_sysconfdir}/httpd/conf.d/zoneminder.conf +%config(noreplace) /etc/logrotate.d/%{name} +%attr(755,root,root) %{_initrddir}/zoneminder + +%{_bindir}/zma +%{_bindir}/zmaudit.pl +%{_bindir}/zmc +%{_bindir}/zmcontrol.pl +%{_bindir}/zmdc.pl +%{_bindir}/zmf +%{_bindir}/zmfilter.pl +%attr(4755,root,root) %{_bindir}/zmfix +%{_bindir}/zmpkg.pl +%{_bindir}/zmstreamer +%{_bindir}/zmtrack.pl +%{_bindir}/zmtrigger.pl +%{_bindir}/zmu +%{_bindir}/zmupdate.pl +%{_bindir}/zmvideo.pl +%{_bindir}/zmwatch.pl +%{_bindir}/zmx10.pl + +%{perl_vendorlib}/ZoneMinder* +%{_mandir}/man*/* +%dir %{_libexecdir}/%{name} +%{_libexecdir}/%{name}/cgi-bin +%dir %{_datadir}/%{name} +%{_datadir}/%{name}/db +%{_datadir}/%{name}/www + +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/events +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/images +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/sock +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/swap +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/temp +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/log/zoneminder +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/spool/zoneminder-upload + + +%changelog +* Thu Sep 05 2013 Andrew Bauer - 1.26.0 +- 1.26.0 Release +- https://github.com/ZoneMinder/ZoneMinder/archive/v1.26.0.tar.gz + +* Sun Sep 01 2013 Andrew Bauer - 1.26.0-beta +- Update SELinux policy module + +* Thu Aug 29 2013 Andrew Bauer - 1.26.0-beta +- Third Beta release +- https://github.com/ZoneMinder/ZoneMinder/tree/release-1.26 +- Reduce number of uneeded dependencies by integrating cambozola into spec file + +* Thu Aug 15 2013 Andrew Bauer - 1.26.0-beta +- Initial Beta release +- https://github.com/ZoneMinder/ZoneMinder/tree/release-1.26 + +* Sun Aug 11 2013 Andrew Bauer - 1.25.0-kfirproper +- Modified specfile to work with kfir-proper branch +- https://github.com/ZoneMinder/ZoneMinder/tree/kfir-proper + +* Wed Aug 07 2013 Andrew Bauer - 1.25.0-2svn3827 +- Move RHEL/CentOS specific defaults to a patch file +- Add bzip2-devel as a build dependency +- Default ZM_SSL_LIB back to gnutls. AUTH_RELAY = hashed didn't work with openssl. + +* Fri Aug 02 2013 Andrew Bauer - 1.25.0-1svn3827 +- Update to latest 1.25.0 subversion. +- Does not compile with modern versions of ffmpeg. Configure to work only with older versions. +- Does not compile with gcc 4.7. Configure to build with gcc less than 4.7. + +* Thu Mar 24 2011 Jason L Tibbitts III - 1.24.3-4.20110324svn3310 +- Update to latest 1.24.3 subversion. Turns out that what upstream was calling + 1.24.3 is really just an occasionally updated devel snapshot. +- Rebase various patches. + +* Wed Mar 23 2011 Dan Horák - 1.24.3-3 +- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient) + +* Tue Feb 08 2011 Fedora Release Engineering - 1.24.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Jan 25 2011 Jason L Tibbitts III - 1.24.3-1 +- Update to latest upstream version. +- Rebase patches. +- Initial incomplete attempt to disable v4l1 support. + +* Fri Jan 21 2011 Jason L Tibbitts III - 1.24.2-6 +- Unbundle cambozola; instead link to the separately pacakged copy. +- Remove BuildRoot:, %%clean and buildroot cleaning in %%install. +- Git rid of mixed space/tab usage by removing all tabs. +- Remove unnecessary Conflicts: line. +- Attempt to force short_open_tag on for the code directories. +- Move default location of sockets, swaps, logfiles and some temporary files to + make more sense and allow things to work better with a future selinux policy. +- Fix errors in README.CentOS. + +* Wed Jun 02 2010 Marcela Maslanova - 1.24.2-5 +- Mass rebuild with perl-5.12.0 + +* Fri Dec 4 2009 Stepan Kasal - 1.24.2-4 +- rebuild against perl 5.10.1 +- use Perl vendorarch and archlib variables correctly + +* Mon Jul 27 2009 Fedora Release Engineering - 1.24.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-2 +- Bump release since 1.24.2-1 was mistakenly tagged a few months ago. + +* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-1 +- Initial update to 1.24.2. +- Rebase patches. +- Update mootools download location. +- Update to mootools 1.2.3. +- Add additional dependencies for some optional features. + +* Sat Apr 11 2009 Martin Ebourne - 1.24.1-3 +- Remove unused Sys::Mmap perl dependency RPM is finding + +* Sat Apr 11 2009 Martin Ebourne - 1.24.1-2 +- Update gcc44 patch to disable -frepo, seems to be broken with gcc44 +- Added noffmpeg patch to make building outside mock easier + +* Sat Mar 21 2009 Martin Ebourne - 1.24.1-1 +- Patch for gcc 4.4 compilation errors +- Upgrade to 1.24.1 + +* Wed Feb 25 2009 Fedora Release Engineering - 1.23.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Sat Jan 24 2009 Caolán McNamara - 1.23.3-3 +- rebuild for dependencies + +* Mon Dec 15 2008 Martin Ebourne - 1.23.3-2 +- Fix permissions on zm.conf + +* Fri Jul 11 2008 Jason L Tibbitts III - 1.23.3-1 +- Initial attempt at packaging 1.23. + +* Tue Jul 1 2008 Martin Ebourne - 1.22.3-15 +- Add perl module compat dependency, bz #453590 + +* Tue May 6 2008 Martin Ebourne - 1.22.3-14 +- Remove default runlevel, bz #441315 + +* Mon Apr 28 2008 Jason L Tibbitts III - 1.22.3-13 +- Backport patch for CVE-2008-1381 from 1.23.3 to 1.22.3. + +* Tue Feb 19 2008 Fedora Release Engineering - 1.22.3-12 +- Autorebuild for GCC 4.3 + +* Thu Jan 3 2008 Martin Ebourne - 1.22.3-11 +- Fix compilation on gcc 4.3 + +* Thu Dec 6 2007 Martin Ebourne - 1.22.3-10 +- Rebuild for new openssl + +* Thu Aug 2 2007 Martin Ebourne - 1.22.3-8 +- Fix licence tag + +* Thu Jul 12 2007 Martin Ebourne - 1.22.3-7 +- Fixes from testing by Jitz including missing dependencies and database creation + +* Sat Jun 30 2007 Martin Ebourne - 1.22.3-6 +- Disable crashtrace on ppc + +* Sat Jun 30 2007 Martin Ebourne - 1.22.3-5 +- Fix uid for directories in /var/lib/zoneminder + +* Tue Jun 26 2007 Martin Ebourne - 1.22.3-4 +- Added perl Archive::Tar dependency +- Disabled web interface due to lack of access control on the event images + +* Sun Jun 10 2007 Martin Ebourne - 1.22.3-3 +- Changes recommended in review by Jason Tibbitts + +* Mon Apr 2 2007 Martin Ebourne - 1.22.3-2 +- Standardised on package name of zoneminder + +* Thu Dec 28 2006 Martin Ebourne - 1.22.3-1 +- First version. Uses some parts from zm-1.20.1 by Corey DeLasaux and Serg Oskin diff --git a/redhat/zoneminder.conf b/redhat/zoneminder.conf new file mode 100644 index 000000000..4a4d93261 --- /dev/null +++ b/redhat/zoneminder.conf @@ -0,0 +1,33 @@ +# The Zoneminder web interface has been disabled by default due to a small +# security issue in the default install. +# +# When using Zoneminder's own authentication, recorded CCTV images are +# accessible from the web directly without passing the authentication. This +# means any attacker could see your CCTV images without a password. In order +# to avoid this you can disable Zoneminder's authentication and configure +# standard Apache authentication (see the Apache documentation for details on +# this). +# +# If you still wish to use Zoneminder's own authentication, or have an +# internal site which needs no authentication, you need to delete the line +# marked below and restart Apache. + +Alias /zm "/usr/share/zoneminder/www" + + Options -Indexes MultiViews FollowSymLinks + AllowOverride All + Order allow,deny + Allow from all + # The code unfortunately uses short tags in many places + php_value short_open_tag 1 + +Deny from all # DELETE THIS LINE + + +ScriptAlias /cgi-bin/zm "/usr/libexec/zoneminder/cgi-bin" + + AllowOverride All + Options ExecCGI + Order allow,deny + Allow from all + From 0f5c90bbe46d4e3c0113931426ac50687d45aa5c Mon Sep 17 00:00:00 2001 From: Richard Kojedzinszky Date: Thu, 12 Sep 2013 22:46:23 +0200 Subject: [PATCH 02/13] Rewritten the query to allow mysql to use indexes On a system with heavy logging, without this the login procedure took too long. --- web/includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index e446e5703..74ce6da68 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -2167,7 +2167,7 @@ function logState() Logger::WARNING => array( ZM_LOG_ALERT_WAR_COUNT, ZM_LOG_ALARM_WAR_COUNT ), ); - $sql = "select Level, count(Level) as LevelCount from Logs where Level < ".Logger::INFO." and from_unixtime(TimeKey) + interval ".ZM_LOG_CHECK_PERIOD." second > now() group by Level order by Level asc"; + $sql = "select Level, count(Level) as LevelCount from Logs where Level < ".Logger::INFO." and TimeKey > unix_timestamp(now() - interval ".ZM_LOG_CHECK_PERIOD." second) group by Level order by Level asc"; $counts = dbFetchAll( $sql ); foreach ( $counts as $count ) From a6d3b35996a96c219d98d6fe8b4e10880d31617d Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 14 Sep 2013 12:11:49 -0500 Subject: [PATCH 03/13] Delete zoneminder-1.25.0-installfix.patch no longer needed. Fix has been added to latest branch. --- redhat/zoneminder-1.25.0-installfix.patch | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 redhat/zoneminder-1.25.0-installfix.patch diff --git a/redhat/zoneminder-1.25.0-installfix.patch b/redhat/zoneminder-1.25.0-installfix.patch deleted file mode 100644 index 61d360b63..000000000 --- a/redhat/zoneminder-1.25.0-installfix.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ./Makefile.am 2011-05-20 04:39:37.000000000 -0500 -+++ ./Makefile.am.installfix 2011-08-27 14:53:59.466635123 -0500 -@@ -21,12 +21,12 @@ EXTRA_DIST = \ - # Yes, you are correct. This is a HACK! - install-data-hook: - ( cd $(DESTDIR)$(sysconfdir); chown $(webuser):$(webgroup) $(sysconf_DATA); chmod 600 $(sysconf_DATA) ) -- ( if ! test -e $(ZM_RUNDIR); then mkdir -p $(ZM_RUNDIR); fi; if test "$(ZM_RUNDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(ZM_RUNDIR); chmod u+w $(ZM_RUNDIR); fi ) -- ( if ! test -e $(ZM_TMPDIR); then mkdir -m 700 -p $(ZM_TMPDIR); fi; if test "$(ZM_TMPDIR)" != "/tmp"; then chown $(webuser):$(webgroup) $(ZM_TMPDIR); chmod u+w $(ZM_TMPDIR); fi ) -- ( if ! test -e $(ZM_LOGDIR); then mkdir -p $(ZM_LOGDIR); fi; if test "$(ZM_LOGDIR)" != "/var/log"; then chown $(webuser):$(webgroup) $(ZM_LOGDIR); chmod u+w $(ZM_LOGDIR); fi ) -+ ( if ! test -e $(DESTDIR)$(ZM_RUNDIR); then mkdir -p $(DESTDIR)$(ZM_RUNDIR); fi; if test "$(DESTDIR)$(ZM_RUNDIR)" != "$(DESTDIR)/var/run"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_RUNDIR); chmod u+w $(DESTDIR)$(ZM_RUNDIR); fi ) -+ ( if ! test -e $(DESTDIR)$(ZM_TMPDIR); then mkdir -m 700 -p $(DESTDIR)$(ZM_TMPDIR); fi; if test "$(DESTDIR)$(ZM_TMPDIR)" != "$(DESTDIR)/tmp"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_TMPDIR); chmod u+w $(DESTDIR)$(ZM_TMPDIR); fi ) -+ ( if ! test -e $(DESTDIR)$(ZM_LOGDIR); then mkdir -p $(DESTDIR)$(ZM_LOGDIR); fi; if test "$(DESTDIR)$(ZM_LOGDIR)" != "$(DESTDIR)/var/log"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_LOGDIR); chmod u+w $(DESTDIR)$(ZM_LOGDIR); fi ) - - uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -rf events graphics images sounds temp ) -- @-( if test "$(ZM_RUNDIR)" != "/var/run"; then rm -rf $(ZM_RUNDIR); fi ) -- @-( if test "$(ZM_TMPDIR)" != "/tmp"; then rm -rf $(ZM_TMPDIR); fi ) -- @-( if test "$(ZM_LOGDIR)" != "/var/log"; then rm -rf $(ZM_LOGDIR); fi ) -+ @-( if test "$(DESTDIR)$(ZM_RUNDIR)" != "$(DESTDIR)/var/run"; then rm -rf $(DESTDIR)$(ZM_RUNDIR); fi ) -+ @-( if test "$(DESTDIR)$(ZM_TMPDIR)" != "$(DESTDIR)/tmp"; then rm -rf $(DESTDIR)$(ZM_TMPDIR); fi ) -+ @-( if test "$(DESTDIR)$(ZM_LOGDIR)" != "$(DESTDIR)/var/log"; then rm -rf $(DESTDIR)$(ZM_LOGDIR); fi ) - From 4cc80d4cc5b3ea01434b9b7b38ccefcd51e1aecf Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 14 Sep 2013 12:14:08 -0500 Subject: [PATCH 04/13] Update zoneminder.1.26.el6.spec Removed reference to a patch that has been added upstream --- redhat/zoneminder.1.26.el6.spec | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/redhat/zoneminder.1.26.el6.spec b/redhat/zoneminder.1.26.el6.spec index bf847056d..30b2c1d90 100644 --- a/redhat/zoneminder.1.26.el6.spec +++ b/redhat/zoneminder.1.26.el6.spec @@ -35,8 +35,7 @@ Source10: cambozola-%{cambrev}.tar.gz Patch1: zoneminder-1.26.0-dbinstall.patch Patch2: zoneminder-runlevel.patch -Patch3: zoneminder-1.25.0-installfix.patch -Patch4: zoneminder-1.26.0-defaults.patch +Patch3: zoneminder-1.26.0-defaults.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -105,8 +104,7 @@ popd %patch1 -p0 -b .dbinstall %patch2 -p0 -b .runlevel -%patch3 -p0 -b .installfix -%patch4 -p0 +%patch3 -p0 cp %{SOURCE4} README.CentOS cp %{SOURCE9} local_zoneminder.te From c3f7af7cd1b53821ee9de1b044d3597cb9b6dd51 Mon Sep 17 00:00:00 2001 From: mastertheknife Date: Sun, 15 Sep 2013 04:13:09 +0300 Subject: [PATCH 05/13] Fix sign warning during compilation --- src/zm_image.cpp | 4 ++-- src/zm_monitor.cpp | 2 +- src/zmf.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 0464e6c25..6a301f165 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -633,7 +633,7 @@ bool Image::WriteRaw( const char *filename ) const bool Image::ReadJpeg( const char *filename, int p_colours, int p_subpixelorder) { - unsigned int new_width, new_height, new_colours, new_subpixelorder; + int new_width, new_height, new_colours, new_subpixelorder; struct jpeg_decompress_struct *cinfo = jpg_dcinfo; if ( !cinfo ) @@ -886,7 +886,7 @@ bool Image::WriteJpeg( const char *filename, int quality_override ) const bool Image::DecodeJpeg( const JOCTET *inbuffer, int inbuffer_size, int p_colours, int p_subpixelorder) { - unsigned int new_width, new_height, new_colours, new_subpixelorder; + int new_width, new_height, new_colours, new_subpixelorder; struct jpeg_decompress_struct *cinfo = jpg_dcinfo; if ( !cinfo ) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 463cf2b07..79d96e234 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -2727,7 +2727,7 @@ int Monitor::Capture() } if ( true ) { - if ( capture_image->Size() != camera->ImageSize() ) + if ( capture_image->Size() != (int)camera->ImageSize() ) { Error( "Captured image does not match expected size, check width, height and colour depth" ); return( -1 ); diff --git a/src/zmf.cpp b/src/zmf.cpp index 60c00967e..b37285122 100644 --- a/src/zmf.cpp +++ b/src/zmf.cpp @@ -240,14 +240,14 @@ int main( int argc, char *argv[] ) { n_bytes = read( sd, image_data+bytes_read, frame_header.image_length-bytes_read ); if (n_bytes < 0) break; // break on error - if (n_bytes < frame_header.image_length) + if (n_bytes < (int)frame_header.image_length) { // print some informational messages if (bytes_read == 0) { // Warning("Image read : Short read %d bytes of %d expected bytes",n_bytes,frame_header.image_length); } - else if (bytes_read+n_bytes == frame_header.image_length) + else if (bytes_read+n_bytes == (int)frame_header.image_length) { // Warning("Image read : Read rest of short read: %d bytes read total of %d bytes",n_bytes,frame_header.image_length); } From ab4c09169362eba2b976302e0e212926539566b2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 15 Sep 2013 12:59:45 -0400 Subject: [PATCH 06/13] change eq's to le's so that it runs scripts for upgrading from 1.26.0 --- scripts/zmupdate.pl.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/zmupdate.pl.in b/scripts/zmupdate.pl.in index a5a667e09..115d8138a 100644 --- a/scripts/zmupdate.pl.in +++ b/scripts/zmupdate.pl.in @@ -1025,21 +1025,21 @@ if ( $version ) $cascade = !undef; } - if ( $cascade || $version eq "1.26.1" ) + if ( $cascade || $version le "1.26.1" ) { # Patch the database patchDB( $dbh, "1.26.1" ); $cascade = !undef; } - if ( $cascade || $version eq "1.26.2" ) + if ( $cascade || $version le "1.26.2" ) { # Patch the database patchDB( $dbh, "1.26.2" ); $cascade = !undef; } - if ( $cascade || $version eq "1.26.3" ) + if ( $cascade || $version le "1.26.3" ) { # Patch the database patchDB( $dbh, "1.26.3" ); From efc729110a583587910f9372e94af361f5d54766 Mon Sep 17 00:00:00 2001 From: abauer Date: Sun, 15 Sep 2013 16:33:09 -0500 Subject: [PATCH 07/13] Move redhat folder to a subfolder called distros --- distros/redhat/README.CentOS | 62 +++ distros/redhat/README.Fedora | 81 ++++ distros/redhat/README.SuSE | 17 + distros/redhat/local_zoneminder.te | 72 ++++ distros/redhat/redalert.wav | Bin 0 -> 45404 bytes distros/redhat/zm-init | 48 +++ distros/redhat/zm-logrotate_d | 7 + .../redhat/zoneminder-1.26.0-dbinstall.patch | 72 ++++ .../redhat/zoneminder-1.26.0-defaults.patch | 76 ++++ distros/redhat/zoneminder-runlevel.patch | 11 + distros/redhat/zoneminder.1.26.el6.spec | 407 ++++++++++++++++++ distros/redhat/zoneminder.conf | 33 ++ 12 files changed, 886 insertions(+) create mode 100644 distros/redhat/README.CentOS create mode 100644 distros/redhat/README.Fedora create mode 100644 distros/redhat/README.SuSE create mode 100644 distros/redhat/local_zoneminder.te create mode 100755 distros/redhat/redalert.wav create mode 100644 distros/redhat/zm-init create mode 100644 distros/redhat/zm-logrotate_d create mode 100644 distros/redhat/zoneminder-1.26.0-dbinstall.patch create mode 100644 distros/redhat/zoneminder-1.26.0-defaults.patch create mode 100644 distros/redhat/zoneminder-runlevel.patch create mode 100644 distros/redhat/zoneminder.1.26.el6.spec create mode 100644 distros/redhat/zoneminder.conf diff --git a/distros/redhat/README.CentOS b/distros/redhat/README.CentOS new file mode 100644 index 000000000..319b8a7ab --- /dev/null +++ b/distros/redhat/README.CentOS @@ -0,0 +1,62 @@ +================================================================================ + NEW INSTALLS +================================================================================ + +1. Unless you are already using MySQL server, you need to ensure that + the server is confired to start during boot and properly secured + by running: + + sudo service mysqld start + /usr/bin/mysql_secure_installation + sudo chkconfig mysqld on + +2. Using the password for the root account set during the previous step, you + will need to create the ZoneMinder database: + + mysql -uroot -p + mysql> create database zm; + mysql> grant select,insert,update,delete on zm.* to + 'zmuser'@localhost identified by 'zmpass'; + mysql> exit; + mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql + mysqladmin -uroot -p reload + +3. IMPORTANT: Edit /etc/php.ini and put in the appropriate timezone for + date.timezone! + +4. The ZoneMinder web interface is disabled by default, you will need + to edit this file to enable it: + + /etc/httpd/conf.d/zoneminder.conf + + HINT: Most users will want to simply delete the line that says + "Deny from all". + +5. Configure the web server to start automatically: + + sudo chkconfig httpd on + sudo service httpd start + +6. This package has automatically configured and installed an SELinux policy + called local_zoneminder. A copy of this policy is in the documentation + folder. + +7. Finally, you may start the ZoneMinder service: + + sudo service zoneminder start + + Then point your web browser to http:///zm + +================================================================================ + UPGRADES +================================================================================ + +1. You will need to upgrade the ZoneMinder database as described in the + manual. This command should be sufficient: + + sudo zmupdate.pl --user=root --pass= --version= + + It is recommended to backup your database and then upgrade your tables + to InnoDB when prompted. + + diff --git a/distros/redhat/README.Fedora b/distros/redhat/README.Fedora new file mode 100644 index 000000000..f1a4b587a --- /dev/null +++ b/distros/redhat/README.Fedora @@ -0,0 +1,81 @@ +New installs +============ + +1. Unless you are already using the MySQL server or you are running it + remotely you will need to ensure that the server is installed and secured: + + yum install mysql-server + chkconfig mysql on + service mysql start + mysql_secure_installation + +2. You will need to create the ZoneMinder database. These commands should do + the trick, assuming your database server is local: + + mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql + mysqladmin reload + +3. The database needs a user. One is not created by default because this would + introduce an obvious security issue. The following should set this up: + + mysql -u root -p + grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass'; + + Obviously, change at least zmpass to an actual, secure password or + passphrase. You can change zmuser as well if you like. + +4. Edit /etc/zm.conf and, at the bottom, change ZM_DB_PASS and perhaps + ZM_DB_USER to match. + +5. Edit /etc/php.ini, uncomment the date.timezone line, and add your local + timezone. For whatever reason, 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 in + /etc/sysconfig/clock. + +6. This package probably does not work with SELinux enabled at the moment. It + may be necessary to disable SELinux for httpd, or even completely for + ZoneMinder to function. This will be addressed in a later release. Run + + setenforce 0 + + for testing, and edit /etc/sysconfig/selinux to disable it at boot time. + +7. Enable and start the zoneminder service: + + systemctl enable zoneminder.service + systemctl start zoneminder.service + +8. The ZoneMinder web interface is disabled by default (which makes it rather + useless but also secure by default), you will need to edit + /etc/httpd/conf.d/zoneminder.conf to enable it. Afterwards, you can start + the web server: + + systemctl enable httpd.service + systemctl start httpd.service + +9. You should immediately visit http://localhost/zm and secure the system if + it is network facing. To do this: + + a) click Options, then System. + b) check OPT_USE_AUTH. + c) set AUTH_HASH_SECRET to a random string. + d) click Save and refresh the main browser window. + e) You should be prompted to log in; the default username/password is admin/admin. + f) Open Options again, choose the newly visible Users tab. + g) click the admin user and set a password. + + +Upgrades +======== + +1. Update /etc/zm.conf. Check for any new settings and update the version + information. Comparing /etc/zm.conf and /etc/zm.conf.rpmnew should help to + do this. + +2. You will need to upgrade the ZoneMinder database as described in the + manual. This command should be sufficient when run as root: + + zmupdate.pl --version= diff --git a/distros/redhat/README.SuSE b/distros/redhat/README.SuSE new file mode 100644 index 000000000..ff7f64f95 --- /dev/null +++ b/distros/redhat/README.SuSE @@ -0,0 +1,17 @@ +After install run "zm_database_init" to create +the database and the zm database user (zm_admin). +The config file is automaticly adjusted with the +entered password for zm_admin. + +If you want to use X10 thwn install the the required +perl module with cpan. + +information: +during the run of zm_database_init a .my.cnf will +be created/updated (in the home directory of root) +so that root can access the database without password. +It Does not delete the .my.cnf when it exists, but checks +whether it has an entry for the mysql client [client] which +contains as username root. When the entry not exist or +the username is not root the .my.cnf will be modified +to fit the above requirements. \ No newline at end of file diff --git a/distros/redhat/local_zoneminder.te b/distros/redhat/local_zoneminder.te new file mode 100644 index 000000000..d164af1c5 --- /dev/null +++ b/distros/redhat/local_zoneminder.te @@ -0,0 +1,72 @@ + +module local_zoneminder 1.0; + +require { + 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; + class unix_stream_socket { read connectto }; + class lnk_file { write getattr read lock unlink }; + class dir search; + 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; +allow httpd_t auditd_t:file { read getattr open }; +allow httpd_t crond_t:dir search; +allow httpd_t crond_t:file { read getattr open }; +allow httpd_t dhcpc_t:dir search; +allow httpd_t dhcpc_t:file { read getattr open }; +allow httpd_t getty_t:dir search; +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; +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, dirsrvadmin_config_t, httpd_lock_t, dirsrv_config_t, httpd_tmp_t, dirsrvadmin_tmp_t, httpd_cache_t, httpd_tmpfs_t, httpd_squirrelmail_t, dirsrv_var_log_t, zarafa_var_lib_t, dirsrv_var_run_t, httpd_var_lib_t, httpd_var_run_t, passenger_tmp_t, httpd_nutups_cgi_rw_content_t, httpd_apcupsd_cgi_rw_content_t, httpd_dspam_rw_content_t, httpd_mediawiki_rw_content_t, httpd_squid_rw_content_t, httpd_prewikka_rw_content_t, httpd_smokeping_cgi_rw_content_t, passenger_var_run_t, httpd_openshift_rw_content_t, httpd_dirsrvadmin_rw_content_t, httpd_w3c_validator_rw_content_t, httpd_user_rw_content_t, httpd_awstats_rw_content_t, httpdcontent, httpd_cobbler_rw_content_t, root_t, httpd_munin_rw_content_t, httpd_bugzilla_rw_content_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 + +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 { read lock open }; +allow httpd_t kernel_t:dir search; +allow httpd_t kernel_t:file { read getattr open }; +allow httpd_t mysqld_safe_t:dir search; +allow httpd_t mysqld_safe_t:file { read getattr open }; +allow httpd_t mysqld_t:dir search; +allow httpd_t mysqld_t:file { read getattr open }; +allow httpd_t sshd_t:dir search; +allow httpd_t sshd_t:file { read getattr open }; +allow httpd_t syslogd_t:dir search; +allow httpd_t syslogd_t:file { read getattr open }; +allow httpd_t tmpfs_t:sock_file write; +allow httpd_t udev_t:dir search; +allow httpd_t udev_t:file { read getattr open }; +allow httpd_t unconfined_t:dir search; +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 v4l_device_t:chr_file getattr; diff --git a/distros/redhat/redalert.wav b/distros/redhat/redalert.wav new file mode 100755 index 0000000000000000000000000000000000000000..41e23e0794bdc42f187e51b454767b51727346c5 GIT binary patch literal 45404 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

6U=TqizX$fgf)Z8n=d!`^24;S9QoJQnr| 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 +chmod 600 $sql + +echo "CREATE DATABASE /*!32312 IF NOT EXISTS*/ $ZM_DB_NAME;" >>$sql +echo "USE $ZM_DB_NAME;" >>$sql + +echo "GRANT all on $ZM_DB_NAME.* TO '$ZM_DB_USER'@'$ClientHost' IDENTIFIED BY '$ZM_DB_PASS';" >>$sql + +echo -n "Enter MySQL Administrator username: " +read admin +cat $sql | mysql -B -h $ZM_DB_SERVER -u $admin -p +rm -f $sql + +cat /usr/lib/zm/init/zmschema.sql | mysql -h $ZM_DB_SERVER -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME +( cd $ZM_PATH/init; perl $ZM_PATH/init/zmoptions -f $ZM_PATH/init/zmconfig.txt ) diff --git a/distros/redhat/zm-logrotate_d b/distros/redhat/zm-logrotate_d new file mode 100644 index 000000000..61cc9d0eb --- /dev/null +++ b/distros/redhat/zm-logrotate_d @@ -0,0 +1,7 @@ +/var/log/zoneminder/*log +{ + weekly + notifempty + missingok + create 660 http http +} diff --git a/distros/redhat/zoneminder-1.26.0-dbinstall.patch b/distros/redhat/zoneminder-1.26.0-dbinstall.patch new file mode 100644 index 000000000..5b688a75d --- /dev/null +++ b/distros/redhat/zoneminder-1.26.0-dbinstall.patch @@ -0,0 +1,72 @@ +--- configure.ac 2013-09-05 10:33:08.000000000 -0500 ++++ configure.ac.dbinstall 2013-09-05 17:23:28.555553447 -0500 +@@ -1,13 +1,11 @@ + AC_PREREQ(2.59) +-AC_INIT(zm,1.26.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],ZoneMinder,http://www.zoneminder.com/downloads.html) ++AC_INIT(zm,1.26.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) + AM_INIT_AUTOMAKE + AC_CONFIG_SRCDIR(src/zm.h) + AC_CONFIG_HEADERS(config.h) + + AC_SUBST([AM_CXXFLAGS], [-D__STDC_CONSTANT_MACROS]) + +-PATH_BUILD=`pwd` +-AC_SUBST(PATH_BUILD) + TIME_BUILD=`date +'%s'` + AC_SUBST(TIME_BUILD) + +@@ -354,6 +352,8 @@ AC_PROG_PERL_MODULES(X10::ActiveHome,,AC + + AC_DEFINE_DIR([BINDIR],[bindir],[Expanded binary directory]) + AC_DEFINE_DIR([LIBDIR],[libdir],[Expanded library directory]) ++AC_DEFINE_DIR([DATADIR],[datadir],[Expanded data directory]) ++AC_SUBST(PKGDATADIR,"$DATADIR/$PACKAGE") + AC_SUBST(ZM_PID,"$ZM_RUNDIR/zm.pid") + AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) + AC_SUBST(ZM_CONFIG,"$SYSCONFDIR/zm.conf") +diff -up ./db/Makefile.am.dbinstall ./db/Makefile.am +--- ./db/Makefile.am.dbinstall 2009-10-14 04:42:46.000000000 -0500 ++++ ./db/Makefile.am 2011-03-24 22:50:14.173912137 -0500 +@@ -1,7 +1,16 @@ + AUTOMAKE_OPTIONS = gnu + ++zmdbdatadir = $(pkgdatadir)/db ++ + EXTRA_DIST = \ + zm_create.sql.in \ ++ $(dbupgrade_scripts) ++ ++dist_zmdbdata_DATA = \ ++ zm_create.sql \ ++ $(dbupgrade_scripts) ++ ++dbupgrade_scripts = \ + zm_update-0.0.1.sql \ + zm_update-0.9.7.sql \ + zm_update-0.9.8.sql \ +diff -up ./scripts/zmupdate.pl.in.dbinstall ./scripts/zmupdate.pl.in +--- ./scripts/zmupdate.pl.in.dbinstall 2011-08-27 15:44:05.335602405 -0500 ++++ ./scripts/zmupdate.pl.in 2011-08-26 02:51:37.000000000 -0500 +@@ -424,7 +424,7 @@ if ( $version ) + } + else + { +- $command .= ZM_PATH_BUILD."/db"; ++ $command .= ZM_PATH_DATA."/db"; + } + $command .= "/zm_update-".$version.".sql"; + +diff -up ./zm.conf.in.dbinstall ./zm.conf.in +--- ./zm.conf.in.dbinstall 2008-07-25 04:48:16.000000000 -0500 ++++ ./zm.conf.in 2011-03-24 22:50:14.175912077 -0500 +@@ -12,8 +12,8 @@ + # Current version of ZoneMinder + ZM_VERSION=@VERSION@ + +-# Path to build directory, used mostly for finding DB upgrade scripts +-ZM_PATH_BUILD=@PATH_BUILD@ ++# Path to installed data directory, used mostly for finding DB upgrade scripts ++ZM_PATH_DATA=@PKGDATADIR@ + + # Build time, used to record when to trigger various checks + ZM_TIME_BUILD=@TIME_BUILD@ diff --git a/distros/redhat/zoneminder-1.26.0-defaults.patch b/distros/redhat/zoneminder-1.26.0-defaults.patch new file mode 100644 index 000000000..3e5dda67c --- /dev/null +++ b/distros/redhat/zoneminder-1.26.0-defaults.patch @@ -0,0 +1,76 @@ +--- configure.ac 2013-08-15 11:44:10.000000000 -0500 ++++ configure.ac.logdir 2013-08-17 09:20:07.326053328 -0500 +@@ -46,7 +46,7 @@ + AC_SUBST(ZM_TMPDIR,[/tmp/zm]) + fi + if test "$ZM_LOGDIR" == ""; then +- AC_SUBST(ZM_LOGDIR,[/var/log/zm]) ++ AC_SUBST(ZM_LOGDIR,[/var/log/zoneminder]) + fi + + LIB_ARCH=lib +--- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in 2013-08-01 18:14:45.175241378 -0500 ++++ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in.defaults 2013-08-07 18:57:42.525006149 -0500 +@@ -187,7 +187,7 @@ + }, + { + name => "ZM_PATH_ZMS", +- default => "/cgi-bin/nph-zms", ++ default => "/cgi-bin/zm/nph-zms", + description => "Web path to zms streaming server", + help => "The ZoneMinder streaming server is required to send streamed images to your browser. It will be installed into the cgi-bin path given at configuration time. This option determines what the web path to the server is rather than the local path on your machine. Ordinarily the streaming server runs in parser-header mode however if you experience problems with streaming you can change this to non-parsed-header (nph) mode by changing 'zms' to 'nph-zms'.", + type => $types{rel_path}, +@@ -276,7 +276,7 @@ + }, + { + name => "ZM_OPT_CAMBOZOLA", +- default => "no", ++ default => "yes", + description => "Is the (optional) cambozola java streaming client installed", + help => "Cambozola is a handy low fat cheese flavoured Java applet that ZoneMinder uses to view image streams on browsers such as Internet Explorer that don't natively support this format. If you use this browser it is highly recommended to install this from http://www.charliemouse.com/code/cambozola/ however if it is not installed still images at a lower refresh rate can still be viewed.", + type => $types{boolean}, +@@ -526,7 +526,7 @@ + }, + { + name => "ZM_LOG_DEBUG_FILE", +- default => "@ZM_TMPDIR@/zm_debug.log+", ++ default => "/var/log/zoneminder/zm_debug_log+", + description => "Where extra debug is output to", + help => "This option allows you to specify a different target for debug output. All components have a default log file which will norally be in /tmp or /var/log and this is where debug will be written to if this value is empty. Adding a path here will temporarily redirect debug, and other logging output, to this file. This option is a simple filename and you are debugging several components then they will all try and write to the same file with undesirable consequences. Appending a '+' to the filename will cause the file to be created with a '.' suffix containing your process id. In this way debug from each run of a component is kept separate. This is the recommended setting as it will also prevent subsequent runs from overwriting the same log. You should ensure that permissions are set up to allow writing to the file and directory specified here.", + requires => [ { name => "ZM_LOG_DEBUG", value => "yes" } ], +@@ -623,7 +623,7 @@ + }, + { + name => "ZM_PATH_SOCKS", +- default => "@ZM_TMPDIR@", ++ default => "/var/lib/zoneminder/sock", + description => "Path to the various Unix domain socket files that ZoneMinder uses", + help => "ZoneMinder generally uses Unix domain sockets where possible. This reduces the need for port assignments and prevents external applications from possibly compromising the daemons. However each Unix socket requires a .sock file to be created. This option indicates where those socket files go.", + type => $types{abs_path}, +@@ -639,7 +639,7 @@ + }, + { + name => "ZM_PATH_SWAP", +- default => "@ZM_TMPDIR@", ++ default => "/dev/shm", + description => "Path to location for temporary swap images used in streaming", + help => "Buffered playback requires temporary swap images to be stored for each instance of the streaming daemons. This option determines where these images will be stored. The images will actually be stored in sub directories beneath this location and will be automatically cleaned up after a period of time.", + type => $types{abs_path}, +@@ -902,7 +902,7 @@ + }, + { + name => "ZM_UPLOAD_FTP_LOC_DIR", +- default => "@ZM_TMPDIR@", ++ default => "/var/spool/zoneminder-upload", + description => "The local directory in which to create upload files", + help => "You can use filters to instruct ZoneMinder to upload events to a remote ftp server. This option indicates the local directory that ZoneMinder should use for temporary upload files. These are files that are created from events, uploaded and then deleted.", + requires => [ { name => "ZM_OPT_UPLOAD", value => "yes" } ], +@@ -1258,7 +1258,7 @@ + }, + { + name => "ZM_OPT_CONTROL", +- default => "no", ++ default => "yes", + description => "Support controllable (e.g. PTZ) cameras", + help => "ZoneMinder includes limited support for controllable cameras. A number of sample protocols are included and others can easily be added. If you wish to control your cameras via ZoneMinder then select this option otherwise if you only have static cameras or use other control methods then leave this option off.", + type => $types{boolean}, diff --git a/distros/redhat/zoneminder-runlevel.patch b/distros/redhat/zoneminder-runlevel.patch new file mode 100644 index 000000000..de7b49b0b --- /dev/null +++ b/distros/redhat/zoneminder-runlevel.patch @@ -0,0 +1,11 @@ +diff -up ./scripts/zm.in.runlevel ./scripts/zm.in +--- ./scripts/zm.in.runlevel 2010-11-28 15:22:05.000000000 -0600 ++++ ./scripts/zm.in 2011-03-24 21:39:01.973010160 -0500 +@@ -1,6 +1,6 @@ + #!/bin/sh + # description: ZoneMinder is the top Linux video camera security and surveillance solution. ZoneMinder is intended for use in single or multi-camera video security applications.Copyright: Philip Coombes, Corey DeLasaux 2003-2008 +-# chkconfig: 2345 99 00 ++# chkconfig: - 99 00 + # processname: zmpkg.pl + + # Source function library. diff --git a/distros/redhat/zoneminder.1.26.el6.spec b/distros/redhat/zoneminder.1.26.el6.spec new file mode 100644 index 000000000..30b2c1d90 --- /dev/null +++ b/distros/redhat/zoneminder.1.26.el6.spec @@ -0,0 +1,407 @@ +%define cambrev 0.931 +%define moorev 1.3.2 +%define jscrev 1.0 + +%define zmuid $(id -un) +%define zmgid $(id -gn) +%define zmuid_final apache +%define zmgid_final apache + +Name: zoneminder +Version: 1.26.0 +Release: 1%{?dist} +Summary: A camera monitoring and analysis tool +Group: System Environment/Daemons +# jscalendar is LGPL (any version): http://www.dynarch.com/projects/calendar/ +# Mootools is inder the MIT license: http://mootools.net/ +# Cambozola is GPL: http://www.charliemouse.com/code/cambozola/ +License: GPLv2+ and LGPLv2+ and MIT +URL: http://www.zoneminder.com/ + +# Some of these sources to be added upstream. Will edit once that happens. +Source0: zoneminder-%{version}.tar.gz +Source2: zoneminder.conf +Source3: redalert.wav +Source4: README.CentOS +Source5: jscalendar-%{jscrev}.zip +#Source5: http://downloads.sourceforge.net/jscalendar/jscalendar-%{jscrev}.zip +Source6: mootools-core-%{moorev}-full-compat-yc.js +#Source6: http://mootools.net/download/get/mootools-core-%{moorev}-full-compat-yc.js +Source7: zm-init +Source8: zm-logrotate_d +Source9: local_zoneminder.te +Source10: cambozola-%{cambrev}.tar.gz +#Source10: http://www.andywilcock.com/code/cambozola/cambozola-%{cambrev}.tar.gz + +Patch1: zoneminder-1.26.0-dbinstall.patch +Patch2: zoneminder-runlevel.patch +Patch3: zoneminder-1.26.0-defaults.patch + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: automake gnutls-devel bzip2-devel libtool +BuildRequires: mysql-devel pcre-devel libjpeg-turbo-devel +BuildRequires: perl(Archive::Tar) perl(Archive::Zip) +BuildRequires: perl(Date::Manip) perl(DBD::mysql) +BuildRequires: perl(ExtUtils::MakeMaker) perl(LWP::UserAgent) +BuildRequires: perl(MIME::Entity) perl(MIME::Lite) +BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) +BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) +BuildRequires: perl(Expect) perl(X10::ActiveHome) perl(Astro::SunTime) +# Change this for distros compatible newer ffmpeg & gcc +BuildRequires: ffmpeg-devel >= 0.4.9 +BuildRequires: ffmpeg-devel <= 0.6.5 +BuildRequires: gcc < 4.7 + +Requires: httpd php php-mysql mysql-server libjpeg-turbo +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) +Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) +Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) +# Change this for distros compatible newer ffmpeg +Requires: ffmpeg >= 0.4.9 +Requires: ffmpeg <= 0.6.5 + +Requires(post): /sbin/chkconfig +Requires(post): /usr/bin/checkmodule +Requires(post): /usr/bin/semodule_package +Requires(post): /usr/sbin/semodule +Requires(post): /usr/bin/gpasswd +Requires(post): /usr/bin/less +Requires(preun): /sbin/chkconfig +Requires(preun): /sbin/service +Requires(preun): /usr/sbin/semodule +Requires(postun): /sbin/service + + +%description +ZoneMinder is a set of applications which is intended to provide a complete +solution allowing you to capture, analyse, 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. + + +%prep +%setup -q -n zoneminder-%{version} + +# Unpack jscalendar and move some files around +%setup -q -D -T -a 5 -n zoneminder-%{version} +mkdir jscalendar-doc +pushd jscalendar-%{jscrev} +mv *html *php doc/* README ../jscalendar-doc +rmdir doc +popd + +# Unpack Cambozola and move some files around +%setup -q -D -T -a 10 -n zoneminder-%{version} +mkdir cambozola-doc +pushd cambozola-%{cambrev} +mv application.properties build.xml dist.sh *html LICENSE testPages/* ../cambozola-doc +rmdir testPages +popd + +%patch1 -p0 -b .dbinstall +%patch2 -p0 -b .runlevel +%patch3 -p0 + +cp %{SOURCE4} README.CentOS +cp %{SOURCE9} local_zoneminder.te + +%build +libtoolize --force +aclocal +autoheader +automake --force-missing --add-missing +autoconf +#autoreconf + +OPTS="" +%ifnarch %{ix86} x86_64 + OPTS="$OPTS --disable-crashtrace" +%endif + +%configure \ + --with-libarch=%{_lib} \ +%ifarch %{ix86} %{x8664} + --enable-crashtrace \ +%else + --disable-crashtrace \ +%endif + --with-mysql=%{_prefix} \ + --with-ffmpeg=%{_prefix} \ + --with-webdir=%{_datadir}/%{name}/www \ + --with-cgidir=%{_libexecdir}/%{name}/cgi-bin \ + --with-webuser=%{zmuid} \ + --with-webgroup=%{zmgid} \ + --enable-mmap=yes \ + --disable-debug \ + --with-webhost=zm.local \ + ZM_SSL_LIB="gnutls" \ + ZM_RUNDIR=/var/run/zoneminder \ + ZM_TMPDIR=/var/lib/zoneminder/temp \ + CXXFLAGS="-D__STDC_CONSTANT_MACROS -msse2" \ + --with-extralibs="" + +make %{?_smp_mflags} +%{__perl} -pi -e 's/(ZM_WEB_USER=).*$/${1}%{zmuid_final}/;' \ + -e 's/(ZM_WEB_GROUP=).*$/${1}%{zmgid_final}/;' zm.conf + +%install +install -d %{buildroot}/%{_localstatedir}/run +install -d %{buildroot}/etc/logrotate.d + +make install DESTDIR=%{buildroot} \ + INSTALLDIRS=vendor + +rm -rf %{buildroot}/%{perl_vendorarch} %{buildroot}/%{perl_archlib} + +install -m 755 -d %{buildroot}/%{_localstatedir}/log/zoneminder +for dir in events images temp +do + install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/$dir + rmdir %{buildroot}/%{_datadir}/%{name}/www/$dir + ln -sf ../../../..%{_localstatedir}/lib/zoneminder/$dir %{buildroot}/%{_datadir}/%{name}/www/$dir +done +install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/sock +install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/swap +install -m 755 -d %{buildroot}/%{_localstatedir}/spool/zoneminder-upload + +install -D -m 755 scripts/zm %{buildroot}/%{_initrddir}/zoneminder +install -D -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/httpd/conf.d/zoneminder.conf +install -D -m 755 %{SOURCE3} %{buildroot}/%{_datadir}/%{name}/www/sounds/redalert.wav +install %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name} + +# Install jscalendar +install -d -m 755 %{buildroot}/%{_datadir}/%{name}/www/jscalendar +cp -rp jscalendar-%{jscrev}/* %{buildroot}/%{_datadir}/%{name}/www/jscalendar + +# Install Cambozola +cp -rp cambozola-%{cambrev}/dist/cambozola.jar %{buildroot}/%{_datadir}/%{name}/www/ +rm -rf cambozola-%{cambrev} + +# Install mootools +pushd %{buildroot}/%{_datadir}/%{name}/www +install -m 644 %{SOURCE6} mootools-core-%{moorev}-full-compat-yc.js +ln -s mootools-core-%{moorev}-full-compat-yc.js mootools.js +popd + +%post +/sbin/chkconfig --add zoneminder +/sbin/chkconfig zoneminder on + +# Allow zoneminder access to local video sources +echo +/usr/bin/gpasswd -a apache video + +# Create and load zoneminder selinux policy module +echo -e "\nCreating and installing a ZoneMinder SELinux policy module. Please wait.\n" +/usr/bin/checkmodule -M -m -o %{_docdir}/%{name}-%{version}/local_zoneminder.mod %{_docdir}/%{name}-%{version}/local_zoneminder.te > /dev/null +/usr/bin/semodule_package -o %{_docdir}/%{name}-%{version}/local_zoneminder.pp -m %{_docdir}/%{name}-%{version}/local_zoneminder.mod > /dev/null +/usr/sbin/semodule -i %{_docdir}/%{name}-%{version}/local_zoneminder.pp > /dev/null + +# Display the README for post installation instructions +/usr/bin/less %{_docdir}/%{name}-%{version}/README.CentOS + +%preun +if [ $1 -eq 0 ]; then + /sbin/service zoneminder stop > /dev/null 2>&1 || : + /sbin/chkconfig --del zoneminder + echo -e "\nRemoving ZoneMinder SELinux policy module. Please wait.\n" + /usr/sbin/semodule -r local_zoneminder.pp +fi + + +%postun +if [ $1 -ge 1 ]; then + /sbin/service zoneminder condrestart > /dev/null 2>&1 || : +fi + + +%files +%defattr(-,root,root,-) +%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md README.CentOS jscalendar-doc cambozola-doc local_zoneminder.te +%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm.conf +%config(noreplace) %attr(644,root,root) %{_sysconfdir}/httpd/conf.d/zoneminder.conf +%config(noreplace) /etc/logrotate.d/%{name} +%attr(755,root,root) %{_initrddir}/zoneminder + +%{_bindir}/zma +%{_bindir}/zmaudit.pl +%{_bindir}/zmc +%{_bindir}/zmcontrol.pl +%{_bindir}/zmdc.pl +%{_bindir}/zmf +%{_bindir}/zmfilter.pl +%attr(4755,root,root) %{_bindir}/zmfix +%{_bindir}/zmpkg.pl +%{_bindir}/zmstreamer +%{_bindir}/zmtrack.pl +%{_bindir}/zmtrigger.pl +%{_bindir}/zmu +%{_bindir}/zmupdate.pl +%{_bindir}/zmvideo.pl +%{_bindir}/zmwatch.pl +%{_bindir}/zmx10.pl + +%{perl_vendorlib}/ZoneMinder* +%{_mandir}/man*/* +%dir %{_libexecdir}/%{name} +%{_libexecdir}/%{name}/cgi-bin +%dir %{_datadir}/%{name} +%{_datadir}/%{name}/db +%{_datadir}/%{name}/www + +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/events +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/images +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/sock +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/swap +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/temp +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/log/zoneminder +%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/spool/zoneminder-upload + + +%changelog +* Thu Sep 05 2013 Andrew Bauer - 1.26.0 +- 1.26.0 Release +- https://github.com/ZoneMinder/ZoneMinder/archive/v1.26.0.tar.gz + +* Sun Sep 01 2013 Andrew Bauer - 1.26.0-beta +- Update SELinux policy module + +* Thu Aug 29 2013 Andrew Bauer - 1.26.0-beta +- Third Beta release +- https://github.com/ZoneMinder/ZoneMinder/tree/release-1.26 +- Reduce number of uneeded dependencies by integrating cambozola into spec file + +* Thu Aug 15 2013 Andrew Bauer - 1.26.0-beta +- Initial Beta release +- https://github.com/ZoneMinder/ZoneMinder/tree/release-1.26 + +* Sun Aug 11 2013 Andrew Bauer - 1.25.0-kfirproper +- Modified specfile to work with kfir-proper branch +- https://github.com/ZoneMinder/ZoneMinder/tree/kfir-proper + +* Wed Aug 07 2013 Andrew Bauer - 1.25.0-2svn3827 +- Move RHEL/CentOS specific defaults to a patch file +- Add bzip2-devel as a build dependency +- Default ZM_SSL_LIB back to gnutls. AUTH_RELAY = hashed didn't work with openssl. + +* Fri Aug 02 2013 Andrew Bauer - 1.25.0-1svn3827 +- Update to latest 1.25.0 subversion. +- Does not compile with modern versions of ffmpeg. Configure to work only with older versions. +- Does not compile with gcc 4.7. Configure to build with gcc less than 4.7. + +* Thu Mar 24 2011 Jason L Tibbitts III - 1.24.3-4.20110324svn3310 +- Update to latest 1.24.3 subversion. Turns out that what upstream was calling + 1.24.3 is really just an occasionally updated devel snapshot. +- Rebase various patches. + +* Wed Mar 23 2011 Dan Horák - 1.24.3-3 +- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient) + +* Tue Feb 08 2011 Fedora Release Engineering - 1.24.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Jan 25 2011 Jason L Tibbitts III - 1.24.3-1 +- Update to latest upstream version. +- Rebase patches. +- Initial incomplete attempt to disable v4l1 support. + +* Fri Jan 21 2011 Jason L Tibbitts III - 1.24.2-6 +- Unbundle cambozola; instead link to the separately pacakged copy. +- Remove BuildRoot:, %%clean and buildroot cleaning in %%install. +- Git rid of mixed space/tab usage by removing all tabs. +- Remove unnecessary Conflicts: line. +- Attempt to force short_open_tag on for the code directories. +- Move default location of sockets, swaps, logfiles and some temporary files to + make more sense and allow things to work better with a future selinux policy. +- Fix errors in README.CentOS. + +* Wed Jun 02 2010 Marcela Maslanova - 1.24.2-5 +- Mass rebuild with perl-5.12.0 + +* Fri Dec 4 2009 Stepan Kasal - 1.24.2-4 +- rebuild against perl 5.10.1 +- use Perl vendorarch and archlib variables correctly + +* Mon Jul 27 2009 Fedora Release Engineering - 1.24.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-2 +- Bump release since 1.24.2-1 was mistakenly tagged a few months ago. + +* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-1 +- Initial update to 1.24.2. +- Rebase patches. +- Update mootools download location. +- Update to mootools 1.2.3. +- Add additional dependencies for some optional features. + +* Sat Apr 11 2009 Martin Ebourne - 1.24.1-3 +- Remove unused Sys::Mmap perl dependency RPM is finding + +* Sat Apr 11 2009 Martin Ebourne - 1.24.1-2 +- Update gcc44 patch to disable -frepo, seems to be broken with gcc44 +- Added noffmpeg patch to make building outside mock easier + +* Sat Mar 21 2009 Martin Ebourne - 1.24.1-1 +- Patch for gcc 4.4 compilation errors +- Upgrade to 1.24.1 + +* Wed Feb 25 2009 Fedora Release Engineering - 1.23.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Sat Jan 24 2009 Caolán McNamara - 1.23.3-3 +- rebuild for dependencies + +* Mon Dec 15 2008 Martin Ebourne - 1.23.3-2 +- Fix permissions on zm.conf + +* Fri Jul 11 2008 Jason L Tibbitts III - 1.23.3-1 +- Initial attempt at packaging 1.23. + +* Tue Jul 1 2008 Martin Ebourne - 1.22.3-15 +- Add perl module compat dependency, bz #453590 + +* Tue May 6 2008 Martin Ebourne - 1.22.3-14 +- Remove default runlevel, bz #441315 + +* Mon Apr 28 2008 Jason L Tibbitts III - 1.22.3-13 +- Backport patch for CVE-2008-1381 from 1.23.3 to 1.22.3. + +* Tue Feb 19 2008 Fedora Release Engineering - 1.22.3-12 +- Autorebuild for GCC 4.3 + +* Thu Jan 3 2008 Martin Ebourne - 1.22.3-11 +- Fix compilation on gcc 4.3 + +* Thu Dec 6 2007 Martin Ebourne - 1.22.3-10 +- Rebuild for new openssl + +* Thu Aug 2 2007 Martin Ebourne - 1.22.3-8 +- Fix licence tag + +* Thu Jul 12 2007 Martin Ebourne - 1.22.3-7 +- Fixes from testing by Jitz including missing dependencies and database creation + +* Sat Jun 30 2007 Martin Ebourne - 1.22.3-6 +- Disable crashtrace on ppc + +* Sat Jun 30 2007 Martin Ebourne - 1.22.3-5 +- Fix uid for directories in /var/lib/zoneminder + +* Tue Jun 26 2007 Martin Ebourne - 1.22.3-4 +- Added perl Archive::Tar dependency +- Disabled web interface due to lack of access control on the event images + +* Sun Jun 10 2007 Martin Ebourne - 1.22.3-3 +- Changes recommended in review by Jason Tibbitts + +* Mon Apr 2 2007 Martin Ebourne - 1.22.3-2 +- Standardised on package name of zoneminder + +* Thu Dec 28 2006 Martin Ebourne - 1.22.3-1 +- First version. Uses some parts from zm-1.20.1 by Corey DeLasaux and Serg Oskin diff --git a/distros/redhat/zoneminder.conf b/distros/redhat/zoneminder.conf new file mode 100644 index 000000000..4a4d93261 --- /dev/null +++ b/distros/redhat/zoneminder.conf @@ -0,0 +1,33 @@ +# The Zoneminder web interface has been disabled by default due to a small +# security issue in the default install. +# +# When using Zoneminder's own authentication, recorded CCTV images are +# accessible from the web directly without passing the authentication. This +# means any attacker could see your CCTV images without a password. In order +# to avoid this you can disable Zoneminder's authentication and configure +# standard Apache authentication (see the Apache documentation for details on +# this). +# +# If you still wish to use Zoneminder's own authentication, or have an +# internal site which needs no authentication, you need to delete the line +# marked below and restart Apache. + +Alias /zm "/usr/share/zoneminder/www" + + Options -Indexes MultiViews FollowSymLinks + AllowOverride All + Order allow,deny + Allow from all + # The code unfortunately uses short tags in many places + php_value short_open_tag 1 + +Deny from all # DELETE THIS LINE + + +ScriptAlias /cgi-bin/zm "/usr/libexec/zoneminder/cgi-bin" + + AllowOverride All + Options ExecCGI + Order allow,deny + Allow from all + From 2858a58f790ebb8b365d95a9d104f0420c7044a8 Mon Sep 17 00:00:00 2001 From: abauer Date: Sun, 15 Sep 2013 17:03:40 -0500 Subject: [PATCH 08/13] Removing the redhat folder from the root for real this time --- redhat/README.CentOS | 62 ---- redhat/README.Fedora | 81 ----- redhat/README.SuSE | 17 - redhat/local_zoneminder.te | 72 ---- redhat/redalert.wav | Bin 45404 -> 0 bytes redhat/zm-init | 48 --- redhat/zm-logrotate_d | 7 - redhat/zoneminder-1.26.0-dbinstall.patch | 72 ---- redhat/zoneminder-1.26.0-defaults.patch | 76 ----- redhat/zoneminder-runlevel.patch | 11 - redhat/zoneminder.1.26.el6.spec | 407 ----------------------- redhat/zoneminder.conf | 33 -- 12 files changed, 886 deletions(-) delete mode 100644 redhat/README.CentOS delete mode 100644 redhat/README.Fedora delete mode 100644 redhat/README.SuSE delete mode 100644 redhat/local_zoneminder.te delete mode 100755 redhat/redalert.wav delete mode 100644 redhat/zm-init delete mode 100644 redhat/zm-logrotate_d delete mode 100644 redhat/zoneminder-1.26.0-dbinstall.patch delete mode 100644 redhat/zoneminder-1.26.0-defaults.patch delete mode 100644 redhat/zoneminder-runlevel.patch delete mode 100644 redhat/zoneminder.1.26.el6.spec delete mode 100644 redhat/zoneminder.conf diff --git a/redhat/README.CentOS b/redhat/README.CentOS deleted file mode 100644 index 319b8a7ab..000000000 --- a/redhat/README.CentOS +++ /dev/null @@ -1,62 +0,0 @@ -================================================================================ - NEW INSTALLS -================================================================================ - -1. Unless you are already using MySQL server, you need to ensure that - the server is confired to start during boot and properly secured - by running: - - sudo service mysqld start - /usr/bin/mysql_secure_installation - sudo chkconfig mysqld on - -2. Using the password for the root account set during the previous step, you - will need to create the ZoneMinder database: - - mysql -uroot -p - mysql> create database zm; - mysql> grant select,insert,update,delete on zm.* to - 'zmuser'@localhost identified by 'zmpass'; - mysql> exit; - mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql - mysqladmin -uroot -p reload - -3. IMPORTANT: Edit /etc/php.ini and put in the appropriate timezone for - date.timezone! - -4. The ZoneMinder web interface is disabled by default, you will need - to edit this file to enable it: - - /etc/httpd/conf.d/zoneminder.conf - - HINT: Most users will want to simply delete the line that says - "Deny from all". - -5. Configure the web server to start automatically: - - sudo chkconfig httpd on - sudo service httpd start - -6. This package has automatically configured and installed an SELinux policy - called local_zoneminder. A copy of this policy is in the documentation - folder. - -7. Finally, you may start the ZoneMinder service: - - sudo service zoneminder start - - Then point your web browser to http:///zm - -================================================================================ - UPGRADES -================================================================================ - -1. You will need to upgrade the ZoneMinder database as described in the - manual. This command should be sufficient: - - sudo zmupdate.pl --user=root --pass= --version= - - It is recommended to backup your database and then upgrade your tables - to InnoDB when prompted. - - diff --git a/redhat/README.Fedora b/redhat/README.Fedora deleted file mode 100644 index f1a4b587a..000000000 --- a/redhat/README.Fedora +++ /dev/null @@ -1,81 +0,0 @@ -New installs -============ - -1. Unless you are already using the MySQL server or you are running it - remotely you will need to ensure that the server is installed and secured: - - yum install mysql-server - chkconfig mysql on - service mysql start - mysql_secure_installation - -2. You will need to create the ZoneMinder database. These commands should do - the trick, assuming your database server is local: - - mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql - mysqladmin reload - -3. The database needs a user. One is not created by default because this would - introduce an obvious security issue. The following should set this up: - - mysql -u root -p - grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass'; - - Obviously, change at least zmpass to an actual, secure password or - passphrase. You can change zmuser as well if you like. - -4. Edit /etc/zm.conf and, at the bottom, change ZM_DB_PASS and perhaps - ZM_DB_USER to match. - -5. Edit /etc/php.ini, uncomment the date.timezone line, and add your local - timezone. For whatever reason, 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 in - /etc/sysconfig/clock. - -6. This package probably does not work with SELinux enabled at the moment. It - may be necessary to disable SELinux for httpd, or even completely for - ZoneMinder to function. This will be addressed in a later release. Run - - setenforce 0 - - for testing, and edit /etc/sysconfig/selinux to disable it at boot time. - -7. Enable and start the zoneminder service: - - systemctl enable zoneminder.service - systemctl start zoneminder.service - -8. The ZoneMinder web interface is disabled by default (which makes it rather - useless but also secure by default), you will need to edit - /etc/httpd/conf.d/zoneminder.conf to enable it. Afterwards, you can start - the web server: - - systemctl enable httpd.service - systemctl start httpd.service - -9. You should immediately visit http://localhost/zm and secure the system if - it is network facing. To do this: - - a) click Options, then System. - b) check OPT_USE_AUTH. - c) set AUTH_HASH_SECRET to a random string. - d) click Save and refresh the main browser window. - e) You should be prompted to log in; the default username/password is admin/admin. - f) Open Options again, choose the newly visible Users tab. - g) click the admin user and set a password. - - -Upgrades -======== - -1. Update /etc/zm.conf. Check for any new settings and update the version - information. Comparing /etc/zm.conf and /etc/zm.conf.rpmnew should help to - do this. - -2. You will need to upgrade the ZoneMinder database as described in the - manual. This command should be sufficient when run as root: - - zmupdate.pl --version= diff --git a/redhat/README.SuSE b/redhat/README.SuSE deleted file mode 100644 index ff7f64f95..000000000 --- a/redhat/README.SuSE +++ /dev/null @@ -1,17 +0,0 @@ -After install run "zm_database_init" to create -the database and the zm database user (zm_admin). -The config file is automaticly adjusted with the -entered password for zm_admin. - -If you want to use X10 thwn install the the required -perl module with cpan. - -information: -during the run of zm_database_init a .my.cnf will -be created/updated (in the home directory of root) -so that root can access the database without password. -It Does not delete the .my.cnf when it exists, but checks -whether it has an entry for the mysql client [client] which -contains as username root. When the entry not exist or -the username is not root the .my.cnf will be modified -to fit the above requirements. \ No newline at end of file diff --git a/redhat/local_zoneminder.te b/redhat/local_zoneminder.te deleted file mode 100644 index d164af1c5..000000000 --- a/redhat/local_zoneminder.te +++ /dev/null @@ -1,72 +0,0 @@ - -module local_zoneminder 1.0; - -require { - 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; - class unix_stream_socket { read connectto }; - class lnk_file { write getattr read lock unlink }; - class dir search; - 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; -allow httpd_t auditd_t:file { read getattr open }; -allow httpd_t crond_t:dir search; -allow httpd_t crond_t:file { read getattr open }; -allow httpd_t dhcpc_t:dir search; -allow httpd_t dhcpc_t:file { read getattr open }; -allow httpd_t getty_t:dir search; -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; -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, dirsrvadmin_config_t, httpd_lock_t, dirsrv_config_t, httpd_tmp_t, dirsrvadmin_tmp_t, httpd_cache_t, httpd_tmpfs_t, httpd_squirrelmail_t, dirsrv_var_log_t, zarafa_var_lib_t, dirsrv_var_run_t, httpd_var_lib_t, httpd_var_run_t, passenger_tmp_t, httpd_nutups_cgi_rw_content_t, httpd_apcupsd_cgi_rw_content_t, httpd_dspam_rw_content_t, httpd_mediawiki_rw_content_t, httpd_squid_rw_content_t, httpd_prewikka_rw_content_t, httpd_smokeping_cgi_rw_content_t, passenger_var_run_t, httpd_openshift_rw_content_t, httpd_dirsrvadmin_rw_content_t, httpd_w3c_validator_rw_content_t, httpd_user_rw_content_t, httpd_awstats_rw_content_t, httpdcontent, httpd_cobbler_rw_content_t, root_t, httpd_munin_rw_content_t, httpd_bugzilla_rw_content_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 - -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 { read lock open }; -allow httpd_t kernel_t:dir search; -allow httpd_t kernel_t:file { read getattr open }; -allow httpd_t mysqld_safe_t:dir search; -allow httpd_t mysqld_safe_t:file { read getattr open }; -allow httpd_t mysqld_t:dir search; -allow httpd_t mysqld_t:file { read getattr open }; -allow httpd_t sshd_t:dir search; -allow httpd_t sshd_t:file { read getattr open }; -allow httpd_t syslogd_t:dir search; -allow httpd_t syslogd_t:file { read getattr open }; -allow httpd_t tmpfs_t:sock_file write; -allow httpd_t udev_t:dir search; -allow httpd_t udev_t:file { read getattr open }; -allow httpd_t unconfined_t:dir search; -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 v4l_device_t:chr_file getattr; diff --git a/redhat/redalert.wav b/redhat/redalert.wav deleted file mode 100755 index 41e23e0794bdc42f187e51b454767b51727346c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 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

6U=TqizX$fgf)Z8n=d!`^24;S9QoJQnr| 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 -chmod 600 $sql - -echo "CREATE DATABASE /*!32312 IF NOT EXISTS*/ $ZM_DB_NAME;" >>$sql -echo "USE $ZM_DB_NAME;" >>$sql - -echo "GRANT all on $ZM_DB_NAME.* TO '$ZM_DB_USER'@'$ClientHost' IDENTIFIED BY '$ZM_DB_PASS';" >>$sql - -echo -n "Enter MySQL Administrator username: " -read admin -cat $sql | mysql -B -h $ZM_DB_SERVER -u $admin -p -rm -f $sql - -cat /usr/lib/zm/init/zmschema.sql | mysql -h $ZM_DB_SERVER -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME -( cd $ZM_PATH/init; perl $ZM_PATH/init/zmoptions -f $ZM_PATH/init/zmconfig.txt ) diff --git a/redhat/zm-logrotate_d b/redhat/zm-logrotate_d deleted file mode 100644 index 61cc9d0eb..000000000 --- a/redhat/zm-logrotate_d +++ /dev/null @@ -1,7 +0,0 @@ -/var/log/zoneminder/*log -{ - weekly - notifempty - missingok - create 660 http http -} diff --git a/redhat/zoneminder-1.26.0-dbinstall.patch b/redhat/zoneminder-1.26.0-dbinstall.patch deleted file mode 100644 index 5b688a75d..000000000 --- a/redhat/zoneminder-1.26.0-dbinstall.patch +++ /dev/null @@ -1,72 +0,0 @@ ---- configure.ac 2013-09-05 10:33:08.000000000 -0500 -+++ configure.ac.dbinstall 2013-09-05 17:23:28.555553447 -0500 -@@ -1,13 +1,11 @@ - AC_PREREQ(2.59) --AC_INIT(zm,1.26.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],ZoneMinder,http://www.zoneminder.com/downloads.html) -+AC_INIT(zm,1.26.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) - AM_INIT_AUTOMAKE - AC_CONFIG_SRCDIR(src/zm.h) - AC_CONFIG_HEADERS(config.h) - - AC_SUBST([AM_CXXFLAGS], [-D__STDC_CONSTANT_MACROS]) - --PATH_BUILD=`pwd` --AC_SUBST(PATH_BUILD) - TIME_BUILD=`date +'%s'` - AC_SUBST(TIME_BUILD) - -@@ -354,6 +352,8 @@ AC_PROG_PERL_MODULES(X10::ActiveHome,,AC - - AC_DEFINE_DIR([BINDIR],[bindir],[Expanded binary directory]) - AC_DEFINE_DIR([LIBDIR],[libdir],[Expanded library directory]) -+AC_DEFINE_DIR([DATADIR],[datadir],[Expanded data directory]) -+AC_SUBST(PKGDATADIR,"$DATADIR/$PACKAGE") - AC_SUBST(ZM_PID,"$ZM_RUNDIR/zm.pid") - AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) - AC_SUBST(ZM_CONFIG,"$SYSCONFDIR/zm.conf") -diff -up ./db/Makefile.am.dbinstall ./db/Makefile.am ---- ./db/Makefile.am.dbinstall 2009-10-14 04:42:46.000000000 -0500 -+++ ./db/Makefile.am 2011-03-24 22:50:14.173912137 -0500 -@@ -1,7 +1,16 @@ - AUTOMAKE_OPTIONS = gnu - -+zmdbdatadir = $(pkgdatadir)/db -+ - EXTRA_DIST = \ - zm_create.sql.in \ -+ $(dbupgrade_scripts) -+ -+dist_zmdbdata_DATA = \ -+ zm_create.sql \ -+ $(dbupgrade_scripts) -+ -+dbupgrade_scripts = \ - zm_update-0.0.1.sql \ - zm_update-0.9.7.sql \ - zm_update-0.9.8.sql \ -diff -up ./scripts/zmupdate.pl.in.dbinstall ./scripts/zmupdate.pl.in ---- ./scripts/zmupdate.pl.in.dbinstall 2011-08-27 15:44:05.335602405 -0500 -+++ ./scripts/zmupdate.pl.in 2011-08-26 02:51:37.000000000 -0500 -@@ -424,7 +424,7 @@ if ( $version ) - } - else - { -- $command .= ZM_PATH_BUILD."/db"; -+ $command .= ZM_PATH_DATA."/db"; - } - $command .= "/zm_update-".$version.".sql"; - -diff -up ./zm.conf.in.dbinstall ./zm.conf.in ---- ./zm.conf.in.dbinstall 2008-07-25 04:48:16.000000000 -0500 -+++ ./zm.conf.in 2011-03-24 22:50:14.175912077 -0500 -@@ -12,8 +12,8 @@ - # Current version of ZoneMinder - ZM_VERSION=@VERSION@ - --# Path to build directory, used mostly for finding DB upgrade scripts --ZM_PATH_BUILD=@PATH_BUILD@ -+# Path to installed data directory, used mostly for finding DB upgrade scripts -+ZM_PATH_DATA=@PKGDATADIR@ - - # Build time, used to record when to trigger various checks - ZM_TIME_BUILD=@TIME_BUILD@ diff --git a/redhat/zoneminder-1.26.0-defaults.patch b/redhat/zoneminder-1.26.0-defaults.patch deleted file mode 100644 index 3e5dda67c..000000000 --- a/redhat/zoneminder-1.26.0-defaults.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- configure.ac 2013-08-15 11:44:10.000000000 -0500 -+++ configure.ac.logdir 2013-08-17 09:20:07.326053328 -0500 -@@ -46,7 +46,7 @@ - AC_SUBST(ZM_TMPDIR,[/tmp/zm]) - fi - if test "$ZM_LOGDIR" == ""; then -- AC_SUBST(ZM_LOGDIR,[/var/log/zm]) -+ AC_SUBST(ZM_LOGDIR,[/var/log/zoneminder]) - fi - - LIB_ARCH=lib ---- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in 2013-08-01 18:14:45.175241378 -0500 -+++ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in.defaults 2013-08-07 18:57:42.525006149 -0500 -@@ -187,7 +187,7 @@ - }, - { - name => "ZM_PATH_ZMS", -- default => "/cgi-bin/nph-zms", -+ default => "/cgi-bin/zm/nph-zms", - description => "Web path to zms streaming server", - help => "The ZoneMinder streaming server is required to send streamed images to your browser. It will be installed into the cgi-bin path given at configuration time. This option determines what the web path to the server is rather than the local path on your machine. Ordinarily the streaming server runs in parser-header mode however if you experience problems with streaming you can change this to non-parsed-header (nph) mode by changing 'zms' to 'nph-zms'.", - type => $types{rel_path}, -@@ -276,7 +276,7 @@ - }, - { - name => "ZM_OPT_CAMBOZOLA", -- default => "no", -+ default => "yes", - description => "Is the (optional) cambozola java streaming client installed", - help => "Cambozola is a handy low fat cheese flavoured Java applet that ZoneMinder uses to view image streams on browsers such as Internet Explorer that don't natively support this format. If you use this browser it is highly recommended to install this from http://www.charliemouse.com/code/cambozola/ however if it is not installed still images at a lower refresh rate can still be viewed.", - type => $types{boolean}, -@@ -526,7 +526,7 @@ - }, - { - name => "ZM_LOG_DEBUG_FILE", -- default => "@ZM_TMPDIR@/zm_debug.log+", -+ default => "/var/log/zoneminder/zm_debug_log+", - description => "Where extra debug is output to", - help => "This option allows you to specify a different target for debug output. All components have a default log file which will norally be in /tmp or /var/log and this is where debug will be written to if this value is empty. Adding a path here will temporarily redirect debug, and other logging output, to this file. This option is a simple filename and you are debugging several components then they will all try and write to the same file with undesirable consequences. Appending a '+' to the filename will cause the file to be created with a '.' suffix containing your process id. In this way debug from each run of a component is kept separate. This is the recommended setting as it will also prevent subsequent runs from overwriting the same log. You should ensure that permissions are set up to allow writing to the file and directory specified here.", - requires => [ { name => "ZM_LOG_DEBUG", value => "yes" } ], -@@ -623,7 +623,7 @@ - }, - { - name => "ZM_PATH_SOCKS", -- default => "@ZM_TMPDIR@", -+ default => "/var/lib/zoneminder/sock", - description => "Path to the various Unix domain socket files that ZoneMinder uses", - help => "ZoneMinder generally uses Unix domain sockets where possible. This reduces the need for port assignments and prevents external applications from possibly compromising the daemons. However each Unix socket requires a .sock file to be created. This option indicates where those socket files go.", - type => $types{abs_path}, -@@ -639,7 +639,7 @@ - }, - { - name => "ZM_PATH_SWAP", -- default => "@ZM_TMPDIR@", -+ default => "/dev/shm", - description => "Path to location for temporary swap images used in streaming", - help => "Buffered playback requires temporary swap images to be stored for each instance of the streaming daemons. This option determines where these images will be stored. The images will actually be stored in sub directories beneath this location and will be automatically cleaned up after a period of time.", - type => $types{abs_path}, -@@ -902,7 +902,7 @@ - }, - { - name => "ZM_UPLOAD_FTP_LOC_DIR", -- default => "@ZM_TMPDIR@", -+ default => "/var/spool/zoneminder-upload", - description => "The local directory in which to create upload files", - help => "You can use filters to instruct ZoneMinder to upload events to a remote ftp server. This option indicates the local directory that ZoneMinder should use for temporary upload files. These are files that are created from events, uploaded and then deleted.", - requires => [ { name => "ZM_OPT_UPLOAD", value => "yes" } ], -@@ -1258,7 +1258,7 @@ - }, - { - name => "ZM_OPT_CONTROL", -- default => "no", -+ default => "yes", - description => "Support controllable (e.g. PTZ) cameras", - help => "ZoneMinder includes limited support for controllable cameras. A number of sample protocols are included and others can easily be added. If you wish to control your cameras via ZoneMinder then select this option otherwise if you only have static cameras or use other control methods then leave this option off.", - type => $types{boolean}, diff --git a/redhat/zoneminder-runlevel.patch b/redhat/zoneminder-runlevel.patch deleted file mode 100644 index de7b49b0b..000000000 --- a/redhat/zoneminder-runlevel.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up ./scripts/zm.in.runlevel ./scripts/zm.in ---- ./scripts/zm.in.runlevel 2010-11-28 15:22:05.000000000 -0600 -+++ ./scripts/zm.in 2011-03-24 21:39:01.973010160 -0500 -@@ -1,6 +1,6 @@ - #!/bin/sh - # description: ZoneMinder is the top Linux video camera security and surveillance solution. ZoneMinder is intended for use in single or multi-camera video security applications.Copyright: Philip Coombes, Corey DeLasaux 2003-2008 --# chkconfig: 2345 99 00 -+# chkconfig: - 99 00 - # processname: zmpkg.pl - - # Source function library. diff --git a/redhat/zoneminder.1.26.el6.spec b/redhat/zoneminder.1.26.el6.spec deleted file mode 100644 index 30b2c1d90..000000000 --- a/redhat/zoneminder.1.26.el6.spec +++ /dev/null @@ -1,407 +0,0 @@ -%define cambrev 0.931 -%define moorev 1.3.2 -%define jscrev 1.0 - -%define zmuid $(id -un) -%define zmgid $(id -gn) -%define zmuid_final apache -%define zmgid_final apache - -Name: zoneminder -Version: 1.26.0 -Release: 1%{?dist} -Summary: A camera monitoring and analysis tool -Group: System Environment/Daemons -# jscalendar is LGPL (any version): http://www.dynarch.com/projects/calendar/ -# Mootools is inder the MIT license: http://mootools.net/ -# Cambozola is GPL: http://www.charliemouse.com/code/cambozola/ -License: GPLv2+ and LGPLv2+ and MIT -URL: http://www.zoneminder.com/ - -# Some of these sources to be added upstream. Will edit once that happens. -Source0: zoneminder-%{version}.tar.gz -Source2: zoneminder.conf -Source3: redalert.wav -Source4: README.CentOS -Source5: jscalendar-%{jscrev}.zip -#Source5: http://downloads.sourceforge.net/jscalendar/jscalendar-%{jscrev}.zip -Source6: mootools-core-%{moorev}-full-compat-yc.js -#Source6: http://mootools.net/download/get/mootools-core-%{moorev}-full-compat-yc.js -Source7: zm-init -Source8: zm-logrotate_d -Source9: local_zoneminder.te -Source10: cambozola-%{cambrev}.tar.gz -#Source10: http://www.andywilcock.com/code/cambozola/cambozola-%{cambrev}.tar.gz - -Patch1: zoneminder-1.26.0-dbinstall.patch -Patch2: zoneminder-runlevel.patch -Patch3: zoneminder-1.26.0-defaults.patch - -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) - -BuildRequires: automake gnutls-devel bzip2-devel libtool -BuildRequires: mysql-devel pcre-devel libjpeg-turbo-devel -BuildRequires: perl(Archive::Tar) perl(Archive::Zip) -BuildRequires: perl(Date::Manip) perl(DBD::mysql) -BuildRequires: perl(ExtUtils::MakeMaker) perl(LWP::UserAgent) -BuildRequires: perl(MIME::Entity) perl(MIME::Lite) -BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) -BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) -BuildRequires: perl(Expect) perl(X10::ActiveHome) perl(Astro::SunTime) -# Change this for distros compatible newer ffmpeg & gcc -BuildRequires: ffmpeg-devel >= 0.4.9 -BuildRequires: ffmpeg-devel <= 0.6.5 -BuildRequires: gcc < 4.7 - -Requires: httpd php php-mysql mysql-server libjpeg-turbo -Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) -Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) -Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) -# Change this for distros compatible newer ffmpeg -Requires: ffmpeg >= 0.4.9 -Requires: ffmpeg <= 0.6.5 - -Requires(post): /sbin/chkconfig -Requires(post): /usr/bin/checkmodule -Requires(post): /usr/bin/semodule_package -Requires(post): /usr/sbin/semodule -Requires(post): /usr/bin/gpasswd -Requires(post): /usr/bin/less -Requires(preun): /sbin/chkconfig -Requires(preun): /sbin/service -Requires(preun): /usr/sbin/semodule -Requires(postun): /sbin/service - - -%description -ZoneMinder is a set of applications which is intended to provide a complete -solution allowing you to capture, analyse, 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. - - -%prep -%setup -q -n zoneminder-%{version} - -# Unpack jscalendar and move some files around -%setup -q -D -T -a 5 -n zoneminder-%{version} -mkdir jscalendar-doc -pushd jscalendar-%{jscrev} -mv *html *php doc/* README ../jscalendar-doc -rmdir doc -popd - -# Unpack Cambozola and move some files around -%setup -q -D -T -a 10 -n zoneminder-%{version} -mkdir cambozola-doc -pushd cambozola-%{cambrev} -mv application.properties build.xml dist.sh *html LICENSE testPages/* ../cambozola-doc -rmdir testPages -popd - -%patch1 -p0 -b .dbinstall -%patch2 -p0 -b .runlevel -%patch3 -p0 - -cp %{SOURCE4} README.CentOS -cp %{SOURCE9} local_zoneminder.te - -%build -libtoolize --force -aclocal -autoheader -automake --force-missing --add-missing -autoconf -#autoreconf - -OPTS="" -%ifnarch %{ix86} x86_64 - OPTS="$OPTS --disable-crashtrace" -%endif - -%configure \ - --with-libarch=%{_lib} \ -%ifarch %{ix86} %{x8664} - --enable-crashtrace \ -%else - --disable-crashtrace \ -%endif - --with-mysql=%{_prefix} \ - --with-ffmpeg=%{_prefix} \ - --with-webdir=%{_datadir}/%{name}/www \ - --with-cgidir=%{_libexecdir}/%{name}/cgi-bin \ - --with-webuser=%{zmuid} \ - --with-webgroup=%{zmgid} \ - --enable-mmap=yes \ - --disable-debug \ - --with-webhost=zm.local \ - ZM_SSL_LIB="gnutls" \ - ZM_RUNDIR=/var/run/zoneminder \ - ZM_TMPDIR=/var/lib/zoneminder/temp \ - CXXFLAGS="-D__STDC_CONSTANT_MACROS -msse2" \ - --with-extralibs="" - -make %{?_smp_mflags} -%{__perl} -pi -e 's/(ZM_WEB_USER=).*$/${1}%{zmuid_final}/;' \ - -e 's/(ZM_WEB_GROUP=).*$/${1}%{zmgid_final}/;' zm.conf - -%install -install -d %{buildroot}/%{_localstatedir}/run -install -d %{buildroot}/etc/logrotate.d - -make install DESTDIR=%{buildroot} \ - INSTALLDIRS=vendor - -rm -rf %{buildroot}/%{perl_vendorarch} %{buildroot}/%{perl_archlib} - -install -m 755 -d %{buildroot}/%{_localstatedir}/log/zoneminder -for dir in events images temp -do - install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/$dir - rmdir %{buildroot}/%{_datadir}/%{name}/www/$dir - ln -sf ../../../..%{_localstatedir}/lib/zoneminder/$dir %{buildroot}/%{_datadir}/%{name}/www/$dir -done -install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/sock -install -m 755 -d %{buildroot}/%{_localstatedir}/lib/zoneminder/swap -install -m 755 -d %{buildroot}/%{_localstatedir}/spool/zoneminder-upload - -install -D -m 755 scripts/zm %{buildroot}/%{_initrddir}/zoneminder -install -D -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/httpd/conf.d/zoneminder.conf -install -D -m 755 %{SOURCE3} %{buildroot}/%{_datadir}/%{name}/www/sounds/redalert.wav -install %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name} - -# Install jscalendar -install -d -m 755 %{buildroot}/%{_datadir}/%{name}/www/jscalendar -cp -rp jscalendar-%{jscrev}/* %{buildroot}/%{_datadir}/%{name}/www/jscalendar - -# Install Cambozola -cp -rp cambozola-%{cambrev}/dist/cambozola.jar %{buildroot}/%{_datadir}/%{name}/www/ -rm -rf cambozola-%{cambrev} - -# Install mootools -pushd %{buildroot}/%{_datadir}/%{name}/www -install -m 644 %{SOURCE6} mootools-core-%{moorev}-full-compat-yc.js -ln -s mootools-core-%{moorev}-full-compat-yc.js mootools.js -popd - -%post -/sbin/chkconfig --add zoneminder -/sbin/chkconfig zoneminder on - -# Allow zoneminder access to local video sources -echo -/usr/bin/gpasswd -a apache video - -# Create and load zoneminder selinux policy module -echo -e "\nCreating and installing a ZoneMinder SELinux policy module. Please wait.\n" -/usr/bin/checkmodule -M -m -o %{_docdir}/%{name}-%{version}/local_zoneminder.mod %{_docdir}/%{name}-%{version}/local_zoneminder.te > /dev/null -/usr/bin/semodule_package -o %{_docdir}/%{name}-%{version}/local_zoneminder.pp -m %{_docdir}/%{name}-%{version}/local_zoneminder.mod > /dev/null -/usr/sbin/semodule -i %{_docdir}/%{name}-%{version}/local_zoneminder.pp > /dev/null - -# Display the README for post installation instructions -/usr/bin/less %{_docdir}/%{name}-%{version}/README.CentOS - -%preun -if [ $1 -eq 0 ]; then - /sbin/service zoneminder stop > /dev/null 2>&1 || : - /sbin/chkconfig --del zoneminder - echo -e "\nRemoving ZoneMinder SELinux policy module. Please wait.\n" - /usr/sbin/semodule -r local_zoneminder.pp -fi - - -%postun -if [ $1 -ge 1 ]; then - /sbin/service zoneminder condrestart > /dev/null 2>&1 || : -fi - - -%files -%defattr(-,root,root,-) -%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md README.CentOS jscalendar-doc cambozola-doc local_zoneminder.te -%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm.conf -%config(noreplace) %attr(644,root,root) %{_sysconfdir}/httpd/conf.d/zoneminder.conf -%config(noreplace) /etc/logrotate.d/%{name} -%attr(755,root,root) %{_initrddir}/zoneminder - -%{_bindir}/zma -%{_bindir}/zmaudit.pl -%{_bindir}/zmc -%{_bindir}/zmcontrol.pl -%{_bindir}/zmdc.pl -%{_bindir}/zmf -%{_bindir}/zmfilter.pl -%attr(4755,root,root) %{_bindir}/zmfix -%{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer -%{_bindir}/zmtrack.pl -%{_bindir}/zmtrigger.pl -%{_bindir}/zmu -%{_bindir}/zmupdate.pl -%{_bindir}/zmvideo.pl -%{_bindir}/zmwatch.pl -%{_bindir}/zmx10.pl - -%{perl_vendorlib}/ZoneMinder* -%{_mandir}/man*/* -%dir %{_libexecdir}/%{name} -%{_libexecdir}/%{name}/cgi-bin -%dir %{_datadir}/%{name} -%{_datadir}/%{name}/db -%{_datadir}/%{name}/www - -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/events -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/images -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/sock -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/swap -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/temp -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/log/zoneminder -%dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/spool/zoneminder-upload - - -%changelog -* Thu Sep 05 2013 Andrew Bauer - 1.26.0 -- 1.26.0 Release -- https://github.com/ZoneMinder/ZoneMinder/archive/v1.26.0.tar.gz - -* Sun Sep 01 2013 Andrew Bauer - 1.26.0-beta -- Update SELinux policy module - -* Thu Aug 29 2013 Andrew Bauer - 1.26.0-beta -- Third Beta release -- https://github.com/ZoneMinder/ZoneMinder/tree/release-1.26 -- Reduce number of uneeded dependencies by integrating cambozola into spec file - -* Thu Aug 15 2013 Andrew Bauer - 1.26.0-beta -- Initial Beta release -- https://github.com/ZoneMinder/ZoneMinder/tree/release-1.26 - -* Sun Aug 11 2013 Andrew Bauer - 1.25.0-kfirproper -- Modified specfile to work with kfir-proper branch -- https://github.com/ZoneMinder/ZoneMinder/tree/kfir-proper - -* Wed Aug 07 2013 Andrew Bauer - 1.25.0-2svn3827 -- Move RHEL/CentOS specific defaults to a patch file -- Add bzip2-devel as a build dependency -- Default ZM_SSL_LIB back to gnutls. AUTH_RELAY = hashed didn't work with openssl. - -* Fri Aug 02 2013 Andrew Bauer - 1.25.0-1svn3827 -- Update to latest 1.25.0 subversion. -- Does not compile with modern versions of ffmpeg. Configure to work only with older versions. -- Does not compile with gcc 4.7. Configure to build with gcc less than 4.7. - -* Thu Mar 24 2011 Jason L Tibbitts III - 1.24.3-4.20110324svn3310 -- Update to latest 1.24.3 subversion. Turns out that what upstream was calling - 1.24.3 is really just an occasionally updated devel snapshot. -- Rebase various patches. - -* Wed Mar 23 2011 Dan Horák - 1.24.3-3 -- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient) - -* Tue Feb 08 2011 Fedora Release Engineering - 1.24.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Tue Jan 25 2011 Jason L Tibbitts III - 1.24.3-1 -- Update to latest upstream version. -- Rebase patches. -- Initial incomplete attempt to disable v4l1 support. - -* Fri Jan 21 2011 Jason L Tibbitts III - 1.24.2-6 -- Unbundle cambozola; instead link to the separately pacakged copy. -- Remove BuildRoot:, %%clean and buildroot cleaning in %%install. -- Git rid of mixed space/tab usage by removing all tabs. -- Remove unnecessary Conflicts: line. -- Attempt to force short_open_tag on for the code directories. -- Move default location of sockets, swaps, logfiles and some temporary files to - make more sense and allow things to work better with a future selinux policy. -- Fix errors in README.CentOS. - -* Wed Jun 02 2010 Marcela Maslanova - 1.24.2-5 -- Mass rebuild with perl-5.12.0 - -* Fri Dec 4 2009 Stepan Kasal - 1.24.2-4 -- rebuild against perl 5.10.1 -- use Perl vendorarch and archlib variables correctly - -* Mon Jul 27 2009 Fedora Release Engineering - 1.24.2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-2 -- Bump release since 1.24.2-1 was mistakenly tagged a few months ago. - -* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-1 -- Initial update to 1.24.2. -- Rebase patches. -- Update mootools download location. -- Update to mootools 1.2.3. -- Add additional dependencies for some optional features. - -* Sat Apr 11 2009 Martin Ebourne - 1.24.1-3 -- Remove unused Sys::Mmap perl dependency RPM is finding - -* Sat Apr 11 2009 Martin Ebourne - 1.24.1-2 -- Update gcc44 patch to disable -frepo, seems to be broken with gcc44 -- Added noffmpeg patch to make building outside mock easier - -* Sat Mar 21 2009 Martin Ebourne - 1.24.1-1 -- Patch for gcc 4.4 compilation errors -- Upgrade to 1.24.1 - -* Wed Feb 25 2009 Fedora Release Engineering - 1.23.3-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Sat Jan 24 2009 Caolán McNamara - 1.23.3-3 -- rebuild for dependencies - -* Mon Dec 15 2008 Martin Ebourne - 1.23.3-2 -- Fix permissions on zm.conf - -* Fri Jul 11 2008 Jason L Tibbitts III - 1.23.3-1 -- Initial attempt at packaging 1.23. - -* Tue Jul 1 2008 Martin Ebourne - 1.22.3-15 -- Add perl module compat dependency, bz #453590 - -* Tue May 6 2008 Martin Ebourne - 1.22.3-14 -- Remove default runlevel, bz #441315 - -* Mon Apr 28 2008 Jason L Tibbitts III - 1.22.3-13 -- Backport patch for CVE-2008-1381 from 1.23.3 to 1.22.3. - -* Tue Feb 19 2008 Fedora Release Engineering - 1.22.3-12 -- Autorebuild for GCC 4.3 - -* Thu Jan 3 2008 Martin Ebourne - 1.22.3-11 -- Fix compilation on gcc 4.3 - -* Thu Dec 6 2007 Martin Ebourne - 1.22.3-10 -- Rebuild for new openssl - -* Thu Aug 2 2007 Martin Ebourne - 1.22.3-8 -- Fix licence tag - -* Thu Jul 12 2007 Martin Ebourne - 1.22.3-7 -- Fixes from testing by Jitz including missing dependencies and database creation - -* Sat Jun 30 2007 Martin Ebourne - 1.22.3-6 -- Disable crashtrace on ppc - -* Sat Jun 30 2007 Martin Ebourne - 1.22.3-5 -- Fix uid for directories in /var/lib/zoneminder - -* Tue Jun 26 2007 Martin Ebourne - 1.22.3-4 -- Added perl Archive::Tar dependency -- Disabled web interface due to lack of access control on the event images - -* Sun Jun 10 2007 Martin Ebourne - 1.22.3-3 -- Changes recommended in review by Jason Tibbitts - -* Mon Apr 2 2007 Martin Ebourne - 1.22.3-2 -- Standardised on package name of zoneminder - -* Thu Dec 28 2006 Martin Ebourne - 1.22.3-1 -- First version. Uses some parts from zm-1.20.1 by Corey DeLasaux and Serg Oskin diff --git a/redhat/zoneminder.conf b/redhat/zoneminder.conf deleted file mode 100644 index 4a4d93261..000000000 --- a/redhat/zoneminder.conf +++ /dev/null @@ -1,33 +0,0 @@ -# The Zoneminder web interface has been disabled by default due to a small -# security issue in the default install. -# -# When using Zoneminder's own authentication, recorded CCTV images are -# accessible from the web directly without passing the authentication. This -# means any attacker could see your CCTV images without a password. In order -# to avoid this you can disable Zoneminder's authentication and configure -# standard Apache authentication (see the Apache documentation for details on -# this). -# -# If you still wish to use Zoneminder's own authentication, or have an -# internal site which needs no authentication, you need to delete the line -# marked below and restart Apache. - -Alias /zm "/usr/share/zoneminder/www" - - Options -Indexes MultiViews FollowSymLinks - AllowOverride All - Order allow,deny - Allow from all - # The code unfortunately uses short tags in many places - php_value short_open_tag 1 - -Deny from all # DELETE THIS LINE - - -ScriptAlias /cgi-bin/zm "/usr/libexec/zoneminder/cgi-bin" - - AllowOverride All - Options ExecCGI - Order allow,deny - Allow from all - From 7d5e0d3ba2b70c95349ce007aa307f62ed90dc6f Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Mon, 16 Sep 2013 08:21:37 -0500 Subject: [PATCH 09/13] Update README.Fedora Update README.Fedora installation instructions. Fixes issue #145. --- distros/redhat/README.Fedora | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/distros/redhat/README.Fedora b/distros/redhat/README.Fedora index f1a4b587a..a72bee883 100644 --- a/distros/redhat/README.Fedora +++ b/distros/redhat/README.Fedora @@ -4,9 +4,14 @@ New installs 1. Unless you are already using the MySQL server or you are running it remotely you will need to ensure that the server is installed and secured: - yum install mysql-server - chkconfig mysql on - service mysql start + yum install mysql-community or + + yum install mysql (Mariadb) + + sudo systemctl mysqld enable + + sudo system mysqld start + mysql_secure_installation 2. You will need to create the ZoneMinder database. These commands should do @@ -32,8 +37,8 @@ New installs 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 in - /etc/sysconfig/clock. + If you are not sure of the proper timezone specification to use, look at + http://php.net/date.timezone 6. This package probably does not work with SELinux enabled at the moment. It may be necessary to disable SELinux for httpd, or even completely for @@ -43,18 +48,18 @@ New installs for testing, and edit /etc/sysconfig/selinux to disable it at boot time. -7. Enable and start the zoneminder service: +7. The zoneminder.service file fails at present but the zmpkg.pl script + can be run as root to start zoneminder. - systemctl enable zoneminder.service - systemctl start zoneminder.service + sudo zmpkg.pl start 8. The ZoneMinder web interface is disabled by default (which makes it rather useless but also secure by default), you will need to edit /etc/httpd/conf.d/zoneminder.conf to enable it. Afterwards, you can start the web server: - systemctl enable httpd.service - systemctl start httpd.service + sudo systemctl enable httpd.service + sudo systemctl start httpd.service 9. You should immediately visit http://localhost/zm and secure the system if it is network facing. To do this: @@ -78,4 +83,4 @@ Upgrades 2. You will need to upgrade the ZoneMinder database as described in the manual. This command should be sufficient when run as root: - zmupdate.pl --version= + zmupdate.pl --user=root --pass={mysql_root_pwd} --version= From 5a9364703c983bc7177a306f5446b91854c5dd09 Mon Sep 17 00:00:00 2001 From: mastertheknife Date: Tue, 17 Sep 2013 10:28:59 +0300 Subject: [PATCH 10/13] a better fix for the sign comparison warnings during compilation --- src/zm_image.cpp | 256 +++++++++++++++++----------------- src/zm_image.h | 48 +++---- src/zm_local_camera.cpp | 2 +- src/zm_monitor.cpp | 2 +- src/zm_remote_camera_http.cpp | 2 +- 5 files changed, 155 insertions(+), 155 deletions(-) diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 6a301f165..b252f9387 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -290,7 +290,7 @@ void Image::Initialise() } /* Requests a writeable buffer to the image. This is safer than buffer() because this way we can gurantee that a buffer of required size exists */ -uint8_t* Image::WriteBuffer(const int p_width, const int p_height, const int p_colours, const int p_subpixelorder) { +uint8_t* Image::WriteBuffer(const unsigned int p_width, const unsigned int p_height, const unsigned int p_colours, const unsigned int p_subpixelorder) { unsigned int newsize; if(p_colours != ZM_COLOUR_GRAY8 && p_colours != ZM_COLOUR_RGB24 && p_colours != ZM_COLOUR_RGB32) { @@ -334,7 +334,7 @@ uint8_t* Image::WriteBuffer(const int p_width, const int p_height, const int p_c } /* Assign an existing buffer to the image instead of copying from a source buffer. The goal is to reduce the amount of memory copying and increase efficiency and buffer reusing. */ -void Image::AssignDirect( const int p_width, const int p_height, const int p_colours, const int p_subpixelorder, uint8_t *new_buffer, const size_t buffer_size, const int p_buffertype) { +void Image::AssignDirect( const unsigned int p_width, const unsigned int p_height, const unsigned int p_colours, const unsigned int p_subpixelorder, uint8_t *new_buffer, const size_t buffer_size, const int p_buffertype) { if(new_buffer == NULL) { Error("Attempt to directly assign buffer from a NULL pointer"); return; @@ -392,7 +392,7 @@ void Image::AssignDirect( const int p_width, const int p_height, const int p_col } -void Image::Assign(const int p_width, const int p_height, const int p_colours, const int p_subpixelorder, const uint8_t* new_buffer, const size_t buffer_size) { +void Image::Assign(const unsigned int p_width, const unsigned int p_height, const unsigned int p_colours, const unsigned int p_subpixelorder, const uint8_t* new_buffer, const size_t buffer_size) { unsigned int new_size = (p_width * p_height) * p_colours; if(new_buffer == NULL) { @@ -481,7 +481,7 @@ void Image::Assign( const Image &image ) { (*fptr_imgbufcpy)(buffer, image.buffer, size); } -Image *Image::HighlightEdges( Rgb colour, int p_colours, int p_subpixelorder, const Box *limits ) +Image *Image::HighlightEdges( Rgb colour, unsigned int p_colours, unsigned int p_subpixelorder, const Box *limits ) { if ( colours != ZM_COLOUR_GRAY8 ) { @@ -498,18 +498,18 @@ Image *Image::HighlightEdges( Rgb colour, int p_colours, int p_subpixelorder, co /* Set image to all black */ high_image->Clear(); - int lo_x = limits?limits->Lo().X():0; - int lo_y = limits?limits->Lo().Y():0; - int hi_x = limits?limits->Hi().X():width-1; - int hi_y = limits?limits->Hi().Y():height-1; + unsigned int lo_x = limits?limits->Lo().X():0; + unsigned int lo_y = limits?limits->Lo().Y():0; + unsigned int hi_x = limits?limits->Hi().X():width-1; + unsigned int hi_y = limits?limits->Hi().Y():height-1; if ( p_colours == ZM_COLOUR_GRAY8 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { const uint8_t* p = buffer + (y * width) + lo_x; uint8_t* phigh = high_buff + (y * width) + lo_x; - for ( int x = lo_x; x <= hi_x; x++, p++, phigh++ ) + for ( unsigned int x = lo_x; x <= hi_x; x++, p++, phigh++ ) { bool edge = false; if ( *p ) @@ -528,11 +528,11 @@ Image *Image::HighlightEdges( Rgb colour, int p_colours, int p_subpixelorder, co } else if ( p_colours == ZM_COLOUR_RGB24 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { const uint8_t* p = buffer + (y * width) + lo_x; uint8_t* phigh = high_buff + (((y * width) + lo_x) * 3); - for ( int x = lo_x; x <= hi_x; x++, p++, phigh += 3 ) + for ( unsigned int x = lo_x; x <= hi_x; x++, p++, phigh += 3 ) { bool edge = false; if ( *p ) @@ -553,11 +553,11 @@ Image *Image::HighlightEdges( Rgb colour, int p_colours, int p_subpixelorder, co } else if ( p_colours == ZM_COLOUR_RGB32 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { const uint8_t* p = buffer + (y * width) + lo_x; Rgb* phigh = (Rgb*)(high_buff + (((y * width) + lo_x) * 4)); - for ( int x = lo_x; x <= hi_x; x++, p++, phigh++ ) + for ( unsigned int x = lo_x; x <= hi_x; x++, p++, phigh++ ) { bool edge = false; if ( *p ) @@ -631,9 +631,9 @@ bool Image::WriteRaw( const char *filename ) const return( true ); } -bool Image::ReadJpeg( const char *filename, int p_colours, int p_subpixelorder) +bool Image::ReadJpeg( const char *filename, unsigned int p_colours, unsigned int p_subpixelorder) { - int new_width, new_height, new_colours, new_subpixelorder; + unsigned int new_width, new_height, new_colours, new_subpixelorder; struct jpeg_decompress_struct *cinfo = jpg_dcinfo; if ( !cinfo ) @@ -884,9 +884,9 @@ bool Image::WriteJpeg( const char *filename, int quality_override ) const return( true ); } -bool Image::DecodeJpeg( const JOCTET *inbuffer, int inbuffer_size, int p_colours, int p_subpixelorder) +bool Image::DecodeJpeg( const JOCTET *inbuffer, int inbuffer_size, unsigned int p_colours, unsigned int p_subpixelorder) { - int new_width, new_height, new_colours, new_subpixelorder; + unsigned int new_width, new_height, new_colours, new_subpixelorder; struct jpeg_decompress_struct *cinfo = jpg_dcinfo; if ( !cinfo ) @@ -1141,10 +1141,10 @@ bool Image::Zip( Bytef *outbuffer, unsigned long *outbuffer_size, int compressio } #endif // HAVE_ZLIB_H -bool Image::Crop( int lo_x, int lo_y, int hi_x, int hi_y ) +bool Image::Crop( unsigned int lo_x, unsigned int lo_y, unsigned int hi_x, unsigned int hi_y ) { - int new_width = (hi_x-lo_x)+1; - int new_height = (hi_y-lo_y)+1; + unsigned int new_width = (hi_x-lo_x)+1; + unsigned int new_height = (hi_y-lo_y)+1; if ( lo_x > hi_x || lo_y > hi_y ) { @@ -1162,11 +1162,11 @@ bool Image::Crop( int lo_x, int lo_y, int hi_x, int hi_y ) return( true ); } - int new_size = new_width*new_height*colours; + unsigned int new_size = new_width*new_height*colours; uint8_t *new_buffer = AllocBuffer(new_size); - int new_stride = new_width*colours; - for ( int y = lo_y, ny = 0; y <= hi_y; y++, ny++ ) + unsigned int new_stride = new_width*colours; + for ( unsigned int y = lo_y, ny = 0; y <= hi_y; y++, ny++ ) { unsigned char *pbuf = &buffer[((y*width)+lo_x)*colours]; unsigned char *pnbuf = &new_buffer[(ny*new_width)*colours]; @@ -1364,7 +1364,7 @@ void Image::Overlay( const Image &image ) } /* RGB32 compatible: complete */ -void Image::Overlay( const Image &image, int x, int y ) +void Image::Overlay( const Image &image, unsigned int x, unsigned int y ) { if ( !(width < image.width || height < image.height) ) { @@ -1381,17 +1381,17 @@ void Image::Overlay( const Image &image, int x, int y ) Panic( "Attempt to partial overlay differently coloured images, expected %d, got %d", colours, image.colours ); } - int lo_x = x; - int lo_y = y; - int hi_x = (x+image.width)-1; - int hi_y = (y+image.height-1); + unsigned int lo_x = x; + unsigned int lo_y = y; + unsigned int hi_x = (x+image.width)-1; + unsigned int hi_y = (y+image.height-1); if ( colours == ZM_COLOUR_GRAY8 ) { const uint8_t *psrc = image.buffer; - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { uint8_t *pdest = &buffer[(y*width)+lo_x]; - for ( int x = lo_x; x <= hi_x; x++ ) + for ( unsigned int x = lo_x; x <= hi_x; x++ ) { *pdest++ = *psrc++; } @@ -1400,10 +1400,10 @@ void Image::Overlay( const Image &image, int x, int y ) else if ( colours == ZM_COLOUR_RGB24 ) { const uint8_t *psrc = image.buffer; - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { uint8_t *pdest = &buffer[colours*((y*width)+lo_x)]; - for ( int x = lo_x; x <= hi_x; x++ ) + for ( unsigned int x = lo_x; x <= hi_x; x++ ) { *pdest++ = *psrc++; *pdest++ = *psrc++; @@ -1414,10 +1414,10 @@ void Image::Overlay( const Image &image, int x, int y ) else if ( colours == ZM_COLOUR_RGB32 ) { const Rgb *psrc = (Rgb*)(image.buffer); - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { Rgb *pdest = (Rgb*)&buffer[((y*width)+lo_x)<<2]; - for ( int x = lo_x; x <= hi_x; x++ ) + for ( unsigned int x = lo_x; x <= hi_x; x++ ) { *pdest++ = *psrc++; } @@ -1466,15 +1466,15 @@ void Image::Blend( const Image &image, int transparency ) AssignDirect( width, height, colours, subpixelorder, new_buffer, size, ZM_BUFTYPE_ZM); } -Image *Image::Merge( int n_images, Image *images[] ) +Image *Image::Merge( unsigned int n_images, Image *images[] ) { if ( n_images <= 0 ) return( 0 ); if ( n_images == 1 ) return( new Image( *images[0] ) ); - int width = images[0]->width; - int height = images[0]->height; - int colours = images[0]->colours; - for ( int i = 1; i < n_images; i++ ) + unsigned int width = images[0]->width; + unsigned int height = images[0]->height; + unsigned int colours = images[0]->colours; + for ( unsigned int i = 1; i < n_images; i++ ) { if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) ) { @@ -1483,12 +1483,12 @@ Image *Image::Merge( int n_images, Image *images[] ) } Image *result = new Image( width, height, images[0]->colours, images[0]->subpixelorder); - int size = result->size; - for ( int i = 0; i < size; i++ ) + unsigned int size = result->size; + for ( unsigned int i = 0; i < size; i++ ) { - int total = 0; + unsigned int total = 0; uint8_t *pdest = result->buffer; - for ( int j = 0; j < n_images; j++ ) + for ( unsigned int j = 0; j < n_images; j++ ) { uint8_t *psrc = images[j]->buffer; total += *psrc; @@ -1500,15 +1500,15 @@ Image *Image::Merge( int n_images, Image *images[] ) return( result ); } -Image *Image::Merge( int n_images, Image *images[], double weight ) +Image *Image::Merge( unsigned int n_images, Image *images[], double weight ) { if ( n_images <= 0 ) return( 0 ); if ( n_images == 1 ) return( new Image( *images[0] ) ); - int width = images[0]->width; - int height = images[0]->height; - int colours = images[0]->colours; - for ( int i = 1; i < n_images; i++ ) + unsigned int width = images[0]->width; + unsigned int height = images[0]->height; + unsigned int colours = images[0]->colours; + for ( unsigned int i = 1; i < n_images; i++ ) { if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) ) { @@ -1517,13 +1517,13 @@ Image *Image::Merge( int n_images, Image *images[], double weight ) } Image *result = new Image( *images[0] ); - int size = result->size; + unsigned int size = result->size; double factor = 1.0*weight; - for ( int i = 1; i < n_images; i++ ) + for ( unsigned int i = 1; i < n_images; i++ ) { uint8_t *pdest = result->buffer; uint8_t *psrc = images[i]->buffer; - for ( int j = 0; j < size; j++ ) + for ( unsigned int j = 0; j < size; j++ ) { *pdest = (uint8_t)(((*pdest)*(1.0-factor))+((*psrc)*factor)); pdest++; @@ -1534,15 +1534,15 @@ Image *Image::Merge( int n_images, Image *images[], double weight ) return( result ); } -Image *Image::Highlight( int n_images, Image *images[], const Rgb threshold, const Rgb ref_colour ) +Image *Image::Highlight( unsigned int n_images, Image *images[], const Rgb threshold, const Rgb ref_colour ) { if ( n_images <= 0 ) return( 0 ); if ( n_images == 1 ) return( new Image( *images[0] ) ); - int width = images[0]->width; - int height = images[0]->height; - int colours = images[0]->colours; - for ( int i = 1; i < n_images; i++ ) + unsigned int width = images[0]->width; + unsigned int height = images[0]->height; + unsigned int colours = images[0]->colours; + for ( unsigned int i = 1; i < n_images; i++ ) { if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) ) { @@ -1551,14 +1551,14 @@ Image *Image::Highlight( int n_images, Image *images[], const Rgb threshold, con } Image *result = new Image( width, height, images[0]->colours, images[0]->subpixelorder ); - int size = result->size; - for ( int c = 0; c < colours; c++ ) + unsigned int size = result->size; + for ( unsigned int c = 0; c < colours; c++ ) { - for ( int i = 0; i < size; i++ ) + for ( unsigned int i = 0; i < size; i++ ) { - int count = 0; + unsigned int count = 0; uint8_t *pdest = result->buffer+c; - for ( int j = 0; j < n_images; j++ ) + for ( unsigned int j = 0; j < n_images; j++ ) { uint8_t *psrc = images[j]->buffer+c; @@ -1678,10 +1678,10 @@ void Image::Annotate( const char *p_text, const Coord &coord, const Rgb fg_colou { strncpy( text, p_text, sizeof(text) ); - int index = 0; - int line_no = 0; - int text_len = strlen( text ); - int line_len = 0; + unsigned int index = 0; + unsigned int line_no = 0; + unsigned int text_len = strlen( text ); + unsigned int line_len = 0; const char *line = text; const uint8_t fg_r_col = RED_VAL_RGBA(fg_colour); @@ -1701,15 +1701,15 @@ void Image::Annotate( const char *p_text, const Coord &coord, const Rgb fg_colou while ( (index < text_len) && (line_len = strcspn( line, "\n" )) ) { - int line_width = line_len * CHAR_WIDTH; + unsigned int line_width = line_len * CHAR_WIDTH; - int lo_line_x = coord.X(); - int lo_line_y = coord.Y() + (line_no * LINE_HEIGHT); + unsigned int lo_line_x = coord.X(); + unsigned int lo_line_y = coord.Y() + (line_no * LINE_HEIGHT); - int min_line_x = 0; - int max_line_x = width - line_width; - int min_line_y = 0; - int max_line_y = height - LINE_HEIGHT; + unsigned int min_line_x = 0; + unsigned int max_line_x = width - line_width; + unsigned int min_line_y = 0; + unsigned int max_line_y = height - LINE_HEIGHT; if ( lo_line_x > max_line_x ) lo_line_x = max_line_x; @@ -1720,8 +1720,8 @@ void Image::Annotate( const char *p_text, const Coord &coord, const Rgb fg_colou if ( lo_line_y < min_line_y ) lo_line_y = min_line_y; - int hi_line_x = lo_line_x + line_width; - int hi_line_y = lo_line_y + LINE_HEIGHT; + unsigned int hi_line_x = lo_line_x + line_width; + unsigned int hi_line_y = lo_line_y + LINE_HEIGHT; // Clip anything that runs off the right of the screen if ( hi_line_x > width ) @@ -1732,13 +1732,13 @@ void Image::Annotate( const char *p_text, const Coord &coord, const Rgb fg_colou if ( colours == ZM_COLOUR_GRAY8 ) { unsigned char *ptr = &buffer[(lo_line_y*width)+lo_line_x]; - for ( int y = lo_line_y, r = 0; y < hi_line_y && r < CHAR_HEIGHT; y++, r++, ptr += width ) + for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < CHAR_HEIGHT; y++, r++, ptr += width ) { unsigned char *temp_ptr = ptr; - for ( int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) + for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { int f = fontdata[(line[c] * CHAR_HEIGHT) + r]; - for ( int i = 0; i < CHAR_WIDTH && x < hi_line_x; i++, x++, temp_ptr++ ) + for ( unsigned int i = 0; i < CHAR_WIDTH && x < hi_line_x; i++, x++, temp_ptr++ ) { if ( f & (0x80 >> i) ) { @@ -1755,16 +1755,16 @@ void Image::Annotate( const char *p_text, const Coord &coord, const Rgb fg_colou } else if ( colours == ZM_COLOUR_RGB24 ) { - int wc = width * colours; + unsigned int wc = width * colours; unsigned char *ptr = &buffer[((lo_line_y*width)+lo_line_x)*colours]; - for ( int y = lo_line_y, r = 0; y < hi_line_y && r < CHAR_HEIGHT; y++, r++, ptr += wc ) + for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < CHAR_HEIGHT; y++, r++, ptr += wc ) { unsigned char *temp_ptr = ptr; - for ( int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) + for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { int f = fontdata[(line[c] * CHAR_HEIGHT) + r]; - for ( int i = 0; i < CHAR_WIDTH && x < hi_line_x; i++, x++, temp_ptr += colours ) + for ( unsigned int i = 0; i < CHAR_WIDTH && x < hi_line_x; i++, x++, temp_ptr += colours ) { if ( f & (0x80 >> i) ) { @@ -1787,16 +1787,16 @@ void Image::Annotate( const char *p_text, const Coord &coord, const Rgb fg_colou } else if ( colours == ZM_COLOUR_RGB32 ) { - int wc = width * colours; + unsigned int wc = width * colours; uint8_t *ptr = &buffer[((lo_line_y*width)+lo_line_x)<<2]; - for ( int y = lo_line_y, r = 0; y < hi_line_y && r < CHAR_HEIGHT; y++, r++, ptr += wc ) + for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < CHAR_HEIGHT; y++, r++, ptr += wc ) { Rgb* temp_ptr = (Rgb*)ptr; - for ( int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) + for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { int f = fontdata[(line[c] * CHAR_HEIGHT) + r]; - for ( int i = 0; i < CHAR_WIDTH && x < hi_line_x; i++, x++, temp_ptr++ ) + for ( unsigned int i = 0; i < CHAR_WIDTH && x < hi_line_x; i++, x++, temp_ptr++ ) { if ( f & (0x80 >> i) ) { @@ -1845,7 +1845,7 @@ void Image::Timestamp( const char *label, const time_t when, const Coord &coord } /* RGB32 compatible: complete */ -void Image::Colourise(const int p_reqcolours, const int p_reqsubpixelorder) +void Image::Colourise(const unsigned int p_reqcolours, const unsigned int p_reqsubpixelorder) { Debug(9, "Colourise: Req colours: %u Req subpixel order: %u Current colours: %u Current subpixel order: %u",p_reqcolours,p_reqsubpixelorder,colours,subpixelorder); @@ -1865,7 +1865,7 @@ void Image::Colourise(const int p_reqcolours, const int p_reqsubpixelorder) if ( p_reqsubpixelorder == ZM_SUBPIX_ORDER_ABGR || p_reqsubpixelorder == ZM_SUBPIX_ORDER_ARGB) { /* ARGB\ABGR subpixel order. alpha byte is first (mem+0), so we need to shift the pixel left in the end */ - for(int i=0;iLo().X():0; - int lo_y = limits?limits->Lo().Y():0; - int hi_x = limits?limits->Hi().X():width-1; - int hi_y = limits?limits->Hi().Y():height-1; + unsigned int lo_x = limits?limits->Lo().X():0; + unsigned int lo_y = limits?limits->Lo().Y():0; + unsigned int hi_x = limits?limits->Hi().X():width-1; + unsigned int hi_y = limits?limits->Hi().Y():height-1; if ( colours == ZM_COLOUR_GRAY8 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { unsigned char *p = &buffer[(y*width)+lo_x]; - for ( int x = lo_x; x <= hi_x; x++, p++) + for ( unsigned int x = lo_x; x <= hi_x; x++, p++) { *p = colour; } @@ -1972,10 +1972,10 @@ void Image::Fill( Rgb colour, const Box *limits ) } else if ( colours == ZM_COLOUR_RGB24 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { unsigned char *p = &buffer[colours*((y*width)+lo_x)]; - for ( int x = lo_x; x <= hi_x; x++, p += 3) + for ( unsigned int x = lo_x; x <= hi_x; x++, p += 3) { RED_PTR_RGBA(p) = RED_VAL_RGBA(colour); GREEN_PTR_RGBA(p) = GREEN_VAL_RGBA(colour); @@ -2013,16 +2013,16 @@ void Image::Fill( Rgb colour, int density, const Box *limits ) /* Convert the colour's RGBA subpixel order into the image's subpixel order */ colour = rgb_convert(colour,subpixelorder); - int lo_x = limits?limits->Lo().X():0; - int lo_y = limits?limits->Lo().Y():0; - int hi_x = limits?limits->Hi().X():width-1; - int hi_y = limits?limits->Hi().Y():height-1; + unsigned int lo_x = limits?limits->Lo().X():0; + unsigned int lo_y = limits?limits->Lo().Y():0; + unsigned int hi_x = limits?limits->Hi().X():width-1; + unsigned int hi_y = limits?limits->Hi().Y():height-1; if ( colours == ZM_COLOUR_GRAY8 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { unsigned char *p = &buffer[(y*width)+lo_x]; - for ( int x = lo_x; x <= hi_x; x++, p++) + for ( unsigned int x = lo_x; x <= hi_x; x++, p++) { if ( ( x == lo_x || x == hi_x || y == lo_y || y == hi_y ) || (!(x%density) && !(y%density) ) ) *p = colour; @@ -2031,10 +2031,10 @@ void Image::Fill( Rgb colour, int density, const Box *limits ) } else if ( colours == ZM_COLOUR_RGB24 ) { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { unsigned char *p = &buffer[colours*((y*width)+lo_x)]; - for ( int x = lo_x; x <= hi_x; x++, p += 3) + for ( unsigned int x = lo_x; x <= hi_x; x++, p += 3) { if ( ( x == lo_x || x == hi_x || y == lo_y || y == hi_y ) || (!(x%density) && !(y%density) ) ) { RED_PTR_RGBA(p) = RED_VAL_RGBA(colour); @@ -2046,11 +2046,11 @@ void Image::Fill( Rgb colour, int density, const Box *limits ) } else if ( colours == ZM_COLOUR_RGB32 ) /* RGB32 */ { - for ( int y = lo_y; y <= hi_y; y++ ) + for ( unsigned int y = lo_y; y <= hi_y; y++ ) { Rgb* p = (Rgb*)&buffer[((y*width)+lo_x)<<2]; - for ( int x = lo_x; x <= hi_x; x++, p++) + for ( unsigned int x = lo_x; x <= hi_x; x++, p++) { if ( ( x == lo_x || x == hi_x || y == lo_y || y == hi_y ) || (!(x%density) && !(y%density) ) ) /* Fast, copies the entire pixel in a single pass */ @@ -2346,16 +2346,16 @@ void Image::Rotate( int angle ) new_height = width; new_width = height; - int line_bytes = new_width*colours; + unsigned int line_bytes = new_width*colours; unsigned char *s_ptr = buffer; if ( colours == ZM_COLOUR_GRAY8 ) { unsigned char *d_ptr; - for ( int i = new_width-1; i >= 0; i-- ) + for ( unsigned int i = new_width-1; i >= 0; i-- ) { d_ptr = rotate_buffer+i; - for ( int j = new_height-1; j >= 0; j-- ) + for ( unsigned int j = new_height-1; j >= 0; j-- ) { *d_ptr = *s_ptr++; d_ptr += line_bytes; @@ -2366,10 +2366,10 @@ void Image::Rotate( int angle ) { Rgb* s_rptr = (Rgb*)s_ptr; Rgb* d_rptr; - for ( int i = new_width-1; i >= 0; i-- ) + for ( unsigned int i = new_width-1; i >= 0; i-- ) { d_rptr = (Rgb*)(rotate_buffer+(i<<2)); - for ( int j = new_height-1; j >= 0; j-- ) + for ( unsigned int j = new_height-1; j >= 0; j-- ) { *d_rptr = *s_rptr++; d_rptr += new_width; @@ -2379,10 +2379,10 @@ void Image::Rotate( int angle ) else /* Assume RGB24 */ { unsigned char *d_ptr; - for ( int i = new_width-1; i >= 0; i-- ) + for ( unsigned int i = new_width-1; i >= 0; i-- ) { d_ptr = rotate_buffer+(3*i); - for ( int j = new_height-1; j >= 0; j-- ) + for ( unsigned int j = new_height-1; j >= 0; j-- ) { *d_ptr = *s_ptr++; *(d_ptr+1) = *s_ptr++; @@ -2433,16 +2433,16 @@ void Image::Rotate( int angle ) new_height = width; new_width = height; - int line_bytes = new_width*colours; + unsigned int line_bytes = new_width*colours; unsigned char *s_ptr = buffer+size; if ( colours == ZM_COLOUR_GRAY8 ) { unsigned char *d_ptr; - for ( int i = new_width-1; i >= 0; i-- ) + for ( unsigned int i = new_width-1; i >= 0; i-- ) { d_ptr = rotate_buffer+i; - for ( int j = new_height-1; j >= 0; j-- ) + for ( unsigned int j = new_height-1; j >= 0; j-- ) { s_ptr--; *d_ptr = *s_ptr; @@ -2468,10 +2468,10 @@ void Image::Rotate( int angle ) else /* Assume RGB24 */ { unsigned char *d_ptr; - for ( int i = new_width-1; i >= 0; i-- ) + for ( unsigned int i = new_width-1; i >= 0; i-- ) { d_ptr = rotate_buffer+(3*i); - for ( int j = new_height-1; j >= 0; j-- ) + for ( unsigned int j = new_height-1; j >= 0; j-- ) { *(d_ptr+2) = *(--s_ptr); *(d_ptr+1) = *(--s_ptr); @@ -2493,8 +2493,8 @@ void Image::Flip( bool leftright ) { uint8_t* flip_buffer = AllocBuffer(size); - int line_bytes = width*colours; - int line_bytes2 = 2*line_bytes; + unsigned int line_bytes = width*colours; + unsigned int line_bytes2 = 2*line_bytes; if ( leftright ) { // Horizontal flip, left to right @@ -2506,7 +2506,7 @@ void Image::Flip( bool leftright ) { while( d_ptr < max_d_ptr ) { - for ( int j = 0; j < width; j++ ) + for ( unsigned int j = 0; j < width; j++ ) { s_ptr--; *d_ptr++ = *s_ptr; @@ -2521,7 +2521,7 @@ void Image::Flip( bool leftright ) Rgb* max_d_rptr = (Rgb*)max_d_ptr; while( d_rptr < max_d_rptr ) { - for ( int j = 0; j < width; j++ ) + for ( unsigned int j = 0; j < width; j++ ) { s_rptr--; *d_rptr++ = *s_rptr; @@ -2533,7 +2533,7 @@ void Image::Flip( bool leftright ) { while( d_ptr < max_d_ptr ) { - for ( int j = 0; j < width; j++ ) + for ( unsigned int j = 0; j < width; j++ ) { s_ptr -= 3; *d_ptr++ = *s_ptr; @@ -2590,19 +2590,19 @@ void Image::Scale( unsigned int factor ) unsigned int last_h_index = 0; unsigned int last_w_index = 0; unsigned int h_index; - for ( int y = 0; y < height; y++ ) + for ( unsigned int y = 0; y < height; y++ ) { unsigned char *ps = &buffer[y*wc]; unsigned int w_count = ZM_SCALE_BASE/2; unsigned int w_index; last_w_index = 0; - for ( int x = 0; x < width; x++ ) + for ( unsigned int x = 0; x < width; x++ ) { w_count += factor; w_index = w_count/ZM_SCALE_BASE; for (unsigned int f = last_w_index; f < w_index; f++ ) { - for ( int c = 0; c < colours; c++ ) + for ( unsigned int c = 0; c < colours; c++ ) { *pd++ = *(ps+c); } @@ -2650,7 +2650,7 @@ void Image::Scale( unsigned int factor ) if ( w_index > last_w_index ) { - for ( int c = 0; c < colours; c++ ) + for ( unsigned int c = 0; c < colours; c++ ) { *pd++ = *ps++; } diff --git a/src/zm_image.h b/src/zm_image.h index c6ffd2a54..efa34ef67 100644 --- a/src/zm_image.h +++ b/src/zm_image.h @@ -136,12 +136,12 @@ protected: static struct zm_error_mgr jpg_err; protected: - int width; - int height; - int pixels; - int colours; - int size; - int subpixelorder; + unsigned int width; + unsigned int height; + unsigned int pixels; + unsigned int colours; + unsigned int size; + unsigned int subpixelorder; unsigned long allocation; uint8_t *buffer; int buffertype; /* 0=not ours, no need to call free(), 1=malloc() buffer, 2=new buffer */ @@ -158,18 +158,18 @@ public: Image( const Image &p_image ); ~Image(); - inline int Width() const { return( width ); } - inline int Height() const { return( height ); } - inline int Pixels() const { return( pixels ); } - inline int Colours() const { return( colours ); } - inline int SubpixelOrder() const { return( subpixelorder ); } - inline int Size() const { return( size ); } + inline unsigned int Width() const { return( width ); } + inline unsigned int Height() const { return( height ); } + inline unsigned int Pixels() const { return( pixels ); } + inline unsigned int Colours() const { return( colours ); } + inline unsigned int SubpixelOrder() const { return( subpixelorder ); } + inline unsigned int Size() const { return( size ); } /* Internal buffer should not be modified from functions outside of this class */ inline const uint8_t* Buffer() const { return( buffer ); } inline const uint8_t* Buffer( unsigned int x, unsigned int y= 0 ) const { return( &buffer[colours*((y*width)+x)] ); } /* Request writeable buffer */ - uint8_t* WriteBuffer(const int p_width, const int p_height, const int p_colours, const int p_subpixelorder); + uint8_t* WriteBuffer(const unsigned int p_width, const unsigned int p_height, const unsigned int p_colours, const unsigned int p_subpixelorder); inline int IsBufferHeld() const { return holdbuffer; } inline void HoldBuffer(int tohold) { holdbuffer = tohold; } @@ -181,9 +181,9 @@ public: width = height = colours = size = pixels = subpixelorder = 0; } - void Assign( int p_width, int p_height, int p_colours, int p_subpixelorder, const uint8_t* new_buffer, const size_t buffer_size); + void Assign( unsigned int p_width, unsigned int p_height, unsigned int p_colours, unsigned int p_subpixelorder, const uint8_t* new_buffer, const size_t buffer_size); void Assign( const Image &image ); - void AssignDirect( const int p_width, const int p_height, const int p_colours, const int p_subpixelorder, uint8_t *new_buffer, const size_t buffer_size, const int p_buffertype); + void AssignDirect( const unsigned int p_width, const unsigned int p_height, const unsigned int p_colours, const unsigned int p_subpixelorder, uint8_t *new_buffer, const size_t buffer_size, const int p_buffertype); inline void CopyBuffer( const Image &image ) { @@ -202,9 +202,9 @@ public: bool ReadRaw( const char *filename ); bool WriteRaw( const char *filename ) const; - bool ReadJpeg( const char *filename, int p_colours, int p_subpixelorder); + bool ReadJpeg( const char *filename, unsigned int p_colours, unsigned int p_subpixelorder); bool WriteJpeg( const char *filename, int quality_override=0 ) const; - bool DecodeJpeg( const JOCTET *inbuffer, int inbuffer_size, int p_colours, int p_subpixelorder); + bool DecodeJpeg( const JOCTET *inbuffer, int inbuffer_size, unsigned int p_colours, unsigned int p_subpixelorder); bool EncodeJpeg( JOCTET *outbuffer, int *outbuffer_size, int quality_override=0 ) const; #if HAVE_ZLIB_H @@ -212,24 +212,24 @@ public: bool Zip( Bytef *outbuffer, unsigned long *outbuffer_size, int compression_level=Z_BEST_SPEED ) const; #endif // HAVE_ZLIB_H - bool Crop( int lo_x, int lo_y, int hi_x, int hi_y ); + bool Crop( unsigned int lo_x, unsigned int lo_y, unsigned int hi_x, unsigned int hi_y ); bool Crop( const Box &limits ); void Overlay( const Image &image ); - void Overlay( const Image &image, int x, int y ); + void Overlay( const Image &image, unsigned int x, unsigned int y ); void Blend( const Image &image, int transparency=12 ); - static Image *Merge( int n_images, Image *images[] ); - static Image *Merge( int n_images, Image *images[], double weight ); - static Image *Highlight( int n_images, Image *images[], const Rgb threshold=RGB_BLACK, const Rgb ref_colour=RGB_RED ); + static Image *Merge( unsigned int n_images, Image *images[] ); + static Image *Merge( unsigned int n_images, Image *images[], double weight ); + static Image *Highlight( unsigned int n_images, Image *images[], const Rgb threshold=RGB_BLACK, const Rgb ref_colour=RGB_RED ); //Image *Delta( const Image &image ) const; void Delta( const Image &image, Image* targetimage) const; const Coord centreCoord( const char *text ) const; void Annotate( const char *p_text, const Coord &coord, const Rgb fg_colour=RGB_WHITE, const Rgb bg_colour=RGB_BLACK ); - Image *HighlightEdges( Rgb colour, int p_colours, int p_subpixelorder, const Box *limits=0 ); + Image *HighlightEdges( Rgb colour, unsigned int p_colours, unsigned int p_subpixelorder, const Box *limits=0 ); //Image *HighlightEdges( Rgb colour, const Polygon &polygon ); void Timestamp( const char *label, const time_t when, const Coord &coord ); - void Colourise(const int p_reqcolours, const int p_reqsubpixelorder); + void Colourise(const unsigned int p_reqcolours, const unsigned int p_reqsubpixelorder); void DeColourise(); void Clear() { memset( buffer, 0, size ); } diff --git a/src/zm_local_camera.cpp b/src/zm_local_camera.cpp index 04cf3f925..110db6828 100644 --- a/src/zm_local_camera.cpp +++ b/src/zm_local_camera.cpp @@ -1073,7 +1073,7 @@ void LocalCamera::Terminate() if ( v4l_version == 1 ) { #if HAVE_LIBSWSCALE - for(unsigned int i=0; i < v4l1_data.frames.frames; i++) { + for(int i=0; i < v4l1_data.frames.frames; i++) { /* Free capture pictures */ av_free(capturePictures[i]); capturePictures[i] = NULL; diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 79d96e234..463cf2b07 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -2727,7 +2727,7 @@ int Monitor::Capture() } if ( true ) { - if ( capture_image->Size() != (int)camera->ImageSize() ) + if ( capture_image->Size() != camera->ImageSize() ) { Error( "Captured image does not match expected size, check width, height and colour depth" ); return( -1 ); diff --git a/src/zm_remote_camera_http.cpp b/src/zm_remote_camera_http.cpp index c82df6c96..59c6f53e0 100644 --- a/src/zm_remote_camera_http.cpp +++ b/src/zm_remote_camera_http.cpp @@ -1086,7 +1086,7 @@ int RemoteCameraHttp::PreCapture() int RemoteCameraHttp::Capture( Image &image ) { - int content_length = GetResponse(); + unsigned int content_length = GetResponse(); if ( content_length == 0 ) { Warning( "Unable to capture image, retrying" ); From e30a43bc0a9390158da360f1a042b8944bf44df1 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Tue, 17 Sep 2013 17:50:50 -0500 Subject: [PATCH 11/13] Move debian folder under distros --- {debian => distros}/README.Debian | 0 {debian => distros}/apache.conf | 0 {debian => distros}/changelog | 0 {debian => distros}/compat | 0 {debian => distros}/control | 0 {debian => distros}/copyright | 0 {debian => distros}/dirs | 0 {debian => distros}/docs | 0 {debian => distros}/init.d | 0 {debian => distros}/postinst | 0 {debian => distros}/postrm | 0 {debian => distros}/preinst | 0 {debian => distros}/rules | 0 {debian => distros}/watch | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename {debian => distros}/README.Debian (100%) rename {debian => distros}/apache.conf (100%) rename {debian => distros}/changelog (100%) rename {debian => distros}/compat (100%) rename {debian => distros}/control (100%) rename {debian => distros}/copyright (100%) rename {debian => distros}/dirs (100%) rename {debian => distros}/docs (100%) rename {debian => distros}/init.d (100%) rename {debian => distros}/postinst (100%) rename {debian => distros}/postrm (100%) rename {debian => distros}/preinst (100%) rename {debian => distros}/rules (100%) rename {debian => distros}/watch (100%) diff --git a/debian/README.Debian b/distros/README.Debian similarity index 100% rename from debian/README.Debian rename to distros/README.Debian diff --git a/debian/apache.conf b/distros/apache.conf similarity index 100% rename from debian/apache.conf rename to distros/apache.conf diff --git a/debian/changelog b/distros/changelog similarity index 100% rename from debian/changelog rename to distros/changelog diff --git a/debian/compat b/distros/compat similarity index 100% rename from debian/compat rename to distros/compat diff --git a/debian/control b/distros/control similarity index 100% rename from debian/control rename to distros/control diff --git a/debian/copyright b/distros/copyright similarity index 100% rename from debian/copyright rename to distros/copyright diff --git a/debian/dirs b/distros/dirs similarity index 100% rename from debian/dirs rename to distros/dirs diff --git a/debian/docs b/distros/docs similarity index 100% rename from debian/docs rename to distros/docs diff --git a/debian/init.d b/distros/init.d similarity index 100% rename from debian/init.d rename to distros/init.d diff --git a/debian/postinst b/distros/postinst similarity index 100% rename from debian/postinst rename to distros/postinst diff --git a/debian/postrm b/distros/postrm similarity index 100% rename from debian/postrm rename to distros/postrm diff --git a/debian/preinst b/distros/preinst similarity index 100% rename from debian/preinst rename to distros/preinst diff --git a/debian/rules b/distros/rules similarity index 100% rename from debian/rules rename to distros/rules diff --git a/debian/watch b/distros/watch similarity index 100% rename from debian/watch rename to distros/watch From 4123f2be1c8df953ddcee72c4f4b4fb4e63bb024 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Tue, 17 Sep 2013 18:32:53 -0500 Subject: [PATCH 12/13] Can't seem to catch a break tonight. Moving dian files into correct folder. --- distros/{ => debian}/README.Debian | 0 distros/{ => debian}/apache.conf | 0 distros/{ => debian}/changelog | 0 distros/{ => debian}/compat | 0 distros/{ => debian}/control | 0 distros/{ => debian}/copyright | 0 distros/{ => debian}/dirs | 0 distros/{ => debian}/docs | 0 distros/{ => debian}/init.d | 0 distros/{ => debian}/postinst | 0 distros/{ => debian}/postrm | 0 distros/{ => debian}/preinst | 0 distros/{ => debian}/rules | 0 distros/{ => debian}/watch | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename distros/{ => debian}/README.Debian (100%) rename distros/{ => debian}/apache.conf (100%) rename distros/{ => debian}/changelog (100%) rename distros/{ => debian}/compat (100%) rename distros/{ => debian}/control (100%) rename distros/{ => debian}/copyright (100%) rename distros/{ => debian}/dirs (100%) rename distros/{ => debian}/docs (100%) rename distros/{ => debian}/init.d (100%) rename distros/{ => debian}/postinst (100%) rename distros/{ => debian}/postrm (100%) rename distros/{ => debian}/preinst (100%) rename distros/{ => debian}/rules (100%) rename distros/{ => debian}/watch (100%) diff --git a/distros/README.Debian b/distros/debian/README.Debian similarity index 100% rename from distros/README.Debian rename to distros/debian/README.Debian diff --git a/distros/apache.conf b/distros/debian/apache.conf similarity index 100% rename from distros/apache.conf rename to distros/debian/apache.conf diff --git a/distros/changelog b/distros/debian/changelog similarity index 100% rename from distros/changelog rename to distros/debian/changelog diff --git a/distros/compat b/distros/debian/compat similarity index 100% rename from distros/compat rename to distros/debian/compat diff --git a/distros/control b/distros/debian/control similarity index 100% rename from distros/control rename to distros/debian/control diff --git a/distros/copyright b/distros/debian/copyright similarity index 100% rename from distros/copyright rename to distros/debian/copyright diff --git a/distros/dirs b/distros/debian/dirs similarity index 100% rename from distros/dirs rename to distros/debian/dirs diff --git a/distros/docs b/distros/debian/docs similarity index 100% rename from distros/docs rename to distros/debian/docs diff --git a/distros/init.d b/distros/debian/init.d similarity index 100% rename from distros/init.d rename to distros/debian/init.d diff --git a/distros/postinst b/distros/debian/postinst similarity index 100% rename from distros/postinst rename to distros/debian/postinst diff --git a/distros/postrm b/distros/debian/postrm similarity index 100% rename from distros/postrm rename to distros/debian/postrm diff --git a/distros/preinst b/distros/debian/preinst similarity index 100% rename from distros/preinst rename to distros/debian/preinst diff --git a/distros/rules b/distros/debian/rules similarity index 100% rename from distros/rules rename to distros/debian/rules diff --git a/distros/watch b/distros/debian/watch similarity index 100% rename from distros/watch rename to distros/debian/watch From eba8b0dde00e158ee8af208b23e83916d83b379d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 18 Sep 2013 12:51:10 -0400 Subject: [PATCH 13/13] move this into the distros dir --- {debian => distros/debian}/README.Debian | 0 {debian => distros/debian}/apache.conf | 0 {debian => distros/debian}/changelog | 0 {debian => distros/debian}/compat | 0 {debian => distros/debian}/control | 0 {debian => distros/debian}/copyright | 0 {debian => distros/debian}/dirs | 0 {debian => distros/debian}/docs | 0 {debian => distros/debian}/init.d | 0 {debian => distros/debian}/postinst | 0 {debian => distros/debian}/postrm | 0 {debian => distros/debian}/preinst | 0 {debian => distros/debian}/rules | 0 {debian => distros/debian}/watch | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename {debian => distros/debian}/README.Debian (100%) rename {debian => distros/debian}/apache.conf (100%) rename {debian => distros/debian}/changelog (100%) rename {debian => distros/debian}/compat (100%) rename {debian => distros/debian}/control (100%) rename {debian => distros/debian}/copyright (100%) rename {debian => distros/debian}/dirs (100%) rename {debian => distros/debian}/docs (100%) rename {debian => distros/debian}/init.d (100%) rename {debian => distros/debian}/postinst (100%) rename {debian => distros/debian}/postrm (100%) rename {debian => distros/debian}/preinst (100%) rename {debian => distros/debian}/rules (100%) rename {debian => distros/debian}/watch (100%) diff --git a/debian/README.Debian b/distros/debian/README.Debian similarity index 100% rename from debian/README.Debian rename to distros/debian/README.Debian diff --git a/debian/apache.conf b/distros/debian/apache.conf similarity index 100% rename from debian/apache.conf rename to distros/debian/apache.conf diff --git a/debian/changelog b/distros/debian/changelog similarity index 100% rename from debian/changelog rename to distros/debian/changelog diff --git a/debian/compat b/distros/debian/compat similarity index 100% rename from debian/compat rename to distros/debian/compat diff --git a/debian/control b/distros/debian/control similarity index 100% rename from debian/control rename to distros/debian/control diff --git a/debian/copyright b/distros/debian/copyright similarity index 100% rename from debian/copyright rename to distros/debian/copyright diff --git a/debian/dirs b/distros/debian/dirs similarity index 100% rename from debian/dirs rename to distros/debian/dirs diff --git a/debian/docs b/distros/debian/docs similarity index 100% rename from debian/docs rename to distros/debian/docs diff --git a/debian/init.d b/distros/debian/init.d similarity index 100% rename from debian/init.d rename to distros/debian/init.d diff --git a/debian/postinst b/distros/debian/postinst similarity index 100% rename from debian/postinst rename to distros/debian/postinst diff --git a/debian/postrm b/distros/debian/postrm similarity index 100% rename from debian/postrm rename to distros/debian/postrm diff --git a/debian/preinst b/distros/debian/preinst similarity index 100% rename from debian/preinst rename to distros/debian/preinst diff --git a/debian/rules b/distros/debian/rules similarity index 100% rename from debian/rules rename to distros/debian/rules diff --git a/debian/watch b/distros/debian/watch similarity index 100% rename from debian/watch rename to distros/debian/watch