воскресенье, 21 ноября 2010 г.

Настраиваем IMAP-сервер Dovecot и fetchmail на сбор почты и доставку через deliver (без полноценного MDA)

Задача: установить на машине в локальной сети IMAP-сервер, который будет забирать почту с внешнего IMAP-сервера, удаляя письма оттуда. Никакие антиспам-фильтры или антивирусы нам не нужны, за нас это сделает провайдер почтового сервиса. В качестве пользователей должен использоваться отдельный список, пользователи системы нам не подходят. Желательно всё это с минимальными телодвижениями и с минимальным количеством задействованного софта, т.к. по-моему чем больше в системе компонентов, тем больше у нее шансов сломаться.

Выбранный софт:
  • Dovecot - простой в настройке, быстрый IMAP-сервер (есть вариант и POP-сервера)
  • Fetchmail - программа для сбора почты и пересылки ее локальному агенту доставки сообщений
  • Imapsync - программа для синхронизации и переноса IMAP-ящиков с одного сервера на другой, нужна один раз. Авторы теперь хотят за нее денег, но она есть в любом нормальном Linux-дистрибутиве, так что покупать ее не придется
Обычно в статьях к этому списку добавляют MDA, который и будет доставлять почту локальным пользователям, но мы воспользуемся программой deliver, идущей в комплекте с Dovecot, тем самым исключив дополнительный компонент.

Для примеров будем использовать следующие параметры:
  • imap.external.com - внешний сервер, с которого нужно забирать почту
  • imap.localserv.net - сервер в локальной сети, на котором будут работать Dovecot и fetchmail
  • joe - имя пользователя, для которого мы будем настраивать ящик

1. Настраиваем Dovecot.
Для начала создадим нового пользователя от имени которого будут работать сессии пользователей при обращении к ящикам.
# adduser --system --group vmail
Утилита любезно создаст нам домашнюю папку, в которой мы и будем хранить почту всех пользователей (/home/vmail)

Далее создаем нашу базу пользователей в файле /etc/dovecot/passwd Файл имеет формат
username[@localserv.net]:{SCHEMA}password
Домен указывать не обязательно. Схемы аутентификации - это формат хранения пароля. Для тестов можно использовать PLAIN - пароль нужно вписывать открытым текстом. Для полноценного использования подойдет схема SSHA. Для получения хэша пароля в этом формате есть утилита dovecotpw:
# dovecotpw -s ssha
Она попросит 2 раза ввести пароль, а в ответ выдаст хэш вместе со схемой, это и нужно вставить в файл. Приведу простой пример файла:
test:{PLAIN}pass
joe:{SSHA}DNODS3ZrOq1bu2MasNk79LxHhlU9iI03
Далее нужно сделать этот файл доступным на чтение только пользователю dovecot, от имени которого запускается демон:
# chown dovecot:dovecot /etc/dovecot/passwd
# chmod go-rwx /etc/dovecot/passwd
Теперь пишем основной конфиг /etc/dovecot/dovecot.conf

Буду приводить только изменения относительно конфига по-умолчанию в Debian.

Включаем поддержку IMAP с шифрованием. Если нужно без шифрования, то используем imap. Можно указать оба способа через пробел.
protocols = imaps
Пишем журнал в отдельные файлы. Если нужно использовать syslog, необходимо убрать пути к файлам (задать пустые параметры).
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
Задаем формат хранения почты maildir:
mail_location = maildir:~/Maildir
Далее нам нужно узнать uid нашего пользователя vmail. Для этого запускаем команду:
# id -u vmail
Она и покажет uid указанного пользователя, в моем случае он равен 113. Теперь в конфиге задаем минимальный и максимальный uid, под которыми могут работать пользовательские сессии:
first_valid_uid = 113
last_valid_uid = 113
Далее нужно добавить секцию с настройками протокола LDA (Local Delivery Agent), т.е. это настройки программы deliver из состава Dovecot. Что указывать в качестве параметра postmaster - понятия не имею, указал первого попавшегося локального пользователя. Думаю, этот ящик в нашей конфигурации использоваться не будет, т.к. на него должны отправляться "отвергнутые" письма, которых у нас не будет за неимением анти-спам и анти-вирусных фильтров. В качестве hostname нужно указать доменное имя вашего сервера. auth_socket_path - путь к сокету аутентификации, через него deliver будет подключаться к основному процессу Dovecot для получения привилегий. Здесь же указываем отдельные файлы для журналов deliver. По аналогии с основными журналами, можно воспользоваться syslog, задав параметры пустыми значениями. Вот как будет выглядеть вся секция:
protocol lda {
  postmaster_address = user1@example.com
  hostname = imap.localserv.net
  auth_socket_path = /var/run/dovecot/auth-master
  log_path = /var/log/fetchmail/dovecot-deliver.log
  info_log_path = /var/log/fetchmail/dovecot-deliver-info.log
}
Для более детального журналирования процесса аутентификации можно на этапе отладки включить следующую опцию (после тестирования ее желательно убрать):
auth_verbose = yes
Все дальнейшие изменения будут производиться в секции auth default {...}.

