Home FreeBSD
FreeBSD

Мониторинг ICQ-переписки с помощью AimSniff

E-mail Печать PDF

Оригинал: http://www.lissyara.su/articles/freebsd/programms/aimsniff/
Постановка задачи
Необходимо создать систему, позволяющую перехватывать, хранить и отображать в удобной форме ICQ-переписку сотрудников компании. Судя по диалогам на соответствующих форумах, рассматриваемая задача периодически возникает, поэтому я описал один из способов ее решения, примененный в нашей Компании.

Исходные данные
Имеется сервер с FreeBSD, через который сотрудники компании тем или иным способом (NAT, прокси-сервер и т.п.) выходят в Интернет. Для установки системы не требуется какая-либо перенастройка этого сервера. Самое главное - Вы должны тем или иным способом ограничить список портов, которые могут использовать клиенты ICQ, чтобы продвинутые пользователи не смогли "обмануть" сниффер.
В качестве сниффера мы будем использовать AimSniff, для хранения перехваченныйх сообщений - сервер MySQL (процесс настройки сервера MySQL не расматривается в данной статье за исключением создания базы данных и пользователя aimsniff), для просмотра отчетов - Web Aim Sniff (WAS) и Web-сервер Apache (процесс настройки сервера Apache не рассматривается в данной статье за исключением добавления возможности отображения необходимых отчетов). Почти все перечисленное программное обеспечение будет устанавливаться из портов, поэтому я настоятельно рекомендую Вам обновить их перед выполнением действий, описанных ниже (лично я использовал FreeBSD 7.0 и последние на конец 2008 года версии портов для нее). Ссылки на источники информации будут приводиться применительно к конкретным разделам статьи.

Установка и настройка AimSniff
Установку AimSniff необходимо выполнить из портов:cd /usr/ports/security/aimsniff
make install clean


Сразу после завершения установки необходимо выполнить команду: aimsniff -d=bge1 --nodb


Естественно, bge1 необходимо заменить на имя внутреннего интерфейса. Данная команда запускает мониторинг пакетов ICQ, проходящих через заданный интерфейс, и отображение содержимого декодированных пакетов на экране без записи в базу данных. Если после выполнения команды вместо сообщений "INCOMINMG MESSAGE..." и "OUTGOING MESSAGE..." выдается сообщение: "Can't locate GDBM_File.pm in @INC (…) at /usr/local/bin/aimsniff line 47. BEGIN failed--compilation aborted at /usr/local/bin/aimsniff line 47., следует пересобрать Perl с поддержкой GDBM: cd /usr/ports/lang/perl5.8
make deinstall
make WITH_GDBM=yes reinstall


По умолчанию AimSniff "не понимает" интересующие нас сообщения в кодировке UTF-8. Для исправления такого поведения необходимо загрузить пропатченную версию скрипта AimSniff и установить порт p5-Unicode-Map8 (если он не был установлен ранее): fetch http://www.aimsniff.com/releases/aimSniff.Cyr-005.tar.gz
tar -xf aimSniff.Cyr-005.tar.gz
chmod 555 aimSniff.Cyr-005.pl
mv aimSniff.Cyr-005.pl /usr/local/bin
cd /usr/ports/converters/p5-Unicode-Map8
make install clean


Для проверки работоспособности руссифицированного AimSniff необходимо выполнить команду: aimSniff.Cyr-005.pl -d=bge1 --nodb


После того, как первичная настройка будет завершена, необходимо создать базу данных aimsniff и пользователя aimsniff для работы с этой базой данных. Для этого нужно запустить клиент MySQL командой: mysql -u <имя пользователя-администратора> -p


ввести пароль и выполнить три SQL-запроса: CREATE DATABASE aimsniff;
GRANT ALL ON aimsniff.* TO aimsniff@localhost IDENTIFIED BY 'aimsniff';
FLUSH PRIVILEGES;


После завершения работы клиента MySQL необходимо создать таблицы базы данных aimsniff: mysql -u <имя пользователя-администратора> -p aimsniff \
< /usr/local/share/doc/aimsniff/table.struct


После завершения подготовки базы данных необходимо создать файл конфигурации AimSniff. В моем случае он называется aimSniff.cfg, находится в папке /usr/local/etc и имеет следующее содержимое: dev=bge1
filter='tcp and port 3128'
daemon=1
host=localhost
database=aimsniff
user=aimsniff
password=aimsniff
useSyslog=1


