diff --git a/net-nntp/sabnzbd/files/sabnzbd-r1.ini b/net-nntp/sabnzbd/files/sabnzbd-r1.ini new file mode 100644 index 0000000..5ccd7e1 --- /dev/null +++ b/net-nntp/sabnzbd/files/sabnzbd-r1.ini @@ -0,0 +1,12 @@ +__version__ = 19 +[misc] +log_dir = /var/log/sabnzbd +admin_dir = /var/lib/sabnzbd/admin +cache_dir = /var/lib/sabnzbd/cache +complete_dir = /var/lib/sabnzbd/complete +download_dir = /var/lib/sabnzbd/download +dirscan_dir = /var/lib/sabnzbd/dirscan +nzb_backup_dir = /var/lib/sabnzbd/backup +auto_browser = 0 +host = :: +port = 8080 diff --git a/net-nntp/sabnzbd/files/sabnzbd-r1.initd b/net-nntp/sabnzbd/files/sabnzbd-r1.initd new file mode 100644 index 0000000..eff3352 --- /dev/null +++ b/net-nntp/sabnzbd/files/sabnzbd-r1.initd @@ -0,0 +1,71 @@ +#!/sbin/openrc-run +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +PIDFILE="/run/sabnzbd/sabnzbd.pid" + +depend() { + use dns +} + +get_var() { + grep -P -o -m 1 "(?<=^${1} = ).*" "${SABNZBD_CONFIGFILE}" || echo 0 +} + +start() { + ebegin "Starting SABnzbd" + + checkpath -q -d -o ${SABNZBD_USER}:${SABNZBD_GROUP} -m 0770 "$(dirname "${PIDFILE}")" + + start-stop-daemon \ + --quiet \ + --start \ + --user ${SABNZBD_USER} \ + --group ${SABNZBD_GROUP} \ + --pidfile "${PIDFILE}" \ + --wait 1000 \ + --exec /usr/share/sabnzbd/SABnzbd.py \ + -- \ + --config-file "${SABNZBD_CONFIGFILE}" \ + --logging "${SABNZBD_LOGGING}" \ + --daemon \ + --pidfile "${PIDFILE}" + + eend $? +} + +stop() { + local protocol="http" + local host="$(get_var "host")" + local port="$(get_var "port")" + + if [ $(get_var "enable_https") -eq 1 ]; then + protocol="https" + port="$(get_var "https_port")" + fi + + case "${host}" in + *:*) host="[${host}]" ;; + esac + + local url="${protocol}://${host}:${port}/sabnzbd/api?mode=shutdown" + + if [ $(get_var "disable_api_key") -eq 0 ]; then + url="${url}&apikey=$(get_var "api_key")" + fi + + local signals="TERM/1/KILL/1" + + ebegin "Stopping SABnzbd" + + if [ "$(wget -o /dev/null -t 1 -O - -T 10 "${url}")" = "ok" ]; then + signals="NULL/5/${signals}" + fi + + start-stop-daemon \ + --stop \ + --pidfile "${PIDFILE}" \ + --retry "${signals}" + + eend $? +} diff --git a/net-nntp/sabnzbd/files/sabnzbd.confd b/net-nntp/sabnzbd/files/sabnzbd.confd new file mode 100644 index 0000000..c949355 --- /dev/null +++ b/net-nntp/sabnzbd/files/sabnzbd.confd @@ -0,0 +1,6 @@ +SABNZBD_CONFIGFILE="/etc/sabnzbd/sabnzbd.ini" +SABNZBD_USER="sabnzbd" +SABNZBD_GROUP="sabnzbd" + +# 0 - error/warnings, 1 - info, 2 - debug +SABNZBD_LOGGING="1" diff --git a/net-nntp/sabnzbd/files/sabnzbd_at.service b/net-nntp/sabnzbd/files/sabnzbd_at.service new file mode 100644 index 0000000..92c5eb9 --- /dev/null +++ b/net-nntp/sabnzbd/files/sabnzbd_at.service @@ -0,0 +1,10 @@ +[Unit] +Description=SABnzbd binary newsreader + +[Service] +ExecStart=/usr/share/sabnzbd/SABnzbd.py --logging 1 --browser 0 +User=sabnzbd +Group=sabnzbd + +[Install] +WantedBy=multi-user.target diff --git a/net-nntp/sabnzbd/sabnzbd-4.4.1.ebuild b/net-nntp/sabnzbd/sabnzbd-4.4.1.ebuild new file mode 100644 index 0000000..d1a47f9 --- /dev/null +++ b/net-nntp/sabnzbd/sabnzbd-4.4.1.ebuild @@ -0,0 +1,179 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI="8" + +PYTHON_COMPAT=( python3_{10..12} ) +PYTHON_REQ_USE="sqlite" + +inherit optfeature python-single-r1 systemd + +MY_PV="${PV/_alpha/Alpha}" +MY_PV="${MY_PV/_beta/Beta}" +MY_PV="${MY_PV/_rc/RC}" + +MY_P="SABnzbd-${MY_PV}" + +DESCRIPTION="Binary newsgrabber with web-interface" +HOMEPAGE="https://sabnzbd.org/" +SRC_URI="https://github.com/sabnzbd/sabnzbd/releases/download/${MY_PV}/${MY_P}-src.tar.gz" +S="${WORKDIR}/${MY_P}" + +# Sabnzbd is GPL-2 but bundles software with the following licenses. +LICENSE="GPL-2 BSD LGPL-2 MIT BSD-1" +SLOT="0" +KEYWORDS="amd64" +IUSE="test" +RESTRICT="!test? ( test )" +REQUIRED_USE="${PYTHON_REQUIRED_USE}" + +DEPEND=" + acct-user/sabnzbd + acct-group/sabnzbd + ${PYTHON_DEPS} + $(python_gen_cond_dep ' + >=dev-python/apprise-1.8.0[${PYTHON_USEDEP}] + dev-python/chardet[${PYTHON_USEDEP}] + dev-python/cheetah3[${PYTHON_USEDEP}] + dev-python/cherrypy[${PYTHON_USEDEP}] + dev-python/configobj[${PYTHON_USEDEP}] + dev-python/cryptography[${PYTHON_USEDEP}] + >=dev-python/feedparser-6.0.11[${PYTHON_USEDEP}] + >=dev-python/guessit-3.8.0[${PYTHON_USEDEP}] + dev-python/notify2[${PYTHON_USEDEP}] + dev-python/portend[${PYTHON_USEDEP}] + dev-python/puremagic[${PYTHON_USEDEP}] + ~dev-python/sabctools-8.2.5[${PYTHON_USEDEP}] + ') +" +RDEPEND=" + ${DEPEND} + || ( + >=app-arch/par2cmdline-0.8 + >=app-arch/par2cmdline-turbo-1.1.0 + ) + net-misc/wget +" +BDEPEND=" + test? ( + $(python_gen_cond_dep ' + dev-python/flaky[${PYTHON_USEDEP}] + >=dev-python/lxml-4.5.0[${PYTHON_USEDEP}] + >=dev-python/pyfakefs-5.6.0[${PYTHON_USEDEP}] + dev-python/pytest-asyncio[${PYTHON_USEDEP}] + dev-python/pytest-httpbin[${PYTHON_USEDEP}] + dev-python/pytest-httpserver[${PYTHON_USEDEP}] + dev-python/pytest-mock[${PYTHON_USEDEP}] + dev-python/pytest[${PYTHON_USEDEP}] + dev-python/requests[${PYTHON_USEDEP}] + dev-python/selenium[${PYTHON_USEDEP}] + dev-python/tavalidate[${PYTHON_USEDEP}] + >=dev-python/tavern-2[${PYTHON_USEDEP}] + dev-python/werkzeug[${PYTHON_USEDEP}] + dev-python/xmltodict[${PYTHON_USEDEP}] + ') + app-arch/p7zip + app-arch/unrar + app-arch/unzip + www-apps/chromedriver-bin + ) +" + +src_test() { + local EPYTEST_IGNORE=( + # network sandbox + tests/test_getipaddress.py + tests/test_rss.py + tests/test_urlgrabber.py + tests/test_utils/test_happyeyeballs.py + tests/test_utils/test_internetspeed.py + ) + local EPYTEST_DESELECT=( + # network sandbox + 'tests/test_cfg.py::TestValidators::test_validate_host' + 'tests/test_consistency.py::TestWiki' + 'tests/test_newswrapper.py::TestNewsWrapper' + 'tests/test_happyeyeballs.py::TestHappyEyeballs' + 'tests/test_internetspeed.py::TestInternetSpeed' + # Just plain fails + 'tests/test_newsunpack.py::TestPar2Repair::test_basic' + # Does not work with pytest-8.x + 'tests/test_functional_api.py' + # Chromedriver tests don't want to behave in portage + 'tests/test_functional_config.py::TestBasicPages::test_base_pages' + 'tests/test_functional_config.py::TestBasicPages::test_base_submit_pages' + 'tests/test_functional_config.py::TestConfigLogin::test_login' + 'tests/test_functional_config.py::TestConfigCategories::test_page' + 'tests/test_functional_config.py::TestConfigRSS::test_rss_basic_flow' + 'tests/test_functional_config.py::TestConfigServers::test_add_and_remove_server' + 'tests/test_functional_downloads.py::TestDownloadFlow::test_download_basic_rar5' + 'tests/test_functional_downloads.py::TestDownloadFlow::test_download_zip' + 'tests/test_functional_downloads.py::TestDownloadFlow::test_download_7zip' + 'tests/test_functional_downloads.py::TestDownloadFlow::test_download_passworded' + 'tests/test_functional_downloads.py::TestDownloadFlow::test_download_fully_obfuscated' + 'tests/test_functional_downloads.py::TestDownloadFlow::test_download_unicode_rar' + 'tests/test_functional_misc.py::TestShowLogging::test_showlog' + 'tests/test_functional_misc.py::TestQueueRepair::test_queue_repair' + 'tests/test_functional_misc.py::TestDaemonizing::test_daemonizing' + 'tests/test_functional_sorting.py::TestDownloadSorting' + # Bug https://bugs.gentoo.org/934331 fixed in 4.3.3. + 'tests/test_sorting.py::TestSortingSorter' + # cryptography-43, https://bugs.gentoo.org/938453 + 'tests/test_utils/test_cert_gen.py::TestCertGen::test_generate_key_custom[512-test_key.pem]' + ) + + # The test suite is prone to being broken by random plugins that happen + # to be installed, so disable autoloading. + local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 + # Use PYTEST_PLUGINS instead of args to 'epytest' because the test suite + # calls pytest itself and the args would get lost. To get the list of plugins, + # if stuck, comment out the AUTOLOAD line above, look at the list of loaded + # plugins at the top of the pytest output, then translate those into module names + # by e.g. checking equery f. + local -x PYTEST_PLUGINS=pytest_mock,tavern,tavern._core.pytest,pyfakefs.pytest_plugin,pytest_asyncio.plugin + + epytest -s +} + +src_install() { + insinto /usr/share/${PN} + doins -r email icons interfaces locale po sabnzbd scripts tools + + exeinto /usr/share/${PN} + doexe SABnzbd.py + + python_fix_shebang "${ED}"/usr/share/${PN} + python_optimize "${ED}"/usr/share/${PN} + + newinitd "${FILESDIR}"/${PN}-r1.initd ${PN} + newconfd "${FILESDIR}"/${PN}.confd ${PN} + + diropts -o ${PN} -g ${PN} + dodir /etc/${PN} + keepdir /var/log/${PN} + + insinto "/etc/${PN}" + insopts -m 0600 -o "${PN}" -g "${PN}" + newins "${FILESDIR}"/${PN}-r1.ini ${PN}.ini + + dodoc ISSUES.txt README.mkd + + systemd_newunit "${FILESDIR}"/sabnzbd_at.service 'sabnzbd@.service' +} + +pkg_postinst() { + if [[ -z "${REPLACING_VERSIONS}" ]]; then + # This is a new installation + einfo "Default directory: /var/lib/${PN}" + einfo + einfo "To add a user to the sabnzbd group so it can edit SABnzbd+ files, run:" + einfo + einfo " usermod -a -G sabnzbd " + einfo + einfo "By default, SABnzbd will listen on TCP port 8080." + fi + + optfeature "7z archive support" app-arch/p7zip + optfeature "rar archive support" app-arch/unrar app-arch/rar + optfeature "zip archive support" app-arch/unzip +}