Первым делом выключаем аутентификацию через PAM и базу пользователей по-умолчанию, закомментировав всё в подсекциях passdb pam {...} и userdb passwd {...}.

Далее подключаем базу паролей из нашего файла:
passdb passwd-file {
  args = /etc/dovecot/passwd
}
Для сессий работы с почтой указываем системного пользователя и папку под почту:
userdb static {
  args = uid=vmail gid=vmail home=/home/vmail/%u
}
Комментируем строчку, которая запускает один из процессов от root'а. Судя по описанию, нам это не нужно.
#user = root
И наконец, создаем сокет, чтобы deliver смог подключиться к основному процессу для получения привилегий:
socket listen {
  master {
    path = /var/run/dovecot/auth-master
    mode = 0600
    user = vmail
    group = vmail
  }
}
Сохраняем конфиг. Перезагружаем Dovecot:
# /etc/init.d/dovecot restart
2. Настраиваем Fetchmail
Нормальную документацию по написанию конфигов для этой программы я так и не нашел, всё взято из примеров на форумах, в блогах и списках рассылки. Ее можно запускать как общесистемного демона или в сессии пользователя, нас конечно же интересует первый вариант.

Конфиг лежит в файле /etc/fetchmailrc Здесь я сразу приведу пример всего конфига. Настроен демон будет на получение новых писем каждые 2 минуты (на самом деле, это очень часто, лучше поставить 5-10 минут). Журнал будет записываться в отдельный файл (хотя, опять же, можно использовать syslog). C postmaster та же история, что и для deliver, - в случае проблем с доставкой письмо просто не удаляется с внешнего сервера и, по видимому, в ящике postmaster нет необходиимости, но всё же укажем нашего системного пользователя.

Настройки аккаунтов представляют собой этакие предложения, для удобства записал их в несколько строчек. Разберем на примере:
  • poll imap.external.com protocol imap
    здесь указываем адрес внешнего сервера и протокол по которому нужно проверять новые письма

  • user "joe" there with password "joe-password"
    указываем пользователя на внешнем сервере и его пароль там

  • options ssl
    указываем опции через пробел, ssl говорит о том, что нужно использовать шифрованный канал (в соответствии с этой опцией и указанным протоколом, fetchmail автоматически выбирает порт для соединения); для тестирования будет полезна опция keep, позволяющая оставлять письма на сервере
     
  • sslcertpath /home/vmail/.certs
    отдельная история, опишу ее после конфига

  • mda "/usr/lib/dovecot/deliver -d joe";
    здесь мы указываем программу доставки сообщений, причем для deliver нужно указать через параметр -d имя пользователя, в ящик которого придут письма с этого внешнего аккаунта
А теперь полностью пример конфига для двух пользователей:
set daemon 120       # Poll every 2 minutes
set no syslog        # Alternate log
set logfile /var/log/fetchmail/fetchmail.log
set postmaster user1   # In case of errors mails are delivered here

set no bouncemail    # avoid loss on 4xx errors
                     # on the other hand, 5xx errors get more dangerous

# Defaults
defaults:
timeout 60
batchlimit 100

