понедельник, 30 декабря 2013 г.

Организация системы мониторинга сети с помощью пакетов SNMP и SNMPTT.

Систему мониторинга разворачиваем на сервере с ОС CentOS 6.3. Используемая версия SNMP - 2c.

Установка пакетов SNMP:

1. Устанавливаем пакеты из репозитария
# yum install net-snmp-utils
# yum install net-snmp

2. Сохраняем оригинальные конфигурационные файлы на всякий случай
# mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.org
# mv /etc/snmp/snmptrapd.conf /etc/snmp/snmptrapd.conf.org

3. Создаем новый файл конфигурации демона SNMPD. Этот демон отвечает за работу запросов и ответов протокола SNMP. Работает на 161 порту.
# nano /etc/snmp/snmpd.conf
и вписываем туда:
rocommunity  public
syslocation  "Samara"
syscontact  rtech@samara.ttk.ru

4. Создаем новый файл конфигурации демона SNMPTRAP. Этот демон отвечает за прием snmptrap. Работает на 162 порту.
# touch /etc/snmp/snmptrapd.conf
Вписываем в файл:
authCommunity   log,execute,net public
logoption f /var/log/snmptrap.log
Второй строчкой указываем путь логов демона snmptrapd.
ПРИМЕЧАНИЕ: Если необходимо, что бы программа Net-snmp принимала вообще все SNMP TRAP (без учета авторизаций), то необходимо после строчки authCommunity вписать строчку:

disableAuthorization yes

5. Запускаем сервис SNMPD и SNMPTRAP и добавляем в автозагрузку
# /etc/init.d/snmpd start
# chkconfig snmpd on
# service snmptrapd start
# chkconfig snmptrapd on

6. Проверяем, что сервисы запустились и работают на 161 и 162 порту:
# netstat -ltupn | grep snmp
tcp   0 0 127.0.0.1:199     0.0.0.0:*      LISTEN      24867/snmpd        
udp   0 0 0.0.0.0:161       0.0.0.0:*                  24867/snmpd        
udp   0 0 0.0.0.0:162       0.0.0.0:*                  24880/snmptrapd   

7. Разрешаем хождение пакетов в iptables. Так как сервер используется в локальной сети, можно вообще убрать все правила, закомментировав их в файле /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-A INPUT -p icmp -j ACCEPT
#-A INPUT -i lo -j ACCEPT
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
Затем  рестартуем iptables:
# service iptables restart

8. Отключаем SElinux, для этого открываем файл /etc/sysconfig/selinux 
# nano /etc/sysconfig/selinux 
Оставляем одну строку, остальное комментируем:
SELINUX=disabled

9. Перезагружаемся командой 
# reboot 
и убеждаемся, что после перезагрузки демоны SNMPD и SNMPTRAP стартовали.

Проверка работы пакетов SNMP:

Для проверки работы SNMP нужно сетевое устройство, работающее по SNMP, например коммутатор D-Link.  Коммутатор D-Link должен быть корректно настроен для работы с SNMP. Пример настройки SNMP на коммутаторе D-Link в случае использования стандартных community (private и public).
enable snmp traps 
enable snmp authenticate traps 
enable snmp linkchange_traps
config snmp linkchange_traps ports all enable
config snmp coldstart_traps enable
config snmp warmstart_traps enable
config snmp system_name SMA-Mos4a-S2
config snmp system_location Samara. Moskovskoe shosse,4
config snmp system_contact rtech@samara.transtk.ru
enable rmon 
create snmp community private view CommunityView read_write
create snmp community public view CommunityView read_only
create snmp host 10.200.16.230 v2c  public 

1. Проверяем работоспособность демона SNMPD, делая пробный запрос административного статуса портов к любому свичу D-Link, например:
# snmpwalk -v 2c -c public 10.200.72.12 IF-MIB::ifAdminStatus 
Вывод должен показать примерно следующее:
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.2 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3 = INTEGER: up(1)
IF-MIB::ifAdminStatus.4 = INTEGER: up(1)
IF-MIB::ifAdminStatus.5 = INTEGER: up(1)
IF-MIB::ifAdminStatus.6 = INTEGER: up(1)
IF-MIB::ifAdminStatus.7 = INTEGER: up(1)
IF-MIB::ifAdminStatus.8 = INTEGER: up(1)
IF-MIB::ifAdminStatus.9 = INTEGER: down(2)
IF-MIB::ifAdminStatus.10 = INTEGER: down(2)
IF-MIB::ifAdminStatus.1083 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1088 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1095 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1104 = INTEGER: up(1)
IF-MIB::ifAdminStatus.1428 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3023 = INTEGER: up(1)
IF-MIB::ifAdminStatus.3024 = INTEGER: up(1)
IF-MIB::ifAdminStatus.5121 = INTEGER: up(1)