В данном файле заданы следующие значения параметров: dev - имя интерфейса; filter - фильтр, определяющий какие пакеты следует "вылавливать" (зависит от способа выхода клиентов ICQ в Интернет, в моем случае для выхода клиентов ICQ в Интернет используется прокси-сервер, "слушающий" порт 3128); daemon - признак работы в режиме демона; host / database / user / password - параметры доступа к базе данных; useSyslog - признак использования syslog'а для записи служебных сообщений.
Самым последним этапом настройки AimSniff является доработка скрипта автозапуска, выполняемого при запуске операционной системы. Образец такого скрипта поставляется в составе AimSniff (файл rc.aimsniff в папке /usr/local/share/doc/aimsniff), однако его нужно немного адаптировать. Во-первых, нужно указать корректный интерпретатор shell в первой строке (в моем случае это /bin/sh), а во вторых заменить имя скрипта и файла конфигурации в шестой строке на: /usr/local/bin/aimSniff.Cyr-005.pl -C=/usr/local/etc/aimSniff.cfg


После этого необходимо сделать скрипт исполняемым и скопировать его в папку usr/local/etc/rc.d: cd /usr/local/share/doc/aimsniff
chmod 555 rc.aimsniff
cp rc.aimsniff /usr/local/etc/rc.d/aimsniff.sh


На этом настройка AimSniff заканчивается. Перезагрузите сервер, и после запуска операционной системы демон AimSniff начнет "вылавливать", декодировать и записывать перехваченные сообщения ICQ в базу данных.

Установка и настройка WAS
WAS (Web Aim Sniff) - Web-интерфейс для доступа к базе данных AimSniff, написанный на языке PHP. К сожалению, пока он не добавлен в коллекцию портов FreeBSD, в связи с чем придется ставить его из исходных тестов. Перед началом установки WAS необходимо добавить в файл конфигурации необходимого виртуального хоста Apache следующие строки:Alias /was "/usr/local/www/was/"
<Directory "/usr/local/www/was">
AuthName "This server require authorization!"
AuthUserFile /usr/local/etc/apache/htpasswd
AuthType Basic
Require user <Список пользователей, которым разрешен доступ>
Order deny,allow
Deny from all
Allow from ...
Allow from ...
</Directory>