# Accounts to poll
## test@external.com ##
poll imap.external.com protocol imap
user "test" there with password "secret-external-server-password"
options ssl
sslcertpath /home/vmail/.certs
mda "/usr/lib/dovecot/deliver -d test";

## joe@external.com ##
poll imap.external.com protocol imap
user "joe" there with password "joe-password"
options ssl
sslcertpath /home/vmail/.certs
mda "/usr/lib/dovecot/deliver -d joe";
А теперь одна особенность внешнего сервера, с которым мне пришлось работать. Они используют сертификаты, подписанные своим центром сертификации, поэтому пришлось скачать их корневой сертификат, положить его в папку /home/vmail/.certs и сменить ему расширение на ".pem". После этого нужно обновить индексы в папке с сертификатами, для этого запускаем:
# c_rehash /home/vmail/.certs
Сертификаты готовы к использованию.

Если мы попробуем запустить демона fetchmail от одноименного пользователя (как настроено по-умолчанию в Debian), у нас ничего не выйдет - deliver будет ругаться на отсутствие прав и невозможность сохранить письмо.

Скорее всего, в ближайшем будущем найду решение без этого шага, но пока работает только так. Нужно сменить пользователя от имени которого запускается fetchmail. Мы будем запускать ее от имени vmail, чтобы порожденный ею процесс deliver смог сохранить письма в папки виртуальных пользователей. Для этого в файле /etc/default/fetchmail вносим следующие изменения (заодно включим запуск fetchmail в качестве демона при старте системы):
START_DAEMON=yes
USER=vmail
Сохраняем файл. И пока не запускаем fetchmail, т.к. есть еще один шаг, если вы настраиваете систему для не новых ящиков и в папках на внешнем сервере уже лежат письма.

3. Миграция IMAP-ящиков с помощью imapsync
Ваши пользователи наверняка захотят, чтобы все их пометки, папки и другие данные с IMAP-ящиков внешнего сервера полностью перенеслись на локальный сервер.

Чтобы не светить пароли в списке процессов, создаем для каждого пользователя по 2 файла, содержащие пароли от внешнего и локального ящиков. Сначала подготовим папку для них:
# mkdir /home/vmail/.pass
# cd /home/vmail/.pass
Эти процедуры нужно повторить для каждого перемещаемого пользователя:
# touch joe.remote joe.local
# chown root joe.remote joe.local
# chmod 0600 joe.remote joe.local
И затем вписать в созданные файлы соответствующие пароли с помощью вашего любимого текстового редактора.

Далее начинается самое веселье. Нужно методом поиска в интернете, чтения невнятного мануала к imapsync и других магических манипуляций подобрать опции для каждого из IMAP-серверов.  Опишу опции, которые пришлось использовать мне. Большинство опций имеют на конце цифру 1 - сервер, с которого будут переноситься письма, или 2 - сервер, на который они будут переноситься. Итак, опции (те, что имеют вариант для каждого из серверов приведены с 1 на конце):
  • --host1 imap.external.com
    имя сервера

  • --port1 993
    порт для подключения

  • --user1 "joe"
    имя пользователя для аутентификации

  • --passfile1 /home/vmail/.pass/joe.remote
    путь к файлу с паролем

  • --ssl1
    использовать ли шифроввание при подключении к серверу

  • --noauthmd5
    общая опция (одна и работает сразу для обоих серверов), отключает использование аутентификации по MD5; нужна, если программа при запуске выдаст ошибку о невозможности использования такого метода аутентификации

  • --sep1 "."
    --prefix1 ""
    префикс и разделитель в именах папок, они нужны если imapsync не может определить их автоматически и явно просит указать одну из них, или возникают проблемы с недопустимыми именами при создании папок в процессе синхронизации; как их определять - расскажу ниже

  • --delete
    --expunge1
    после первой удачной синхронизации нужно добавить эти опции и запустить imapsync еще раз для удаления писем с внешнего сервера; имейте ввиду, что --expunge2 указывать не нужно
