среда, 11 ноября 2009 г.

DoomRL - Doom Rougelike

Недавно я узнал о Rougelike-игре по мотивам Doom. Единственной шокирующей для современных геймеров деталью всех Rougelike-игр является то, что в них нет графики! Действие Rougelike-игр происходит на чёрно-белом или цветном текстовом экране 80x25.

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


Если после просмотра ролика вы не потеряли интерес, предлагаю читать дальше.

Установка игры

Заходим на страницу скачиваний игры http://doom.chaosforge.org/downloads, копируем ссылку на архив и скачиваем его:
wget http://doom.chaosforge.org/file_download/3/doomrl-linux-099.tar.gz

Распакуем игру:
tar xzvf doomrl-linux-099.tar.gz

Заходим в каталог с игрой и запускаем её:
cd doomrl-linux-i386-snapshot-2009-10-13
./doomrl

Музыка

Странно, но попытки подружить библиотеку SDL и плеер timidity с семплами sf2 мне не удалось. Любая программа для воспроизведения MIDI легко воспроизводит звук с использованием семплов sf2, а программы, основанные на SDL, MIDI-музыку не воспроизводят вообще. Если снова прописать в timidity использование pat-семплов, то звук появляется, но пропадают многие инструменты, а остальные звучат хуже.

Чтобы слушать музыку, лучше не пытаться заставить SDL воспроизводить MIDI, а просто скачать MP3-файлы со страницы http://www.sirgalahad.org/paul/doom/ и положить их в каталог doomrl-linux-i386-snapshot-2009-10-13/mp3. Для их использования нужно заменить файл doomrl-linux-i386-snapshot-2009-10-13/music.ini на doomrl-linux-i386-snapshot-2009-10-13/musicmp3.ini

mkdir doomrl-linux-i386-snapshot-2009-10-13/mp3
cd doomrl-linux-i386-snapshot-2009-10-13/mp3
cat list <<END
http://www.sirgalahad.org/paul/doom/mp3/d1inter.mp3
http://www.sirgalahad.org/paul/doom/mp3/d1readme.mp3
http://www.sirgalahad.org/paul/doom/mp3/d1end.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m1.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m2.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m3.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m4.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m5-e4m4.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m6-e3m6.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m7-e2m5-e4m8.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m8-e3m4-e4m1.mp3
http://www.sirgalahad.org/paul/doom/mp3/e1m9-e3m9-e4m9.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m1.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m2.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m3.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m4-e4m6.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m6-e4m7.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m7-e3m7-e4m5.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m8.mp3
http://www.sirgalahad.org/paul/doom/mp3/e2m9-e3m1.mp3
http://www.sirgalahad.org/paul/doom/mp3/e3m2-e4m2.mp3
http://www.sirgalahad.org/paul/doom/mp3/e3m3-e4m3.mp3
http://www.sirgalahad.org/paul/doom/mp3/e3m5.mp3
http://www.sirgalahad.org/paul/doom/mp3/e3m8.mp3
http://www.sirgalahad.org/paul/doom/mp3/d2title.mp3
http://www.sirgalahad.org/paul/doom/mp3/d2inter.mp3
http://www.sirgalahad.org/paul/doom/mp3/d2readme.mp3
http://www.sirgalahad.org/paul/doom/mp3/map1-15.mp3
http://www.sirgalahad.org/paul/doom/mp3/map2-11-17.mp3
http://www.sirgalahad.org/paul/doom/mp3/map3-21.mp3
http://www.sirgalahad.org/paul/doom/mp3/map4.mp3
http://www.sirgalahad.org/paul/doom/mp3/map5-13.mp3
http://www.sirgalahad.org/paul/doom/mp3/map6-12-24.mp3
http://www.sirgalahad.org/paul/doom/mp3/map7-19-29.mp3
http://www.sirgalahad.org/paul/doom/mp3/map8-14-22.mp3
http://www.sirgalahad.org/paul/doom/mp3/map9.mp3
http://www.sirgalahad.org/paul/doom/mp3/map10-16.mp3
http://www.sirgalahad.org/paul/doom/mp3/map18-27.mp3
http://www.sirgalahad.org/paul/doom/mp3/map20.mp3
END
wget -i list
rm list
mv doomrl-linux-i386-snapshot-2009-10-13/music.ini mv doomrl-linux-i386-snapshot-2009-10-13/music.bak
mv doomrl-linux-i386-snapshot-2009-10-13/musicmp3.ini mv doomrl-linux-i386-snapshot-2009-10-13/music.ini

