openSUSE Build Service 1.0.0

Вышел долгожданный релиз, главное его достоинство в том, что он просто работает и просто настраивается.
Исправлены некоторые ошибки, в том числе та самая досадная со сменой паролей:
https://bugzilla.novell.com/show_bug.cgi?id=392057

Ограничение количества соединений с ssh

Используя ssh сервер, легко можно заметить, что существуют злоумышленники которые пытаются подбирать пароли к вашим аккаунтам, или просто использовать часто встречающиеся комбинации. Это создаёт проблему в виде большого количества бесполезных и более того нежелательных соединений к вашему серверу. Модуль hashlimit из пакетного фильтра iptables позволяет интеллектуально ограничить доступ, он устанавливает индивидуальные ограничения для каждой пары srcip,dstport ( как в моем примере ).

iptables -N ssh_input
iptables -A ssh_input \
-m hashlimit \
--hashlimit 5/m \
--hashlimit-burst 5 \
--hashlimit-mode srcip,dstport \
--hashlimit-name ssh \
--hashlimit-htable-expire 3600000 \
-j ACCEPT
iptables -A ssh_input \
-p tcp \
-j REJECT --reject-with tcp-reset
iptables -A INPUT \
-m state -m tcp \
-p tcp --dport 22 --state NEW -j ssh_input


Рассмотрим подробнее... Последняя команда отправляет все запросы на соединение с портом 22 (ssh) в цепочку ssh_input, которая действует по следующим правилам - либо запрос подтверждается и отправляется дальше, либо обработка прерывается и отправляется ответ tcp-reset. Во втором случае подсоединение к ssh будет выглядеть так, как-будто сервер не запущен.


  • --hashlimit 5/m -- подобно модулю limit, это скорость срабатываний

  • --hashlimit-burst 5 -- подобно модулю limit, это максимальное количество срабатываний

  • --hashlimit-mode srcip,dstport -- возможные ключевые слова srcip, dstip, srcport, dstport и любые их комбинации через запятую; hashlimit может составлять свою хэш таблицу на основе любой комбинации указанных параметров. например, при указании srcip - каждая запись будет характеризоваться адресом источника, т.е. для каждого источника будет индивидуальный лимит, независимо от других параметров. При задании например srcip,dstport - индивидуальный лимит будет для каждой пары источника и запрашиваемого им порта, т.е. с одного и того-же адреса при запросе двух разных портов на вашей машине будут разные эффекты

  • --hashlimit-name ssh -- в файле /proc/net/ipt_hashlimit/ssh можно посмотреть непосредственно саму таблицу ограничений

  • --hashlimit-htable-expire 3600000 -- время, которое запись будет храниться в таблице, по истечению этого времени она будет удалена, в данном примере - 1 час ( в миллисекундах )



Таким образом, в то время как ваш ssh сервер будет подвергнут flood-атаке, вы сможете беспрепятственно зайти с любой своей машины на него. В случае использования модуля limit вместо hashlimit в приведённом примере, вам бы пришлось подключаться со злоумышленником на равных условиях, т.е. из-за сработавших ограничений вы бы скорее всего не попали на сервер до окончания атаки.

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

Как действуют --hashlimit и --hashlimit-burst. Легко понять на примере. Пусть у нас есть счётчик, причём каждый раз когда срабатывает правило с limit его значение увеличивается на единицу. Пусть теперь, его первоначальное значение - ноль. Далее вы пять раз соединились с ssh ( как в этом примере ) за достаточно короткое время, после этого счётчик стал равен 5. Больше значения --hashlimit-burst этот счётчик стать не может и далее правила не будут срабатывать ( в этом примере это означает что ваши запросы будут отклонены ). --hashlimit - это скорость с которой счётчик откручивается назад, например: 5/m - это значит пять раз в одну минуту значение счётчика будет уменьшено на единицу, пока не достигнет ноля. Значит, подождав 12 секунд, у вас будет ещё ровно один шанс соединиться с ssh.

Настройка списка рассылки с помощью mlmmj и postfix

http://mlmmj.mmj.dk

mlmmj -- очень простой и тривиальный менеджер списков рассылки, наверное не может сравниться с монстрами типа GNU Mailman. Но, будучи простым и тривиальным, обладает преимуществом в простоте настройки, собственно никакой настройки там и нет, открываете файл README, он помогает создать новый список, открываете TUNABLES, там написано как его сконфигурировать.

Будем считать, что Postfix уже настроен, и посылает и получает письма из внешнего мира.

