ОМСКАЯ ГРУППА ПОЛЬЗОВАТЕЛЕЙ LINUX » Статьи http://omsklug.com Свобода - это ответственность. Вот почему все её так боятся. Бернард Шоу Fri, 10 Nov 2017 17:30:02 +0000 en hourly 1 http://wordpress.org/?v=3.2.1 Быстрый способ поворота видео с помощью avconv http://omsklug.com/2015/11/video-rotation-avconv/ http://omsklug.com/2015/11/video-rotation-avconv/#comments Sat, 07 Nov 2015 16:54:58 +0000 linuxmasterz http://omsklug.com/?p=1971 Intro

Всем известно, что частенько кое-кто снимает видео странно: повернув смартфон или планшет вертикально. Или ещё как нетрадиционно. Вот с этим мы и будем бороться.

Prerequisitives

Устанавливаем форк ffmpeg (Почему? Да потому, что у меня Ubuntu 14.04):

sudo apt-get install libav-tools

Script

Можно сделать полноценный скрипт или пользоваться однострочником BASH:

for i in *.3gp; do avconv -i "$i" -c:v h264 -c:a aac \
-strict experimental -vf "transpose=1" "encoded/$i"; done

Параметр vf – применимые фильтры к видео.

Фильтр transpose может иметь вот такие значения:

  • 0 – 90° CCW и Vertical Flip (по умолчанию)
  • 1 – 90° CW
  • 2 – 90° CCW
  • 3 – 90° CW и Vertical Flip

Параметр c:v – кодек видео.

Параметр c:a – кодек аудио.

Посмотреть какие кодеки доступны для использования:

avconv -codecs

Посмотреть  какие кодеки используются в обрабатываемых файлах:

avconv -i <имяфайла>

Epilogue

Вот таким нехитрым способом можно занять компьютер полезной деятельностью по перевороту видео. Ваши предложения, улучшения – в комменты.

]]>
http://omsklug.com/2015/11/video-rotation-avconv/feed/ 0
Косяки с установкой redmine_git_hosting в Debian 8 Jessie http://omsklug.com/2015/09/smashing-redmine-git-hosting-in-deian-jessie/ http://omsklug.com/2015/09/smashing-redmine-git-hosting-in-deian-jessie/#comments Tue, 29 Sep 2015 18:19:26 +0000 Shroom http://omsklug.com/?p=1954 .local p {text-align: justify!important; text-justify: inter-word!important;} .local a {color: rgb(16, 8, 96)!important;} .local a:visited {color: Gray!important;} .local a:hover {text-decoration: underline; color: Blue!important;} .local pre {overflow-x:auto;} .local code {font-family: Monospace,Courier!important;} .local code > span.kw { color: #268BD2; font-weight: bold; } .local code > span.dt { color: #268BD2; } .local code > span.dv { color: #D33682; } .local code > span.bn { color: #D33682; } .local code > span.fl { color: #D33682; } .local code > span.ch { color: #4070a0; } .local code > span.st { color: #2AA198; } .local code > span.co { color: #93A1A1; font-style: italic; } .local code > span.ot { color: #A57800; } .local code > span.al { color: #CB4B16; font-weight: bold; } .local code > span.fu { color: #268BD2; } .local code > span.er { color: #D30102; font-weight: bold; }
Icon for application-x-ruby MIME type

До меня время от времени доходили слухи, что установка и сопровождение Redmine — это не то, чтобы адЪ, но как минимум геморрой неслабые головняки. Вероятно, я подогнался под эту тему и в первый раз установка заняла у меня дня три. Во второй раз я уложился в пару дней. В последнее время я делаю успехи, поскольку установка плагина redmine_git_hosting прошла не более, чем за сутки. И это не может не радовать. Последовательность шагов по установке очень подробно описана в руководстве от разрабов, которое можно найти здесь: Get started. Собственно, именно такого порядка действий я и буду придерживаться в статье. Вследствие этого изложенный здесь материал может показаться фрагментарным и несколько несвязным. И если вам так и кажется, вы, пожалуй, правы…

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

Начало: клонирование и сборка

На всякий пожарный инструкция предупреждает нас о необходимости сбэкапить базу и остановить Redmine. Благоразумно воспользуемся этим советом и приступим…

Как ни странно, в самом начале процесс идёт на удивление гладко. Шаги по установке зависимостей и клонированию реп проходят без проблем. :)

Однако, как только дело доходит до bundle install, он тут же начинает орать. Во-первых, выдаёт предупреждение о дубликате зависимости «gem 'redcarpet', '~> 3.1.2'». Это не страшно, убирается комментированием соответствующей строчки в Gemfile внутри каталога плагина. Во-вторых, ошибка, связанная с несоответствием версий rake. Дескать, установлена 1.5.2, а плагин через зависимость от gitlab-grack требует аж 1.6.0. Это вызвано тем, что в репе jbox-web не указана версия rake; соотвественно, bundler вытягивает и собирает самую последнюю. Собственно, сам автор плагина предлагает бороться с этим косяком, используя гитлабовский форк. В результате получаем такой кусок Gemfile:

## Redmine 3.x
## Ruby/Rack Git Smart-HTTP Server Handler (use our own repository because Redmine uses Rails 4.2 and Rack 1.6)
#gem 'gitlab-grack', git: 'https://github.com/jbox-web/grack.git', require: 'grack', branch: 'fix_rails4'
#gem 'redcarpet', '~> 3.1.2'

# fix for Debian Jessie with rails 4.1
# (https://github.com/jbox-web/redmine_git_hosting/issues/497#issuecomment-133768646)
gem 'gitlab-grack', git: 'https://github.com/gitlabhq/grack.git', require: 'grack', branch: 'master'

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

Следующй шаг — migrate

Здесь сразу же вылетает ошибка «The git source https: github.com/jbox-web/gitolite-rugged.git is not yet checked out. Please run bundle install before trying to start your application». Естественно, bundle install не помогает. Решение: закомментировать ссылки на git и поставить просто зависимость, как от обычных гемов. В результате получим что-то подобное:

# Gitolite Admin repository management
#gem 'gitolite-rugged', git: 'https://github.com/jbox-web/gitolite-rugged.git', tag: '1.1.1'
gem 'gitolite-rugged'

#gem 'gitlab-grack', git: 'https://github.com/gitlabhq/grack.git', require: 'grack', branch: 'master'
gem 'gitlab-grack', require: 'grack'

Кстати, в Интернете можно найти довольно много вопросов, связанных именно с таким глюком, когда какой-нибудь гем ставится из гита. ИЧСХ, внятных ответов, как бороться с этой напастью, никто не даёт. В основном какие-то шаманские рецепты типа придуманного мной. Это намекает на пару возможных причин: или эта ситуация настолько тривиальна, что отвечать просто нет смысла, или же действительно никто не знает, что там на самом деле происходит в недрах RoR вообще и Redmine в частности.

Ну так вот. После этого нужно ещё раз запустить bundle install, после чего migrate будет ругаться на другие вещи. Или, если redmine изначально был поставлен по-человечески, всё пройдёт гладко. В моём случае пользователю БД не хватало прав на создание и удаление таблиц. Выполнение в mysql

grant all privileges on `redmine_db`.* to 'redmine_user'@'localhost';
flush privileges;

решило проблему радикально.

Установка и настройка Gitolite

Пользователи и ключи

Поскольку Gitolite работает от одного пользователя через ssh, нам нужно сгенерировать некоторое количество ключей. Этот процесс вызвал единственный вопрос относительно места их хранения. В инструкции для создания пары административных ключей для плагина рекомендовано создать каталог ssh_keys в REDMINE_ROOT. Однако, если внимательно посмотреть на init.rb, становится понятно, что в дереве плагина уже есть ssh_keys, и создан он там отнюдь не случайно. Плагин в первую очередь именно там и ищет ключи. Впрочем, когда всё заработает, каталог с ключами можно переопределить в настройках.

Во время установки Gitolite нужно будет указать пользователя, из-под которого он будет работать (и в которого будут логиниться все имеющие доступ к репозиториям). Для общности пусть это будет юзер git. В качестве административного ключа нужно указывать открытый ключ того человека, который будет админом (ну или сразу ключ, сгенерированный для redmine). Дополнительные ключи (для redmine, в частности) кладутся в GITOLITE_HOME/.gitolite/conf/gitolite.conf. После этого нужно сделать gitolite compile от пользователя git. Но на самом деле ничего такого делать не нужно. Gitolite управляется через git-репу. Поэтому после установки с добавлением одного административного ключа можно и даже нужно просто склонировать репозиторий gitolite-admin тому пользователю, которого сделали git-админом. После этого можно настраивать конфиги как угодно, не забывая заливать коммиты обратно. Как и что делать, подробно разжёвано в соответствующем руководстве.

Дополнительно (для версии Gitolite 3) «патчится» пара скриптов, но это описывать не имеет смысла, поскольку процесс тривиален.

Если что-то пошло не так…

Но вот если забыть, как работает ssh, возникнут некоторые сложности с доступом по ключам. Во-первых, домашний каталог Gitolite должен принадлежать руту или тому юзеру, из-под которого работает Gitolite (и мы в самом начале решили, что это git). Следствие: если с репозиториями работает ещё кто-то (например, gitdaemon), этого кого-то нужно добавить в группу git. С другой стороны, что касается gitdaemon‘а, то его-то как раз можно запустить от имени любого нужного пользователя. Во-вторых, нужно выставить адекватные права на .ssh и то, что в нём. В-третьих, Gitolite различает git-юзеров по их ключам, поддерживая соответствующую структуру файла authorized_keys: перед ключом должна идти строчка

command="/usr/share/gitolite3/gitolite-shell <git_user_name>",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

Если выполнены все эти условия, с доступом проблем не будет. В крайнем случае поможет анализ /var/log/auth.log. Вообще на сайте Gitolite есть специальная страница, где собраны все возможные косяки с ssh и способы их устранения. Опять же, если не лазить в конфиги руками, а делать всё через git, как расписано в документации, всё должно работать адекватно.

Что же там всё-таки с именами?

Кстати, есть ещё один нюанс, связанный с тем, как Gitolite определяет имена пользователей. Всё очень просто: как обзовёшь открытый ключ, так тебя и будут звать дальше. Опять же, всё не настолько фатально, если вспомнить, что вся конфигурация хранится в git-репозитории. Однако же, вот такая штука. Руководство по установке плагина предлагает назвать сгенерированный ключ каким-то нечеловечески длинным именем с суффиксом rsa_id. И это означает, что административный пользователь redmine будет назван этим самым непроизносимым именем. В сущности, и redmine, и плагину, и Gitolite — всем пофиг, формально всё будет работать. Однако, мне лично удобнее, когда подконтрольные мне сущности называются просто и понятно. Поэтому я переобозвал ключи в redmine-admin и redmine-admin.pub. И теперь в конфиге всё прозрачно и тихо.

