\section{Установка ZoneMinder}

Идем на freshmeat.net, в поиске вводим ZoneMinder, получаем, как
минимум, один проект. Когда писалась эта статья проект находился как:

\begin{verbatim}
http://freshmeat.net/projects/zoneminder/
\end{verbatim}

Если любопытно - идем на указанную там домашнюю страницу ( на момент
написания этой статьи - www.zoneminder.com). А если не особо интересно -
просто дергаем мышей url на tgz, когда я скачивал это  было:
 
\begin{verbatim}
 http://www.zoneminder.com/downloads/ZoneMinder-1.22.0.tar.gz 
\end{verbatim}

Далее, по скачиванию tgz он разархивируется стандартным\\
'tar xzf /path/to/ZoneMinder-1.22.0.tar.gz' 

После чего идем внутрь полученного каталога. В моем случае это:

\begin{verbatim}
# cd /usr/src/2Install/CURRENT/ZoneMinder-1.22.0/
----------------- [ 03:39:09, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls
.             ChangeLog    config.status  depcomp      Makefile.in    README.html  src       zm.conf.in
..            confdefs.h   configure      INSTALL      missing        README.pdf   stamp-h1
acinclude.m4  config.h     configure.in   install-sh   mkinstalldirs  README.rtf   TODO
aclocal.m4    config.h.in  COPYING        Makefile     NEWS           README.txt   web
AUTHORS       config.log   db             Makefile.am  README         scripts      zm.conf
----------------- [ 03:39:14, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# less INSTALL
\end{verbatim}

INSTALL коротенький и бестолковый.  Делаем 'less README.txt'. Ищем слово
'Requirements'. Выясняется, что проект то монстр - ему и sql backend
подавай и еще  много чего.. ;) 


\subsection{Инсталяция MySQL}

Выясняется, что сначала нам надо поставить mysql: 

\begin{verbatim}

Firstly,  it  uses  MySQL so you'll need  that.  In  order  to
compile   you  need  to  make  sure  you  have  a  development
installation and not just a runtime; this is because it  needs
to use the MySQL header files. If you are running an RPM based
distribution then it's probably worth installing all the  pure
mysql rpm files to be sure you have the right ones.


\end{verbatim}
 

В моей системе он уже стоит , если у Вас еще нет - ставите из rpm 
\footnote{ 'rpm -i /path/mysqlrpmfile.rpm', если возникают проблемы с зависимостями
пакетов - находите в сети или на Вашем инсталляционном диске нужное и
доставляете, ну или сносите то, что мешает.} или собираете из исходников
согласно инструкции внутри tgz с исходным кодом. Описание того как
делать установку из исходников в пакете с исходниками вполне вменяемое.
В любом случае - я ставил из rpm, что для домашней системы и, тем более
для тестов - вполне достаточно\footnote{а если еще точнее - выбрал
установку mysql пакетов (и прочих sql-aware пакетов) при инсталляции
системы}, к тому же еще и быстрее. 

Вообще говоря количество пакетов, которое у меня стоит сейчас явно 
превышает мои потребности, но однажды потраченное время на инсталляцию 
всего что только есть экономит мне теперь время на поисках пакетов. 
Например:

\begin{verbatim}
----------------- [ 04:06:04, olli@skylab, ~  ]
$ rpm -qa | grep sql | wc -l
57
----------------- [ 04:06:41, olli@skylab, ~  ]
$ rpm -qa | grep mysql | wc -l
23
----------------- [ 04:16:23, olli@skylab, ~  ]
$ 
\end{verbatim}

На всякий случай приведу список того что относится конкретно к mysql:

\begin{verbatim}
----------------- [ 04:19:43, olli@skylab, ~  ]
$ rpm -qa | grep -i mysql
mysql-devel-4.1.13-3
mysql-4.1.13-3
ulogd-mysql-1.23-2
mysql-query-browser-1.1.12-2
mysql-client-4.1.13-3
libgda-mysql-1.3.91-5
mysql-shared-4.1.13-3
qt3-mysql-3.3.4-28
rekall-mysql-2.2.1-11
mysql-administrator-1.0.22a-2
python-mysql-1.2.0-4
perl-DBD-mysql-3.0002-2
mysql-Max-4.1.13-3
mysql-bench-4.1.13-3
php4-mysql-4.4.0-6
apache2-mod_auth_mysql-2.8.1-5
postfix-mysql-2.2.5-5
php5-mysql-5.0.4-9
qt-sql-mysql-4.0.1-10
bytefx-data-mysql-1.1.8.3-6
php5-mysqli-5.0.4-9
ruby-mysql-2.6.3-5
mysql-connector-java-3.1.8-3
----------------- [ 04:20:17, olli@skylab, ~  ]
$
\end{verbatim}

Соответственно после того как mysql поставлен его надо настроить.\\

Внимание: в моей системе используются пути отличные от путей по
умолчанию. Будьте внимательны - если у Вас что то не получилось с mysql
по этому HOWTO - дело вполне может быть <<в путях>>.


Делаем следующее
\footnote{на вашей системе версии пкетов могут отличаться, плюс у меня индивидуальны настройки }:

\begin{verbatim}
----------------- [ 04:23:35, olli@skylab, ~  ]
$ rpm -ql mysql-4.1.13-3 | grep ^/etc
/etc/init.d/mysql
/etc/logrotate.d/mysql
/etc/my.cnf
----------------- [ 04:23:49, olli@skylab, ~  ]
$ cat /etc/init.d/mysql | wc -l
274
----------------- [ 04:25:39, olli@skylab, ~  ]
$ 
\end{verbatim}

В SuSE init скрипты, как и в RedHat подобных системах весьма
монстрообразны. =) Но работают и обычно не требуют вмешательства - вот,
для примера, последняя  команда из вышеуказанных показывает количество
строк в /etc/init.d/mysql - 274.

Если вдруг у вас нет стартового скрипта, то Вы можете сам сваять нечто
попроще или воспользоваться вот этим примером:

\begin{verbatim}
#!/bin/sh

# Source function library.
. /etc/rc.d/init.d/functions

[ -f /usr/local/libexec/mysqld ] || exit 0

[ -f /etc/my.cnf ] || exit 0

RETVAL=0

# See how we were called.
case "$1" in
  start)
        # Start daemons.
        echo -n "Starting mysqld: "
        daemon /usr/local/libexec/mysqld -u mysql --default-character-set=koi8_ru --skip-nam
e-resolve --datadir=/home/mysql/db --pid-file=/var/run/mysql.pid >/dev/null 2>&1 &
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mysqld
        echo
        ;;
  stop)
        # Stop daemons.
        echo -n "Shutting down mysqld: "
        killproc mysqld
#       /usr/local/bin/mysqladmin shutdown
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mysqld
        echo
        ;;
  status)
        /usr/local/bin/mysqladmin status
