ESO Midas 11SEP1.2

Отправил собираться новую версию.

Заодно осилил source service для build service. Первый приз получает сервис под названием download_files (надо в файл _service в проекте воткнуть вот это):
<services>
  <service name="download_files">
  <param name="recompress">yes</param>
  </service>
</services>

Он не просто прочитает spec-файл и попытается скачать все файлы для которых там есть полный url в строчке Source, он к тому-же (это же чудо!) перепакует их сам в нужный формат и сам разберется что скачивать. Например, допустим, Source0 указан вот так: ftp://ftp.eso.org/pub/midaspub/11SEP/sources/%{version}.tar.bz2, при этом на самом сервере нет архива tar.bz2, там есть только tar.gz. Так вот, умный сервис скачает такой архив, который там физически есть, и перепакует его в такой, который нужен.

Документации (как и во всем opensuse) нет, поэтому предлагается смотреть в /usr/lib/obs/service и там можно прочитать в исходниках какие сервисы есть, какие у них параметры и что делают.

p.s. Вообще, считаю, следующий гениальный шаг будет когда build service научится сам автоматически отслеживать хранилища типа PyPi, CPAN, etc и автоматом собирать новые пакеты и пересобирать обновленные. Закоммитил ты свой модуль новый питонный в PyPi, а он через 15 минут уже есть для opensuse в виде пакета. Красота.

PAM и ssh-agent

Захотелось, чтобы можно было входить в систему, используя пароль от ssh-ключа, и при этом чтобы ssh-agent запускался и больше пароль никогда не спрашивал. Все это можно сделать используя модуль pam_ssh для PAM (Pluggable Authentication Modules for Linux).

Настроить его очень просто: надо воткнуть в auth
auth    sufficient      pam_ssh.so
а в session, соответственно
session sufficient      pam_ssh.so

В PAM модули работают как и везде: динамически загружается .so-файл, и запускаются у него функции с наперед известными именами, куда передаются разные параметры, с которыми модуль знает что делать. Первая строчка, таким образом, ответственна за проверку пароля к ssh-ключу, вторая строчка — запуск правильного процесса ssh-agent.

Запуская ssh-agent, pam_ssh.so делает в ~/.ssh файл с именем в духе agent-$HOSTNAME и содержанием вида:
SSH_AUTH_SOCK=/tmp/ssh-qjtjCQkp2852/agent.2852; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2853; export SSH_AGENT_PID;
echo Agent pid 2853;

Вообще говоря, после этого можно в .profile или .bashrc просто выполнить этот файл как кусок скрипта. После этого нужные переменные среды окружения будут иметь нужные значения и ssh правильно подцепит свой агент. Однако, в PAM предусмотрен модуль pam_env ответственный за установку переменных среды окружения. Автоматом почему-то ничего не заработало, но заработало после добавления в /etc/security/pam_env.conf строчек:
SSH_AUTH_SOCK DEFAULT="" OVERRIDE=@{SSH_AUTH_SOCK}
SSH_AGENT_PID DEFAULT="" OVERRIDE=@{SSH_AGENT_PID}

GNU R: график плотности числа точек

Иногда бывает нужно построить то, что называется диаграммой рассеяния (scatter-plot). Когда число точек на графике превышает некоторый предел, график становится почти бесполезен потому-что на нем появляется гигантская клякса (это точки (или другие символы, которые изображаются) многократно налезают друг на друга). В таких случаях предлагается строить график плотности числа точек. Сначала нужно вычислить её (хоть каким-нибудь образом), в GNU R для этого предусмотрена функция kde2d из пакета MASS. Потом полученный объект можно рисовать через contour.

Пример который рисует отличную разноцветную диаграмму:

density <- kde2d(x1,x2,lims=c(lower1,upper1,lower2,upper2))
mycol <- function(n) gray((n+1):0/(n+1))
filled.contour(density,color.palette=mycol)
filled.contour понимает title и все остальное.

smtp_bind_address

Параметр smtp_bind_address для postfix позволяет привязать ip-адрес для соединений. Бывает полезно, когда на одном интерфейсе привязано несколько(много) ip-адресов, при этом одинаково доступный relayhost предпочитает один определенный (либо явно, либо по причине что один из адресов не резолвится в обе стороны).

udev и video4linux

Оказывается, /lib/udev/rules.d/60-persistent-v4l.rules делает символические ссылки на устройства video4linux (/dev/videoN): /dev/v4l/by-id и /dev/v4l/by-path.

Очень удобно оказалось использовать, например, /dev/v4l/by-id/usb-0471_0329_01690000A6480288-video-index0 вместо /dev/video0 (или /dev/video1), когда камер много.

v4l (video for linux) 1.0

Это пост для миграции с первой версии v4l API на v4l2.

Если правильно понимаю, поддержка первой версии была окончательно удалена этим коммитом. Где-то между ядром 2.6.36 и 2.6.37.

dhcp клиенты

В openSUSE 11.4 оказалось два dhcp-клиента: dhclient (авторства ISC из пакета dhcp-client) и dhcpcd (почему-то версии 3.2.3 авторства авторов dhcpcd из одноименного пакета). Кстати, последний наотрез отказался удаляться, объясняя это тем, что пакет с mkinitrd от него зависит.

Переключаются они между собой в файле /etc/sysconfig/network/dhcp, там есть соответствующая переменная DHCLIENT_BIN.

p.s. А все это для чего. Утром словил с dhcpcd вот это:

wlan0: offered 192.168.1.1 from 192.168.0.1 `host.local'
wlan0: got subsequent offer of 192.168.1.2, ignoring 
wlan0: checking 192.168.1.1 is available on attached networks
wlan0: ARPOP_REPLY received from 192.168.1.1 (00:12:34:56:78:9a)

И пришлось использовать dhcp-клиент, который сделал мне хорошо.