+++ /dev/null
-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) $@
--- /dev/null
+releases@nncpgo.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAN9JzbXHVPouT+atdxhcVgVmCWLm9Dx/mhPWfU4Sceb
--- /dev/null
+-----BEGIN PGP SIGNATURE-----
+
+iQFIBAABCgAyFiEEksLwrv5zII5Gv/PeKyWGjnWhqVMFAmTSnBMUHHJlbGVhc2Vz
+QG5uY3Bnby5vcmcACgkQKyWGjnWhqVOiHQgAzMartvzE1En6hMo9kg31/1QKFbgc
++tHOF5L62hpp3BOvbAyHG1IbFRRCUCi/m3i1KJ0BexaNLItDFba2L/w1P554rDqh
+DslQsI3aU91eVLv/x2CTzkK4Sfx1KCH+sq6BfDnwgwR8LOshspvxcLstcao9dzjh
+IVFdVwQT4t3iHy7DUTR8AsMzO4El28Q8BNbU4Vb3SAyp6XWS08woyB2kNztH83h4
+FJrq17OFmxwRjQg3FXHuQDQs89XI7RE5pcw7RmOAcoKZbU+267NgHwW0BeFkPxwF
+NjKv4rmq6mnHUljCaVTR2DWSvvq+uhSy+Z9Ve05TxFPnwL+NdXkbTy8WNg==
+=59zV
+-----END PGP SIGNATURE-----
+++ /dev/null
-redo-ifchange src/nncp.go
-perl -ne 'print "$1\n" if /Version.* = "(.*)"$/' < src/nncp.go
+++ /dev/null
-redo-ifchange bin/all
+++ /dev/null
-hjson-cli
-nncp-*
+++ /dev/null
-redo-ifchange cmd.list hjson-cli
-redo-ifchange `cat cmd.list`
--- /dev/null
+#!/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
+++ /dev/null
-rm -f `cat cmd.list` hjson-cli
+++ /dev/null
-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##*/}
+++ /dev/null
-cd ../src
-GO=${GO:-go}
-$GO build -o ../bin/$3 github.com/hjson/hjson-go/hjson-cli
+++ /dev/null
-redo bin/clean
-rm -f VERSION
+++ /dev/null
-redo-ifchange doc/all
--- /dev/null
+@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}.
@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
@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
@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
autotoss: true
autotoss-doseen: true
+ autotoss-gen-ack: true
}
{
cron: "30 * * * SAT,SUN"
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
chunked: 1024
minsize: 2048
}
+ ack: {
+ nice: FLASH
+ minsize: 2048
+ }
via: ["alice"]
rxrate: 10
txrate: 20
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
@node nncp-ack
-@cindex packet acknowledgement
@pindex nncp-ack
@section nncp-ack
$ 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.
$ 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
[-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
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}.
@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.
@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
@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}}!
@include niceness.texi
@include chunked.texi
@include bundles.texi
+@include ack.texi
@include spool.texi
@include log.texi
@include pkt/index.texi
$ 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.
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
@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
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
redo-ifchange \
../config \
- ../VERSION \
*.texi \
cfg/*.texi \
cmd/*.texi \
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 \
@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
@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/}.
@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
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
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
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
+++ /dev/null
-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 }
--- /dev/null
+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 {} +
--- /dev/null
+#!/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"/*
--- /dev/null
+#!/bin/sh -e
+
+root="$(realpath -- $(dirname "$0"))"
+cd "$root"
+./install
+. ./config
+for cmd in `cat bin/cmd.list` ; do
+ strip "$BINDIR"/$cmd
+done
+++ /dev/null
-redo-ifchange config install
-. ./config
-for cmd in `cat bin/cmd.list` ; do
- strip $BINDIR/$cmd
-done
+++ /dev/null
-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/*
#!/bin/sh -ex
+PATH=$HOME/work/meta4ra/contrib:$PATH
cur=$(pwd)
tmp=$(mktemp -d)
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"
-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
@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
########################################################################
########################################################################
-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
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
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
Исходный код и его подпись для этой версии находятся здесь:
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
AutoTossNoTrns bool
AutoTossNoArea bool
AutoTossNoACK bool
+ AutoTossGenACK bool
}
func (ctx *Ctx) CallNode(
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"`
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"`
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 {
}
}
+ 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
call.AutoTossNoExec = callCfg.AutoTossNoExec
call.AutoTossNoTrns = callCfg.AutoTossNoTrns
call.AutoTossNoArea = callCfg.AutoTossNoArea
+ call.AutoTossNoACK = callCfg.AutoTossNoACK
+ call.AutoTossGenACK = callCfg.AutoTossGenACK
calls = append(calls, &call)
}
FreqChunked: freqChunked,
FreqMinSize: freqMinSize,
FreqMaxSize: freqMaxSize,
+ ACKNice: ackNice,
+ ACKMinSize: ackMinSize,
Calls: calls,
Addrs: cfg.Addrs,
RxRate: defRxRate,
}
}
+ 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"),
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
+ }
+ }
}
}
}
}
+ 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
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
)
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])
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")
}
ctx.Umask()
- minSize := int64(*minSizeRaw) * 1024
var nodes []*nncp.Node
if *nodesRaw != "" {
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)
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]
)
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])
)
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:")
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
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,
+ },
)
}
)
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:")
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
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,
+ },
)
}
)
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])
)
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])
)
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()
)
func usage() {
- fmt.Fprint(os.Stderr, nncp.UsageHeader())
fmt.Fprintln(os.Stderr, "nncp-cfgnew -- generate new configuration and keys\nOptions:")
flag.PrintDefaults()
}
)
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()
)
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()
)
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()
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")
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
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
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
)
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",
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
)
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",
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")
)
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()
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
)
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()
)
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()
)
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()
)
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()
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
)
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])
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()
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")
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)) ||
}
}
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
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()
+ }
}
}
)
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()
)
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()
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")
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
}
}
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,
+ },
)
}
}
)
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")
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")
)
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()
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 {
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 {
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)
}
})
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"
continue
}
for _, fiInt := range fisInt {
- if !fi.IsDir() {
+ if fiInt.IsDir() {
continue
}
// Check that it is valid Base32 encoding
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
)
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=
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=
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=
xdr "github.com/davecgh/go-xdr/xdr2"
)
-const (
- MCDPort = 5400
-)
+const MCDPort = 5400
type MCD struct {
Magic [8]byte
)
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.
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)
)
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.
-
-`
-}
FreqChunked int64
FreqMinSize int64
FreqMaxSize int64
+ ACKNice uint8
+ ACKMinSize int64
Via []*NodeId
Addrs map[string]string
RxRate int
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))
}
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"]
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})
log.Fatalln(err)
}
}
- if !dryRun {
+ if !opts.DryRun {
cmd := exec.Command(cmdline[0], append(cmdline[1:], args...)...)
cmd.Env = append(
cmd.Env,
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
}
}
case PktTypeFile:
- if noFile {
+ if opts.NoFile {
return nil
}
dst := string(pkt.Path[:int(pkt.PathLen)])
})
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 {
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
}
}
case PktTypeFreq:
- if noFreq {
+ if opts.NoFreq {
return nil
}
src := string(pkt.Path[:int(pkt.PathLen)])
)
return err
}
- if !dryRun {
+ if !opts.DryRun {
err = ctx.TxFile(
sender,
pkt.Nice,
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
}
}
case PktTypeTrns:
- if noTrns {
+ if opts.NoTrns {
return nil
}
dst := new([MTHSize]byte)
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 {
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
}
}
case PktTypeArea:
- if noArea {
+ if opts.NoArea {
return nil
}
areaId := new(AreaId)
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})
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(
uint64(pktSizeWithoutEnc(int64(pktSize))),
"",
decompressor,
- dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK,
+ opts,
)
}()
_, _, _, err = PktEncRead(
}
}
- 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
}
case PktTypeACK:
- if noACK {
+ if opts.NoACK {
return nil
}
hsh := Base32Codec.EncodeToString(pkt.Path[:MTHSize])
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"
return logMsg(les) + ": already disappeared"
})
}
- if !dryRun && doSeen {
+ if !opts.DryRun && opts.DoSeen {
if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil {
return err
}
}
}
}
- 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"
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
{"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",
uint64(pktSizeWithoutEnc(job.Size)),
job.Path,
decompressor,
- dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK,
+ opts,
)
}()
pipeWB := bufio.NewWriter(pipeW)
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,
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
}
}
}()
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
}
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
}
}
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 {
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++ {
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
}
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
}
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
}
"crypto/rand"
"io"
"os"
- "path"
+ "path/filepath"
"testing"
"testing/quick"
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,
+++ /dev/null
-redo-ifchange config
-exec >&2
-. ./config
-cd src
-GO=${GO:-go}
-$GO test -failfast ./...
--- /dev/null
+#!/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"
+++ /dev/null
-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
--- /dev/null
+#!/bin/sh -e
+
+exec perl -ne 'print "$1\n" if /Version.* = "(.*)"$/' < "$(realpath -- $(dirname "$0"))"/src/nncp.go