#       /usr/sbin/ndc -c /var/named/var/run/ndc status
        exit $?
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  reload)
        /usr/local/bin/mysqladmin reload
        /usr/local/bin/mysqladmin refresh
        exit $?
        ;;
  probe)
        # to offer to restart every time
        /usr/local/bin/mysqladmin reload >/dev/null 2>&1 || echo start
        exit 0
        ;;

  *)
        echo "Usage: mysqld {start|stop|status|restart}"
        exit 1
esac

exit $RETVAL

\end{verbatim}

Всего на 57 строчек. Кстати, не забудьте заменить пути на соответствующие
Вашей системе. =)

Теперь следующий шаг - настраиваем /etc/my.cnf. В моей системе следующие
опции:

\begin{verbatim}
----------------- [ 05:03:46, root@skylab, ~  ]
# cat /etc/my.cnf | grep -v ^\$| grep -v ^\#
[client]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
default-character-set=koi8r
[mysqld]
bind-address    = 127.0.0.1
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 24M
max_allowed_packet = 2M
table_cache = 128
sort_buffer_size = 1024K
net_buffer_length = 16K
read_buffer_size = 372K
read_rnd_buffer_size = 640K
myisam_sort_buffer_size = 9M
default-character-set=koi8r
log-bin
server-id       = 1
[safe_mysqld]
err-log=/var/log/mysql/mysqld.log
default-character-set=koi8r
[mysqldump]
quick
max_allowed_packet = 16M
default-character-set=koi8r
[mysql]
auto-rehash # tab completition
default-character-set=koi8r
[isamchk]
key_buffer = 30M
sort_buffer_size = 30M
read_buffer = 3M
write_buffer = 3M
default-character-set=koi8r
[myisamchk]
key_buffer = 30M
sort_buffer_size = 30M
read_buffer = 3M
write_buffer = 3M
default-character-set=koi8r
[mysqlhotcopy]
interactive-timeout
default-character-set=koi8r
----------------- [ 05:04:02, root@skylab, ~  ]
#1
\end{verbatim}

для информации - в стартовом скрипте к mysql от сузи у меня зашиты
следующие данные,  которые используются как defaults,  когда не
установлено значение соответствующей переменной:

\begin{verbatim}
----------------- [ 05:05:40, root@skylab, ~  ]
# grep = /etc/init.d/mysql | head -30 | grep mysql| grep -v ^\
datadir=/var/spool/mysql
mysql_daemon_user=mysql
mysql_daemon_group=mysql
pid_file=/var/run/mysql/mysqld.pid
socket=/var/lib/mysql/mysql.sock
MYADMIN=/usr/bin/mysqladmin
export TMPDIR=/tmp/mysql/tmp
----------------- [ 05:05:53, root@skylab, ~  ]
#
\end{verbatim}

Добавляем mysql в автозапуск на 3й и 5й runlevel'ы:

\begin{verbatim}

