[Из песочницы] rawdog — аггрегатор RSS без завышенных запросов
Лирическое вступление В связи с недавним отпочкованием от Хабрахабра нового ресурса, у меня возникла нужда обустроить удобный способ чтения обоих ресурсов. Первая мысль, разумеется, была об RSS, благо движок у обоих сайтов его поддерживает. Оставались сущие пустяки — найти хороший RSS-аггрегатор, который можно было бы установить на малосильную VPS (поскольку участь Google Reader’а несколько охладила желание полагаться на сторонний сервис).Поначалу наводка от Tsyganov_Ivan вывела на аггрегатор Tiny Tiny RSS, показавшимся настоящей «серебряной пулей». Однако более близкое знакомство с системными требованиями несколько охладило мой пыл — громоздить полноценный LAMP на машинку с дай бог 256 метрами незанятой памяти, и всё это ради ресурса буквально на одного человека? Тем более что знакомство с FAQ, содержавшим ссылки на откровенно издевательские ответы на форуме пакета, окончательно отбило желание иметь с tt-rss дело.Первый раунд поиска завершился неудачей, поскольку альтернативы (вроде FeedHQ) требовали примерно то же самое. Отчаявшись, я уже собрался писать нужный мне инструмент сам и стал подыскивать подходящие библиотеки для Python (к которому я питаю слабость), когда наткнулся на практически то, что нужно.
Само название RAWDOG намекает, что автора во время написания обуревали схожие чувства. Эта утилита предназначена для запуска вручную или по cron и умеет только одно: распарсить указанные RSS-ленты и записать новые элементы в выходной файл по заданному шаблону.
Установка и настройка Поскольку rawdog присутствует в репозитории Ubuntu, получение пакета сложностей не представляет. А вот настройка имеет свои особенности.Во-первых, вам придется самим добавить вызов rawdog в crontab, либо в cron.*. Это будет выглядеть примерно так: rawdog --dir WORKDIR --log /var/log/rawdog/rawdog.log --no-lock-wait --update --write где ключ --no-lock-wait не даст запустить вторую копию rawdog, а WORKDIR — рабочий каталог утилиты.Дело в том, что rawdog ищет конфигурационный файл и держит все свои временные файлы в одном рабочем каталоге — по умолчанию ~/.rawdog. Это может быть удобно для рабочей станции, но противоречит обычной практике. Если вы, как и я, любите порядок и единообразие, указать другую рабочую директорию можно с помощью ключа --dir, что позволило отправить рабочий каталог в /var/cache/rawdog (поскольку его основное содержимое, судя по всему, кэш скачанных лент). Поскольку конфигурационный файл тоже ищется там же (ключ --config позволяет задать дополнительный конфиг, но не отменяет поиск основного), он был заменен на символическую ссылку, после чего отправился вместе с шаблонами в /etc.
Хорошо документированный пример файла конфигурации можно найти в Сети, поэтому я только коротко укажу основные директивы:
maxarticles N позволяет задать длину ленты результатов (выдача одностраничная, что может быть неудобно); maxage T указывает, записи за какой временной интервал будут показаны в ленте выдачи; expireage T задает, как долго будут оставаться записи, исчезнувшие в оригинальной RSS-ленте. Если этот интервал меньше, чем maxage, то в случае часто обновляющейся ленты устаревшие записи будут пропадать из результатов еще до истечения обычного срока. pagetemplate FILEPATH и itemtemplate FILEPATH позволяют указать файл с шаблонами для страницы в целом и для отдельной записи соответственно. По умолчанию (значение default) используется простенький встроенный шаблон. outputfile FILEPATH — куда будут записываться результаты выдачи. Настройку вебсервера для отдачи этой статической странички лучше оставить за рамками этой статьи (я, например, использую lighttpd). Единственное, удостоверьтесь что к этому файлу будет доступ на запись у rawdog (не проблема, если утилита запускается через cron с правами root) и доступ на чтение у веб-сервера. и, наконец, директива feed interval URL [params] позволяет добавить RSS-ленту для просмотра с заданным интервалом (поскольку вызов обычно осуществляется через cron, то rawdog просто проигнорирует «не устаревшие» ленты если его вызвать раньше положенного). Среди параметров стоит выделить id (о нём ниже) и http_proxy, позволяющий задать прокси сервер для обращения к конкретной ленте (если вам хочется странного, вроде агрегации RSS-ленты из Tor, ну или просто с попавшего под РосКомКаток сайта). Настраиваем logrotate Поскольку rawdog обычно вызывается по несколько раз в день, и генерирует около килобайта логов каждый раз, имеет смысл либо отключить запись логов совсем (убрав ключ --log), либо настроить logrotate. Для последнего достаточного положить в /etc/logrotate.d/ файл примерно такого содержания (предполагая, что вы выбрали тот же путь к файлу логов, что и я): /var/log/rawdog/rawdog.log { weekly missingok rotate 5 compress delaycompress notifempty } Наводим красоту Встроенный шаблон у rawdog минималистичен, если не сказать жестче, поэтому имеет смысл задать свои файлы шаблонов. Самый важный — шаблон pagetemplate, поскольку именно в нём можно задать стили и подключить необходимые скрипты. Чтобы увидеть шаблон страницы по умолчанию, можно использовать следующую команду (обязательно укажите --dir WORKDIR если вы, как и я, переместили рабочий каталог): rawdog -s pagetemplate >template.html Любой встроенный шаблон можно посмотреть аналогичной командой, заменив pagetemplate на название шаблона. Шаблонизация реализована посредством простого поиска с заменой, хотя есть и условный оператор, позволяющий вставить заглушку при отсутствии значения. К слову, вы можете определять свои переменные с помощью директивы define VARNAME VALUE (глобально) или параметра define_VARNAME=VALUE (для отдельной RSS-ленты).
Следует заметить, что каждая запись по умолчанию помечается CSS-классом feed-FEEDID, где FEEDID — id источника, заданный в параметрах выше. Это позволяет задавать свой дизайн для записей из разных источников (например, показывать иконку сайта рядом с заголовком).
И напоследок Навскидку можно придумать один способ, позволяющий сравнительно просто создать несколько сосуществующих подборок лент, с отдельными наборами подписок, целевыми файлами и дизайном.Для этого в cron.* вместо описанного выше вызова помещается что-то в духе:
for CFG in /etc/rawdog/*.conf do WORKDIR=»/var/cache/rawdog/»`basename $CFG .conf` [ -d »$WORKDIR» ] || mkdir -p »$WORKDIR» [ -f »$WORKDIR/config» ] || ln -sf /etc/rawdog/config »$WORKDIR/config» if [ -f »$WORKDIR/state» -a »$WORKDIR/state» -nt »$CFG» ]; then rawdog --dir »$WORKDIR» --log /var/log/rawdog/rawdog.log --no-lock-wait --update --write else rawdog --dir »$WORKDIR» --config »$CFG» --log /var/log/rawdog/rawdog.log --no-lock-wait --update --write fi done Принцип работы прост: для каждого файла *.conf в /etc/rawdog будет (при необходимости) создан соответствующий подкаталог в /var/cache/rawdog, в него будет помещена ссылка на конфигурационный файл /etc/rawdog/config с наaстройками по умолчанию. Если указанный файл *.conf обрабатывается впервые, или изменился с момента последней обработки (определяется по наличию и дате изменения state-файла), rawdog будет вызван с указанием прочитать настройки конкретной группы лент, что приведет к их принудительной загрузке. В противном случае rawdog просто продолжит работу, основываясь на state-файле.