Итак, в самом простом случае для каждого аккаунта нужно запустить imapsync 2 раза. Второй раз - только убедившись, что всё перенеслось как следует, для очистки ящика на внешнем сервере. Переносим почту:
# imapsync --ssl1 --ssl2 --noauthmd5 --host1 imap.external.com --port1 993 --host2 imap.localserv.net --port2 993 --user1 "joe" --passfile1 /home/vmail/.pass/joe.remote --user2 joe --passfile2 /home/vmail/.pass/joe.local
Второй раз запускаем уже с опциями удаления:
# imapsync --ssl1 --ssl2 --noauthmd5 --host1 imap.external.com --port1 993 --host2 imap.localserv.net --port2 993 --user1 "joe" --passfile1 /home/vmail/.pass/joe.remote --user2 joe --passfile2 /home/vmail/.pass/joe.local --delete --expunge1
Теперь самое веселое, если imapsync не может определить префиксы и разделители пути на серверах, нужно соединиться с сервером (мы будем использоовать защищенное соединение), вручную залогиниться и запросить перечисление папок. Тогда мы увидим как он представляет папки и сможем это объяснить imapsync.

Соединяемся с сервером:
$ openssl s_client -connect imap.external.com:993
если видим в конце ответа
* OK IMAP4 ready
значит всё в порядке, можно разговаривать с сервером. Проходим аутентификацию:
1 login joe joe-password
видим
1 OK LOGIN Ok.
далее набираем по очереди 2 команды и анализируем их результат:
2 list "*" ""
3 list "" "*"
результат будет иметь вид, похожий на следующее:
* LIST (\HasNoChildren) "." "INBOX.Archive"
* LIST (\HasNoChildren) "." "INBOX.Sent"
* LIST (\HasNoChildren) "." "INBOX.Draft"
Это означает, что префикса у пути нет, а разделитель папок - точка. В результате параметры будут
--prefix1 "" --sep1 "."
То же самое нужно повторить и для локального сервера.

4. Контрольный запуск и исправление ошибок.
После того, как все письма перенесены на локальный сервер, можно запускать демона fetchmail и тестировать его работу:
# /etc/init.d/fetchmail start
Т.к. эта статья пишется "по горячим следам" после настройки сервера и переноса ящиков, скорее всего я забыл про какие-нибудь права на папки и файлы (например, файлы журнала). Внимательно читаем сообщения об ошибках при старте демонов или в логах, думаем головой, исправляем их и не забываем упомянуть об этом в комментариях к статье.

пятница, 20 августа 2010 г.

Установка Jabber-сервера Prosody и транспорта Spectrum на Debian VDS

В этой статье попробуем настроить Jabber-сервер Prosody в связке с транспортом Spectrum на VDS под управлением Debian 5 Lenny (о настройке Debian под минимальный тариф VDS читайте в предыдущей статье).

Перед установкой нужно правильно выставить настройки DNS, чтобы все используемые доменные имена вели к IP сервера. В моем случае просто были созданы одна A-запись для домена, где расположен сам сервер и 2 псевдонима для субдоменов под транспорты. Т.е. если вы настраиваете к примеру сервер на example.com, а транспорты на icq.example.com и gtalk.example.com, то все 3 доменных имени должны вести к IP-адресу вашего сервера (для примера возьмем IP-адрес 7.7.7.7). Схематично это будет выглядеть вот так:
example.com -> 7.7.7.7
gtalk.example.com -> 7.7.7.7
icq.example.com -> 7.7.7.7
Это не лучший вариант, но он просто работает. Настройку SRV-записей попробую позже и обязательно опишу процесс в отдельной статье.

1) Подключаем нужные репозитории и импортируем ключи для проверки подлинности пакетов. Растолкаем их в отдельные файлы, чтобы не засорять основной конфиг:
# echo "deb http://packages.prosody.im/debian stable main" > /etc/apt/sources.list.d/prosody.list
# wget http://prosody.im/files/prosody-debian-packages.key -O- | apt-key add -
# echo "deb http://packages.spectrum.im lenny spectrum" > /etc/apt/sources.list.d/spectrum.list
# wget -O - http://packages.spectrum.im/keys/apt-repository@fsinf.at | apt-key add -
# apt-get update
2) Устанавливаем и настраиваем Prosody.
# apt-get install prosody
Дальше открываем конфиг /etc/prosody/prosody.cfg.lua и начинаем править. Строчный комментарий здесь - это два дефиса, т.е. "--" без кавычек.
На сайте Prosody, кстати, есть отличная документация по настройке.
Во-первых, выключаем все ненужные модули. Пока что я оставил только группу "Generally required", а так же модули "uptime" и "posix". Теперь создаем виртуальный хост:
VirtualHost "example.com"
        enabled = true