Описание игры

Очень подробное описание игры есть по следующей ссылке: http://doom.chaosforge.org/wiki/index.php?title=DoomRL_Wiki Я же кратко опишу то, что уже успел освоить. Не пугайтесь длинного описания, на самом деле всё просто и осваивается методом тыка и заглядывания в файл readme.txt, в секцию где описаны клавиши.

Действие игры происходит в лабиринте, который полностью умещается в один экран. Обозначения элементов самого лабиринта:
1. стены лабиринта обозначаются решёткой (#), окровавленные стены - красной решёткой,
2. полы лабиринта обозначаются точкой (.), окровавленные полы - красной точкой,
3. лужи воды обозначаются синим символом "равно" (=),
4. лужи кислоты обозначаются зелёным символом "равно" (=),
5. лужи лавы обозначаются чередующимися в шахматном порядке жёлтым и красным символами "равно" (==),
6. закрытые двери обозначаются коричневым плюсом (+), открытые - коричневой косой чертой (/),
7. рычаги обозначаются белым амперсандом (&),
8. лестницы вниз обозначаются знаком "больше" (>),
9. телепорты обозначаются голубой звёздочкой (*).

Обозначение предметов:
1. аптечки обозначаются розовым плюсом (+),
2. боеприпасы обозначаются вертикальной чертой (|) разных цветов,
3. нож обозначается серой обратной косой чертой (\),
4. оружие обозначается фигурной скобкой (}) разных цветов,
5. различные полезные предметы обозначаются "крышкой" (^),
6. бочки с топливом обозначаются коричневой буквой O,
7. бочки с кислотой обозначаются зелёной буквой O.

Персонажи:
1. игрок обозначается собачкой (@),
2. труп игрока обозначается буквой X,
3. трупы обозначаются красным процентом (%),
4. "человекообразные" обозначаются буквой h, серый цвет соответствует вооружению пистолетом, коричневый - ружьём, красный - пулемётом, после убийства от них остаются оружие и боеприпасы,
5. бесы обозначаются коричневой буквой i, они стреляют огненными шарами,
6. демоны обозначаются розовой буквой c, они подбегают к игроку и кусают его,
7. "потерянные души" обозначаются жёлтой буквой s, подлетают к игроку и кусают его,
8. "помидоры" или какодемоны обозначаются красной буквой O, стреляют огненными шарами,
9. "рыцари ада" и "бароны ада" обозначаются зелёной и коричневой буквой B, стреляют огненными шарами,
10. пауки или арахнотроны обозначаются буквой A, стреляют плазменными шарами, после убийства от них остаётся батарея для плазменного ружья.

В начале игры у игрока имеются только кулаки и шестизарядный пистолет. По мере игры можно найти:
1. нож,
2. бензопилу,
3. однозарядное ружьё,
4. двуствольное ружьё,
5. пятизарядное ружьё,
6. четырёхствольный пулемёт с лентами по 40 патронов,
7. однозарядную ракетницу,
8. плазменное ружьё (попользоваться пока не довелось),
9. BFG-9000.