Запуск Redmine и настройка плагина через веб-морду

Наконец-то, наконец-то! Если вы дошли до этого торжественного момента с минимальными потерями, вас можно поздравить. Остальных, наверное, тоже можно. Просто им уже не до поздравлений.

В общем, выполнение заключительной части инструкции особых сложностей не вызывает. Тем более, что есть целая страница с описанием тех параметров, которые нам предлагают настроить. Более того, там уже практически ничего не поломаешь, и можно, если что, исследовать систему методом научного тыка. С минимальным знанием английского или французского языков (других локализаций в этом плагине я не заметил) вполне реально разобраться даже без документации. Однако, в документации обычно пишут много интересного и полезного. :) Так что хотя бы краем глаза взглянуть всё же сто́ит.

Реальные баги

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

Вывод ReadMe

Итак, первый косяк в коде, с которым я столкнулся в процессе эксплуатации плагина, находится в файле REDMINE_HOME/plugins/redmine_git_hosting/lib/redmine_git_hosting/hooks/display_repository_readme.rb. Не буду рассказывать, как я его отлавливал и локализовал в конце концов, поскольку дебаггинг — это тема для отдельной статьи. Лучше сразу покажу, что нужно менять:

diff old/display_repository_readme.rb new/display_repository_readme.rb
58c58
<           raw_readme_text = repository.cat(readme_file.path, rev)
---
>           raw_readme_text = Redmine::CodesetUtil.to_utf8_by_setting(repository.cat(readme_file.path, rev))

А теперь поясню, ради чего, собственно, менять. Этот модуль должен выводить ReadMe под списком файлов и логом коммитов. Практически как на гитхабе. Однако же, без принудительного перевода прочитанного буфера в UTF-8 этот модуль падает на символах с кодами, выходящими за пределы таблицы ASCII. А внешне это выражается в том, что если в репе есть ReadMe с какими-то нестандартными символами (типа диакритики или расширенной пунктуации), то вместо репы мы увидим шиш с маслом Server Error 500. Это некрасиво да и вообще как-то неправильно. Поэтому вот такой нехитрый патч. Сделал pull request с этим «патчем»; будем ждать, когда окажется в апстриме. Upd[2015-10-02]:патч принят в основной репозиторий.

Дополнительно нужно отметить, что для отображения ReadMe в формате ReStructuredText требуется установка python-docutils. Да, именно. Это питоновский пакет, который нужен программе на ruby. Так тоже бывает.

Вывод новостей

В процессе работы был выявлен ещё один косяк, характерный именно для этой версии redmine. В случае, когда у пользователя выставлен признак «Отображать комментарии в обратном хронологическом порядке», при попытке просмотреть отдельную новость (вне зависимости от проекта и наличия комментариев) сервер выдавал Error 500. После анализа логов, мониторинга базы и изучения исходников удалось обнаружить ошибку в REDMINE_HOME/app/controllers/news_controller.rb. Косяк выпрямляется вот таким вот незатейливым способом:

diff old/news_controller.rb new/news_controller.rb
61c61
<     @comments = @news.comments
---
>     @comments = @news.comments.to_a

Кстати, как оказалось впоследствиии, в транке redmine этот баг был пофиксен в ревизии 13595 абсолютно так же.

Автоматическая подгрузка изменений

Собственно, это не то, чтобы баг… Скорее глюк. В общем, я заметил, что репы, переведённые в Redmine на Gitolite, не подхватывали автоматом изменения, сделанные снаружи, хотя соответствующая настройка в конфигурации была включена. В результате оперативно был воплощён в жизнь такой рецепт.

Чтобы redmine могла автоматически отслеживать изменения в репозиториях, в GITOLITE_HOME/.gitolite/hooks/common/post-receive.d нужно добавить скрипт, вызывающий метод fetch_changeset либо через WebAPI, либо напрямую через запуск redmine. Например, такой:

#!/bin/bash

API_KEY=XXXXXXXXXXXXXXXXX

PROJECT_ID=`git config redminegitolite.projectid || echo ''`

[ "${PROJECT_ID}" ] && {
    wget "https://<redmine.server.name>/sys/fetch_changesets?id=${PROJECT_ID}&key=${API_KEY}" >&/dev/null
    echo Redmine repository updated successfully
}

exit 0

Естественно, для доступа через веб должна быть включена соответствующая опция в настройках и получен ключик. Это делается в пару кликов на странице «Administration → Settings» на вкладке «Repositories».

Собственно, на этом всё.


Спасибо за внимание!


И как обычно, текст этой статьи в формате PDF можно совершенно свободно скачать вот по этой ссылке

]]>
http://omsklug.com/2015/09/smashing-redmine-git-hosting-in-deian-jessie/feed/ 0
Как собрать chatbot’а для Tox http://omsklug.com/2015/01/how-to-build-toxbot/ http://omsklug.com/2015/01/how-to-build-toxbot/#comments Sat, 24 Jan 2015 22:00:22 +0000 Shroom http://omsklug.com/?p=1777 .local p {text-align: justify!important; text-justify: inter-word!important;} .local a {color: rgb(16, 8, 96)!important;} .local a:visited {color: Gray!important;} .local a:hover {text-decoration: underline; color: Blue!important;} .local code {font-family: Monospace,Courier!important;}

В этой статье собраны некоторые подводные камни, обнаруженные лично автором при сборке чатбота для tox на Debian GNU/Linux 7 (Wheezy) для архитектуры amd64. Приведены способы обхода обнаруженных ошибок.

Подготовка

Для начала нам нужно установить некоторое количество пакетов с библиотеками и заголовочными файлами и вообще со средствами разработки (если таковых в системе ещё нет). Начнём с инструментария разработчика:

apt-get install build-essential libtool autotools-dev \
automake checkinstall check git yasm

Для удовлетворения сборочных зависимостей и для разных дополнительных плюшек типа аудио/видео, возможности запуска bootstrap-демона и хостинга ноды, ncurses-интерфейса поставим ещё несколько пакетов:

apt-get install libopus-dev libvpx-dev pkg-config \
libconfig-dev ncurses-dev

В принципе, эти рекомендации указаны на странице, посвящённой сборке toxcore. А дальше пойдут некоторые особенности… Кстати, я не рекомендую проходить данный квест, одновременно читая этот текст, поскольку стиль изложения материала довольно свободный и допускает возврат на несколько шагов назад и повтор действий с возможным улучшением стратегии. В общем, информация дана в чисто ознакомительных целях и ни в коей мере не является полноценным HowTo и, тем более, пошаговой инструкцией.

Итак, начнём, так сказать, с базовых вещей. Для шифрования нужна библиотека NaCl (старая и плохо портируемая, но быстрая) или sodium (новая, хорошо переносимая, с совместимым API, но несоколько медленнее). При этом существуют косяки как с первой, так и со второй библиотекой. Косяк с первой: нет объектников randombytes.o и cpucycles.o, которые требуются для сборки toxcore, но которые не являются частью NaCl [см. обсуждение подобной проблемы]. Косяк со второй — её тупо нет в репах для Wheezy (появилась только в Jessie), поэтому нужно сливать сырцы для Jessie и собирать (Естественно, для этого нужно добавить соответствующий репозиторий в /etc/apt/sources.list, настроить pinning, чтобы ненароком не обновить систему и т.п. Хотя можно, конечно, скачать нужный пакет прямо с сайта Debian). Соответственно, на старых системах (или если хочется «скорости»):

apt-get install libnacl-dev

А вообще NaCl лучше собирать из исходников, чтобы было откуда выцарапать randombytes.[c|o].

На новых системах (а также на Ubuntu, Mint, Arch, Gentoo и прочих, где всё новьё можно найти в стандартных репах/ppa/портах и пр.):

apt-get install libsodium-dev libsodium13

На старых же системах, где libsodium придётся брать в виде исходиков для Jessie, нужно дополнительно поставить pkg-config и dh-autoreconf, которые указаны в зависимостях для сборки. Впрочем, первый из них мыуже поставили в самом начале, поэтому остаётся только второй (Я лично ограничился сборкой с использованием NaCl, поэтому не могу сказать, какие глюки можно словить с sodium. Однако, смею предположить, что как минимум отсутствие randombytes.o породит похожие эффекты).

Сборка NaCl

Предположим, мы собрались использовать NaCl.

apt-get source nacl-tools

Из этого получатся пакеты для «-tools» и для «-dev». Здесь в зависимостях для сборки присутствует docbook-to-man, поэтому ставим и его тоже.

Сборка пакета: ничего страшного. Как обычно,

dpkg-buildpackage -b -us -uc

Но перед этим нужно в файлике debian/rules закомментировать строчку вида