Учтите, что все опции, идущие после виртуального хоста, относятся только к нему. Глобальные настройки должны идти до виртуальных хостов.

Ну и сразу подготовимся к поддержке транспортов, добавим их в конфиг. Настройки компонентов должны быть в виртуальном хосте (после VirtualHost). Пароли для разных транспортов можно задать разные. Например, для транспортов gtalk и icq настройки будут выглядеть так:
Component "gtalk.example.com"
        component_secret = "ваш-очень-секретный-пароль"
Component "icq.example.com"
        component_secret = "ваш-супер-секретный-пароль"
По-умолчанию сервер принимает соединения от компонентов (транспортов) только на локальном интерфейсе 127.0.0.1, порт 5347.

Сохраняем файл конфигурации. Перезапускаем Prosody:
# /etc/init.d/prosody restart
3) Устанавливаем и настраиваем многопротокольный транспорт Spectrum. Попробуем настроить только протоколы ICQ и Jabber (Gtalk).
Как говорит нам документация по установке Spectrum, чтобы libpurple не установила еще вагон пакетов, ставим сначала минимальную ее версию, а затем уже сам транспорт:
# apt-get install libpurple0-minimal
# apt-get install spectrum
Переходим в папку с настройками Spectrum:
# cd /etc/spectrum
Далее настраиваем ICQ, для Jabber всё делается аналогично, заменяя везде icq на xmpp. Скопируем пример конфига и начнем его правку:
# cp spectrum.cfg.example icq.cfg
# chown root:spectrum icq.cfg
# chmod o-rwx icq.cfg
# nano icq.cfg
В самом простом случае нам нужно изменить только следующие параметры (секция [service]):
  • Сразу после "enable=1" нужно создать строчку
    encoding=CP1251
    Это должно решить проблему с кодировками в ICQ. Для Jabber этого делать не нужно!
  • protocol - задать протокол, с которым будет работать данный экземпляр транспорта (на каждый протокол будет запускаться по экземпляру транспорта). В комментариях написано какие протоколы поддерживает транспорт, нам нужно:
    protocol=icq
  • jid - адрес вашего транспорта (например, icq.example.com), здесь так же можно использовать переменную $protocol, она будет заменена на протокол, определенный выше в этом же файле. Т.е. нам достаточно будет
    jid=$protocol.example.com
  • password - ваш пароль для данного транспорта, вы задали его в конфиге сервера
  • port - если ничего не меняли в настройках сервера, то это будет
    port=5347
В секции [registration] есть несколько интересных параметров
  • enable_public_registration - пригодится, если хотите закрыть регистрацию на данном транспорте для всех, кроме выбранных хостов. По-умолчанию общедоступная регистрация включена.
  • username_label - подпись к полю ввода "логина" на форме регистрации
  • instructions - инструкции на форме регистрации
В секции [features] можно отключить некоторые функции, например, передачу файлов через транспорт.

Протокол xmpp настраивается аналогично, за исключением параметра encoding.

После настройки просто перезапускаем Spectrum:
# /etc/init.d/spectrum restart
А дальше просто открываем в Jabber-клиенте обзор сервисов, вводим доменное имя нашего сервера, регистрируемся на нужных транспортах и пользуемся.

пятница, 13 августа 2010 г.

Debian на минимальном тарифе VDS по технологии XEN

У моего VDS-провайдера с недавнего времени появились виртуальные серверы на XEN. До этого был выбор только из глючного OpenVZ (на системах с малым количеством оперативки там большие проблемы) или FreeBSD. Мой мини-сервер работал на FreeBSD, но очень хотелось Debian. Проконсультировавшись на форуме провайдера по поводу возможности подключения swap-файла и получив положительный ответ, решил переехать на другую технологию и заодно на другое ПО для организации Jabber-сервера с транспортом.