2. Передернув любой порт свича наблюдаем наличие логов в файле /var/log/snmptrap.log. 
# cat /var/log/snmptrap.log
2013-11-19 15:12:51 <UNKNOWN> [UDP: [10.200.72.43]:161->[10.200.16.227]]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (11642652) 1 day, 8:20:26.52   SNMPv2-MIB::snmpTrapOID.0 = OID: IF-MIB::linkDown  IF-MIB::ifIndex.19 = INTEGER: 19        IF-MIB::ifAdminStatus.19 = INTEGER: up(1) IF-MIB::ifOperStatus.19 = INTEGER: down(2)
2013-11-19 15:12:53 <UNKNOWN> [UDP: [10.200.72.43]:161->[10.200.16.227]]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (11642655) 1 day, 8:20:26.55   SNMPv2-MIB::snmpTrapOID.0 = OID: IF-MIB::linkUp    IF-MIB::ifIndex.19 = INTEGER: 19        IF-MIB::ifAdminStatus.19 = INTEGER: up(1) IF-MIB::ifOperStatus.19 = INTEGER: up(1)
Этим убеждаемся, что демон SNMPTRAPD работает.

Устанавливаем пакет SNMPTT (пакет удобной работы с SNMP TRAPами)

1. Добавляем репозитарий
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

2. Устанавливаем
# yum install snmptt
# yum install net-snmp net-snmp-utils net-snmp-perl

3. Открываем файл настроек SNMPTT /etc/snmp/snmptt.ini 
# nano /etc/snmp/snmptt.ini
и меняем следующие строчки:
mode = daemon #(по умолчанию mode = standalone)
net_snmp_perl_enable = 1 #(по умолчанию 0)
mibs_environment = ALL #(по умолчанию закомментировано)
date_time_format = %Y-%m-%d %H:%M:%S #(по умолчанию не задано)

4. Открываем конфигурационный файл snmptrapd.conf демона SNMPTRAP.
# nano /etc/snmp/snmptrapd.conf
и вписываем в конец директиву
traphandle default /usr/sbin/snmptthandler
Эта директива, заставляет  демон snmptrapd работать с snmptt и все приходящие трапы передавать на анализ процессу snmptt.
Что бы не плодить лишних логов, можно закомментировать строку:
#logoption f /var/log/snmptrap.log
В этом случае логи процесса SNMPTRAP собираться не будут. Все сообщения будет обрабатывать процесс SNMPTT.

5. Запускаем сервис snmptt командой:
# service snmptt start

6. Добавляем сервис snmptt в автозагрузку
# chkconfig --add snmptt
# chkconfig --level 2345 snmptt on

7. Рестартуем сервисы SNMPD и SNMPTRAPD:
# service snmpd restart
# service snmptrapd restart

8. Настраиваем SNMPTT на прием всех возможных трапов. Для этого необходимо внести изменения в файл конфигурации принимаемых трапов /etc/snmp/snmptt.conf.
Резервируем копию оригинального файла:
# cp /etc/snmp/snmptt.conf /etc/snmp/snmptt.conf.org
Открываем файл /etc/snmp/snmptt.conf
# nano /etc/snmp/snmptt.conf
Удаляем все, что там имеется и вписываем:
EVENT Samara_alarm .* "all" 1
NODES 10.200.0.0/16
NODES 10.199.0.0/16
NODES 10.198.0.0/16
FORMAT $+*
Первой строчкой обозначаем, что мы принимаем все трапы, что все трапы будут иметь метку Samara_alarm и будут иметь первый приоритет. Далее обозначается, что разрешено принимать трапы с ip сетей 10.200.0.0./16, 10.199.0.0./16, 10.198.0.0/16. Последняя строчка определяет расширенный вид SNMP TRAP в логах.

9. Делаем файл логов snmptt доступным для процесса snmptt:
# chmod 777 /var/log/snmptt/snmptt.log

10. Рестартуем сервис snmptt
# service snmptt restart

11. После описанных выше действий процесс snmptt принимает все поступающие в систему SNMP трапы, преобразует их в удобный формат и складывает в папку /var/log/snmptt/.
/var/log/snmptt/snmptt.log – здесь хранятся поступающие трапы
/var/log/snmptt/snmpttsystem.log – здесь хранятся логи работы самого сервиса snmptt

Настраиваем SNMPTT на работу с базой данных MySQL