rm -f $(CURDIR)/build/$(SHORTHOSTNAME)/lib/*.o

чтобы иметь возможность упаковать вместе с основной библиотекой и нужные нам объектники (ну или просто чтобы найти их после сборки). На самом деле по зрелом размышлении можно понять, что сборка пакета по сути не нужна. Можно ограничиться готовым пакетом из репы. Однако, при этом в любом случае нужно в верхнем каталоге дерева исходников libnacl выполнить магический скрипт ./do, который, собственно, и занимается сборкой либы. И уже после этого можно выдернуть и куда-нибудь сложить cpucycles.o и randombytes.o. Этот вариант будет даже более правильным с точки зрения поддержания чистоты пакетов.

Сборка ToxCore

Со стандартными либами покончено. можно сливать с гитхаба исподники toxcore:

git clone git://github.com/irungentoo/toxcore.git

После этого нужно перейти в каталог toxcore и фигачить далее по тексту руководства. Почти. Потому что, как обычно, появятся небольшие нюансы. Начнётся всё просто замечательно:

autoreconf -i

отработает без ошибок, поскольку здесь ломаться в принципе нечему. Зато следующий шаг

./configure --enable-nacl --enable-log --enable-ntox \
--enable-daemon --disable-testing

(в данном случае вся фишка в --enable-nacl; всё остальное — по желанию) закончится ошибкой. Нам скажут, что либа NaCl якобы не найдена, и предложат явно указать путь к ней. Хорошо, сделаем то, что просят, и даже больше, предполагая, что те самые cpucycles.o и randombytes.o лежат в одном из каталогов, известных линкеру (например, в /usr/lib рядом с libnacl.a):

./configure --enable-nacl --enable-log --enable-ntox \
--enable-daemon --disable-testing --with-nacl-libs=/usr/lib \
--with-nacl-headers=/usr/include/nacl

После того, как конфигуратор удовлетворится этой подсказкой, можно делать

make

Однако, сборка тоже не пройдёт с первого раза. Это, вероятно, связано как раз с ошибочным мнением разрабов toxcore о том, что randombytes.o принадлежит libnacl. Но это метафизика, а нам нужно что-нибудь уже собрать. Короче, процесс останавливается на линковке tox-bootstrapd с воплями о том, что в нескольких модулях найдены «undefined reference to ‘randombytes’». Хорошо, предоставим костыль в виде

make LIBS=''/usr/lib/randombytes.o''

после чего чудесным образом (Ну то есть сразу после ошибки запускаем «костыль» — и всё. Не нужно ничего нигде чистить, менять, копаться в файлах и др.пр.) дособерётся демон tox-bootstrapd (Естественно, если нет необходимости в этом функционале (а её в подавляющем большинстве случаев нет) и не был указан параметр --enable-daemon при вызове ./configure, то всё соберётся без проблем). После этого параноики могут проверить качество сборки, запустив

make check

(кстати, все тесты должны завершиться успешно), а все остальные могут сразу же приступить к сборке deb-пакета (ну или любого другого пакета на выбор) и его установке. Например, так:

sudo checkinstall -D make install

По умолчанию либы и бинарники будут установлены в /usr/local, поскольку мы не меняли эти пути в параметрах конфигуратора. Собственно, никто не мешает при вызове ./configure добавить параметр --prefix=/usr. Однако, это не является критичным для сборки бота.

Сборка ToxBot

Теперь, собственно, то, ради чего затевался весь этот сыр-бор. Сборка чат-бота.

Перед тем, как что-то собирать, это что-то нужно стянуть с гитхаба:

git clone git://github.com/JFreegman/ToxBot.git

Далее всё тривиально. Почти, опять же… Если взглянуть на руководство по установке, может возникнуть ложное чувство уверенности в своих силах и полного контроля над происходящим. В самом-то деле, что уж, так сложно единственную команду make запустить что ли?! Однако, в реальности всё не так, как на самом деле… Наверняка сборка загнётся опять же на этапе линковки, и линкер будет орать, что нашёл «undefined reference to `clock_gettime’» где-то в недрах toxcore. В принципе, он прав, потому что эта функция находится в библиотеке librt, а про неё линкеру никто ничего не рассказал. Поэтому придётся лезть в Makefile и менять строчку

LDFLAGS = $(shell pkg-config --libs $(LIBS))

на почти такую же, только с упоминанием нужной библиотеки:

LDFLAGS = -lrt $(shell pkg-config --libs $(LIBS))

После этого всё должно пройти без ошибок. Результат сборки — свежий бинарник toxbot, который не требует настройки и заводится с полпинка. Дальнейшие вопросы вроде «что делать, чтобы он признал хозяина?» и «как пробиться через заботливо закрытый файрвол?» автор статьи оставляет в качестве упражнения для читателя. Поверьте, это абсолютно несложно и даже описано в документации.


Спасибо за внимание!

Как обычно, полный текст этой статьи можно совершенно бесплатно, без регистрации, без смс свободно скачать отсюда в формате PDF.

]]>
http://omsklug.com/2015/01/how-to-build-toxbot/feed/ 0
Установка КонсультантПлюс в Ubuntu Linux 12.04 http://omsklug.com/2014/08/consultantplus-at-ubuntu-linux/ http://omsklug.com/2014/08/consultantplus-at-ubuntu-linux/#comments Fri, 15 Aug 2014 09:48:17 +0000 linuxmasterz http://omsklug.com/?p=1734 Общие слова

Есть такая база, правовая база данных КонсультантПлюс, каждый IT-специалист знает это произведение российской компьютерной мысли и наверное устанавливал не раз. Конечно, можно пользоваться только online-версией этой замечательной правовой базы данных, но зачем? Ведь есть возможность получить эту компьютерную программу на руки, подписав договор с региональным представителем (региональным информационным центром) и выплачивая небольшие деньги. Именно от них, от региональных представителей, можно получить волшебный файл-демон лицензирования conslin, который позволяет провести-таки регистрацию правовой базы данных КонсультантПлюс (ведь мы же пользуемся только легальным программным обеспечением, не так ли?) и файл с инструкцией по установке: linux.rtf. Нет уверенности в том, что файл с инструкцией по установке можно публиковать публично, так как в нём не указаны условия его распространения, но там довольно банальные вещи, кроме некоторых секретных элементов, которые включены в пределах разумного цитирования в настоящую инструкцию.

Начальная установка

Просто ставим с mini.iso систему Ubuntu Linux 12.04, куда доустанавливаем только самые нужные нам компоненты. Где взять mini.iso? Конечно же здесь:

https://help.ubuntu.com/community/Installation/MinimalCD

Установка проста и не замысловата. Минимальная система, без каких-либо посторонних сервисов. Единственное, что важно, по окончанию установки необходимо выбрать из огромного репозитория свободного программного обеспечения именно те пакеты, которые вам действительно понадобятся:

sudo apt-get install openssh-server samba4 wine xvfb

openssh-server – для удалённого доступа к операционной системе.

samba4 – для удалённой работы с правовой базой данных КонсультантПлюс.

wine – тот самый неэмулятор Wine Is Not Emulator, который позволит нам запускать на сервере неродные для Linux, исполнимые файлы системы КонсультантПлюс с целью регистрации этого программного продукта, регистрации рабочих станций, обновления правовой базы данных КонсультантПлюс.

xvfb – ещё одна программа неэмуляции, это самый настоящий X-сервер, но умеющий работать без устройств отображения и устройств ввода-вывода. Казалось бы, зачем такое нужно? А вот нужно, например, сейчас, когда нет необходимости ставить настоящий X-сервер на постоянную основу, а лишь пользоваться им спорадически. Ведь все же знают, что, за редкими исключениями, сервер с X-сервер – совсем никакой не сервер.

Такие сервисы, как правовая база данных КонсультантПлюс, удобно держать на сервере виртуальных машин на базе настоящего промышленного гипервизора Kernel-based Virtual Machine (KVM). Для создания образа жесткого диска виртуальной машины рекомендуется 10-гигабайтный “резиновый” образ qcow2 или qed (который умеет расширять свой размер, в зависимости от наполнения данными, но можно сделать и фиксированного объема), который по-настоящему занимает на сервере виртуальных машин изначально чуть более 1 гигабайта. Файлы же правовой базы данных не рекомендуется, а обязательно следует разместить на “резиновом” разделе с максимальным объемом не менее 30 гигабайт, что следует из практики использования, когда изначально объем всех файлов составлял около 9 гигабайт, а после года работы системы – около 14 гигабайт, учитывая, что подключены только федеральные базы законодательства без отраслевых вариантов и регионального законодательства. Оперативной памяти виртуальной машины для обычной работы системы КонсультантПлюс достаточно 256 мегабайт, но, выяснилось, что для обновления системы необходимо не менее 512 мегабайт, так как при недостатке памяти жуткий комплекс из wine и cons.exe вываливается в переполнение стека. Все указанные выше показатели применимы и к реальному аппаратному обеспечению (за исключением “резиновости” разделов и невозможности увеличить оперативную память оперативно).

Предварительные действия

Создаем раздел на диске для файлов системы КонсультантПлюс с помощью программы fdisk (где X – буква диска):

sudo fdisk /dev/sdX

Форматируем раздел, создавая на на нашем диске для файлов системы КонсультантПлюс файловую систему ext4 (где X – буква диска, а Y – цифра раздела):

sudo mkfs.ext4 /dev/sdXY

Узнаём UUID раздела диска для файлов системы КонсультантПлюс:

ls -la /dev/disk/by-uuid/

Создаём точку монтирования (подключения) файловой системы:

sudo mkdir /var/lib/cons

Монтируем (подключаем) в нашу систему раздел диска в подготовленную нами выше директорию через файл описания точек монтирования fstab:

sudo nano /etc/fstab

прописывая в нем запись монтирования раздела диска:

UUID=73bec7a9-a1d0-5c3f-9244-0cde01363eb4 /var/lib/cons            ext4    relatime,nodiratime,commit=120        0       2

где:

73bec7a9-a1d0-5c3f-9244-0cde01363eb4 – пример UUID раздела диска для монтирования;

/var/lib/cons – точка монтирования (подключения) раздела диска

ext4 – тип файловой системы, который мы указали при форматировании подключаемого раздела

relatime,nodiratime,commit=120 – параметры, ускоряющие работу файловой системы, путем уменьшения частоты записи на диск служебной информации.

0 – параметр, чтобы раздел не обрабатывался программой dump, которая по умолчанию и не установлена

2 – параметр, который заставлять fsck проверять раздел последним (можно поставить 0, чтобы вообще не проверять, но зачем?)

Применяем внесённые изменения:

sudo mount -a

Если диск виртуальный, то применяем ещё и дополнительные настройки для ускорения диска (это можно сделать даже в действующей системе, на “ходу”):

sudo nano /etc/rc.local

где добавляем через sudo -s то, что наш диск не крутится и может использовать любое ядро процессора для поток ввода-вывода, ведь у нас одно ядро в виртуальной машине и выбирать собственно не из чего (X – буква диска):

echo 0 > /sys/block/vdX/queue/rotational &
 
echo 0 > /sys/block/vdX/queue/rq_affinity &

Указанные выше параметры просто применить и в сессии “суперпользователя” через:

sudo -s

но действовать это будет только до перезагрузки.

Создаём осмысленное имя пользователя, от которого у нас будет работать главный пользователь КонсультантПлюс и собственно будут запускаться фоновые процессы обслуживания:

sudo adduser cons

Создаём имя пользователя, от которого у нас будет работать все остальные пользователи базы данных и у которых будут права только на чтение общего ресурса samba4:

sudo adduser consuser

Подготовка директории с базой данных

Каким-либо образом получаем доступ к дистрибутиву и копируем содержимое диска КонсультантПлюс в заранее подготовленную директорию /var/lib/cons (которая является, как мы помним, корнем специального раздела диска или отдельного диска для файлов правовой системы КонсультантПлюс):

sudo cp -R * /var/lib/cons/*

Присваиваем все файлы в директории /var/lib/cons пользователю и группе cons:

sudo chown -R /var/lib/cons/*

Узнаем одну из тайн сообщества КонсультантПлюс, которая была почерпнута в секретном linux.rtf. Директория ADM должна иметь атрибуты rwxrwsr-x, т.е. для пользователя чтение-запись-доступ и для группы чтение-запись-доступ + SGID (бит показывает, что создаваемые в директории файлы будут принадлежать той же группе, что и каталог, а не группе пользователя, который создаёт в директории файл):

sudo chmod 2770 /var/lib/cons/ADM

Что же лежит и будет лежать в директории /var/lib/cons/ADM? Да там же:

CONS.ADM, в котором хранится информация о лицензионности вашей системы КонсультантПлюс;

MBPxxxxxx.ADM, в котором хранится информация о авторизованных клиентских компьютерах (xxxxxx – номер поставки).

Оба файла имеют права rwxrwxr-x (775). Если права будут другими, то на клиентских машинах будет ошибка о занятости системы КонсультантПлюс некими иными пользователями. Бывает, когда некорректно проходят операции обновления, переиндексации, добавления новых клиентских компьютеров, права сбиваются на rwx—— (700)

Для возможности запуска cons.exe на клиентских компьютерах в неLinux-системах почему-то пришлось выставлять права rwxr-xr-x (755), а было rwxr-x— (750):

sudo chmod 755 /var/lob/cons/cons.exe

Подготовка общего ресурса SAMBA4

Редактируем файл настройки SAMBA /etc/samba/smb.conf:

В глобальной секции прописываем сетевую группу, режим авторизации, немного магии для ускорения чтения/записи на ресурсы SAMBA:

workgroup = THEFIRM
security = user
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=16384 SO_SNDBUF=16384

Закоментируйте ненужные нам секции:

 

[printers]
 
[print$]

 

Прописываем секцию общего ресурса SAMBA:

[CONS]
path = /var/lib/cons
browseable = yes
read only = no
guest ok = no
create mask = 0664
directory mask = 0775
veto oplock files = /*.BIS/*.ADM/
#kernel oplocks = no
level2 oplocks = no
use sendfile = yes
log level = 0

Создаем пользователей ресурса SAMBA:

 

sudo smbpasswd -a cons
 
sudo smbpasswd -a consuser

 

Включаем пользователей ресурса SAMBA:

 

sudo smbpasswd -e cons
 
sudo smbpasswd -e consuser

 

Регистрация комплекта и клиентских компьютеров

Копируем секретный демон лицензирования conslin в сервер, обычно в директорию /usr/local/bin/ и прописываем запуск его при старте сервера в /etc/rc.local до команды exit 0:

/usr/local/bin/conslin &

Можно конечно сделать демон /etc/init.d/conslin, но… стоит ли напрягаться? Помним, что & обязателен для того, чтобы conslin исполнялся при старте в фоне и загрузка продолжалась далее, а то мало ли что, это же злобный проприетарный модуль, что там внутри – неизвестно, зависнуть он может в любой момент и делать может что угодно, хотя есть информация, может работать по полгода и проблем не создавать (тьфу-тьфу). При старте демон conslin открывает TCP-порт 3333 на всех сетевых интерфейсах сервера.

Подключаемся с Вашего компьютера администратора удалённо с пробросом Х-сессии на сервер для регистрации комплекта:

ssh -X cons@192.168.1.50 wine /var/lib/cons/cons.exe /adm /linux /reg

Звоним или пишем региональному представителю КонсультантПлюс, говорим полученные цифры от программы, пишем в загрузившееся окно цифры от представителя, радуемся регистрации.

Подключаемся удалённо с Вашего компьютера администратора с пробросом X-сессии на сервер с базой данных для регистрации клиентских компьютеров:

ssh -X cons@192.168.1.50 wine /var/lib/cons/cons.exe /adm /linux

где:

192.168.1.50 – IP адрес сервера правовой базы данных КонсультантПлюс;

/adm – запуск в режиме администрирования;

/linux – запуск на Linux-системе.

Программная оболочка КонсультантПлюс загружается и мы идём в Меню/Сервис/Регистрация станций.

Запускаем на клиентском компьютере cons.exe, так же идём в меню Меню/Сервис/Регистрация станций.

Происходит магия лицензирования – смотрим на прогрессбар на комьютерах, жмём как на клиентской машине, так и на запущенной на Вашем компьютере оболочке КонсультантПлюс кнопки “ОК”. Регистрация должна быть произведена произведена. Клиентская машина записана на сервере как авторизованная для подключения и использования базы данных.

Что можно делать вручную?

Все эти действия делаются визуально на компьютере администратора, используя его X-сервер, но выполняются на сервере.

Обновлять базу данных через локальную директорию для обновлений (если у вас всё очень плохо с Интернетом):

ssh -X cons@192.168.1.50 wine cons.exe /adm /linux /receive /base* /yes

Обновлять базу данных через сеть Интернет:

ssh -X cons@192.168.1.50 wine cons.exe /adm /linux /receive_inet /base* /yes

Тестировать базу данных на неисправности и ошибки:

ssh -X cons@192.168.1.50 wine cons.exe /adm /linux /basetest /base* /yes

 

Индексировать файлы базы данных (это необходимо, когда теряется возможность нажимать на ссылки в программе, пишется фальшивое вообщение о том. что якобы “в данном комплекте не зарегистрирована эта возможность”):

ssh -X cons@192.168.1.50 wine cons.exe /adm /linux /reindex0 /base* /yes

Создаём скрипт автоматического обновления

Создаём файл /usr/local/bin/cons-update.sh со следующим содержимым:

 

#!/bin/bash
LOGFILE=/var/log/cons-update.log   # Log destination path
CONSDIR=/var/lib/cons/  #ConsultantPlus path
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
 
# Checking existance of log
if [ ! -f $LOGFILE ]; then
touch $LOGFILE
chown root:cons $LOGFILE
chmod 664 $LOGFILE
fi
echo "`date +%Y%m%d%H%M%S` ConsultantPlus is updating..." >> $LOGFILE
sudo -H -u cons xvfb-run -s '-screen 0 1024x768x24' wine Z:\\var\\lib\\cons\\cons.exe /adm /linux /adm /linux /receive_inet /base* /yes | iconv -f CP866 >> $LOGFILE
chmod 664 $CONSDIR/ADM/CONS.ADM
echo "`date +%Y%m%d%H%M%S` ConsultantPlus is ready to use..." >> $LOGFILE
exit 0

 

Не забываем сделать его исполнимым:

chmod +x /usr/local/bin/cons-update.sh

чтобы скрипт стал исполнимым. И сделать через sudo crontab -e запись:

0 6 * * 1 /usr/local/bin/cons-update.sh

чтобы база обновлялась один раз в неделю, а именно в понедельник, в 6 OMST (UTC+7) или 3 MSK (UTC+4) часов. Время и период подсказали сотрудники регионального информационного центра КонсультантПлюс, говорят, что нагрузка на сервера с обновлениями минимальна в это время, а чаще делать обновление не имеет смысла.

В процессе подготовки скрипта была раскрыта тайна, что оказывается, на самом деле, vr??????.res файл – исполнимый и его можно запускать через wine. И он тоже будет работать. Но злоупотреблять этим не надо, так как он постоянно обновляется и его версии тихонечко растут.

Также узнаем тайну авторов КонсультантПлюс: программа настолько стара, что использует для вывода лога работы кодировку CP866. Поэтому и сделана обработка данных лога через iconv. Логи CONS_ERR.TXT, CONS_INET_LISTFILES.TXT, CONS_INET.TXT,  CONS_LOG.TXT ведутся в кодировке CP1251, что более логично, но просит вопроса, почему же не прогрессивный UTF-8. Если это не тайна или вы можете объяснить, почему именно так, а не иначе – пишем в комментарии.

Выводы

Вот так вот несложно и незамысловато мы получили практически автономную правовую базу КонсультантПлюс в Ubuntu Linux 12.04, которая сама обновляется и работает без участия человека. Подключаться к базе можно как с Linux-клиентов, так и с других операционных систем, просто стартуя исполнимый модуль cons.exe.

]]>
http://omsklug.com/2014/08/consultantplus-at-ubuntu-linux/feed/ 0
Найстройка DNS сервера на базе Ubuntu 12.04 http://omsklug.com/2014/05/dns-server-bind-ubuntu-12-04/ http://omsklug.com/2014/05/dns-server-bind-ubuntu-12-04/#comments Thu, 01 May 2014 09:59:44 +0000 Plus http://omsklug.com/?p=1690 Все началось с установки kolab. Все ставилось, но при запуске setup-kolap вылетала ошибка:
Warning: hostname mail is not a fully qualified host and domain name

Решил настраивать DNS сервер, решил сделать на этой же машине.
Итак примтупим. Для начала необходимо поставить собственно сам dns:

sudo apt-get install bind9

Перейдем к настройке. Первым делом “поковыряем” файл named.conf.options:

Перейдем к настройке. Первым делом “поковыряем” файл named.conf.options
acl “lan” {
192.168.0.1/24;
};
options {
directory “/var/cache/bind”;
allow-query { any; };
version “MCRO DNS Master Server”;
auth-nxdomain no;
listen-on-v6 { none; };
notify yes;
recursion yes;
forward first;
forwarders {
8.8.8.8;
};
listen-on port 53 {
127.0.0.1;
192.168.254.2;
};
};

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

forwarders – Параметр указывающий на какие сервера переадресовывать запросы, в случае отсутствия записей;
listen-on – Параметр указывающий на каких интерфейсах слушать 53 порт;
forward first - Параметр задает пересылку только первого запроса;
auth-nxdomain no – Параметр для совместимости RFC1035;
allow-query { any; }; - Параметр отвечающий за то- от кого принимать запросы, мы их принимаем от всех;
recursion - Параметр разрешает или запрещает рекурсивные запросы ( yes /no);
notify — Параметр указывает уведомлять или не уведомлять slave сервера об изминениях в зоне (yes/no);
version «Super DNS server»; -Параметр указывающий уровень болтливости сервера, вместо названия сервера выдаст Super DNS server;
acl “lan” { 192.168.0.1/24; } - Параметр задает группу подсетей;(можно написать что-то свое).


zone "omsklug.com" {
type master;
file "/etc/bind/omsklug.com";
};
zone "254.168.192.in-addr.arpa." {
type master;
file "/etc/bind/127.0.0.rev";
};

Файл omsklug.com отвечает за прямой просмотр, 127.0.0.rev за обратный соответственно.

Теперь необходимо создать эти файлы. Делаем /etc/bind/omsklug.com

$TTL 86400
@ IN SOA ns1.omsklug.com. post.omsklug.com (
2014050101 ; Serial
1d ; Refresh
12h ; Retry
1w ; Expire
3h ; Minimum
);
@ IN NS ns.omsklug.com.
ns1 IN A 127.0.0.1
@ IN A 127.0.0.1
mail IN A 192.168.254.3
www IN CNAME @

Во второй строке ns1.omsklug.com – имя корневого мастер-сервера зоны omsklug.com;
post.omsklug.com – e-mail адрес администратора зоны, пишется без “@”;
2014050101 ; Serial – серийный номер файла зоны, состоит из даты создания последние символы 01, указыавют на количество редактирований зоны;
1d ; Refresh – Период обновления;
12h ; Retry – Повтор каждые 12 часов;
1w ; Expire – Время хранения информаци;
3h ; Minimum – Время хранения TTL записи;
@ IN NS ns.omsklug.com. – Запись указывающая имя сервера, ответственного за зону;
ns1 IN A 127.0.0.1 – Запись указывающая ip адрес сервера, ответственного за зону omsklug.com;
@ IN A 127.0.0.1 – Запись указывающая ip адресс сервера, обслуживающего omsklug.com;
mail IN A 192.168.254.3 – Запись указывающая ip адрес сервера в лок.сети обслуживающего поддомен mail.omsklug.com;
www IN CNAME @ – Запись указывающая на переадресацию запросов, т.е. адреса omsklug.com и www.omsklug.com обслуживает один и тот же сервер, в данном случае сам dns сервер.

Далее настроим файл зоны обратного просмотра: /etc/bind/127.0.0.rev

$TTL 86400
@ IN SOA omsklug.com. root.omsklug.com (
2014050101 ; Serial
1d ; Refresh
12h ; Retry
1w ; Expire
3h ; Minimum
);

@ IN NS omsklug.com.
1 PTR omsklug.com.
3 PTR mail.omsklug.com.

Запись - 1 PTR omsklug.com. – указывает что зону omsklug.com обслуживает адрес 127.0.0.1
Запись – 3 PTR mail.omsklug.com. – указывает что поддомен mail.omsklug.com обслуживает адрес 192.168.254.3
Далее перезапускаем службу командой
sudo service bind9 restart

Проверку можно провести командой nslookup.
Вот и все:) Всем удачи, может что-то упустил, пишите поправим, дополним;).

]]>
http://omsklug.com/2014/05/dns-server-bind-ubuntu-12-04/feed/ 0
Настройка ejabberd сервер + mysql + pyticq транспорт http://omsklug.com/2014/02/ejabberd-server-mysql-pyticq-transport/ http://omsklug.com/2014/02/ejabberd-server-mysql-pyticq-transport/#comments Sun, 09 Feb 2014 13:34:08 +0000 Plus http://omsklug.com/?p=1521 Обычная история про то, как я устанавливал обычный корпоративный сервер для общения между сотрудниками, так и через внешние аккаунты некогда популярных сетей общения.

1. Базовые настройки

Настройки /etc/ejabberd/ejabberd.cfg почти все стандартны, за исключением указанных ниже:

override_local.

Укажем логин администратора (у jabber-сервера свой администратор, не путать с системным) и имя сервера:
%% Admin user {acl, admin, {user, "info", "omsklug.com"}}.
%% Hostname {hosts, ["omsklug.com"]}.

Раскомментируем настройки транспорта icq:
%% Jabber ICQ Transport
{5555, ejabberd_service,
[{ip, {127, 0, 0, 1}},
{access, all},
{shaper_rule, fast},
{hosts, ["icq.omsklug.com", "sms.omsklug.com"],
[{password, "secret"}]}
]},

Если используется внутренняя база тогда раскоментируем:
%%{auth_method, internal}.

Если же используется база mysql, тогда открываем вот это:
{auth_method, odbc}.

Далее настроим доступ к Базе данных, предварительно её создав и настроить пользователя к ней:
{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "ejabberd"}}.

Включаем настройку локализации:
{language, "ru"}.

Разрешаем регистрацию пользователей:
{access, register, [{allow, all}]}.

далее нужно подключить модули к mysql:
Меняем значения:
mod_last на mod_last_odbc
mod_offline на mod_offline_odbc
mod_privacy на mod_privacy_odbc
mod_private на mod_private_odbc
mod_roster на mod_roster_odbc
mod_vcard на mod_vcard_odbc

Сохраняем и закрываем /etc/ejabberd/ejabberd.cfg

2. Настройка базы MySQL для ejabberd

Теперь настройка mysql базы: нужно грамотно загрузить дамп пустой базы, поэтому берем его тут:
https://github.com/processone/ejabberd/blob/2.1.x/src/odbc/mysql.sql
После всех операций перезапускаем правильно необходимые сервисы ejabberd и mysqld:

sudo /etc/rc.d/ejabberd stop sudo /etc/rc.d/mysqld restart sudo /etc/rc.d/ejabberd start

3. Создание общего списка контактов сервера

В общем на этом можно было бы и остановиться, если бы не одно но. По умолчанию список контактов (ростер на терминологии jabber) нового пользователя пуст. Это вполне нормально для личного использования или для работы с публичными серверами – пользователь сам выбирает с кем общаться, но абсолютно неприемлемо для корпоративной среды, где список контактов заранее определен. Было бы неплохо, чтобы новый пользователь автоматически попадал в этот список и автоматически получал его в свой клиент. К счастью сделать это совсем несложно. В /etc/ejabberd/ejabberd.cfg найдем и раскомментируем следующую строку:

{mod_shared_roster, []},

Сохраняем файл, перезапускаем сервис. Теперь в веб-админке в разделе Virtual Hosts – имя вашего сервера появился пункт Группа общих контактов. Создаем такую группу и настраиваем. Для того, чтобы в группу автоматически попадали все пользователи в поле Члены укажите @all@, а в поле Видимые группы укажите название вашей группы, которое вы ввели при ее создании.

ВНИМАНИЕ!!!
Для Debian GNU/Linux надо установить клиент к БД. Готовый годный пакет -  здесь
Подробное описание конфига /etc/ejabberd/ejabberd.cfg можно посмотреть тут: http://blog.scaytrase.ru/linux/330/
Ещё один неплохой мануал: http://forum.odmins-it.ru/index.php?topic=170.0

4. Настройка транспорта ICQ

Далее переходим к настройке необходимого нам pyticq:
Здесь всё проще некуда:

<pyicqt>
<!-- The JabberID of the transport. -->
<jid>icq.hostname.server</jid>
<!-- The component JID of the transport. Unless you're doing clustering, leave this alone -->
<!-- <compjid>icq1</compjid> -->
<!-- The IP address of the main Jabberd server -->
<mainServer>127.0.0.1</mainServer> - адрес сервера
<!-- The JID of the main Jabber server -->
<mainServerJID>icq.adress.ru</mainServerJID> - имя сервера с транспортом
<!-- The website of the Jabber service -->
<website>http://adress.ru/</website> - адрес странички
<!-- The website of the transport service -->
<!-- <transportWebsite></transportWebsite> -->
<!-- The support room on your server -->
<!-- <supportRoom></supportRoom> -->
<supportJid>jid@adress.ru</supportJid>
<!-- The TCP port to connect to the Jabber server on -->
<!-- (this is the default for Jabberd2) -->
<port>5555</port> - порт указанный в транспорте конфига ejabberd.cfg
<!-- The TCP port that the web admin interface will answer on -->
<!-- (uncomment to enable) -->
<!-- <webport>12345</webport> -->
<webport>8022</webport>
<!-- The authentication token to use when connecting to the Jabber server -->
<secret>secret</secret>
<!-- The default language to use (for error/status messages) -->
<lang>ru</lang>
<!-- Default one-byte message encoding to use -->
<encoding>cp1251</encoding>
<!-- The hostname of the ICQ server you wish to connect to -->
<icqServer>login.icq.com</icqServer>
<!-- The port of the ICQ server you wish to connect to -->
<icqPort>5190</icqPort>

можно еще отредактировать блок:

<admins>
<jid>admin@jid</jid>
<!--<jid>admin@host.com</jid>-->
</admins>

Остальное оставляем по умолчанию. У нас получился XMPP-сервер (Jabber), проникнутый духом корпоративности и порядка. В будущем подумаем о других транспортах XMPP. В комментариях – пишите, какие транспорты IM-сетей вас интересуют.

]]>
http://omsklug.com/2014/02/ejabberd-server-mysql-pyticq-transport/feed/ 0
Как освежить отношения с партнёром по e-mail http://omsklug.com/2013/09/face-email-header-creation-and-usage/ http://omsklug.com/2013/09/face-email-header-creation-and-usage/#comments Wed, 25 Sep 2013 08:22:31 +0000 Shroom http://omsklug.com/?p=1558 .local p {text-align: justify!important; text-justify: inter-word!important;} .local a {color: rgb(16, 8, 96)!important;} .local a:visited {color: Gray!important;} .local a:hover {text-decoration: underline; color: Blue!important;} .local code {font-family: Monospace,Courier!important;}

Всё, что вы хотели знать о заголовке (X-)Face, но боялись спросить

Статья рассказывает о заголовочных полях сообщений электронной почты X-Face и Face, о способах их генерации и внедрения в письмо. Также затронуты темы фильтрации изображений с помощью утилит из пакетов netpbm и ImageMagick.

Что такое e-mail message headers?

Заголовки (вернее, заголовочные поля) сообщений e-mail — это служебные поля данных, расположенные непосредственно перед телом сообщения и содержащие (как минимум) информацию об отправителе, дате отправки, получателе и пути следования письма. Физически они представляют собой строки, начинающиеся с зарезервированного служебного слова и заканчивающиеся переводом строки. От тела письма заголовок отделяется пустой строкой. В принципе, всё это давно было о писано в RFC 822 («Internet Message Format»), который к данному моменту окончательно устарел и был в своё время заменён на RFC 2822, который тоже уже устарел и был заменён на более новый RFC 5322.

Однако, если мы внимательно почитаем эти документы, то не найдём в них упоминаний ни о каких полях (X-)Face. В общем-то, это и правильно, поскольку RFC дают лишь то, что необходимо и достаточно для организации той или иной информационной инфраструктуры. А те поля, о которых пойдёт речь дальше, являются расширениями.

Для чего нужны поля (X-)Face?

Если очень коротко, то в этих полях может содержаться портрет отправителя письма или какой-нибудь логотип. Например, в Claws Mail это выглядит примерно так:


Пример отображения поля Face в почтовом клиенте Claws Mail

А теперь о том, как обстоят дела на самом деле…

А на самом деле о полноценном изображении речи в принципе не идёт. Во-первых, сам по себе размер картинки 48×48 точек не предполагает каких-либо эстетических изысков, поэтому портретное сходство будет веcьма общим. Во-вторых, ограничение на количество цветов делает задачу передачи этого самого сходства весьма нетривиальной. Например, формат X-Face определяет возможность передачи только чёрно-белой картинки. Поле Face может содержать уже цветную картинку, но количество цветов в ней, скорее всего, не будет превышать 30, поскольку есть очень жёсткие ограничения на объём информации.

Однако, нет поводов для беспокойства. Автор формата X-Face Джеймс Эштон на своей страничке буквально говорит о том, что «сделанные тщательно, с использованием дизеринга, [чёрно-белые] изображения лиц на удивление узнаваемы, даже с их небольшим размером». На самом деле никто не запрещает вместо портрета использовать скан личной подписи или какой-нибудь символ. А может быть и пару-тройку слов. Тем более, что изображение может быть цветным… Однако, описание подобных нетривиальных способов использования полей (X-)Face выходит за рамки данной статьи.

Способы создания картинок для поля Face

Поскольку поле X-Face давно можно считать морально устаревшим, сразу перейдём к генерации изображений для Face. Тем же, кто интересуется историческими артефактами, можно посоветовать поставить пакет compface, который, собственно, и предназначен для создания картинок в старом формате. Если же вы хотите моментально оценить, нужен ли вам X-Face, можно заглянуть на страницу онлайн-конвертора изображений в этот формат (благодарности за предоставленную ссылку — alexandrorodrigez).

Итак, для начала рассмотрим, какие ограничения накладываются на изображение для поля Face. Во-первых, это картинка в формате PNG. Во-вторых, размер изображения остаётся таким же, как и в X-Face и составляет 48×48 точек. В-третьих, размер файла жёстко ограничен сверху. Человек, предложивший использовать новый формат поля, Ларс Магне Ингебригтсен (по совместительству — автор программы Gnus) даёт довольно подробный расчёт размера этого самого png-файла, исходя из ограничений на размер поля по RFC, BASE64-кодирования и наличия дополнительной служебной информации. В сухом остатке получаем 725 байт максимум… Да, я тоже сначала подумал, что это невозможно. Однако, сейчас мы с вами узнаем, как же можно упихать в эти жалкие 700 байт какую-нибудь прикольную картинку.

Авторский способ

Собственно, Ларс предлагает конвертировать любую картинку в формат Face примерно вот так:

djpeg face.jpg | ppmnorm | pnmscale -width 48 -height 48 | ppmquant 7 | pnmtopng > face.png

Единственный параметр, который здесь можно менять, — это количество цветов, до которого ограничивается палитра выходного изображения (параметр для команды ppmquant). И то, в большинстве случаев менять его можно только в меньшую сторону, что отнюдь не способствует повышению эстетической ценности результата. Есть, правда, более гибкая команда — pnmquant, которой кроме количества уровней квантования можно также задавать алгоритмы, по которым будет производиться уменьшение цветов и предварительная фильтация. Тем не менее, результат оставляет желать лучшего:


Результат работы утилит из пакета netpbm

Если хотите побаловаться с этими утилитами самостоятельно, их можно найти в пакетах netpbm и libjpeg-progs.

Продвинутый способ

Для его использования нам понадобится откровенно тяжёлый (во всех смыслах) пакет ImageMagick. Однако, и качество результата будет значительно выше. Сразу же замечу, что чем меньше в исходном изображении мелких деталей и различимых цветов, чем больше крупных областей, залитых одним цветом, и чем ближе его размер к нужному нам 48×48 точек, тем меньше будет размер полученной картинки в байтах и тем больше у неё будет сходства с оригиналом.

Однако, ближе к делу! Вот пример командной строки, которая из картинки 225×269 (19Кб) делает картинку объёмом всего 722 байта (обратите внимание, что передпараметрами стоит одиночный знак «–», а не двойной «– –»):

convert face_big.jpg -filter gaussian -define filter:blur=0.75 -resize 48x48 -gravity center -extent 48x48 -unsharp 0x1 -normalize -quantize RGB +dither -colors 32 -posterize 6 -strip face.png

Если, как было указано выше, большого количества мелких деталей нет (или линейный размер исходного изображения не более, чем в 3-4 раза превышает целевой), то параметры -filter gaussian -define filter:blur=0.75 можно опустить. Они используются в качестве ВЧ-фильтра для исключения «шумовой» информации, которая будет практически неразличима в маленьком формате, но приведёт к увеличению объёма файла.

Параметр -resize 48x48 используется для изменения размера, а -gravity center -extent 48x48для центрирования изображения внутри квадрата 48×48. То есть, если картинка изначально квадратная, её можно не центрировать.

Команды -unsharp 0x1 -normalize позволяют несколько увеличить резкость после уменьшения размера и повысить контрастность и насыщенность за счёт нормализации цветов (это процесс растягивания гистограммы изображения с переводом 2% самых тёмных точек в чёрный цвет и 1% самых светлых — в белый).

Далее пойдёт некоторое количество магии, которая, собственно, и позволяет выкинуть бóльшую часть избыточности. Параметр -quantize RGB задаёт цветовое пространство для дальнейших преобразования палитры. Параметр +dither отключает (как это ни покажется странным со значком «+») дизеринг (процесс, который вносит искусственно сформированный шум, скрывая резкие переходы цветов и существенно увеличивая при этом размер файла). Параметр -colors 32 ограничивает палитру изображения 32 цветами (5 бит на пиксель). В данном случае 32 цвета — это отнюдь не догма, а отправная точка. Если объём результирующего файла оказался меньше 650 байт, можно попробовать повысить качество, ограничив палитру не 32, а 64 цветами (6 бит на пиксель). Если же по какой-то причине размер превысил жёсткое ограничение в 725 байт, количество цветов придётся уменьшить. Наконец, параметр -posterize 6 используется для дополнительного уменьшения количества цветов и увеличения площадей, залитых одним цветом, что способствует лучшему сжатию. Заметьте, что если поменять местами параметры -posterize и -colors, выигрыш в объёме будет не столь заметен. Это объясняется тем, что такая последовательность сначала пытается покрыть рисунок сеткой изолиний для выявления областей примерно одинакового цвета, а потом уменьшает количество цветов. Это приводит к тому, что найденные смежные области после сокращения палитры в общем случае не будут иметь один и тот же цвет, что приведёт к худшему сжатию. Но если сначала уменьшить количество цветов, а затем выявлять области с похожими цветами, эта стратегия даст значительный прирост количества связных областей, залитых одним и тем же цветом.

Из вышеизложенного следует логичный вопрос: если мы уменьшили количество цветов постеризацией, почему бы дополнительно не снизить количество бит на пиксель до 4 (использовать 16-цветную палитру)? Давайте проверим:

convert face_big.jpg -filter gaussian -define filter:blur=0.75 -resize 48x48 -gravity center -extent 48x48 -unsharp 0x1 -normalize -quantize RGB +dither -colors 32 -posterize 6 -colors 16 -strip face.png


Пример файла, полученного на выходе утилиты convert из пакета ImageMagick

Получили файл объёмом 683 байта (против 722 с 32 цветами). Весьма неплохо. Если хочется попытаться чуть-чуть улучшить качество, можно постеризовать изображение не до 6, а до 7 или 8 оттенков. Однако, это не всегда приводит к заметному улучшению, зато практически всегда увеличивает размер файла. Если же размер всё ещё больше 725 байт, можно попробовать использовать -posterize 5 (4 и ниже не рекомендую, поскольку это приведёт к серьёзным искажениям). Если и это не помогло, вероятно, следует выбрать другую картинку.

Да, кстати… Чуть не забыл! Параметр -strip не стóит недооценивать, даже несмотря на то, что он идёт последним. Он выполняет весьма важную в данном контексте функцию: убирает мета-информацию из файла. А это как минимум дата создания и модификации, которые занимают ещё пару-тройку десятков драгоценных байтов.

Использование

Теперь вернёмся к тому, ради чего, собственно, всё это и затевалось. То есть, к почтовым клиентам, которые поддерживают отображение полей (X-)Face.

  • Claws Mail отображает эти заголовки самостоятельно, без помощи плагинов.
  • Gnus, естественно, показывает (X-)Face, поскольку автор программы решил «доработать» старый формат поля именно для этого софта.
  • Thunderbird может показывать их с помощью плагинов; к данному моменту, вероятно, в живых остались только Mnenhy и Display Contact Photo.
  • KMail тоже умеет (вероятно, достаточно давно).
  • Balsa не афиширует эту возможность, хотя Ларс Ингебригтсен считает, что там вроде бы всё в порядке.
  • The Bat! считает, что это поле не является стандартным и, кроме того, проще прикрепить фотографию к контакту в адресной книге; соответственно, изображение не показывает (хотя был плагин для X-Face).

Если отображение заголовков обычно не является проблемой, то вставить заголовок в письмо не всегда является тривиальной задачей. Хорошо, если почтовый клиент позволяет хотя бы просто добавлять свои строки в дополнительные поля. Тогда можно пропустить полученный png-файл через утилиту base64 и вставить получившийся мусор закодированный файл в поле ввода, предоставленное клиентом. Но есть и такие, которые позволяют сгенерировать (X-)Face для каждого аккаунта автоматически. В качестве примера рассмотрим процедуру добавления поля Face в двух почтовых клиентах.

Claws Mail

Здесь всё просто. Всего-то нужно

  1. в главном меню программы выбрать пункт «Настройки…»,
  2. далее выбрать «Редактировать учётные записи…»,
  3. в появившемся окне выбрать нужную учётку (если их несколько, естественно, при необходимости придётся повторить процедуру для каждой),
  4. \item нажать на кнопку «Изменить»,
  5. в появившемся окне в списке слева выбрать пункт «Отправить»,
  6. установить чекбокс «Добавить заданный заголовок» и нажать на кнопку «Изменить»,
  7. в открывшемся окне в поле «Заголовок» выбрать «Face»,
  8. для заполнения поля «Значение» нажать кнопку «Просмотр» и выбрать подготовленный по вышеописанной процедуре png-файл,
  9. если не было ругани, нажать кнопку «Добавить»,
  10. закрыть все открытые окна настроек кнопкой «OK» (или «Закрыть»).

Если после этого отправить письмо с того аккаунта, в настройках которого мы только что загрузили картинку, то в результате должно получиться примерно то же, что и на самом первом рисунке.

Thunderbird

Сначала хотелось бы сказать большое спасибо alexandrorodrigez’у (OmskLUG) за то, что он нашёл время и энергию для определения работающего способа вставки и отображения заголовка (X-)Face для Thunderbird.

Итак, что нужно делать:

  1. зайти в Config Editor (Tools → Options → Advanced → General → Config Editor);
  2. добавить поля mail.identity.idN.headers (где N — номер почтового ящика) со значением «X-Face, Face» (без кавычек, естественно); безусловно, если это поле уже существует, то «X-Face, Face» нужно добавить через запятую к существующему списку значений};
  3. создать поле mail.identity.idN.header.X-Face и в качестве значения скопировать в него строку вашего 1-битного изображения, или
  4. создать поле mail.identity.idN.header.Face и в качестве значения скопировать в него base64-encoded строку вашего цветного изображения;
  5. закрыть Config Editor

Для проверки посылаем письмо с того аккаунта, который мы только что модифицировали. Если никаких специальных плагинов не подключено, в полученном письме увидим в числе прочих заполненное нами поле (X-)Face. Если же стоит, например, указанный выше плагин Display Contact Photo, рядом с обычными заголовками появится картинка. Примерно вот так:


Пример отбражения поля Face в почтовом клиенте Thunderbird

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


Спасибо за внимание!

Как обычно, полный текст этой статьи можно совершенно свободно скачать отсюда в формате PDF.

]]>
http://omsklug.com/2013/09/face-email-header-creation-and-usage/feed/ 0
Веб-регистрация пользователей ejabberd http://omsklug.com/2013/09/jabber-registration-interface/ http://omsklug.com/2013/09/jabber-registration-interface/#comments Thu, 12 Sep 2013 20:10:39 +0000 Plus http://omsklug.com/?p=1535

Итак имеется, настроенный ejabberd с базой данных на mysql. Необходимо сделать регистрацию через веб интерфейс. После долгих поисков модуля ejabberd для организации веб-регистрации клиентов, не нашлось ничего подходящего. По этому пришлось обратиться за помощью к php и mysql.

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

В качестве примера у нас это… Форма knopka.php:

<!DOCTYPE html>
<html>
<meta charset=”utf-8″/>
<head>
<script type=”text/javascript” src=”http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js”></script>
<script type=”text/javascript” src=”js/bootstrap.js”></script>
<link rel=”stylesheet” type=”text/css” href=”css/bootstrap.css”>
<link rel=”stylesheet” href=”css/reset.css”>
<link rel=”stylesheet” href=”css/animate.css”>
<link rel=”stylesheet” href=”css/styles.css”>
<title>Регистрация Jabber</title>

</head>
<body>
<button type=”button” onclick=”openModal();”>Регистрация Jabber</button>
<!– Modal –>
<div id=”myModal” tabindex=”-1″ role=”dialog” aria-labelledby=”myModalLabel” aria-hidden=”true”>
<div id=”container”>
<form action=”user.php” method=”post”>

<label for=”name”>Имя учетной записи:</label>
<p>
<input name=”login” type=”name” size=”15″ maxlength=”15″>
</p>
<label for=”username”>Пароль:</label>
<p><a href=”#”>Запишите пароль!</a>

<input name=”password” type=”password” size=”15″ maxlength=”15″>

<div id=”lower”>

<input type=”checkbox”><label for=”checkbox”>Я принимаю условия регистрации.</label>

<input type=”submit” name=”submit” value=”Регистрация”>
</div>
</form>
</div>
</div>

<!–div>
</div–>

<script type=”text/javascript”>
function openModal(){
$(‘#myModal’).modal(‘show’);
}
</script>
</body>
</html>

Думаю тут все понятно и не требует дополнительных пояснений.

след файл mysql.php с параметрами подключения к базе:

<?php
$db = mysql_connect (“localhost”,”root”,”1″);
if($db)
mysql_select_db (“test”,$db);
else
{
echo “ошибка подключения к БД”;
}
?>

И третий файл user.php, который отвечает за помещение данных в базу.

<?php
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == ”) { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password ==”) { unset($password);} }
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
exit (“Вы ввели не всю информацию, вернитесь назад и заполните все поля!”);
}
//если логин и пароль введены, то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
// подключаемся к базе
include (“mysql.php”);// файл mysql.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь 
// проверка на существование пользователя с таким же логином
$result = mysql_query(“SELECT id FROM users WHERE username=’$login’”,$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {
exit (“Извините, введённый вами логин уже зарегистрирован. Введите другой логин.”);
}
// если такого нет, то сохраняем данные
$result2 = mysql_query (“INSERT INTO users (login,password) VALUES(‘$login’,'$password’)”);
// Проверяем, есть ли ошибки
if ($result2==’TRUE’)
{
echo “Вы успешно зарегистрированы! Теперь вы можете зайти под своим JID. “;
header(“Location: http://localhost”);
}
else {
echo “Ошибка! Вы не зарегистрированы.”;
}
?>

Ну и конечно же нужно помнить что базу и таблицу выбираем именно как таблицу пользователей в базе mysql ejabberd, “user”.

В качестве оформления можете воспользоваться css framework или накидать дизайн самостоятельно.

css.tar - в архиве файлы с формой и оформлением.

]]>
http://omsklug.com/2013/09/jabber-registration-interface/feed/ 0
Потоковое вещание с минимальными затратами http://omsklug.com/2013/05/potokovoe-veshhanie-s-minimalnymi-zatratami/ http://omsklug.com/2013/05/potokovoe-veshhanie-s-minimalnymi-zatratami/#comments Thu, 23 May 2013 06:53:53 +0000 Plus http://omsklug.com/?p=1479 Добрый день. Сегодня разберемся как пустить потоковое аудио по сетям с минимальными затратами.

Я использовал: Ubuntu Server, пакет mpd, Sonata – приложение для управления плеером, ну и любой проигрыватель.

Итак имеем комп уже с установленной системой и настроеным ssh доступом. Это виртуальная машина, с диском всего в 5 Gb. Есть папка с музыкой в сети, вот с нее и будем крутить музыку, для этого монтируем каталог:

mount.cifs //10.10.0.1/public /mnt/music

Далее ставим пакет mpd:
sudo apt-get install mpd
и правим его конфиг /etc/mpd.conf
настройка сложные, они есть тут.
В рамках статьи привожу только наиболее важные:

Координаты до папки с музыкой # Files and directories ##################### music_directory "/home/имя_пользователя/Музыка" 

Имя пользователя от которого работает демон # General music daemon options ######################### user "имя_пользователя"
Настройка доступа к управлению плеером
# For network bind_to_address "any" port "6600"
Обновление плейлиста auto_update "yes"

Доступ к функциям демона по умолчанию:
# Permissions ############################# default_permissions "read,add,control,admin" # #####################################

настройка сервера вещания

audio_output {         type            "httpd"         name            "Radio Name"         encoder         "vorbis"                # optional, vorbis or lame        port            "8000"         quality         "5.0"                   # do not define if bitrate is defined #bitrate         "128"                   # do not define if quality is defined        format          "44100:16:1" }

Тип эмулятора громкости
# Volume control mixer ######################## mixer_type "software" ############################################# 

После этого можно будет посмотреть браузером http://ваш_Ip:8000 на плеер.
Для того чтобы начать трансляцию,нужно ее запустить, составив плейлист.
Можно воспользоваться консольным плеером mpc, установить Sonata или
воспользоваться аналогичным интерфейсом управления.
В настройках подключения указать параметры и добавить вашу медиатеку в плейлист.
Пакет устанавливается просто: sudo apt-get install sonata.  Добавление треков в плейлист:
Ну первым делом проверяем их доступность в нужной папке.
Далее на сервере выполняем: mpc update
 Далее открываем приложение Sonata

Во вкладке Library (фонотека) будет список всех дорожек, выделяем необходимые.
Правым кликом вызываем контекстное меню, выбераем добавить.
]]>
http://omsklug.com/2013/05/potokovoe-veshhanie-s-minimalnymi-zatratami/feed/ 0
Сборка unstable-версии Wine для stable-ветки Debian (TrueЪ Debian-way) http://omsklug.com/2013/01/build-wine-on-debian-stable/ http://omsklug.com/2013/01/build-wine-on-debian-stable/#comments Thu, 10 Jan 2013 11:36:24 +0000 Shroom http://omsklug.com/?p=1362

Аннотация

В статье описан способ получения набора пакетов последней версии Wine для stable-ветки Debian GNU/Linux. В качестве инструмента используется утилита dpkg-buildpackage. Также кратко описан вариант использования dh_make.

Где найти?

Первая мысль, которая приходит в ответ на вопрос, где взять свежий Wine, — посмотреть собственно на сайте WineHQ в разделе Wine downloads (http://www.winehq.org/download/). Однако, как можно обнаружить при детальном исследовании ссылок на этой странице, никаких бинарников там нет. На самом же деле всё, что нам нужно, хранится на сайте стороннего разработчика, который и публикует сборки для Debian sid/unstable, а также выкладывает исходники с патчами. То есть, если у вас стоит sid (или подключены репозитории от unstable и experimental для разрешения зависимостей), вы можете взять пакеты прямо отсюда: http://dev.carbon-project.org/debian/wine-unstable/. Если же вы предпочитаете стабильность, но при этом хотите использовать новейшие разработки создателей Wine, придётся качать исходники. Ссылки на них размещены на этой же странице в разделе Source package. Фактически для сборки понадобятся два архива: wine-unstable_1.5.5.orig.tar.bz2 (это собственно дерево исходников) и wine-unstable_1.5.5-0.1.debian.tar.bz2 (это параметры для системы сборки пакетов). А файл wine-unstable_1.5.5-0.1.dsc — это подписанное маинтейнером описание архивов с исходниками.

С чего начать?

  1. Распаковать архив wine-unstable_1.5.5.orig.tar.bz2. Получится каталог wine-1.5.5.
  2. Распаковать архив wine-unstable_1.5.5-0.1.debian.tar.bz2 внутрь каталога wine-1.5.5. Таким образом внутри wine-1.5.5 должен появиться каталог с именем debian.
  3. Проверить, есть ли в системе пакет dpkg-dev (dpkg-buildpackage находится именно в нём): выполнить dpkg -l dpkg-dev | grep ii — если в результате вернётся строка с кратким описанием пакета, значит он уже есть, если ничего не будет, значит его нет. Если такой пакет не установлен, это недоразумение нужно исправить, выполнив apt-get install dpkg-dev.
  4. Перейти в wine-1.5.5 и запустить dpkg-buildpackage -b -us -uc (значения ключей будут описаны в следующем разделе). Если после всевозможных проверок сразу же началась компиляция, значит по какой-то волшебной причине у вас уже были поставлены все пакеты, от которых зависит сборка Wine. Если же процесс ещё и завершился корректно с кучей пакетов на выходе, вас можно только поздравить. Однако, с большой степенью вероятности dpkg-buildpackage завершится через пару секунд, вывалив примерно такое сообщение:
    dpkg-checkbuilddeps: Неудовлетворённые сборочные зависимости:
    debhelper flex bison libx11-dev libxext-dev libxi-dev
    libxrandr-dev libxrender-dev libxt-dev libxkbfile-dev
    libxxf86dga-dev libxxf86vm-dev libxinerama-dev libxcomposite-dev
    libgl1-mesa-dev | libgl-dev libglu1-mesa-dev | libglu-dev
    freeglut3-dev | libglut-dev libxmu-dev libxcursor-dev
    libncurses5-dev libcups2-dev libjpeg-dev libpng-dev
    libfreetype6-dev libfontconfig1-dev libopenal-dev libasound2-dev
    oss4-dev libsane-dev libusb-dev libgsm1-dev libmpg123-dev
    libcapi20-dev libdbus-1-dev | dbus-1-dev libgphoto2-2-dev
    liblcms1-dev libldap2-dev libssl-dev libgnutls-dev libxml2-dev
    libxslt1-dev unixodbc-dev prelink dctrl-tools | grep-dctrl lzma
    sharutils libgstreamer-plugins-base0.10-dev gettext valgrind
    dpkg-buildpackage: предупреждение: Неудовлетворительные
    зависимости/конфликты при сборке, останов.

  5. Поставить все пакеты из списка неудовлетворённых зависимостей, полученного на предыдущем шаге. Обратите внимание на пары имён пакетов, разделённых символом «|» («конвейер»). Это альтернативы, то есть одно имя соответствует реальному пакету, который найдётся в репозитории, а второе имя — это или виртуальный пакет, или устаревшее название. И ставить нужно реальный пакет. Так что, прежде чем копировать кучей сразу все названия в командную строку после apt-get install, выясните, какие из названий, разделённых «|», реально присутствуют в репозитории (например, через apt-cache search <regexp> или dpkg -l <regexp>.

Как собрать?

Совершенно тривиально:
dpkg-buildpackage -b -us -uc

После тучи ошибок первого запуска dpkg-buildpackage наверняка предложил во второй раз запустить себя с ключом -d. Этот ключ означает «не определять зависимости». Если вы уверены, что ничего не упустили, можно, конечно, добавить и его… Но ведь заранее никогда не знаешь… Поэтому перезапускаем как есть, с теми же тремя ключами:

-b
Ключ, предписывающий собирать только бинарные пакеты, без упаковки исходников. Без этого ключа dpkg-buildpackage попытается создать src-deb и будет искать архив с исходниками (то есть wine-unstable_1.5.5.orig.tar.bz2) рядом с каталогом сборки (то есть с wine-1.5.5). Если всё будет на месте, дополнительно получим ещё один пакет, который, впрочем, никому особо не нужен. И чтобы не множить сущности, ставим этот ключ.
-us
Не пытаться подписать .dsc-файл.
-uc
Не пытаться подписать файл .changes.

С момента запуска процесса сборки до получения набора пакетов может пройти (в зависимости от скорости работы компьютера) от 20 минут до полутора часов. В это время можно курить бамбук пить чай или кофе, поскольку возможности каким-либо образом повлиять на процесс до его окончания уже не представится.

Если всё прошло удачно, то в результате вы получите примерно такой список пакетов:

  • libwine-alsa-unstable_1.5.5-0.1_i386.deb
  • libwine-bin-unstable_1.5.5-0.1_i386.deb
  • libwine-capi-unstable_1.5.5-0.1_i386.deb
  • libwine-cms-unstable_1.5.5-0.1_i386.deb
  • libwine-dbg-unstable_1.5.5-0.1_i386.deb
  • libwine-dev-unstable_1.5.5-0.1_i386.deb
  • libwine-gl-unstable_1.5.5-0.1_i386.deb
  • libwine-gphoto2-unstable_1.5.5-0.1_i386.deb
  • libwine-ldap-unstable_1.5.5-0.1_i386.deb
  • libwine-openal-unstable_1.5.5-0.1_i386.deb
  • libwine-oss-unstable_1.5.5-0.1_i386.deb
  • libwine-print-unstable_1.5.5-0.1_i386.deb
  • libwine-sane-unstable_1.5.5-0.1_i386.deb
  • libwine-unstable_1.5.5-0.1_i386.deb
  • wine-bin-unstable_1.5.5-0.1_i386.deb
  • wine-unstable_1.5.5-0.1_i386.deb

Сразу замечу, что некоторые из пакетов можно не ставить:

libwine-cms-unstable_1.5.5-0.1_i386.deb
если вам не нужна система управления цветом (Color Management System) под вайном (то есть, если вы не собираетесь калибровать ваши монитор, принтер и сканер из-под Wine);
libwine-dbg-unstable_1.5.5-0.1_i386.deb
поскольку это отладочные символы для бинарников;
libwine-dev-unstable_1.5.5-0.1_i386.deb
потому что этот пакет нужен для разработки под Wine;
libwine-gphoto2-unstable_1.5.5-0.1_i386.deb
если вы не собираетесь смотреть фотки со своего цифрового фотоаппарата из виндовых приложений, запущенных под Wine’ом;
libwine-ldap-unstable_1.5.5-0.1_i386.deb
если вы не собираетесь авторизоваться через Wine в домене;
libwine-oss-unstable_1.5.5-0.1_i386.deb
поскольку технология OSS в Линуксе считается атавизмом (в отличие, например, от BSD-систем);
libwine-sane-unstable_1.5.5-0.1_i386.deb
если вы не собираетесь давать виндовым приложениям доступ к вашему сканеру.

Если же вожделенных пакетов вы так и не обнаружили… Что ж, переходите к чтению следующего раздела.

Что делать, если что-то пошло не так?

Во-первых, ещё раз проверить зависимости. Если какой-то пакет не ставится — скорее всего, вы пытаетесь поставить альтернативный вариант, который стоит рядом с «|». В этом случае нужно ставить тот пакет, который записан с другой стороны от значка конвейера.

Во-вторых, проверить, не поломалась ли структура «дебианизации» дерева исходников — содержимое каталога debian. Если есть сомнения, его нужно прибить и распаковать заново из скачанного архива. В данном случае из-за отсутствия некоторых специфических настроек в debian/rules после сборки могут запуститься тесты, которые на подавляющем большинстве систем будут давать сбои (как заявляют сами разработчики Wine’а в одном из списков рассылки). А потеряться эти настройки могут, если по ошибке каталог debian будет перезаписан или удалён и создан заново по шаблону с помощью команды dh_make.

В-третьих, прочитать man по dpkg-buildpackage и понять, какие параметры реально нужны в данной ситуации. Например, если его запускать без ключа -b, дополнительно будет собран src-пакет. Вернее, он будет собран, если рядом с каталогом wine-1.5.5 будет обнаружен архив wine-unstable_1.5.5.orig.tar.bz2. В противном случае вам предъявят следующее:

…
dpkg-source: ошибка: невозможно собрать с форматом
исходника «3.0 (quilt)»: файл orig.tar не найден
dpkg-buildpackage: ошибка:
dpkg-source -b wine-1.5.5 возвратил код ошибки 255
…

И если после этого захотеть исправить ситуацию с помощью dh_make, как об этом пишут на некоторых форумах, мы получим сброшенные настройки правил сборки пакетов и вернёмся к пункту «во-вторых».

И последнее. Все операции, кроме установки пакетов, осуществляются с правами обычного пользователя. Если в процессе сборки от вас потребовали права администратора, скорее всего, у вас не установлен пакет fakeroot (или подобный).

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

Что же такое dh_make?

Как сказано в мануале, это утилита для подготовки оригинальных сырцов к сборке из них дебиановского пакета. Вопрос «для чего это нужно?» мы сейчас рассматривать не будем, поскольку он является, скорее, философским и вполне может стать поводом для новой войны. В данном случае нас больше интересует, как это сделать.

Итак, если у вас есть просто голые исходники чего-либо (слитые, например, из какого-то репозитория на github или SourceForge), и вам позарез нужно сделать из них .deb-пакет, вам нужно будет совершить несколько нехитрых действий.

Самое первое — конечно же, распаковать архив с исходниками. Название директории после распаковки может быть, вообще говоря, любым, но для использования с dh_make нужно привести его к виду <названиепакета>-<версия>, причём <названиепакета> обязано содержать только маленькие буквы латинского алфавита, возможно, с цифрами и знаками «-» (обычный минус).

Следующим шагом будет собственно зайти в переименованную директорию и запустить там dh_make. И тут, как обычно, начинаются разные «но» и «если». Если не указан ключ --native, dh_make будет искать рядом с каталогом исходников архив вида <названиепакета>-<версия>.orig.tar.gz (впрочем, он может быть не только .gz, но также и .bz2, и .lzma). Если там такого файла нет, но указан ключ -f <имяфайла>, то dh_make скопирует <имяфайла> и использует его в качестве оригинального архива. Если же ключ -f не указан, но есть ключ --createorig, то dh_make создаст архив из текущего дерева исходников. Архив, кстати, нужен будет другим утилитам для генерации различий между оригинальными файлами и обновлёнными версиями (соответственно, для подготовки патчсета) и для построения дебиановской структуры src-пакета.

После того, как разобрались с архивом, нужно будет ответить на дополнительный вопрос: что мы хотим получить в результате — единственный пакет (single binary), архитектурно-независимые файлы (arch-independent), несколько пакетов (multiple binary), библиотеку (library), модуль ядра (kernel module) или же патч для ядра (kernel patch). От сделанного выбора будут зависеть параметры, которые dh_make запишет в структуру внутри каталога debian.

В сущности, это всё. После того, как dh_make отработал (будем надеяться, без ошибок), можно переходить к процедуре сборки пакета с помощью dpkg-buildpackage.

На самом же деле, если вы не собираетесь становиться маинтэйнером, скорее всего, эта утилита вам никогда не понадобится.

Благодарности

Автор выражает признательность члену OmskLUG с ником Lumpy за осуществление на практике и тестирование всего процесса, описанного в этом руководстве.

Спасибо за внимание!

Эту статью можно скачать в формате PDF отсюда совершенно свободно.

]]> http://omsklug.com/2013/01/build-wine-on-debian-stable/feed/ 0