From: Aleksei Nikiforov <darktemplar@altlinux.org> To: devel@lists.altlinux.org Cc: Aleksei Nikiforov <darktemplar@altlinux.org> Subject: [devel] [PATCH for apt 35/38] Add basic tests to ensure that lua and rpm scripts are called Date: Tue, 10 Dec 2019 18:23:40 +0300 Message-ID: <20191210152343.33867-36-darktemplar@altlinux.org> (raw) In-Reply-To: <20191210152343.33867-1-darktemplar@altlinux.org> --- apt/test/integration/framework | 52 ++++++++++++ apt/test/integration/test-apt-config-dump | 2 +- apt/test/integration/test-apt-lua-simple | 82 +++++++++++++++++++ .../test-apt-rpm-bash-scripts-simple | 21 +++++ 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100755 apt/test/integration/test-apt-lua-simple create mode 100755 apt/test/integration/test-apt-rpm-bash-scripts-simple diff --git a/apt/test/integration/framework b/apt/test/integration/framework index 326874a..fa9672d 100644 --- a/apt/test/integration/framework +++ b/apt/test/integration/framework @@ -189,6 +189,15 @@ END # setup rpm dbpath echo "RPM::DBPath \"$TMPWORKINGDIRECTORY/var/lib/rpm\";" > rootdir/etc/apt/apt.conf.d/99rpmdbpath.conf + # setup lua stuff + mkdir -p $TMPWORKINGDIRECTORY/lua/scripts + mkdir -p $TMPWORKINGDIRECTORY/lua/results + echo "Dir::Bin::scripts \"$TMPWORKINGDIRECTORY/lua/scripts\";" > rootdir/etc/apt/apt.conf.d/90lua.conf + + # setup bash scripts + mkdir -p $TMPWORKINGDIRECTORY/bash/scripts + mkdir -p $TMPWORKINGDIRECTORY/bash/results + msgdone "info" } @@ -290,6 +299,24 @@ testequal() { "$@" 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail } +testscriptoutput() { + local MSG="$1" + shift + + msgtest "Test of output of" "$MSG" + + testequal --nomsg "$@" +} + +testscriptnooutput() { + local MSG="$1" + shift + + msgtest "Test for no output of" "$MSG" + + [ ! -e "$1" ] && msgpass || msgfail +} + testregexmatch() { local MSG='Test of regex match of' if [ "$1" = '--nomsg' ]; then @@ -500,3 +527,28 @@ generaterepository() { fi done } + +createluascript() { + local APTNAME="$1" + local SCRIPTFILENAME="$2" + + echo "$APTNAME:: \"${SCRIPTFILENAME}.lua\";" > rootdir/etc/apt/apt.conf.d/91lua-${SCRIPTFILENAME}.conf + cat > $TMPWORKINGDIRECTORY/lua/scripts/${SCRIPTFILENAME}.lua << ENDSCRIPT +f = io.open("$TMPWORKINGDIRECTORY/lua/results/${SCRIPTFILENAME}.result", "a") +f:write("$APTNAME called\n") +f:close() +ENDSCRIPT +} + +createbashscript() { + local APTNAME="$1" + local SCRIPTFILENAME="$2" + + echo "$APTNAME:: \"$TMPWORKINGDIRECTORY/bash/scripts/${SCRIPTFILENAME}.sh\";" > rootdir/etc/apt/apt.conf.d/92bash-${SCRIPTFILENAME}.conf + cat > $TMPWORKINGDIRECTORY/bash/scripts/${SCRIPTFILENAME}.sh << ENDSCRIPT +#!/bin/bash +echo "$APTNAME called" >> "$TMPWORKINGDIRECTORY/bash/results/${SCRIPTFILENAME}.result" +ENDSCRIPT + + chmod +x $TMPWORKINGDIRECTORY/bash/scripts/${SCRIPTFILENAME}.sh +} diff --git a/apt/test/integration/test-apt-config-dump b/apt/test/integration/test-apt-config-dump index 134242f..6ddc031 100755 --- a/apt/test/integration/test-apt-config-dump +++ b/apt/test/integration/test-apt-config-dump @@ -37,8 +37,8 @@ Dir::Etc::translatelist \"translate\.list\"; Dir::Etc::translateparts \"translate\.list\.d\"; Dir::Bin \"\"; Dir::Bin::methods \"[^\"]*\"; +Dir::Bin::scripts \"[^\"]*\"; Dir::Bin::rpm \"/bin/rpm\"; -Dir::Bin::scripts \"/usr/share/apt/scripts\"; Dir::Ignore-Files-Silently \"\"; Dir::Ignore-Files-Silently:: \"~\\$\"; Dir::Ignore-Files-Silently:: \"\\\.disabled\\$\"; diff --git a/apt/test/integration/test-apt-lua-simple b/apt/test/integration/test-apt-lua-simple new file mode 100755 index 0000000..878f7ad --- /dev/null +++ b/apt/test/integration/test-apt-lua-simple @@ -0,0 +1,82 @@ +#!/bin/bash +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment + +createluascript "Scripts::Init" "init" +createluascript "Scripts::Cache::Init" "cache-init" +createluascript "Scripts::Acquire::Archive::Done" "acquire-archive-done" +createluascript "Scripts::PM::Pre" "pm-pre" +createluascript "Scripts::PM::Post" "pm-post" +createluascript "Scripts::AptGet::Update::Pre" "aptget-update-pre" +createluascript "Scripts::AptGet::Update::Post-Invoke-Success" "aptget-update-post-invoke-success" +createluascript "Scripts::AptGet::Update::Post" "aptget-update-post" +createluascript "Scripts::AptCache::Script" "aptcache-script" +createluascript "Scripts::AptCache::Help::Command" "aptcache-help-command" +createluascript "Scripts::AptCache::Command" "aptcache-command" +createluascript "Scripts::AptGet::Install::SelectPackage" "aptget-install-selectpackage" +createluascript "Scripts::AptGet::Upgrade" "aptget-upgrade" +createluascript "Scripts::AptGet::Install::TranslateArg" "aptget-install-translatearg" +createluascript "Scripts::AptGet::Install::PreResolve" "aptget-install-preresolve" +createluascript "Scripts::AptGet::Install::PostResolve" "aptget-install-postresolve" +createluascript "Scripts::AptGet::DistUpgrade" "aptget-distupgrade" +createluascript "Scripts::AptGet::Script" "aptget-script" +createluascript "Scripts::AptGet::Help::Command" "aptget-help-command" +createluascript "Scripts::AptGet::Command" "aptget-command" + +buildpackage "simple-package" + +testpkgnotinstalled "simple-package" + +rm -f $TMPWORKINGDIRECTORY/lua/results/* ||: +aptgetinstallpackage "simple-package" "1" "alt1" "$(getarchitecture)" + +testscriptoutput "Scripts::Init" "Scripts::Init called +Scripts::Init called" cat $TMPWORKINGDIRECTORY/lua/results/init.result +testscriptoutput "Scripts::Cache::Init" "Scripts::Cache::Init called" cat $TMPWORKINGDIRECTORY/lua/results/cache-init.result +testscriptoutput "Scripts::AptGet::Command" "Scripts::AptGet::Command called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-command.result +testscriptoutput "Scripts::AptGet::Install::PreResolve" "Scripts::AptGet::Install::PreResolve called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-install-preresolve.result +testscriptoutput "Scripts::AptGet::Install::PostResolve" "Scripts::AptGet::Install::PostResolve called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-install-postresolve.result +testscriptoutput "Scripts::Acquire::Archive::Done" "Scripts::Acquire::Archive::Done called" cat $TMPWORKINGDIRECTORY/lua/results/acquire-archive-done.result +testscriptoutput "Scripts::PM::Pre" "Scripts::PM::Pre called" cat $TMPWORKINGDIRECTORY/lua/results/pm-pre.result +testscriptoutput "Scripts::PM::Post" "Scripts::PM::Post called" cat $TMPWORKINGDIRECTORY/lua/results/pm-post.result + +testpkginstalled "simple-package" + +buildpackage "simple-package-update" + +rm -f $TMPWORKINGDIRECTORY/lua/results/* ||: +testfailure aptget update + +testscriptoutput "Scripts::Init" "Scripts::Init called" cat $TMPWORKINGDIRECTORY/lua/results/init.result +testscriptoutput "Scripts::AptGet::Command" "Scripts::AptGet::Command called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-command.result +testscriptoutput "Scripts::AptGet::Update::Pre" "Scripts::AptGet::Update::Pre called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-update-pre.result +testscriptoutput "Scripts::AptGet::Update::Post" "Scripts::AptGet::Update::Post called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-update-post.result +# this looks broken: it probably shouldn't return success on failure to update some items +testscriptoutput "Scripts::AptGet::Update::Post-Invoke-Success" "Scripts::AptGet::Update::Post-Invoke-Success called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-update-post-invoke-success.result + +generaterepository "$TMPWORKINGDIRECTORY/usr/src/RPM/RPMS" "$TMPWORKINGDIRECTORY/usr/src/RPM/REPO" + +rm -f $TMPWORKINGDIRECTORY/lua/results/* ||: +testsuccess aptget update + +testscriptoutput "Scripts::Init" "Scripts::Init called" cat $TMPWORKINGDIRECTORY/lua/results/init.result +testscriptoutput "Scripts::Cache::Init" "Scripts::Cache::Init called" cat $TMPWORKINGDIRECTORY/lua/results/cache-init.result +testscriptoutput "Scripts::AptGet::Command" "Scripts::AptGet::Command called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-command.result +testscriptoutput "Scripts::AptGet::Update::Pre" "Scripts::AptGet::Update::Pre called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-update-pre.result +testscriptoutput "Scripts::AptGet::Update::Post-Invoke-Success" "Scripts::AptGet::Update::Post-Invoke-Success called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-update-post-invoke-success.result +testscriptoutput "Scripts::AptGet::Update::Post" "Scripts::AptGet::Update::Post called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-update-post.result + +rm -f $TMPWORKINGDIRECTORY/lua/results/* ||: +testsuccess aptget dist-upgrade -y + +testscriptoutput "Scripts::Init" "Scripts::Init called" cat $TMPWORKINGDIRECTORY/lua/results/init.result +testscriptoutput "Scripts::Cache::Init" "Scripts::Cache::Init called" cat $TMPWORKINGDIRECTORY/lua/results/cache-init.result +testscriptoutput "Scripts::AptGet::Command" "Scripts::AptGet::Command called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-command.result +testscriptoutput "Scripts::AptGet::DistUpgrade" "Scripts::AptGet::DistUpgrade called" cat $TMPWORKINGDIRECTORY/lua/results/aptget-distupgrade.result +testscriptoutput "Scripts::Acquire::Archive::Done" "Scripts::Acquire::Archive::Done called" cat $TMPWORKINGDIRECTORY/lua/results/acquire-archive-done.result +testscriptoutput "Scripts::PM::Pre" "Scripts::PM::Pre called" cat $TMPWORKINGDIRECTORY/lua/results/pm-pre.result +testscriptoutput "Scripts::PM::Post" "Scripts::PM::Post called" cat $TMPWORKINGDIRECTORY/lua/results/pm-post.result diff --git a/apt/test/integration/test-apt-rpm-bash-scripts-simple b/apt/test/integration/test-apt-rpm-bash-scripts-simple new file mode 100755 index 0000000..918ca94 --- /dev/null +++ b/apt/test/integration/test-apt-rpm-bash-scripts-simple @@ -0,0 +1,21 @@ +#!/bin/bash +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment + +createbashscript "RPM::Pre-Invoke" "rpm-pre-invoke" +createbashscript "RPM::Pre-Install-Pkgs" "rpm-pre-install-pkgs" +createbashscript "RPM::Post-Invoke" "rpm-post-invoke" + +buildpackage "simple-package" + +testpkgnotinstalled "simple-package" +aptgetinstallpackage "simple-package" "1" "alt1" "$(getarchitecture)" +testpkginstalled "simple-package" + +testscriptoutput "RPM::Pre-Invoke" "RPM::Pre-Invoke called" cat $TMPWORKINGDIRECTORY/bash/results/rpm-pre-invoke.result +testscriptoutput "RPM::Pre-Install-Pkgs" "RPM::Pre-Install-Pkgs called" cat $TMPWORKINGDIRECTORY/bash/results/rpm-pre-install-pkgs.result +testscriptoutput "RPM::Post-Invoke" "RPM::Post-Invoke called" cat $TMPWORKINGDIRECTORY/bash/results/rpm-post-invoke.result -- 2.24.0
next prev parent reply other threads:[~2019-12-10 15:23 UTC|newest] Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-12-10 15:23 [devel] [PATCH for apt 00/38] Various fixes for Apt and basic integration test suite Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 01/38] Replace post-increments with pre-increments Aleksei Nikiforov 2019-12-10 18:21 ` Alexey Tourbin 2019-12-11 7:51 ` Aleksei Nikiforov 2019-12-11 8:11 ` Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 02/38] Use correct types and type specifiers Aleksei Nikiforov 2019-12-10 22:45 ` Dmitry V. Levin 2019-12-11 7:56 ` Aleksei Nikiforov 2019-12-11 23:48 ` Dmitry V. Levin 2019-12-12 9:57 ` [devel] [PATCH for apt v2 00/21] Various fixes for Apt and basic integration test suite Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 01/21] Replace post-increments with pre-increments Aleksei Nikiforov 2019-12-12 21:32 ` Andrey Savchenko 2019-12-13 8:29 ` Aleksei Nikiforov 2019-12-13 9:11 ` [devel] [PATCH for apt v3 " Aleksei Nikiforov 2019-12-13 9:12 ` [devel] [PATCH for apt v4 09/21] Rework identical conditions Aleksei Nikiforov 2019-12-13 9:18 ` [devel] [PATCH for apt v4] Additional loops improvements and beautification Aleksei Nikiforov 2019-12-13 9:20 ` Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 02/21] Use correct types and type specifiers Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 03/21] Fix potential memory corruption in pkgCache::DepIterator::AllTargets() Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 04/21] Get rid of nullptr dereference Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 05/21] Fix memory access outside of allocated buffer ranges Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 06/21] Get rid of hardcoded array size Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 07/21] Use signed types to detect IO errors Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 08/21] Use 'explicit' keyword for constructors with one argument Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 09/21] Rework identical conditions Aleksei Nikiforov 2019-12-12 19:55 ` Andrey Savchenko 2019-12-13 8:10 ` Aleksei Nikiforov 2019-12-13 8:21 ` [devel] [PATCH for apt v3 " Aleksei Nikiforov 2019-12-13 8:23 ` [devel] [PATCH for apt v3] DoList: optimize status modification loop Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 10/21] Improve member variable initialization Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 11/21] Remove useless variable shadowing Aleksei Nikiforov 2019-12-12 21:19 ` Andrey Savchenko 2019-12-12 9:57 ` [devel] [PATCH for apt v2 12/21] Fortify against buffer overflows Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 13/21] Cacheiterators: sanitize increment operators and end() function Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 14/21] Fix memory leaks Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 15/21] Fix incorrect delete operator Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 16/21] Don't access uninitialized data Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 17/21] Fix access after free error Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 18/21] Apt-pipe: ensure mainloop function doesn't return uninitialized or garbage value Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 19/21] Don't use uninitialized value Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 20/21] Get rid of dangling invalid pointer Aleksei Nikiforov 2019-12-12 9:57 ` [devel] [PATCH for apt v2 21/21] Fix invalid check of Queue against zero Aleksei Nikiforov 2019-12-12 19:08 ` Andrey Savchenko 2019-12-13 7:25 ` Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 03/38] Fix potential memory corruption in pkgCache::DepIterator::AllTargets() Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 04/38] Get rid of nullptr dereference Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 05/38] Fix memory access outside of allocated buffer ranges Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 06/38] Get rid of hardcoded array size Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 07/38] Use signed types to detect IO errors Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 08/38] Use 'explicit' keyword for constructors with one argument Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 09/38] Rework identical conditions Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 10/38] Improve member variable initialization Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 11/38] Remove useless variable shadowing Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 12/38] Fortify against buffer overflows Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 13/38] Cacheiterators: sanitize increment operators and end() function Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 14/38] Fix memory leaks Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 15/38] Fix incorrect delete operator Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 16/38] Don't access uninitialized data Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 17/38] Fix access after free error Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 18/38] Apt-pipe: ensure mainloop function doesn't return uninitialized or garbage value Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 19/38] Don't use uninitialized value Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 20/38] Get rid of dangling invalid pointer Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 21/38] Fix invalid check of Queue against zero Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 22/38] Fix iterators comparison Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 23/38] Fortify ParseQuoteWord function Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 24/38] Improve ipv6 address handling Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 25/38] Check subsecond modification time for cached files Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 26/38] Fix warning about truncation of value of pkgCache::Header::HeaderSz Aleksei Nikiforov 2019-12-10 22:57 ` Dmitry V. Levin 2019-12-11 7:51 ` Aleksei Nikiforov 2019-12-11 23:41 ` Dmitry V. Levin 2019-12-12 7:38 ` Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 27/38] FileFd: all files are closed automatically Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 28/38] Fix resource leaks in pkgCacheFile class Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 29/38] Fix off by one error in dynamic mmap leading to resource leak Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 30/38] pkgCacheFile: call Close() function in destructor Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 31/38] pkgCacheFile: don't regenerate cache if it was already built Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 32/38] Add support for rpm's dbpath configuration Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 33/38] Import integration tests framework from Debian Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 34/38] Add initial integration tests Aleksei Nikiforov 2019-12-10 15:23 ` Aleksei Nikiforov [this message] 2019-12-10 15:23 ` [devel] [PATCH for apt 36/38] Add http and https methods tests Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 37/38] Enable integration test suite during package build Aleksei Nikiforov 2019-12-10 15:23 ` [devel] [PATCH for apt 38/38] Add code coverage support Aleksei Nikiforov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191210152343.33867-36-darktemplar@altlinux.org \ --to=darktemplar@altlinux.org \ --cc=devel@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git