]> Cypherpunks.ru repositories - nncp.git/commitdiff
Merge branch 'develop' v8.9.0
authorSergey Matveev <stargrave@stargrave.org>
Sun, 13 Aug 2023 20:15:35 +0000 (23:15 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 13 Aug 2023 20:15:35 +0000 (23:15 +0300)
77 files changed:
.gitignore [deleted file]
Makefile [deleted file]
PUBKEY-SSH.pub [new file with mode: 0644]
PUBKEY-SSH.pub.asc [new file with mode: 0644]
VERSION.do [deleted file]
all.do [deleted file]
bin/.gitignore [deleted file]
bin/all.do [deleted file]
bin/build [new file with mode: 0755]
bin/clean.do [deleted file]
bin/default.do [deleted file]
bin/hjson-cli.do [deleted file]
clean.do [deleted file]
doc.do [deleted file]
doc/ack.texi [new file with mode: 0644]
doc/building.texi
doc/call.texi
doc/cfg/neigh.texi
doc/cmd/nncp-ack.texi
doc/cmd/nncp-rm.texi
doc/cmd/nncp-toss.texi
doc/download.texi
doc/index.texi
doc/integration/bittorrent.texi
doc/integration/download.texi
doc/integrity.texi
doc/makeinfo.rc
doc/mirrors.texi
doc/news.ru.texi
doc/news.texi
doc/nncp.html.do
doc/spool.texi
doc/style.css [deleted file]
doc/www.do [new file with mode: 0644]
install [new file with mode: 0755]
install-strip [new file with mode: 0755]
install-strip.do [deleted file]
install.do [deleted file]
makedist
src/call.go
src/cfg.go
src/cfgdir.go
src/cmd/nncp-ack/main.go
src/cmd/nncp-bundle/main.go
src/cmd/nncp-call/main.go
src/cmd/nncp-caller/main.go
src/cmd/nncp-cfgdir/main.go
src/cmd/nncp-cfgenc/main.go
src/cmd/nncp-cfgmin/main.go
src/cmd/nncp-cfgnew/main.go
src/cmd/nncp-check/main.go
src/cmd/nncp-cronexpr/main.go
src/cmd/nncp-daemon/main.go
src/cmd/nncp-exec/main.go
src/cmd/nncp-file/main.go
src/cmd/nncp-freq/main.go
src/cmd/nncp-hash/main.go
src/cmd/nncp-log/main.go
src/cmd/nncp-pkt/main.go
src/cmd/nncp-reass/main.go
src/cmd/nncp-rm/main.go
src/cmd/nncp-stat/main.go
src/cmd/nncp-toss/main.go
src/cmd/nncp-trns/main.go
src/cmd/nncp-xfer/main.go
src/go.mod
src/go.sum
src/mcd.go
src/nncp.go
src/node.go
src/toss.go
src/toss_test.go
src/tx_test.go
test.do [deleted file]
uninstall [new file with mode: 0755]
uninstall.do [deleted file]
version [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
deleted file mode 100644 (file)
index fd85e30..0000000
+++ /dev/null
@@ -1 +0,0 @@
-VERSION
diff --git a/Makefile b/Makefile
deleted file mode 100644 (file)
index 1ae4fe8..0000000
--- a/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-REDO ?= contrib/do -c
-
-warning:
-       @echo WARNING: this is not real Makefile. Just proxying commands to redo command
-
-all: warning
-       $(REDO) $@
-
-clean: warning
-       $(REDO) $@
-
-install: warning
-       $(REDO) $@
-
-install-strip: warning
-       $(REDO) $@
-
-uninstall: warning
-       $(REDO) $@
diff --git a/PUBKEY-SSH.pub b/PUBKEY-SSH.pub
new file mode 100644 (file)
index 0000000..94ba25f
--- /dev/null
@@ -0,0 +1 @@
+releases@nncpgo.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAN9JzbXHVPouT+atdxhcVgVmCWLm9Dx/mhPWfU4Sceb
diff --git a/PUBKEY-SSH.pub.asc b/PUBKEY-SSH.pub.asc
new file mode 100644 (file)
index 0000000..643f709
--- /dev/null
@@ -0,0 +1,11 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQFIBAABCgAyFiEEksLwrv5zII5Gv/PeKyWGjnWhqVMFAmTSnBMUHHJlbGVhc2Vz
+QG5uY3Bnby5vcmcACgkQKyWGjnWhqVOiHQgAzMartvzE1En6hMo9kg31/1QKFbgc
++tHOF5L62hpp3BOvbAyHG1IbFRRCUCi/m3i1KJ0BexaNLItDFba2L/w1P554rDqh
+DslQsI3aU91eVLv/x2CTzkK4Sfx1KCH+sq6BfDnwgwR8LOshspvxcLstcao9dzjh
+IVFdVwQT4t3iHy7DUTR8AsMzO4El28Q8BNbU4Vb3SAyp6XWS08woyB2kNztH83h4
+FJrq17OFmxwRjQg3FXHuQDQs89XI7RE5pcw7RmOAcoKZbU+267NgHwW0BeFkPxwF
+NjKv4rmq6mnHUljCaVTR2DWSvvq+uhSy+Z9Ve05TxFPnwL+NdXkbTy8WNg==
+=59zV
+-----END PGP SIGNATURE-----
diff --git a/VERSION.do b/VERSION.do
deleted file mode 100644 (file)
index 488da2c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-redo-ifchange src/nncp.go
-perl -ne 'print "$1\n" if /Version.* = "(.*)"$/' < src/nncp.go
diff --git a/all.do b/all.do
deleted file mode 100644 (file)
index 8c7fdb1..0000000
--- a/all.do
+++ /dev/null
@@ -1 +0,0 @@
-redo-ifchange bin/all
diff --git a/bin/.gitignore b/bin/.gitignore
deleted file mode 100644 (file)
index b3d9328..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-hjson-cli
-nncp-*
diff --git a/bin/all.do b/bin/all.do
deleted file mode 100644 (file)
index 2b31559..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-redo-ifchange cmd.list hjson-cli
-redo-ifchange `cat cmd.list`
diff --git a/bin/build b/bin/build
new file mode 100755 (executable)
index 0000000..b2c0b1c
--- /dev/null
+++ b/bin/build
@@ -0,0 +1,15 @@
+#!/bin/sh -e
+
+cd "$(realpath -- $(dirname "$0"))"/../src
+GO=${GO:-go}
+. ../config
+[ -d vendor ] && vendor="-mod=vendor" || :
+mod=`$GO list $vendor -m`
+GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultCfgPath=$CFGPATH"
+GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultSendmailPath=$SENDMAIL"
+GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultSpoolPath=$SPOOLPATH"
+GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultLogPath=$LOGPATH"
+for cmd in `cat ../bin/cmd.list` ; do
+    $GO build $vendor -o ../bin/$cmd $GO_CFLAGS -ldflags "$GO_LDFLAGS" ./cmd/$cmd
+done
+$GO build $vendor -o ../bin/hjson-cli $GO_CFLAGS github.com/hjson/hjson-go/hjson-cli
diff --git a/bin/clean.do b/bin/clean.do
deleted file mode 100644 (file)
index 86a5019..0000000
+++ /dev/null
@@ -1 +0,0 @@
-rm -f `cat cmd.list` hjson-cli
diff --git a/bin/default.do b/bin/default.do
deleted file mode 100644 (file)
index 52c5501..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-cd ../src
-redo-ifchange ../config *.go cmd/${1##*/}/*.go
-. ../config
-GO=${GO:-go}
-mod=`$GO list -m`
-GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultCfgPath=$CFGPATH"
-GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultSendmailPath=$SENDMAIL"
-GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultSpoolPath=$SPOOLPATH"
-GO_LDFLAGS="$GO_LDFLAGS -X $mod.DefaultLogPath=$LOGPATH"
-$GO build -o ../bin/$3 $GO_CFLAGS -ldflags "$GO_LDFLAGS" ./cmd/${1##*/}
diff --git a/bin/hjson-cli.do b/bin/hjson-cli.do
deleted file mode 100644 (file)
index c7d40d2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-cd ../src
-GO=${GO:-go}
-$GO build -o ../bin/$3 github.com/hjson/hjson-go/hjson-cli
diff --git a/clean.do b/clean.do
deleted file mode 100644 (file)
index ebefc3e..0000000
--- a/clean.do
+++ /dev/null
@@ -1,2 +0,0 @@
-redo bin/clean
-rm -f VERSION
diff --git a/doc.do b/doc.do
deleted file mode 100644 (file)
index e8a354a..0000000
--- a/doc.do
+++ /dev/null
@@ -1 +0,0 @@
-redo-ifchange doc/all
diff --git a/doc/ack.texi b/doc/ack.texi
new file mode 100644 (file)
index 0000000..085251b
--- /dev/null
@@ -0,0 +1,72 @@
+@node ACK
+@cindex ACKnowledgements
+@cindex packet acknowledgement
+@unnumbered ACKnowledgements
+
+There is possibility to explicitly acknowledge the receipt of the
+encrypted packet, by generating the reply of @code{ACK}-type which
+contains the packet identifier.
+
+ACK packets can be generated explicitly by @command{@ref{nncp-ack}}
+command, or during the tossing procedure if @option{-gen-ack} option
+is specified.
+
+General workflow with acknowledgement is following, assuming that
+Alice has some outbound packets for Bob:
+
+@itemize
+
+@item Transfer encrypted packets, without deleting them locally:
+
+@example
+alice$ nncp-xfer -keep -tx -node bob /mnt/shared
+@end example
+
+@item On Bob's side retrieve those packets:
+
+@example
+bob$ nncp-xfer -rx /mnt/shared
+@end example
+
+That will also check if copied packets checksum is not mismatched.
+
+@item Create ACK packets of received ones, saving the list of encrypted
+    ACK packets:
+
+@example
+bob$ nncp-ack -node alice 4>acks
+@end example
+
+@item Send those newly created packets back to Alice:
+
+@example
+bob$ nncp-xfer [-keep] -tx /mnt/shared
+@end example
+
+@item Remove them from outbound spool, because we expect no
+    acknowledgement for them:
+
+@example
+bob$ nncp-rm -node alice -pkt <acks
+@end example
+
+@item Get those acknowledgement packets and @ref{nncp-toss, toss} them:
+
+@example
+alice$ nncp-xfer -rx /mnt/shared
+alice$ nncp-toss
+@end example
+
+Each ACK packet will remove kept corresponding outbound packets, because
+Bob explicitly confirmed their receipt.
+
+@end itemize
+
+Similarly you can use it with @command{@ref{nncp-bundle}}, but do not
+forget that by default it does not do checksumming of the packets, so
+you should either use its @option{-check} option, or run
+@command{@ref{nncp-check}} after.
+
+If you generate ACK packet during the tossing, then the list of ACK
+packets is saved as empty files directly in the @ref{Spool, spool}.
+You can remove transferred ACK packets with @command{nncp-rm -ack}.
index a0fdd5619e873d638dc87064bcb4c524e0579b61..7405d39960c463320932f087720bf3a0dbb01d91 100644 (file)
@@ -13,11 +13,12 @@ Make sure that Go is installed. For example to install it from packages:
 
 @example
 $ [fetch|wget] http://www.nncpgo.org/download/nncp-@value{VERSION}.tar.xz
-$ [fetch|wget] http://www.nncpgo.org/download/nncp-@value{VERSION}.tar.xz.sig
-$ gpg --verify nncp-@value{VERSION}.tar.xz.sig nncp-@value{VERSION}.tar.xz
-$ xz --decompress --stdout nncp-@value{VERSION}.tar.xz | tar xf -
+$ [fetch|wget] http://www.nncpgo.org/download/nncp-@value{VERSION}.tar.xz.@{asc,sig@}
+[verify signature]
+$ xz -d < nncp-@value{VERSION}.tar.xz | tar xf -
 $ cd nncp-@value{VERSION}
-$ redo all
+[optionally edit config]
+$ bin/build
 @end example
 
 @pindex info
@@ -27,22 +28,6 @@ necessary installation). For example, documentation for
 @command{nncp-bundle} command can be get with
 @command{info doc/nncp.info -n nncp-bundle}.
 
-@pindex redo
-@pindex apenwarr/redo
-@pindex apenwarr/do
-@pindex redo-c
-@pindex baredo
-@pindex goredo
-It uses @url{http://cr.yp.to/redo.html, redo} build system for that
-examples. You can use one of its various implementations, or at least
-minimalistic POSIX shell @command{contrib/do} (just replace
-@command{redo} with @command{contrib/do} in the example above) included
-in tarball. Following ones are tested to work with:
-@url{http://www.goredo.cypherpunks.ru/, goredo} (NNCP's author creation),
-@url{https://redo.readthedocs.io/, apenwarr/redo} (@code{contrib/do} is
-from that project), @url{https://github.com/leahneukirchen/redo-c, redo-c},
-@url{https://github.com/gotroyb127/baredo, baredo}.
-
 @vindex PREFIX
 @vindex DESTDIR
 @vindex GO
@@ -72,25 +57,25 @@ respected during installation:
 @env{$INFODIR},
 @env{$DOCDIR}.
 
-There is @command{install} target for binaries and info-documentation
+There is @command{install} script for binaries and info-documentation
 installation:
 
 @example
-# PREFIX=/usr/local redo install
+# PREFIX=/usr/local ./install
 @end example
 
 @vindex nofsnotify
 @cindex kqueue
 @cindex epoll
 @vindex GO_CFLAGS
-NNCP depends on @code{github.com/fsnotify/fsnotify} library, that is
-solely relies on OS-specific mechanisms. There is possibility that you
-have either broken or unsupported ones. You can still build NNCP with
+NNCP depends on @code{github.com/fsnotify/fsnotify} library, that solely
+relies on OS-specific mechanisms. There is possibility that you have
+either broken or unsupported ones. You can still build NNCP with
 @code{-tags nofsnotify} build option, to skip @code{fsnotify} library
 usage at all:
 
 @example
-$ GO_CFLAGS="-tags nofsnotify" redo @dots{}
+$ GO_CFLAGS="-tags nofsnotify" bin/build
 @end example
 
 @vindex noyggdrasil
index 06566abc4a87c7a5c77e321e5a2c912bb84551ed..bb29b58bc8aa7acf9f9bb82a37f475ff39f9ccdd 100644 (file)
@@ -16,6 +16,7 @@ calls: [
 
         autotoss: true
         autotoss-doseen: true
+        autotoss-gen-ack: true
     }
     {
         cron: "30 * * * SAT,SUN"
@@ -88,10 +89,11 @@ Optional. Override @ref{CfgMaxOnlineTime, @emph{maxonlinetime}}
 configuration option when calling.
 
 @vindex autotoss
-@item autotoss, -doseen, -nofile, -nofreq, -noexec, -notrns
+@item autotoss, -doseen, -nofile, -nofreq, -noexec, -notrns, -noack, -gen-ack
 Optionally enable auto tossing: run tosser on node's spool every second
 during the call. You can control either are @file{seen/} files must be
-created, or skip any kind of packet processing.
+created, or skip any kind of packet processing, or enable @ref{ACK}
+packets generation.
 
 @vindex when-tx-exists
 @item when-tx-exists
index 7912fe31f9ef7298d0f36ebddb8d42cd6d7bb96a..9816c8d55c535dab9462af59bbd64c59bfa38bbc 100644 (file)
@@ -51,6 +51,10 @@ neigh: {
       chunked: 1024
       minsize: 2048
     }
+    ack: {
+      nice: FLASH
+      minsize: 2048
+    }
     via: ["alice"]
     rxrate: 10
     txrate: 20
@@ -114,6 +118,21 @@ NNCP_NICE=64 \
         transmission.
     @end table
 
+@vindex ack
+@anchor{CfgACK}
+@item ack
+    Options applied to automatically generated @ref{ACK} packets during tossing.
+
+    @table @code
+    @item nice
+        Use that @ref{Niceness, niceness} for generated packets (255 is used
+        otherwise).
+
+    @item minsize
+        If set, then apply @ref{OptMinSize, -minsize} option during file
+        transmission.
+    @end table
+
 @vindex via
 @anchor{CfgVia}
 @item via
index a3b374da2c6f65bcc297c24161d5279dadef579e..358822d089d8ce38181e5fbbe69d9088206ed0be 100644 (file)
@@ -1,5 +1,4 @@
 @node nncp-ack
-@cindex packet acknowledgement
 @pindex nncp-ack
 @section nncp-ack
 
@@ -11,68 +10,13 @@ $ nncp-ack [options] -node NODE -pkt PKT
 $ nncp-ack [@dots{}] 4>&1 >&2 | nncp-rm [@dots{}] -pkt
 @end example
 
-Send acknowledgement of successful @option{PKT} (Base32-encoded hash)
-packet receipt from @option{NODE} node. If no @option{-pkt} is
-specified, then acknowledge all packet in node's @code{rx} outbound
-spool. If @option{-all} is specified, then do that for all nodes.
+Send @ref{ACK, acknowledgement} of successful @option{PKT}
+(Base32-encoded hash) packet receipt from @option{NODE} node. If no
+@option{-pkt} is specified, then acknowledge all packet in node's
+@code{rx} spool. If @option{-all} is specified, then do that for all
+nodes.
 
 That commands outputs list of created encrypted ACK packets
 (@code{NODE/PKT}) to @strong{4}th file descriptor. That output can be
 passed for example to @command{@ref{nncp-rm}} to remove them after
 transmission to not wait for acknowledgement and retransmission.
-
-General workflow with acknowledgement is following, assuming that
-Alice has some outbound packets for Bob:
-
-@itemize
-
-@item Transfer encrypted packets, without deleting them locally:
-
-@example
-alice$ nncp-xfer -keep -tx -node bob /mnt/shared
-@end example
-
-@item On Bob's side retrieve those packets:
-
-@example
-bob$ nncp-xfer -rx /mnt/shared
-@end example
-
-That will also check if copied packets checksum is not mismatched.
-
-@item Create ACK packets of received ones, saving the list of encrypted
-    ACK packets:
-
-@example
-bob$ nncp-ack -node alice 4>acks
-@end example
-
-@item Send those newly created packets back to Alice:
-
-@example
-bob$ nncp-xfer [-keep] -tx /mnt/shared
-@end example
-
-@item Remove them from outbound spool, because we expect no
-    acknowledgement for them:
-
-@example
-bob$ nncp-rm -node alice -pkt <acks
-@end example
-
-@item Get those acknowledgement packets and @ref{nncp-toss, toss} them:
-
-@example
-alice$ nncp-xfer -rx /mnt/shared
-alice$ nncp-toss
-@end example
-
-Each ACK packet will remove kept corresponding outbound packets, because
-Bob explicitly confirmed their receipt.
-
-@end itemize
-
-Similarly you can use it with @command{@ref{nncp-bundle}}, but do not
-forget that by default it does not do checksumming of the packets, so
-you should either use its @option{-check} option, or run
-@command{@ref{nncp-check}} after.
index 4444c3347dcd81a932bfcc77b89d44cf78f2d412..721502e17fe5911b1b5b1c4706e5ebc533deb2de 100644 (file)
@@ -10,7 +10,8 @@ $ nncp-rm [options] [-older X] @{-all|-node NODE@} -seen
 $ nncp-rm [options] [-older X] @{-all|-node NODE@} -nock
 $ nncp-rm [options] [-older X] @{-all|-node NODE@} -area
 $ nncp-rm [options] [-older X] @{-all|-node NODE@} @{-rx|-tx@} [-hdr]
-$ nncp-rm [options] [-older X] @{-all|-node NODE@} -pkt <<EOF
+$ nncp-rm [options] @{-all|-node NODE@} -pkt <<EOF
+$ nncp-rm [options] @{-all|-node NODE@} -ack
 PKT1
 PKT2
 NODEx/PKT3
index f3bbf650a7983c11c4df98137ff81c999c588b9d..3ba96494b4f8cd7f75f7e31413ab45d98144faba 100644 (file)
@@ -7,8 +7,8 @@ $ nncp-toss [options]
     [-node NODE]
     [-dryrun]
     [-cycle INT]
-    [-seen]
-    [-nofile] [-nofreq] [-noexec] [-notrns] [-noarea]
+    [-seen] [-gen-ack]
+    [-nofile] [-nofreq] [-noexec] [-notrns] [-noarea] [-noack]
 @end example
 
 Perform "tossing" operation on all inbound packets. This is the tool
@@ -31,4 +31,9 @@ already seen, processed and tossed. This is helpful to prevent
 duplicates.
 
 @option{-nofile}, @option{-nofreq}, @option{-noexec}, @option{-notrns},
-@option{-noarea} options allow disabling any kind of packet types processing.
+@option{-noarea}, @option{-noack} options allow disabling any kind of
+packet types processing.
+
+@option{-gen-ack} option tells to automatically generate @ref{ACK}
+outbound packets when tossing each packet, saving corresponding list of
+generated packets inside the special directory in the @ref{ACKFile, spool}.
index 27776b00bb0b4c53e8d4f0e3b03e2be6b7c13b4a..5090ce95b0155ebb8956f7b4bd46b0cc8ae4e526 100644 (file)
@@ -5,7 +5,7 @@
 @cindex download
 @section Prepared tarballs
 
-You can obtain releases source code prepared tarballs from the tars below.
+You can obtain releases source code prepared tarballs from the links below.
 Do not forget to check tarball @ref{Integrity, integrity}! Also there
 are @ref{Mirrors, mirrors} of this website.
 
@@ -46,362 +46,439 @@ And additional ones for Yggdrasil support:
 @item @code{gvisor.dev/gvisor} @tab Apache 2.0
 @end multitable
 
-@multitable {XXXXX} {XXXX-XX-XX} {XXXX KiB} {meta4 tar sig}
+@multitable {XXXXX} {XXXX-XX-XX} {XXXX KiB} {meta4 tar pgp ssh}
 @headitem Version @tab Date @tab Size @tab Tarball
 
+@item @ref{Release 8_8_3, 8.8.3} @tab 2023-04-29 @tab 1779 KiB @tab
+@url{download/nncp-8.8.3.tar.xz.meta4, meta4}
+@url{download/nncp-8.8.3.tar.xz, tar}
+@url{download/nncp-8.8.3.tar.xz.asc, pgp}
+@url{download/nncp-8.8.3.tar.xz.sig, ssh}
+
 @item @ref{Release 8_8_2, 8.8.2} @tab 2022-11-18 @tab 1752 KiB @tab
 @url{download/nncp-8.8.2.tar.xz.meta4, meta4}
 @url{download/nncp-8.8.2.tar.xz, tar}
-@url{download/nncp-8.8.2.tar.xz.sig, sig}
+@url{download/nncp-8.8.2.tar.xz.asc, pgp}
+@url{download/nncp-8.8.2.tar.xz.sig, ssh}
 
 @item @ref{Release 8_8_1, 8.8.1} @tab 2022-10-30 @tab 1748 KiB @tab
 @url{download/nncp-8.8.1.tar.xz.meta4, meta4}
 @url{download/nncp-8.8.1.tar.xz, tar}
-@url{download/nncp-8.8.1.tar.xz.sig, sig}
+@url{download/nncp-8.8.1.tar.xz.asc, pgp}
+@url{download/nncp-8.8.1.tar.xz.sig, ssh}
 
 @item @ref{Release 8_8_0, 8.8.0} @tab 2022-09-04 @tab 1739 KiB @tab
 @url{download/nncp-8.8.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.8.0.tar.xz, tar}
-@url{download/nncp-8.8.0.tar.xz.sig, sig}
+@url{download/nncp-8.8.0.tar.xz.asc, pgp}
+@url{download/nncp-8.8.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_7_2, 8.7.2} @tab 2022-03-13 @tab 1673 KiB @tab
 @url{download/nncp-8.7.2.tar.xz.meta4, meta4}
 @url{download/nncp-8.7.2.tar.xz, tar}
-@url{download/nncp-8.7.2.tar.xz.sig, sig}
+@url{download/nncp-8.7.2.tar.xz.asc, pgp}
+@url{download/nncp-8.7.2.tar.xz.sig, ssh}
 
 @item @ref{Release 8_7_1, 8.7.1} @tab 2022-03-09 @tab 1669 KiB @tab
 @url{download/nncp-8.7.1.tar.xz.meta4, meta4}
 @url{download/nncp-8.7.1.tar.xz, tar}
-@url{download/nncp-8.7.1.tar.xz.sig, sig}
+@url{download/nncp-8.7.1.tar.xz.asc, pgp}
+@url{download/nncp-8.7.1.tar.xz.sig, ssh}
 
 @item @ref{Release 8_7_0, 8.7.0} @tab 2022-03-04 @tab 1670 KiB @tab
 @url{download/nncp-8.7.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.7.0.tar.xz, tar}
-@url{download/nncp-8.7.0.tar.xz.sig, sig}
+@url{download/nncp-8.7.0.tar.xz.asc, pgp}
+@url{download/nncp-8.7.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_6_0, 8.6.0} @tab 2022-03-02 @tab 1670 KiB @tab
 @url{download/nncp-8.6.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.6.0.tar.xz, tar}
-@url{download/nncp-8.6.0.tar.xz.sig, sig}
+@url{download/nncp-8.6.0.tar.xz.asc, pgp}
+@url{download/nncp-8.6.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_5_0, 8.5.0} @tab 2022-01-26 @tab 1685 KiB @tab
 @url{download/nncp-8.5.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.5.0.tar.xz, tar}
-@url{download/nncp-8.5.0.tar.xz.sig, sig}
+@url{download/nncp-8.5.0.tar.xz.asc, pgp}
+@url{download/nncp-8.5.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_4_0, 8.4.0} @tab 2022-01-25 @tab 1683 KiB @tab
 @url{download/nncp-8.4.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.4.0.tar.xz, tar}
-@url{download/nncp-8.4.0.tar.xz.sig, sig}
+@url{download/nncp-8.4.0.tar.xz.asc, pgp}
+@url{download/nncp-8.4.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_3_0, 8.3.0} @tab 2022-01-23 @tab 1682 KiB @tab
 @url{download/nncp-8.3.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.3.0.tar.xz, tar}
-@url{download/nncp-8.3.0.tar.xz.sig, sig}
+@url{download/nncp-8.3.0.tar.xz.asc, pgp}
+@url{download/nncp-8.3.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_2_0, 8.2.0} @tab 2022-01-20 @tab 1669 KiB @tab
 @url{download/nncp-8.2.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.2.0.tar.xz, tar}
-@url{download/nncp-8.2.0.tar.xz.sig, sig}
+@url{download/nncp-8.2.0.tar.xz.asc, pgp}
+@url{download/nncp-8.2.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_1_0, 8.1.0} @tab 2022-01-16 @tab 1339 KiB @tab
 @url{download/nncp-8.1.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.1.0.tar.xz, tar}
-@url{download/nncp-8.1.0.tar.xz.sig, sig}
+@url{download/nncp-8.1.0.tar.xz.asc, pgp}
+@url{download/nncp-8.1.0.tar.xz.sig, ssh}
 
 @item @ref{Release 8_0_2, 8.0.2} @tab 2021-11-10 @tab 1204 KiB @tab
 @url{download/nncp-8.0.2.tar.xz.meta4, meta4}
 @url{download/nncp-8.0.2.tar.xz, tar}
-@url{download/nncp-8.0.2.tar.xz.sig, sig}
+@url{download/nncp-8.0.2.tar.xz.asc, pgp}
+@url{download/nncp-8.0.2.tar.xz.sig, ssh}
 
 @item @ref{Release 8_0_1, 8.0.1} @tab 2021-11-09 @tab 1206 KiB @tab
 @url{download/nncp-8.0.1.tar.xz.meta4, meta4}
 @url{download/nncp-8.0.1.tar.xz, tar}
-@url{download/nncp-8.0.1.tar.xz.sig, sig}
+@url{download/nncp-8.0.1.tar.xz.asc, pgp}
+@url{download/nncp-8.0.1.tar.xz.sig, ssh}
 
 @item @ref{Release 8_0_0, 8.0.0} @tab 2021-11-08 @tab 1203 KiB @tab
 @url{download/nncp-8.0.0.tar.xz.meta4, meta4}
 @url{download/nncp-8.0.0.tar.xz, tar}
-@url{download/nncp-8.0.0.tar.xz.sig, sig}
+@url{download/nncp-8.0.0.tar.xz.asc, pgp}
+@url{download/nncp-8.0.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_7_0, 7.7.0} @tab 2021-09-11 @tab 1180 KiB @tab
 @url{download/nncp-7.7.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.7.0.tar.xz, tar}
-@url{download/nncp-7.7.0.tar.xz.sig, sig}
+@url{download/nncp-7.7.0.tar.xz.asc, pgp}
+@url{download/nncp-7.7.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_6_0, 7.6.0} @tab 2021-08-08 @tab 1153 KiB @tab
 @url{download/nncp-7.6.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.6.0.tar.xz, tar}
-@url{download/nncp-7.6.0.tar.xz.sig, sig}
+@url{download/nncp-7.6.0.tar.xz.asc, pgp}
+@url{download/nncp-7.6.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_5_1, 7.5.1} @tab 2021-08-05 @tab 1147 KiB @tab
 @url{download/nncp-7.5.1.tar.xz.meta4, meta4}
 @url{download/nncp-7.5.1.tar.xz, tar}
-@url{download/nncp-7.5.1.tar.xz.sig, sig}
+@url{download/nncp-7.5.1.tar.xz.asc, pgp}
+@url{download/nncp-7.5.1.tar.xz.sig, ssh}
 
 @item @ref{Release 7_5_0, 7.5.0} @tab 2021-07-28 @tab 1151 KiB @tab
 @url{download/nncp-7.5.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.5.0.tar.xz, tar}
-@url{download/nncp-7.5.0.tar.xz.sig, sig}
+@url{download/nncp-7.5.0.tar.xz.asc, pgp}
+@url{download/nncp-7.5.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_4_0, 7.4.0} @tab 2021-07-19 @tab 1153 KiB @tab
 @url{download/nncp-7.4.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.4.0.tar.xz, tar}
-@url{download/nncp-7.4.0.tar.xz.sig, sig}
+@url{download/nncp-7.4.0.tar.xz.asc, pgp}
+@url{download/nncp-7.4.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_3_2, 7.3.2} @tab 2021-07-12 @tab 1141 KiB @tab
 @url{download/nncp-7.3.2.tar.xz.meta4, meta4}
 @url{download/nncp-7.3.2.tar.xz, tar}
-@url{download/nncp-7.3.2.tar.xz.sig, sig}
+@url{download/nncp-7.3.2.tar.xz.asc, pgp}
+@url{download/nncp-7.3.2.tar.xz.sig, ssh}
 
 @item @ref{Release 7_3_1, 7.3.1} @tab 2021-07-11 @tab 1142 KiB @tab
 @url{download/nncp-7.3.1.tar.xz.meta4, meta4}
 @url{download/nncp-7.3.1.tar.xz, tar}
-@url{download/nncp-7.3.1.tar.xz.sig, sig}
+@url{download/nncp-7.3.1.tar.xz.asc, pgp}
+@url{download/nncp-7.3.1.tar.xz.sig, ssh}
 
 @item @ref{Release 7_3_0, 7.3.0} @tab 2021-07-10 @tab 1141 KiB @tab
 @url{download/nncp-7.3.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.3.0.tar.xz, tar}
-@url{download/nncp-7.3.0.tar.xz.sig, sig}
+@url{download/nncp-7.3.0.tar.xz.asc, pgp}
+@url{download/nncp-7.3.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_2_1, 7.2.1} @tab 2021-07-09 @tab 1139 KiB @tab
 @url{download/nncp-7.2.1.tar.xz.meta4, meta4}
 @url{download/nncp-7.2.1.tar.xz, tar}
-@url{download/nncp-7.2.1.tar.xz.sig, sig}
+@url{download/nncp-7.2.1.tar.xz.asc, pgp}
+@url{download/nncp-7.2.1.tar.xz.sig, ssh}
 
 @item @ref{Release 7_2_0, 7.2.0} @tab 2021-07-08 @tab 1136 KiB @tab
 @url{download/nncp-7.2.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.2.0.tar.xz, tar}
-@url{download/nncp-7.2.0.tar.xz.sig, sig}
+@url{download/nncp-7.2.0.tar.xz.asc, pgp}
+@url{download/nncp-7.2.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_1_1, 7.1.1} @tab 2021-07-06 @tab 1132 KiB @tab
 @url{download/nncp-7.1.1.tar.xz.meta4, meta4}
 @url{download/nncp-7.1.1.tar.xz, tar}
-@url{download/nncp-7.1.1.tar.xz.sig, sig}
+@url{download/nncp-7.1.1.tar.xz.asc, pgp}
+@url{download/nncp-7.1.1.tar.xz.sig, ssh}
 
 @item @ref{Release 7_1_0, 7.1.0} @tab 2021-07-04 @tab 1142 KiB @tab
 @url{download/nncp-7.1.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.1.0.tar.xz, tar}
-@url{download/nncp-7.1.0.tar.xz.sig, sig}
+@url{download/nncp-7.1.0.tar.xz.asc, pgp}
+@url{download/nncp-7.1.0.tar.xz.sig, ssh}
 
 @item @ref{Release 7_0_0, 7.0.0} @tab 2021-06-30 @tab 1123 KiB @tab
 @url{download/nncp-7.0.0.tar.xz.meta4, meta4}
 @url{download/nncp-7.0.0.tar.xz, tar}
-@url{download/nncp-7.0.0.tar.xz.sig, sig}
+@url{download/nncp-7.0.0.tar.xz.asc, pgp}
+@url{download/nncp-7.0.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_6_0, 6.6.0} @tab 2021-06-26 @tab 1041 KiB @tab
 @url{download/nncp-6.6.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.6.0.tar.xz, tar}
-@url{download/nncp-6.6.0.tar.xz.sig, sig}
+@url{download/nncp-6.6.0.tar.xz.asc, pgp}
+@url{download/nncp-6.6.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_5_0, 6.5.0} @tab 2021-05-30 @tab 1041 KiB @tab
 @url{download/nncp-6.5.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.5.0.tar.xz, tar}
-@url{download/nncp-6.5.0.tar.xz.sig, sig}
+@url{download/nncp-6.5.0.tar.xz.asc, pgp}
+@url{download/nncp-6.5.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_4_0, 6.4.0} @tab 2021-04-22 @tab 1042 KiB @tab
 @url{download/nncp-6.4.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.4.0.tar.xz, tar}
-@url{download/nncp-6.4.0.tar.xz.sig, sig}
+@url{download/nncp-6.4.0.tar.xz.asc, pgp}
+@url{download/nncp-6.4.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_3_0, 6.3.0} @tab 2021-04-14 @tab 1042 KiB @tab
 @url{download/nncp-6.3.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.3.0.tar.xz, tar}
-@url{download/nncp-6.3.0.tar.xz.sig, sig}
+@url{download/nncp-6.3.0.tar.xz.asc, pgp}
+@url{download/nncp-6.3.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_2_1, 6.2.1} @tab 2021-03-26 @tab 1038 KiB @tab
 @url{download/nncp-6.2.1.tar.xz.meta4, meta4}
 @url{download/nncp-6.2.1.tar.xz, tar}
-@url{download/nncp-6.2.1.tar.xz.sig, sig}
+@url{download/nncp-6.2.1.tar.xz.asc, pgp}
+@url{download/nncp-6.2.1.tar.xz.sig, ssh}
 
 @item @ref{Release 6_2_0, 6.2.0} @tab 2021-03-07 @tab 1038 KiB @tab
 @url{download/nncp-6.2.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.2.0.tar.xz, tar}
-@url{download/nncp-6.2.0.tar.xz.sig, sig}
+@url{download/nncp-6.2.0.tar.xz.asc, pgp}
+@url{download/nncp-6.2.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_1_0, 6.1.0} @tab 2021-02-24 @tab 1040 KiB @tab
 @url{download/nncp-6.1.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.1.0.tar.xz, tar}
-@url{download/nncp-6.1.0.tar.xz.sig, sig}
+@url{download/nncp-6.1.0.tar.xz.asc, pgp}
+@url{download/nncp-6.1.0.tar.xz.sig, ssh}
 
 @item @ref{Release 6_0_0, 6.0.0} @tab 2021-01-23 @tab 1028 KiB @tab
 @url{download/nncp-6.0.0.tar.xz.meta4, meta4}
 @url{download/nncp-6.0.0.tar.xz, tar}
-@url{download/nncp-6.0.0.tar.xz.sig, sig}
+@url{download/nncp-6.0.0.tar.xz.asc, pgp}
+@url{download/nncp-6.0.0.tar.xz.sig, ssh}
 
 @item @ref{Release 5_6_0, 5.6.0} @tab 2021-01-17 @tab 1024 KiB @tab
 @url{download/nncp-5.6.0.tar.xz.meta4, meta4}
 @url{download/nncp-5.6.0.tar.xz, tar}
-@url{download/nncp-5.6.0.tar.xz.sig, sig}
+@url{download/nncp-5.6.0.tar.xz.asc, pgp}
+@url{download/nncp-5.6.0.tar.xz.sig, ssh}
 
 @item @ref{Release 5_5_1, 5.5.1} @tab 2021-01-11 @tab 1165 KiB @tab
 @url{download/nncp-5.5.1.tar.xz.meta4, meta4}
 @url{download/nncp-5.5.1.tar.xz, tar}
-@url{download/nncp-5.5.1.tar.xz.sig, sig}
+@url{download/nncp-5.5.1.tar.xz.asc, pgp}
+@url{download/nncp-5.5.1.tar.xz.sig, ssh}
 
 @item @ref{Release 5_5_0, 5.5.0} @tab 2021-01-07 @tab 1161 KiB @tab
 @url{download/nncp-5.5.0.tar.xz.meta4, meta4}
 @url{download/nncp-5.5.0.tar.xz, tar}
-@url{download/nncp-5.5.0.tar.xz.sig, sig}
+@url{download/nncp-5.5.0.tar.xz.asc, pgp}
+@url{download/nncp-5.5.0.tar.xz.sig, ssh}
 
 @item @ref{Release 5_4_1, 5.4.1} @tab 2020-09-28 @tab 1143 KiB @tab
 @url{download/nncp-5.4.1.tar.xz.meta4, meta4}
 @url{download/nncp-5.4.1.tar.xz, tar}
-@url{download/nncp-5.4.1.tar.xz.sig, sig}
+@url{download/nncp-5.4.1.tar.xz.asc, pgp}
+@url{download/nncp-5.4.1.tar.xz.sig, ssh}
 
 @item @ref{Release 5_3_3, 5.3.3} @tab 2020-01-23 @tab 1116 KiB @tab
 @url{download/nncp-5.3.3.tar.xz.meta4, meta4}
 @url{download/nncp-5.3.3.tar.xz, tar}
-@url{download/nncp-5.3.3.tar.xz.sig, sig}
+@url{download/nncp-5.3.3.tar.xz.asc, pgp}
+@url{download/nncp-5.3.3.tar.xz.sig, ssh}
 
 @item @ref{Release 5_3_2, 5.3.2} @tab 2019-12-28 @tab 1118 KiB @tab
 @url{download/nncp-5.3.2.tar.xz.meta4, meta4}
 @url{download/nncp-5.3.2.tar.xz, tar}
-@url{download/nncp-5.3.2.tar.xz.sig, sig}
+@url{download/nncp-5.3.2.tar.xz.asc, pgp}
+@url{download/nncp-5.3.2.tar.xz.sig, ssh}
 
 @item @ref{Release 5_3_1, 5.3.1} @tab 2019-12-25 @tab 1117 KiB @tab
 @url{download/nncp-5.3.1.tar.xz.meta4, meta4}
 @url{download/nncp-5.3.1.tar.xz, tar}
-@url{download/nncp-5.3.1.tar.xz.sig, sig}
+@url{download/nncp-5.3.1.tar.xz.asc, pgp}
+@url{download/nncp-5.3.1.tar.xz.sig, ssh}
 
 @item @ref{Release 5_3_0, 5.3.0} @tab 2019-12-22 @tab 1112 KiB @tab
 @url{download/nncp-5.3.0.tar.xz.meta4, meta4}
 @url{download/nncp-5.3.0.tar.xz, tar}
-@url{download/nncp-5.3.0.tar.xz.sig, sig}
+@url{download/nncp-5.3.0.tar.xz.asc, pgp}
+@url{download/nncp-5.3.0.tar.xz.sig, ssh}
 
 @item @ref{Release 5_2_1, 5.2.1} @tab 2019-12-15 @tab 1109 KiB @tab
 @url{download/nncp-5.2.1.tar.xz.meta4, meta4}
 @url{download/nncp-5.2.1.tar.xz, tar}
-@url{download/nncp-5.2.1.tar.xz.sig, sig}
+@url{download/nncp-5.2.1.tar.xz.asc, pgp}
+@url{download/nncp-5.2.1.tar.xz.sig, ssh}
 
 @item @ref{Release 5_2_0, 5.2.0} @tab 2019-12-14 @tab 1109 KiB @tab
 @url{download/nncp-5.2.0.tar.xz.meta4, meta4}
 @url{download/nncp-5.2.0.tar.xz, tar}
-@url{download/nncp-5.2.0.tar.xz.sig, sig}
+@url{download/nncp-5.2.0.tar.xz.asc, pgp}
+@url{download/nncp-5.2.0.tar.xz.sig, ssh}
 
 @item @ref{Release 5_1_2, 5.1.2} @tab 2019-12-13 @tab 1106 KiB @tab
 @url{download/nncp-5.1.2.tar.xz.meta4, meta4}
 @url{download/nncp-5.1.2.tar.xz, tar}
-@url{download/nncp-5.1.2.tar.xz.sig, sig}
+@url{download/nncp-5.1.2.tar.xz.asc, pgp}
+@url{download/nncp-5.1.2.tar.xz.sig, ssh}
 
 @item @ref{Release 5_1_1, 5.1.1} @tab 2019-12-01 @tab 1103 KiB @tab
 @url{download/nncp-5.1.1.tar.xz.meta4, meta4}
 @url{download/nncp-5.1.1.tar.xz, tar}
-@url{download/nncp-5.1.1.tar.xz.sig, sig}
+@url{download/nncp-5.1.1.tar.xz.asc, pgp}
+@url{download/nncp-5.1.1.tar.xz.sig, ssh}
 
 @item @ref{Release 5_1_0, 5.1.0} @tab 2019-11-24 @tab 1103 KiB @tab
 @url{download/nncp-5.1.0.tar.xz.meta4, meta4}
 @url{download/nncp-5.1.0.tar.xz, tar}
-@url{download/nncp-5.1.0.tar.xz.sig, sig}
+@url{download/nncp-5.1.0.tar.xz.asc, pgp}
+@url{download/nncp-5.1.0.tar.xz.sig, ssh}
 
 @item @ref{Release 5_0_0, 5.0.0} @tab 2019-11-15 @tab 1099 KiB @tab
 @url{download/nncp-5.0.0.tar.xz.meta4, meta4}
 @url{download/nncp-5.0.0.tar.xz, tar}
-@url{download/nncp-5.0.0.tar.xz.sig, sig}
+@url{download/nncp-5.0.0.tar.xz.asc, pgp}
+@url{download/nncp-5.0.0.tar.xz.sig, ssh}
 
 @item @ref{Release 4_1, 4.1} @tab 2019-05-01 @tab 1227 KiB @tab
 @url{download/nncp-4.1.tar.xz.meta4, meta4}
 @url{download/nncp-4.1.tar.xz, tar}
-@url{download/nncp-4.1.tar.xz.sig, sig}
+@url{download/nncp-4.1.tar.xz.asc, pgp}
+@url{download/nncp-4.1.tar.xz.sig, ssh}
 
 @item @ref{Release 4_0, 4.0} @tab 2019-04-28 @tab 1227 KiB @tab
 @url{download/nncp-4.0.tar.xz.meta4, meta4}
 @url{download/nncp-4.0.tar.xz, tar}
-@url{download/nncp-4.0.tar.xz.sig, sig}
+@url{download/nncp-4.0.tar.xz.asc, pgp}
+@url{download/nncp-4.0.tar.xz.sig, ssh}
 
 @item @ref{Release 3_4, 3.4} @tab 2018-06-10 @tab 1154 KiB @tab
 @url{download/nncp-3.4.tar.xz.meta4, meta4}
 @url{download/nncp-3.4.tar.xz, tar}
-@url{download/nncp-3.4.tar.xz.sig, sig}
+@url{download/nncp-3.4.tar.xz.asc, pgp}
+@url{download/nncp-3.4.tar.xz.sig, ssh}
 
 @item @ref{Release 3_3, 3.3} @tab 2018-06-02 @tab 1152 KiB @tab
 @url{download/nncp-3.3.tar.xz.meta4, meta4}
 @url{download/nncp-3.3.tar.xz, tar}
-@url{download/nncp-3.3.tar.xz.sig, sig}
+@url{download/nncp-3.3.tar.xz.asc, pgp}
+@url{download/nncp-3.3.tar.xz.sig, ssh}
 
 @item @ref{Release 3_2, 3.2} @tab 2018-05-27 @tab 1147 KiB @tab
 @url{download/nncp-3.2.tar.xz.meta4, meta4}
 @url{download/nncp-3.2.tar.xz, tar}
-@url{download/nncp-3.2.tar.xz.sig, sig}
+@url{download/nncp-3.2.tar.xz.asc, pgp}
+@url{download/nncp-3.2.tar.xz.sig, ssh}
 
 @item @ref{Release 3_1, 3.1} @tab 2018-02-18 @tab 1145 KiB @tab
 @url{download/nncp-3.1.tar.xz.meta4, meta4}
 @url{download/nncp-3.1.tar.xz, tar}
-@url{download/nncp-3.1.tar.xz.sig, sig}
+@url{download/nncp-3.1.tar.xz.asc, pgp}
+@url{download/nncp-3.1.tar.xz.sig, ssh}
 
 @item @ref{Release 3_0, 3.0} @tab 2017-12-30 @tab 993 KiB @tab
 @url{download/nncp-3.0.tar.xz.meta4, meta4}
 @url{download/nncp-3.0.tar.xz, tar}
-@url{download/nncp-3.0.tar.xz.sig, sig}
+@url{download/nncp-3.0.tar.xz.asc, pgp}
+@url{download/nncp-3.0.tar.xz.sig, ssh}
 
 @item @ref{Release 2_0, 2.0} @tab 2017-12-02 @tab 986 KiB @tab
 @url{download/nncp-2.0.tar.xz.meta4, meta4}
 @url{download/nncp-2.0.tar.xz, tar}
-@url{download/nncp-2.0.tar.xz.sig, sig}
+@url{download/nncp-2.0.tar.xz.asc, pgp}
+@url{download/nncp-2.0.tar.xz.sig, ssh}
 
 @item @ref{Release 1_0, 1.0} @tab 2017-12-02 @tab 987 KiB @tab
 @url{download/nncp-1.0.tar.xz.meta4, meta4}
 @url{download/nncp-1.0.tar.xz, tar}
-@url{download/nncp-1.0.tar.xz.sig, sig}
+@url{download/nncp-1.0.tar.xz.asc, pgp}
+@url{download/nncp-1.0.tar.xz.sig, ssh}
 
 @item @ref{Release 0_12, 0.12} @tab 2017-10-08 @tab 978 KiB @tab
 @url{download/nncp-0.12.tar.xz.meta4, meta4}
 @url{download/nncp-0.12.tar.xz, tar}
-@url{download/nncp-0.12.tar.xz.sig, sig}
+@url{download/nncp-0.12.tar.xz.asc, pgp}
+@url{download/nncp-0.12.tar.xz.sig, ssh}
 
 @item @ref{Release 0_11, 0.11} @tab 2017-08-21 @tab 1031 KiB @tab
 @url{download/nncp-0.11.tar.xz.meta4, meta4}
 @url{download/nncp-0.11.tar.xz, tar}
-@url{download/nncp-0.11.tar.xz.sig, sig}
+@url{download/nncp-0.11.tar.xz.asc, pgp}
+@url{download/nncp-0.11.tar.xz.sig, ssh}
 
 @item @ref{Release 0_10, 0.10} @tab 2017-07-04 @tab 949 KiB @tab
 @url{download/nncp-0.10.tar.xz.meta4, meta4}
 @url{download/nncp-0.10.tar.xz, tar}
-@url{download/nncp-0.10.tar.xz.sig, sig}
+@url{download/nncp-0.10.tar.xz.asc, pgp}
+@url{download/nncp-0.10.tar.xz.sig, ssh}
 
 @item @ref{Release 0_9, 0.9} @tab 2017-05-17 @tab 942 KiB @tab
 @url{download/nncp-0.9.tar.xz.meta4, meta4}
 @url{download/nncp-0.9.tar.xz, tar}
-@url{download/nncp-0.9.tar.xz.sig, sig}
+@url{download/nncp-0.9.tar.xz.asc, pgp}
+@url{download/nncp-0.9.tar.xz.sig, ssh}
 
 @item @ref{Release 0_8, 0.8} @tab 2017-04-30 @tab 932 KiB @tab
 @url{download/nncp-0.8.tar.xz.meta4, meta4}
 @url{download/nncp-0.8.tar.xz, tar}
-@url{download/nncp-0.8.tar.xz.sig, sig}
+@url{download/nncp-0.8.tar.xz.asc, pgp}
+@url{download/nncp-0.8.tar.xz.sig, ssh}
 
 @item @ref{Release 0_7, 0.7} @tab 2017-04-02 @tab 783 KiB @tab
 @url{download/nncp-0.7.tar.xz.meta4, meta4}
 @url{download/nncp-0.7.tar.xz, tar}
-@url{download/nncp-0.7.tar.xz.sig, sig}
+@url{download/nncp-0.7.tar.xz.asc, pgp}
+@url{download/nncp-0.7.tar.xz.sig, ssh}
 
 @item @ref{Release 0_6, 0.6} @tab 2017-02-05 @tab 746 KiB @tab
 @url{download/nncp-0.6.tar.xz.meta4, meta4}
 @url{download/nncp-0.6.tar.xz, tar}
-@url{download/nncp-0.6.tar.xz.sig, sig}
+@url{download/nncp-0.6.tar.xz.asc, pgp}
+@url{download/nncp-0.6.tar.xz.sig, ssh}
 
 @item @ref{Release 0_5, 0.5} @tab 2017-01-19 @tab 743 KiB @tab
 @url{download/nncp-0.5.tar.xz.meta4, meta4}
 @url{download/nncp-0.5.tar.xz, tar}
-@url{download/nncp-0.5.tar.xz.sig, sig}
+@url{download/nncp-0.5.tar.xz.asc, pgp}
+@url{download/nncp-0.5.tar.xz.sig, ssh}
 
 @item @ref{Release 0_4, 0.4} @tab 2017-01-17 @tab 741 KiB @tab
 @url{download/nncp-0.4.tar.xz.meta4, meta4}
 @url{download/nncp-0.4.tar.xz, tar}
-@url{download/nncp-0.4.tar.xz.sig, sig}
+@url{download/nncp-0.4.tar.xz.asc, pgp}
+@url{download/nncp-0.4.tar.xz.sig, ssh}
 
 @item @ref{Release 0_3, 0.3} @tab 2017-01-17 @tab 741 KiB @tab
 @url{download/nncp-0.3.tar.xz.meta4, meta4}
 @url{download/nncp-0.3.tar.xz, tar}
-@url{download/nncp-0.3.tar.xz.sig, sig}
+@url{download/nncp-0.3.tar.xz.asc, pgp}
+@url{download/nncp-0.3.tar.xz.sig, ssh}
 
 @item @ref{Release 0_2, 0.2} @tab 2017-01-17 @tab 740 KiB @tab
 @url{download/nncp-0.2.tar.xz.meta4, meta4}
 @url{download/nncp-0.2.tar.xz, tar}
-@url{download/nncp-0.2.tar.xz.sig, sig}
+@url{download/nncp-0.2.tar.xz.asc, pgp}
+@url{download/nncp-0.2.tar.xz.sig, ssh}
 
 @item 0.1 @tab 2017-01-10 @tab 720 KiB @tab
 @url{download/nncp-0.1.tar.xz.meta4, meta4}
 @url{download/nncp-0.1.tar.xz, tar}
-@url{download/nncp-0.1.tar.xz.sig, sig}
+@url{download/nncp-0.1.tar.xz.asc, pgp}
+@url{download/nncp-0.1.tar.xz.sig, ssh}
 
 @end multitable
index b08e06afccb6ad0abd8a9aeb1518070ed3b5224f..a5e327dfafff69f95e89d85a6577337efd259958 100644 (file)
@@ -28,11 +28,11 @@ There are also articles about its usage outside this website:
 
 @itemize
 @item @url{https://www.complete.org/nncp/, Various related articles} by John Goerzen
-@item @url{https://habr.com/en/post/330712/, NNCP: лечение online- и цензуро- зависимости store-and-forward методом} (on russian)
+@item @url{https://habr.com/ru/articles/330712/, NNCP: лечение online- и цензуро- зависимости store-and-forward методом} (on russian)
 @item @url{https://changelog.complete.org/archives/tag/nncp, Series of descriptive articles} by John Goerzen
 @item @url{https://www.youtube.com/watch?v=0i3r63pnyHM, Presentation of NNCP on Internet Freedom Conference 2019} (on russian)
     (@url{http://www.stargrave.org/20191207-Internet_Freedom_Conference-NNCP.webm.torrent, torrent})
-@item @url{https://habr.com/ru/post/692254/, Неужто так сложно передать зашифрованный файл? Эволюция формата пакетов NNCP} (on russian)
+@item @url{https://habr.com/ru/articles/692254/, Неужто так сложно передать зашифрованный файл? Эволюция формата пакетов NNCP} (on russian)
 @end itemize
 
 @center Interested? @ref{Tarballs, @strong{Download it}}!
@@ -83,6 +83,7 @@ There are also articles about its usage outside this website:
 @include niceness.texi
 @include chunked.texi
 @include bundles.texi
+@include ack.texi
 @include spool.texi
 @include log.texi
 @include pkt/index.texi
index f3136c8ddc664fd1acee2a517f9d79475e498e3e..a7ff789a7aec4baa960b3e82360ea66d01938e49 100644 (file)
@@ -31,12 +31,12 @@ with the jobs you want to download:
 $ cat jobs
 http://www.nncpgo.org/download/nncp-0.11.tar.xz
     out=nncp.txz
-http://www.nncpgo.org/download/nncp-0.11.tar.xz.sig
-    out=nncp.txz.sig
+http://www.nncpgo.org/download/nncp-0.11.tar.xz.asc
+    out=nncp.txz.asc
 $ aria2c \
     --on-download-complete aria2-downloaded.sh \
     --input-file jobs
 @end example
 
-and all that downloaded (@file{nncp.txz}, @file{nncp.txz.sig}) files
+and all that downloaded (@file{nncp.txz}, @file{nncp.txz.asc}) files
 will be sent to @file{remote.node} when finished.
index df88be2539459f4ef4ce65cbbfab34f84f08dfcc..5bda086de8b58c8b65459295800498613d6ea0a5 100644 (file)
@@ -38,6 +38,6 @@ $ echo http://www.nncpgo.org/Postfix.html |
     nncp-exec remote.node wgeter postfix-html-page
 $ echo \
     http://www.nncpgo.org/download/nncp-0.11.tar.xz
-    http://www.nncpgo.org/download/nncp-0.11.tar.xz.sig |
+    http://www.nncpgo.org/download/nncp-0.11.tar.xz.asc |
     nncp-exec remote.node aria2c
 @end example
index fcc114a9da97e21850ac339870599a0bee8aa7a6..f09b5e8ad4c516efb7635b1b5ce6dc8f7b9c6e2f 100644 (file)
@@ -5,16 +5,20 @@
 @cindex gpg
 @cindex GnuPG
 @cindex WKD
+@cindex OpenSSH
 @section Tarballs integrity check
 
-You @strong{have to} check downloaded archives integrity and verify
-their signature to be sure that you have got trusted, untampered
-software. For integrity and authentication of downloaded binaries
-@url{https://www.gnupg.org/, GNU Privacy Guard} is used. You must
-download signature (@file{.sig}) provided with the tarball.
+You @strong{have to} verify downloaded tarballs authenticity to be sure
+that you retrieved trusted and untampered software. There are two options:
 
-For the very first time you need to import signing public key. It is
-provided below, but it is better to check alternative resources with it.
+@table @asis
+
+@item @url{https://www.openpgp.org/, OpenPGP} @file{.asc} signature
+    Use @url{https://www.gnupg.org/, GNU Privacy Guard} free software
+    implementation.
+    For the very first time it is necessary to get signing public key and
+    import it. It is provided @url{.well-known/openpgpkey/nncpgo.org/hu/i4cdqgcarfjdjnba6y4jnf498asg8c6p.asc, here}, but you should
+    check alternate resources.
 
 @verbatim
 pub   rsa2048/0x2B25868E75A1A953 2017-01-10
@@ -22,21 +26,19 @@ pub   rsa2048/0x2B25868E75A1A953 2017-01-10
 uid   NNCP releases <releases at nncpgo dot org>
 @end verbatim
 
-@itemize
-
-@item
 @example
 $ gpg --auto-key-locate dane --locate-keys releases at nncpgo dot org
 $ gpg --auto-key-locate  wkd --locate-keys releases at nncpgo dot org
 @end example
 
-@item
-@verbatiminclude .well-known/openpgpkey/nncpgo.org/hu/i4cdqgcarfjdjnba6y4jnf498asg8c6p.asc
-
-@end itemize
-
-Then you could verify tarballs signature:
+@item @url{https://www.openssh.com/, OpenSSH} @file{.sig} signature
+    @url{PUBKEY-SSH.pub, Public key} and its OpenPGP
+    @url{PUBKEY-SSH.pub.asc, signature} made with the key above.
+    Its fingerprint: @code{SHA256:FRiWawVNBkyS3jFn8uZ/JlT+PWKSFbhWe5XSixp1+SY}.
 
 @example
-$ gpg --verify nncp-@value{VERSION}.tar.xz.sig nncp-@value{VERSION}.tar.xz
+$ ssh-keygen -Y verify -f PUBKEY-SSH.pub -I releases@@nncpgo.org -n file \
+    -s nncp-@value{VERSION}.tar.zst.sig < nncp-@value{VERSION}.tar.zst
 @end example
+
+@end table
index e58f0e9888f30fda7ffc1b9239dce4a080c49931..2c459e997365f68ac1ab69aea1e8c6a7da41097e 100644 (file)
@@ -1,6 +1,5 @@
 redo-ifchange \
     ../config \
-    ../VERSION \
     *.texi \
     cfg/*.texi \
     cmd/*.texi \
@@ -12,7 +11,7 @@ redo-ifchange \
     usecases/*.texi
 . ../config
 ${MAKEINFO:-makeinfo} \
-    -D "VERSION `cat ../VERSION`" \
+    -D "VERSION `../version`" \
     $MAKEINFO_OPTS \
     --set-customization-variable SECTION_NAME_IN_TITLE=1 \
     --set-customization-variable TREE_TRANSFORMATIONS=complete_tree_nodes_menus \
index f5f514fd95a8adf4f29681ae13eb7bcdc5aef533..4773f9cc4fac52a4dd533e063d4096cc24c269c4 100644 (file)
@@ -3,9 +3,7 @@
 @unnumbered Mirrors
 
 Main NNCP website is hosted on two geographically distant servers
-located in Moscow region, Russian Federation. Only one of those servers
-supports TLS and another just proxies the traffic to it. So TLS-capable
-version has less availability.
+located in Moscow and Saint-Petersburg regions, Russian Federation.
 
 @cindex DANE
 @cindex DNSCurve
@@ -18,8 +16,7 @@ in turn can be authenticated with
 @url{http://www.stargrave.org/Trust-anchor.html, trust anchors}.
 Both @code{ca.cypherpunks.ru} and DNSCurve trust anchors are
 signed with @code{12AD 3268 9C66 0D42 6967  FD75 CB82 0563 2107 AD8A}
-@url{https://en.wikipedia.org/wiki/OpenPGP, OpenPGP}
-@url{http://www.stargrave.org/Contacts.html, public key}.
+@url{https://en.wikipedia.org/wiki/OpenPGP, OpenPGP} public key.
 
 Also there is @url{https://yggdrasil-network.github.io/, Yggdrasil}
 accessible address: @url{http://y.www.nncpgo.org/}.
index bc331a886664d09e8a176a237cbed16d313c1309..0c5dd4ab32829888d2f2827bda9060d908dea568 100644 (file)
@@ -1,6 +1,34 @@
 @node Новости
 @section Новости
 
+@node Релиз 8.9.0
+@subsection Релиз 8.9.0
+@itemize
+
+@item
+@command{nncp-toss} команда имеет @option{-gen-ack} опцию.
+@command{nncp-daemon}, @command{nncp-caller}, @command{nncp-call}
+команды имеют @option{-autotoss-gen-ack} опцию. Они автоматически
+генерируют ACK пакеты и сохраняют соответствующие @file{spoo/tx/ack/}
+ссылки на них, чтобы их можно было удалить после передачи.
+
+@item
+@code{autotoss-gen-ack} появился в конфигурации call.
+@code{ack} секция появилась в конфигурации ноды.
+
+@item
+@command{nncp-rm} команда имеет @option{-ack} опцию для удаления пакетов
+на которые ссылаются @file{spool/tx/ack/} файлы созданные во время toss.
+
+@item
+@command{redo} система сборки более не требуется при установке, так как
+по сути нет зависимостей, только компиляция Go кода.
+
+@item
+Обновлены некоторые зависимости.
+
+@end itemize
+
 @node Релиз 8.8.3
 @subsection Релиз 8.8.3
 @itemize
index fa973407bbac647a13281a5ece77fd9c6a9983aa..664f176685a737721e1bc6e1a1fc1ca125b15564 100644 (file)
@@ -4,6 +4,34 @@
 
 See also this page @ref{Новости, on russian}.
 
+@node Release 8_9_0
+@section Release 8.9.0
+@itemize
+
+@item
+@command{nncp-toss} command has @option{-gen-ack} option.
+@command{nncp-daemon}, @command{nncp-caller}, @command{nncp-call}
+commands have @option{-autotoss-gen-ack} option. They automatically
+generate ACK packets and store corresponding @file{spool/tx/ack/}
+references to them, to be able to remove them after the transfer.
+
+@item
+@code{autotoss-gen-ack} appeared in call configuration.
+@code{ack} section appeared in neighbour configuration.
+
+@item
+@command{nncp-rm} command has @option{-ack} option to remove packets
+referenced by stored @file{spool/tx/ack/} files generated during tossing.
+
+@item
+Get rid of @command{redo} build system during installation, as there are
+virtually none dependencies, just only compilation of the Go code.
+
+@item
+Updated some dependencies.
+
+@end itemize
+
 @node Release 8_8_3
 @section Release 8.8.3
 @itemize
index 6e18fee453be77e84755c6cfc0cad022e173b523..48f1187094ad467b0a8fb0facb0c98a175ecf338 100644 (file)
@@ -1,6 +1,7 @@
 redo-ifchange makeinfo.rc
 rm -fr nncp.html
-MAKEINFO_OPTS="$MAKEINFO_OPTS --html --css-include style.css"
+MAKEINFO_OPTS="$MAKEINFO_OPTS --html"
+MAKEINFO_OPTS="$MAKEINFO_OPTS --set-customization-variable NO_CSS=1"
 MAKEINFO_OPTS="$MAKEINFO_OPTS --set-customization-variable FORMAT_MENU=menu"
 MAKEINFO_OPTS="$MAKEINFO_OPTS --set-customization-variable DATE_IN_HEADER=1"
 MAKEINFO_OPTS="$MAKEINFO_OPTS" . makeinfo.rc
index c7ddb31a0e5910f31dddff247aa36bec3732d4e3..3a839760beaa1d9764a89df81c0256bb3c2b34bd 100644 (file)
@@ -86,4 +86,14 @@ that will recreate them. In many cases many @file{hdr/} files will be
 allocated more or less linearly on the disk, decreasing listing time
 even more.
 
+@cindex ack files
+@anchor{ACKFile}
+@item tx/ack/LYT64MWSNDK34CVYOO7TA6ZCJ3NWI2OUDBBMX2A4QWF34FIRY4DQ
+If tossing was performed with @option{-gen-ack} option, then for each
+generated @ref{ACK} packet there will be corresponding empty @file{ack/}
+file. ACK outbound packets needs to be deleted after the transmission,
+but since they are stored encrypted in the spool, there needs to be some
+kind of knowledge what packets are ACK ones. Both ACK and corresponding
+@file{ack/} files are removed by @command{@ref{nncp-rm} -ack} command.
+
 @end table
diff --git a/doc/style.css b/doc/style.css
deleted file mode 100644 (file)
index 44fa2e0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-body { background-color: #AEBECE }
-h1, h2, h3, h4 { text-align: center }
-h1, h2, h3, h4, strong { color: #900090 }
-pre { background-color: #CCCCCC }
-table, th, td { border: 1px solid black ; border-collapse: collapse }
diff --git a/doc/www.do b/doc/www.do
new file mode 100644 (file)
index 0000000..672456c
--- /dev/null
@@ -0,0 +1,16 @@
+html=nncp.html
+redo $html
+cp -a .well-known $html/
+cp -a download $html/
+cp ../PUBKEY-* $html/
+(
+    cd $html/download
+    export ATOM_ID="e33cb83e-bf33-46f8-b9b1-6115f46e1218"
+    export NAME=NNCP
+    export BASE_URL=http://www.nncpgo.org/download
+    export AUTHOR_EMAIL=releases@nncpgo.org
+    ~/work/releases-feed/releases.atom.zsh
+)
+perl -i -npe 'print "<link rel=\"alternate\" title=\"Releases\" href=\"download/releases.atom\" type=\"application/atom+xml\">\n" if /^<\/head>/' $html/Tarballs.html
+find nncp.html -type d -exec chmod 755 {} +
+find nncp.html -type f -exec chmod 644 {} +
diff --git a/install b/install
new file mode 100755 (executable)
index 0000000..0b5c8c3
--- /dev/null
+++ b/install
@@ -0,0 +1,18 @@
+#!/bin/sh -e
+
+cd "$(realpath -- $(dirname "$0"))"
+. ./config
+
+mkdir -p "$BINDIR"
+for cmd in `cat bin/cmd.list` ; do
+    cp -f bin/$cmd "$BINDIR"
+    chmod 755 "$BINDIR"/$cmd
+done
+
+mkdir -p "$INFODIR"
+cp -f doc/nncp.info "$INFODIR"
+chmod 644 "$INFODIR"/nncp.info
+
+mkdir -p "$DOCDIR"
+cp -f -L AUTHORS NEWS NEWS.RU README README.RU THANKS $DOCDIR
+chmod 644 "$DOCDIR"/*
diff --git a/install-strip b/install-strip
new file mode 100755 (executable)
index 0000000..9b7875a
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh -e
+
+root="$(realpath -- $(dirname "$0"))"
+cd "$root"
+./install
+. ./config
+for cmd in `cat bin/cmd.list` ; do
+    strip "$BINDIR"/$cmd
+done
diff --git a/install-strip.do b/install-strip.do
deleted file mode 100644 (file)
index 63b442e..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-redo-ifchange config install
-. ./config
-for cmd in `cat bin/cmd.list` ; do
-    strip $BINDIR/$cmd
-done
diff --git a/install.do b/install.do
deleted file mode 100644 (file)
index 95c71cb..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-redo-ifchange config bin/all doc/nncp.info
-. ./config
-
-mkdir -p $BINDIR
-for cmd in `cat bin/cmd.list` ; do
-    cp -f bin/$cmd $BINDIR
-    chmod 755 $BINDIR/$cmd
-done
-
-mkdir -p $INFODIR
-cp -f doc/nncp.info $INFODIR
-chmod 644 $INFODIR/nncp.info
-
-mkdir -p $DOCDIR
-cp -f -L AUTHORS NEWS NEWS.RU README README.RU THANKS $DOCDIR
-chmod 644 $DOCDIR/*
index 0df054c5bc648f07e766e3ada156a1deba4d4709..24b897f19041bc29948ac5cdc4b779c76ec37856 100755 (executable)
--- a/makedist
+++ b/makedist
@@ -1,5 +1,6 @@
 #!/bin/sh -ex
 
+PATH=$HOME/work/meta4ra/contrib:$PATH
 cur=$(pwd)
 tmp=$(mktemp -d)
 release=$1
@@ -8,7 +9,7 @@ release=$1
 git clone . $tmp/nncp-$release
 cd $tmp/nncp-$release
 git checkout v$release
-redo VERSION
+./version > VERSION
 cd src
 go mod vendor
 modvendor -v -copy="**/*_test.go **/words.go **/README.md **/main.go"
@@ -35,9 +36,6 @@ find . \( \
     -name .goreleaser.yml -o \
     -name .gitattributes \) -delete
 
-mkdir contrib
-cp ~/work/redo/apenwarr/minimal/do contrib/do
-
 cat > doc/download.texi <<EOF
 @node Tarballs
 @section Prepared tarballs
@@ -46,9 +44,7 @@ You can obtain releases source code prepared tarballs from
 @url{http://www.nncpgo.org/Mirrors.html, mirrors}.
 EOF
 perl -i -ne 'print unless /include pedro/' doc/index.texi doc/about.ru.texi
-perl -p -i -e 's/^(.verbatiminclude) .*$/$1 PUBKEY.asc/g' doc/integrity.texi
-mv doc/.well-known/openpgpkey/nncpgo.org/hu/i4cdqgcarfjdjnba6y4jnf498asg8c6p.asc PUBKEY.asc
-ln -s ../PUBKEY.asc doc
+mv doc/.well-known/openpgpkey/nncpgo.org/hu/i4cdqgcarfjdjnba6y4jnf498asg8c6p.asc PUBKEY-PGP.asc
 redo doc/all
 
 ########################################################################
@@ -107,25 +103,24 @@ rm -r doc/.well-known
 
 ########################################################################
 
-perl -i -npe "s/GO build/GO build -mod=vendor/" bin/default.do bin/hjson-cli.do
-perl -i -npe "s/GO list/GO list -mod=vendor/" bin/default.do
-perl -i -npe "s/GO test/GO test -mod=vendor/" test.do
-rm makedist.sh VERSION.do
-rm -r .git
+perl -i -npe "s/GO build/GO build -mod=vendor/" bin/build
+perl -i -npe "s/GO list/GO list -mod=vendor/" bin/build
+rm makedist version
+rm -r .git t
 redo-cleanup full
 find . -type d -exec chmod 755 {} +
 find . -type f -exec chmod 644 {} +
 find . -type f -name "*.sh" -exec chmod +x {} +
-chmod +x contrib/do
+chmod +x bin/build install install-strip uninstall
 
 cd ..
 tar cvf nncp-"$release".tar --uid=0 --gid=0 --numeric-owner nncp-"$release"
 xz -9v nncp-"$release".tar
 tarball=nncp-"$release".tar.xz
-gpg --detach-sign --sign --local-user releases@nncpgo.org "$tarball"
-gpg --enarmor < "$tarball".sig |
-    sed "/^Comment:/d ; s/ARMORED FILE/SIGNATURE/" > "$tarball".asc
-meta4-create -fn "$tarball" -mtime "$tarball" -sig "$tarball".asc \
+ssh-keygen -Y sign -f ~/.ssh/sign/releases@nncpgo.org -n file $tarball
+gpg --armor --detach-sign --sign --local-user releases@nncpgo.org "$tarball"
+meta4-create -fn "$tarball" -mtime "$tarball" \
+    -sig-pgp "$tarball".asc -sig-ssh "$tarball".sig \
     http://www.nncpgo.org/download/"$tarball" \
     http://y.www.nncpgo.org/download/"$tarball" \
     https://nncp.mirrors.quux.org/download/"$tarball" < "$tarball" > "$tarball".meta4
@@ -133,15 +128,16 @@ meta4-create -fn "$tarball" -mtime "$tarball" -sig "$tarball".asc \
 size=$(( $(stat -f %z $tarball) / 1024 ))
 release_date=$(date "+%Y-%m-%d")
 
-mv -v $tmp/"$tarball" $tmp/"$tarball".sig $tmp/"$tarball".meta4 $cur/doc/download
+mv -v $tmp/"$tarball" $tmp/"$tarball".asc $tmp/"$tarball".sig $tmp/"$tarball".meta4 $cur/doc/download
 
 release_underscored=`echo $release | tr . _`
 cat <<EOF
 An entry for documentation:
 @item @ref{Release $release_underscored, $release} @tab $release_date @tab $size KiB @tab
 @url{download/nncp-${release}.tar.xz.meta4, meta4}
-@url{download/nncp-${release}.tar.xz, link}
-@url{download/nncp-${release}.tar.xz.sig, sig}
+@url{download/nncp-${release}.tar.xz, tar}
+@url{download/nncp-${release}.tar.xz.asc, pgp}
+@url{download/nncp-${release}.tar.xz.sig, ssh}
 EOF
 
 cd $cur
@@ -180,10 +176,11 @@ NNCP's home page is: http://www.nncpgo.org/
 Source code and its signature for that version can be found here:
 
     http://www.nncpgo.org/download/nncp-${release}.tar.xz ($size KiB)
-    http://www.nncpgo.org/download/nncp-${release}.tar.xz.sig
+    http://www.nncpgo.org/download/nncp-${release}.tar.xz.asc
 
-GPG key ID: 0x2B25868E75A1A953 NNCP releases <releases@nncpgo.org>
-Fingerprint: 92C2 F0AE FE73 208E 46BF  F3DE 2B25 868E 75A1 A953
+OpenPGP key: 92C2 F0AE FE73 208E 46BF  F3DE 2B25 868E 75A1 A953
+             NNCP releases <releases@nncpgo.org>
+OpenSSH key: SHA256:FRiWawVNBkyS3jFn8uZ/JlT+PWKSFbhWe5XSixp1+SY
 
 There are mirrors where you can also get the source code tarballs:
 http://www.nncpgo.org/Mirrors.html
@@ -234,10 +231,11 @@ $(git cat-file -p v$release | sed -n '6,/^.*BEGIN/p' | sed '$d')
 Исходный код и его подпись для этой версии находятся здесь:
 
     http://www.nncpgo.org/download/nncp-${release}.tar.xz ($size KiB)
-    http://www.nncpgo.org/download/nncp-${release}.tar.xz.sig
+    http://www.nncpgo.org/download/nncp-${release}.tar.xz.asc
 
-Идентификатор GPG ключа: 0x2B25868E75A1A953 NNCP releases <releases@nncpgo.org>
-Отпечаток: 92C2 F0AE FE73 208E 46BF  F3DE 2B25 868E 75A1 A953
+OpenPGP ключ: 92C2 F0AE FE73 208E 46BF  F3DE 2B25 868E 75A1 A953
+              NNCP releases <releases@nncpgo.org>
+OpenSSH ключ: SHA256:FRiWawVNBkyS3jFn8uZ/JlT+PWKSFbhWe5XSixp1+SY
 
 Есть и зеркала где вы также можете получить архивы с исходным кодом:
 http://www.nncpgo.org/Mirrors.html
index 50f1de1a71dc0ce399e439ee902566340394ad37..5bb5d0e08209ffdf1e82d03852ed41589522bc7e 100644 (file)
@@ -51,6 +51,7 @@ type Call struct {
        AutoTossNoTrns bool
        AutoTossNoArea bool
        AutoTossNoACK  bool
+       AutoTossGenACK bool
 }
 
 func (ctx *Ctx) CallNode(
index a57277e88be3462aee9c4dcc4ab1d1282d07cd62..8a7cb34ddc2099fea8f92b35333bad5d8a762f2d 100644 (file)
@@ -56,6 +56,7 @@ type NodeJSON struct {
        Incoming *string             `json:"incoming,omitempty"`
        Exec     map[string][]string `json:"exec,omitempty"`
        Freq     *NodeFreqJSON       `json:"freq,omitempty"`
+       ACK      *NodeACKJSON        `json:"ack,omitempty"`
        Via      []string            `json:"via,omitempty"`
        Calls    []CallJSON          `json:"calls,omitempty"`
 
@@ -74,6 +75,11 @@ type NodeFreqJSON struct {
        MaxSize *uint64 `json:"maxsize,omitempty"`
 }
 
+type NodeACKJSON struct {
+       MinSize *uint64 `json:"minsize,omitempty"`
+       Nice    *string `json:"nice,omitempty"`
+}
+
 type CallJSON struct {
        Cron           string  `json:"cron"`
        Nice           *string `json:"nice,omitempty"`
@@ -94,6 +100,8 @@ type CallJSON struct {
        AutoTossNoExec bool `json:"autotoss-noexec,omitempty"`
        AutoTossNoTrns bool `json:"autotoss-notrns,omitempty"`
        AutoTossNoArea bool `json:"autotoss-noarea,omitempty"`
+       AutoTossNoACK  bool `json:"autotoss-noack,omitempty"`
+       AutoTossGenACK bool `json:"autotoss-gen-ack,omitempty"`
 }
 
 type NodeOurJSON struct {
@@ -220,6 +228,20 @@ func NewNode(name string, cfg NodeJSON) (*Node, error) {
                }
        }
 
+       ackNice := uint8(255)
+       var ackMinSize int64
+       if cfg.ACK != nil {
+               if cfg.ACK.Nice != nil {
+                       ackNice, err = NicenessParse(*cfg.ACK.Nice)
+                       if err != nil {
+                               return nil, err
+                       }
+               }
+               if cfg.ACK.MinSize != nil {
+                       ackMinSize = int64(*cfg.ACK.MinSize) * 1024
+               }
+       }
+
        defRxRate := 0
        if cfg.RxRate != nil && *cfg.RxRate > 0 {
                defRxRate = *cfg.RxRate
@@ -317,6 +339,8 @@ func NewNode(name string, cfg NodeJSON) (*Node, error) {
                call.AutoTossNoExec = callCfg.AutoTossNoExec
                call.AutoTossNoTrns = callCfg.AutoTossNoTrns
                call.AutoTossNoArea = callCfg.AutoTossNoArea
+               call.AutoTossNoACK = callCfg.AutoTossNoACK
+               call.AutoTossGenACK = callCfg.AutoTossGenACK
 
                calls = append(calls, &call)
        }
@@ -332,6 +356,8 @@ func NewNode(name string, cfg NodeJSON) (*Node, error) {
                FreqChunked:    freqChunked,
                FreqMinSize:    freqMinSize,
                FreqMaxSize:    freqMaxSize,
+               ACKNice:        ackNice,
+               ACKMinSize:     ackMinSize,
                Calls:          calls,
                Addrs:          cfg.Addrs,
                RxRate:         defRxRate,
index f9378c8b34c6abd94294a44fc4842f73c209e052..fc36636c051990ef8e6e382992e6ebb7f094f332 100644 (file)
@@ -260,6 +260,24 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) {
                        }
                }
 
+               if n.ACK != nil {
+                       if err = cfgDirMkdir(dst, "neigh", name, "ack"); err != nil {
+                               return
+                       }
+                       if err = cfgDirSave(
+                               n.ACK.MinSize,
+                               dst, "neigh", name, "ack", "minsize",
+                       ); err != nil {
+                               return
+                       }
+                       if err = cfgDirSave(
+                               n.ACK.Nice,
+                               dst, "neigh", name, "ack", "nice",
+                       ); err != nil {
+                               return
+                       }
+               }
+
                if len(n.Via) > 0 {
                        if err = cfgDirSave(
                                strings.Join(n.Via, "\n"),
@@ -372,6 +390,16 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) {
                                        return
                                }
                        }
+                       if call.AutoTossNoACK {
+                               if err = cfgDirTouch(dst, "neigh", name, "calls", is, "autotoss-noack"); err != nil {
+                                       return
+                               }
+                       }
+                       if call.AutoTossGenACK {
+                               if err = cfgDirTouch(dst, "neigh", name, "calls", is, "autotoss-gen-ack"); err != nil {
+                                       return
+                               }
+                       }
                }
        }
 
@@ -689,6 +717,23 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        }
                }
 
+               if cfgDirExists(src, "neigh", n, "ack") {
+                       node.ACK = &NodeACKJSON{}
+                       i64, err := cfgDirLoadIntOpt(src, "neigh", n, "ack", "minsize")
+                       if err != nil {
+                               return nil, err
+                       }
+                       if i64 != nil {
+                               i := uint64(*i64)
+                               node.ACK.MinSize = &i
+                       }
+                       if node.ACK.Nice, err = cfgDirLoadOpt(
+                               src, "neigh", n, "ack", "nice",
+                       ); err != nil {
+                               return nil, err
+                       }
+               }
+
                via, err := cfgDirLoadOpt(src, "neigh", n, "via")
                if err != nil {
                        return nil, err
@@ -856,6 +901,12 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-noarea") {
                                call.AutoTossNoArea = true
                        }
+                       if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-noack") {
+                               call.AutoTossNoACK = true
+                       }
+                       if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-gen-ack") {
+                               call.AutoTossGenACK = true
+                       }
                        node.Calls = append(node.Calls, call)
                }
                cfg.Neigh[n] = node
index 20fe68121686cf9b721d17bbf2fb2dbaac8892a4..18a6f4be359e26bb9be55b5394b982c0fbc5bb31 100644 (file)
@@ -34,7 +34,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-ack -- send packet receipt acknowledgement\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] -all\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "Usage: %s [options] -node NODE[,...]\n", os.Args[0])
@@ -45,9 +44,10 @@ func usage() {
 
 func main() {
        var (
-               cfgPath     = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
-               niceRaw     = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFreq), "Outbound packet niceness")
-               minSizeRaw  = flag.Uint64("minsize", 0, "Minimal required resulting packet size, in KiB")
+               cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
+               niceRaw = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFreq),
+                       "Outbound packet niceness")
+               minSizeRaw  = flag.Int64("minsize", -1, "Minimal required resulting packet size, in KiB")
                viaOverride = flag.String("via", "", "Override Via path to destination node (ignored with -all)")
                spoolPath   = flag.String("spool", "", "Override path to spool")
                logPath     = flag.String("log", "", "Override path to logfile")
@@ -94,7 +94,6 @@ func main() {
        }
 
        ctx.Umask()
-       minSize := int64(*minSizeRaw) * 1024
 
        var nodes []*nncp.Node
        if *nodesRaw != "" {
@@ -130,6 +129,14 @@ func main() {
                        os.Exit(1)
                }
                nncp.ViaOverride(*viaOverride, ctx, nodes[0])
+
+               var minSize int64
+               if *minSizeRaw < 0 {
+                       minSize = nodes[0].ACKMinSize
+               } else if *minSizeRaw > 0 {
+                       minSize = *minSizeRaw * 1024
+               }
+
                pktName, err := ctx.TxACK(nodes[0], nice, *pktRaw, minSize)
                if err != nil {
                        log.Fatalln(err)
@@ -140,6 +147,12 @@ func main() {
 
        isBad := false
        for _, node := range nodes {
+               var minSize int64
+               if *minSizeRaw < 0 {
+                       minSize = node.ACKMinSize
+               } else if *minSizeRaw > 0 {
+                       minSize = *minSizeRaw * 1024
+               }
                for job := range ctx.Jobs(node.Id, nncp.TRx) {
                        pktName := filepath.Base(job.Path)
                        sender := ctx.Neigh[*job.PktEnc.Sender]
index 6fa0ab3642489d76fa04cf22d693c73c45f31cb1..8c5e7a2a98bf0d0585678bebc4a859420339ceb5 100644 (file)
@@ -38,7 +38,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-bundle -- Create/digest stream of NNCP encrypted packets\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] -tx [-delete] NODE [NODE ...] > ...\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] -rx -delete [-dryrun] [NODE ...] < ...\n", os.Args[0])
index 8ff3a0e548523135d52a564772dd150d639e91bb..23b6fb9d5a91378190b86597b7b3ebc474a87d3c 100644 (file)
@@ -32,7 +32,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-call -- call TCP daemon\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] NODE[:ADDR] [FORCEADDR]\n", os.Args[0])
        fmt.Fprintln(os.Stderr, "Options:")
@@ -61,17 +60,29 @@ func main() {
                version     = flag.Bool("version", false, "Print version information")
                warranty    = flag.Bool("warranty", false, "Print warranty information")
 
-               onlineDeadlineSec = flag.Uint("onlinedeadline", 0, "Override onlinedeadline option")
-               maxOnlineTimeSec  = flag.Uint("maxonlinetime", 0, "Override maxonlinetime option")
-
-               autoToss       = flag.Bool("autotoss", false, "Toss after call is finished")
-               autoTossDoSeen = flag.Bool("autotoss-seen", false, "Create seen/ files during tossing")
-               autoTossNoFile = flag.Bool("autotoss-nofile", false, "Do not process \"file\" packets during tossing")
-               autoTossNoFreq = flag.Bool("autotoss-nofreq", false, "Do not process \"freq\" packets during tossing")
-               autoTossNoExec = flag.Bool("autotoss-noexec", false, "Do not process \"exec\" packets during tossing")
-               autoTossNoTrns = flag.Bool("autotoss-notrns", false, "Do not process \"trns\" packets during tossing")
-               autoTossNoArea = flag.Bool("autotoss-noarea", false, "Do not process \"area\" packets during tossing")
-               autoTossNoACK  = flag.Bool("autotoss-noack", false, "Do not process \"ack\" packets during tossing")
+               onlineDeadlineSec = flag.Uint("onlinedeadline", 0,
+                       "Override onlinedeadline option")
+               maxOnlineTimeSec = flag.Uint("maxonlinetime", 0,
+                       "Override maxonlinetime option")
+
+               autoToss = flag.Bool("autotoss", false,
+                       "Toss after call is finished")
+               autoTossDoSeen = flag.Bool("autotoss-seen", false,
+                       "Create seen/ files during tossing")
+               autoTossNoFile = flag.Bool("autotoss-nofile", false,
+                       "Do not process \"file\" packets during tossing")
+               autoTossNoFreq = flag.Bool("autotoss-nofreq", false,
+                       "Do not process \"freq\" packets during tossing")
+               autoTossNoExec = flag.Bool("autotoss-noexec", false,
+                       "Do not process \"exec\" packets during tossing")
+               autoTossNoTrns = flag.Bool("autotoss-notrns", false,
+                       "Do not process \"trns\" packets during tossing")
+               autoTossNoArea = flag.Bool("autotoss-noarea", false,
+                       "Do not process \"area\" packets during tossing")
+               autoTossNoACK = flag.Bool("autotoss-noack", false,
+                       "Do not process \"ack\" packets during tossing")
+               autoTossGenACK = flag.Bool("autotoss-gen-ack", false,
+                       "Generate ACK packets")
        )
        log.SetFlags(log.Lshortfile)
        flag.Usage = usage
@@ -211,14 +222,17 @@ func main() {
        if *autoToss {
                autoTossFinish, autoTossBadCode = ctx.AutoToss(
                        node.Id,
-                       nice,
-                       *autoTossDoSeen,
-                       *autoTossNoFile,
-                       *autoTossNoFreq,
-                       *autoTossNoExec,
-                       *autoTossNoTrns,
-                       *autoTossNoArea,
-                       *autoTossNoACK,
+                       &nncp.TossOpts{
+                               Nice:   nice,
+                               DoSeen: *autoTossDoSeen,
+                               NoFile: *autoTossNoFile,
+                               NoFreq: *autoTossNoFreq,
+                               NoExec: *autoTossNoExec,
+                               NoTrns: *autoTossNoTrns,
+                               NoArea: *autoTossNoArea,
+                               NoACK:  *autoTossNoACK,
+                               GenACK: *autoTossGenACK,
+                       },
                )
        }
 
index 7859377f34c309285e05979ea9a2022cfb8ffd6e..3eff4d2a99a2fff62367d43b2b3d4abd25795c5a 100644 (file)
@@ -33,7 +33,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-caller -- croned NNCP TCP daemon caller\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] [NODE ...]\n", os.Args[0])
        fmt.Fprintln(os.Stderr, "Options:")
@@ -52,14 +51,24 @@ func main() {
                version   = flag.Bool("version", false, "Print version information")
                warranty  = flag.Bool("warranty", false, "Print warranty information")
 
-               autoToss       = flag.Bool("autotoss", false, "Toss after call is finished")
-               autoTossDoSeen = flag.Bool("autotoss-seen", false, "Create seen/ files during tossing")
-               autoTossNoFile = flag.Bool("autotoss-nofile", false, "Do not process \"file\" packets during tossing")
-               autoTossNoFreq = flag.Bool("autotoss-nofreq", false, "Do not process \"freq\" packets during tossing")
-               autoTossNoExec = flag.Bool("autotoss-noexec", false, "Do not process \"exec\" packets during tossing")
-               autoTossNoTrns = flag.Bool("autotoss-notrns", false, "Do not process \"trns\" packets during tossing")
-               autoTossNoArea = flag.Bool("autotoss-noarea", false, "Do not process \"area\" packets during tossing")
-               autoTossNoACK  = flag.Bool("autotoss-noack", false, "Do not process \"ack\" packets during tossing")
+               autoToss = flag.Bool("autotoss", false,
+                       "Toss after call is finished")
+               autoTossDoSeen = flag.Bool("autotoss-seen", false,
+                       "Create seen/ files during tossing")
+               autoTossNoFile = flag.Bool("autotoss-nofile", false,
+                       "Do not process \"file\" packets during tossing")
+               autoTossNoFreq = flag.Bool("autotoss-nofreq", false,
+                       "Do not process \"freq\" packets during tossing")
+               autoTossNoExec = flag.Bool("autotoss-noexec", false,
+                       "Do not process \"exec\" packets during tossing")
+               autoTossNoTrns = flag.Bool("autotoss-notrns", false,
+                       "Do not process \"trns\" packets during tossing")
+               autoTossNoArea = flag.Bool("autotoss-noarea", false,
+                       "Do not process \"area\" packets during tossing")
+               autoTossNoACK = flag.Bool("autotoss-noack", false,
+                       "Do not process \"ack\" packets during tossing")
+               autoTossGenACK = flag.Bool("autotoss-gen-ack", false,
+                       "Generate ACK packets")
        )
        log.SetFlags(log.Lshortfile)
        flag.Usage = usage
@@ -213,14 +222,17 @@ func main() {
                                                if call.AutoToss || *autoToss {
                                                        autoTossFinish, autoTossBadCode = ctx.AutoToss(
                                                                node.Id,
-                                                               call.Nice,
-                                                               call.AutoTossDoSeen || *autoTossDoSeen,
-                                                               call.AutoTossNoFile || *autoTossNoFile,
-                                                               call.AutoTossNoFreq || *autoTossNoFreq,
-                                                               call.AutoTossNoExec || *autoTossNoExec,
-                                                               call.AutoTossNoTrns || *autoTossNoTrns,
-                                                               call.AutoTossNoArea || *autoTossNoArea,
-                                                               call.AutoTossNoACK || *autoTossNoACK,
+                                                               &nncp.TossOpts{
+                                                                       Nice:   call.Nice,
+                                                                       DoSeen: call.AutoTossDoSeen || *autoTossDoSeen,
+                                                                       NoFile: call.AutoTossNoFile || *autoTossNoFile,
+                                                                       NoFreq: call.AutoTossNoFreq || *autoTossNoFreq,
+                                                                       NoExec: call.AutoTossNoExec || *autoTossNoExec,
+                                                                       NoTrns: call.AutoTossNoTrns || *autoTossNoTrns,
+                                                                       NoArea: call.AutoTossNoArea || *autoTossNoArea,
+                                                                       NoACK:  call.AutoTossNoACK || *autoTossNoACK,
+                                                                       GenACK: call.AutoTossGenACK || *autoTossGenACK,
+                                                               },
                                                        )
                                                }
 
index 5697feec32bc384f372be2ad86d11632810876fd..c01d830e83d751840332a0f4e3d0383e352ff615 100644 (file)
@@ -29,7 +29,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-cfgdir -- Convert configuration file to the directory layout.\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] [-cfg ...] -dump /path/to/dir\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] -load /path/to/dir > cfg.hjson\nOptions:\n", os.Args[0])
index c1ac70e40565b646de9fc7af33900790cbe9bdd1..d2a1483d9ebd3595e4fb237ebe1eb9f1b151649e 100644 (file)
@@ -33,7 +33,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-cfgenc -- encrypt/decrypt configuration file\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] cfg.hjson > cfg.hjson.eblob\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] -d cfg.hjson.eblob > cfg.hjson\n", os.Args[0])
index 459cad0a7385aff1acf5127d4dc6c4009793c6f5..d9ca8fe250eff9555804fd1605453decad80d271 100644 (file)
@@ -29,7 +29,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-cfgmin -- print stripped configuration\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
index debe88e0d2d5811b2085479c999dab16fbde64ba..0652424ab8b7cbd7b733d1fefb9818692b0e730d 100644 (file)
@@ -36,7 +36,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprintln(os.Stderr, "nncp-cfgnew -- generate new configuration and keys\nOptions:")
        flag.PrintDefaults()
 }
index 2fc3fd6d78f30ac5d3838e1a0e2f2f6ff221fdcb..6f5c6f05f30a276f91ed7bd4756f08cc564406e1 100644 (file)
@@ -30,7 +30,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-check -- verify Rx/Tx packets checksum\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [-nock] [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
index 0a4f4b70795669f76a51ab56cbd4ff9c2e39d1d0..796fa8d319605875bc7dc018a2cb7f929bbf67dc 100644 (file)
@@ -31,7 +31,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-cronexpr -- cron expression checker\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [-num XXX] CRON-EXPRESSION\n", os.Args[0])
        flag.PrintDefaults()
index 6ae89c0385021a938e1aec210c299276fb5ec92a..33fffa764e107ddd7083c7cc54430c0d28e04c92 100644 (file)
@@ -36,7 +36,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-daemon -- TCP daemon\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
@@ -138,7 +137,8 @@ func main() {
                bind      = flag.String("bind", "[::]:5400", "Address to bind to")
                ucspi     = flag.Bool("ucspi", false, "Is it started as UCSPI-TCP server")
                inetd     = flag.Bool("inetd", false, "Obsolete, use -ucspi")
-               yggdrasil = flag.String("yggdrasil", "", "Start Yggdrasil listener: yggdrasils://PRV[:PORT]?[bind=BIND][&pub=PUB][&peer=PEER][&mcast=REGEX[:PORT]]")
+               yggdrasil = flag.String("yggdrasil", "",
+                       "Start Yggdrasil listener: yggdrasils://PRV[:PORT]?[bind=BIND][&pub=PUB][&peer=PEER][&mcast=REGEX[:PORT]]")
                maxConn   = flag.Int("maxconn", 128, "Maximal number of simultaneous connections")
                noCK      = flag.Bool("nock", false, "Do no checksum checking")
                mcdOnce   = flag.Bool("mcd-once", false, "Send MCDs once and quit")
@@ -151,14 +151,24 @@ func main() {
                version   = flag.Bool("version", false, "Print version information")
                warranty  = flag.Bool("warranty", false, "Print warranty information")
 
-               autoToss       = flag.Bool("autotoss", false, "Toss after call is finished")
-               autoTossDoSeen = flag.Bool("autotoss-seen", false, "Create seen/ files during tossing")
-               autoTossNoFile = flag.Bool("autotoss-nofile", false, "Do not process \"file\" packets during tossing")
-               autoTossNoFreq = flag.Bool("autotoss-nofreq", false, "Do not process \"freq\" packets during tossing")
-               autoTossNoExec = flag.Bool("autotoss-noexec", false, "Do not process \"exec\" packets during tossing")
-               autoTossNoTrns = flag.Bool("autotoss-notrns", false, "Do not process \"trns\" packets during tossing")
-               autoTossNoArea = flag.Bool("autotoss-noarea", false, "Do not process \"area\" packets during tossing")
-               autoTossNoACK  = flag.Bool("autotoss-noack", false, "Do not process \"ack\" packets during tossing")
+               autoToss = flag.Bool("autotoss", false,
+                       "Toss after call is finished")
+               autoTossDoSeen = flag.Bool("autotoss-seen", false,
+                       "Create seen/ files during tossing")
+               autoTossNoFile = flag.Bool("autotoss-nofile", false,
+                       "Do not process \"file\" packets during tossing")
+               autoTossNoFreq = flag.Bool("autotoss-nofreq", false,
+                       "Do not process \"freq\" packets during tossing")
+               autoTossNoExec = flag.Bool("autotoss-noexec", false,
+                       "Do not process \"exec\" packets during tossing")
+               autoTossNoTrns = flag.Bool("autotoss-notrns", false,
+                       "Do not process \"trns\" packets during tossing")
+               autoTossNoArea = flag.Bool("autotoss-noarea", false,
+                       "Do not process \"area\" packets during tossing")
+               autoTossNoACK = flag.Bool("autotoss-noack", false,
+                       "Do not process \"ack\" packets during tossing")
+               autoTossGenACK = flag.Bool("autotoss-gen-ack", false,
+                       "Generate ACK packets")
        )
        log.SetFlags(log.Lshortfile)
        flag.Usage = usage
@@ -211,14 +221,17 @@ func main() {
                if *autoToss && nodeId != nil {
                        autoTossFinish, autoTossBadCode = ctx.AutoToss(
                                nodeId,
-                               nice,
-                               *autoTossDoSeen,
-                               *autoTossNoFile,
-                               *autoTossNoFreq,
-                               *autoTossNoExec,
-                               *autoTossNoTrns,
-                               *autoTossNoArea,
-                               *autoTossNoACK,
+                               &nncp.TossOpts{
+                                       Nice:   nice,
+                                       DoSeen: *autoTossDoSeen,
+                                       NoFile: *autoTossNoFile,
+                                       NoFreq: *autoTossNoFreq,
+                                       NoExec: *autoTossNoExec,
+                                       NoTrns: *autoTossNoTrns,
+                                       NoArea: *autoTossNoArea,
+                                       NoACK:  *autoTossNoACK,
+                                       GenACK: *autoTossGenACK,
+                               },
                        )
                }
                <-nodeIdC // call completion
@@ -298,14 +311,17 @@ func main() {
                        if *autoToss && nodeId != nil {
                                autoTossFinish, autoTossBadCode = ctx.AutoToss(
                                        nodeId,
-                                       nice,
-                                       *autoTossDoSeen,
-                                       *autoTossNoFile,
-                                       *autoTossNoFreq,
-                                       *autoTossNoExec,
-                                       *autoTossNoTrns,
-                                       *autoTossNoArea,
-                                       *autoTossNoACK,
+                                       &nncp.TossOpts{
+                                               Nice:   nice,
+                                               DoSeen: *autoTossDoSeen,
+                                               NoFile: *autoTossNoFile,
+                                               NoFreq: *autoTossNoFreq,
+                                               NoExec: *autoTossNoExec,
+                                               NoTrns: *autoTossNoTrns,
+                                               NoArea: *autoTossNoArea,
+                                               NoACK:  *autoTossNoACK,
+                                               GenACK: *autoTossGenACK,
+                                       },
                                )
                        }
                        <-nodeIdC // call completion
index f7a28c41872c15820a06f96eac1f6466763a7450..ebebd6b1b18a6beec9dde428842f261c272935bd 100644 (file)
@@ -30,7 +30,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-exec -- send execution command\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] NODE HANDLE [ARG0 ARG1 ...]\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] %s:AREA HANDLE [ARG0 ARG1 ...]\nOptions:\n",
@@ -40,21 +39,23 @@ func usage() {
 
 func main() {
        var (
-               noCompress   = flag.Bool("nocompress", false, "Do not compress input data")
-               cfgPath      = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
-               niceRaw      = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceExec), "Outbound packet niceness")
-               replyNiceRaw = flag.String("replynice", nncp.NicenessFmt(nncp.DefaultNiceFile), "Possible reply packet niceness")
-               minSize      = flag.Uint64("minsize", 0, "Minimal required resulting packet size, in KiB")
-               argMaxSize   = flag.Uint64("maxsize", 0, "Maximal allowable resulting packet size, in KiB")
-               viaOverride  = flag.String("via", "", "Override Via path to destination node")
-               spoolPath    = flag.String("spool", "", "Override path to spool")
-               logPath      = flag.String("log", "", "Override path to logfile")
-               quiet        = flag.Bool("quiet", false, "Print only errors")
-               showPrgrs    = flag.Bool("progress", false, "Force progress showing")
-               omitPrgrs    = flag.Bool("noprogress", false, "Omit progress showing")
-               debug        = flag.Bool("debug", false, "Print debug messages")
-               version      = flag.Bool("version", false, "Print version information")
-               warranty     = flag.Bool("warranty", false, "Print warranty information")
+               noCompress = flag.Bool("nocompress", false, "Do not compress input data")
+               cfgPath    = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
+               niceRaw    = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceExec),
+                       "Outbound packet niceness")
+               replyNiceRaw = flag.String("replynice", nncp.NicenessFmt(nncp.DefaultNiceFile),
+                       "Possible reply packet niceness")
+               minSize     = flag.Uint64("minsize", 0, "Minimal required resulting packet size, in KiB")
+               argMaxSize  = flag.Uint64("maxsize", 0, "Maximal allowable resulting packet size, in KiB")
+               viaOverride = flag.String("via", "", "Override Via path to destination node")
+               spoolPath   = flag.String("spool", "", "Override path to spool")
+               logPath     = flag.String("log", "", "Override path to logfile")
+               quiet       = flag.Bool("quiet", false, "Print only errors")
+               showPrgrs   = flag.Bool("progress", false, "Force progress showing")
+               omitPrgrs   = flag.Bool("noprogress", false, "Omit progress showing")
+               debug       = flag.Bool("debug", false, "Print debug messages")
+               version     = flag.Bool("version", false, "Print version information")
+               warranty    = flag.Bool("warranty", false, "Print warranty information")
        )
        log.SetFlags(log.Lshortfile)
        flag.Usage = usage
index abcf8bc76621d4430c760da4740770061a6f6ce7..a101431bd367132fa8f4cfb44854981ba1ca5fa1 100644 (file)
@@ -29,7 +29,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-file -- send file\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] SRC NODE:[DST]\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] SRC %s:AREA:[DST]\nOptions:\n",
@@ -46,8 +45,9 @@ options by default. You can forcefully turn them off by specifying 0 value.
 
 func main() {
        var (
-               cfgPath      = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
-               niceRaw      = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFile), "Outbound packet niceness")
+               cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
+               niceRaw = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFile),
+                       "Outbound packet niceness")
                argMinSize   = flag.Int64("minsize", -1, "Minimal required resulting packet size, in KiB")
                argMaxSize   = flag.Uint64("maxsize", 0, "Maximal allowable resulting packets size, in KiB")
                argChunkSize = flag.Int64("chunked", -1, "Split file on specified size chunks, in KiB")
index 9c1f41fe1905c1d28b15ca6a49e24b758cd2bac6..986cc61f9575bd276ef8f799bcf0cff498c64e1f 100644 (file)
@@ -30,7 +30,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-freq -- send file request\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] NODE:SRC [DST]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
@@ -38,19 +37,21 @@ func usage() {
 
 func main() {
        var (
-               cfgPath      = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
-               niceRaw      = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFreq), "Outbound packet niceness")
-               replyNiceRaw = flag.String("replynice", nncp.NicenessFmt(nncp.DefaultNiceFile), "Reply file packet niceness")
-               minSize      = flag.Uint64("minsize", 0, "Minimal required resulting packet size, in KiB")
-               viaOverride  = flag.String("via", "", "Override Via path to destination node")
-               spoolPath    = flag.String("spool", "", "Override path to spool")
-               logPath      = flag.String("log", "", "Override path to logfile")
-               quiet        = flag.Bool("quiet", false, "Print only errors")
-               showPrgrs    = flag.Bool("progress", false, "Force progress showing")
-               omitPrgrs    = flag.Bool("noprogress", false, "Omit progress showing")
-               debug        = flag.Bool("debug", false, "Print debug messages")
-               version      = flag.Bool("version", false, "Print version information")
-               warranty     = flag.Bool("warranty", false, "Print warranty information")
+               cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
+               niceRaw = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFreq),
+                       "Outbound packet niceness")
+               replyNiceRaw = flag.String("replynice", nncp.NicenessFmt(nncp.DefaultNiceFile),
+                       "Reply file packet niceness")
+               minSize     = flag.Uint64("minsize", 0, "Minimal required resulting packet size, in KiB")
+               viaOverride = flag.String("via", "", "Override Via path to destination node")
+               spoolPath   = flag.String("spool", "", "Override path to spool")
+               logPath     = flag.String("log", "", "Override path to logfile")
+               quiet       = flag.Bool("quiet", false, "Print only errors")
+               showPrgrs   = flag.Bool("progress", false, "Force progress showing")
+               omitPrgrs   = flag.Bool("noprogress", false, "Omit progress showing")
+               debug       = flag.Bool("debug", false, "Print debug messages")
+               version     = flag.Bool("version", false, "Print version information")
+               warranty    = flag.Bool("warranty", false, "Print warranty information")
        )
        log.SetFlags(log.Lshortfile)
        flag.Usage = usage
index c349007ac7c78a4b7c7c2c61ad53328ab0ebbde1..d517e356367f577389bfcb2be5dd711dd1a35d1a 100644 (file)
@@ -32,7 +32,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-hash -- calculate MTH hash of the file\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [-file ...] [-seek X] [-debug] [-progress] [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
index 73d09afa362d864fee50ac5b5c9205174dc4503f..0ad3888415f6fdfab24c31502a6296e2d902fdce 100644 (file)
@@ -30,7 +30,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-log -- read logs\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
index e8377b2e5b9d38feb4d85c6543538989e1e3c120..afc638c792a2f411a89288bafacdb2caa0b7eb1f 100644 (file)
@@ -33,7 +33,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-pkt -- parse raw packet\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
index e92a2e59307f1d5f2c5580d5d8992053106cb0a6..7a23ac74f4fc826539f23a721e7281295d18c15f 100644 (file)
@@ -40,7 +40,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-reass -- reassemble chunked files\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] [FILE.nncp.meta]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
@@ -301,16 +300,16 @@ func findMetas(ctx *nncp.Ctx, dirPath string) []string {
                return nil
        }
        defer dir.Close()
-       fis, err := dir.Readdir(0)
+       entries, err := dir.ReadDir(0)
        dir.Close()
        if err != nil {
                ctx.LogE("reass", nncp.LEs{{K: "Path", V: dirPath}}, err, logMsg)
                return nil
        }
        metaPaths := make([]string, 0)
-       for _, fi := range fis {
-               if strings.HasSuffix(fi.Name(), nncp.ChunkedSuffixMeta) {
-                       metaPaths = append(metaPaths, filepath.Join(dirPath, fi.Name()))
+       for _, entry := range entries {
+               if strings.HasSuffix(entry.Name(), nncp.ChunkedSuffixMeta) {
+                       metaPaths = append(metaPaths, filepath.Join(dirPath, entry.Name()))
                }
        }
        return metaPaths
index b5274454a017cae0a0260a492c48e2ec2429d083..18931ebbcbe3fd3f9ad0196fcbd561e538eb38e1 100644 (file)
@@ -36,7 +36,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-rm -- remove packet\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] [-older X] -tmp\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] -lock\n", os.Args[0])
@@ -45,7 +44,8 @@ func usage() {
        fmt.Fprintf(os.Stderr, "       %s [options] [-older X] {-all|-node NODE} -nock\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] [-older X] {-all|-node NODE} -area\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       %s [options] [-older X] {-all|-node NODE} {-rx|-tx} [-hdr]\n", os.Args[0])
-       fmt.Fprintf(os.Stderr, "       %s [options] [-older X] {-all|-node NODE} -pkt < ...\n", os.Args[0])
+       fmt.Fprintf(os.Stderr, "       %s [options] {-all|-node NODE} -pkt < ...\n", os.Args[0])
+       fmt.Fprintf(os.Stderr, "       %s [options] {-all|-node NODE} -ack\n", os.Args[0])
        fmt.Fprintln(os.Stderr, "-older option's time units are: (s)econds, (m)inutes, (h)ours, (d)ays")
        fmt.Fprintln(os.Stderr, "Options:")
        flag.PrintDefaults()
@@ -68,6 +68,7 @@ func main() {
                older     = flag.String("older", "", "XXX{smhd}: only older than XXX number of time units")
                dryRun    = flag.Bool("dryrun", false, "Do not actually remove files")
                doPkt     = flag.Bool("pkt", false, "Remove only that packets")
+               doACK     = flag.Bool("ack", false, "Remove ACK packets from outbound")
                spoolPath = flag.String("spool", "", "Override path to spool")
                quiet     = flag.Bool("quiet", false, "Print only errors")
                debug     = flag.Bool("debug", false, "Print debug messages")
@@ -251,9 +252,11 @@ func main() {
                                                return err
                                        }
                                        if now.Sub(info.ModTime()) < oldBoundary {
-                                               ctx.LogD("rm-skip", nncp.LEs{{K: "File", V: pth}}, func(les nncp.LEs) string {
-                                                       return fmt.Sprintf("File %s: too fresh, skipping", pth)
-                                               })
+                                               ctx.LogD("rm-skip", nncp.LEs{{K: "File", V: pth}},
+                                                       func(les nncp.LEs) string {
+                                                               return fmt.Sprintf("File %s: too fresh, skipping", pth)
+                                                       },
+                                               )
                                                continue
                                        }
                                        if (*doNoCK && strings.HasSuffix(entry.Name(), nncp.NoCKSuffix)) ||
@@ -293,7 +296,9 @@ func main() {
                        }
                }
                removeSub := func(p string) error {
-                       return filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
+                       return filepath.Walk(p, func(
+                               path string, info os.FileInfo, err error,
+                       ) error {
                                if err != nil {
                                        if errors.Is(err, fs.ErrNotExist) {
                                                return nil
@@ -390,5 +395,46 @@ func main() {
                                log.Fatalln("Can not remove:", err)
                        }
                }
+               if *doACK {
+                       dirPath := filepath.Join(
+                               ctx.Spool, node.Id.String(), string(nncp.TTx), nncp.ACKDir)
+                       dir, err := os.Open(dirPath)
+                       if err != nil {
+                               continue
+                       }
+                       for {
+                               fis, err := dir.ReadDir(1 << 10)
+                               if err != nil {
+                                       if err == io.EOF {
+                                               break
+                                       }
+                                       log.Fatalln("Can not read directory:", err)
+                               }
+                               for _, fi := range fis {
+                                       for _, pth := range []string{
+                                               filepath.Join(
+                                                       ctx.Spool,
+                                                       node.Id.String(),
+                                                       string(nncp.TTx),
+                                                       fi.Name(),
+                                               ),
+                                               filepath.Join(dirPath, fi.Name()),
+                                       } {
+                                               if err = os.Remove(pth); err == nil {
+                                                       ctx.LogI(
+                                                               "rm",
+                                                               nncp.LEs{{K: "File", V: pth}},
+                                                               func(les nncp.LEs) string {
+                                                                       return fmt.Sprintf("File %s: removed", pth)
+                                                               },
+                                                       )
+                                               } else if !errors.Is(err, fs.ErrNotExist) {
+                                                       log.Fatalln("Can not remove:", pth, ":", err)
+                                               }
+                                       }
+                               }
+                       }
+                       dir.Close()
+               }
        }
 }
index 1fc0fb13e8f0924e4b5248dcb5b3bfcd01c00736..4bd8c0fc037f2b48c120675e20e67647cd50c3f6 100644 (file)
@@ -30,7 +30,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-stat -- show queued Rx/Tx stats\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] [-pkt] [-node NODE]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
index 6a960368143aa8bca59548a171d9972bbd755596..24b50e26d243d92952a0f2a0cd08304ebe290d79 100644 (file)
@@ -30,7 +30,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-toss -- process inbound packets\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
@@ -50,6 +49,7 @@ func main() {
                noTrns    = flag.Bool("notrns", false, "Do not process \"transitional\" packets")
                noArea    = flag.Bool("noarea", false, "Do not process \"area\" packets")
                noACK     = flag.Bool("noack", false, "Do not process \"ack\" packets")
+               genACK    = flag.Bool("gen-ack", false, "Generate ACK packets")
                spoolPath = flag.String("spool", "", "Override path to spool")
                logPath   = flag.String("log", "", "Override path to logfile")
                quiet     = flag.Bool("quiet", false, "Print only errors")
@@ -110,15 +110,31 @@ func main() {
                        isBad = ctx.Toss(
                                node.Id,
                                nncp.TRx,
-                               nice,
-                               *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, *noACK,
+                               &nncp.TossOpts{
+                                       Nice:   nice,
+                                       DoSeen: *doSeen,
+                                       NoFile: *noFile,
+                                       NoFreq: *noFreq,
+                                       NoExec: *noExec,
+                                       NoTrns: *noTrns,
+                                       NoArea: *noArea,
+                                       NoACK:  *noACK,
+                                       GenACK: *genACK,
+                               },
                        ) || isBad
                        if nodeId == *ctx.SelfId {
                                isBad = ctx.Toss(
                                        node.Id,
                                        nncp.TTx,
-                                       nice,
-                                       *dryRun, false, true, true, true, true, *noArea, *noACK,
+                                       &nncp.TossOpts{
+                                               Nice:   nice,
+                                               NoFile: true,
+                                               NoFreq: true,
+                                               NoExec: true,
+                                               NoTrns: true,
+                                               NoArea: *noArea,
+                                               NoACK:  *noACK,
+                                       },
                                ) || isBad
                        }
                }
@@ -150,15 +166,32 @@ func main() {
                ctx.Toss(
                        nodeId,
                        nncp.TRx,
-                       nice,
-                       *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, *noACK,
+                       &nncp.TossOpts{
+                               Nice:   nice,
+                               DryRun: *dryRun,
+                               DoSeen: *doSeen,
+                               NoFile: *noFile,
+                               NoFreq: *noFreq,
+                               NoExec: *noExec,
+                               NoTrns: *noTrns,
+                               NoArea: *noArea,
+                               NoACK:  *noACK,
+                               GenACK: *genACK,
+                       },
                )
                if *nodeId == *ctx.SelfId {
                        ctx.Toss(
                                nodeId,
                                nncp.TTx,
-                               nice,
-                               *dryRun, false, true, true, true, true, *noArea, *noACK,
+                               &nncp.TossOpts{
+                                       Nice:   nice,
+                                       NoFile: true,
+                                       NoFreq: true,
+                                       NoExec: true,
+                                       NoTrns: true,
+                                       NoArea: *noArea,
+                                       NoACK:  *noACK,
+                               },
                        )
                }
        }
index f48bad6ad95bc84a7b5edb12d68da9c5dd1ce63e..ad023e92b0b551d428f5ea5142faffe5515504e1 100644 (file)
@@ -31,7 +31,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-trns -- transit existing encrypted packet\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] -via NODEx[,...] NODE:PKT\n", os.Args[0])
        fmt.Fprintf(os.Stderr, "       (to transit SPOOL/NODE/tx/PKT)\n")
@@ -42,8 +41,9 @@ func usage() {
 
 func main() {
        var (
-               cfgPath     = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
-               niceRaw     = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFile), "Outbound packet niceness")
+               cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
+               niceRaw = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFile),
+                       "Outbound packet niceness")
                viaOverride = flag.String("via", "", "Override Via path to destination node")
                spoolPath   = flag.String("spool", "", "Override path to spool")
                logPath     = flag.String("log", "", "Override path to logfile")
index 8685b1c1c5324633c292e2cbe53b08d21e52f03b..7790ba378a93cfcb5266b72fc3d8f8ddb4189aad 100644 (file)
@@ -34,7 +34,6 @@ import (
 )
 
 func usage() {
-       fmt.Fprint(os.Stderr, nncp.UsageHeader())
        fmt.Fprint(os.Stderr, "nncp-xfer -- copy inbound and outbounds packets\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options] DIR\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
@@ -106,7 +105,7 @@ func main() {
        selfPath := filepath.Join(flag.Arg(0), ctx.SelfId.String())
        isBad := false
        var dir *os.File
-       var fis []os.FileInfo
+       var entries []os.DirEntry
        var les nncp.LEs
        var logMsg func(les nncp.LEs) string
        if *txOnly {
@@ -141,7 +140,7 @@ func main() {
                isBad = true
                goto Tx
        }
-       fis, err = dir.Readdir(0)
+       entries, err = dir.ReadDir(0)
        dir.Close()
        if err != nil {
                ctx.LogE("xfer-self-read", les, err, func(les nncp.LEs) string {
@@ -150,12 +149,12 @@ func main() {
                isBad = true
                goto Tx
        }
-       for _, fi := range fis {
-               if !fi.IsDir() {
+       for _, entry := range entries {
+               if !entry.IsDir() {
                        continue
                }
-               nodeId, err := nncp.NodeIdFromString(fi.Name())
-               les := append(les, nncp.LE{K: "Node", V: fi.Name()})
+               nodeId, err := nncp.NodeIdFromString(entry.Name())
+               les := append(les, nncp.LE{K: "Node", V: entry.Name()})
                logMsg := func(les nncp.LEs) string {
                        return "Packet transfer, received from " + ctx.NodeName(nodeId)
                }
@@ -177,7 +176,7 @@ func main() {
                        })
                        continue
                }
-               dir, err = os.Open(filepath.Join(selfPath, fi.Name()))
+               dir, err = os.Open(filepath.Join(selfPath, entry.Name()))
                if err != nil {
                        ctx.LogE("xfer-rx-open", les, err, func(les nncp.LEs) string {
                                return logMsg(les) + ": opening"
@@ -195,7 +194,7 @@ func main() {
                        continue
                }
                for _, fiInt := range fisInt {
-                       if !fi.IsDir() {
+                       if fiInt.IsDir() {
                                continue
                        }
                        // Check that it is valid Base32 encoding
index 7f202039bb070556b9b39a1cac005df33fd1684c..4c5f5be1e5b8758c136f45f89b79ce6ca2776db3 100644 (file)
@@ -9,22 +9,22 @@ require (
        github.com/gologme/log v1.3.0
        github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75
        github.com/hjson/hjson-go v3.3.0+incompatible
-       github.com/klauspost/compress v1.16.5
+       github.com/klauspost/compress v1.16.7
        github.com/yggdrasil-network/yggdrasil-go v0.4.7
        go.cypherpunks.ru/balloon v1.1.1
        go.cypherpunks.ru/recfile v0.7.0
-       golang.org/x/crypto v0.8.0
-       golang.org/x/net v0.9.0
-       golang.org/x/sys v0.7.0
-       golang.org/x/term v0.7.0
+       golang.org/x/crypto v0.12.0
+       golang.org/x/net v0.10.0
+       golang.org/x/sys v0.11.0
+       golang.org/x/term v0.11.0
        gvisor.dev/gvisor v0.0.0-20230428223346-f33f75cda699
-       lukechampine.com/blake3 v1.1.7
+       lukechampine.com/blake3 v1.2.1
 )
 
 require (
        github.com/Arceliar/phony v0.0.0-20210209235338-dde1a8dca979 // indirect
        github.com/google/btree v1.0.1 // indirect
-       github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+       github.com/klauspost/cpuid/v2 v2.2.5 // indirect
        golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
 )
 
index c43bd5107564424d5d15a5c006087279d4bfbb15..5700aff423eb74e2a9e805444f74b9a44b04c33e 100644 (file)
@@ -18,11 +18,10 @@ github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 h1:f0n1xnMSmBLzVf
 github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA=
 github.com/hjson/hjson-go v3.3.0+incompatible h1:Rqr+Ya+0aCJMjaE4s8E9YKvuJLuLVpEvz4ONum52vnI=
 github.com/hjson/hjson-go v3.3.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio=
-github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
-github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
-github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
+github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
+github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -36,19 +35,19 @@ go.cypherpunks.ru/recfile v0.7.0 h1:0R1UnDGKccp7JnC66msslJMlSY02jHx/XkW+ISl0GuY=
 go.cypherpunks.ru/recfile v0.7.0/go.mod h1:sR+KajB+vzofL3SFVFwKt3Fke0FaCcN1g3YPNAhU3qI=
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
-golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
+golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
-golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
-golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
-golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
 golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -57,5 +56,5 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gvisor.dev/gvisor v0.0.0-20230428223346-f33f75cda699 h1:Ns93L6u6C3xgQY2eodedE2ZgIW8JaQYExfHdACX1BJc=
 gvisor.dev/gvisor v0.0.0-20230428223346-f33f75cda699/go.mod h1:pzr6sy8gDLfVmDAg8OYrlKvGEHw5C3PGTiBXBTCx76Q=
-lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0=
-lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
+lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI=
+lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
index aceee17f7baed22d24cf9fb808bda005f25d6d04..a1917121fe7f7cca37f4f403fa60635f558074e6 100644 (file)
@@ -28,9 +28,7 @@ import (
        xdr "github.com/davecgh/go-xdr/xdr2"
 )
 
-const (
-       MCDPort = 5400
-)
+const MCDPort = 5400
 
 type MCD struct {
        Magic  [8]byte
index dde9bcb020cb3b509bf5c0e0d7cbf3f22361a388..d52137260f20a16fb5edc9ba2f7c325b9b114d6f 100644 (file)
@@ -24,7 +24,9 @@ import (
 )
 
 const (
-       Warranty = `This program is free software: you can redistribute it and/or modify
+       Warranty = `Copyright (C) 2016-2023 Sergey Matveev
+
+This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, version 3 of the License.
 
@@ -35,12 +37,11 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.`
+       Base32Encoded32Len = 52
 )
 
-const Base32Encoded32Len = 52
-
 var (
-       Version string = "8.8.3"
+       Version string = "8.9.0"
 
        Base32Codec *base32.Encoding = base32.StdEncoding.WithPadding(base32.NoPadding)
 )
@@ -48,13 +49,3 @@ var (
 func VersionGet() string {
        return "NNCP version " + Version + " built with " + runtime.Version()
 }
-
-func UsageHeader() string {
-       return VersionGet() + `
-Copyright (C) 2016-2023 Sergey Matveev
-License GPLv3: GNU GPL version 3 <http://gnu.org/licenses/gpl.html>
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
-`
-}
index d71fd294d9ef6d97c903ae83427f8d2edddaddf9..0587fbc2b90c2234d2911c80e2adc8ebab9e2e3c 100644 (file)
@@ -50,6 +50,8 @@ type Node struct {
        FreqChunked    int64
        FreqMinSize    int64
        FreqMaxSize    int64
+       ACKNice        uint8
+       ACKMinSize     int64
        Via            []*NodeId
        Addrs          map[string]string
        RxRate         int
index b4363f713ea7856a16df74e26ff5a10ae0413ae6..c4710494bc1a56d8ba5d785f89e0ce44ba23eb29 100644 (file)
@@ -44,8 +44,22 @@ import (
 
 const (
        SeenDir = "seen"
+       ACKDir  = "ack"
 )
 
+type TossOpts struct {
+       Nice   uint8
+       DryRun bool
+       DoSeen bool
+       NoFile bool
+       NoFreq bool
+       NoExec bool
+       NoTrns bool
+       NoArea bool
+       NoACK  bool
+       GenACK bool
+}
+
 func jobPath2Seen(jobPath string) string {
        return filepath.Join(filepath.Dir(jobPath), SeenDir, filepath.Base(jobPath))
 }
@@ -91,7 +105,7 @@ func jobProcess(
        pktSize uint64,
        jobPath string,
        decompressor *zstd.Decoder,
-       dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool,
+       opts *TossOpts,
 ) error {
        defer pipeR.Close()
        sendmail := ctx.Neigh[*ctx.SelfId].Exec["sendmail"]
@@ -111,9 +125,36 @@ func jobProcess(
                        humanize.IBytes(pktSize),
                )
        })
+       if opts.GenACK && pkt.Type != PktTypeACK {
+               newPktName, err := ctx.TxACK(
+                       sender, sender.ACKNice, pktName, sender.ACKMinSize,
+               )
+               if err != nil {
+                       ctx.LogE("rx-unmarshal", les, err, func(les LEs) string {
+                               return fmt.Sprintf("Tossing %s/%s: generating ACK", sender.Name, pktName)
+                       })
+                       return err
+               }
+               ackDir := filepath.Join(ctx.Spool, sender.Id.String(), string(TTx), ACKDir)
+               os.MkdirAll(ackDir, os.FileMode(0777))
+               if fd, err := os.Create(filepath.Join(ackDir, newPktName)); err == nil {
+                       fd.Close()
+                       if err = DirSync(ackDir); err != nil {
+                               ctx.LogE("rx-genack", les, err, func(les LEs) string {
+                                       return fmt.Sprintf("Tossing %s/%s: genACK", sender.Name, pktName)
+                               })
+                               return err
+                       }
+               } else {
+                       ctx.LogE("rx-genack", les, err, func(les LEs) string {
+                               return fmt.Sprintf("Tossing %s/%s: genACK", sender.Name, pktName)
+                       })
+                       return err
+               }
+       }
        switch pkt.Type {
        case PktTypeExec, PktTypeExecFat:
-               if noExec {
+               if opts.NoExec {
                        return nil
                }
                path := bytes.Split(pkt.Path[:int(pkt.PathLen)], []byte{0})
@@ -144,7 +185,7 @@ func jobProcess(
                                log.Fatalln(err)
                        }
                }
-               if !dryRun {
+               if !opts.DryRun {
                        cmd := exec.Command(cmdline[0], append(cmdline[1:], args...)...)
                        cmd.Env = append(
                                cmd.Env,
@@ -203,8 +244,8 @@ func jobProcess(
                                humanize.IBytes(pktSize),
                        )
                })
-               if !dryRun && jobPath != "" {
-                       if doSeen {
+               if !opts.DryRun && jobPath != "" {
+                       if opts.DoSeen {
                                if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
                                        return err
                                }
@@ -238,7 +279,7 @@ func jobProcess(
                }
 
        case PktTypeFile:
-               if noFile {
+               if opts.NoFile {
                        return nil
                }
                dst := string(pkt.Path[:int(pkt.PathLen)])
@@ -283,7 +324,7 @@ func jobProcess(
                        })
                        return err
                }
-               if !dryRun {
+               if !opts.DryRun {
                        tmp, err := TempFile(dir, "file")
                        if err != nil {
                                ctx.LogE("rx-mktemp", les, err, func(les LEs) string {
@@ -400,9 +441,9 @@ func jobProcess(
                                dst, humanize.IBytes(pktSize), sender.Name,
                        )
                })
-               if !dryRun {
+               if !opts.DryRun {
                        if jobPath != "" {
-                               if doSeen {
+                               if opts.DoSeen {
                                        if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
                                                return err
                                        }
@@ -456,7 +497,7 @@ func jobProcess(
                }
 
        case PktTypeFreq:
-               if noFreq {
+               if opts.NoFreq {
                        return nil
                }
                src := string(pkt.Path[:int(pkt.PathLen)])
@@ -503,7 +544,7 @@ func jobProcess(
                        )
                        return err
                }
-               if !dryRun {
+               if !opts.DryRun {
                        err = ctx.TxFile(
                                sender,
                                pkt.Nice,
@@ -528,9 +569,9 @@ func jobProcess(
                ctx.LogI("rx", les, func(les LEs) string {
                        return fmt.Sprintf("Got file request %s to %s", src, sender.Name)
                })
-               if !dryRun {
+               if !opts.DryRun {
                        if jobPath != "" {
-                               if doSeen {
+                               if opts.DoSeen {
                                        if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
                                                return err
                                        }
@@ -583,7 +624,7 @@ func jobProcess(
                }
 
        case PktTypeTrns:
-               if noTrns {
+               if opts.NoTrns {
                        return nil
                }
                dst := new([MTHSize]byte)
@@ -605,7 +646,7 @@ func jobProcess(
                        return err
                }
                ctx.LogD("rx-tx", les, logMsg)
-               if !dryRun {
+               if !opts.DryRun {
                        if len(node.Via) == 0 {
                                if err = ctx.TxTrns(node, nice, int64(pktSize), pipeR); err != nil {
                                        ctx.LogE("rx", les, err, func(les LEs) string {
@@ -645,8 +686,8 @@ func jobProcess(
                                humanize.IBytes(pktSize),
                        )
                })
-               if !dryRun && jobPath != "" {
-                       if doSeen {
+               if !opts.DryRun && jobPath != "" {
+                       if opts.DoSeen {
                                if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
                                        return err
                                }
@@ -681,7 +722,7 @@ func jobProcess(
                }
 
        case PktTypeArea:
-               if noArea {
+               if opts.NoArea {
                        return nil
                }
                areaId := new(AreaId)
@@ -712,7 +753,7 @@ func jobProcess(
                les = append(les, LE{"AreaMsg", msgHash})
                ctx.LogD("rx-area", les, logMsg)
 
-               if dryRun {
+               if opts.DryRun {
                        for _, nodeId := range area.Subs {
                                node := ctx.Neigh[*nodeId]
                                lesEcho := append(les, LE{"Echo", nodeId})
@@ -791,7 +832,7 @@ func jobProcess(
                        ctx.LogD("rx-area-seen", les, func(les LEs) string {
                                return logMsg(les) + ": already seen"
                        })
-                       if !dryRun && jobPath != "" {
+                       if !opts.DryRun && jobPath != "" {
                                if err = os.Remove(jobPath); err != nil {
                                        ctx.LogE("rx-area-remove", les, err, func(les LEs) string {
                                                return fmt.Sprintf(
@@ -858,7 +899,7 @@ func jobProcess(
                                        uint64(pktSizeWithoutEnc(int64(pktSize))),
                                        "",
                                        decompressor,
-                                       dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK,
+                                       opts,
                                )
                        }()
                        _, _, _, err = PktEncRead(
@@ -881,7 +922,7 @@ func jobProcess(
                        }
                }
 
-               if !dryRun && jobPath != "" {
+               if !opts.DryRun && jobPath != "" {
                        if err = os.MkdirAll(seenDir, os.FileMode(0777)); err != nil {
                                ctx.LogE("rx-area-mkdir", les, err, logMsg)
                                return err
@@ -909,7 +950,7 @@ func jobProcess(
                }
 
        case PktTypeACK:
-               if noACK {
+               if opts.NoACK {
                        return nil
                }
                hsh := Base32Codec.EncodeToString(pkt.Path[:MTHSize])
@@ -920,7 +961,7 @@ func jobProcess(
                ctx.LogD("rx-ack", les, logMsg)
                pktPath := filepath.Join(ctx.Spool, sender.Id.String(), string(TTx), hsh)
                if _, err := os.Stat(pktPath); err == nil {
-                       if !dryRun {
+                       if !opts.DryRun {
                                if err = os.Remove(pktPath); err != nil {
                                        ctx.LogE("rx-ack", les, err, func(les LEs) string {
                                                return logMsg(les) + ": removing packet"
@@ -935,7 +976,7 @@ func jobProcess(
                                return logMsg(les) + ": already disappeared"
                        })
                }
-               if !dryRun && doSeen {
+               if !opts.DryRun && opts.DoSeen {
                        if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
                                return err
                        }
@@ -954,7 +995,7 @@ func jobProcess(
                                }
                        }
                }
-               if !dryRun {
+               if !opts.DryRun {
                        if err = os.Remove(jobPath); err != nil {
                                ctx.LogE("rx", les, err, func(les LEs) string {
                                        return logMsg(les) + ": removing job"
@@ -984,12 +1025,7 @@ func jobProcess(
        return nil
 }
 
-func (ctx *Ctx) Toss(
-       nodeId *NodeId,
-       xx TRxTx,
-       nice uint8,
-       dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool,
-) bool {
+func (ctx *Ctx) Toss(nodeId *NodeId, xx TRxTx, opts *TossOpts) bool {
        dirLock, err := ctx.LockDir(nodeId, "toss")
        if err != nil {
                return false
@@ -1008,7 +1044,7 @@ func (ctx *Ctx) Toss(
                        {"Pkt", pktName},
                        {"Nice", int(job.PktEnc.Nice)},
                }
-               if job.PktEnc.Nice > nice {
+               if job.PktEnc.Nice > opts.Nice {
                        ctx.LogD("rx-too-nice", les, func(les LEs) string {
                                return fmt.Sprintf(
                                        "Tossing %s/%s: too nice: %s",
@@ -1056,7 +1092,7 @@ func (ctx *Ctx) Toss(
                                uint64(pktSizeWithoutEnc(job.Size)),
                                job.Path,
                                decompressor,
-                               dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK,
+                               opts,
                        )
                }()
                pipeWB := bufio.NewWriter(pipeW)
@@ -1103,11 +1139,7 @@ func (ctx *Ctx) Toss(
        return isBad
 }
 
-func (ctx *Ctx) AutoToss(
-       nodeId *NodeId,
-       nice uint8,
-       doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool,
-) (chan struct{}, chan bool) {
+func (ctx *Ctx) AutoToss(nodeId *NodeId, opts *TossOpts) (chan struct{}, chan bool) {
        dw, err := ctx.NewDirWatcher(
                filepath.Join(ctx.Spool, nodeId.String(), string(TRx)),
                time.Second,
@@ -1126,9 +1158,7 @@ func (ctx *Ctx) AutoToss(
                                badCode <- bad
                                return
                        case <-dw.C:
-                               bad = !ctx.Toss(
-                                       nodeId, TRx, nice, false,
-                                       doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK) || bad
+                               bad = !ctx.Toss(nodeId, TRx, opts) || bad
                        }
                }
        }()
index aea765d9ec602057ec9cc6193966bf374417a823..eb83309e19b2c77ec3ae87e80c4ba4d7e7a12ee5 100644 (file)
@@ -111,15 +111,13 @@ func TestTossExec(t *testing.T) {
                        if len(dirFiles(rxPath)) == 0 {
                                continue
                        }
-                       ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec-1,
-                               false, false, false, false, false, false, false, false)
+                       ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceExec - 1})
                        if len(dirFiles(rxPath)) == 0 {
                                return false
                        }
                        ctx.Neigh[*nodeOur.Id].Exec = make(map[string][]string)
                        ctx.Neigh[*nodeOur.Id].Exec[handle] = []string{"/bin/sh", "-c", "false"}
-                       ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec,
-                               false, false, false, false, false, false, false, false)
+                       ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceExec})
                        if len(dirFiles(rxPath)) == 0 {
                                return false
                        }
@@ -131,8 +129,7 @@ func TestTossExec(t *testing.T) {
                                        filepath.Join(spool, "mbox"),
                                ),
                        }
-                       ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec,
-                               false, false, false, false, false, false, false, false)
+                       ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceExec})
                        if len(dirFiles(rxPath)) != 0 {
                                return false
                        }
@@ -218,14 +215,12 @@ func TestTossFile(t *testing.T) {
                }
                rxPath := filepath.Join(spool, ctx.Self.Id.String(), string(TRx))
                os.Rename(filepath.Join(spool, ctx.Self.Id.String(), string(TTx)), rxPath)
-               ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile,
-                       false, false, false, false, false, false, false, false)
+               ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFile})
                if len(dirFiles(rxPath)) == 0 {
                        return false
                }
                ctx.Neigh[*nodeOur.Id].Incoming = &incomingPath
-               if ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile,
-                       false, false, false, false, false, false, false, false) {
+               if ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFile}) {
                        return false
                }
                if len(dirFiles(rxPath)) != 0 {
@@ -301,8 +296,7 @@ func TestTossFileSameName(t *testing.T) {
                rxPath := filepath.Join(spool, ctx.Self.Id.String(), string(TRx))
                os.Rename(filepath.Join(spool, ctx.Self.Id.String(), string(TTx)), rxPath)
                ctx.Neigh[*nodeOur.Id].Incoming = &incomingPath
-               ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile,
-                       false, false, false, false, false, false, false, false)
+               ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFile})
                expected := make(map[string]struct{})
                expected["samefile"] = struct{}{}
                for i := 0; i < files-1; i++ {
@@ -374,14 +368,12 @@ func TestTossFreq(t *testing.T) {
                txPath := filepath.Join(spool, ctx.Self.Id.String(), string(TTx))
                os.Rename(txPath, rxPath)
                os.MkdirAll(txPath, os.FileMode(0700))
-               ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq,
-                       false, false, false, false, false, false, false, false)
+               ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFreq})
                if len(dirFiles(txPath)) != 0 || len(dirFiles(rxPath)) == 0 {
                        return false
                }
                ctx.Neigh[*nodeOur.Id].FreqPath = &spool
-               ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq,
-                       false, false, false, false, false, false, false, false)
+               ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFreq})
                if len(dirFiles(txPath)) != 0 || len(dirFiles(rxPath)) == 0 {
                        return false
                }
@@ -394,8 +386,7 @@ func TestTossFreq(t *testing.T) {
                                panic(err)
                        }
                }
-               ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq,
-                       false, false, false, false, false, false, false, false)
+               ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: DefaultNiceFreq})
                if len(dirFiles(txPath)) == 0 || len(dirFiles(rxPath)) != 0 {
                        return false
                }
@@ -498,8 +489,7 @@ func TestTossTrns(t *testing.T) {
                                panic(err)
                        }
                }
-               ctx.Toss(ctx.Self.Id, TRx, 123,
-                       false, false, false, false, false, false, false, false)
+               ctx.Toss(ctx.Self.Id, TRx, &TossOpts{Nice: 123})
                if len(dirFiles(rxPath)) != 0 {
                        return false
                }
index 4523b6343b8ba6ed17acea1b6f7662a82837af0d..2dccbc3d32eb341f1f657ad0d8a38b778c61f5f2 100644 (file)
@@ -22,7 +22,7 @@ import (
        "crypto/rand"
        "io"
        "os"
-       "path"
+       "path/filepath"
        "testing"
        "testing/quick"
 
@@ -63,7 +63,7 @@ func TestTx(t *testing.T) {
                nodeTgt := nodeTgtOur.Their()
                ctx := Ctx{
                        Spool:   spool,
-                       LogPath: path.Join(spool, "log.log"),
+                       LogPath: filepath.Join(spool, "log.log"),
                        Debug:   true,
                        Self:    nodeOur,
                        SelfId:  nodeOur.Id,
diff --git a/test.do b/test.do
deleted file mode 100644 (file)
index 13b228a..0000000
--- a/test.do
+++ /dev/null
@@ -1,6 +0,0 @@
-redo-ifchange config
-exec >&2
-. ./config
-cd src
-GO=${GO:-go}
-$GO test -failfast ./...
diff --git a/uninstall b/uninstall
new file mode 100755 (executable)
index 0000000..6864157
--- /dev/null
+++ b/uninstall
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+
+root="$(realpath -- $(dirname "$0"))"
+. "$root"/config
+cd "$BINDIR"
+rm -f `cat "$root"/bin/cmd.list`
+rm -f "$INFODIR"/nncp.info
+rm -fr "$DOCDIR"
diff --git a/uninstall.do b/uninstall.do
deleted file mode 100644 (file)
index fcec27c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-redo-ifchange config
-. ./config
-for cmd in `cat bin/cmd.list` ; do rm -f $BINDIR/$cmd ; done
-rm -f $INFODIR/nncp.info
-rm -fr $DOCDIR
diff --git a/version b/version
new file mode 100755 (executable)
index 0000000..7e6282e
--- /dev/null
+++ b/version
@@ -0,0 +1,3 @@
+#!/bin/sh -e
+
+exec perl -ne 'print "$1\n" if /Version.* = "(.*)"$/' < "$(realpath -- $(dirname "$0"))"/src/nncp.go