1. Создаем базу данных и  таблицы MySQL, в которые будут собираться SNMPTRAPы.
Подключаемся к MySQL
# mysql -uroot –p
Создаем базу данных «snmptt»:
>CREATE DATABASE `snmptt` DEFAULT CHARACTER SET utf8;
Создаем таблицы базы данных:
>USE `snmptt`;
>CREATE TABLE IF NOT EXISTS `snmptt` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `eventname` varchar(50) DEFAULT NULL,
  `eventid` varchar(50) DEFAULT NULL,
  `trapoid` varchar(100) DEFAULT NULL,
  `enterprise` varchar(100) DEFAULT NULL,
  `community` varchar(20) DEFAULT NULL,
  `hostname` varchar(100) DEFAULT NULL,
  `agentip` varchar(16) DEFAULT NULL,
  `category` varchar(20) DEFAULT NULL,
  `severity` varchar(20) DEFAULT NULL,
  `uptime` varchar(20) DEFAULT NULL,
  `traptime` datetime DEFAULT NULL,
  `formatline` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `commit` int(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
>CREATE TABLE IF NOT EXISTS `snmptt_unknown` (
  `trapoid` varchar(100) DEFAULT NULL,
  `enterprise` varchar(100) DEFAULT NULL,
  `community` varchar(20) DEFAULT NULL,
  `hostname` varchar(100) DEFAULT NULL,
  `agentip` varchar(16) DEFAULT NULL,
  `uptime` varchar(20) DEFAULT NULL,
  `traptime` varchar(30) DEFAULT NULL,
  `formatline` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Создаем пользователя базы данных с именем snmptt и с паролем passw0rdik
> create user 'snmptt'@'localhost' identified by 'passw0rdik';
> grant all privileges on snmptt.* to 'snmptt'@'localhost'; 
Выходим из MySQL
> exit

2. Прописываем в настройках snmptt доступ к базе данных MySQL
Открываем файл 
# nano /etc/snmp/snmptt.ini
и изменяем следующие строки:
# MySQL: Set to 1 to enable logging to a MySQL database via DBI (Linux / Windows)
# This requires DBI:: and DBD::mysql
mysql_dbi_enable = 1 (по умолчанию 0)
# MySQL: Username to use
mysql_dbi_username = snmptt (имя пользователя mysql)
# MySQL: Password to use
mysql_dbi_password = passw0rdik (пароль пользователя mysql)
# The date time format for the traptime column in SQL.  Defaults to
# localtime().  When a date/time field is used in SQL, this should
# be changed to follow a standard that is supported by the SQL server.
# Example:  For a MySQL DATETIME, use %Y-%m-%d %H:%M:%S.
date_time_format_sql = %Y-%m-%d %H:%M:%S (по молчанию закомментировано и не задано)

3. Рестартуем сервис snmptt
# service snmptt restart

4. Теперь snmp трапы собираются в базе данных MySQL. Убедившись, что это так, прекращаем логирование snmptrap-ов в log файл для экономии места на диске.
Открываем конфигурационный файл
# nano /etc/snmp/snmptt.ini
и меняем значение параметра:
# Set to 1 to enable text logging of *TRAPS*.  Make sure you specify a log_file
# location
log_enable = 0 (для сбора логов в файл было установлено 1)
Рестартуем сервис snmptt
# service snmptt restart

Подключаем дополнительные MIBы

1. Создаем папку в которой будем хранить mib-ы.
#mkdir /etc/snmp/mibs

2. Помещаем в папку MIB файл, например от UPS DELTA - DeltaUPS-MIB.txt.

3. Конвертируем MIB файл
# cd /etc/snmp/mibs
# snmpttconvertmib --in=DeltaUPS-MIB.txt --out=snmpttupsdelta.cong
Получился файл snmpttupsdelta.cong

4. Подключаем этот файл в настройки демона SNMPTT
Открываем файл snmptt.ini:
#nano /etc/snmp/snmptt.ini
Пролистываем файл в самый конец и находим строку snmptt_conf_files=<<END. Вписываем туда путь к нашем созданному файлу
[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file).  The COMPLETE path
# and filename.  Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/mibs/snmpttupsdelta.cong
END

5. Рестартуем сервис:
# service snmptt restart

6. Теперь при пропадании электропитания в базе будет запись:
.1.3.6.1.4.1.2254.2.4.20.0.3
WARNING: Power failed! The UPS is operating on battery power.


ВАЖНО:
1) Для корректной работы системы сбора SNMPTRAPов, необходимо иметь точную работу сервера времени в системе.
2) При написании руководства предполагалось, что сервер LAMP установлен в системе.


ПОЛЕЗНЫЕ ССЫЛКИ:

http://www.netping.ru/view.aspx?id=284  - Получение TRAP сообщений на устройствах NetPing под FreeBSD

http://hobbymods.ru/index.php?dn=article&to=art&id=80  - Настройка отправки SNMP traps на некоторых типах коммутаторов.

http://www.opennet.ru/tips/info/2317.shtml   - Организация приема SNMP trap’ов и их отправки на коммутаторах DLink

http://va0816.blogspot.ru/2013/06/zabbix-snmp-traps.html  - Настройка Zabbix SNMP traps

воскресенье, 1 декабря 2013 г.



Установка htop в Linux CentOS

1. Идем сюда http://pkgs.repoforge.org/htop/ и выбираем версию

2. Грузим ее на сервер

#wget http://pkgs.repoforge.org/htop/htop-1.0.2-1.el6.rf.x86_64.rpm

3. Устанавливаем

#rpm -i htop-*.rpm

4. Наслаждаемся, запустив htop






суббота, 16 ноября 2013 г.




Использование Motion в Linux CentOS для записи видео с IP камер.


Задача:
Организовать запись видео с ряда IP камер на сервер Linux CentOS с пакетом motion, обеспечить просмотр записанных роликов через WEB-интерфейс, предоставить возможность просмотра видео с камер on-line через WEB-интерфейс браузера.




Инсталлируем пакет Motion на сервер c CentOS:

1. Устанавливаем необходимые пакеты
#yum install glibc glibc-devel
#yum install libjpeg libjpeg-devel
#yum install zlib zlib-devel
#yum install ffmpeg
#yum install ffmpeg-devel
#yum install mysql mysql-devel
ПРИМЕЧАНИЕ: Если не устанавливается ffmpeg, то делаем следующее:
для CentOS x64
#rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
Для CentOS x86
#rpm -Uvh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
И устанавливаем непосредственно ffmpeg

# yum install ffmpeg
2. Скачиваем исходный код пакета motion (например так)
#wget http://sourceforge.net/projects/motion/files/latest/download?source=files
Ссылка может измениться со временем.
3. Распаковываем скаченный архив
#tar -xvzf motion-3.2.12.tar.gz
4. Переходим в распакованную папку
#cd motion-3.2.12
5. Запускаем скрипт конфигурирования
#./configure
*******************************
Configure status
motion 3.2.12
*******************************
OS : Linux
pthread Support: Yes
jpeg Support: Yes
V4L included: Yes
V4L2 supported: Yes
FFmpeg Support: Yes
MYSQL Support: Yes
PostgreSQL Support: No
CFLAGS: -g -O2 -D_REENTRANT -DHAVE_FFMPEG -I/usr/include -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW -I/usr/include/mysql -DMOTION_V4L2 -DTYPE_32BIT="int" -DHAVE_BSWAP
LIBS: -lm -lpthread -ljpeg -L/usr/lib64 -lavformat -lavcodec -lavutil -lm -lz -L/usr/lib64/mysql -lmysqlclient -lz
LDFLAGS: -L/usr/lib64
Install prefix: /usr/local
6. Собираем и устанавливаем пакет motion
#make
#make install
-----------------------------------------------------------------------
Install complete! The default configuration file, motion-dist.conf, has been
installed to /usr/local/etc. You need to rename/copy it to /usr/local/etc/motion.conf
for Motion to find it. More configuration examples as well as init scripts
can be found in /usr/local/share/motion-3.2.12/examples.

Правим конфигурационные файлы.

Пример конфигурационного файла motion лежит здесь: /usr/local/etc/motion-dist.conf
1. Копируем файл примера в рабочий файл конфигурирования:
#cp /usr/local/etc/motion-dist.conf /usr/local/etc/motion.conf
2. В кофигурационном файле можно удалить все и оставить следующие строки (пример):
#режим демона
daemon on
#Выключаем звуковой сигнал при обнаружении движения
quiet on
#Подключаем файл конфигурации камер
#Камера в офисе, в кабинете 11
thread /usr/local/etc/thread1.conf
#Камера в г. Уфа где-то на Баландина
thread /usr/local/etc/thread2.conf
Основные директивы получившегося файлы - это thread подключающие описания IP камер.
3. Создаем файлы описаний IP камер (источников):
#touch /usr/local/etc/thread1.conf
#touch /usr/local/etc/thread2.conf
Пример наполнения файла настроек IP камеры для случая D-Link DSC-2102:
#Параметры доступа к камере
netcam_url http://10.200.16.231/video/mjpg.cgi
netcam_userpass <логин>:<пароль>

#Разрешение камеры. Числа должны быть кратны 16.
width 640
height 480

#Максимальное количество кадров, которые будут захвачены из камеры в секунду
framerate 30

#Отключаем сохранение фотографий с камеры
minimum_frame_time 0

#Максимальная длительность файла
max_mpeg_time 600

#Максимальный размер файла с движеним в секундах
gap 600

#Записывать все, даже если нет движения, если - off, то записывать будем только видео с движением 
output_all on

output_normal off
output_motion off

#Подключаем модуль ffmpeg для преобразования video
ffmpeg_cap_new on
ffmpeg_video_codec mpeg4

#Диретория, в которую будет писаться видео
target_dir /mnt/cam/cam1

#Порт web-сервера
webcam_port 8081

#Настройки качества в процентах для mjpeg изображения кадров
webcam_quality 90
webcam_motion 2
#Частота кадров с WEB камеры
webcam_maxrate 10
webcam_localhost off

#Задаем формат сохраняемого файла
movie_filename %Y%m%d%H%M%S

#Убираем текст-дату в правом нижнем углу видео
text_right

Для второй IP камеры параметры настройки могут быть такие:

#Параметры доступа к камере
netcam_url http://ХХ.ХХ.ХХ.ХХ/cgi-bin/nph-zms?mode=jpeg&monitor=9&scale=100&maxfps=25&user=admin&connkey=378295&rand=1370497894

#Разрешение камеры. Числа должны быть кратны 16.
width 352
height 288

#Максимальное количество кадров, которые будут захвачены из камеры в секунду
framerate 30

#Отключаем сохранение фотографий с камеры
minimum_frame_time 0

#Максимальная длительность файла
max_mpeg_time 600

#Максимальный размер файла с движеним в секундах
gap 600

#Записывать все, даже если нет движения, если - off, то записывать будем только видео с движением 
output_all on

output_normal off
output_motion off

#Подключаем модуль ffmpeg для преобразования video
ffmpeg_cap_new on
ffmpeg_video_codec mpeg4

#Диретория, в которую будет писаться видео
target_dir /mnt/cam/cam2

#Порт web-сервера
webcam_port 8082

#Настройки качества в процентах для mjpeg изображения кадров
webcam_quality 90
webcam_motion 2
#Частота кадров с WEB камеры
webcam_maxrate 10
webcam_localhost off

#Задаем формат сохраняемого файла
movie_filename %Y%m%d%H%M%S

#Убираем текст-дату в правом нижнем углу видео
text_right

Главное в этих файлах - это строки определяющие параметры доступа к камере. Для каждой модели камеры строки будут разные. В некоторых случаях требуется авторизация по логину и паролю (см первый пример)
По ссылке http://www.ispyconnect.com/sources.aspx можно найти описания подключений к разным моделям камер.
Для каждой камеры (источника) в файле thread<N>.conf необходимо индивидуально указать папку, куда будет вестись запись роликов с камеры и web-порт вещания камеры, к которому можно будет подключаться по HTTP для просмотра изображения on-line.
Директивы должны быть разными для каждой камеры:
target_dir /mnt/cam/cam<N>
webcam_port <N>
Дополнительные примеры по настройке файлов конфигурации лежать в папке:
/usr/local/share/motion-3.2.12/examples

4. Создаем папки для записей видео с камер:
#mkdir /mnt/cam/cam1
#mkdir /mnt/cam/cam2

Запускаем и останавливаем пакета motion

1. Запуск motion в режиме теста выполняется командой:
#motion –n
или
#motion –s
2. Для запуска сервиса в автоматическом режиме, необходимо добавить Motion в автозагрузку. Это делается в файле /etc/rc.local.
Сначала я добавил в файл строку
motion -c /usr/local/etc/motion.conf
Но так почему-то не заработало, так как система не могла распознать путь к программе motion.
Исправляем так:
- Узнаем путь к файлу-программе motion:
#whereis motion
motion: /usr/local/bin/motion /usr/local/etc/motion.conf
- Теперь вписываем в nano /etc/rc.local
/usr/local/bin/motion -c /usr/local/etc/motion.conf
- Перезагружаемся

3. Остановить пакет motion следует завершением процесса в системе.
Ищем номер процесса (PID) motion
# ps ax | grep motion
1532 pts/0 S+ 0:00 grep motion
9281 ? Sl 6190:58 motion
Завершаем процесс motion
#kill 9287

Настраиваем конвертирование видео и автоудаление старых файлов записей с камер.

После описанной выше настройки у нас будут иметься две папки (/mnt/cam/cam1 и /mnt/cam/cam2) в которые каждые 10 минут будут сохраняться видеофайлы в формате avi. Что бы файлы можно было просмотреть в браузере, необходимо их сконвенртировать в формат flv. Для этого используется следующий скрипт, который кроме конвертации файлов в flv, еще и удаляет старые файлы avi.

#!/bin/sh

#Задаем начальные переменные
FOLDERSOURCE="/mnt/cam/"
FOLDERDEST="/var/www/html/cam/"
SUFF="flv"