Обозначения основных действий:
1. стрелки - перемещение по вертикали и горизонтали,
2. home, end, pg up, pg down - перемещение по диагональным направлениям,
3. o (open) - открыть дверь, рядом с которой находится игрок. Открыть дверь можно нажатием на клавишу перемещения игрока в сторону двери,
4. c (close) - закрыть дверь,
5. u (use) - переключить рычаг. Действие рычага может быть разным, он может взорвать все стены в лабиринте, может затопить часть помещений водой, может взорвать определённые бочки с топливом или кислотой.
6. r (reload) - перезарядить оружие,
7. f (fire) - выстрелить из оружия. Если оружие не заряжено, выстрела не будет. Выстрел делается в ближайшего монстра. Если монстров поблизости нет, то первое нажатие на f переведёт игру в режим прицеливания, в котором можно будет перемещать букву X, обозначающую точку прицеливания. Второе нажатие на f производит выстрел по цели. Если с момента прошлого прицеливания вы не перемещали игрока, следующий выстрел будет произведён сразу по цели без прицеливания.
8. g (get) - подобрать предмет с пола в инвентарь,
9. i (inventory) - использовать предмет из инвентаря. По нажатии на клавишу происходит переход в режим инвентаря, где можно выбрать предмет, нажав на порядковую букву или выделив его с помощью стрелок и нажав enter.
10. d (drop) - выкинуть предмет из инвентаря на пол. По нажатии на клавишу происходит переход в режим инвентаря, где можно выбрать предмет, нажав на порядковую букву или выделив его с помощью стрелок и нажав enter.
11. S (save) - сохранить игру. Сохранение игры происходит только при нахождении на лестнице (>), при сохранении текущий уровень закрывается и начинается новый уровень.

Игрок не видит всё карту заранее, при перемещении по карте он видит только то, что находится от него в пределах определённого радиуса. При этом игрок не может увидеть то, что находится за стенами. Очень любопытно наблюдать как при прохождении игрока рядом с дверью, за дверью перемещается луч видимого пространства. Звук в игре стереофонический, поэтому по нему можно определить не только слева или справа находится источник звука, но и примерно на каком расстоянии он находится. В игре имеется система навыков, по мере прохождения и набора опыта, может увеличиваться скорость и точность стрельбы, дальность зрения, скорость перемещения по лабиринту. Оружие необходимо перезаряжать, когда в обойме заканчиваются патроны - всё по-взрослому. При исчерпании здоровья можно воспользоваться аптечкой из инвентаря. Можно найти и положить в инвентарь предмет, при использовании которого происходит телепортация в случайное место. Можно найти предметы, позволяющие улучшить броню или оружие. Можно двигать бочки, например закрывая ими проход через двери. Можно воспользоваться бочкой для взрыва стены или монстра, находящегося рядом с бочкой. Взрыв одной бочки может сдетонировать соседние бочки, в результате чего может призойти цепочка взрывов. Цепочка взрывов эффектно звучит в стереофонической озвучке :)

Одним словом, при освоении обозначений и клавиш управления, игра весьма интересна. Я почти не отрываясь играл в неё несколько часов :)

О печальном

Игра написана на FreePascal с использованием библиотеки Valkyrie, SDL и FMOD. Библиотека Valkyrie была создана специально для разработки игры Doom Rougelike, исходные тексты библиотеки распространяются по лицензии BSD, что и понятно. Сама игра закрытая, в ней используется закрытая библиотека fmod. Если бы библиотека распространялась по лицензии GPL, тогда пришлось бы открыть и исходные тексты игры и исходные тексты статически скомпилированной с игрой коммерческой библиотекой fmod. Автор также не разрешает выкладывать игру где-либо, т.к. он желает отслеживать количество скачиваний со своего сайта.

четверг, 5 ноября 2009 г.

Настройка почтовой системы на основе Postfix, Dovecot, PostfixAdmin

Перед тем, как приступить к настройке почтового сервера, необходимо убедиться в том, что на сервере имеется прямой доступ в Интернет, то есть на одном из интерфейсов имеется так называемый «белый» IP. Также на сервере должна быть доступна служба DNS. Поскольку почтовый сервер очень часто обращается к службе DNS, может потребоваться настроить локальный кэширующий DNS-сервер для снижения нагрузки на сеть и повышения отзывчивости подсистемы DNS.

Настраиваемая почтовая система обладает возможностями по администрированию доменов и почтовых ящиков через веб-интерфейс PostfixAdmin, в качестве основного домена в статье фигурирует домен stupin.homelinux.org, все учётные записи при этом хранятся в базе данных MySQL. Имеется почтовый клиент с веб-интерфейсом SquirrelMail, фильтрация спама средствами PostGrey, фильтрация вирусов средствами ClamSMTPd, отметка подозрительных писем с помощью SpamPd и SpamAssassin.