----------------- [ 05:23:11, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls -l /etc/rc.d/rc[35].d/*mysql*
lrwxrwxrwx  1 root root 8 2006-02-20 05:21 /etc/rc.d/rc3.d/K14mysql -> ../mysql
lrwxrwxrwx  1 root root 8 2006-02-20 05:21 /etc/rc.d/rc3.d/S12mysql -> ../mysql
lrwxrwxrwx  1 root root 8 2006-02-20 05:21 /etc/rc.d/rc5.d/K14mysql -> ../mysql
lrwxrwxrwx  1 root root 8 2006-02-20 05:21 /etc/rc.d/rc5.d/S12mysql -> ../mysql
----------------- [ 05:23:43, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#

\end{verbatim}

Я делаю это в SuSE ястом(SuSE menu->System->Yast->System Services
(Runlevel)), очень удобно, но можно и просто в shell: 'cd
/etc/rc.d/rc3.d/; ln -s ../mysql S12mysql' и т.д. 

Теперь стартуем его, если старт произошел впервые, то напишет нечто
похожее на нижеследующее:


\begin{verbatim}

---------------- [ 05:23:43, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /etc/init.d/mysql start
Creating/Updating MySQL privilege database...
Installing all prepared tables
Fill help tables
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h skylab.digger.org.ru password 'new-password'
See the manual for more instructions.

You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests

Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at https://order.mysql.com
Fixing privilege tables...
Starting service MySQL                                                done
----------------- [ 05:26:26, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#

\end{verbatim}


Делаем ему пароль, чтоб не ворчал:

\begin{verbatim}

----------------- [ 06:45:03, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /usr/bin/mysqladmin -u root password MySql
----------------- [ 06:51:35, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /usr/bin/mysqladmin -u root -pMySql -h 127.0.0.1 password MySql
----------------- [ 06:51:59, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#

\end{verbatim}

Использовать такие простые пароли никому не рекомендую. Но для тестового прогона сойдет.
;)


Теперь, когда mysql у нас должен работать мы можем проверить это, а
заодно убить всякие бесполезные БД создаваемые при инсталляции:

\begin{verbatim}

----------------- [ 07:03:14, olli@skylab, ~  ]
$ mysql -u root -h 127.0.0.1 -pMySql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 4.1.13-Max

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+
3 rows in set (0.01 sec)

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> drop database test;
Query OK, 0 rows affected (0.11 sec)

mysql> drop database tmp;
Query OK, 0 rows affected (0.02 sec)

mysql> \q
Bye
----------------- [ 07:13:31, olli@skylab, ~  ]
$

\end{verbatim}

Однако это еще не все, по крайней мере после того как я задаю пароль к
mysql и сношу тестовые базы я делаю еще:

\begin{verbatim}
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> delete from user where Password='';
Query OK, 3 rows affected (0.01 sec)

mysql> delete from db where host='%';
Query OK, 2 rows affected (0.02 sec)

mysql>
\end{verbatim}

Таким образом я избавляюсь от всех остатков безпарольных входов и от остатков
сохранившихся от тестовых баз.

Поскольку в SuSE /etc/my.cnf имеет права доступа 660 при использовании
набора прав 'secure',

\begin{verbatim}
----------------- [ 05:56:15, root@skylab, ~  ]
# ls -l /etc/my.cnf
-rw-rw----  1 mysql mysql 5135 2006-02-20 06:40 /etc/my.cnf
----------------- [ 05:56:23, root@skylab, ~  ]
#
\end{verbatim}

то от обычного пользователя настройки клиента из этого файла прочесть
будет невозможно, так что делаем ~/.my.cnf следующего содержания: 

\begin{verbatim}
----------------- [ 05:07:45, olli@skylab, ~  ]
$ cat /home/olli/.my.cnf
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

auto-rehash     # enable tab completition

# set default encoding.
default-character-set=koi8r

----------------- [ 05:07:57, olli@skylab, ~  ]
$
\end{verbatim}

Внимание: в SuSE еще неплохо бы иметь ~root/.my.cnf с правами 600, о чем
сказано в соответствующем скрипте ротации логов:

\begin{verbatim}
----------------- [ 05:16:00, root@skylab, /etc  ]
# grep ^\# /etc/logrotate.d/mysql | tail -12
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
----------------- [ 05:16:05, root@skylab, /etc  ]
#
\end{verbatim}

Поэтому делаем вот такой файлик:

\begin{verbatim}
----------------- [ 05:16:05, root@skylab, /etc  ]
# ls -l ~root/.my.cnf
-rw-------  1 root root 252 2006-03-06 05:01 /home/root/.my.cnf
----------------- [ 05:18:18, root@skylab, /etc  ]
# cat ~root/.my.cnf
#
# This file is required to be presend WITH PASSWORD for automated logrotating.
#
[mysqladmin]
password = MySql
user= root
port            = 3306
socket          = /var/lib/mysql/mysql.sock
# set default encoding.
default-character-set=koi8r

----------------- [ 05:18:23, root@skylab, /etc  ]
#
\end{verbatim}

Теперь можно вернуться к документации на ZoneMinder: 

\begin{verbatim}

Next  it  does  things  with JPEGs so  you'll  need  at  least
libjpeg.a  which I think come as standard nowadays  with  most
distributions. Users have reported varying degrees of  success
with  other jpeg libraries such as jpeg-mmx but these are  not
officially supported. If you plan to use network cameras  then
the Perl Compatible Regular Expression library (libpcre.a) can
prove useful but is not always essential. ZoneMinder also uses
the  netpbm  utilities  in  a very  limited  way  to  generate
thumbnails  under  certain circumstances though  this  can  be
modified.

\end{verbatim}

Это у меня есть:

\begin{verbatim}
----------------- [ 07:26:28, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# find / -type f -name libjpeg.a
/usr/lib/libjpeg.a
----------------- [ 08:03:18, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# rpm -qf /usr/lib/libjpeg.a
libjpeg-devel-6.2.0-5
----------------- [ 08:06:28, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# find /usr/lib -name libpcre.a
/usr/lib/libpcre.a
----------------- [ 08:06:36, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# rpm -qa | grep -i netpbm
netpbm-10.26.12-5
libnetpbm-1.0.0-636
----------------- [ 08:08:17, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# rpm -qf /usr/lib/libpcre.a
pcre-devel-6.2-2
----------------- [ 08:09:34, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

Так же я уже ставил себе ffpmeg, который упоминается в zoneminder'е, используя 
следующий скрипт-обертку к configure:

\begin{verbatim}

# cat /usr/src/Installed/ffmpeg/build.sh
#!/bin/bash

# touch /home/olli/.cvspass
# cvs -z9 -d:pserver:anonymous@mplayerhq.hu:/cvsroot/ffmpeg co ffmpeg
make clean
./configure             \
  --prefix=/usr/local   \
  --enable-libogg       \
  --enable-vorbis       \
  --enable-theora       \
#  --enable-faadbin      \
  --enable-faac         \
  --enable-libgsm       \
  --enable-xvid         \
  --enable-x264         \
  --enable-a52          \
  --enable-dts          \
  --enable-pp           \
  --enable-shared       \
  --enable-amr_if2      \
  --enable-dc1394       \
  --enable-gpl          \
  --cpu=686
make
make install
make installlib
----------------- [ 08:12:39, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

В скрипте закомментирован собственно способ забора ffmpeg с CVS. Впрочем
на сайте откуда берут ffmpeg все написано. По умолчанию в SuSE ffmpeg и
еще много чего нет всвязи с лицензионными противоречиями. Опции для
сборки в другом дистрибутиве, разумеется, могут быть другими.\\

После сборки ffmpeg надо обновить /etc/ld.so.conf :
\begin{verbatim}
----------------- [ 12:23:02, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# grep ffmpeg /etc/ld.so.conf
/usr/local/ffmpeg/lib
----------------- [ 12:24:48, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

и запустить ldconfig чтобы зависимости обновились.

\begin{verbatim}
----------------- [ 12:24:33, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ldconfig
----------------- [ 12:24:02, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

Возвращаясь к документации ZoneMinder видим следующее:

\begin{verbatim}
Finally,  there  is  quite a bit of  image  streaming in the package. So
if you don't have FireFox  or another browser that supports  image
streaming natively I recommend you get the excellent Cambozola java      
applet from http://www.charliemouse.com/code/cambozola/ which will let
you view the image stream in Internet Explorer and  others. Otherwise
you're limited to just refreshing still images or mpeg based streams, if
you have compatible plugins.
\end{verbatim}

Не то чтобы у меня не было FireFox, но, во первых, хотелось получить
максимум возможностей, а во вторых FireFox у меня заглючил в свое время
и мне было проще его снести, чем разбираться (о чем я запостил отдельный
bug-report в SuSE:
\begin{verbatim}
https://bugzilla.novell.com/show_bug.cgi?id=143269&x=0&y=0 
\end{verbatim}
).

На момент составления этого howto плагин скачивался по следующему url:\\
http://www.charliemouse.com/code/cambozola/cambozola-latest.tar.gz\\

Читая далее выясняем, что для сборки нужен некий ant. Идем на указанный
url ( http://ant.apache.org/ ), там в первых же строках понятно о чем
речь\footnote{Выражаю за это отдельную благодарность составителям
контента, потому как на некоторых сайтах чтобы понять о чем речь надо
сначала перекопать половину линков.}:

\begin{verbatim}
Apache Ant 

Apache Ant is a Java-based build tool. In theory, it is kind of like
Make, but without Make's wrinkles.
\end{verbatim}

К счастью у меня в системе оно уже есть из коробки:

\begin{verbatim}
----------------- [ 06:13:57, olli@skylab, ~  ]
$ rpm -qa | grep -i ant| grep -v dante| grep -v Messan|grep -v Quant| grep -v ^wpa| grep -v ^hant| grep -v ^xsupp|grep -v ^merg
anthy-devel-6801-2
ant-javadoc-1.6.2-7
ant-manual-1.6.2-7
antlr-jedit-2.7.4-8
ant-javamail-1.6.2-7
ant-apache-oro-1.6.2-7
ant-swing-1.6.2-7
ant-junit-1.6.2-7
antlr-2.7.4-8
ant-nodeps-1.6.2-7
ant-jdepend-1.6.2-7
kdenetwork3-InstantMessenger-3.4.2-11
ant-apache-bcel-1.6.2-7
ant-trax-1.6.2-7
enchant-1.1.6-3
ant-scripts-1.6.2-7
anthy-6801-2
ant-1.6.2-5
ant-apache-regexp-1.6.2-7
antlr-manual-2.7.4-8
ant-apache-bsf-1.6.2-7
ant-apache-log4j-1.6.2-7
ant-antlr-1.6.2-7
ant-jmf-1.6.2-7
ant-apache-resolver-1.6.2-7
antlr-javadoc-2.7.4-8
----------------- [ 06:16:17, olli@skylab, ~  ]
$
\end{verbatim}

В результате:

\begin{verbatim}
----------------- [ 06:44:54, olli@skylab, ~/tmp  ]
$ cd /usr/src/2Install/CURRENT/
----------------- [ 06:44:57, olli@skylab, /usr/src/2Install/CURRENT  ]
$ tar xzf cambozola-latest.tar.gz
----------------- [ 06:45:06, olli@skylab, /usr/src/2Install/CURRENT  ]
$ cd cambozola-0.68/
----------------- [ 06:45:14, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68  ]
$ ls
application.properties  bldsrc  build.xml  dist  dist.sh  example.html  LICENSE  README.html  src  watermarks
----------------- [ 06:45:15, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68  ]
$
\end{verbatim}

ant заявлен как аналог make, так что остается, самое очевидное, это
набрать ant, как и написано в readme к cambozola:

\begin{verbatim}
----------------- [ 06:47:56, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68  ]
$ ant
Buildfile: build.xml

init:
    [mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/build
    [mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/pkg
    [mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/pkg/cambozola-0.68
    [mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/deploy
[propertyfile] Creating new property file: /usr/src/2Install/CURRENT/cambozola-0.68/build.number

compile:
     [echo] Compiling with JVM Version 1.5.0_03
    [javac] Compiling 21 source files to /usr/src/2Install/CURRENT/cambozola-0.68/build
    [javac] Note: * uses or overrides a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
     [copy] Copying 1 file to /usr/src/2Install/CURRENT/cambozola-0.68/build
     [copy] Copying 17 files to /usr/src/2Install/CURRENT/cambozola-0.68/build

dist:
      [jar] Building jar: /usr/src/2Install/CURRENT/cambozola-0.68/dist/cambozola.jar
      [jar] Building jar: /usr/src/2Install/CURRENT/cambozola-0.68/dist/cambozola-server.jar

BUILD SUCCESSFUL
Total time: 13 seconds
----------------- [ 06:48:18, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68  ]
$
\end{verbatim}

Внутри cambozola ссылки на другое ПО которое можно использовать для
работы с web-камерами, в числе прочих там ZoneMinder:

\begin{verbatim}
Webcam software

If you want to stream from your own server, you'll need to use some
streaming webcam software, some Linux-friendly package are:

  * W3CAM: http://mpx.freeshell.net/
  * V4l-col: http://www.sr.bham.ac.uk/~mpc/pulsar/qcam/index.shtml
  * Palantir: http://www.fastpath.it/products/palantir
  * Camsource: http://camsource.sourceforge.net/
  * Camserv: http://camserv.sourceforge.net/

Users of Cambozola

  * Zoneminder: http://www.zoneminder.com/
  * Motion: http://www.lavrsen.dk/sources/webcam/motion_guide.htm
  * Wings of Cabarete: Dominican Republic beach cam
\end{verbatim}

Далее возвращаясь к документации на ZoneMinder желательно освоить раздел
"Components" чтобы ориентироваться в инсталируемой системе.
После чего можно спокойно приступать собственно к сборке пакета,
описанной в секции Building документации к ZoneMinder:

\begin{verbatim}
   Building

To  build ZoneMinder the first thing you need to do is run the included   
configure script to define some initial configuration. If you are happy
with the default settings  for the  database host (`localhost'), name
(`zm'), user (`zmuser') and password (`zmpass') then you can just type 

./configure --with-webdir=<your web directory>   --with-cgidir=<your
 cgi directory>

where --with-webdir is the directory to which you want to install  the
PHP files, and --with-cgidir is the directory  to which you want to
install CGI files. These directories  could be /var/www/html/zm and
/var/www/cgi-bin for example.
\end{verbatim}

Откуда можно догадаться, что ZoneMinder завязан помимо sql'я еще и на
апач. В моей системе apache уже установлен:

\begin{verbatim}
----------------- [ 07:39:54, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# rpm -qa | grep apach
apache2-doc-2.0.54-10
apache2-devel-2.0.54-10
ant-apache-oro-1.6.2-7
apache2-mod_fastcgi-2.4.2-4
apache2-mod_ruby-1.2.4-5
apache2-mod_php4-4.4.0-6
ant-apache-bcel-1.6.2-7
apache2-example-pages-2.0.54-10
apache2-mod_perl-2.0.1-4
ant-apache-regexp-1.6.2-7
apache2-2.0.54-10
apache2-mod_python-3.1.3-43
apache2-mod_auth_mysql-2.8.1-5
ant-apache-bsf-1.6.2-7
ant-apache-log4j-1.6.2-7
apache2-mod_macro-1.1.6-5
ant-apache-resolver-1.6.2-7
apache2-prefork-2.0.54-10
apache2-mod_tidy-0.3-2
----------------- [ 07:40:39, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

Соответственно берем webdir согласуясь с конфигурацией апача:

\begin{verbatim}
----------------- [ 07:45:48, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# rpm -ql apache2-2.0.54-10 | grep /etc | grep conf
/etc/apache2/conf.d
/etc/apache2/default-server.conf
/etc/apache2/errors.conf
/etc/apache2/httpd.conf
/etc/apache2/listen.conf
/etc/apache2/mod_autoindex-defaults.conf
/etc/apache2/mod_info.conf
/etc/apache2/mod_log_config.conf
/etc/apache2/mod_mime-defaults.conf
/etc/apache2/mod_status.conf
/etc/apache2/mod_userdir.conf
/etc/apache2/mod_usertrack.conf
/etc/apache2/server-tuning.conf
/etc/apache2/ssl-global.conf
/etc/apache2/sysconfig.d
/etc/apache2/uid.conf
----------------- [ 07:45:57, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

В сузе httpd.conf разнесен по кусочкам для удобства, вот что в
httpd.conf:

\begin{verbatim}
# Overview of include files, chronologically:
#
# httpd.conf
#  |
#  |-- uid.conf  . . . . . . . . . . UserID/GroupID to run under
#  |-- server-tuning.conf  . . . . . sizing of the server (how many processes to start, ...)
#  |-- sysconfig.d/loadmodule.conf . [*] load these modules
#  |-- listen.conf . . . . . . . . . IP adresses / ports to listen on
#  |-- mod_log_config.conf . . . . . define logging formats
#  |-- sysconfig.d/global.conf . . . [*] server-wide general settings
#  |-- mod_status.conf . . . . . . . restrict access to mod_status (server monitoring)
#  |-- mod_info.conf . . . . . . . . restrict access to mod_info
#  |-- mod_usertrack.conf  . . . . . defaults for cookie-based user tracking
#  |-- mod_autoindex-defaults.conf . defaults for displaying of server-generated directory listings
#  |-- mod_mime-defaults.conf  . . . defaults for mod_mime configuration
#  |-- errors.conf . . . . . . . . . customize error responses
#  |-- ssl-global.conf . . . . . . . SSL conf that applies to default server _and all_ virtual hosts
#  |
#  |-- default-server.conf . . . . . set up the default server that replies to non-virtual-host requests
#  |    |--mod_userdir.conf  . . . . . . .  enable UserDir (if mod_userdir is loaded)
#  |    `--conf.d/apache2-manual?conf . . . add the docs ('?' = if installed)
#  |
#  |-- sysconfig.d/include.conf  . . . . .  [*] your include files
#  |                                  (for each file to be included here, put its name
#  |                                  into APACHE_INCLUDE_* in /etc/sysconfig/apache2)
#  |
#  `-- vhosts.d/ . . . . . . . . . . .for each virtual host, place one file here
#       `-- *.conf . . . . . . . . . .(*.conf is automatically included)
#
#
# Files marked [*] are created from sysconfig upon server restart: instead of
# these files, you edit /etc/sysconfig/apache2
\end{verbatim}

Соответственно нам нужно в listen.conf выставить на каких интерфейсах и
портах апач будет слушать. Я для себя сделал так\footnote{У Вас может
быть по другому}:

\begin{verbatim}
# be private
Listen 127.0.0.1:80
Listen 127.0.0.1:443
\end{verbatim}

До кучи можно выставить в /etc/apache2/sysconfig.d/global.conf
ServerAdmin и ServerName.\\

Далее в /etc/apache2/default-server.conf выясняется собственно default
document root:

\begin{verbatim}
----------------- [ 08:04:43, root@skylab, ~  ]
# grep ^DocumentRoot /etc/apache2/default-server.conf
DocumentRoot "/srv/www/htdocs"
----------------- [ 08:05:00, root@skylab, ~  ]
#
\end{verbatim}

Там же можно выставить для default server email для ServerAdmin (как
выше) и ServerName. 



Чтобы не мудрствовать лукаво, возьмем в качестве webdir каталог рядом 
с default DocumentRoot:

\begin{verbatim}
----------------- [ 08:26:54, root@skylab, ~  ]
# mkdir /srv/www/zoneminder
----------------- [ 08:27:16, root@skylab, ~  ]
# mkdir /srv/www/zoneminder-cgi-bin
----------------- [ 08:28:35, root@skylab, ~  ]
# 
\end{verbatim}

И, так как от дефолтного сервера на localhost не много толку, то просто заменим
его ZoneMinder'ом:

\begin{verbatim}
----------------- [ 05:00:07, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# cat /etc/apache2/default-server.conf | grep -v ^\# | grep -v ^\$
DocumentRoot "/srv/www/zoneminder"
<Directory "/srv/www/zoneminder">
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs-2.0/mod/core.html#options
        # for more information.
Options FollowSymLinks
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   Options FileInfo AuthConfig Limit
AllowOverride All 
        # Controls who can get stuff from this server.
Order allow,deny
 Allow from all
</Directory>
Alias /icons/ "/usr/share/apache2/icons/"
<Directory "/usr/share/apache2/icons">
 Options Indexes MultiViews
 AllowOverride None
 Order allow,deny
 Allow from all
</Directory>
ScriptAlias /cgi-bin/ "/srv/www/zoneminder-cgi-bin/"
<Directory "/srv/www/zoneminder-cgi-bin">
 AllowOverride None
 Options +ExecCGI -Includes
 Order allow,deny
 Allow from all
</Directory>
Include /etc/apache2/conf.d/*.conf
Include /etc/apache2/conf.d/apache2-manual?conf
ServerName skylab
ServerAdmin root@skylab.digger.org.ru
----------------- [ 05:00:10, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

<<AllowOverride All>> поставлено чтобы не возиться с тонкой настройкой apache. В рабочей
конфигурации так делать не следует. =)\\ 
<<Options FollowSymLinks>> необходимо чтобы в дальнейшем не было ошибок при попытке
 ява-скрипта перейти на index.php по симлинку.\\

Теперь перезапустим apache:

\begin{verbatim}
---------------- [ 05:00:10, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /etc/init.d/apache2 configcheck
Syntax OK
----------------- [ 05:01:31, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /etc/init.d/apache2 restart
Syntax OK
Shutting down httpd2 (waiting for all children to terminate)          done
Starting httpd2 (prefork)                                             done
----------------- [ 05:01:43, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#  
\end{verbatim}

Поскольку в SuSE:

\begin{verbatim}
----------------- [ 08:28:35, root@skylab, ~  ]
# grep apache /etc/passwd
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
----------------- [ 08:31:12, root@skylab, ~  ]
# grep apache /etc/group
----------------- [ 08:31:18, root@skylab, ~  ]
# grep :8: /etc/group
www:x:8:
----------------- [ 08:31:48, root@skylab, ~  ]
#
\end{verbatim}

используем:

\begin{verbatim}
            --with-webuser=wwwrun                       \
            --with-webgroup=www                         \
\end{verbatim}

В конечном итоге у меня получился следующий командный файл для сборки:

\begin{verbatim}
----------------- [ 12:56:59, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# cat ./build.sh
#!/bin/sh
make clean
./configure                                                     \
                --prefix=/usr/local/zoneminder                  \
                --sysconfdir=/etc/zoneminder                    \
                --with-webdir=/srv/www/zoneminder               \
                --with-cgidir=/srv/www/zoneminder-cgi-bin       \
                --with-ffmpeg=/usr/local/ffmpeg                 \
                --with-extralibs=/usr/local/ffmpeg/lib/lib*     \
		--with-webuser=wwwrun                           \
                --with-webgroup=www                             \
                --with-mysql=/usr                               \
                --enable-debug                                  \
		--with-libarch
echo -e "\n\ncheck configure results, then 'enter' to continue."
echo "(Warnings about libavcodec,libavformat,libavutil are OK.)"
read wait
make
echo "Before running make install proceed w/ mysql part from README.txt"

----------------- [ 13:04:18, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

При этом весьма актуально в процессе запуска configure с приведенными
параметрами смотреть на WARNING'и которые выдает программа. Вот
например:

\begin{verbatim}
configure: WARNING: Device::SerialPort is required for RS232/RS485 PTZ camera control
configure: WARNING: X10::ActiveHome is required for X.10 support
\end{verbatim}

поскольку в моей SuSE 10.0 этого нету - если бы я захотел управлять
камерой через имеющийся в ней RS485 порт, мне пришлось бы идти на CPAN (
http://cpan.org/ ) за этими модулями к perl.\\

Однако, продолжим инсталляцию. С учетом установленного пароля на
root'овый доступ к базе надо сделать следующее:

\begin{verbatim}
----------------- [ 13:09:30, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# mysql -p mysql < db/zm_create.sql
Enter password:
----------------- [ 13:12:06, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

поскольку я использовал defaults для database host, dbname, dbuser и
пароля:
\begin{verbatim}
If you are happy with the default settings  for
the  database host (`localhost'), name (`zm'), user (`zmuser')
and password (`zmpass') then you can just type
\end{verbatim}

то далее:

\begin{verbatim}
# mysql -p mysql
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 4.1.13-Max-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> grant select,insert,update,delete on zm.* to
    ->  'zmuser'@localhost identified by 'zmpass';
Query OK, 0 rows affected (0.19 sec)

mysql> \q
Bye
------------- [ 00:44:22, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# mysqladmin reload
\end{verbatim}

собственно что мы имеем в mysql на этот момент:

\begin{verbatim}
mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| zm       |
+----------+
2 rows in set (0.01 sec)

mysql> use zm;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_zm   |
+----------------+
| Config         |
| Controls       |
| Events         |
| Filters        |
| Frames         |
| Groups         |
| MonitorPresets |
| Monitors       |
| States         |
| Stats          |
| TriggersX10    |
| Users          |
| ZonePresets    |
| Zones          |
+----------------+
14 rows in set (0.00 sec)

mysql>
\end{verbatim}

Стартовый скрипт ZoneMinder называется zm и, согласно документации не инсталлируется
make install, поскольку не факт что будет работать где либо, кроме RedHat подобных 
дистрибутивов:

\begin{verbatim}
The 'zm' script does not get installed automatically as it  is
not necessary for the operation of the ZoneMinder setup per se
and   is   not  necessarily  likely  to  work  correctly   for
distributions  other  than those from  the  RedHat  or  Fedora
families.
\end{verbatim}

Действительно:

\begin{verbatim}
----------------- [ 23:30:57, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# find /usr/local/zoneminder /srv/www/zoneminder* . -name zm
./scripts/zm
----------------- [ 23:31:52, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

Соответственно чтобы ZoneMinder поднимался при старте системы:

\begin{verbatim}
----------------- [ 23:31:52, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# cp ./scripts/zm /etc/init.d/ZoneMinder
`./scripts/zm' -> `/etc/init.d/ZoneMinder'
----------------- [ 23:36:37, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# chmod 755 /etc/init.d/ZoneMinder
\end{verbatim}

Теперь нужно его <<довести до ума>> чтоб работал под SuSE\footnote{под Вашу систему 
возможно не потребуется изменений, если это RedHat, или же потребуются другие изменения}.
У меня получился вот такой скрипт:

\begin{verbatim}
#!/bin/sh
# description: Control ZoneMinder as a Service
# chkconfig: 2345 99 99
#
# Originally by ZoneMinder package.
# Fixed for SuSE by Olli <olli@digger.org.ru>
#
### BEGIN INIT INFO
# Provides:       ZoneMinder
# Required-Start: $local_fs $network $mysql $apache2
# Should-Start:   
# Required-Stop:
# Should-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Description:   ZoneMinder start control script .
### END INIT INFO

echo_success() {
 # just a stub.
 echo -n "success.."
}

echo_failure() {
 #
 echo -n "failed.."
}

prog=ZoneMinder
ZM_PATH_BIN="/usr/local/zoneminder/bin"
command="$ZM_PATH_BIN/zmpkg.pl"

start() {
	echo -n "Starting $prog: "
	$command start
	RETVAL=$?
	[ $RETVAL = 0 ] && echo_success
	[ $RETVAL != 0 ] && echo_failure
	echo
	[ $RETVAL = 0 ] && touch /var/lock/subsys/zm
	return $RETVAL
}
stop() {
	echo -n "Stopping $prog: "
	$command stop
	RETVAL=$?
	[ $RETVAL = 0 ] && echo_success
	[ $RETVAL != 0 ] && echo_failure
	echo
	[ $RETVAL = 0 ] && rm -f /var/lock/subsys/zm
}
status() {
	result=`$command status`
	if [ "$result" = "running" ]; then
		echo "ZoneMinder is running"
		RETVAL=0
	else
		echo "ZoneMinder is stopped"
		RETVAL=1
	fi
}

case "$1" in
'start')
	start
	;;
'stop')
	stop
	;;
'restart')
	stop
	start
	;;
'status')
	status
	;;
*)
	echo "Usage: $0 { start | stop | restart | status }"
	RETVAL=1
	;;
esac
exit $RETVAL
\end{verbatim}

Кстати, если у Вас возникли проблемы коннекта к mysql, то убедитесь, что все
каталоги в пути к сокету имеют права на вход для всех:

\begin{verbatim}
----------------- [ 01:22:30, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls /var/lib/mysql/ -ld
drwxrwxr-x  2 mysql root 4096 2006-03-09 00:29 /var/lib/mysql/
----------------- [ 01:22:40, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls /var/lib/ -ld
drwxr-xr-x  111 root root 4096 2006-03-08 04:35 /var/lib/
----------------- [ 01:24:30, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls /var/ -ld
drwxr-xr-x  18 root root 4096 2006-01-28 04:57 /var/
----------------- [ 01:24:34, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls / -ld
drwxr-xr-x  24 root root 4096 2006-02-13 09:04 /
----------------- [ 01:24:37, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

Далее, как и предлагается manual'ом:

\begin{verbatim}
----------------- [ 01:51:21, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# chkconfig --add ZoneMinder
ZoneMinder                0:off  1:off  2:on   3:on   4:off  5:on   6:off
----------------- [ 01:51:51, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

В yast в SystemServices (Runlevel) ZoneMinder теперь присутствует.\\

В результате имеем:

\begin{verbatim}
----------------- [ 01:53:28, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /etc/init.d/ZoneMinder status
ZoneMinder is stopped
----------------- [ 01:53:44, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# 
\end{verbatim}

В логах:

\begin{verbatim}
Mar  9 01:53:44 skylab zmpkg[11468]: INF [Command: status]
Mar  9 01:53:44 skylab su: (to wwwrun) root on /dev/pts/29
\end{verbatim}

и после:

\begin{verbatim}
----------------- [ 01:53:44, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# /etc/init.d/ZoneMinder start
Starting ZoneMinder: success..
----------------- [ 01:55:12, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

в логах:

\begin{verbatim}
Mar  9 01:53:44 skylab zmpkg[11468]: INF [Command: status]
Mar  9 01:53:44 skylab su: (to wwwrun) root on /dev/pts/29
Mar  9 01:53:44 skylab last message repeated 2 times
Mar  9 01:55:03 skylab zmpkg[11479]: INF [Command: start]
Mar  9 01:55:03 skylab su: (to wwwrun) root on /dev/pts/29
Mar  9 01:55:04 skylab last message repeated 4 times
Mar  9 01:55:05 skylab zmdc[11498]: INF [Server starting at 06/03/09 01:55:05]
Mar  9 01:55:08 skylab su: (to wwwrun) root on /dev/pts/29
Mar  9 01:55:08 skylab zmdc[11522]: INF ['zmfilter.pl' started at 06/03/09 01:55:08]
Mar  9 01:55:08 skylab zmdc[11498]: INF ['zmfilter.pl' starting at 06/03/09 01:55:08, pid = 11522]
Mar  9 01:55:09 skylab su: (to wwwrun) root on /dev/pts/29
Mar  9 01:55:10 skylab zmdc[11528]: INF ['zmaudit.pl -c' started at 06/03/09 01:55:10]
Mar  9 01:55:10 skylab zmdc[11498]: INF ['zmaudit.pl -c' starting at 06/03/09 01:55:10, pid = 11528]
Mar  9 01:55:10 skylab zmfilter[11522]: INF [Scanning for events]
Mar  9 01:55:10 skylab su: (to wwwrun) root on /dev/pts/29
Mar  9 01:55:11 skylab zmdc[11534]: INF ['zmwatch.pl' started at 06/03/09 01:55:11]
Mar  9 01:55:11 skylab zmdc[11498]: INF ['zmwatch.pl' starting at 06/03/09 01:55:11, pid = 11534]
Mar  9 01:55:11 skylab su: (to wwwrun) root on /dev/pts/29
Mar  9 01:55:12 skylab zmwatch[11534]: INF [Watchdog starting]
Mar  9 01:55:12 skylab zmwatch[11534]: INF [Watchdog pausing for 30 seconds]
Mar  9 01:55:12 skylab zmdc[11539]: INF ['zmupdate.pl -c' started at 06/03/09 01:55:12]
Mar  9 01:55:12 skylab zmdc[11498]: INF ['zmupdate.pl -c' starting at 06/03/09 01:55:12, pid = 11539]
Mar  9 01:55:13 skylab Update agent starting at 06/03/09 01:55:13
\end{verbatim}

Чтож, мы практически закончили с инсталляцией. Осталось только добиться
совместной работы с apache.
Однако сразу после перезапуска apache у меня ZoneMinder не заработал - я использую
AppArmor, оченно приятную
утилиту от Novell,
которая следит за тем, чтобы приложения не проявляли непредусмотренной активности.
В данном случае apache2 было запрещено лезть в каталог, который не имеет ничего общего
с настройками по умолчанию:

\begin{verbatim}
Mar  9 05:02:43 skylab kernel: SubDomain: REJECTING r access to 
/srv/www/zoneminder/zm.php (httpd2-prefork(30941) profile
/usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)
\end{verbatim}

Пришлось перевести AppArmor в режим обучения для apache2:

\begin{verbatim}
----------------- [ 05:32:05, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# complain /usr/sbin/httpd2-prefork
Setting /usr/sbin/httpd2-prefork to complain mode.
----------------- [ 05:33:22, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# 
\end{verbatim}

Как следствие - сразу же после этого ZoneMinder заработал - я увидел его консоль по
адресу http://127.0.0.1/ , в текстовом режиме она выглядит примерно так:

\begin{verbatim}
                                                                           ZM - Console
Thu 9th Mar, 5:50am  ZoneMinder Console - Running - v1.22.0  Load: 0.46 / Disk: 40%
0 Monitors            Configured for low bandwidth                          Options

Id  Name  Function  Source  Events  Hour  Day  Week  Month  Archive Zones Order Mark

[ Refresh ]  [ Add New Monitor ]  [ Filters ]   0   0   0   0   0   0   0 [ Delete ]
\end{verbatim}




\subsection{Настройка ZoneMinder}

Как и многие пользователи имеющие несколько лет опыта работы с компьютером 
за плечами я предпочитаю сначала попробовать добиться работы программы своими
силами и только если не заработает - лезть в документацию - это очень часто экономит
время.\\


\subsubsection{Options}

Первым делом идем в настройки (Options)\footnote{При этом следует помнить, что после
изменений на закладке рекомендуется нажимать кнопку 'Save', иначе изменения могут
не сохраниться.}


\paragraph{Tools\\}

\subparagraph{CAMBOZOLA\\}
В закладке Tools имеется галочка для
\begin{verbatim}
 ZM_OPT_CAMBOZOLA
\end{verbatim}
, ее можно поставить, поскольку
cambozola мы собрали (см. выше). Соответственно cambozola.jar и cambozola-server.jar
 копируем в 
/srv/www/zoneminder .


\subparagraph{MPEG, FFMPEG\\}

\begin{verbatim}
ZM_OPT_MPEG, ZM_PATH_FFMPEG
\end{verbatim}

Тут выбираем имеющийся ffmpeg. Путь к ffmpeg - /usr/local/bin/ffmpeg\footnote{В вашей
системе путь может быть другим.}:

\begin{verbatim}
----------------- [ 08:13:35, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ls /usr/local/bin/ffmpeg -l
-rwxr-xr-x  1 root root 3142628 2006-01-20 23:01 /usr/local/bin/ffmpeg
----------------- [ 08:13:37, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

\subparagraph{NETPBM\\}

\begin{verbatim}
ZM_OPT_NETPBM
\end{verbatim}

У меня netpbm стоит:

\begin{verbatim}
# rpm -qa | grep netpbm
netpbm-10.26.12-5
libnetpbm-1.0.0-636
----------------- [ 08:14:44, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

так что тут я ставлю галочку.


\subsubsection{Добавляем камеру\\}

Очевидный выбор - добавить монитор. Вылезает меню с закладками. В секциях
заполняем соответствующие поля:\\

\paragraph{General\\}
Name: planet\\
Source type: remote\\
Function: Monitor\\
Enabled: ставим галочку\\
Maximum FPS: 30\\
Reference Image Blend: 7 (оставил по умолчанию)\\
Про Triggers пишет что none avaliable. Видимо потому что не установлено соответствующих
перловых модулей.\\

\paragraph{Source\\}

Remote Host Name: 192.168.0.20\\
Remote Host Port: 80\\
Remote Host Path\footnote{этот путь получается по правой кнопке в мозилле 'Open image'}: /goform/capture\\
Remote Image Colours: 24 bit color\\
Capture Width (pixels): 640\\
Capture Height (pixels): 480\\
Orientation: normal\\

\paragraph{Timestamp\\}

Тут особой нужды что либо менять нет. Строка
\begin{verbatim}
%%s - %y/%m/%d %H:%M:%S
\end{verbatim}
меня вполне устроила. =)

\paragraph{Buffers\\}

Это тоже можно оставить по умолчанию.

\paragraph{Misc\\}

Вот эта закладка явно неочевидная и для настроек потребует чтения документации.
Оставляем пока по умолчанию.\\

По заполнению можно нажать на save. =)

\subsubsection{Troubleshooting}

После всего этого у меня система не заработала. А именно в логах я получил 
следующее\footnote{Путь по умолчанию к логам в zoneminder абсолютный, шаблон
/tmp/[scriptname].log}:

\begin{verbatim}
----------------- [ 08:23:52, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# tail -n 5 /tmp/zmdc.log
zmdc[11498].INF ['zmc -m 1' starting at 06/03/09 08:23:45, pid = 3682]
zmdc[11498].ERR ['zmc -m 1' crashed, exit status 255]
zmdc[3687].INF ['zmc -m 1' started at 06/03/09 08:23:56]
zmdc[11498].INF ['zmc -m 1' starting at 06/03/09 08:23:56, pid = 3687]
zmdc[11498].ERR ['zmc -m 1' crashed, exit status 255]
----------------- [ 08:23:56, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
----------------- [ 08:25:54, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# tail -n 5 /tmp/zmwatch.log
zmwatch[11534].INF [Restarting capture daemon for planet, shared memory not valid]
zmwatch[11534].INF ['zmc -m 1' starting at 06/03/09 08:25:41, pid = 3737] at /usr/local/zoneminder/bin/zmwatch.pl line 118
zmwatch[11534].ERR [Can't get shared memory id '7a6d2001', 1: No such file or directory]
zmwatch[11534].INF [Restarting capture daemon for planet, shared memory not valid]
zmwatch[11534].INF ['zmc -m 1' started at 06/03/09 08:25:52] at /usr/local/zoneminder/bin/zmwatch.pl line 118
----------------- [ 08:26:02, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# 
\end{verbatim}


В результате в Options->Debug я выставил флаг 
\begin{verbatim}
ZM_EXTRA_DEBUG
\end{verbatim}
 и далее в
\begin{verbatim}
ZM_EXTRA_DEBUG_TARGET
\end{verbatim}
 указал <<\_zmc>>, выставив
\begin{verbatim}
 ZM_EXTRA_DEBUG_LEVEL, для
\end{verbatim}
начала, в 1. После чего требуется перезагрузить ZoneeMinder чтобы изменения
вступили в силу.\\

Результат меня не впечатлил - видимо я ошибся в названии соответствующего
компонента 
\begin{verbatim}
ZM_EXTRA_DEBUG_TARGET
\end{verbatim}
 (откуда брать список компонентов в online help не написано).\\

В результате я оставил
\begin{verbatim}
 ZM_EXTRA_DEBUG_TARGET пустым чтобы отладка применилась ко всем
\end{verbatim}
компонентам и еще раз перегрузил zoneminder.\\

Приемлемого уровня детализации сообщений я добился только при
\begin{verbatim}
 ZM_EXTRA_DEBUG_LEVEL 
\end{verbatim}
равном 5-ти. 


\begin{verbatim}
zmc_m1[12651].DB1-zm_monitor.cpp/156 [shm.size=36864708]
zmc_m1[12651].ERR-zm_monitor.cpp/160 [Can't shmget, probably not
 enough shared memory space
free: Invalid argument]
\end{verbatim}

Этого достаточно для определения корня проблем:

\begin{verbatim}
----------------- [ 14:36:10, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# cat /proc/sys/kernel/shmall
2097152
----------------- [ 14:36:59, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# cat /proc/sys/kernel/shmmax
33554432
----------------- [ 14:37:11, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# cat /proc/sys/kernel/shmmni
4096
----------------- [ 14:37:24, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
# ipcs -ml

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (pages) = 2097152
min seg size (bytes) = 1

----------------- [ 14:37:33, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0  ]
#
\end{verbatim}

Решение выглядит так:

\begin{verbatim}
----------------- [ 14:47:13, root@skylab, /tmp  ]
# echo 50331648 > /proc/sys/kernel/shmmax
----------------- [ 14:47:28, root@skylab, /tmp  ]
# cat /proc/sys/kernel/shmmax
50331648
----------------- [ 14:47:30, root@skylab, /tmp  ]
#
\end{verbatim}

это увеличит на 16 мегабайт размер сегмента shared memory\footnote{Чтобы это работало всегда - соответствующие изменения должны быть внесены либо в системные скрипты конфигурирующие
sysctl при загрузке системы, либо в скрипт стартующий ZoneMinder (в моем случае - /etc/init.d/ZoneMinder)}.\\

\subsection{It works.}
Для проверки всего выше проделанного по окончании troubleshooting'а запускаем ZoneMinder..\\

Уря. Заработало - во второй колонке (Name) данного монитора теперь линк содержащий картинку
 - 
ткнувшись в <<planet>> я получил соответствующее изображение, согласно мануалу.=)\\
 Изменив Function с 
Monitor на Motion detect я получил соответствующие events, а поставив Mocord - получил
запись соответствующих событий с возможностью последующего просмотра\footnote{текстовый
скриншот немного подредактирован\footnote{как и остальные скриншоты ZoneMinder'а} чтобы влезал в документ, для сохранения адекватности
картинки изменен layot 
некоторых элементов с сохранением смысла.}: 

\begin{verbatim}
                                                                          ZM - Console
Thu 9th Mar, 3:42pm  ZoneMinder Console - Running - v1.22.0   Load: 4.55/Disk: 87%
1 Monitor      Configured for low bandwidth                                 Options

Id  Name  Function Source      Events Hour Day Week Month Archive Zones Order Mark
1. planet Mocord   192.168.0.20 11    11   11  11   11    0       1           [ ]

                                11    11   11  11   11    0       1

[Refresh]  [Add New Monitor]  [Filters]                                   [ Delete ]
\end{verbatim}

Кстати, просмотр событий отвязан от запуска сервера. То есть уже после того как я 
остановил ZoneMinder я зашел на web-interface к нему и с удобством просмотрел информацию
по зарегистрированным событиям.\\

\subsubsection{Нагрузка}

В момент работы ZoneMinder монитор загрузки камня показывал 100 процентов. Не могу сказать,
что интерфейс очень уж сильно тормозил, но нагрузка для моей машинки и так загруженной штатными задачами не менее чем на треть была весьма приличной. Так что, как минимум, требуется
дополнительная оптимизация - как на этапе сборки (под cpu), так и на этапе конфигурирования.

\subsection{Комментарии к ZoneMinder}

Что хотелось бы отметить по данному продукту:

\begin{itemize}
\item{Инсталяция в <<default settings>> достаточно сильно грузит компьютер, поэтому,
во первых весьма желательна конфигурационная оптимизация (что не входит в задачи
поставленные автором при создании этой статьи), а во вторых по любому гораздо лучше, когда
у Вас стоит выделенная на это дело машинка и все свои ресурсы тратит на обработку video.}
\item{Сам по себе ZoneMinder после установки удобен, интерфейс в первом приближении
интуитивно понятен - мне не потребовалось дочитать мануал до конца, чтобы заставить его работать. Огромное спасибо автору за этот продукт. Заслуживает всяческих похвал.}
\item{ZoneMinder является компромиссным решением - благодаря связке C-кода и скриптовых 
языков. Возможно это не самое быстрое из возможных решений, но во всяком случае достаточно
гибкое}
\end{itemize}


