pwdutils RIP

Широко анонсированный конец света начал потихоньку наступать. Спустя пару месяцев с момента написания моего предыдущего поста shadow-utils vs. pwdutils, основной разработчик pwdutils Торсен Кукук (Thorsten Kukuk) взял и «тихо и незаметно» выпилил pwdutils из следующего релиза openSUSE 12.3 в пользу shadow (Вероятно восклицая в этот момент «Стой и не шевелись! Я тебя породил, я тебя и убью!»).

Репортаж с места события:

Возрадуемся же необходимости оборачивать свои spec-файлы очередными несвежими условными операторами, впрочем я уже давно и так это делаю:
%if 0%{?fedora} || 0%{?rhel_version} || 0%{?centos_version}
%define usermod_A /usr/sbin/usermod -a -G
%else
%define usermod_A /usr/sbin/usermod -A
%endif

p.s. Неужели pam_unix2.so будет следующей жертвой унификации?

OBS submit request top

There was a discussion on submit requests. Adrian Schröter and Jos Poortvliet suggested to use OBS api to generate some kind of reports on pending times. Here is a test (I will publish this python script on github or something like that). I've filtered out all "home:" projects and built following table. To my surprise, there are only a little stalled requests.


Generated at: 2013-04-13 05:27:41.044818
RequestPending timeProjectPackage
1317 1680 dayssystem:managementpuppet
25359 1227 daysYaST:Web:STABLEwebyast-vendor_en
31953 1158 daysMoblin:Factorygnome-session
33643 1138 daysMoblin:Factorygnome-settings-daemon
33644 1138 daysMoblin:Factorydalston
33868 1136 daysMoblin:Factoryicon-theme-dmz-cursors
38905 1081 daysMoblin:2.0dalston
55428 855 dayssecurity:CASACASA-kwallet
55429 855 dayssecurity:CASACASA_auth_token_client
55431 855 dayssecurity:CASACASA_auth_token_server
69864 705 dayssystem:wicdwicd
72401 681 daysisv:dell:communitypython-ctypes-rhel
74258 661 daysnet-snmp
74259 661 daysnet-snmp
74260 661 daysnet-snmp
75895 644 daysnetwork:ifolder:server_stable
110363 387 daysMaemo:Mer:Extras:Importopengfx
123245 315 daysisv:microsoftRHEL6
131196 236 daysopenSUSE:11.0:Update:Test
134952 206 daysBanshee:Legacyipod-sharp
134958 206 daysBanshee:Legacypodsleuth
134959 206 daysBanshee:Legacyndesk-dbus-glib
134960 206 daysBanshee:Legacyndesk-dbus
136458 195 daysGNOME:Evolution:mapievolution-mapi
137714 184 daysMaemo:Mer:Extras:Import
138490 177 daysdevel:languages:lualuaexpat
145153 121 daysgames:WorldForgewfmath
145154 121 daysgames:WorldForgeskstream
145155 121 daysgames:WorldForgelibwfut
145156 121 daysgames:WorldForgelibdevil
145162 119 daysdevel:languages:luatolua++
145501 119 daysNovell:NTSsupportutils-plugin-susecloud
145520 119 daysisv:ownCloud:communitypatchinfo
147640 94 daysdevel:languages:lualua-lgi
147641 94 daysdevel:languages:lualua51-lgi
151409 66 daysArch:Extra
151535 65 daysArch:Core
153990 64 daysMono:Beta
154756 64 daysVirtualization:openSUSE11.4
154759 64 daysspins:open-pc:kde
155682 54 daysApache:Modulesapache2-mod_authz_unixgroup
155683 54 daysApache:Modulespwauth
158065 35 daysApache:Modulesapache2-mod_authn_sasl
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158089 34 daysopenSUSE:Evergreen:11.4drbd.64
158556 32 dayswindows:mingw:win32mingw32-cross-nsis
158558 32 dayswindows:mingw:win32mingw32-cross-nsis-plugin-zipdll
159540 28 daysJava:baseclojure
159797 25 dayssecurity:netfilterSuSEfirewall2
159894 25 daysdrivers:nicr8168
160430 22 daysnetwork:ha-clustering:Factorycorosync
160446 22 dayssecurity:passwordmanagementpassword-store
160510 22 daysnetwork:telephony:asterisk-11
160725 20 daysisv:ownCloud:community
160726 20 daysisv:ownCloud:communityowncloud
160727 20 daysisv:ownCloud:communityqtkeychain
160794 19 daysnetwork:storagebcache-tools
160846 19 daysX11:wxWidgetswxWidgets
160961 18 daysArchiving:Backuprsync
160962 18 daysArchiving:Backuplibrsync
161043 18 daysArchiving:Backupdkopp
160885 17 daysKDE:Qt50libqt5-qtwebkit
161474 16 daysX11:Cinnamon:Factorycinnamon-screensaver
161616 15 dayssecurity:passwordmanagement
162321 10 daysApache:Modulesapache2-mod_authn_otp
162491 9 daysutilitiesbyobu
162528 9 daysfilesystemslibvshadow
162537 9 daysopenSUSE:Toolsobs-service-verify_file
162581 8 daysvdr
162074 7 days, 22 hoursdevel:openSUSE:Factory:legal-queuewhich
162691 7 days, 21 hoursopenSUSE:12.3:Updatepesign-obs-integration.1510
162691 7 days, 21 hoursopenSUSE:12.3:Updatepesign-obs-integration.1510
162691 7 days, 21 hoursopenSUSE:12.3:Updatepesign-obs-integration.1510
162691 7 days, 21 hoursopenSUSE:12.3:Updatepesign-obs-integration.1510
158276 7 days, 16 hoursdevel:openSUSE:Factory:legal-queuesazanami-fonts
162931 7 days, 6 hoursfilesystemslibsmdev
162932 7 days, 6 hoursfilesystemslibsmraw
162933 7 days, 6 hoursfilesystemslibodraw