Для начала, нужно изменить настройки Postfix, установив recipient_delimiter в положение '+', можно сделать либо руками в main.cf, либо командой

postconf -e 'recipient_delimiter=+'


которая изменит main.cf и перезапустит демон.

Теперь можно создать списки рассылки как указано в README. А вот дальше начинаются проблемы с правами доступа. mlmmj хранит свое имущество в /var/spool/mlmmj, соответственно mlmmj-recieve должен иметь право туда писать.

Один из возможных вариантов -- добавить нового системного пользователя и сменить права на /var/spool/mlmmj:

groupadd -r mlmmj
useradd -c "User for mlmmj" -d /var/spool/mlmmj -g mlmmj -r -s mlmmj
chown mlmmj:mlmmj /var/spool/mlmmj


Теперь нужно объяснить Postfix что делать с письмами; для этого создаем в /etc/aliases.d/mlmmj файл с нужным содержимым:

mlmmj-test: "|/usr/bin/mlmmj-recieve -L /var/spool/mlmmj/mlmmj-test/"


и делаем на него

chown mlmmj:mlmmj /etc/aliases.d/mlmmj


Это означает, что mlmmj-recieve будет запущен Postfix от имени пользователя mlmmj ( по умолчанию он запускает от nobody, или смотри man ).

Дальше делаем
setfacl -m user:mlmmj:rwx /etc/aliases.d
SuSEconfig --module postfix


Это маленький кусочек черной магии. SuSEconfig просматривая aliases.d сам сообразит, что нужно переделать базы привязок, но для создания mlmmj.db потребуются права для пользователя mlmmj на создание файлов в aliases.d, поскольку перестройка базы привязок произойдёт от имени того пользователя, которому принадлежит файл. В конце концов, в aliases.d должны оказаться два файла mlmmj и mlmmj.db, владелец которых mlmmj, а в

postconf alias_maps


скажет что-то подобное

alias_maps = hash:/etc/aliases, hash:/etc/aliases.d/mlmmj


В /etc/cron.d/mlmmj добавляем, в соответствии с инструкцией

0 */2 * * *  mlmmj /usr/bin/mlmmj-maintd -F -L /var/spool/mlmmj/mlmmj-test

IDE

Собственно, нечего добавить.



upd: ну как нечего... нарисовал сам в inkscape, названия из wikipedia, да дело то вовсе не в том

Принтсервера D-Link

Тут товарищ вчера собственноручно подавил последнее сопротивление точки доступа D-Link'овской, которая как принт-сервер умеет работать. Модель конкретную не знаю, да и не важно. Кто-бы мог подумать что название очереди LPD будет lpUSB0. Меня больше другое удивило - под альтернативной ОС требовалась установка специальных программ для того чтобы заставить печатать по сети, однако альтернативная ОС умеет печатать через LPD из коробки практически, надо только установить драйвера нужные с диска, в интернете есть инструкций море с картинками.

Полезная ссылка прилагается: Gentoo HOWTO

eBOX-4300

Дали поиграть что-то типа такого компьютера.
Сделано на платформе VIA: VIA Eden 500Mhz и встроенная DDR2 512 Мб, из устройств хранения данных - разъём CompactFlash, который обнаруживается как Primary Slave IDE. Все в среднем работает, незначительный конфуз вышел только когда via82cxxx из ядра 2.6.18.2 (которое на загрузочном диске openSUSE 10.2) отказался признавать устройство IDE-контроллер 1106:5324 (оно-же VIA CX700M2). Однако, что интересно, такой-же модуль из 2.6.18.8 (которое в том же дистрибутиве, но в обновлениях) об этом устройстве знает. Смущают две вещи - температурный диапазон от 0°С, и торчащая из корпуса карта памяти, которая играет роль диска. С такими же размерами (12x12 см.) в этой же линейке есть и мощнее модели. Резюме такое: маленький, дешёвый и достаточно мощный, а самое главное тихий и потребляет не так много электричества.

