diff --git a/www-apps/tt-rss/Manifest b/www-apps/tt-rss/Manifest new file mode 100644 index 0000000..d4ab192 --- /dev/null +++ b/www-apps/tt-rss/Manifest @@ -0,0 +1 @@ +DIST tt-rss-20230505.tar.gz 8356703 BLAKE2B e5ebc10caf6935249e538a7b241b27cad8f15991551762c940b73b8669da526270568c178159735854b600108593708c17ab31316c2db3fe13e91b022abbb50f SHA512 cda1dc759e99a1a55760426bf6acc4e5272e75c0c37fc4f51857b3a3800c759b852de2d846d32f5fd2f0c9fc06d19d4c3f1b43c00edd77fe809b6123dbf868d5 diff --git a/www-apps/tt-rss/files/permissions-r1 b/www-apps/tt-rss/files/permissions-r1 new file mode 100644 index 0000000..e50b440 --- /dev/null +++ b/www-apps/tt-rss/files/permissions-r1 @@ -0,0 +1,24 @@ +#!/bin/bash -e + +cd "${MY_INSTALLDIR}" + +if [[ $1 = install ]]; then + # We need to lock down cache/ for the operations below to be + # safe. The permissions match the webapp-config defaults but these + # can be changed and existing installations may also differ. + chown root:root cache/ + chmod 00755 cache/ + + chgrp --no-dereference ttrssd feed-icons/ lock/ cache/*/ + chmod g+ws feed-icons/ lock/ cache/*/ + + # Files within lock/ are exclusively written by the update daemon. + # feed-icons/ and cache/ holds files that are modified in place by both + # processes and therefore ACLs are required to ensure that the files + # themselves are created as group writable. + if ! setfacl --modify d:g::rwX feed-icons/ cache/*/; then + echo "WARNING: ACLs are not available on this filesystem. Either enable them or set TTRSSD_USER to your PHP user in /etc/conf.d/ttrssd to avoid permission issues." + elif [[ -n $(find feed-icons/ cache/ -type f ! -name ".*" ! -name index.html ! \( -group ttrssd -perm -020 \) -print -quit) ]]; then + echo "WARNING: Files that are not writable by the ttrssd group found within the cache or feed-icons directories. Either delete them or correct their permissions." + fi +fi diff --git a/www-apps/tt-rss/files/postinstall-en-with-daemon-r1.txt b/www-apps/tt-rss/files/postinstall-en-with-daemon-r1.txt new file mode 100644 index 0000000..92d1fa3 --- /dev/null +++ b/www-apps/tt-rss/files/postinstall-en-with-daemon-r1.txt @@ -0,0 +1,15 @@ +Please read https://tt-rss.org/wiki/GlobalConfig. Note that the configuration +syntax changed in 2021. + +Once you have configured TT-RSS, tweak /etc/conf.d/ttrssd to your +needs if you have not already done so. If ACLs are unavailable on the +filesystem you have just installed to then you will need to set +TTRSSD_USER to your PHP user. When everything is ready, (re)start the +update daemon like so: + + /etc/init.d/ttrssd restart + +This will periodically update your feeds in the background. Add the +daemon to your default runlevel to start it on every boot: + + rc-update add ttrssd default diff --git a/www-apps/tt-rss/files/postinstall-en.txt b/www-apps/tt-rss/files/postinstall-en.txt new file mode 100644 index 0000000..f28a19d --- /dev/null +++ b/www-apps/tt-rss/files/postinstall-en.txt @@ -0,0 +1,2 @@ +Please read https://tt-rss.org/wiki/GlobalConfig. Note that the configuration +syntax changed in 2021. diff --git a/www-apps/tt-rss/files/tt-rss-no-chmod.patch b/www-apps/tt-rss/files/tt-rss-no-chmod.patch new file mode 100644 index 0000000..e51e66e --- /dev/null +++ b/www-apps/tt-rss/files/tt-rss-no-chmod.patch @@ -0,0 +1,26 @@ +These files may be written and then updated by the web interface user or the +update daemon user, so they need to be group writeable. We enforce this with +ACLs rather than chmod though. + +diff --color -Naur a/classes/pref/feeds.php b/classes/pref/feeds.php +--- a/classes/pref/feeds.php 2022-02-18 13:44:03.000000000 +0000 ++++ b/classes/pref/feeds.php 2022-02-19 15:37:55.000723992 +0000 +@@ -490,7 +490,6 @@ + + if (file_exists($new_filename)) unlink($new_filename); + if (rename($tmp_file, $new_filename)) { +- chmod($new_filename, 0644); + + $feed->set([ + 'favicon_avg_color' => null, +diff --color -Naur a/classes/rssutils.php b/classes/rssutils.php +--- a/classes/rssutils.php 2022-02-18 13:44:03.000000000 +0000 ++++ b/classes/rssutils.php 2022-02-19 15:37:40.393312123 +0000 +@@ -1728,7 +1728,6 @@ + + fwrite($fp, $contents); + fclose($fp); +- chmod($icon_file, 0644); + clearstatcache(); + + return $icon_file; diff --git a/www-apps/tt-rss/files/ttrssd.confd-r2 b/www-apps/tt-rss/files/ttrssd.confd-r2 new file mode 100644 index 0000000..b169b54 --- /dev/null +++ b/www-apps/tt-rss/files/ttrssd.confd-r2 @@ -0,0 +1,47 @@ +# Copyright 1999-2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# Space-separated paths of TT-RSS instances that you want to start the +# update daemon for. If left empty, these will be automatically +# detected using data from /var/db/webapps/tt-rss. Instances without +# the update_daemon2.php script present will be skipped. +# +# Default: +# INSTANCE_DIRS="" +# Example: +# INSTANCE_DIRS="/some/webhost/htdocs/tt-rss /some/otherwebhost/htdocs/newsreader" +# +INSTANCE_DIRS="" + +# Path to the log files. One log file will be created for each TT-RSS +# instance. Update the logrotate file after changing this. +# +# Default: +# LOG_DIR="/var/log/ttrssd" +# +LOG_DIR="/var/log/ttrssd" + +# User to run the update daemon as. You should not run this as +# root. If ACLs are unavailable on the filesystem used by the TT-RSS +# instances then choosing the same user that serves the PHP web +# interface is recommended to avoid permission issues. You *must* add +# this user to the ttrssd group. If the PHP user is not the same as +# the web server user (e.g. apache or nginx) then this user must be +# added to the ttrssd group too. +# +# Default: +# TTRSSD_USER="ttrssd" +# +TTRSSD_USER="ttrssd" + +# Additional options to pass to the update daemon. If you want to pass +# different options to different TT-RSS instances then create symlinks +# of the ttrssd init.d script (e.g. ttrssd.foo, ttrssd.bar) and +# configure INSTANCE_DIRS and TTRSSD_OPTS for each of these. +# +# Default: +# TTRSSD_OPTS="" +# Example: +# TTRSSD_OPTS="--tasks=1 --interval=300" +# +TTRSSD_OPTS="" diff --git a/www-apps/tt-rss/files/ttrssd.initd-r4 b/www-apps/tt-rss/files/ttrssd.initd-r4 new file mode 100644 index 0000000..82bfdd0 --- /dev/null +++ b/www-apps/tt-rss/files/ttrssd.initd-r4 @@ -0,0 +1,119 @@ +#!/sbin/openrc-run +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +command="/usr/bin/php" + +depend() { + need net + after postgresql mysql +} + +PID_DIR="/run/ttrssd" +LOG_DIR=${LOG_DIR:-"/var/log/ttrssd"} +TTRSSD_USER=${TTRSSD_USER:-"ttrssd"} + +list_instance_dirs() { + if [ -z "${INSTANCE_DIRS}" ]; then + cut -d" " -f4 /var/db/webapps/tt-rss/*/installs 2>/dev/null + else + printf "%s\n" ${INSTANCE_DIRS} + fi +} + +instance_dir_to_name() { + local name + + name=${1#/} + printf %s "${name}" | awk '{ + gsub("/", "--"); + print $0; + }' +} + +start_pre() { + mkdir -p "${PID_DIR}" "${LOG_DIR}" || return 1 + chown "${TTRSSD_USER}":ttrssd "${LOG_DIR}" || return 1 +} + +start() { + local instance_dir instance_name ret=1 + + IFS=" +" + for instance_dir in $(list_instance_dirs); do + if [ -d "${instance_dir}" ]; then + if [ ! -f "${instance_dir}"/update_daemon2.php ]; then + ewarn "TT-RSS instance in ${instance_dir} has no update_daemon2.php script" + elif [ ! -f "${instance_dir}"/config.php ]; then + eerror "TT-RSS instance in ${instance_dir} is not configured" + else + instance_name=$(instance_dir_to_name "${instance_dir}") + ebegin "Starting TT-RSS update daemon in ${instance_dir}" + start-stop-daemon --start --user "${TTRSSD_USER}":ttrssd \ + --background --wait 2000 \ + --stdout "${LOG_DIR}/${instance_name}.log" \ + --stderr "${LOG_DIR}/${instance_name}.log" \ + --make-pidfile --pidfile "${PID_DIR}/${instance_name}.pid" \ + --exec /usr/bin/php -- -f "${instance_dir}"/update_daemon2.php \ + -- ${TTRSSD_OPTS} + eend $? && ret=0 + fi + else + eerror "TT-RSS instance in ${instance_dir} is missing" + fi + done + unset IFS + + # Succeed if at least one started. + return ${ret} +} + +stop() { + local instance_dir instance_name + + IFS=" +" + for instance_dir in $(list_instance_dirs); do + instance_name=$(instance_dir_to_name "${instance_dir}") + + [ -f "${PID_DIR}/${instance_name}.pid" ] || + [ -f "${instance_dir}"/update_daemon2.php ] || + continue + + ebegin "Stopping TT-RSS update daemon in ${instance_dir}" + start-stop-daemon --stop --retry 5 --pidfile "${PID_DIR}/${instance_name}.pid" \ + --exec /usr/bin/php -- -f "${instance_dir}"/update_daemon2.php \ + -- ${TTRSSD_OPTS} + eend $? + + rm -f "${instance_dir}"/lock/*.lock + done + unset IFS + + # Always succeed. + return 0 +} + +status() { + local instance_dir instance_name pid + + IFS=" +" + for instance_dir in $(list_instance_dirs); do + instance_name=$(instance_dir_to_name "${instance_dir}") + + [ -f "${PID_DIR}/${instance_name}.pid" ] || + [ -f "${instance_dir}"/update_daemon2.php ] || + continue + + if start-stop-daemon --signal 0 --pidfile "${PID_DIR}/${instance_name}.pid"; then + # At least one instance is running + return 0 + fi + done + unset IFS + + # No instances are running + return 3 +} diff --git a/www-apps/tt-rss/files/ttrssd.logrotated-r1 b/www-apps/tt-rss/files/ttrssd.logrotated-r1 new file mode 100644 index 0000000..c2bf08f --- /dev/null +++ b/www-apps/tt-rss/files/ttrssd.logrotated-r1 @@ -0,0 +1,9 @@ +/var/log/ttrssd/*.log { + daily + delaycompress + missingok + notifempty + postrotate + /etc/init.d/ttrssd restart > /dev/null + endscript +} diff --git a/www-apps/tt-rss/metadata.xml b/www-apps/tt-rss/metadata.xml new file mode 100644 index 0000000..14875c2 --- /dev/null +++ b/www-apps/tt-rss/metadata.xml @@ -0,0 +1,12 @@ + + + + + chewi@gentoo.org + James Le Cuirot + + + + Install additional init scripts for automated RSS updates + + diff --git a/www-apps/tt-rss/tt-rss-20230505.ebuild b/www-apps/tt-rss/tt-rss-20230505.ebuild new file mode 100644 index 0000000..a491b4d --- /dev/null +++ b/www-apps/tt-rss/tt-rss-20230505.ebuild @@ -0,0 +1,90 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit webapp + +DESCRIPTION="Tiny Tiny RSS - A web-based news feed (RSS/Atom) aggregator using AJAX" +HOMEPAGE="https://tt-rss.org/" +SRC_URI="https://herbizarre.swordarmor.fr/garbage/${P}.tar.gz" # Upstream git frontend blocks wget? +LICENSE="GPL-3" +KEYWORDS="~amd64 ~arm ~arm64 ~mips ~x86" +IUSE="+acl daemon gd +mysqli postgres" +REQUIRED_USE="|| ( mysqli postgres )" + +PHP_SLOTS="8.0 7.4" +PHP_USE="gd?,mysqli?,postgres?,curl,fileinfo,intl,json(+),pdo,unicode,xml" + +php_rdepend() { + local slot + echo "|| (" + for slot in ${PHP_SLOTS}; do + echo "( + virtual/httpd-php:${slot} + dev-lang/php:${slot}[$1] + )" + done + echo ")" +} + +DEPEND=" + daemon? ( acl? ( sys-apps/acl ) ) +" + +RDEPEND=" + ${DEPEND} + daemon? ( + acct-user/ttrssd + acct-group/ttrssd + $(php_rdepend "${PHP_USE},cli,pcntl") + ) + !daemon? ( + $(php_rdepend "${PHP_USE}") + ) +" + +DEPEND=" + !vhosts? ( ${DEPEND} ) +" + +need_httpd_cgi # From webapp.eclass + +S="${WORKDIR}/${PN}" + +PATCHES=( + "${FILESDIR}"/${PN}-no-chmod.patch +) + +src_install() { + webapp_src_preinst + + insinto "${MY_HTDOCSDIR}" + doins -r * + + # When updating, grep the plugins directory for additional CACHE_DIR + # instances as they cannot be created later due to permissions. + dodir "${MY_HTDOCSDIR}"/cache/starred-images + + local dir + for dir in "${ED}${MY_HTDOCSDIR}"/{cache/*,feed-icons,lock}/; do + webapp_serverowned "${dir#${ED}}" + done + + if use daemon; then + webapp_hook_script "${FILESDIR}"/permissions-r1 + webapp_postinst_txt en "${FILESDIR}"/postinstall-en-with-daemon-r1.txt + + newinitd "${FILESDIR}"/ttrssd.initd-r4 ttrssd + newconfd "${FILESDIR}"/ttrssd.confd-r2 ttrssd + + insinto /etc/logrotate.d + newins "${FILESDIR}"/ttrssd.logrotated-r1 ttrssd + + elog "After upgrading, please restart ttrssd." + else + webapp_postinst_txt en "${FILESDIR}"/postinstall-en.txt + fi + + webapp_src_install +}