shadow-utils vs. pwdutils

Существуют два пакета утилит: shadow-utils и pwdutils (применяется в SUSE). Служат они для одной цели — редактирования групп и пользователей, но при этом значения набора параметров отличаются. Среди шестерки утилит user{add,mod,del} и group{add,mod,del}, к счастью, наблюдается некоторая систематика.

В shadow-utils следующие параметры имеют всегда одинаковое значение (в pwdutils отсутствуют, если явно не указано обратное):
КлючЗначение
-Dизменяет значения по умолчанию
-Kkey=value для значений по умолчанию
-Rзапускать в chroot
-Zпользователь SELinux

При этом ключи pwdutils другое (в shadow-utils отсутствуют, если явно не указано обратное):
КлючЗначение
-DDN для LDAP
-Pпуть к /etc/passwd и /etc/shadow

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

С проблемами первой условной группы можно было бы бороться используя явные длинные названия. Это делает скрипт более длинным, но и более явным. Однако, для -e длинные варианты отличаются: --expiredate и --expire.

useradd

КлючShadowPwd
-Mне создавать /homeнет
-Nне создавать группу пользователюнет
-Uсоздать пользователю одноименную группумаска umask для домашней директории
-bбазовый каталог, вместо /homeнет
-lне добавлять в lastlogнет

usermod

КлючShadowPwd
-Aнетдобавить в группу (аналог -a -G)
-Rзапускать в chrootудалить из группы
-a(вместе с -G) добавить в группунедокументированный

groupadd

КлючShadowPwd
-fне ругаться, если группа уже естьнедокументированный

groupmod

КлючShadowPwd
-Aнетдобавить пользователя в группу
-Rзапускать в chrootудалить пользователя из группы
-nпереименоватьнедокументированный

Трансляция видео

Трансляция видео потока делается следующим образом. Понадобятся ffserver и ffmpeg. Первый для непосредственно формирования и отдачи потока, второй для получения видео и аудио из нужных источников.