Не смотря на то, что настройка почтовой системы рассмотрена довольно подробно, данная статья конечно же не претендует на полноту. За кадром остаётся настройка защищённого подключения к веб-серверу, тонкая настройка фильтрации почты с помощью SpamAssassin, Postfix и PostGrey, повышение безопасности почтовой системы посредством запуска отдельных подсистем от имени непривилегированных пользователей и т.п. Статью можно использовать в качестве опорной для построения более развитой почтовой системы.

Настройка Lighttpd

Первым делом устанавливаем веб-сервер lighttpd, php.
# aptitude install lighttpd php5-cgi php5-json

Включаем модуль fastcgi веб-сервера lighttpd:
# lighty-enable-mod fastcgi

Заменяем в конфигурации модуля /etc/lighttpd/conf-enabled/10-fastcgi.conf интерпретатор PHP4 на PHP5:
fastcgi.server = ( ".php" =>
((
"bin-path" => "/usr/bin/php5-cgi",
"socket" => "/tmp/php.socket",
"max-procs" => 2,
"idle-timeout" => 20,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "4",
"PHP_FCGI_MAX_REQUESTS" => "10000"

),
"bin-copy-environment" => (
"PATH", "SHELL", "USER"
),
"broken-scriptfilename" => "enable",
"check-local" => "disable"

))
)

Перезапускаем веб-сервер:
# /etc/init.d/lighttpd restart

Настройка PostfixAdmin

Качаем последнюю стабильную версию PostfixAdmin со страницы http://sourceforge.net/projects/postfixadmin/files/. Для Debian существует готовый пакет postfixadmin_2.2.1.1_all.deb, его и скачаем:
$ wget "http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.2.1.1/postfixadmin_2.2.1.1_all.deb?use_mirror=sunet"

Установим пакет в систему:
# dpkg -i postfixadmin_2.2.1.1_all.deb

Пакет устанавливает все файлы проекта в каталог /usr/share/postfixadmin, файлы документации - в каталог /usr/share/doc/postfixadmin. Также создаются файлы с настройками самого PostfixAdmin - /etc/postfixadmin/config.inc.php и настройками Apache 2 - /etc/apache2/conf.d/postfixadmin.

Поскольку я собираюсь пользоваться PostfixAdmin на web-сервере Lighttpd, заглянем в файл /etc/apache2/conf.d/postfixadmin:
Alias /postfixadmin /usr/share/postfixadmin

И создадим на его основе настройки для Lighttpd - в файл /etc/lighttpd/lighttpd.conf нужно будет добавить строчки:
alias.url += (
"/postfixadmin" => "/usr/share/postfixadmin",
)

Дополнительно, защитим каталог на web-сервере от случайных зевак:
auth.backend                   = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/htdigest"
auth.require = ( "/posfixadmin" =>
(
"method" => "digest",
"realm" => "PostfixAdmin",
"require" => "user=morbo"

)
)

И с помощью утилиты htdigest из пакета apache2-utils задаём пароль для пользователя morbo и рилма PostfixAdmin:
$ htdigest /etc/lighttpd/htdigest "PostfixAdmin" morbo

Настроим Postfix Admin в соответствии с вашей спецификой (например, зададим подходящий пароль к базе данных, настроим домен по умолчанию и т.п.)

Отредактируем файл /usr/share/postfixadmin/config.inc.php и укажем следующее:
# vi config.inc.php
[...]
$CONF['configured'] = true;
$CONF['postfix_admin_url'] = 'http://stupin.homelinux.org/postfixadmin';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'SecretPassword!';
$CONF['database_name'] = 'postfix';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['encrypt'] = 'cleartext';

Просмотрите остаток файла, если вам захочется сделать более тонкие настройки.

Вы можете быстро заменить домен по умолчанию на ваш собственный:

replace "change-this-to-your.domain.tld" "stupin.homelinux.org" - /usr/share/postfixadmin/config.inc.php

Создайте базу данных и пользователя в mysql:
shell> mysql -u root -p
mysql> create database postfix;
mysql> grant all privileges on postfix.* to 'postfixadmin'@'localhost' identified by 'SecretPassword!';
mysql> flush privileges;
mysql> q

Откройте браузер и перейдите по ссылке http://stupin.homelinux.org/postfix/setup.php или http://ваш-IP/postfixadmin/. Будет предложено запустить процесс настройки. Удостоверьтесь, что все проверки установщика сообщают 'OK'.

