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, ну или просто с попавшего под РосКомКаток сайта).
  • include FILEPATH позволит подключить еще один конфигурационный файл.


Настраиваем 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.* вместо описанного выше вызова помещается что-то в духе:

#!/bin/sh
WORKDIRS=/var/cache/rawdog
CONFIGS=/etc/rawdog
PLUGINS=/usr/share/rawdog/plugins
LOGS=/var/log/rawdog
for CFG in "$CONFIGS/"*.conf
do
    WORKDIR="$WORKDIRS/"`basename "$CFG" .conf`
    [ -d "$WORKDIR" ] || mkdir -p "$WORKDIR"
    [ -f "$WORKDIR/config" ] || ln -s -f "$CFG" "$WORKDIR/config"
    if [ -d "$PLUGINS" ];
    then
        [ -d "$WORKDIR/plugins" ] || ln -s -f "$PLUGINS" "$WORKDIR/plugins"
    fi
    rawdog --dir "$WORKDIR" --log "$LOGS/rawdog" --no-lock-wait --update --write
done

Принцип работы прост: для каждого файла *.conf в /etc/rawdog будет (при необходимости) создан соответствующий рабочий подкаталог в /var/cache/rawdog, и в него будет помещена ссылка на сам конфигурационный файл. Туда же будет помещена (если отсутствует) ссылка на директорию с общими плагинами.
Для большего удобства можно вынести общие настройки в отдельный файл (/etc/rawdog/config или /etc/default/rawdog), подключив его в файлах *.conf с помощью директивы include.

Расширение плагинами


rawdog ищет скрипты на Python, расположенные в подкаталоге plugins в рабочей директории rawdog. Ряд готовых плагинов (в частности, многостраничный вывод и выдача в формате RSS) можно найти на сайте автора.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 10

    0
    Можно еще дешевле обойтись — например bamboo (на случай если и сервера нет и приложение отдельное ставить не хочется). Проверено, весьма годный и удобный ридер. Пользуюсь им параллельно с tiny-tiny-rss.
      0
      Я использую Selfoss на ARM-одноплатнике (lighttpd + pgsql). А ранее на роутере RT-N16 (128 MiB ОЗУ) c sqlite базой.
        +1
        Есть же бесплатный (в базе) Feedly, доступный как по вебу с десктопа, так и в виде бесплатного приложения для телефона.
          0
          Гугл реадер тоже был бесплатен. И с кучей приложений. И доступный ото всюду. И с аптаймом. И где теперь тот reader?
            +1
            Когда закрываются гиганты, обычно они позволяют скачать ленты новостей.
            Сам пользуюсь Feedly, только рад. Удобный дизайн, минимализм, постоянный аптайм.
              0
              ленты — да, только адреса :( без самих сообщений, которых на сотнях лент и паре лет ого сколько, особенно ценны отмеченные
          0
          Хочу заметить, что статья (особенно последняя часть) будет обновляться по мере сбора шишек и наступания на грабли.
            0
            Читаю в newsbeuter на VPS, подключаясь по Mosh/SSH.
              0
              Не знаю чего вам не хватило в Tiny Tiny RSS, заводится с полпинка, у меня она спокойно работает на дешовом шаред хостинге уже больше года, фактически с момента закрытия гугле ридера.

                +1
                Прямо говоря, не хотелось громоздить PostgreSQL и PHP на VPS с 512 MB RAM (из которых 60% стабильно заняты) ради такой простой задачи. Для моих потребностей этот комбайн, который разве что кофе не варит, явно излишен. Хотелось чего-то попроще и покомпактнее.

                Если всё-таки соберусь поднимать что-то со схожими системными требованиями, тогда взгляну и на tt-rss.

              Only users with full accounts can post comments. Log in, please.