Архивы: Debian

Linux DLNA Server под Debian

Еще одна запись из серии «На память».

Не так давно приобрел себе консоль Sony PlayStation3 и по мимо игровых функций обнаружил, что она может выступать в роли сетевого медеа-плеера, что при наличии FullHD телека и WiFi люто сократит количество проводов да и вообще удобно..

И так сонька ищет в сети UPnP-DLNA (о том, что такое DLNA прочитайте тут) сервера, о том как расшарить контент с ПК в сеть по данной технологии в доках к PS есть только гайд для винды, что для меня не комильфо.. Порывшись в интернетах нарыл  проект Minidlna. О том, что его надо бы скачать и скомпилить думаю догадаетесь сами, благо процедура до боли простая.

Единственное, что я в данном случае сделал это собрал .deb пакет для ленивых, скачать его можно тут. Правда пока только для x86-64 :(

VLC Mass IP cams transcoding

В общем есть такой тип проектов, в которых используют большое количество ip камер. Как правило это проекты связанные с городской безопасностью. Например http://www.podryad.tv/live_cam/ один из таких проектов..

В данной статье я расскажу как просто и эффективно реализовать подобный сервис. Соответственно будем считать, что камеры по городу или объекту расставлены, работают и доступны по сети. В данном конкретном случае будут использоваться камеры AXIS различных моделей. Благо интерфейс доступа к потоку у них стандартизирован.

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

Кратко опишу техническую задачу.

Есть некоторое количество камер потоки с которых нужно транслировать на сайт предварительно перекодировав поток с заворачиванием в FLV контейнер. Как дальше оно будет разруливаться не особо важно.

Для решения задачи я взял всем известный проект VideoLan , который является не только прекрасным проигрывателем мультимедиа, но и не менее прекрасным медиа-сервером.

Небольшая ремарка по поводу производительности..

Рабочий проект содержащий > 60 камер, обслуживался одним сервером Dell R710 с двумя процессорами Intel Xeon SixCore X5650 @ 2.67GHz c 6Gb RAM при этом потоки принимались на один гигабитный сетевой интерфейс и через такой же отдавались.. Интенсивность потока в среднем 400Mb/s при разрешении картинки в 840х480.. Средняя загрузка системы за 5ть минут составляла примерно 30 единиц.

Работать все будет под управлением OS GNU/Debian 6.0. В принципе под другими дистрибутивами наверно будет работать не хуже.

И так начнем. Для начала нужно поставить необходимые пакеты, в частности сам vlc (а точнее vlc-noc) со всеми зависимостями. так же советую подключить репозитории проекта debian-multimedia если вам понадобится кодировать потоки например в h264.

Когда установка будет закончена, надо создать не привилегированного пользователя от имени которого и будет работать vlc.

Теперь собственно о том как настроить и как всем этим управлять..

В VLC есть такая приятная фишка как  VLM, по сути простой стрим лист. возможности которого по настоящему безграничны.

Вот пример такого листа:

new cam26 broadcast enabled
setup cam26 input http://user:*****@XXX.XXX.XXX.XXX/axis-cgi/mjpg/video.cgi
setup cam26 output #transcode{vcodec=FLV1,vb=5000,fps=25,ab=192,samplerate=48000}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8080/stream26.flv}
control cam26 play

new cam25 broadcast enabled
setup cam25 input http://user:*****@XXX.XXX.XXX.XXX/axis-cgi/mjpg/video.cgi
setup cam25 output #transcode{vcodec=FLV1,vb=5000,fps=25,ab=192,samplerate=48000}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8080/stream25.flv}
control cam25 play

По сути нету ничего сложного, важно, что лист может содержать огромное количество подобных записей.

Немного об опциях транскодинга и вывода.

#transcode{vcodec=FLV1,vb=5000,fps=25,ab=192,samplerate=48000}

  • vcodec — собственно видео кодек в нашем случае это флеш кодек.
  • vb — видео буфер — значение подбирается экспериментально, если изображение мигает или сыпется, данный параметр нужно увеличить. Помните, что увеличивая его вы увеличиваете количество пожираемой ОЗУ.
  • fps — количество кадров в секунду, советую устанавливать значение равное значению выставленному на камере.. Если сервер транскодинга слабоват, значение можно уменьшить, но и качество соответственно будет хуже.
  • ab — аудио буфер — если планируется трансляция звука.
  • samplerate — входная частота дискретизации.

{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8080/stream25.flv}

  • access — указывает на тип доступа к потоку, в нашем случае http
  • mime — mime тип для транспорта
  • mux — мультиплексор, в нашем случае ffmpeg, который будет заворачивать поток в контейнер flv
  • dst — собственно url по которому наш поток будет доступен для клиентов.

Теперь немного об аргументах с которыми стартует сервер. Вся строка выглядит так :

cvlc -d -q —pidfile=/var/run/vlc.pid —ttl 8 -I telnet —telnet-host=0.0.0.0 —telnet-password=********* —sout-transcode-high-priority —http-reconnect —http-caching=10000 —logmode=syslog —rt-priority —vlm-conf /home/vlc/vlc-stream-list.cfg

Разберем ее по порядку:

  • -d — опция которая говорит vlc запускаться как демон
  • -q — опция подавляющая вывод в stdout/stderr сообщений.
  • —pidfile — опция указывающая где будет создан файл идентификатора процесса, так как наш сервер будет запущен с опцией -d то это будет актуально, особенно если вы захотите в дальнейшем написать скрипт для /etc/init.d
  • —ttl — параметр не особо важный, но все же. Его назначение это указание маршрутизаторам время жизни транспортного пакета.. по истечению которого оный будет уничтожен.. Если трансляция осуществляется в рамках одного сегмента, можно установить параметр в единицу, меньше мусора будет.
  • -I тип интерфейса управления, в нашем случае telnet, есть еще http и что-то еще я уже не помню..
  • —telnet-host — с какого адреса ждать подключения к telnet консоли.
  • —telnet-password — тут все понятно..
  • —sout-transcode-high-priority — опция говорит что процессы транскодинга должны выполнятся с наивысшем приоритетом (аналог системной утилиты nice).
  • —http-reconnect — опция заставляющая vlc пытаться восстановить соединение с http транспортом камер. (При условии что таковой используется, если забор потока идет через rtp сия опция бесполезна)
  • —http-caching — кеш http трафика полезная опция при высокой нагрузке на сеть
  • —logmode логи работы vlc будут обрабатываться системными средствами, в частности syslog
  • —rt-priority очень важная опция заставляющая работать процессы vlc  с приоритетом реального времени. ВНИМАНИЕ! Если на сервере транскодинга запущены другие программы фонового характера работы.. Данная опция может серьезно снизить их производительность.
  • —vlm-conf путь до стрим листа.

Вот собственно и все..

Дальше все, что вам нужно сделать это забить стрим лист данными о потоках и запустить сервер.

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

Работа vlc транскодера на 60 потоках.

Теперь надо подумать о том как этим управлять..

Для управления я сделал следующее:

  1. Создал таблицу в бд где храню информацию о потоках, их номера параметры кодирования и вывода, IP адреса логины и пароли для доступа к камерам и многое другое, что сильно упрощает жизнь.
  2. На сервер я поместил скрипт который по крону или в ручную регенерирует стрим лист и перезагружает сервер.
  3. Написал небольшую программку для управления записями в БД.

Собственно все.. Кому будет интересно могу предоставить структуру таблицы и сходный код программки..

За сим откланюсь, надеюсь изложенная информация будет вам интересна и полезна.

Успехов.

Iptables and Ipset in Debian

Включаем поддержку ipset в iptables.

Актуально для ядер > 2.6.30

# apt-get install module-assistant xtables-addons-source
# module-assistant prepare
# module-assistant auto-install xtables-addons-source

# # modprobe ipt_set

Asterisk логирование не обслужанных звонков

Представим себе сферический колцентр в вакууме, есть голосовое меню и прочие навороты и есть абонент (то же в вакууме) звонящий в этот самый колцентр который пытается куда-то там и зачем-то там дозвониться, внезапно ему наскучивает слушать говор синтетического человека и абонент кладет трубку..
А теперь представим, что колцентр обслуживает абонентов некого оператора связи где каждый абонент на счету и администрация люто печется о качестве сервиса и желает перезвонить не терпеливому абоненту и спросить, что тот хотел.

Замутим логирование кодов закрытия канала связи..

Что есть : Asterisk 1.4 , Python 2.5 , MySQL 5.1

Создадим табличку для MySQL в которую и будем складывать высеры Астериска.

Будем сохранять:
callerid — собственно номер звонившего
date_stamp — timestamp обрыва канала (HANGUP,CANCEL, etc..)
cause — код причины
status и comment — зело не обязательно, статус записи (типа обслужено или нет) и комментарий

CREATE TABLE `asterisk`.`call_fail_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`callerid` VARCHAR(11) DEFAULT NULL,
`date_stamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`cause` VARCHAR(15) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0',
`comment` text,
PRIMARY KEY (`id`),
KEY `call_index` (`callerid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Теперь сварганим махонький python agi скрипт который непосредственно сохранять данный в базу..

#!/usr/bin/env python

'''
Created on 05.08.2011

@author: valor
'''

import MySQLdb
import sys

class CallFailLog:

    DBHOST = "192.168.158.160"
    DBUSER = "agi"
    DBPASS = "asterisk"
    DBNAME = "asterisk"

    def __init__(self):
        pass

    def db_init(self):
        connect = MySQLdb.connect(db=self.DBNAME, host=self.DBHOST, user=self.DBUSER, passwd=self.DBPASS)
        return connect

    def main(self,callerid, datestamp, cause):
        sql = '''INSERT INTO call_fail_log (`callerid`,`date_stamp`,`cause`) VALUES(%s,FROM_UNIXTIME(%s),%s)'''
        cursor = self.db_init().cursor()
        cursor.executemany(sql,[(callerid,datestamp,cause)])
        self.db_init().close()

if __name__ == '__main__':
    app = CallFailLog()
    app.main(sys.argv[1], sys.argv[2], sys.argv[3])

Как видим все просто и легко..
Теперь лезем в extensions.conf и сделаем макрос обработки кодов + посмотрим откель его можно вызвать..

Собственно макрос:

[macro-logfailcall]
exten => s,1,GotoIF($["${ARG1}" = "16"]?goin:end)
exten => s,n(goin),DeadAGI(callfaillog.py,${CALLERID(num)},${EPOCH},${ARG1})
exten => s,n(end),NoOp(>>> Unknown cause ${ARG1})
exten => s,n,Hangup()

Код завершения 16 NORMAL_CLEARING  — есть не что иное как положенная абонентом трубка.

Вызвать его можно в любом контексте, например так..

...
exten => h,1,Macro(logfailcall,${HANGUPCAUSE})
...

a: Вызывается, когда пользователь нажимает ‘*’ во время проигрывания приветствия системы голосовой почты.
h: Вызывается, по завершению вызова. 
i: Вызывается, при попытке вызова неизвестного екстеншена.
o: Расширение оператора, используется для обработки нажатия нуля в системе голосовой почты.
s: Стартовое расширение в контексте.
t: Вызывается, при наступлении состояния таймаута.
T: Вызывается, при наступлении состояния абсолютного таймаута, заданного функцией AbsolutTimeout?.
e: Перехват расширений i,t и T для обработки ошибки в едином месте. Для выяснения типа ошибки может быть использована функция EXCEPTION(?)
failed: Используется, если auto-dial out вызов завершился неудачно (который имеет определённый контекст, приоритет и расширение).
fax: Используется для определения факса на Zap каналах.
talk: Используется в конъюнкции с BackgroundDetect?.

Полезные ссылки : Коды причин закрытия канала

Удачи..

VsFTPD and Virtual users on Debian

На заметку..

Пакеты:

apt-get install libpam-pwdfile vsftpd

Предположим, что сайтики лежат в /srv/www/{sitename — вида www.mysite.ru}/htdocs , соответственно ограничиваем пользователя доступом в корень, т.е. не выше директории www.mysite.ru.

И так чистим дефолтный конфиг vsftpd

echo "" > /etc/vsftpad.conf

И записываем туды следующие..

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
# пользователя vsftpd нужно создать системным без шела, например useradd -M -r vsftpd
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
# Токен $USER предполагает что к пути /srv/www/ будет добавлено имя пользователя, он и будет являться корнем для него.
local_root=/srv/www/$USER
chroot_local_user=YES
hide_ids=YES
guest_username=vsftpd
chown_uploads=YES
# От имени и группы www-data пашет Apache.
chown_username=www-data
guest_enable=YES
guest_username=www-data
chown_upload_mode=0775

use_localtime=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES

dirmessage_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome developer to WWW server!
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty

pasv_enable=YES
pasv_min_port=62000
pasv_max_port=64000

Далее надо настроит pam аутентификацию, для сего лезим в /etc/pam.d/vsftpd и комментим все попутно добавив туда две строчки

auth required pam_pwdfile.so pwdfile /etc/ftpd.passwd
account required pam_permit.so

Собственно создаем файлик /etc/ftpd.passwd командой

htpasswd -c /etc/ftpd.passwd

Добавление пользователя осуществляется аналогично, только без опции -с и с названием корневой директории сайта в качестве пользователя

htpasswd /etc/ftpd.passwd www.mysite.ru

Ребутим vsftpd и радуемся..

Grub2 и framebuffer в Debian

Ахтунг!!! Не надо ничего менять в /boot/grub/grub.conf , это не наш метод.

Разрешение ЖК моего ноутбука 1280×800, не забываем его сменить на свое!

Для начала открываем  /etc/default/grub и ищем строку:

GRUB_GFXMODE=800x600

Правим ее немного, что бы получилось:

GRUB_GFXMODE=1280x800@32
# ниже добавляем строку
GRUB_GFXPAYLOAD=1280x800x32

Теперь лезем в /etc/grub.d/00_header ищем там строку:

if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=800x600x32 ; fi
#меняем разрешение на свое и ниже добавляем еще одну
if [ "x${GRUB_GFXPAYLOAD}" = "x" ] ; then GRUB_GFXPAYLOAD=1280X800x32 ; fi

В самом конце файла ищем строку

set gfxmode=${GRUB_GFXMODE}

и ниже добавляем

set gfxpayload=${GRUB_GFXPAYLOAD}

Сохраняем и запускаем update-grub2.

Удачи.



Debian NumLock trouble

Угораздило меня нарваться на иксовый баг чёрт его знает какой давности.. причем баг сей не очевиден и вроде даже не совсем баг (да.. вот такой вот каламбур).. Короче, суть в том, что если нечаянно нажать Shift+NumLock , то цифровая консоль переходит в режим управления курсором, а так как при каждом нажатии клавиш 8,6,2,4 курсор сдвигается на один пиксел, заметить сей трабл не просто, по симу первая мысль приходящая в голову это БАГ..

Для поличения сей пичали нужно жмакнуть  Shift+NumLock еще раз..

ЗЫ.. Как мне подсказали интернеты.. данная «фича», есть не что иное как не плохой  способ подосрать ближнему ибо неплохо функционирует при не активных иксах (т.е. в разлогиненном состоянии).

Gnome-terminal как фон рабочего стола..

Захотелось странного..  Хочу что-бы консоль была фоном рабочего стола.  Не отвлекаясь на преамбулы, возьмемся за решение поставленной задачи.

На просторах интернетов набрел на занятный тузлец Alltray (AllTray — Dock any program into the system tray.) , полистав man — понял, что для решения нашей задачи оно может сгодиться.

И так решение.

В качестве эмулятора терминала берем стандартный для Gnome — Gnome-terminal, дистрибутив Debian..

Для начала малость подрехтуем сам gnome-terminal:

  1. Создаем новый профиль.
  2. Отключаем отображения верхнего меню.
  3. Отключаем полосы прокрутки.
  4. Увеличиваем буфер строк (для удобства).
  5. Выкручиваем до упора прозрачность фона терминала.
  6. Подгоняем цвет консольных шрифтов под цвет фона рабочего стола.
  7. Остальное по вкусу..

Устанавливаем alltray

viktor@viktor-laptop:~$ apt-get install alltray

Ну и финальный штрих в авто-запуск (тут неважно как именно, важна суть..) добавляем следующую строку:

alltray --show --sticky --skip-taskbar --no-alltray --notray -x -g +800+0 --geometry 1024x600 gnome-terminal --window-with-profile=s

Лично я добавлял ее в Система->Параметры->Запускаемые приложения.

Да и пару слов об опциях alltray..

  • show – не сворачивать при запуске
  • sticky – отображать на всех рабочих столах
  • skip-taskbar – убрать приложение из панели задач
  • no-alltray – убрать заголовок alltray
  • notray – не показывать значёк в трее
  • x – убрать декорацию окон
  • +800+0 – позиция окна на рабочем столе (первое – горизонталь, второе – вертикаль)
  • geometry 1024×600 — разрешение рабочего стола (это если нужно растянуть терминал на весь рабочий стол, иначе просто указываем нужную геометрию окна терминал)
  • window-with-profile=s — это уже параметр gnome-terminal говорящий о том, что при запуске нужно заюзать профиль «s», который мы создали выше.

Ну вот и все.. Перезагружаем иксы и ликуем..

Все эти выше описанные манипуляции выполнялись на Asus EeePC 1005 с Debian Sqeeze и Gnome 2.28.1..

Пользователей KDE, Xfce, etc..  очень прошу оставить свои комментарии по поводу различий и нюансов в реализации данной фичи.

Скрины на память…

Терминал как фон рабочего стола

Терминал как фон рабочего стола

Xen 3.2-1 and HVM Windows config

Очередной пост для себя любимого.. Но и Вы гости дорогие жуйте если что не стесняйтесь..

Сие есть просто файл конфигурации HVM домена с Win2k3..

Пост не претендует на новизну и оригинальность.

 

kernel="hvmloader"
device_model = 'qemu-dm'
builder='hvm'
memory = 5120
name = "win2k3
vcpus= 4
pae=1
acpi= 1
apic= 1
#usb= 1 разкомментировать если нужна поддержка USB в гостевой ОС. #usbdevice= [ 'host:0529:0514' ]  DID, USB устройства которое нужно пробросить.
cpus = "
2-5"
vif=[ 'mac=00:16:3e:01:01:01,bridge=eth0,type=ioemu' ]
disk = [
'file:/C.img,hda,w',
'file:/D.img,hdb,w'
]
'file:/win2003/win2003.iso,hdc:cdrom,r',
'file:/win2003-2.iso,hdd:cdrom,r'
#]
on_poweroff = 'destroy'
on_shutdown = 'shutdown'
on_reboot   = 'restart'
on_crash    = 'restart'
boot='c'
sdl=0
vnc=1
vnclisten="
0.0.0.0"
vncconsole=0
stdvga=0
serial='pty'

Note:

Для тех кто не в курсе.. Для работы HVM домена необходима поддержка Intel®Virtualization Technology (VT) или Pacifica (AMD)  процессором (ами) сервера. Проверить можно следующими способами:

# xm info | grep caps
hw_caps                : 178bfbff:ebd3fbff:00000000:00000010:00002001:00000000:0000001f
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p

# xm dmesg | grep VMX
(XEN) VMXON is done
(XEN) VMXON is done

# xm dmesg | grep -i svm
(XEN) AMD SVM Extension is enabled for cpu 0.
(XEN) AMD SVM Extension is enabled for cpu 1.

Траблы:

  • Через опу работает AMD VT-d в силу зачаточности реализации..
  • Через туда же работает USB .
  • При установки паравиртуальных драйверов для Windows (В частности Win2k3) отваливаются CDROM`ы.. (на версии драйвера gplpv_2003x64_0.11.0.188 от 3 января  2010 г.)

Ну на этом с траблами вроде все, по крайней мере я более не обнаружил..

Кстати вопреки слухам о запущенности и унынии свободной реализации паравиртуальных драйверов для виндовсов.. Отнюдь.. Драйвера активно разрабатываются и они довольно таки стабильны. Кому надо, ссылка в конце поста.

Хозяйке на заметку:

  1. В качестве виртуального HDD для гостевой ОС предпочтительнее использовать блочное устройство, нежели файловое.  Синтаксис опции : phy:UNAME,DEV,MODE
  2. Для ОС семейства MSWindows (особенно серверных) установки паравиртуальных драйверов крайне предпочтительна, ибо в качестве профита появится многоканальный SATA контроллер, 1G сетевой адаптер и.т.д в зависимости от типа ОС (сие особенно полезно если в гостевом сервере крутится БД ).

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

Отслеживание изменений в /etc с помощью etckeeper и Git

Собственно вот.. Объяснять для чего это не буду, кому надо тот поймет.

И так ставим etckeeper из репов..

wall:~# apt-get install etckeeper

Далее все просто..

wall:~# cd /etc/
wall:/etc# etckeeper init
Initialized empty Git repository in /etc/.git/
wall:/etc#etckeeper commit 'Init Сommit'
wall:/etc# git gc
Counting objects: 1476, done.
Compressing objects: 100% (1068/1068), done.
Writing objects: 100% (1476/1476), done.
Total 1476 (delta 91), reused 0 (delta 0)

Далее нам надо сделать так чтобы файлы конфигураций вновь установленных программ автоматом попадали в репозиторий.
Для этого надо разкомментировать строку AVOID_COMMIT_BEFORE_INSTALL=1 в файле /etc/etckeeper/etckeeper.conf .

Ну и запишем изменения :

wall:/etc# git commit -a -m 'Uncomment option in etckeeper.conf'
Created commit b26ec5d: Uncomment option in etckeeper.conf
 1 files changed, 1 insertions(+), 1 deletions(-)

За дополнительной информацией по работе с Gig лезем в Man.

Все! :)