Рекомендуется удалить setup.php.

Теперь перейдите по ссылке http://stupin.homelinux.org/postfixadmin/admin. Вы должны получить приглашение. Войдите с использованием почтового ящика администратора, заведённого ранее на странице настройки. Отсюда вы можете добавлять домены, почтовые ящики и т.п. Но Postfix этого не увидит. Нам нужно установить Postfix и настроить его.

Настройка Postfix

Установим Postfix и SASL2 с поддержкой MySQL:
# aptitude install postfix-mysql postfix-tls libsasl2-modules-sql libsasl2-modules

Добавим в файл /etc/postfix/main.cf следующие строки:
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:106
virtual_mailbox_base = /var/spool/mail/virtual
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 106
virtual_transport = virtual
virtual_uid_maps = static:106
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,
reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous

ЗАМЕЧАНИЕ: UID и GID равные 106 на вашей системе могут быть другими. Посмотрите на UID и GID пользователя postfix (или vmail) в файле /etc/passwd и укажите их. Например, на моём сервере:
# grep postfix /etc/passwd
postfix:x:102:105::/var/spool/postfix:/bin/false
--> uid: 102; gid: 105

Создайте следующие файлы в каталоге /etc/postfix/mysql_virtual_alias_maps.cf:
user = postfix
password = SecretPassword!
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = address

mysql_virtual_domains_maps.cf:
user = postfix
password = SecretPassword!
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

mysql_virtual_mailbox_maps.cf:
user = postfix
password = SecretPassword!
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

Если вы хотите разрешить ретрансляцию почты через ваш сервер после SMTP AUTH, пропишите в файле /etc/postfix/sasl/smtpd.conf следующие настройки:
pwcheck_method: auxprop
mech_list: PLAIN LOGIN
auxprop_plugin: sql
sql_verbose: yes
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: SecretPassword!
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'

Создайте структуру каталогов, включая каталог для первого домена. Вы так же можете войти в PostfixAdmin и создать учётную запись 'test' для домена stupin.homelinux.org.
# mkdir -p /var/spool/mail/virtual/stupin.homelinux.org/test
# chmod -R 770 /var/spool/mail/virtual
# chown -R postfix:postfix /var/spool/mail/virtual

Настройка Dovecot

Установим Dovecot с поддержкой MySQL:
# aptitude install dovecot-common dovecot-imapd dovecot-pop3d

Отредактируем файл /etc/dovecot/dovecot-mysql.conf с настройками Dovecot/MySQL, воспользовавшись следующими опциями:
driver = mysql
connect = dbname=postfix user=postfixadmin host=127.0.0.1 password=SecretPassword!
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 106 AS uid, 106 AS gid FROM mailbox WHERE username = '%u'

Теперь настроим Dovecot на использование MySQL, задав следующие опции в файле /etc/dovecot/dovecot.conf:
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/var/spool/mail/virtual/%d/%n
mail_access_groups = mail
first_valid_uid = 106
first_valid_gid = 106
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth default {
mechanisms = digest-md5 plain
passdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
user = root
}

Перезапустим Dovecot и Postfix и проверим их.

По завершении вы должны получить возможность добавлять новые домены, почтовые ящики, псевдонимы с помощью PostfixAdmin и получить правильно работающую систему, включая SMTP-аутентификацию. Отметим, что для работы SMTP-аутентификации saslauthd не требуется.

Настройка SquirrelMail

Устанавливаем пакет squirrelmail:
# aptitude install squirrelmail

В файл /etc/lighttpd/lighttpd.conf нужно будет добавить строчки:
alias.url += (
"/mail" => "/usr/share/squirrelmail"
)

Настройку SquirrelMail можно осуществить с помощью ncurses-утилиты squirrelmail-configure.

Настройка плагина SquirrelMail PosfixAdmin

Для того, чтобы пользователи имели возможность самостоятельно менять свои пароли, можно установить расширение postfixadmin для squirrelmail. Адрес проекта http://squirrelmail-postfixadmin.palepurple.co.uk/

Чтобы скачать исходники проекта, необходимо поставить утилиты subversion:
# aptitude install subversion