00:00.0 Host bridge: VIA Technologies, Inc. CX700 Host Bridge (rev 03)
00:00.1 Host bridge: VIA Technologies, Inc. CX700 Host Bridge
00:00.2 Host bridge: VIA Technologies, Inc. CX700 Host Bridge
00:00.3 Host bridge: VIA Technologies, Inc. CX700 Host Bridge
00:00.4 Host bridge: VIA Technologies, Inc. CX700 Host Bridge
00:00.7 Host bridge: VIA Technologies, Inc. CX700 Host Bridge
00:01.0 PCI bridge: VIA Technologies, Inc. VT8237 PCI Bridge
00:08.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
00:0f.0 IDE interface: VIA Technologies, Inc. Unknown device 5324
00:10.0 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 90)
00:10.1 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 90)
00:10.4 USB Controller: VIA Technologies, Inc. USB 2.0 (rev 90)
00:11.0 ISA bridge: VIA Technologies, Inc. CX700 PCI to ISA Bridge
00:11.7 Host bridge: VIA Technologies, Inc. CX700 Internal Module Bus
00:13.0 PCI bridge: VIA Technologies, Inc. CX700 Host Bridge
01:00.0 VGA compatible controller: VIA Technologies, Inc. Unknown device 3157 (rev 03)
02:01.0 Audio device: VIA Technologies, Inc. VIA High Definition Audio Controller (rev 10)

processor       : 0
vendor_id : CentaurHauls
cpu family : 6
model : 13
model name : VIA Eden Processor 500MHz
stepping : 0
cpu MHz : 498.748
cache size : 128 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce apic sep mtrr pge cmov pat clflush acpi mmx fxsr sse sse2 tm nx up pni est tm2 xtpr rng rng_en ace ace_en ace2 ace2_en phe phe_en pmm pmm_en
bogomips : 998.55

openSUSE Build Service 0.9

Вчера вышел релиз openSUSE Build Service 0.9. Это пакет серверных приложений позволяющих собирать пакеты под различные архитектуры и дистрибутивы на удалённом сервере в практически автоматическом режиме.

От себя добавлю что версия 0.9 действительно работает и готова к установке и использованию. Пакет сопровождается свежей инструкцией по настройке и установке :). Очень важной особенностью является возможность взаимодействия с другими серверами. Теперь, например, чтобы собрать пакет под какую-то версию дистрибутива на своем сервисе не нужно держать копию всех пакетов на своём диске, ваш сервер может соединятся с build.opensuse.org и скачать от туда эти пакеты.

Установка и настройка заняла пять минут, в итоге получается нечто очень похожее на build.opensuse.org но на вашей машине. Пакеты действительно собираются. Необходимо так же особо отметить, что сборка может проводиться на нескольких машинах, объединённых в локальную сеть, что ускоряет её процесс, если в очереди много пакетов.

Написано это на ruby и использует lighttpd в качестве web-сервера. Особо хочу обратить внимания на дикие тормоза в работе всего этого.

Конвертер IDE/SATA на USB

Попал в закрома родины девайс. Самое ценное в этом комплекте - блок питания ноутбучного вида 220В на 4-пинное питание 5/12В. С его помощью можно питать диски 3.5 с 40-пинным IDE, или сам девайс при подключении к нему SATA устройств. Диски ноутбучного форм-фактора 2.5 c 44-пинным IDE могут питаться прямо с шины USB. Причем, если вдруг диск потребляет больше чем сможет выдать один порт, предусмотрен второй штурок USB, исключительно для снятия дополнительного питания с другого порта.

Работает через usb-storage, соответсвенно устройства опознаются как обычные SCSI-устройства.

Сеть через IEEE1394

Сегодня поднял сеть через ieee1394 интерфейс между двумя компьютерами - заработало все сразу, стало даже не очень интересно. Применения этой штуке пока не могу придумать, но сам по себе интерфейс все больше и больше впечатляет.

Есть модуль в ядре, который называется eth1394, все остальное настраивается как обычный Ethernet-порт.





Два компьютера ( один из которых ноутбук ), были связаны через ieee1394, 3-х метровым кабелем ( 4 на 6 ) - все тривиально: один конец - в один компьютер, другой - в другой. Использовался openSUSE 10.2 с ядром 2.6.18.8.

ESO Midas 08FEBpl1.0

На FTP у европейцев давно валяется, анонса так и не было, терпение моё за сим лопнуло и я отправил собираться новую версию на openSUSE BuildService.

ftp://ftp.eso.org/pub/midaspub/08FEB

Репозитарии, которые добавлять:

http://download.opensuse.org/repositories/science/

Комментарии на любом известном мне языке приветствуются в почту или jabber.

История о пользователях Jabber, которые никогда не слышали о Jabber.

Jabber - это основанный на XMPP протокол обмена мгновенного обмена сообщениями. Все стандарты RFC 3920, RFC 3921, RFC 3922, RFC 3923, RFC 4622, RFC 4854, RFC 4979, и около двухсот XEP'ов (XMPP Extension Protocols) могут быть найдеты на сайте www.xmpp.org