Как видно из фрагмента файла конфигурации для установки WAS была выбрана папка /usr/local/www/was, доступ к которой разрешен только с определенных IP-адресов и только после прохождения процедуры Basic-аутентификации. Вам нужно подставить реальные IP-адреса в директивы Allow from и добавить необходимых пользователей в файл htpasswd и директиву Require user. О том, как это сделать, подробно написано в разделе Authentication, Authorization, and Access Control официальной документации Apache. Не забудьте перезапустить Web-сервер после внесения изменений в его конфигурацию.
Когда Web-сервер будет подготовлен, необходимо загрузить, распаковать и переместить WAS в нужную папку, удалить все лишнее и сделать владельцем файлов WAS пользователя, от имени которого работает Web-сервер:mkdir /usr/local/www/was
cd /usr/local/www/was
fetch http://aimsniff.com/releases/was-0.1.2b.tar.gz
tar -xf was-0.1.2b.tar.gz
mv was-0.1.2b/* was-0.1.2b/.[a-zA-Z]* .
rm -Rf was-0.1.2b was-0.1.2b.tar.gz
chown -R www:www * .[a-zA-Z]*


После этого необходимо слегка подкорректировать файлы WAS. Во-первых, в файлах .header.php и index.html неоходимо исправить charset=iso-8859-1 на charset=koi8-r (это приведет к корректному выбору кодировки браузером и, соответственно, корректному отображению русских символов). Во-вторых, в файле index.php необходимо исправить img src=./typesGraph.php на img src=./images/typesGraph.php (это исправит ошибку, допущенную разработчиком WAS). В третьих, мне показалось более удобным видеть в списке сообщений не IP-адреса, а имена компьютеров локальной сети. Если Вы согласны со мной, исправьте в файле .global.php <td><B>IP</td> на <td><B>Computer</td>, а также исправьте в теле функции printMessages $rs["ip"] на ucwords(gethostbyaddr($rs["ip"])). Вообще, следует заметить, что WAS - очень "сырой" пакет. К сожалению, у меня нет времени на его адаптацию, да и PHP я знаю лишь поверхностно, поэтому в настоящий момент приходится довольствоваться тем, что есть. Все работает, хотя за эргономику я бы не поставил больше тройки.
После доработки файлов WAS необходимо открыть в браузере URL http://host.company.com/was/admin.php, естественно, изменив host.company.com на имя используемого Вами виртуального хоста. В браузер будет загружена страница, на которой можно задать параметры WAS. В первую очередь необходимо изменить параметры Database User / Database Password и нажать кнопку Submit. Остальные параметры могут быть изменены или не изменены, исходя из личных предпочтений. На этом настройка WAS заканчивается.

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

Обновлено 28.05.2010 13:41
 

Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.

E-mail Печать PDF

Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.




Итак
Виртуальный свич из нескольких сетевух на нетграфе.
Ситуация такая:
на сервере интерфейс rl0 смотрит наружу, в локалку провайдера 10.*.*.*.
а vr0 и vr1 смотрят во внутреннюю сеть 192.168.0.*
Для удобства хотелось бы чтобы в домашнюю сеть смотрела одна сетевуха, а все компы домашней сети были подключены к серверу через свич. Реализуем задуманное на основе ядерного модуля ng_bridge!


Кому лень читать статью полностью, выкладываю свой скрипт. Скрипт предоставляется "As Is" - что то тут лишнее, что то кривое... Конструктивная критика приветствуется. Наличие необходимых зависимостей подразумевается. #!/bin/sh
ngCtl="/usr/sbin/ngctl "
Sleep="/bin/sleep"
PFcmd="/sbin/pfctl"
Head="/usr/bin/head"
Tail="/usr/bin/tail"
Echo="/bin/echo"
Rm="/bin/rm"

PidFile="/var/run/mybridge.pid"

if1="vr0"
if2="vr1"
ifng="ngeth0"
Switch="switch"

case $1 in
start)
if [ -s $PidFile ]; then
${Echo} Bridge already runned!
exit 1
fi
${Echo} Starting bridge
${ngCtl} debug 2
${ngCtl} mkpeer $if1: bridge lower link0
${ngCtl} name $if1:lower $Switch
${ngCtl} connect $if1: $Switch: upper link1
${ngCtl} connect $if2: $Switch: lower link2
${ngCtl} connect $if2: $Switch: upper link3
${ngCtl} msg $if1: setpromisc 1
${ngCtl} msg $if2: setpromisc 1
${ngCtl} msg $if1: setautosrc 0
${ngCtl} msg $if2: setautosrc 0
${ngCtl} mkpeer $Switch: eiface link5 ether
${ngCtl} name $Switch:link5 $ifng
${Sleep} 2
${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf
${Echo} 'int_if="'$ifng'"' >> /etc/pf.conf
${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf

ifconfig $if1 -alias
ifconfig $ifng inet 192.168.0.1 netmask 255.255.255.0

${PFcmd} -f /etc/pf.conf
${Echo} "runned" >> $PidFile

;;
stop)
if [ ! -s $PidFile ]; then
${Echo} Bridge is not runned!
exit 1
fi
${ngCtl} shutdown $Switch:
${ngCtl} shutdown $ifng:
${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf
${Echo} 'int_if="'$if1'"' >> /etc/pf.conf
${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf
ifconfig $if1 inet 192.168.0.1 netmask 255.255.255.0

${Rm} $PidFile
${PFcmd} -f /etc/pf.conf
;;
*)
if [ -s $PidFile ]; then
${Echo} State: Up
else
${Echo} State: Down
fi
;;
esac


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

Начнем с необходимого - с нетграфа. Вот список того, что стоит у меня:# kldstat -v |grep ng
202 ng_socket
181 ng_car
201 ng_rfc1490
200 ng_pptpgre
177 ng_async
199 ng_ppp
180 ng_bridge
198 ng_one2many
197 ng_nat
176 ng_UI
196 ng_mppc
195 ng_lmi
179 ng_bpf
194 ng_l2tp
175 ng_netflow
193 ng_ksocket
192 ng_ipfw
191 ng_ip_input
190 ng_iface
189 ng_hole
188 ng_gif_demux
187 ng_gif
186 ng_framerelay
185 ng_ether
184 ng_echo
183 ng_deflate
207 ng_vjc
206 ng_tty
205 ng_tee
204 ng_tcpmss
203 ng_ng_split
182 ng_cisco
2 1 0xc0945000 2fd4 ng_eiface.ko
1 ng_eiface
# kldstat -v |grep netgraph
178 netgraph


Как видно из всего этого необходим минимум ng_eiface, который я забыл(или поленился) положить в ядро. Кроме того нам понадобятся модули ng_ether и ng_bridge. Но никто не запрещает побаловаться с ng_tee, ng_ipfw и чем-нибудь подобным для подсчета трафика, шейпинга et cetera...

После загрузки модулей нужных модулей смотрим что мы имеем# ngctl list
There are 6 total nodes:
Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 0
Name: rl0 Type: ether ID: 00000001 Num hooks: 0
Name: vr0 Type: ether ID: 00000002 Num hooks: 0
Name: vr1 Type: ether ID: 00000003 Num hooks: 0
Name: ngeth0 Type: ether ID: 00000003 Num hooks: 0
Name: ngctl38473 Type: socket ID: 0000be26 Num hooks: 0



Мы должны видеть узлы типа ether по числу реальных интерфейсов, виртуальный интерфейс ngeth0 и соответствующий ему и узел socket, который служит для связи ngctl с ядром(это уже мои измышления. Подробнее - man ng_socket && man ngctl). Еще мы видем один безымянный узел - это родственник ngeth0, они создаются и уничтожаются только вместе.

Далее нам надо сделать мост. Но просто так его нельзя создать, его надо на что то прицепить. Прицепим хук link0 к хуку lower сетевухи vr0. Сказано - сделано. Попутно обзовем его каким нибудь нехорошим именем, типа switch# ngctl mkpeer vr0: bridge lower link0
# ngctl name vr0:lower switch


Вот тут надо остановиться и поподробнее рассказать о том, что такое хуки(hooks), узлы(nodes), какие они бывают и с чем их едят. Нетграф - это система, которая строит граф, по которому бегают данные. В графе есть узлы и ребра. Иногда узел может просто висеть в воздухе(как например узлы наших сетевух), но чаще чтобы добавить какой то узел надо его к чему ни будь прикрутить. Прикручивание происходит соединением хуков разных узлов. После соединения между хуками появляется ребро по которому могут бегать данные от одного узла к другому. Хуки бывают разные и у каждого типа узла они свои. Какие то пропускают пакеты только в одну сторону, какие то пускают только пакеты верхних сетевых протоколов, подробнее про типы узлов написано в манах, а пока про насущное.
У сетевух(узлов типа ether) есть три хука - upper, lower, и orphans. Грубо говоря, lower работает с нижними протоколами(ethernet), upper - с верхними, а про orphans не помню, но он мне не вроде не подошел. У bridge - до NG_BRIDGE_MAX_LINKS(у меня на 7.2 в src/sys/netgraph/ng_bridge.h:55 говорится про 32 хука) хуков с именами типа link0 link1 link2... У eiface только один хук, - ether - через который бегают все пакеты.
При обращении к локальным узлам пишем двоеточие в конце имени. Обращаться можно как по имени, так и по ID. в последнем случае вместо <node_name>: пишется [0x<node_id>]:

С теорией вроде закончил, перейдем к практике. Продолжаем строит свич: цепляем к мосту остальные хуки сетевушек# ngctl connect vr0: switch: upper link1
# ngctl connect vr1: switch: lower link2
# ngctl connect vr1: switch: upper link3


Идем далее. Сетевухи имеют свойства выпуская пакет прописывать в нем поле отправитель себя и игнорировать пакеты, предназначенные не ей. Отучаем их от этих нехороших привычек:# ngctl msg vr0: setpromisc 1
# ngctl msg vr1: setpromisc 1
# ngctl msg vr0: setautosrc 0
# ngctl msg vr1: setautosrc 0


Свич почти готов. цепляем к нему виртуальную сетевуху, чтобы общаться с ним
# ngctl mkpeer switch: eiface link5 ether
# ngctl name switch:link5 ngeth0


И далее самое интересное. снимаем ипы с реальных сетевух(порты свича не имеют ипов) и ставим внутренний ип(у меня это 192.168.0.1) машины на виртуальную сетевуху. Реальные карточки должны быть без ипов только в состояниии UP# ifconfig vr0 up
# ifconfig vr1 up
# ifconfig vr0 -alias
# ifconfig vr1 -alias
# ifconfig ngeth0 inet 192.168.0.1 netmask 255.255.255.0


Вроде бы и все.
Смотрим что у нас получилось:# ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether <XXX>
inet 10.XXX.XXX.XXX netmask 0xffffXXX broadcast 10.XXX.XXX.XXX
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether <XXX>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether <XXX>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
ngeth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:00:00:00:00:00
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
<overquoting deleted>
# ngctl list
There are 17 total nodes:
Name: <unnamed> Type: ksocket ID: 0000be23 Num hooks: 1
Name: <unnamed> Type: pptpgre ID: 0000be22 Num hooks: 2
Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 1
Name: ng0 Type: iface ID: 0000bd94 Num hooks: 1
Name: rl0 Type: ether ID: 00000001 Num hooks: 0
Name: switch Type: bridge ID: 00000014 Num hooks: 5
Name: vr0 Type: ether ID: 00000002 Num hooks: 2
Name: vr1 Type: ether ID: 00000003 Num hooks: 2
Name: mpd16513-stats Type: socket ID: 0000bd9a Num hooks: 0
Name: ngctl38842 Type: socket ID: 0000be2a Num hooks: 0
Name: mpd16513-cso Type: socket ID: 0000bd92 Num hooks: 0
Name: mpd16513-eso Type: socket ID: 0000bd93 Num hooks: 0
Name: mpd16513-lso Type: socket ID: 0000bd91 Num hooks: 1
Name: ngeth0 Type: ether ID: 0000001f Num hooks: 0
Name: mpd16513-B1-mss Type: tcpmss ID: 0000be24 Num hooks: 2
Name: mpd16513-B1 Type: ppp ID: 0000bd95 Num hooks: 3
Name: mpd16513-L1-lt Type: tee ID: 0000bd96 Num hooks: 2

# arp -a
? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet]
------------------------``----------------------------------
? (192.168.0.2) at <XXX_MAC> on ngeth0 [ethernet]
? (192.168.0.3) at <XXX_MAC> on ngeth0 [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on ngeth0 permanent [ethernet]


Примечание: записи вида ? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet] - адреса из локалки провайдера)

Как видно, сетевухи vrX смирились со своей ролью в качестве портов свича и на них не висят маки соседих машин. Все выглядит так, будто у нас есть свич, в который воткнуты кабеля машин внутренней сети и кабель от нашего компа с интерфейса ngeth0(любопытно, что ifconfig и arp по разному определяют его мак). самого свича, как и полагается, не видно

Дальше разруливаем все пакеты файером, в нем разрешаем прохождение пакетов через реальные внутренние сетевухи(или шейпим/режем по надобности), ставим нат с внешней сетевухи на ngeth0, раздача инета между сетевухами моста будет регулироваться нетграфом. В общем ведем себя так, как будто у нас появился свич и исчезли две сетевухи.






Обновлено 28.05.2010 13:42
 

portdowngrade - откатываем нужный порт до любой ранее версии

E-mail Печать PDF

portdowngrade - откатываем нужный порт до любой ранее версии



Статья не моя, но хотелось чтобы всё было на одном ресурсе, чтобы вдруг чего не мучать бедный гугл.
Автор статьи: DonRumata

И так, буду цитировать со своими поправками, так как его статья уже старовата, думаю автор злиться не будет.
Поехали:

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

В этом случае весьма полезной оказывается утилита portdowngrade.
Итак, первым делом устанавливаем эту самую утилиту:# cd /usr/ports/ports-mgmt/portdowngrade
# make DEFAULT_CVS_SERVER=" Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript :/home/ncvs" install clean
# rehash


Далее как работает данный софт:

portdowngrade ведет логи на установленном по умолчанию cvs сервере (или определенном опцией -s ) и просматривает все изменения, потом отображает предыдущие версии и обновляет дерево портов (только выбранный порт). То есть если надо откатить большое кол-во портов, придётся откатывать по отдельности.

Например, апгрейд до php 5.2.0 прошел неудачно и остались мы без пхп совсем, хочеться вернуться на версию 5.1.x. Первым делом сообщим утилите portdowngrade(1) вывести результаты о php5.# portdowngrade lang/php5

portdowngrade 0.6 by Heiner Eichmann
Please note, that nothing is changed in the ports tree
unless it is explicitly permitted in step 6!

Seeking port lang/php5 ...

Found several matches:
1: lang/php5
2: lang/php5-extensions

Please choose one: 1


В данном случае выбрали версию 1. Теперь утилита обратится к CVS и предложит выбрать до какой ветки вернуть порт. Downgrading port: lang/php5

Step 1: Checking out port from CVS repository
CVS root directory: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript :/home/ncvs
The authenticity of host 'anoncvs1.freebsd.org (216.38.206.185)' can't be established.
DSA key fingerprint is 4d:59:19:7b:ea:9b:76:0b:ca:ee:da:26:e2:3a:83:b8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'anoncvs1.freebsd.org' (DSA) to the list of known hosts.

Step 2: Reading the port history from the CVS repository

Step 3: Analyzing the port history from the CVS repository

Step 4: Load port version numbers and present results
Keys: <space> : next page d : details
p : previous page
<enter> : leave presentation and downdgrade if wanted


Далее пойдет список версий, с комментариями о добавлении/фиксах в продуктеnumber date portversion comment
1 2006/11/12 19:43:12 5.2.0 Update suhosin patch to 0.9.6.2 release.
2 2006/11/06 17:43:10 5.2.0 Update to 5.2.0 release.
3 2006/10/27 19:11:17 5.1.6 Update suhosin patch to 0.9.6 release.
4 2006/10/16 09:30:58 5.1.6 - fix open_basedir vulnerability in php4 and php5 [1]
5 2006/10/06 17:24:21 5.1.6 Enable suhosin patch by default.
6 2006/10/05 20:59:17 5.1.6 Added safety checks against integer overflow.
7 2006/09/29 19:11:40 5.1.6 Update suhosin patch to 0.9.5 release.
8 2006/09/10 16:37:43 5.1.6 Add support for QDBM.
9 2006/09/09 12:35:33 5.1.6 Update suhosin patch to 0.9.3 release.
10 2006/09/04 07:59:15 5.1.6 - Add experimental suhosin protection system support
11 2006/08/31 14:37:05 5.1.6 Update to 5.1.6 release.
12 2006/08/18 16:41:29 5.1.5 Update to 5.1.5.
13 2006/08/18 16:40:18 5.1.4 Allow php5-ldap to be built with SASL support enabled.
14 2006/07/11 13:21:54 5.1.4 Add databases/php5-oci8:
15 2006/05/23 06:19:19 5.1.4 Try to fix build on 4.X.
16 2006/05/18 22:17:32 5.1.4 - Holy Batman! Chase rerolled distfile.
Only chance is an addition of a file
17 2006/05/10 14:46:43 5.1.4 Chase gmp library and bump PORTREVISION.
Total lines: 152. Command:


Далее нажимаем Enter, или Пробел для прокрутки списка(не приходилось) и выбираем номер версии до которой нужно откатиться, на пример до версии 5.1.6 - номер 3 в списке.Enter version number to change port to (0: exit): 3


Далее подтверждаем выбор нажатием Enter и ждём :)Step 5: Checking out choosen date of the port from the CVS repository

Step 6: Modifying the port
Port: lang/php5
at : 2006/10/27 19:11:17
Type 'yes' to bring the port to the state of the date above
or 'no' to exit without changing anything. Note, that this only changes
the port, not the installed software! yes or no:yes


Подтверждаем физический откат порта, пишем "yes", что нам и нужно.
Если мы хотим посмотреть изменения, без физического отката, пишем "no"

Вот собственно и произошел откат порта.
Добиваем наше дело до конца:# portupgrade -f php5*


Ну и проверяем какая картина получилась:# pkg_info | grep php5


Вот собственно и всё, очень полезная утилита, выручила при откате erlang(ejabberd не совместим с erlang-r13*, только с ветками r12 и ниже)

Обновлено 28.05.2010 13:42
 

Настройка вебкамеры FreeBSD

E-mail Печать PDF

Настройка вебкамеры для работы с freebsd

Автор: vp.
Оригинал : http://www.lissyara.su/articles/freebsd/tuning/webcam/

Задача - подключить камеру к freebsd. Для начала нам необходимо просто подключить камеру к freebsd и заставить ее работать.

Итак, на сервере используется freebsd 7.0.
После подключения камеры:# usbdevs -v
Controller /dev/usb4:
addr 1: full speed, self powered, config 1, UHCI root hub(0x0000), Intel(0x0000), rev 1.00
port 1 addr 2: full speed, power 100 mA, config 1, product 0x08d7(0x08d7), vendor 0x046d(0x046d), rev 1.00

# dmesg | grep 0x046d
ugen0: <vendor 0x046d product 0x08d7, class 0/0, rev 1.10/1.00, addr 2> on uhub4


vendor 0x046d - говорит о производителе камеры(Logitech)
product 0x08d7 - это модель камеры

Поиск в сети решения для работы с камерой дало следующие результаты,
* существует порт graphics/spcaview, который позволяет без лишних наворотов и зависимостей снимать с камеры jpeg изображения, а так же работать с mjpeg форматом(потоковый jpgeg)
* graphics/qcamview - не подошел по причине отсутствия драйвера для конкретной модели и привязки к X11
* multimedia/pwcbsd - требует video4linux и совместимости с linux'ом

Из-за того, что qcamview и pwcbsd требую слишком много стороннего софта(в частности X11 и/или поддержки linux на бинарном уровне) для всего-лишь снятия изображения с камеры, решено было использовать graphics/spcaview

Т.к. мы поставили целью избавиться от зависимости от X11, перед установкой порта необходимо убедиться, что в /etc/make.conf содержиться строка вида "WITHOUT_X11=yes", что позволит собирать программы без библиотек X11(например, полезно для GD)# cat /etc/make.conf | grep 'WITHOUT_X11=yes' || echo "WITHOUT_X11=yes" >> /etc/make.conf


Устанавливаем порт, но не через # pkg_add -r graphics/spcaview


т.к. как выяснилось в последствии, поддержки текущей камеры нет в программе, а компилируем порт из исходников:# cd /usr/ports/graphics/spcaview
# make && make install && rehash


При работе freebsd с камерами создается специальное устройство ugenX(например, /dev/ugen0)
Проверяем поддержку камеры# spca5shot -d /dev/ugen0 -i
Not found SPCA50x based usb camera, or Permission denied


Поддержки камеры нет, увы. Но мы ее добавим! Находим файл с данными о камерах и просматриваем его на предмет наличия поддержки камеры производителя 0x046d:# less /usr/ports/graphics/spcaview/work/spca5xx-20060402/drivers/usb/spca5xx.c | grep 0x046d
{USB_DEVICE(0x046d, 0x0960)}, /* Logitech Inc. ClickSmart 420 */
{USB_DEVICE(0x046d, 0x0901)}, /* Logitech Inc. ClickSmart 510 */
{USB_DEVICE(0x046d, 0x0890)}, /* Logitech QuickCam traveler */
{USB_DEVICE(0x046d, 0x0900)}, /* Logitech Inc. ClickSmart 310 */
{USB_DEVICE(0x046d, 0x0905)}, /* Logitech ClickSmart820 */
{USB_DEVICE(0x046d, 0x08a2)}, /* Labtec Webcam Pro */
{USB_DEVICE(0x046d, 0x0921)}, /* Labtec Webcam */
{USB_DEVICE(0x046d, 0x0920)}, /* QC Express */
{USB_DEVICE(0x046d, 0x0928)}, /* Logitech QC Express Etch2 */
{USB_DEVICE(0x046d, 0x092a)}, /* Logitech QC for Notebook */
{USB_DEVICE(0x046d, 0x08a0)}, /* Logitech QC IM */
{USB_DEVICE(0x046d, 0x08a1)}, /* Logitech QC IM 0x08A1 +sound */
{USB_DEVICE(0x046d, 0x08a3)}, /* Logitech QC Chat */
{USB_DEVICE(0x046d, 0x08b9)}, /* Logitech QC IM ??? */
{USB_DEVICE(0x046d, 0x0929)}, /* Labtec Webcam Elch2 */
{USB_DEVICE(0x046d, 0x092c)}, /* Logitech QC chat Elch2 */
{USB_DEVICE(0x046d, 0x08ae)}, /* Logitech QuickCam for Notebooks */
{USB_DEVICE(0x046d, 0x092b)}, /* Labtec Webcam Plus */
{USB_DEVICE(0x046d, 0x08ad)}, /* Logitech QCCommunicate STX */
{USB_DEVICE(0x046d, 0x08a9)}, /* Logitech Notebook Deluxe */
{USB_DEVICE(0x046d, 0x08aa)}, /* Labtec Webcam Notebook */
{USB_DEVICE(0x046d, 0x08a6)}, /* Logitech QCim */
case 0x046d: /* Logitech Labtec */


