Итак. Задача состоит в том, чтобы поднять новостной сервер, чтобы читать и писать в фидошные группы с помощью обычного клиента новостей (к примеру Outlook-ом или Mozilla).
Перед началом настройки обновляем дерево портов (если у кого-то оно не обновляется автоматически).
Устанавливаем fidogate, с патчем DS.
[f0s@mail] /home/f0s/> cd /usr/ports/news/fidogate-ds/
[f0s@mail] /usr/ports/news/fidogate-ds/> make && make install
&& make clean
он за собой должен потянуть inn (если он у вас еще не установлен).
В /etc/syslog.conf раскоментируйте строчки с news.*, подправьте пути:
Редактируем expire.ctl. Все коментарим, оставляем только:
/remember/:10
*:A:7:10:never
Редактируем readers.conf:
[f0s@mail] /usr/local/news/etc/> cat readers.conf
# Описываем с каких хостов можем подключатья на 119 порт
# и указываем обязательную авторизацию юзеров
auth "all network users" {
auth: "ckpasswd -f /usr/local/news/db/users.passwd"
hosts: "192.168.10.0/24, 192.168.20.0/24, 212.176.211.125"
default: "<LOCAL-USERS>"
}
# Это правило на локалхост
auth "localhost" {
hosts: "localhost, 127.0.0.1, stdin"
default: "<localhost>"
}
# Это ACL на всех юзеров, которые подключились, но не прошли
# проверку имени/пароля. Они смогут читать только
# конференции control.*
access "all users" {
users: "<LOCAL-USERS>"
read: "control.*"
}
# Это ACL на прошедших проверку пользователей. В данном примере
# юзер f0s имеет Доступ ко всем конференциям на полный
# доступ (Read/Post)
access "auth users" {
users: "f0s"
newsgroups: "*"
access: RPA
}
# Это ACL на прошедших проверку пользователей. В данном примере
# юзеры jacko и svhed имеют доступ ко всем конференциям fido7.*
# на полный доступ (Read/Post)
access "auth users" {
users: "jacko,shved"
newsgroups: "fido7.*"
access: RPA
}
# Пользователи подключающиеся с локалхоста имеют доступ ко всем
# конференциям без пароля.
access "localhost" {
users: "<localhost>"
newsgroups: "*"
access: RPA
}
Теперь необходимо создать файл с паролями с помощью утилиты htpasswd (она обычно входит в дистрибутив сервера apache):
[f0s@mail] /usr/local/news/etc/> cat cycbuff.conf
# Это конференции от 2:5080/1003@fidonet. Выделим под них место 200Мб
cycbuff:FILE01:/usr/local/news/spool/articles/gotlib:200000
# Это конференции от 2:292/854@fidonet. Выделим под них место 10Мб
cycbuff:FILE02:/usr/local/news/spool/articles/ward:10000
# задаем два CNFS спула: GOTLIB (200Mb) и WARD (10 Mb).
metacycbuff:GOTLIB:FILE01
metacycbuff:WARD:FILE02
Задаем метод хранения: junk, control.* - в traditional, остальные - в два CNFS спула:
Редактируем buffindexed.conf: Размер overview базы определяется эмпирически, но примерно 1/7 от объема news-базы. Т.е. в данном примере, при размере news-базы 210 Мб., размер overview-базы возьмем 30 Мб.
Теперь у этих файлов установите владельцем news:news и права 0664.
Далее, для того, чтобы в fido7-конференциях вы отвечали на сообшения не к All, а к автору, необходимо настроить X-Comment-To. Для этого необходимо заменить скрипт filter_nnrpd.pl, котрый находится в /usr/local/news/bin/filter/, на ниже приведенный:
#!/usr/bin/perl -w
#use strict;
#
my %config = (checkincludedtext => 0,
includedcutoff => 40,
includedratio => 0.6,
quotere => '^[>:]',
antiquotere => '^[<]',
);
sub filter_post {
my $rval = "" ; # assume we'll accept.
if ($config{checkincludedtext}) {
my ($lines, $quoted, $antiquoted) = analyze($body);
if ($lines > $config{includedcutoff}
&& $quoted - $antiquoted > $lines * $config{includedratio}) {
$rval = "Article contains too much quoted text";
}
}
my $grephistory = '/usr/local/news/bin/grephistory';
my $sm = '/usr/local/news/bin/sm';
if( $hdr{"Newsgroups"} =~ /fido7\./ ) {
if ( $hdr{"Newsgroups"} =~ /,/ ) {
$rval = "More than one newsgroup requested, only one allowed"; }
if ( !(($hdr{"Comment-To"} ne "") ||
($hdr{"X-Comment-To"} ne "") ||
($hdr{"X-FTN-To"} ne "") ||
($hdr{"X-Fidonet-Comment-To"} ne "") ||
($hdr{"X-Apparently-To"} ne ""))) {
my $refs = $hdr{"References"};
if( $refs ne "" ) {
my @refs = split(/ /, $refs);
my $msgid = pop @refs;
$msgid =~ s/[<>|;\s'"]//g;
my $fn=`$grephistory \'$msgid\' 2>&1`;
if( (!($fn =~ /\/dev\/null/)) &&
(!($fn =~ /Not found/)) ) {
my $orig_from = `$sm $fn`;
my @orig_from = grep(/^From:/, split(/\n/, $orig_from));
$orig_from = shift @orig_from;
$orig_from =~ s/^From:\s*//;
# это должно быть в одну строчку:
$orig_from =~ s/^\s*(.+[^\s])\s*<[^\s><"\(\)\@]+\@[^\s>
<"\(\)\@]+>\s*$/$1/;
# это должно быть в одну строчку:
$orig_from =~ s/^\s*<{0,1}[^\s><"\(\)\@]+\@[^\s><"\(\)\
@]+>{0,1}\s*\((.+)\)\s*$/$1/;
$orig_from =~ s/^"//;
$orig_from =~ s/"$//;
$hdr{"X-Comment-To"} = $orig_from;
$modify_headers = 1;
}
}
}
}
return $rval;
}
sub analyze {
my ($lines, $quoted, $antiquoted) = (0, 0, 0);
local $_ = shift;
do {
if ( /\G$config{quotere}/mgc ) {
$quoted++;
} elsif ( /\G$config{antiquotere}/mgc ) {
$antiquoted++;
}
} while ( /\G(.*)\n/gc && ++$lines );
return ($lines, $quoted, $antiquoted);
}
Для проверки синтаксиса файлов конфигурации, владельцев файлов и каталогов запустим скрипт /usr/local/news/bin/inncheck, после чего исправьте найденные им ошибки. Далее запускаем vipw и пользователю news ставим шеллом - /bin/sh. Это пригодится при отладке. Делаем пробный запуск:
С фидогейтом все. Приступаем к установке программы binkd, которая предназначена для передачи фидо-трафика по IP потоколу binkP (24554). Это программа будет получать обычную фидошную почту, после чего fidogate будет ее превращать в news-ы.
[f0s@mail] //> cd /usr/ports/net/binkd/
[f0s@mail] /usr/ports/net/binkd/> make install clean
не забываем добавить в rc.conf:
binkd_enable="YES"
ну и в самом /usr/local/etc/rc.d/binkd я исправил пользователя на news. То есть binkd наш должен работать от пользователя news. Также проверям путь на который ссылается pid, и создаем каталог с парвами для пользователя news.
Теперь можно присутпать к настройке конфига для binkd. Он находится тут: /usr/local/etc/binkd.cfg:
Настройка binkd завершена. Теперь почти вся настройка гейтования завершена. Почему "почти"? Нам еще нужно сдедать чтобы смогли гейтоваться личные сообщения из фидо (нетмейл). Для этого я приведу примера правки конфига EXIM:
begin routers
# добавляем в секцию routers:
fidonet:
driver = manualroute
domains = ! +local_domains
route_list = *.fidonet.org f2.n550.z2.fidonet.net
transport = fidogate
# нашу настройку оставляем неизменной
send_to_smart_host:
driver = manualroute
route_list = !+local_domains relay.westcall.net
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
begin transports
# в транспорты - тоже
fidogate:
driver = pipe
command = "/usr/local/libexec/fidogate/rfc2ftn -i ${pipe_addresses}"
user = news
group = news
# Доставка на удалённые хосты - по SMTP
remote_smtp:
driver = smtp
dbmail_delivery:
driver = pipe
command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
log_output
user = mailnull
group = mail
Проверяем правильность конфиг файла. Для этого делаем:
[f0s@mail] //> exim -bV
Теперь нам надо чтобы все это совместно работало. Добавим в crontab:
# Каждый день выполняем expire (писать все в одну строчку, не поместилось)
3021 * * * news /usr/local/news/bin/news.daily \
expireover lowmark delayrm
#
# Каждый день чистим cache inn (писать все в одну строчку, не поместилось)
4021 * * * news /usr/local/news/bin/ctlinnd -t 300 \
-s reload incoming.conf "flush cache"
#
# Каждый час постим залежалые в incoming inn-a артикли
1 * * * * news /usr/local/news/bin/nntpsend
10 * * * * news /usr/local/news/bin/rnews -U
#
# Каждые 10 минут тоссим почту и гейтуем сообщения
*/10 * * * * news /usr/local/news/bin/pochta.sh
#
# Каждый день отписываемся от эх без даунлинков
0022 * * * news /usr/local/bin/ftnafutil expire
#
# Каждую неделю чистим areas.bbs от отписанных эх (со статусом U)
0023 * * 1 news /usr/local/bin/ftnafutil delete
[f0s@router] /home/f0s/> telnet mail.artpaint nntp
Trying 192.168.10.8...
Connected to mail.artpaint.
Escape character is '^]'.
201 mail.artpaint InterNetNews NNRP server INN 2.4.3 ready (no posting).
# Как мы видим, пока мы не авторизованы. нам доступны только control.*
list active
215 Newsgroups in form "group high low flags".
control.cancel 00000000000000000001 n
control.checkgroups 00000000000000000001 n
control.newgroup 00000000000000000001 n
control.rmgroup 00000000000000000001 n
.
# теперь представляемся пользователем shved
authinfo user shved
381 PASS required
authinfo pass MYSUPERPASSWORD
281 Ok
# имя и пароль приняты, теперь мы видим,
# что нам доступны конференции fido7.* на чтение и запись.
list active
215 Newsgroups in form "group high low flags".
fido7.spb.cars 00000000830000000001 y
fido7.ccalocal 00000000110000000001 y
fido7.ru.linux.chainik 00000001120000000001 y
fido7.ru.unix.bsd 00000000390000000001 y
.
quit
205 .
Connection closed by foreign host.
Проверка и настройка окончательно завершены. Теперь можем запускать наш любимый newsreader, например Seamonkey (если GUI), или tin (если консольно). Указываем в подключениях наш сервер, порт 119 и вперед :)