Для начала готовим сам сервер. То, что туда ставят, оставляет желать лучшего, но это ведь Debian, всё можно поменять, чем и займемся.

1) Как ни смешно, но надо обновить всё до актуального состояния:
# apt-get update
# apt-get upgrade
2) Подключаем swap-файл на 500Мб (у моего сервера своей памяти 64Мб):
# dd if=/dev/zero of=/var/local/swap.file bs=1M count=500
# mkswap /var/local/swap.file
# swapon /var/local/swap.file
Чтобы файл подкачки подключался автоматически, добавляем в /etc/fstab строчку:
/var/local/swap.file none swap sw 0 0
Отредактировать его можно, например, с помощью nano.

3) Настраиваем локали:
# apt-get install locales
# dpkg-reconfigure locales
Там выбираем нужные локали. Как минимум, en_US.UTF-8 и ru_RU.UTF-8. По-умолчанию ставим русскую, теперь многие программы заговорят по-русски.

4) Настраиваем часовой пояс:
# dpkg-reconfigure tzdata
И там выбираем свой.

5) Отключаем getty для всех терминалов (мы ведь только по SSH будем ходить на сервер). Для этого в файле /etc/inittab находим строчки, которые запускают /sbin/getty и убираем их или превращаем в комментарий (ставим в начале строки #). Пример строчки (не закомментированной):
1:2345:respawn:/sbin/getty 38400 tty1
6) Перезагружаем сервер. Теперь всё готово к использованию.

По поводу установки и настройки нового софта для организации Jabber-сервера расскажу в следующей статье.

воскресенье, 13 июня 2010 г.

VirtualBox: Linux Host + Apache & Windows Guest

1. На машине с Linux установлен Apache с несколькими виртуальными хостами (например, test и job). Т.е. можно в браузере набрать http://test/ и вам будет показано содержимое соответствующей папки (или запущен скрипт, лежащий в этой папке).
2. Windows установлена в виртуальную машину VirtualBox и нужно из нее просматривать виртуальные хосты Linux-машины, так же набирая в браузере http://test/

Сразу оговорюсь, что для одновременного доступа из Windows в интернет и на Linux-машину, придется позабавиться с настройкой сетевого моста в Linux (тип сетевого интерфейса в VirtualBox нужно выбирать "Bridged interface / Сетевой мост"), но я в такие дебри вдаваться не буду и обойдемся раздельным доступом из Windows: или в интернет (тип интерфейса NAT) или на Linux-машину, благо VirtualBox не так давно научился переключать тип сетевого адаптера "на лету".

А теперь решаем задачку.
  • В VirtualBox нужно выбрать тип сетевого интерфейса "Host-only networking / Виртуальный адаптер хоста". 
  • Заходим в главном окне VirtualBox в "Файл -- Настройки", закладка "Сеть". Видим список виртуальных адаптеров, выбираем наш и жмем на кнопке редактирования. Настраиваем IP адрес хоста по вкусу (по-умолчанию 192.168.56.1), на вкладке "DHCP сервер" активируем его и так же настраиваем по вкусу.
  • Уже в виртуальной машине в Windows открываем файл ПАПКА_WINDOWS\system32\drivers\etc\hosts в любом текстовом редакторе и добавляем туда строчку (для нашего примера, вы ставите свои значения):
    192.168.56.1 test job
  • После этого, возможно, понадобится перезапуск браузера и ваши виртуальные хосты станут доступны из Windows.

Обновление
И наконец, самое веселое: если выставить после этого тип сетевого интерфейса VirtualBox в NAT (для выхода в интернет из виртуальной машины), доступ к виртуальным хостам остаётся! Ведь виртуальный сетевой адаптер в Linux продолжает функционировать и имеет всё тот же IP-адрес. Хотя всё же я предпочту не пускать Windows в интернет, мало ли что :)

среда, 5 мая 2010 г.

EasyTag и MPD: обновление базы

Долго ломал голову над одной глупостью... Итак, проблема:
  • Заливаем в папку с музыкой новые файлы
  • Обновляем базу MPD, файлы добавляются
  • Видим, что теги у файлов кривые, запускаем EasyTag и исправляем теги
  • Обновляем базу MPD и ... ничего не происходит, теги по-прежнему кривые.