Создадим каталог для скачиваемых из svn исходников плагина, скачаем исходники, скопируем необходимое нам, а лишнее удалим:
$ mkdir ~/squirrelmail-postfixadmin
$ cd ~/squirrelmail-postfixadmin
$ svn co -r 35 http://squirrelmail-postfixadmin.palepurple.co.uk/svn
$ mkdir ~/squirrelmail
$ cp ~/squirrelmail-postfixadmin/svn/tags/squirrelmail-postfixadmin-0.4.3/* ~/postfixadmin/
$ rm -R ~/squirrelmail-postfixadmin

Почистим исходники плагина от служебных файлов subversion:
$ find ~/postfixadmin/ -name .svn -type d -exec rm -R \{\} \;

Установим плагин в каталог squirrelmail:
# cp ~/postfixadmin /usr/share/squirrelmail/plugins/

Тонкая настройка Postfix

Во-первых, я задаю имя, которое будет использовать Postfix при отправке почты на другие почтовые серверы (в команде HELO или EHLO) или при приёме почты на 25 порту в приглашении (например, «220 stupin.homelinux.org ESMTP Postfix»):
myhostname = stupin.homelinux.org
myorigin = $myhostname

Во-вторых, укажем сети, имеющие право отправки почты без прохождения авторизации:
mynetworks = 10.16.7.0/24, 127.0.0.1

Далее, мой провайдер поместил все клиентские сети в список динамических IP, так называемый DUL. Из-за этого подавляющее большинство почтовых серверов отказываются принимать от меня почту. Чтобы отправка почты всё-таки работала, мой провайдер позволяет отправлять почту через его почтовый сервер mail.ufanet.ru:
relayhost = [mail.ufanet.ru]

И, наконец, я хочу чтобы Postfix не пытался складывать локальную почту в локальные же файлы mailbox. Вместо этого, он должен обрабатывать такую почту, как и всю остальную, то есть передавать её dovecot'у. Для этого пропишем следующую опцию:
local_transport = virtual


Настройка PostGrey

Установим postgrey:
aptitude install postgrey

Поменять настройки можно в файле /etc/default/postgrey. Я добавил одну дополнительную опцию, которая помещает отправителя в белый список после 5 удачно пройденных тестов:
POSTGREY_OPTS="--inet=127.0.0.1:60000 --auto-whitelist-clients=5"

Настраиваем postfix на использование сервера политик postgrey. В файле /etc/postfix/main.cf к опции smtpd_recipient_restrictions в конец списка добавляем «check_policy_service inet:127.0.0.1:60000». После этого опция smtpd_recipient_restrictions в моей системе приняла следующий вид:
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,
reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname,
check_policy_service inet:127.0.0.1:60000

Теперь, чтобы настройки вступили в силу, можно перезапустить postgrey и postfix:
/etc/init.d/postgrey restart
/etc/init.d/postfix reload


Настройка ClamSMTPD

Устанавливаем clamsmtpd (если на сервере установлен стабильный релиз Debian, то лучше подключить дополнительный репозиторий volatile, в который помещаются обновления антивирусных баз данных и систем фильтрации спама):
aptitude install clamsmtpd

Обновляем антивирусные базы:
freshclam -v

Настраиваем порты демона в файле /etc/clamsmtpd.conf (я изменил их следующим образом):
OutAddress: 10026
Listen: 127.0.0.1:10025

Настраиваем postfix на передачу файла в clamsmtp. Во-первых добавим в файле /etc/postfix/main.cf следующие опции:
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings

Во-вторых, в файл /etc/postfix/master.cf добавляем следующее:
scan      unix  -       -       n       -       16      smtp
-o smtp_send_xforward_command=yes

127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

Перезапускаем clamsmtpd и postfix:
/etc/init.d/clamsmtp restart
/etc/init.d/postfix restart


Настройка SpamPd

Устанавливаем spampd:
aptitude install spampd

Настраиваем spampd, в файле /etc/default/spampd меняем следующие опции:
LISTENPORT=10026
DESTPORT=10027

Также необходимо поменять настройки входного порта postfix, на котором письмо принимается без дополнительных проверок. В файле /etc/postfix/master.cf меняем строку
127.0.0.1:10026 inet  n -       n       -       16      smtpd

на строку
127.0.0.1:10027 inet  n -       n       -       16      smtpd

Для вступления настроек в силу перезапускаем postfix и spampd:
/etc/init.d/postfix restart
/etc/init.d/spampd restart

Пояснение принципов фильтрации писем

Теперь clamsmtpd и spampd работают последовательно. Postfix получая новое письмо на порт 25, передаёт письмо на проверку на порт 10025, где его принимает clamsmtpd. Далее, проверив письмо, clamsmtpd передаёт письмо на порт 10026, где его принимает spampd. Далее, после проверки, spampd возвращает письмо Posfix'у на порт 10027. Postfix, получив письмо на порт 10027, принимает его без дополнительных проверок.

clamsmtpd работает в связке с clamav-daemon, последовательно передавая ему на проверку все секции и вложения письма.

spampd тоже работает в связке с демоном spamassassin, передавая ему на проверку письмо целиком. Важно, что в данном примере настройки, не происходит автоматическое удаление писем, похожих на спам. Вместо этого в начало темы подозрительного письма добавляется текст «*****SPAM***** », а в заголовок письма помещаются метки SpamAssassin, свидетельствующие о количестве набранных спам-баллов и описанием каждого признака спама. Для удаления подозрительных писем необходимо воспользоваться дополнительными компонентами почтовой системы.

Ссылки

воскресенье, 25 октября 2009 г.

Музыка MIDI - улучшаем звук

У меня есть вся музыка из Doom, Doom 2, Doom Final: Plutonia Experiment, Doom Final: TNT в формате MIDI. При проигрывании музыки с помощью timidity, запущенной из консоли я обнаружил, что timidity ругается на отсутствие сэмплов некоторых музыкальных инструментов:
$ timidity BUNNY.MID
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 30104, period size 3760 bytes
Playing /home/stupin/music/Doom/Doom/BUNNY.MID
MIDI file: /home/stupin/music/Doom/Doom/BUNNY.MID
Format: 1 Tracks: 13 Divisions: 120
No instrument mapped to tone bank 0, program 31 - this instrument will not be heard
No instrument mapped to tone bank 0, program 123 - this instrument will not be heard
((c) 1994 by Productions.)(MUS2MIDI v0.9 - joakim.erdfelt@swsbbs.com)(prelim DEU Music/Sound project for 'DOOM')(DEU (c) 1993,1994 by Raphael Quinet)(DOOM (c) 1993,1994 by id software)Playing time: ~65 seconds
Notes cut: 0
Notes lost totally: 0

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

Выяснилось, что в Debian есть MIDI-секвенсор fluidsynth, в комплекте с которым идут два банка музыкальных инструментов ф ормате Sound Font 2. Эти банки находятся в пакетах с именами fluid-soundfont-gm и fluid-soundfont-gs. Сам секвенсор мне запустить так и не удалось. Честно говоря мне этого и не особо-то хотелось, моей задачей было услышать полноценную музыку из Doom. Но зато я нашёл каким образом можно прикрутить эти банки к секвенсору timidity. Итак, пройдём весь процесс по шагам.

Сначала установим банки:
aptitude install fluid-soundfont-gm fluid-soundfont-gs

Вносим исправления в настройки freepats - программы, предоставляющей timidity сэмплы инструментов. В файле /etc/timidity/freepats.cfg добавляем следующие строчки (я добавил в начало):
dir /usr/share/sounds/sf2/
soundfont FluidR3_GM.sf2 order=0
soundfont FluidR3_GS.sf2 order=1

И перезапускаем секвенсор:
/etc/init.d/timidity restart

Теперь можно запускать timidity для прослушивания музыки из Doom. Кроме появления недостающих инструментов улучшилось общее качество воспроизведения: исчезли щелчки и искажения звука. Единственным недостатком секвенсора можно считать то, что он требует для своей работы изрядной вычислительной мощности процессора. Загрузка моего 2-гигагерцового Athlon доходила до 30-40%.

Кстати, с помощью timidity можно слушать не только MIDI-файлы. timidity хорошо воспроизводит IT-, STM- и XM-файлы. В таком формате была музыка в недрах Unreal и Unreal Tournament, которую я когда-то из них извлёк. Теперь я могу слушать эту музыку и в Linux!