#Получаем список файлов с датой модификации более 30 минут
#конвертируем файлы и отправляем в папку web-сервера
for file in `find $FOLDERSOURCE -mmin +30 -print | grep '.avi'`
do
  XXX=${file:${#FOLDERSOURCE}} #Отрезаем начальный путь к файлу,
  #затем конструкцией ${XXX%avi} отрезаем окончание avi
  /usr/bin/ffmpeg -i $file -ar 22050 -ab 32k -f flv -b 700k -s      640x480 -y $FOLDERDEST${XXX%avi}$SUFF >/dev/null 2>&1
  rm -f $file
done

Теперь в папках /var/www/html/cam/cam1 и /var/www/html/cam/cam2 (они должны быть заранее созданы) копяться файлы, пригодные для просмотра в web-браузере. Что бы файлы не заняли пространство всего жесткого диска, необходимо удалять их с некоторой периодичностью.
Пример скрипта, который удаляет файлы старше 720 минут (12 часов)

#!/bin/sh
#Задаем папку для удаления
FOLDERSOURCE="/var/www/html/cam/"
for file in `find $FOLDERSOURCE -mmin +720 -print | grep '.flv'`
do
  rm -f $file
done

Оба описанных скрипта необходимо поместить в cron. Первый скрипт у меня называется convertvideo2.sh, а второй convertvideo_olddel.sh
Записи в /etc/cron выглядят так:
*/30 * * * * root /usr/bin/convertvideo2.sh
25 * * * * root /usr/bin/convertvideo_olddel.sh

Вывод результатов работы в браузер.

1. Для вывода видео в браузере записанных роликов воспользуемся плеером jwplayer (http://www.jwplayer.com/about-jwplayer/). Файлы плеера (swfobject.js, player.swf) положим в корень web-сервера. В html странине видео можно проиграть например так:
<script type=text/javascript src=swfobject.js></script>
<div id='player'>Невозможно загрузить фильм</div>
<script type=text/javascript><!--
var so = new SWFObject('player.swf','mpl','640','480','8');
so.addParam('allowfullscreen','true');
so.addParam('flashvars','file=http://ХХ.ХХ.ХХ.ХХ/cam/cam1/<Имя файла>');
so.write('player');
// --></script>

2. Для просмотра видео on-line можно воспользоваться скриптом cambozola (http://www.charliemouse.com/code/cambozola/).
Сам скрипт (cambozola.jar) помещается в корень web-сервера. А в HTML страницу вставляется:
<div>
<applet code='com.charliemouse.cambozola.Viewer' archive='cambozola.jar' width='640' height='480'>
<param name='url' value='http://10.200.104.13:8082'>
</applet>
</div>
Здесь http://10.200.104.13:8082 - это url по которому вещает motion.

Теперь для просмотра видео в режиме ON-LINE необходимо установить на компьютер бесплатное программное обесечение Java Runtime Environment (JRE). Скачать данную программу можно с официального сайта http://java.com/ru/download/index.jsp.

Полезные ссылки:

http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome - официальная документация
http://habrahabr.ru/post/72491/
http://www.ispyconnect.com/sources.aspx - база IP ссылок по камерам

воскресенье, 22 сентября 2013 г.

Фотографии коммутатора Edge-core ES3510MA

Вот так выглядит коммутатор спереди:

Вот так выглядит коммутатор сзади:



А теперь внутренности устройства:







А это коммутатор с игрушкой "Фёрби"


четверг, 29 августа 2013 г.


Как получить список IP адресов, используемых сайтом через RIPE.

1. Выполняем поиск IP адресов через DNS
Например:
> nslookup mail.ru
: mail.transtelecom.info
Address: 10.101.0.2
Не заслуживающий доверия ответ:
: mail.ru
Addresses: 217.69.139.199
217.69.139.201
94.100.180.199
94.100.180.201


2. Получили 4 адреса. Делаем по каждому из них поиск в БД RIPE:


3. В результатах поиска ищем объект route
route: 217.69.128.0/20
descr: LLC netBridge Services
origin: AS47764
mnt-by: MNT-NETBRIDGE
source: RIPE #Filtered


4. Определяем автономную систему - AS47764
Ищем по этой автономной системе все объекты route, выставляя галочку orign


5. Из полученных объектов route извлекаем IP адреса
route: 128.140.168.0/21
descr: Mail.Ru block
origin: AS47764
mnt-by: MNT-NETBRIDGE
source: RIPE #Filtered

% Information related to '128.140.170.0/24AS47764'

route: 128.140.170.0/24
descr: NIVAL block
origin: AS47764
mnt-by: MNT-NETBRIDGE
source: RIPE #Filtered

% Information related to '178.22.88.0/21AS47764'

route: 178.22.88.0/21
descr: LLC M100
origin: AS47764
mnt-by: MNT-M100
source: RIPE #Filtered
mnt-routes: MNT-NETBRIDGE
……


6. Полученные IP адреса



…..



суббота, 25 мая 2013 г.


CentOS настройка сети
Настройки сетевых интерфейсов в CentOS находятся в: /etc/sysconfig/network-scripts/ifcfg-ethХ, где X номер интерфеса

Вот пример настройки сети в CentOS: cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:00:17:EA:18:99
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.1.220
NETMASK=255.255.255.0
BROADCAST=192.168.1.255
NETWORK=192.168.1.0
NAME=eth0


Шлюз в CentOS добавляется в файл: /etc/sysconfig/network
Формат добавляемой строки:
GATEWAY=192.168.1.1
- где 192.168.0.1 шлюз по умолчанию
Шлюз GATEWAY так же можно прописать в настройки интерфейса. Если в системе несколько интерфейсов, лучше сделать именно так. Шлюз прописать в конфигурации того интерфейса, который будет использоваться для отправки пакетов по умолчанию.

DNS сервера прописываются в файле /etc/resolv.conf
В файл прописываются строки определяющие DNS сервера:
nameserver 127.0.0.1
nameserver 192.168.1.1

В новых некоторых версиях Linux CentOS DNS так же прописывается в настройках сетевых интерфейсов строкой:
DNS=192.168.1.1

Бывает случаи, когда нет файлов /etc/sysconfig/network-scripts/ifcfg-eth*
Сетевые адаптеры не видны!
Тогда смотрим специальный файл:
# cat /etc/udev/rules.d/70-persistent-net.rules
В этом файле хранятся настройки карт, файл генерируется при старте системы менеджером устройств.
В нем нам интересно узнать mac адрес и обозначения сетевых карт.
Mac адрес берется с этого параметра ATTR{address}=="08:00:27:40:03:63"
Обозначение адаптера берется с этого параметра Name="eth0"

Для включения маршрутизации в системе между интерфейсами, необходимо ее разрешить:
# sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward 0 = 1

Для применения этих значений после перезапуска требуется отредактировать файл /etc/sysctl.conf - раскомментировать или добавить (если ее еще нет) строчку:
net.ipv4.ip_forward=1

Системная утилита route дает нам возможность установки статических маршрутов. Например, следующая команда добавит маршрут к сети 10.0.5.0/24 через маршрутизатор 10.0.1.1:
# route add -net 10.0.5.0/24 gw 10.0.1.1
Посмотреть маршруты мы можем через команду netstat:
# netstat -rn
А удалить маршрут - через опять же route:
# route delete -net 10.0.5.0/24
Однако эти маршруты потеряются при первой же перезагрузке. Чтобы при каждой загрузке ОС автоматически задавались статические маршруты, их необходимо прописать в конфигурации.
Статические маршруты задаются в файлах route-ethX. Вместо ethX необходимо использовать название интерфейса, например, eth0. Лежат эти файлы в
/etc/sysconfig/network-scripts
Вот пример файла /etc/sysconfig/network-scripts/route-eth0:
192.168.5.0/24 via 192.168.0.1
192.168.10.0/24 via 192.168.0.2

Здесь задаются статические маршруты:
В подсеть 192.168.5.0/24 ходить через роутер 192.168.0.1
В подсеть 192.168.10.0/24 ходить через роутер 192.168.0.2

четверг, 9 мая 2013 г.



Организация видеотрансляции с помощью пакета ffmpeg на CentOS 6.4. 

Условия выполнения работ – имеется IP веб-камера BEWARD, подключенный к ней микрофон и ПК (виртуальная машина). На ПК CentOS 6.4. Необходимо организовать видеотрансляцию со звуком с IP web-камеры, что бы пользователи сети Интернет могли просматривать трансляцию через браузер. Обобщенная схема трансляции:


1 Устанавливаем ffmpeg по официальной инструкции с сайта http://ffmpeg.org/trac/ffmpeg/wiki/CentosCompilationGuide

1.1 Удаляем старые пакеты (вдруг они есть) из системы: 

# yum erase ffmpeg x264 x264-devel 

1.2 Устанавливаем пакеты, необходимые для сборки ffmpeg 

# yum install autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig wget zlib-devel 

1.3 Создаем директорию, в которую будим качать исходники и переходим в нее:
# mkdir ~/ffmpeg-source
# cd ~/ffmpeg-source/ 


1.4 Устанавливаем Yasm. Этот пакет представляет собой ассемблер, который потребуется для дальнейшей сборки пакета ffmpeg.
# wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
# tar xzvf yasm-1.2.0.tar.gz
# cd yasm-1.2.0
# ./configure
# make
# make install

1.4 Устанавливаем библиотеку x264, которая является видедекодером стандарта H.264.
# cd ~/ffmpeg-source
# git clone git://git.videolan.org/x264
# cd x264
# ./configure --enable-static
# make
# make install

Примечание: Если в системе не удалось выполнить команду «git», значит в ней не стоит пакет Git. Поставить его можно так:
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# wget https://git-core.googlecode.com/files/git-1.8.2.1.tar.gz
# tar -zxf git-1.8.2.1.tar.gz
# cd git-1.8.2.1
# make prefix=/usr/local all
# make prefix=/usr/local install

1.5 Устанавливаем пакет AAC, который является аудиодекодером
# cd ~/ffmpeg-source
# git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git
# cd fdk-aac
# autoreconf -fiv
# ./configure --disable-shared
# make
# make install

1.6 Устанавливаем пакет LAME, который предназначен для работы с аудио формата MP3
# cd ~/ffmpeg-source
# wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
# tar xzvf lame-3.99.5.tar.gz
# cd lame-3.99.5
# ./configure --disable-shared --enable-nasm
# make
# make install

1.7 Устанавливаем библиотеку libogg, которая предоставляет функции, необходимые программам для чтения или записи битовых потоков в формате Ogg
# cd ~/ffmpeg-source
# wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
# tar xzvf libogg-1.3.0.tar.gz
# cd libogg-1.3.0
# ./configure --disable-shared
# make
# make install

1.8 Устанавливаем библиотеку libtheora, которая предоставляют функции для чтения и записи видеофайлов
# cd ~/ffmpeg-source
# wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.gz
# tar xzvf libtheora-1.1.1.tar.gz
# cd libtheora-1.1.1
# ./configure --disable-shared
# make
# make install

1.9 Устанавливаем библиотеку libvorbis, которая предоставляют функции, используемые при чтении и записи звуковых файлов.
# cd ~/ffmpeg-source
# wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
# tar xzvf libvorbis-1.3.3.tar.gz
# cd libvorbis-1.3.3
# ./configure --disable-shared
# make
# make install

1.10 Устанавливаем библиотеку libvpx, которая умеет работать с форматом видео Vp8, используемом в HTML5.
# cd ~/ffmpeg-source
# git clone http://git.chromium.org/webm/libvpx.git
# cd libvpx
# ./configure
# make
# make install

1.11 Наконец устанавливаем пакет ffmpeg, в который включаем поддержку, ранее установленных пакетов
# cd ~/ffmpeg-source
# git clone git://source.ffmpeg.org/ffmpeg
# cd ffmpeg
# ./configure --enable-gpl --enable-libfdk_aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree
# make
# make install

2. Устанавливаем Apache и разрешаем подключение к нему извне по 80-ому порту.
# yum install httpd
# chkconfig --levels 235 httpd on
# /etc/init.d/httpd start
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# iptables-save
Обратившись через браузер к серверу, мы получим тестовую страницу Apache.

3. Создаем конфигурационный файл сервера вещания ffserver и разрешаем подключение к нему по порту 8090.

3.1 Создание конфигурационного файла.
# touch /etc/ffserver.conf
# nano /etc/ffserver.conf
и вносим в него конфигурацию. Например:

#Порт на котором будет идти вещание
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 100
MaxClients 100
MaxBandwidth 10000
# Указываем фвйл логов. Для отладки можно поставить
# CustomLog –
# Тогда логи буду валиться в консоль
CustomLog /var/log/ffserver/ffserver.log
#После отладки можно закомментировать эту строку
NoDaemon

#Определяем источник
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 500M
</Feed>

#Определяем поток
<Stream video.swf>
Feed feed1.ffm
Format swf
VideoCodec flv
VideoFrameRate 15
VideoBufferSize 50000
VideoBitRate 1000
VideoSize 640x384
</Stream>

#Определяем страницу статистики
<Stream stat.html>
Format status
</Stream>

Для наглядности основные сущности конфигурационного файла представлены на рисунке:

Пока приведенная выше конфигурация определяет лишь то, что сервер вещания ffserver будет иметь лишь один источник feed1 и один выходной поток flash – video.swf . 
Конкретно откуда брать сигнал и куда вещать будет задаваться отдельными командами.

3.2 Разрешаем в iptables обращение к порту 8090.
Открываем файл iptables 
#nano /etc/sysconfig/iptables 
Вписываем строки: 
-A INPUT -p tcp --dport 8090 -j ACCEPT 
-A INPUT -p udp --dport 8090 -j ACCEPT 
У меня получилось: 
# Generated by iptables-save v1.4.7 on Thu May 9 17:19:41 2013 
*filter 
:INPUT ACCEPT [0:0] 
:FORWARD ACCEPT [0:0] 
:OUTPUT ACCEPT [46549019:40517613520] 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 8090 -j ACCEPT 
-A INPUT -p udp -m udp --dport 8090 -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
COMMIT 
# Completed on Thu May 9 17:19:41 2013 

4. Запускаем сервер:
# ffserver -f /etc/ffserver.conf
Эту команду лучше запустить в отдельной консоли, так как остановить ее (нажатием Ctrl-C) – значит остановить сервер.
Убедимся, что сервер работает, посетив страницу его статистики по адресу:
http://<IP адрес сервера>:8090/stat.html
Пример:

5. Для того что бы сервер начал работать необходимо определить серверу источник и путь вещания выходных потоков.

Примеры:

Для вещания из файла (файл gagarina.mp4 – видеоклип с разрешением 360х640):
# ffmpeg -i /root/gagarina.mp4 -s 360x640 -r 24 -ac 1 -ar 8000 -b 30 -ab 12 http://46.20.64.50:8090/feed1.ffm 

Для переприема музыкального канала из Интернета:
# ffmpeg -i http://wtv.cores.biz/relay/zonam.mp4 http://46.20.64.50:8090/feed1.ffm 
После запуска команды консоль становиться недоступной. 

И наконец для вещания с IP камеры, имеющей адрес 188.168.3.201
# ffmpeg -i rtsp://188.168.3.201:554/h264 http://46.20.64.50:8090/feed1.ffm 
После запуска команды консоль становиться недоступной. 

В браузерах Mozilla, Chrome, Opera можно увидеть вещание по адресу flash потока http://<IP адрес сервера>:8090/video.swf В Internet Explorer трансляция в таком виде почему-то не отображается.

6. Для просмотра трансляции через любой современный браузер по стандартному порту необходимо создать html страничку и вставить туда следующий ключевой тег:
<embed src="http://<IP адрес сервера>:8090/video.swf" width=640 height=400 />

К сожалению, скормить эту ссылку какому-то флеш-плееру у меня не получилось, поэтому на странице в моем варианте присутствовал прямоугольник, в котором велось вещание. Ни растянуть экран, ни прибавить / убавить громкость в таком варианте нельзя. Но, однако, изображение есть и звук тоже! :)

ПРИМЕЧАНИЯ:
1.    Просмотр доступных кодеков производиться командой:
  # ffmpeg -codecs
2.    Если в конфиге сервера ffmpeg закомментировать строку NoDemon, то запустить сервер ffserver можно так
  # ffserver -n -f /etc/ffserver.conf
и он не заблокирует консоль.
Так же запустить сервер без блокирования консоли можно так:
  # nohup ffserver -n -f /etc/ffserver.conf > /dev/null 2>&1 &

Источники добавлять можно так, что бы консоль не блокировалась:
# nohup ffmpeg -loglevel 0 -v 0 -i rtsp://10.200.72.112:554/user=admin\&password=\&channel=1\&stream=0.sdp? http://10.200.16.230:8090/feed1.ffm > /dev/null 2>&1 &
# nohup ffmpeg -loglevel 0 -v 0 -i rtsp://10.200.72.113:554/user=admin\&password=\&channel=1\&stream=0.sdp? http://10.200.16.230:8090/feed2.ffm > /dev/null 2>&1 &
Здесь перед спесимволами важно ставить обратный слеш

Убиваем процессы командами:
# ps ax | grep ff
Определяем PID и убиваем его
# kill -9 <PID