Это открытый протокол, любой человек или организация могут написать свой клиент или сервер, которые будут поддерживать протокол и расширения в том или ином объеме. Любой человек или организация могут установить на своем компьютере Jabber сервер и подключится к федерации ( ну, или не делать этого ).

Поиск в google ( который я оставляю на совести читателя ) позволяет узнать о множестве серверов и клиентов Jabber, под различные ОС, распространяемые под различными лицензиями ( естественно, в том числе и GPL ).

А теперь о тех людях, которые используют Jabber, но, возможно, никогда о нем не слышали:

Пользователи GTalk/GMail



Если у вас есть зарегистрированная почта на GMail или вы используете программу GTalk, вы используете XMPP. Не могли не заметить "чат" слева в веб-интерфейсе.

Если у вас есть почта GMail, но вы никогда не использовали GTalk, сначала вам следует пройти по ссылке

https://www.google.com/accounts/Login?service=talk

и ввести там ваши логин и пароль вашей учетной записи google.

Теперь вы можете использовать любой Jabber клиент ( в том числе и GTalk ), чтобы подключиться используя вашу учетную запись в GTalk/GMail.

Так же в ближайшем будущем, возможно полноценное появление официального гейта в сети AIM/ICQ на сервере google, что естественно позволит общаться с пользователями этих сетей.

Настройки:


JabberID (JID): ваш_адрес@gmail.com
Пароль: ваш пароль
Использовать SSL
Разрешить передачу пароля открытым текстом
Сервер: talk.google.com
Порт: 5223


Пользователи почты Yandex




JabberID (JID): ваш_адрес@ya.ru ( обязательно ya.ru, даже если почта - yandex.ru )
Пароль: ваш пароль
Использовать SSL
Разрешить передачу пароля открытым текстом
Сервер: xmpp.yandex.ru
Порт: 5223


В вашем контакт-листе автоматически будет присутствовать бот, который оповестит о новых письмах, пришедших на ваш почтовый ящик на Yandex.

Пользователи LiveJournal



LJTalk тоже использует протокол XMPP.


JabberID (JID): ваш_адрес@livejournal.com
Пароль: ваш пароль
Сервер: livejournal.com
Порт: 5222


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

Пользователи NextMail.ru



Видимо, администрация NextMail проявила большую заботу о своих пользователях: на сервере доступны гейты в AIM/ICQ и MSN. NXT-IM тоже использует XMPP и гейты для доступа к сетям AIM/ICQ и MSN.
По сообщениям некоторых пользователей, гейты доступны для публичного доступа, т.е. можно использовать гейт в AIM/ICQ например не имея учетной записи Jabber конкретно на сервере nextmail.ru.


JabberID (JID): например ваш_адрес@nextmail.ru
Пароль: ваш пароль
Использовать SSL
Разрешить передачу пароля открытым текстом
Cервер: ваш сервер
Порт: 5223


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

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


Просто установите Jabber клиент и зарегистрируйте себе учетную запись на любом понравившемся сервере.

Борьба с Video 4 Linux 2

Сегодня я боролся с pwc драйвером, вернее с интерфейсом Video 4 Linux 2. Поскольку дома из устройств работающих через v4l оказалась только одна камера, не считая ноутбучной, и не считая цифрового фотоаппарата 2000 (!) года покупки, использовался образец Philips SPC 900NC вместе с драйвером pwc из ядра 2.6.18 и pwc 10.0.12-rc1 с ядром 2.6.8.

Пара полезных ссылок, которые должен запомнить каждый:


Теперь имею представление, как этим интерфейсом пользоваться. Написал простенькую программку, которая тут-же гордо сообщила:

Camera capables:
Driver: pwc
Device: Philips SPC 900NC webcam
Bus: usb-0000:00:1d.2-2
Kernel: 10.0.12
Capables:
* capture
* readwrite
* streaming
Formats:
0 (1) Raw Philips Webcam [843274064]
1 (0) 4:2:0, planar, Y-Cb-Cr [842093913]
Current: 640x480 460800 842093913


или с другой камерой, Philips 840K:

Camera capables:
Driver: pwc
Device: Philips 740 webcam
Bus: usb-0000:00:10.0-1
Kernel: 10.0.12
Capables:
* capture
* readwrite
* streaming
Formats:
0 (1) Raw Philips Webcam [843274064]
1 (0) 4:2:0, planar, Y-Cb-Cr [842093913]
Current: 640x480 460800 842093913


