|
Bog BOS: INN (news-сервер в стандарте NNTP)
|
Последнее изменение текста: 19991115
Скопировано с www.bog.pp.ru: 2024.11.11
Bog BOS: INN (news-сервер в стандарте NNTP)
INN
(news-сервер в
стандарте NNTP)
Ссылки:
Общая картина
Основной процесс - innd.
Крутится все время, ожидая и
принимая поток статей по NNTP от
соседей, пропуская через фильтры. Ведет
список групп (active), список статей (history, history index),
сами статьи (spool), базу
заголовков статей - overview(.NOV), пакеты
статей для рассылки соседям (batch),
журналы. Для
управления работой innd "на ходу"
(добавление/удаление
групп/статей/соседей,
изменение параметров работы и т.д.) служит
программа ctlinnd. При
получении соединения не от соседа, а от
клиента (для чтения статей),
запускается nnrpd, который может
только читать из баз данных. Для
буферизации доступа к active
используется actived. Чтобы
послать статью он (м.б.
пропуская ее через фильтр)
запускает inews, который
взаимодействует с innd (только innd
может писать в базы данных). Базу данных overview
ведет программа overchan.
Удалением старых статей
занимаются expire и expireover (для overview),
которые не прерывают работу innd (разве что на
минуточку).
Накопленный пакет для рассылки статей
соседям
рассылается innxmit
(подготавливается nntpsend) или с
помощью innfeed без
образования пакетов. innwatch
присматривает за
использованием ресурсов (диск, CPU) и в
случае перегрузки
останавливает innd.
Обработка журналов: cron
ежедневно запускает news.daily,
который запускает expire
(который готовит список статей для
удаления и правит active и history;
реальное удаление
происходит с помощью fastrm), scanlogs (rotate logs и
запуск innreport).
Картинка от
Елены Самсоновой.
Управляющие сообщения
Представляет собой обычную статью, в
обычной группе, имеющую
заголовок "Control:". Встретив такую статью, innd
обрабатывает команду и
сохраняет статью:
-
cancel Message-ID
(обрабатывается самим innd)
-
иначе первое слово
рассматривается как имя
программы (ищется в
директории ${BIN}/control. Если
программа не
существует, то
вызывается программа default.
Сообщения
запоминаются в
псевдогруппе control
(включается в active). Если создать
подгруппу
control.имя-команды, то все
соответствующие статьи будут
помещаться в эту подгруппу (очень
рекомендуется создать control.cancel, control.newgroup, control.rmgroup,
control.checkgroups).
Отличия 2.2.1 от 1.5.1
-
autoconf
-
многие параметры
перенесены из этапа сборки в inn.conf
-
статьи могут храниться разными
способами (как раньше, cnfs -
несколько статей
упихивается в один файл, timehash - статьи
хранятся в отдельных файлах, но имена
подбираются для более быстрого доступа)
-
новый dbz (ускорение работы с history)
-
переделан overview (mmaped)
-
nnrpd: работа в режиме демона
-
nnrpd:
отслеживание клиентов
-
nnrpd: LIST MOTD
-
nnrpd:
преобразование
заголовков на ходу (с доступом к телу)
-
nnrpd: X-Trace и X-Complaints-To
-
nnrpd: NNTP-Posting-Host и NNTP-Posting-Date
-
nnrpd: управление потоком
посылаем статей (борьба со своими
спамерами)
-
nnrpd: позволяет удалять CC, BCC и To
-
innd и nnrpd можно
привязывать к
произвольному
адресу/порту
-
пакетирование
управляющих сообщений (борьба со
штормом)
-
inndf
-
cnfsstat
-
news2mail
-
mailpost (mail to news)
-
pullnews (отбор news через nnrp вместо feed)
Установка INN 1.5.1/Solaris 2.5
Установка inn 1.5.1 (Solaris 2.5,
perl 5.0.3 (у меня 4.0.1.8, в
дальнейшем заменен на 5.005_02); tcl 7.4 (7.5
не работает) - у меня, по-моему, 7.3 (в
дальнейшем заменен на 8.0); pgp (не
установлен):
-
создаем группу news, group id
(например) 300, добавляю себя в список членов
группы (удобства ради ;)
-
создаем
пользователя news, user id
(например) 300, primary group - 300, secondary - sys (а
надо ли?), shell - /bin/sh, account locked (на
всякий случай), домашняя
директория - /home/news
-
копируем в /home/news inn-1.5.1.tar.gz и
развертываем его.
-
печатаем
руководство по
установке:
groff -mgs Install.ms.1 | ps2pcl | lp
groff -mgs Install.ms.2 | ps2pcl | lp
-
строим subst
-
проверяем, что у нас
нормальный sed:
cd config
cp config.dist config.data
make sedtest
увы :( у нас sed
дефективный (Solaris 2.5 - это
называется солидная фирма!)
-
можно, конечно, взять sed из GNU, но я не
стал
-
компилируем C-шную версию:
cd config
cp config.dist config.data
make c quiet
вроде работает
-
редактируем config.data: файл состоит из строк
вида:
параметр<одна или более табуляция>значение
если значение пусто, то
табуляция все равно д.б.
#
комментарий
показаны только
отклонения от
поставляемой
конфигурации (под BSD)
-
параметры Make config
-
#### =()<DEFS @<DEFS>@>()=
DEFS -I../include -DSUNOS5
-
## Flags for the "cc -o" line; e.g., -Bstatic on SunOS4.x while debugging.
#### =()<LDFLAGS @<LDFLAGS>@>()=
LDFLAGS -g
-
## If you need to link in other libraries, add them here.
## On NetBSD and FreeBSD, you must add the -lcrypt directive here
## -lutil on BSD/OS gives you setproctitle() see HAVE_SETPROCTITLE.
#### =()<LIBS @<LIBS>@>()=
LIBS -lsocket -lnsl -lelf
-
## Flags for lint. AIX wants "-wkD"; it and others don't want "-z".
#### =()<LINTFLAGS @<LINTFLAGS>@>()=
LINTFLAGS -b -h $(DEFS)
-
#### =()<LINTFILTER @<LINTFILTER>@>()=
LINTFILTER | sed -n -f ../sedf.sysv
-
## Where various manpages should go
#### =()<MAN1 @<MAN1>@>()=
MAN1 /usr/local/man/man1
#### =()<MAN3 @<MAN3>@>()=
MAN3 /usr/local/man/man3
#### =()<MAN5 @<MAN5>@>()=
MAN5 /usr/local/man/man5
#### =()<MAN8 @<MAN8>@>()=
MAN8 /usr/local/man/man8
-
## YACC (yet another config control?)
#### =()<YACC @<YACC>@>()=
YACC /usr/ccs/bin/yacc
-
журнализация: пусть пока все будет как есть
(должен
сбрасываться в разл. файлы),
═добавляем в /etc/syslog.conf:
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice /var/log/news/news.notice
news.crit /dev/console
news.warning /var/log/news/news.warning
news.debug /var/log/news/news.debug
news.info /var/log/news/news.info
и
перезапускаем syslog
(предварительно файлы создав ручками и с
правами под news!)
-
принадлежность и права на файлы:
-
## Who gets email from news.daily and about control messages.
#### =()<NEWSMASTER @<NEWSMASTER>@>()=
NEWSMASTER news
-
C- библиотека:
-
## Worst-case alignment, in order to shut lint up
#### =()<ALIGNPTR @<ALIGNPTR>@>()=
ALIGNPTR long
-
## Type of variables can be modified in a signal handler? sig_atomic_t
#### =()<SIGVAR @<SIGVAR>@>()=
SIGVAR int
-
## Use flock, lockf, or nothing to lock files?
## Pick FLOCK, LOCKF, FCNTL, or NONE
#### =()<LOCK_STYLE @<LOCK_STYLE>@>()=
LOCK_STYLE LOCKF
-
## Do you have setproctitle()? Pick DO or DONT.
## You may need to adjust LIBS for this.
#### =()<HAVE_SETPROCTITLE @<HAVE_SETPROCTITLE>@>()=
HAVE_SETPROCTITLE DONT - надеюсь
-
## Does your (struct tm) have a tm_gmtoff field? Pick DO or DONT.
#### =()<HAVE_TM_GMTOFF @<HAVE_TM_GMTOFF>@>()=
HAVE_TM_GMTOFF DONT
-
## How to fork? Pick fork or vfork.
#### =()<FORK @<FORK>@>()=
FORK fork
-
## How should close-on-exec be done? Pick IOCTL or FCNTL.
#### =()<CLX_STYLE @<CLX_STYLE>@>()=
CLX_STYLE FCNTL
-
## How to get number of available descriptors?
## Pick GETDTAB, GETRLIMIT, SYSCONF, ULIMIT, or CONSTANT.
#### =()<FDCOUNT_STYLE @<FDCOUNT_STYLE>@>()=
FDCOUNT_STYLE SYSCONF
-
отсутствующие
библиотеки: нет
-
разное
-
## Require posts to have under 50% inclusion (">") lines? Pick DO OR DONT.
## (This is only for inews and nnrpd.)
#### =()<CHECK_INCLUDED_TEXT @<CHECK_INCLUDED_TEXT>@>()=
CHECK_INCLUDED_TEXT DONT
-
## Largest acceptable article size; 0 allows any size
#### =()<MAX_ART_SIZE @<MAX_ART_SIZE>@>()=
MAX_ART_SIZE 10000000L
-
## Verify that the poster is the person doing the cancel? Pick DO or DONT.
## (Can't do this if cancel arrives before the article does, by the way,
## in which case the early cancel will be ignored.)
#### =()<VERIFY_CANCELS @<VERIFY_CANCELS>@>()=
VERIFY_CANCELS DO
-
## File unknown "to.*" groups into the "to" newsgroup? Pick DO or DONT.
#### =()<MERGE_TO_GROUPS @<MERGE_TO_GROUPS>@>()=
MERGE_TO_GROUPS DO
-
## Record rejected articles in history? Pick DO or DONT.
#### =()<REMEMBER_TRASH @<REMEMBER_TRASH>@>()=
REMEMBER_TRASH DONT
-
## Log by host IP address, rather than from Path line?
#### =()<IPADDR_LOG @<IPADDR_LOG>@>()=
IPADDR_LOG DONT
-
## Should INN do some setsockopts on network connections. Pick DO or DONT.
## Some versions of Solaris should set to DONT (pre 2.4 it seems)
#### =()<SET_SOCKOPT @<SET_SOCKOPT>@>()=
SET_SOCKOPT DONT
-
пути к программам:
-
## Where the raison d'etre for this distribution lives.
#### =()<_PATH_INND @<_PATH_INND>@>()=
_PATH_INND /usr/local/news/bin/innd
-
## Where the optional front-end that exec's innd lives.
#### =()<_PATH_INNDSTART @<_PATH_INNDSTART>@>()=
_PATH_INNDSTART /usr/local/news/bin/inndstart
-
## Where news boot-up script should be installed.
#### =()<_PATH_NEWSBOOT @<_PATH_NEWSBOOT>@>()=
_PATH_NEWSBOOT /usr/local/news/bin/rc.news
-
## Where sendmail, or a look-alike, lives.
## The -t is optional and says to read message for recipients
#### =()<_PATH_SENDMAIL @<_PATH_SENDMAIL>@>()=
_PATH_SENDMAIL /usr/lib/sendmail -t
-
## Where the compress program lives.
#### =()<_PATH_COMPRESS @<_PATH_COMPRESS>@>()=
_PATH_COMPRESS /usr/local/bin/gzip
-
## What extension your compress appends
#### =()<_PATH_COMPRESSEXT @<_PATH_COMPRESSEXT>@>()=
_PATH_COMPRESSEXT .gz
-
## Where egrep lives (you might need the FSF one; see scanlogs)
#### =()<_PATH_EGREP @<_PATH_EGREP>@>()=
_PATH_EGREP /usr/local/bin/egrep
-
## Where inews lives.
#### =()<_PATH_INEWS @<_PATH_INEWS>@>()=
_PATH_INEWS /usr/local/news/bin/inews
-
## Where rnews lives.
#### =()<_PATH_RNEWS @<_PATH_RNEWS>@>()=
_PATH_RNEWS /usr/local/news/bin/rnews
-
## Where generic authentication programs live.
#### =()<_PATH_AUTHDIR @<_PATH_AUTHDIR>@>()=
_PATH_AUTHDIR /usr/local/news/bin/auth
-
## Where the NNRP server lives.
#### =()<_PATH_NNRPD @<_PATH_NNRPD>@>()=
_PATH_NNRPD /usr/local/news/bin/nnrpd
-
## The path of the process run when an unknown host connects to innd.
## Usually the same as _PATH_NNRPD, but may be, e.g., the path to
## nntpd from the reference implementation.
#### =()<_PATH_NNTPD @<_PATH_NNTPD>@>()=
_PATH_NNTPD /usr/local/news/bin/nnrpd
-
## Where the NNQR server lives. Make same as _PATH_NNRPD for now
#### =()<_PATH_NNQRD @<_PATH_NNRPD>@>()=
_PATH_NNQRD /usr/local/news/bin/nnrpd
-
## Where most other programs live.
## See also _PATH_RNEWSPROGS and _PATH_CONTROLPROGS, below.
#### =()<_PATH_NEWSBIN @<_PATH_NEWSBIN>@>()=
_PATH_NEWSBIN /usr/local/news/bin
-
## Where temporary files live on the server
#### =()<_PATH_TMP @<_PATH_TMP>@>()=
_PATH_TMP /tmp
-
## Command to send mail (with -s "subject" allowed)
#### =()<_PATH_MAILCMD @<_PATH_MAILCMD>@>()=
_PATH_MAILCMD /usr/bin/mailx
-
## Where scripts should have shlock create locks.
#### =()<_PATH_LOCKS @<_PATH_LOCKS>@>()=
_PATH_LOCKS /var/local/news/locks
-
## Where your GNU gzip binary is (for rnews to run on gzipped batches).
#### =()<_PATH_GZIP @<_PATH_GZIP>@>()=
_PATH_GZIP /usr/local/bin/gzip
-
пути к спулу (создать
директорию /news_mirror/news и линк на нее: /var/news)
-
## Where rnews creates temporary files until finished
#### =()<_PATH_SPOOLTEMP @<_PATH_SPOOLTEMP>@>()=
_PATH_SPOOLTEMP /tmp
-
пути программ,
вызываемых из innd и rnews
-
## Rnews may execute any program in this directory; see RNEWSPROGS.
#### =()<_PATH_RNEWSPROGS @<_PATH_RNEWSPROGS>@>()=
_PATH_RNEWSPROGS /usr/local/news/bin/rnews.libexec
-
## Path to control messages scripts.
#### =()<_PATH_CONTROLPROGS @<_PATH_CONTROLPROGS>@>()=
_PATH_CONTROLPROGS /usr/local/news/bin/control
-
сокеты (без изменений, т.к. есть ссылка /var/news -> /bbs_cd2/news
-
журнал и файлы
конфигурации:
-
конфигурация innwatch:
впоследствии вручную заменил в innwatch.ctl
шаблоны (не сами строки)
обращения к df на свой inndf
-
## How inn (not just innwatch anymore) gets disk space usage
## (SVR4 machine would probably use /usr/ucb/df)
#### =()<INNWATCH_DF @<INNWATCH_DF>@>()=
INNWATCH_DF /usr/local/bin/df
-
## Field number of INNWATCH_DF (with -i) output that gives free
## inodes (starting at 1).
#### =()<INNWATCH_INODES @<INNWATCH_INODES>@>()=
INNWATCH_INODES 4
-
TCL пока не включаем
-
PGP пока не включаем
-
локальная
конфигурация
-
## Home of the NEWSUSER
#### =()<_PATH_NEWSHOME @<_PATH_NEWSHOME>@>()=
_PATH_NEWSHOME /usr/local/news
-
actsync - пока не
разбирался
-
perl пока не включаем - нужна версия 5.003, а у меня 4 (не
отломятся ли какие мои скрипты от
перехода?)
-
В этом чертовом Солярисе poll
работает не совсем так, как ожидает inn
(заточенный под BSD), в файлах innd/chan.c и innd/nc.c уже
поставлена заплатка
#ifdef POLL_BUG
...
#endif
но, к сожалению, POLL_BUG нигде не
определяется, пришлось мне
вставить в innd/innd.h:
#ifdef SUNOS5
#define POLL_BUG
#endif
после этого все ошибки (cant read Resource temporaly unavailable,
приводящие к разрыву
соединения), исчезли.
-
Добавляем /usr/ccs/bin в PATH и
говорим:
cd $inn
make world
Злобно ругается насчет lint, ну и пусть!
cat */lint
Ошибок быть не должно.
-
Конфигурируем (только один раз!):
cd $inn/site
make all
(копируются образцы файлов с
описанием
конфигурации из samples)
-
Создаем структуру
директорий (только один раз! если что
поменять,
выпутывайся сам):
cd $inn
chmod u+x makedirs.sh
становимся
суперпользователем и
запускаем
makedirs.sh -p
-
устанавливаем софт
(опять-таки из-под
суперпользователя) - заметьте, что файлы с
конфигурацией не
устанавливаются:
cd $inn
make update
(inndstart должен
принадлежать
суперпользователя - сделай это ручками)
-
Теперь заходим в $inn/site и правим там все файлы
конфигурации ;)
-
как
обрабатывать
управляющие сообщения
-
checkgroups - не менять
-
control.ctl - убрать проверку PGP,
которой пока нет
-
default - не менять
-
docheckgroups - не менять
-
ihave - не менять
-
newgroup - не менять
-
parsecontrol - не менять
-
rmgroup - не менять
-
sendme - не менять
-
sendsys - не менять
-
senduuname - не менять
-
version - без изменений
-
writelog - без изменений
-
pgpverify - не трогать
-
скрипты, вызываемые из cron или при
загрузке
-
innlog.pl - был innlog.awk: что
делать?
-
innstat - не менять
-
news.daily - вставить мой кусок,
связанный со сбором имен
news-серверов
-
rc.news - не менять
-
scanlogs - добавить подсчет объемов статей,
полученных из разных
источников (в оригинале
считается только
количество статей)
awk '{print $5, $7}' | sort | awk -f sum.awk
-
tally.control - не менять
-
tally.unwanted - не менять
-
утилиты для посылки статей
соседним серверам
-
nntpsend - не трогать
-
nntpsend.ctl - не трогать
-
send-ihave - не менять
-
send-nntp - не менять
-
send-uucp - не трогать
-
sendbatch - не трогать
-
локальная
конфигурация:
-
expire.ctl - здесь надо проявить бездну
фантазии
-
hosts.nntp - здесь
перечислены имена хостов, которые будут нас
питать (ns.aha.ru, news.demos.su, news.rosprint.net, deolws.deol.ru),
для всех других адресов будет
запускаться nnrpd
-
inn.conf - сведения о сервере
-
moderators - не трогать
-
newsfeeds - это основной файл,
описывающий, что принимать (ME), и
что/кому/как
пересылать, так что
тщательнЕе!
-
nnrp.access - адреса и пароли, кому что можно
читать и писать (с auth
разобраться)
-
passwd.nntp - а это еще зачем?
-
полезные утилиты (все потом):
-
inncheck
-
innwatch
-
makegroup
-
innreport
-
scanspool
-
теперь
устанавливаем конф. файлы на места:
cd $inn/site
make install
-
откуда-то берем файл active
-
а так делают history с нуля:
touch $HISTORY
cd ${HISTORYDIR}
${NEWSBIN}/makehistory -r -i
mv history.n.dir history.dir
mv history.n.pag history.pag
-
теперь можно вставить rc.news
куда-нибудь в /etc/rc2.d/S99news и
запустить его (параметра start нет)
INN 2.2.1 на Red Hat Linux 6.0 ( +update)
Требует Perl 5, PGP, Tcl.
Группа - news (13). Добавить себя в нее.
Пользователь news (9), без пароля,
домашняя директория - /var/spool/news.
Основные затраты на емкость диска: /var/lib/news
(управляющие БД - active, history и т.п.), /var/log/news, /var/spool/news
(сами статьи, архивы, очереди -
перенести на самый быстрый и емкий диск, а лучше RAID, и
сделать link).
Сделать 3 дырки в firewall:
-
дырку в локальной защите хоста
-
доступ из Интернет на данный хост к 119 порту
-
доступ клиентов на данный хост к 119 порту
Приходит в виде пакетов:
-
inn-2.2.1-1
-
inn-devel-2.2.1-1 (а нужно ли это?)
-
inews-2.2.1-1 (а нужно ли это?)
Почему-то
сконфигурирован для запуска на уровне 4(?!).
Вручную настроил ссылки в /etc/rc.d/rc2.d и rc3.d.
При установке вносятся
изменения в /etc/syslog.conf (news.notice /var/log/news/news.notice, news.=err
/var/log/news/news.err, news.=crit /var/log/news/news.crit).
Журналы (/var/log/news):
-
news - список
полученных статей
-
news.crit
-
news.err
-
news.notice
-
errlog -
необработанные
управляющие сообщения
(исключительно попытки взлома)
-
expire.list (список файлов для
удаления)
-
expire.log
-
inn.status (html-страница,
обновляется каждые 5 минут)
-
nntpsend.log
-
unwanted.log
-
отдельные журналы для
управляющих сообщений, если не
поправить control.ctl
Если в newsfeed для какого-то сервера
накапливаются статьи в файле:
═ ═
══<имя хоста>:<шаблон имен групп>:Tf,Wnm:<имя файла=имя хоста для простоты>
не забудь в crontab занести
строчку:
═ ═ ═5,35 * * * * /usr/local/news/bin/nntpsend <имя хоста>
<полное имя хоста>
интервал
подбирается по вкусу.
Что делать, если...
Что делать если надо, что-то
поменять ═в программе (особенно config.data ;)
-
останови сервер
-
внеси изменения
-
сделай make world (в $inn)
-
(из-под
суперпользователя зайди в $inn и скажи make update
-
запусти сервер
Что делать если надо, что-то
поменять ═в
конфигурационных файлах:
-
внеси изменения
-
cd $inn/site
-
make install
-
если не пошло, то сказать make what, и
поправить эти файлы вручную, затем опять
сказать make install
-
ctlinnd reload <что> <зачем>
Что делать, если нужно все статьи
перенести с одного news-сервера на другой:
-
cd $SPOOL
-
find alt ... za > out.going/temp
-
innxmit host-name═ temp - лучше в
цикле, пока файл не опустеет (на случай сбоев),
можно ключи -dv для
наглядности
Если в спуле
завалялись файлы с прошлого года и
хочется включить их в active/history,
сделай:
═ ═makehistory -buv (пусть только сервер будет
свободным в этот момент; или без ключей при
выключенном сервере);
═ ═makeactive -mo > active.new (сервер д.б.
выключен).
Мною исправлена ошибка в backends/archive.c
(архивирование статей) в функции MakeArchiveDirectory(Name):
═ ═for (p = Name; *p; p++)
═ ═ ═ заменил на
═ ═for (p = Name+1; *p; p++)
═ ═ ═ а то он пытался создать
директорию с пустым именем
Сохранение всех статей
посланных локально (не из demos или mp.aha.ru) - в newsfeeds:
═ ═local-archive!/demos,mp.aha.ru:*:Tc,Wn:/usr/local/news/bin/archive -a
/var/news/spool/archive/local -i /var/news/spool/archive/local/INDEX
Сбор и обработка
статистики
Какие группы
пользуются наибольшей
популярностью? Извлекаем
информацию из ежедневно
собираемой статистики (nnrpd_groups_stats.sh):
awk '/by newsgroup/, /-------/ {print}' /var/mail/news | egrep
-v '^$|by newsgroup|-------' ═| sort | awk -f /usr/local/bin/sum.awk | sort
-nr +1
Трактовка отчета innreport:
-
refused -
принимающая строна
отказалась принимать статью
-
rejected - приняла, но выкинула
-
spooled - не успели
пропихнуть и отложили до лучших времен
-
missed - пытались послать
отложенную статью, но expire успел
удалить ее с нашего сервера
Автоматическое
добавление/удаление групп
Полагаться на
управляющие статьи
совершенно невозможно - засыплют
мусором.
Успользуется шаблон для egrep,
перечисляющий какие группы мы хотим иметь: wanted_groups_filter.egrep
Добавление групп по факту - если upstream
посылает нам статью, а группы для нее нет, то
группу надо создать. scanlogs
создает
специальный файл unwanted.log в /var/log/news, в
который записывает имена
несуществующих групп. Раз в сутки
запускаем процедуру (add_unwanted_group.sh,
add_unwanted_group.awk), которая
разбирает этот журнал, немножко чистит от
неправильных символов,
фильтрует иерархии, на которые мы не
подписаны вовсе (wanted_groups_filter.egrep),
запускает ctlinnd newgroup
(модерируемость
определяется
эмпирически) и
сбрасывает журнал в архив. innd не
хочет записывать в журнал имена групп
длиннее 80 символов (заменяет конец имени на
многоточие).
Удаление групп, не входящих в
иерархии, на которые мы
подписаны (remove_unwanted_group.sh,
remove_unwanted_group.awk). Из active
извлекается список групп,
чистится от
неправильных символов,
фильтрует иерархии, на которые мы
подписаны (а также местные и
служебные группы - типа to, control и т.п.-
wanted_groups_filter.egrep), и
генерирует список команд ctlinnd rmgroup.
Список
рекомендуется
просмотреть перед тем как
запускать реальное удаление. К
сожалению, группы удаляются только из active. Сами
статьи и директории остаются.
Предполагается, что статьи будут
удалены со временем с помощью expire/expireover, а
сами директории в процессе чистки мусора
(например, с помощью ncc).
Чистка мусора
(был на http://www.backplane.com/news/newsprune203/) newsprune
пробегает по всем
директориям,
соответствующим файлу active (к
сожалению, остальные
директории не
просматривает), и
генерирует список файлов, для которых нет
соответствующей строки в history.
Написан на Си. Понимает
директории с числом в качестве имени и
корректно
обрабатывает только что
добавленые статьи. Ключ -d8
включает отладочную печать (очень много, можно -d1 или -d2).
Ограничение: 31 уровень иерархии.
Обрабатывает
покореженные active и history. Список
подлежащих удалению файлов надо
скормить fastrm или xargs rm. На
миллион статей требует около часа. Памяти
потребляет очень мало.
findmissing.pl генерит список файлов,
найденных в спуле, но
отсутствующих в histore. Этот список надо
отредактировать (скрипт не умеет
обрабатывать
директории с именами из одних цифр) и
скормить fastrm или xargs rm. На
миллион статей надо 2.5 часа и 64МБ памяти. Но
просматривает все
директории (даже, если нет
соответствующей строки в active).
Улучшенный findmissing.pl: ncc из newstools-1.3.tar.gz.
Теперь он понимает числовые
директории. К сожалению,
программа осталась perl-овой (т.е.
ресурсов ей надо много, 3.5 часа).
Вдобавок ищет файлы с именами, не
являющимися числами (почему-то
называет их core). Удаление
директорий, не имеющих
соответствия в active: sort -nr ncc:bogus | awk '{print
SPOOLDIR/$1}' | xargs rmdir.
scanspool делает полный просмотр
спул-директории, включая проверку
правильности
заголовков статей. Описание внутри
(использовать -v -n).
Работает ОЧЕНЬ долго (сутки, если не
останавливать innd). За это время innd
успевает принять огромное
количество новых статей и удалить старых. Ключ -c
отключает проверку
содержимого статей, время работы
уменьшается до 3 часов.
Поиск пустых групп. history_to_groups_stat.sh (awk
'{for(i=3;i<=NF;i++) print $i}' $HISTORY | awk -F/ '{print $1}' |
sort | awk -f count.awk) выдает
количество статей,
полученных в каждой группе за
последние 2 недели (интервал времени
определяется в expire.ctl).
Работает полчаса. Из 28 тысяч групп на нашем
сервере: 11 тысяч - пустые, 3.5 тысячи - имеют по
одной статье (частично, из-за
ограничений по приему). find_empty_group.sh:
изготавливаем из active список
существующих на данный момент групп (не
забыть sort -u).
Изготавливаем с помощью history_to_groups_stat.sh
список групп, имеющих право на
существование (не забыть sort -u). С
помощью comm -23 exist mustbe делаем список групп,
которые надо удалить
(отфильтровав из него
локальные и служебные группы), затем
генерируем список команд ctlinnd rmgroup.
Список
рекомендуется
просмотреть перед тем как
запускать реальное удаление. К
сожалению, группы удаляются только из active. Сами
директории остаются.
Предполагается, что они будут удалены в
процессе чистки мусора (например, с
помощью ncc). К сожалению,
удаляются группы,
которые оказались пустыми по нашей вине (из-за
ограничений на feed). Часть из них
восстанавливается со временем, но
если
ограничения были
поставлены на
передающей стороне (например, через gup), то такие
группы не появятся никогда.
|
Bog BOS: INN (news-сервер в стандарте NNTP)
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru