svn+ssh: коллективные соединения

При командах выполняемых на удаленном URL, типа copy или merge, subversion иногда требует несколько соединений. Для облегчения работы, можно применить стандартную возможность ssh — использовать одно TCP/IP соединение для нескольких сессий.

Чтобы не испортить настройки клиентского ssh, в секции [tunnels] файла конфигурации ~/.subversion/config зададим нужные настройки как параметры командной строки:
ssh = $SVN_SSH ssh -o "ControlMaster=auto" -o "ControlPath=/home/user/.ssh/svn_ssh-%r@%h:%p" -o "ControlPersist=60"

При этом соединение будет создаваться каждый раз при необходимости, и закрываться через 60 секунд после того, как оно становится невостребованным. ControlPersist=yes оставит соединение навсегда, что, вероятно, не очень безопасно, но зато позволяет комфортно исполнять разные команды, типа commit или update в течении работы, если расходы на создание соединения велики.

quilt и rpm

quilt — это система контроля патчей, в каком-то смысле предыдущая ступень эволюции систем контроля версий.

Пусть есть rpm-пакет и нужно обновить его версию, используя новый архив исходных кодов. При этом патчи останутся старыми, и не гарантируется, что они наложатся на новую версию, или не потребуется вмешательство человека, из-за того, что какой-то патч устарел. После того, как новый архив получен и Version: исправлен, можно прибегнуть к помощи quilt:
quilt setup libdc1394.spec

Эта команда создаст новую директорию в которой будут лежать распакованные исходные коды, символическая ссылка на директорию patches (хранит сами файлы патчей) и файл series (хранит порядок в котором патчи нужно применять). quilt не всегда успешно справляется с патчами, которые завернуты в %if.

Идеологически происходит следующее, у нас есть команда quilt, что-то вроде аналога git или hg, дерево исходников и стек патчей. Стек патчей в чем-то аналогичен ревизиям в системах контроля версий. Используя стек можно переходить от текущего состояния к следующему (применяя патч, quilt push) или к предыдущему (откатывая, quilt pop). Первоначально, мы находимся в самом нижнем состоянии (не модифицированные исходные коды):
>quilt top
Нет применённых патчей
>quilt applied 
Нет применённых патчей
>quilt unapplied 
patches/libdc1394.no-x11.patch
patches/libdc1394.ac.patch
patches/libdc1394-swab_fix.patch
patches/libdc1394.raw1394_set_iso_handler.patch
patches/libdc1394-v4l-2.6.38.patch
patches/libdc1394-visibility.patch

Дальше попробуем наложить первый патч (здесь потребовалась предварительная обработка из-за хитрой структуры директорий в конкретном случае),
>quilt push
Наложение патча patches/libdc1394.no-x11.patch
patching file libdc1394-1.2.2/examples/Makefile.am
patching file libdc1394-2.2.1/configure.in

Текущий патч: patches/libdc1394.no-x11.patch
>quilt top
patches/libdc1394.no-x11.patch
>quilt applied
patches/libdc1394.no-x11.patch

И так далее, пока не закончится весь стек патчей, но скорее всего так просто он не закончится. Задача — обновляя патчи, устранить конфликты. После принудительного применения (quilt push -f) следует вручную просмотреть все конфликтные места и исправить их нужным образом. Каждый патч отслеживает только некоторое число файлов (quilt files), но если отредактирован файл не из списка, то его нужно добавить (quilt add). После того как все исправлено, нужно обновить текущий патч: quilt refresh (это такой аналог commit, который исправляет текущий наложенный патч, основываясь на рабочей директории и предыдущей спрятанной копии)
>quilt refresh
Патч patches/libdc1394-v4l-2.6.38.patch обновлён



udev и camsource

(Пере)запускалка camsource (программы для показывания картинок с веб-камер) с помощью udev:

SUBSYSTEM=="video4linux", ACTION=="add", RUN+="/usr/bin/camsource -r /etc/camsource.conf"

Запускается на старте (когда udev обнаруживается usb-устройства), и перезапускается при их перетыкании (или перетыкивании).

Можно было бы сделать более красиво, т.е. использовать события "add" и "remove" и переменную DEVICE. Однако этому мешает, во-первых, использование нескольких источников в моей конфигурации (и camsource -k выключил бы сразу все), во-вторых какой-то встроенный глюк в самой программе. Дело в том, что запускаясь, процесс почему-то уходит в состояние зомби, и в /proc/NNNNN/fd оказывается пустота. А при использовании параметра [device] код ищет процесс именно по файловым дескрипторам. Иначе говоря, этот параметр вообще не работает.

Применив фантазию к udev, можно например включать трансляцию видео-потока. Что даже удобнее, чем вписывание не комплектуемых init.d-скриптам запуска camsource, ffserver и т.п. во всякие странные места типа /etc/init.d/boot.local.

OBS tar_scm: versionformat

Сервис для OBS под названием tar_scm позволяет автоматически создавать архивы из указанных репозиториев систем контроля версий исходных кодов. Естественно, имеет много параметров, описание которых не так просто найти. На головном web-интерфейсе взаимодействие с сервисами куда-то с недавних пор вообще пропало, там хоть какие-то подсказки содержались.

versionformat — один из самых любопытных параметров, позволяющих хоть как-то оформить название архива, для последующего действия сервиса set_version.

  • Для git в это поле можно указать:
    • @PARENT_TAG@ — bash любезно заменит на ближайший тег
    • поля из --pretty=format для последнего по времени коммита — полный список внизу, какой-то смысл в данной ситуации имеют %ct %cd %h (UNIX таймштамп, дата YYYYMMDD, короткий хэш коммита), причем дефисы будут любезно удалены по дороге sed'ом (даты будут получается в духе 20121221).
  • Для mercurial (hg):
    • поля из --template для последнего по времени коммита — полный список внизу. Огромное богатство для фантазии, есть встроенная опция для latesttag. Во время написания этого текста, не было способа выдать дату в виде YYYYMMDD, без дефисов. Сейчас все дефисы удаляются sed'ом, однако последняя версия tar_scm может быть еще не загружена на головной сервис.
  • svn понимает только %r — номер ревизии

  1. github: obs-service-tar_scm
  2. git show(1)
  3. hg templates

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переименоватьнедокументированный