А вот дальше началось самое интересное, поскольку опытным путём было выяснено, что VIDIOC_STREAMON и VIDIOC_STREAMOFF останавливает ( или запускает соответственно ) передачу и освобождают канал:

B:  Alloc=  0/900 us ( 0%), #Int=  0, #Iso=  0


Этот факт особенно радостен, т.к. например camsource работает так, что драйвер pwc дропает неиспользованные кадры, а канал постоянно занят. Поэтому при подсоединении двух камер к компьютеру на базе Vortex86 обнаружилось, что usb-хост тянет передачу с двух камер в формате 640x480 только при максимальной компрессии, которая сказывается на качестве изображения. Т.е. это открываешь девайс, потом сцапал кадр и затаился на минуту, сцапал ещё...

В то же время, к сожалению, действие флага PWC_FPS_SNAPSHOT не было вообще обнаружено.

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

web-камера

Опять засыпало снегом, ничего не видно уже вторые сутки. Датчики ветра опять примерзли )



А вот тут снег начал отваливаться от неё:



Веб-камеры Philips SPC 900NC, работает с pwc драйвером. Кроме нескольких замечаний, работает нормально.

update: забыл, драйвер работает на ядре linux 2.6.8.

Перестановка байтов

Что-то последнее время мне приходится заниматься исключительно переделыванием 16-битных целых чисел из MSB в LSB и назад. То-ли от того это что камера IIDC в непонятном формате отдает кадры, то-ли от того это что FITS в непонятном формате их хранит, но скорее всего просто потому, что компьютеры у меня x86 совместимые.

Итак, стандарт POSIX.1-2001 дает нам отличную для этого функцию - swab, в glibc 2.5 реализована она следующим образом:


void
swab (const void *bfrom, void *bto, ssize_t n)
{
const char *from = (const char *) bfrom;
char *to = (char *) bto;

n &= ~((ssize_t) 1);
while (n > 1)
{
const char b0 = from[--n], b1 = from[--n];
to[n] = b0;
to[n + 1] = b1;
}
}


По моим замерам в моей системе реализация, с эталонным количеством 51.2 мегабайт мусора, справляется в среднем за 110744 миллионных долей секунды.

Но так как просто так было не интересно, а в списке рассылок libdc1394-devel была год назад была обсуждена эта проблема и промелькнуло слово SSE2 ( кстати, новая спецификация IIDC позволит в теории указывать порядок байтов, только где-же таких камер взять нам? ), мой вариант написанный сегодня с использованием SSE2:


void swab_sse2(const void *from, void *to, ssize_t n) {
const char xmm_mask_1[] __attribute__ ((aligned(16))) = {0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};
const char xmm_mask_2[] __attribute__ ((aligned(16))) = {0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};

const char *cfrom = (const char *) from;
char *cto = (char *) to;

asm("\
movapd (%0),%%xmm2; \n\
movapd (%1),%%xmm3; \n\
" :
: "r" (xmm_mask_1), "r" (xmm_mask_2)
);

ssize_t i = 0;
while( i < n && ( n - i ) >= 16 ){

asm("\
movupd (%0),%%xmm0; \n\
movapd %%xmm0,%%xmm1; \n\
pslldq $1,%%xmm0; \n\
psrldq $1,%%xmm1; \n\
andpd %%xmm2,%%xmm0; \n\
andpd %%xmm3,%%xmm1; \n\
orpd %%xmm0,%%xmm1; \n\
movupd %%xmm1,(%1); \n\
" :
: "r" (from + i), "r" ( to + i ) );

i += 16;
}

while ( i < n && ( n - i ) >= 2 ){
const char b0 = cfrom[i++], b1 = cfrom[i++];
cto[i - 1] = b0;
cto[i - 2] = b1;
}
}


Компилятору gcc надо скормить -msse2, для компиляции безобразия. Работает в среднем за 98323 миллионных секунды. откуда делаем вывод, что никакого толка в этой затее нет, а происходит некое соревнование меня и оптимизатора gcc :)

p.s. На ассемблере писал первый раз в жизни... и больше не буду )

update: только вчера заметил, что можно обойтись тремя регистрами вместо четырех.

Петиция VIA Technologies по поводу нормальной поддержки Linux.

Собственно, в хозяйстве: ноутбук, старинная материнка на VIA и, главное, два VIA-Epia.
Не в восторге особенно от видео на VIA-Epia, от поддержки сенсоров I2C. Хотя все остальное вроде и работает.

http://www.petitiononline.com/vialinux/petition.html