Как можно заметить, поддержки нашей камеры нет в файле
Поиск в сети по 0x08d7 модели камеры показал, что такая поддержка имеется в драйвере Logitech видеокамер gspcav1(http://mxhaard.free.fr/spca5xx.html). gspcav1 - это общий файл поддержки видеокамер для *nix систем, однако в скомпилированном виде он требует бинарной совместимости с linux, что нам не подходит.

Т.к. порт graphics/spcaview основан именно на этом драйвере, скачиваем исходники драйвера для анализа http://mxhaard.free.fr/spca50x/Download/gspcav1-20071224.tar.gz. Нас интересует файлы gspca_core.c и gspca.h

Анализ исходника gspca_core.c дает следующий код по модели 0x08d7: {USB_DEVICE(0x046d, 0x08d7)}, /* Logitech QCam STX */


и далее case 0x08d7:
spca50x->desc = LogitechQCCommunicateSTX;
spca50x->bridge = BRIDGE_ZC3XX;
spca50x->sensor = SENSOR_HV7131C;
break;


Осталось добавить эти данные в драйвер spca5xx.c из нашего порта graphics/spcaview и, возможно, появиться поддержка камеры. Но прежде, нужно не забыть стереть уже скомпилированные данные:# cd /usr/ports/graphics/spcaview
# make clean


Теперь наша задача внести изменения в исходник драйвера и откомпилировать его.
Применяем патчи но не компилируем исходник# make patch


Далее редактируем /usr/ports/graphics/spcaview/work/spca5xx-20060402/drivers/usb/spca5xx.c любимым редактором и вносим следующие изменения:
Добавляем в секцию устройства 0x046d {USB_DEVICE(0x046d, 0x08d7)}, /* Logitech QCam STX */


После чего исходный текст будет выглядеть примерно так: {USB_DEVICE(0x046d, 0x08ad)}, /* Logitech QCCommunicate STX */
{USB_DEVICE(0x046d, 0x08a9)}, /* Logitech Notebook Deluxe */
{USB_DEVICE(0x046d, 0x08d7)}, /* Logitech QCam STX */
{USB_DEVICE(0x046d, 0x08aa)}, /* Labtec Webcam Notebook */


Теперь нам необходимо добавить конфигурацию камеры, находим в исходном файле секцию камер Logitech: case 0x046d: /* Logitech Labtec */
case 0x041E: /* Creative cameras */
switch (product) {


Далее идет перечисление всех известных камер Logitech, нам необходимо создать новую секцию и добавить в spca5xx.c данные из драйвера gspca_core.c: case 0x08d7:
spca50x->desc = LogitechQCCommunicateSTX;
spca50x->bridge = BRIDGE_ZC3XX;
spca50x->sensor = SENSOR_HV7131C;
break;


Но это еще не все. Исходный текст spca5xx.c показывает, что для freebsd используются более расширенные настройки! Для добавления необходимой информации ищем какую-нибудь запись с сенсором SENSOR_HV7131C, например: case 0x08a6:
spca50x->desc = LogitechQCim;
spca50x->bridge = BRIDGE_ZC3XX;
spca50x->sensor = SENSOR_HV7131C;
spca50x->header_len = SPCA50X_OFFSET_DATA;
spca50x->i2c_ctrl_reg = SPCA50X_REG_I2C_CTRL;
spca50x->i2c_base = 0;
spca50x->i2c_trigger_on_write = 0;
spca50x->cameratype = JPGH;
info("USB SPCA5XX camera found. Logitech QC IM ");
break;


И копируем недостающие данные в нашу секцию, внеся небольшие изменения в название: case 0x08d7:
spca50x->desc = LogitechQCCommunicateSTX;
spca50x->bridge = BRIDGE_ZC3XX;
spca50x->sensor = SENSOR_HV7131C;
spca50x->header_len = SPCA50X_OFFSET_DATA;
spca50x->i2c_ctrl_reg = SPCA50X_REG_I2C_CTRL;
spca50x->i2c_base = 0;
spca50x->i2c_trigger_on_write = 0;
spca50x->cameratype = JPGH;
info("USB SPCA5XX camera found. Logitech QCam STX ");
break;


Все! Осталось скомпилировать и установить драйвер:# cd /usr/ports/graphics/spcaview
# make && make install && rehash


Теперь проверим работу нашего драйвера# spca5shot -i -d /dev/ugen0
USB SPCA5XX camera found. Logitech QCam STX


[spca5xx_probe:8279] Camera type JPEG
[zc3xx_config:530] Find Sensor HV7131R(c)
[spca5xx_getcapability:2242] maxw 640 maxh 480 minw 176 minh 144
--- video capability ---
name: Logitech QuickCam Communicate Stype: 1
channels: 1
maxwidth: 640
maxheight: 480
minwidth: 176
minheight: 144
--- size and format ---
size: 640x480 352x288 320x240 176x144 160x120
native input format: JPEG
output format: 24bit RGB
--- video picture (initial value) ---
brightness: 32768
hue: 0
colour: 0
contrast: 32768
whiteness: 0
depth: 24
palette: 4

Done.


Ура! Работает! Теперь можно делать снимки с камеры используя команду spca5shot, так же можно настроить доступ к устройству /dev/ugen0 не из-под рута и модифицировать программу онлайн-просмотра камеры, но об этом в другой раз.
PS Так же можно подключить отдельные камеры, которых нет в исходниках, однако, возможно, потребуется эксперементировать с настройками.



Обновлено 28.05.2010 18:34
 

Синхронизируем часы на FreeBSD

E-mail Печать PDF

Синхронизация часов.

Автор: 100kg.

Оригинал - http://www.lissyara.su/articles/freebsd/tuning/ntpdate+ntpd/

 

FreeBSD поставляется с утилитой ntpdate, которая одноразово синхронизирует наши часы, и с сервером NTP ntpd, который используется для опроса других серверов NTP для установки часов на машине или предоставления услуг точного времени.
Мы воспользуемся и тем и другим: ntpdate мы будем использовать при загрузке, а в процессе работы - синхронизировать и раздавать точное время нам поможет демон ntpd.
Для включения ntpdate во время загрузки добавим в файл /etc/rc.conf следующие строки:# cat >> /etc/rc.conf
ntpdate_enable="YES"
ntpdate_flags="-b europe.pool.ntp.org europe.pool.ntp.org europe.pool.ntp.org"
^D


Троекратное упоминание сервера europe.pool.ntp.org говорит об использовании трех разных серверов, включенных в пул серверов времени.
Теперь займемся настройками демона ntpd.
Для начала создадим файл /etc/ntp.conf#
cat > /etc/ntp.conf
server europe.pool.ntp.org
server europe.pool.ntp.org
server europe.pool.ntp.org
server europe.pool.ntp.org
server europe.pool.ntp.org

driftfile /var/db/ntp.drift

restrict 192.168.x.x mask 255.255.255.0 nomodify notrap
^D


Параметрами server мы зададим, какие сервера использовать для синхронизации. Естественно, что мы будем использовать пул серверов времени.
Параметр driftfile задает файл, который используется для хранения смещения частоты системных часов. Программа ntpd использует его для автоматической компенсации естественного смещения часов, позволяя ему поддерживать достаточно правильную настройку, даже если он на некоторый период отключается от внешнего источника информации о времени. Создадим этот файл:# touch /var/db/ntp.drift


Параметр restrict разрешает синхронизировать свои часы с сервером только машинам из нашей внутренней сети.
Для того чтобы сервер NTP запускался при загрузке, добавляем в файл /etc/rc.conf следующие строки:
cat >> /etc/rc.conf
ntpd_enable="YES"
ntpd_flags="-c /etc/ntp.conf -l /var/log/ntpd.log -p /var/run/ntpd.pid"


С синхронизацией часов покончено.

Обновлено 28.05.2010 18:39
 


Страница 4 из 6.

  • Вопросы по поводу написанных статей можно обсудить в нашем сообществе в Вконтакте / Questions about written articles can be discussed in our community in Vkontakte Вопросы по поводу написанных статей можно обсудить в нашем сообществе в  Вконтакте / Questions about written articles can be discussed in our community in Vkontakte
Яндекс.Метрика