Как оказалось, MPD смотрит на дату последнего изменения композиции, а по-умолчанию EasyTag стремится сохранить оригинальное время, в итоге MPD думает, что файлы не изменились.

Решение:
1) В EasyTag идем в "Установки -- Настройки", там закладка "Файловые настройки", убираем галку "Сохранить время модификации файлов"
2) Для уже измененных файлов, теги которых MPD никак не хочет перечитывать, можно воспользоваться командой touch. Например, следующее заклинание обновит дату последней модификации файлов в текущей папке и подпапках:
$ find . -type f -exec touch '{}' \;
После запуска этой команды в нужных папках, MPD наконец-то воспримет изменения тегов.

вторник, 30 марта 2010 г.

Ссылки из wine-приложений в нативном браузере

По-умолчанию ссылки из wine-приложений не открываются вообще. Нашел пост в блоге, в котором разъясняется как это сделать. Но автор забыл заглянуть в документацию по wine. Судя по информации из их вики, нужно сделать вообще только одно телодвижение (для остального значения по-умолчанию уже выставлены нормально). Открыть редактор реестра:
$ wine regedit
И в ключе
HKEY_CLASSES_ROOT >> http >> shell >> open >> command
задать значение
C:\windows\system32\winebrowser.exe -nohome "%1"
Теперь всё будет работать как надо.

P.S. Если короткая инструкция не помогает, взгляните на оригинальный пост.

четверг, 25 марта 2010 г.

Cron и GUI-приложения на примере VirtualBox

Задачка простая: надо запускать графическую программу по расписанию. Например, недавно встала задача запускать машину VirtualBox по расписанию. Если просто написать команду запуска машины от имени юзера, то ответ будет чем-то вроде:
ERROR: Virtual machine 'WinXP' has terminated unexpectedly during startup
Сообщение ни о чем толком не говорит. В конференции debian@conference.jabber.ru подсказали, что дело в переменной DISPLAY. Программа пытается подключиться к дисплею, описанному в этой переменной, а там пусто. Решение очень простое. Сначала можно подсмотреть что у вас написано в этой переменной, запустив в терминале команду:
$ echo $DISPLAY
Команда покажет что-то вроде:
:0.0
Это и есть идентификатор дисплея. Дальше перед командой запуска в /etc/crontab задаем переменную и всё работает. Для VirtualBox это выглядит так:
DISPLAY=":0.0" VBoxManage startvm "MyVM"

понедельник, 15 марта 2010 г.

Просмотр PSD в Linux

Задача простая: посмотреть файл формата PSD под Linux максимально быстро, без запуска виртуальных машин или Wine, да еще и в программе с прилично выглядящим интерфейсом. GIMP открывает такие файлы, но при этом они становятся очень далеки от оригинала - нет поддержки эффектов слоя, некоторые скрытые слои начинают отображаться. В общем, задачу он не решает.

Целенаправленный поиск привел меня на страницу проекта gdk-pixbuf-psd, суть которого - добавить возможность чтения формата PSD сразу в библиотеку GTK. После установки пакета в Ubuntu или Debian вы сможете просматривать PSD-файлы любой программой, использующей стандартные возможности GTK: Eye of GNOME, gThumb и др.

суббота, 20 февраля 2010 г.

Firefox 3.5, Webmoney и X.509

Примерно с версии Iceweasel 3.5.6 с сервисом WebMoney Keeper Light начались проблемы. Перестал работать вход через сертификат X.509 - выдает ошибку установления защищенного соединения. В версии 3.6 всё в порядке (пришлось ставить Swiftfox в Debian, Iceweasel никак не хотят обновлять до 3.6).

В результате был найден багрепорт, сообщающий, что для избавления от этой проблемы нужно запускать Firefox с выставленной переменной окружения:
$ NSS_SSL_ENABLE_RENEGOTIATION=1 firefox
Ну а в ярлыке GNOME в поле "Команда" нужно написать следующее:
env NSS_SSL_ENABLE_RENEGOTIATION=1 iceweasel
И тогда вы сможете наконец получить нормальный доступ к своим деньгам.