У ffserver есть документация: http://ffmpeg.org/ffserver.html, что хорошо. Понадобится только понять как настроить ffserver.conf и потом его скормить на запуске. Пример с описанием есть например тут: http://ffmpeg.org/sample.html. Внутри есть два основных понятия: feed — это то чем кормит сервер запущенный ffmpeg и stream — это собственно поток, который отдается через HTTP (порт тоже задается в конфигурационном файле) в нужном формате. Ну и есть такой псевдо-фид как status, который показывает HTML-страницу со статусом сервера: количество соединений, статус фида и потоков.

Настраивать потоки можно как хочется, но соразмерно с возможностями кодеков и аппаратуры. Кстати, вместо AudioCodec mp3 надо писать AudioCodec libmp3lame, но авторы об этом почему-то умолчали. И видео через theora тоже не умеет по какой-то причине. При этом все сообщения об ошибках обычно настолько туманны, что понять в чем дело не помогают ни чем.

После чего ffserver запускается, ему скармливается нужный конфигурационный файл, и начинается второй акт этой пьесы. Вообще говоря, выглядит просто: надо запустить ffmpeg, подав ему на вход собственно аудио и/или видео, а выход отправив по адресу вашего фида (например http://localhost:8090/feed1.ffm). Но при промахе с параметрами чрезвычайно бесполезные сообщения об ошибках не помогут понять в чем дело.

Дальнейшее зависит от конкретного оборудования. У меня была веб-камера со встроенным микрофоном. Микрофон работает как usb-аудио карта, видео через — video4linux2:
ffmpeg -f alsa -i hw:1 -f video4linux2 -s 320x240 -r 15 -i /dev/video0 http://localhost:8090/feed1.ffm
Где -f alsa -i hw:1 — alsa на устройстве номер "1" (системная звуковая карта стало быть — "hw:0"), -f video4linux2 -s 320x240 -r 15 -i /dev/video0 — формат и количество кадров в секунду должны быть согласованы с настройками потока из ffserver иначе ничего не выйдет. Кроме того, параметры -s и -r нужно писать до -i, а не после.

После того, как ffmpeg успешно запустился и начал показывать статусную строку типа
frame= 7209 fps= 15 q=3.5 size=   35632kB time=480.47 bitrate= 607.5kbits/s
можно открывать, смотреть и слушать поток по тому адресу, который заказан в ffserver.conf.



Mercurial

Минимальная инфраструктура для работы с распределенной системой контроля версий Mercurial настраивается следующим образом.

Во-первых, нужно где-то разместить репозитории. Поскольку никаких других рекомендаций не поступало, по аналогии с cvs и svn будем класть все в /srv/hg/repos. Во-вторых, нужно обеспечить теперь доступ разным пользователям, которые счастливо существуют на компьютере и что-то там делают. Основная инструкция тут: http://mercurial.selenic.com/wiki/MultipleCommitters. Краткая инструкция: по аналогии с cvs и svn, создаем системную группу hg, системного пользователя hg, добавляем всех пользователей в группу hg.

Схема создания нового репозитория выглядит следующим образом:
cd repos/
mkdir test
chown -R hg:hg test
cd test/
hg init
chown -R hg:hg .hg
chmod -R g+w .hg
chmod g+s .hg .hg/store .hg/store/data

Mercurial >1.0 сам, о чудо, разбирается с правами доступа и делает так, чтобы все кому надо могли туда писать. Вообще говоря, данный подход (пулить всем вместе в один репозиторий) полностью противоречит идеологии hg.

В-третьих, никак не обойтись без веб-интерфейса. В /usr/share/doc/packages/mercurial живет пример под названием hgweb.cgi. Кладем его в /srv/hg/bin/hgweb.fcgi и меняем примерно следующим образом (чтобы через FastCGI работал):
#!/usr/bin/python

config = "/srv/hg/config"

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
from flup.server import fcgi
application = hgweb(config)
fcgi.WSGIServer(application).run()

Конфигурация для lighttpd (обычно кладется куда-нибудь в /etc/lighttpd/vhosts.d/hgweb.conf):
fastcgi.server += (
        "/hg" => ((
                        "bin-path" => "/srv/hg/bin/hgweb.fcgi",
                        "socket" => socket_dir + "/hgweb.sock",
                        "max-procs" => 1,
                        "check-local" => "disable",
                        "fix-root-scriptname" => "enable",
        ))
)

Что писать в /srv/hg/config подсказывают в hg help hgweb:
[paths]
/ = /srv/hg/repos/*
/home/user = /home/user/hg/**

Последняя строчка для того, чтобы пользователям было не обидно, там они хранят свои личные репозитории. Вот только . Поля "Description" и "Contact" настраиваются в .hg/hgrc персонально для каждого репозитория. Кроме того, теперь через http возможно анонимное клонирование.
В openSUSE перерабатывают страницу software.opensuse.org и придумали полезную вещь, встраиваемый в веб-страницы виджет с информацией о пакетах; инструкция здесь.

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

postifx в SuSEconfig


В openSUSE 12.1 postfix был откручен(750685) от SuSEconfig, поэтому запускать тот самый волшебный скрипт теперь надо так:
MD5DIR=/var/adm/SuSEconfig/md5 /usr/sbin/SuSEconfig.postfix

Все остальное работает как раньше: /etc/sysconfig/postfix, /etc/sysconfig/mail остаются в силе. Базы алиасов пересобираются сами при rcpostfix restart.



Режим EPP для Winbond W83627D

Попался компьютер (с Intel Atom), в котором, не смотря на все установки в BIOS, LPT-порт не попадал в EPP-моду. Симптоматика стандартная — EPP-timeout не сбрасывается. Оказалось, что контроллер W83627D, несмотря на все установки BIOS, оставался в ECP-моде, либо сбрасывался туда по какой-то причине.

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

Запуск enable_epp добавляется например в udev.

Книги по C++

За последний месяц уже два человека спросили какие книжки читать чтобы изучить C++.

Обращение к незнакомцу.
Если вы владеете C++ в совершенстве, данный пост может глубоко задеть ваши религиозные или иные чувства. Мне бы этого очень не хотелось, поэтому чтобы избежать этого — не стоит продолжать чтение. Спасибо за внимание.


Во-первых, новый стандарт (C++11) выпустили, а книжек по новому стандарту пока еще мало написали. Но в этом поможет краткий справочник на странице Страуструпа.

Во-вторых, есть такой двухтомник:
  • Брюс Эккель — Философия С++. Введение в стандартный С++
  • Брюс Эккель, Чарльз Эллисон — Философия С++. Практическое программирование
Кстати, в оригинале называется более красиво — "Thinking in C++". После прочтения, по-идее, должно сформироваться «приятное внутреннее ощущение понимания».

В-третьих, конечно же есть:
  • Бьерн Страуструп — Язык программирования С++
  • Николай Джосьютис — C++. Стандартная библиотека
Первая книга в представлении не нуждается (кто такой Страуструп можно посмотреть в википедии), вторая — очень толковый справочник по стандартной библиотеке, повествующий что и как с ней можно сделать.

В-четвертых:
  • Андрей Александреску — Современное проектирование на С++
У человека, который прочитал предыдущие четыре позиции, почти наверняка вызовет бурные эмоции.

В-пятых:
  • Дэвид Вандевурд, Николай Джосьютис — Шаблоны C++. Справочник разработчика
  • Герб Саттер — Решение сложных задач на С++
  • Герб Саттер — Новые сложные задачи на C++
  • Герб Саттер, Андрей Александреску — Стандарты программирования на С++
  • Эрих Гамма, Ричард Хельм, Ральф Джонсон и Джон Влисседс — Приемы объектно-ориентированного проектирования

Обновление, в-шестых:
  • Стивен Прата - Язык программирования C++. Лекции и упражнения, 6-е издание
  • — перевод оригинального названия "C++ Primer Plus" весьма спорен. Вы где видели конспект лекций на 1200 страниц печатного текста? Тем не менее, в новом издании автор не только рассказал о почти всех нововведениях C++11, но и еще постарался объяснить зачем все это надо и как этим пользоваться.

Все книжки есть (или были) в магазинах или в библиотеке.