From: Sergey Matveev Date: Wed, 2 Mar 2022 14:54:18 +0000 (+0300) Subject: Merge branch 'develop' X-Git-Tag: v8.6.0^0 X-Git-Url: http://www.git.cypherpunks.ru/?p=nncp.git;a=commitdiff_plain;h=835c153195c63c59df9a40a4de1e16fff09c003f;hp=7f7ef49b53a6b6c54e4a94fcf59f47b04b908f02 Merge branch 'develop' --- diff --git a/bin/cmd.list b/bin/cmd.list index de2a35f..8a50ab5 100644 --- a/bin/cmd.list +++ b/bin/cmd.list @@ -1,3 +1,4 @@ +nncp-ack nncp-bundle nncp-call nncp-caller diff --git a/doc/about.texi b/doc/about.texi index f752931..09f245c 100644 --- a/doc/about.texi +++ b/doc/about.texi @@ -1,8 +1,18 @@ +@cindex about @strong{NNCP} (Node to Node copy) is a collection of utilities simplifying secure store-and-forward files, mail and command exchanging. See also this page @ref{Об утилитах, on russian}. +@cindex F2F +@cindex friend-to-friend +@cindex E2E +@cindex end-to-end +@cindex darknet +@cindex DTN +@cindex delay tolerant +@cindex dead drop +@cindex onion encryption This utilities are intended to help build up small size (dozens of nodes) ad-hoc @url{https://en.wikipedia.org/wiki/Friend-to-friend, friend-to-friend} (F2F) statically routed @@ -28,6 +38,9 @@ transmission exists. Look for possible @ref{Use cases, use cases}! +@cindex GPL +@cindex free software +@cindex licence NNCP is @url{https://www.gnu.org/philosophy/pragmatic.html, copylefted} @url{https://www.gnu.org/philosophy/free-sw.html, free software} licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GNU GPLv3}. diff --git a/doc/admin.texi b/doc/admin.texi index 11c26ec..47e0e3e 100644 --- a/doc/admin.texi +++ b/doc/admin.texi @@ -1,4 +1,5 @@ @node Administration +@cindex administration @unnumbered Administration NNCP uses following files/directories you should be aware of: @@ -22,13 +23,16 @@ NNCP uses following files/directories you should be aware of: It can contain @file{.nock} files: fully downloaded, but still not checksummed. Can be checksummed (with @file{.nock} extension removing) - with @command{nncp-check -nock}. + with @command{@ref{nncp-check} -nock}. Also it can contain @file{seen/} and @file{hdr/} subdirectories, that should be cleaned too from time to time. - All of that cleaning tasks can be done with @ref{nncp-rm} utility. + All of that cleaning tasks can be done with @command{@ref{nncp-rm}} utility. + @cindex shared spool + @cindex setgid + @pindex umask @anchor{Shared spool} If you want to share single spool directory with multiple grouped Unix users, then you can @command{setgid} it and assure that umask @@ -47,6 +51,7 @@ $ echo 'umask: "007"' >> /usr/local/etc/nncp.hjson @ref{Log} file, for example @file{/var/spool/nncp/log}. It should be rotated. Choose you own preferable way to do it. + @pindex newsyslog Example @url{https://www.newsyslog.org/manual.html, newsyslog}'s entry: @example /var/spool/nncp/log 644 7 100 * BCYN @@ -54,17 +59,21 @@ $ echo 'umask: "007"' >> /usr/local/etc/nncp.hjson @item Optional @ref{CfgIncoming, incoming} directories where uploaded - files are stored. Probably you want to run @ref{nncp-reass} from - time to time to reassemble all chunked uploads. Example crontab + files are stored. Probably you want to run @command{@ref{nncp-reass}} + from time to time to reassemble all chunked uploads. Example crontab entry: @example */1 * * * * nncp-reass -all -noprogress @end example +@pindex daemontools +@pindex supervise +@pindex multilog @item - Possibly long running @ref{nncp-daemon}, @ref{nncp-caller}, - @ref{nncp-toss}, @ref{nncp-check} daemons. As all software, they can + Possibly long running @command{@ref{nncp-daemon}}, + @command{@ref{nncp-caller}}, @command{@ref{nncp-toss}}, + @command{@ref{nncp-check}} daemons. As all software, they can fail and you should place them under some supervisor control. For example you can use @url{http://cr.yp.to/daemontools.html, @@ -90,14 +99,17 @@ EOF # mv /var/service/.nncp-toss /var/service/nncp-toss @end example +@pindex inetd @item - @ref{nncp-daemon} can also be run as + @command{@ref{nncp-daemon}} can also be run as @url{https://en.wikipedia.org/wiki/Inetd, inetd} service on UUCP's port: @example uucp stream tcp6 nowait nncpuser /usr/local/bin/nncp-daemon nncp-daemon -quiet -ucspi @end example +@cindex UCSPI +@pindex tcpserver @item Or it can be also run as a @command{daemontools} daemon under @url{http://cr.yp.to/ucspi-tcp.html, UCSPI-TCP}. In the example diff --git a/doc/building.texi b/doc/building.texi index 03eda87..a0fdd56 100644 --- a/doc/building.texi +++ b/doc/building.texi @@ -1,4 +1,5 @@ @node Build-instructions +@cindex building @section Build instructions Make sure that Go is installed. For example to install it from packages: @@ -19,12 +20,19 @@ $ cd nncp-@value{VERSION} $ redo all @end example +@pindex info After that you should get various @command{bin/nncp-*} binaries and @command{bin/hjson-cli} command (only for your convenience, not necessary installation). For example, documentation for @command{nncp-bundle} command can be get with @command{info doc/nncp.info -n nncp-bundle}. +@pindex redo +@pindex apenwarr/redo +@pindex apenwarr/do +@pindex redo-c +@pindex baredo +@pindex goredo It uses @url{http://cr.yp.to/redo.html, redo} build system for that examples. You can use one of its various implementations, or at least minimalistic POSIX shell @command{contrib/do} (just replace @@ -35,13 +43,46 @@ in tarball. Following ones are tested to work with: from that project), @url{https://github.com/leahneukirchen/redo-c, redo-c}, @url{https://github.com/gotroyb127/baredo, baredo}. -There is @command{install} target respecting @env{$DESTDIR}. It will -install binaries and info-documentation: +@vindex PREFIX +@vindex DESTDIR +@vindex GO +@vindex MAKEINFO +@vindex PLANTUML +@vindex PREFIX +@vindex SENDMAIL +@vindex CFGPATH +@vindex SPOOLPATH +@vindex LOGPATH +@vindex BINDIR +@vindex INFODIR +@vindex DOCDIR +@file{config} file contains some environment variables that are +respected during installation: +@env{$PREFIX}, +@env{$DESTDIR}, +@env{$GO}, +@env{$MAKEINFO}, +@env{$PLANTUML}, +@env{$PREFIX}, +@env{$SENDMAIL}, +@env{$CFGPATH}, +@env{$SPOOLPATH}, +@env{$LOGPATH}, +@env{$BINDIR}, +@env{$INFODIR}, +@env{$DOCDIR}. + +There is @command{install} target for binaries and info-documentation +installation: @example # PREFIX=/usr/local redo 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 @@ -49,7 +90,8 @@ have either broken or unsupported ones. You can still build NNCP with usage at all: @example -$ GO_CFLAGS="-tags nofsnotify" redo ... +$ GO_CFLAGS="-tags nofsnotify" redo @dots{} @end example +@vindex noyggdrasil You can also disable Yggdrasil support with @code{-tags noyggdrasil}. diff --git a/doc/bundles.texi b/doc/bundles.texi index 7bbc85a..df0b554 100644 --- a/doc/bundles.texi +++ b/doc/bundles.texi @@ -1,17 +1,20 @@ @node Bundles +@cindex bundles +@cindex tapes +@cindex streaming media @unnumbered Bundles -Usual @ref{nncp-xfer} command requires filesystem it can operate on. -That presumes random access media storage usage, like hard drives, USB -flash drives and similar. But media like CD-ROM and especially tape -drives are sequential by nature. You can prepare intermediate directory -for recording to CD-ROM disc/tape, but that requires additional storage -and is inconvenient. +Usual @command{@ref{nncp-xfer}} command requires filesystem it can +operate on. That presumes random access media storage usage, like hard +drives, USB flash drives and similar. But media like CD-ROM and +especially tape drives are sequential by nature. You can prepare +intermediate directory for recording to CD-ROM disc/tape, but that +requires additional storage and is inconvenient. -Bundles, created with @ref{nncp-bundle} command are convenient -alternative to ordinary @command{nncp-xfer}. Bundle is just a collection -of @ref{Encrypted, encrypted packets}, stream of packets. It could be -sequentially streamed for recording and digested back. +Bundles, created with @command{@ref{nncp-bundle}} command are convenient +alternative to ordinary @command{@ref{nncp-xfer}}. Bundle is just a +collection of @ref{Encrypted, encrypted packets}, stream of packets. It +could be sequentially streamed for recording and digested back. @itemize @@ -48,8 +51,11 @@ can contain mix of various recipients. @end itemize +@pindex pax +@pindex tar Technically bundle is valid POSIX.1-2001 @url{https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_01, pax archive} with directory/files hierarchy identical to that is used in -@ref{nncp-xfer}: @file{NNCP/RECIPIENT/SENDER/PACKET}. So bundle can also -be created by manual tar-ing of @command{nncp-xfer} resulting directory. +@command{@ref{nncp-xfer}}: @file{NNCP/RECIPIENT/SENDER/PACKET}. +So bundle can also be created by manual tar-ing of +@command{@ref{nncp-xfer}} resulting directory. diff --git a/doc/call.texi b/doc/call.texi index d1e5d99..06566ab 100644 --- a/doc/call.texi +++ b/doc/call.texi @@ -1,7 +1,9 @@ @node Call +@cindex call +@vindex calls @unnumbered Call configuration -Call is a rule when and how node can be called by @ref{nncp-caller}. +Call is a rule when and how node can be called by @command{@ref{nncp-caller}}. Example list of call structures: @@ -51,17 +53,23 @@ It contains the following fields (only @emph{cron} is required): @table @emph +@vindex cron @item cron @include cronexpr.texi +@vindex nice @item nice Optional. Use that @ref{Niceness, niceness} during the call (255 is used otherwise). +@vindex xx +@vindex rx +@vindex tx @item xx Optional. Either @verb{|rx|} or @verb{|tx|}. Tells only to either to receive or to transmit data during that call. +@vindex addr @item addr Optional. Call only that address, instead of trying all from @ref{CfgAddrs, @emph{addrs}} configuration option. It can be either key @@ -79,11 +87,13 @@ configuration option when calling. Optional. Override @ref{CfgMaxOnlineTime, @emph{maxonlinetime}} configuration option when calling. +@vindex autotoss @item autotoss, -doseen, -nofile, -nofreq, -noexec, -notrns 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. +@vindex when-tx-exists @item when-tx-exists Call only if packets for sending exists. The check of outbound packets existence is performed @strong{every} time we are going to make a call, @@ -91,16 +101,19 @@ but @emph{when-tx-exists} does not influence @emph{cron}. When @emph{cron} configuration decides that it is time to make a call, with @emph{when-tx-exists} option it checks packets existence first. +@vindex nock @anchor{CfgNoCK} @item nock NoCK (no-checksumming) tells not to do checksumming of received files, -assuming that it will be done for example with @ref{nncp-check} command -later. That can help minimizing time spent online, because HDD won't do -simultaneous reading of the data for checksumming and writing of the -received one, but just sequential writing of the file. Pay attention -that you have to make a call to remote node after checksumming is done, -to send notification about successful packet reception. - +assuming that it will be done for example with +@command{@ref{nncp-check}} command later. That can help minimizing time +spent online, because HDD won't do simultaneous reading of the data for +checksumming and writing of the received one, but just sequential +writing of the file. Pay attention that you have to make a call to +remote node after checksumming is done, to send notification about +successful packet reception. + +@vindex mcd-ignore @anchor{CfgMCDIgnore} @item mcd-ignore Ignore @ref{MCD} announcements: do not add MCD addresses for possible diff --git a/doc/cfg/areas.texi b/doc/cfg/areas.texi index bc21008..95a9f98 100644 --- a/doc/cfg/areas.texi +++ b/doc/cfg/areas.texi @@ -1,4 +1,5 @@ @node CfgAreas +@vindex areas @section Configuration areas options @ref{Multicast} areas configuration only used with multicast packets. @@ -36,6 +37,7 @@ Each key is human readable multicast group/area/echo name. The only required field is the @code{id}. You can not process multicast packets that has unknown area identification. +@vindex subs @code{subs} contains a list of recipients you must relay incoming multicast packet on. diff --git a/doc/cfg/dir.texi b/doc/cfg/dir.texi index 8297925..1a30f31 100644 --- a/doc/cfg/dir.texi +++ b/doc/cfg/dir.texi @@ -1,9 +1,10 @@ @node Configuration directory +@cindex configuration directory @section Configuration directory Optionally you can convert configuration file to the directory layout -with @ref{nncp-cfgdir} command. And vice versa too, of course loosing -the comment lines. Directory layout can looks like that: +with @command{@ref{nncp-cfgdir}} command. And vice versa too, of course +loosing the comment lines. Directory layout can looks like that: @example nncp-cfg-dir @@ -95,8 +96,9 @@ nncp-cfg-dir Your @option{-cfg} and @env{$NNCPCFG} could point to that directory, instead of @file{.hjson} file. It will be transparently converted to internal JSON representation. However it can not be encrypted with the -@ref{nncp-cfgenc}. +@command{@ref{nncp-cfgenc}}. +@cindex private keys That layout should be much more machine friendly and scriptable. Each string parameters is stored as a single line plain text file. String arrays are newline-separated plain text files. Dictionaries are diff --git a/doc/cfg/general.texi b/doc/cfg/general.texi index 2575779..196d1d6 100644 --- a/doc/cfg/general.texi +++ b/doc/cfg/general.texi @@ -1,4 +1,5 @@ @node CfgGeneral +@cindex general configuration options @section Configuration general options Those options are in the root of configuration dictionary. @@ -26,8 +27,13 @@ yggdrasil-aliases: { @end verbatim @table @code + +@vindex spool @item spool Absolute path to the @ref{Spool, spool} directory. + +@vindex log +@vindex FD log file descriptor @item log Either: @itemize @@ -35,36 +41,49 @@ Either: @item @code{FD:XXX}, where @code{XXX} is a decimal file descriptor to write records too @end itemize + +@vindex umask @item umask Will force all invoked commands to override their umask to specified octal mask. Useful for using with @ref{Shared spool, shared spool directories}. + +@vindex noprogress @item noprogress When enabled, disables progress showing for many commands by default. You can always force its showing with @option{-progress} command line option anyway. + +@vindex nohdr @anchor{CfgNoHdr} @item nohdr @strong{nohdr} option disables @ref{HdrFile, @file{hdr/}} files usage. + @end table And optional @ref{MCD, MultiCast Discovery} options: @table @code + +@vindex mcd-listen @anchor{CfgMCDListen} @item mcd-listen Specifies list of network interfaces regular expression -@ref{nncp-caller} will listen for incoming @ref{MCD} announcements. +@command{@ref{nncp-caller}} will listen for incoming @ref{MCD} announcements. + +@vindex mcd-send @anchor{CfgMCDSend} @item mcd-send Specifies list of network interfaces regular expressions, and intervals -in seconds, where @ref{nncp-daemon} will send @ref{MCD} announcements. +in seconds, where @command{@ref{nncp-daemon}} will send @ref{MCD} announcements. + @end table +@cindex yggdrasil aliases @anchor{CfgYggdrasilAliases} Optional @ref{Yggdrasil}-related aliases are used for convenience and keeping private keys away being used directly in command line. Each @code{PUB}, @code{PRV}, @code{PEER}, @code{BIND} value in -@ref{nncp-daemon}'s @option{-yggdrasil} and in @code{yggdrasil:} +@command{@ref{nncp-daemon}}'s @option{-yggdrasil} and in @code{yggdrasil:} addresses is replaced with alias value. Moreover each entry in list of @code{PUB}s, @code{PEER}s and @code{BIND} can be an alias too. Pay attention, that all aliases ending with @code{prv} will be saved with diff --git a/doc/cfg/index.texi b/doc/cfg/index.texi index f9844ea..1fbca49 100644 --- a/doc/cfg/index.texi +++ b/doc/cfg/index.texi @@ -1,9 +1,11 @@ @node Configuration +@cindex configuration file @unnumbered Configuration file +@cindex Hjson NNCP uses single file configuration file in @url{https://hjson.org/, Hjson} format (see also section about @ref{Configuration directory, -directory layout}) . Initially it is created with @ref{nncp-cfgnew} +directory layout}) . Initially it is created with @command{@ref{nncp-cfgnew}} command and at minimum it can look like this: @verbatim @@ -30,6 +32,10 @@ neigh: { } @end verbatim +@cindex JSON +@pindex hjson-cli +@pindex gojq +@pindex gjo Do not forget that Hjson can be safely converted to JSON and vice versa (loosing formatting and comments of course). By default @command{hjson-cli} utility from @code{github.com/hjson/hjson-go} is diff --git a/doc/cfg/neigh.texi b/doc/cfg/neigh.texi index a141b77..7912fe3 100644 --- a/doc/cfg/neigh.texi +++ b/doc/cfg/neigh.texi @@ -1,6 +1,8 @@ @node CfgNeigh +@cindex neighbour configuration options @section Configuration neighbour options +@vindex neigh @strong{neigh} section contains all known neighbours information. It always has @strong{self} neighbour that is copy of our node's public data (public keys). It is useful for copy-paste sharing with your @@ -65,8 +67,10 @@ node has the following fields: If present, then node can be online called using @ref{Sync, synchronization protocol}. Contains authentication public key. +@vindex exec +@pindex sendmail @anchor{CfgExec} - @item exec +@item exec Dictionary consisting of handles and corresponding command line arguments. In example above there are @command{sendmail} handles, @command{warcer}, @command{wgeter} and @command{flag} one. Remote @@ -87,11 +91,13 @@ NNCP_NICE=64 \ feeding @verb{|hello world\n|} to that started @command{sendmail} process. +@vindex incoming @anchor{CfgIncoming} @item incoming Full path to directory where all file uploads will be saved. May be omitted to forbid file uploading on that node. +@vindex freq @anchor{CfgFreq} @item freq @table @code @@ -108,6 +114,7 @@ NNCP_NICE=64 \ transmission. @end table +@vindex via @anchor{CfgVia} @item via An array of node identifiers that will be used as a relay to that @@ -116,11 +123,12 @@ NNCP_NICE=64 \ nodes. May be omitted if direct connection exists and no relaying is required. +@vindex addrs @anchor{CfgAddrs} @item addrs Dictionary containing known network addresses of the node. Each key is human-readable name of the address. For direct TCP connections - use @verb{|host:port|} format, pointing to @ref{nncp-daemon}'s + use @verb{|host:port|} format, pointing to @command{@ref{nncp-daemon}}'s listening instance. Also you can pipe connection through the external command using @@ -128,12 +136,14 @@ NNCP_NICE=64 \ start and its @code{stdin}/@code{stdout} used as a connection. To use @ref{Yggdrasil} network for connectivity, use - @verb{|yggdrasil:PUB;PRV;PEER[,...]|} format, read about + @code{yggdrasil:PUB;PRV;PEER[,@dots{}]} format, read about @ref{CfgYggdrasilAliases, possible aliases} usage. May be omitted if either no direct connection exists, or - @ref{nncp-call} is used with forced address specifying. + @command{@ref{nncp-call}} is used with forced address specifying. +@vindex rxrate +@vindex txrate @anchor{CfgXxRate} @item rxrate/txrate If greater than zero, then at most *rate packets per second will be @@ -141,6 +151,7 @@ NNCP_NICE=64 \ bandwidth traffic shaper: each packet has at most 64 KiB payload size. If omitted -- no rate limits. +@vindex onlinedeadline @anchor{CfgOnlineDeadline} @item onlinedeadline Online connection deadline of nodes inactivity in seconds. It is the @@ -151,6 +162,7 @@ NNCP_NICE=64 \ delays), wait for appearing packets ready to send and notifying remote side about their appearance. +@vindex maxonlinetime @anchor{CfgMaxOnlineTime} @item maxonlinetime If greater than zero, then it is maximal time of single connection. @@ -159,6 +171,6 @@ NNCP_NICE=64 \ @anchor{CfgCalls} @item calls List of @ref{Call, call configuration}s. - Can be omitted if @ref{nncp-caller} won't be used to call that node. + Can be omitted if @command{@ref{nncp-caller}} won't be used to call that node. @end table diff --git a/doc/cfg/notify.texi b/doc/cfg/notify.texi index 8badc94..f4f011d 100644 --- a/doc/cfg/notify.texi +++ b/doc/cfg/notify.texi @@ -1,4 +1,7 @@ @node CfgNotify +@cindex email notification +@cindex notification configuration options +@cindex logging handles @section Configuration notification options That section controls what notifications are enabled and how must be diff --git a/doc/cfg/self.texi b/doc/cfg/self.texi index 0528b5a..3601d31 100644 --- a/doc/cfg/self.texi +++ b/doc/cfg/self.texi @@ -1,10 +1,18 @@ @node CfgSelf +@cindex self-node configuration keypairs @section Configuration self-node keypairs @strong{self} section contains our node's private keypairs. +@vindex ExchPrv +@vindex ExchPub +@vindex SignPrv +@vindex SignPub @strong{exch*} and @strong{sign*} are used during @ref{Encrypted, encrypted} packet creation. +@vindex NoisePrv +@vindex NoisePub @strong{noise*} are used during @ref{Sync, synchronization protocol} -working in @ref{nncp-call}, @ref{nncp-caller}, @ref{nncp-daemon}. +working in @command{@ref{nncp-call}}, @command{@ref{nncp-caller}}, +@command{@ref{nncp-daemon}}. diff --git a/doc/chunked.texi b/doc/chunked.texi index 67f4259..d0f111a 100644 --- a/doc/chunked.texi +++ b/doc/chunked.texi @@ -1,4 +1,5 @@ @node Chunked +@cindex chunked @unnumbered Chunked files There is ability to transfer huge files with dividing them into smaller @@ -10,9 +11,11 @@ than huge file's size. You can transfer those chunks on different storage devices, and/or at different time, reassembling the whole packet on the destination node. -Splitting is done with @ref{nncp-file, nncp-file -chunked} command and -reassembling with @ref{nncp-reass} command. +Splitting is done with @command{@ref{nncp-file} -chunked} command and +reassembling with @command{@ref{nncp-reass}} command. +@vindex .nncp.meta +@vindex .nncp.chunk Chunked @file{FILE} produces @file{FILE.nncp.meta}, @file{FILE.nncp.chunk0}, @file{FILE.nncp.chunk1}, @dots{} files. All @file{.nncp.chunkXXX} can be concatenated together to produce original @@ -44,6 +47,7 @@ size and their hash checksums. This is @ref{MTH} checksum of each chunk @end multitable +@cindex ZFS recordsize @anchor{ChunkedZFS} It is strongly advisable to reassemble incoming chunked files on @url{https://en.wikipedia.org/wiki/ZFS, ZFS} dataset with deduplication diff --git a/doc/cmd/index.texi b/doc/cmd/index.texi index 5727db8..fa2b38e 100644 --- a/doc/cmd/index.texi +++ b/doc/cmd/index.texi @@ -1,9 +1,11 @@ @node Commands +@cindex commands @unnumbered Commands Nearly all commands have the following common options: @table @option +@vindex NNCPCFG @item -cfg Path to configuration file. May be overridden by @env{$NNCPCFG} environment variable. If file file is an encrypted @ref{EBlob, @@ -24,16 +26,18 @@ Nearly all commands have the following common options: Override @ref{CfgVia, via} configuration option for destination node. Specified nodes must be separated with comma: @verb{|NODE1,NODE2|}. With @verb{|-via -|} you can disable relaying at all. +@vindex NNCPSPOOL @item -spool Override path to spool directory. May be specified by @env{$NNCPSPOOL} environment variable. +@vindex NNCPLOG @item -log Override path to logfile. May be specified by @env{$NNCPLOG} environment variable. @item -quiet Print only errors, omit simple informational messages. In any case those messages are logged, so you can reread them using - @ref{nncp-log} command. + @command{@ref{nncp-log}} command. @item -progress, -noprogress Either force progress showing, or disable it. @item -version @@ -42,6 +46,15 @@ Nearly all commands have the following common options: Print warranty information (no warranty). @end table +@vindex TMPDIR +All commands respect @env{$TMPDIR} environment variable. + +@vindex NNCPNOSYNC +If you set @env{$NNCPNOSYNC=1}, then all @code{fsync} operations will be +skipped. That is dangerous option, but if there there are abilities to +rollback possibly corrupted state to some stable snapshot, then disabled +@code{fsync} can give considerable increase in performance. + @menu Configuration file commands @@ -56,6 +69,7 @@ Packets creation commands * nncp-exec:: * nncp-freq:: * nncp-trns:: +* nncp-ack:: Packets sharing commands @@ -92,6 +106,7 @@ Maintenance, monitoring and debugging commands: @include cmd/nncp-exec.texi @include cmd/nncp-freq.texi @include cmd/nncp-trns.texi +@include cmd/nncp-ack.texi @include cmd/nncp-xfer.texi @include cmd/nncp-bundle.texi @include cmd/nncp-toss.texi diff --git a/doc/cmd/nncp-ack.texi b/doc/cmd/nncp-ack.texi new file mode 100644 index 0000000..5635cc1 --- /dev/null +++ b/doc/cmd/nncp-ack.texi @@ -0,0 +1,63 @@ +@node nncp-ack +@cindex packet acknowledgement +@pindex nncp-ack +@section nncp-ack + +@example +$ nncp-ack [options] -all +$ nncp-ack [options] -node NODE[,@dots{}] +$ nncp-ack [options] -node NODE -pkt 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. + +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: + +@example +bob$ nncp-ack -node alice +@end example + +@item Send those newly created packets back to Alice: + +@example +bob$ nncp-xfer -tx /mnt/shared +@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. diff --git a/doc/cmd/nncp-bundle.texi b/doc/cmd/nncp-bundle.texi index 9db031f..853f06f 100644 --- a/doc/cmd/nncp-bundle.texi +++ b/doc/cmd/nncp-bundle.texi @@ -1,10 +1,11 @@ @node nncp-bundle +@pindex nncp-bundle @section nncp-bundle @example -$ nncp-bundle [options] -tx [-delete] NODE [NODE @dots{}] > ... -$ nncp-bundle [options] -rx -delete [-dryrun] [NODE @dots{}] < ... -$ nncp-bundle [options] -rx [-check] [-dryrun] [NODE @dots{}] < ... +$ nncp-bundle [options] -tx [-delete] NODE [NODE @dots{}] > @dots{} +$ nncp-bundle [options] -rx -delete [-dryrun] [NODE @dots{}] < @dots{} +$ nncp-bundle [options] -rx [-check] [-dryrun] [NODE @dots{}] < @dots{} @end example With @option{-tx} option, this command creates @ref{Bundles, bundle} of @@ -17,8 +18,8 @@ attention that @strong{no} integrity checking is done by default. Modern tape drives could easily provide too much throughput your CPU won't be able to verify on the fly. So if you won't @ref{nncp-toss, toss} received packets at the place, it is advisable either to run -@ref{nncp-check} utility for packets integrity verification, or to use -@option{-check} option to enable on the fly integrity check. +@command{@ref{nncp-check}} utility for packets integrity verification, +or to use @option{-check} option to enable on the fly integrity check. You can specify multiple @option{NODE} arguments, telling for what nodes you want to create the stream, or take it from. If no nodes are diff --git a/doc/cmd/nncp-call.texi b/doc/cmd/nncp-call.texi index 6c58b5c..be3b6e9 100644 --- a/doc/cmd/nncp-call.texi +++ b/doc/cmd/nncp-call.texi @@ -1,4 +1,5 @@ @node nncp-call +@pindex nncp-call @section nncp-call @example @@ -43,10 +44,10 @@ not specify the exact one, then all will be tried until the first success. Optionally you can force @option{FORCEADDR} address usage, instead of addresses taken from configuration file. You can specify @verb{|host:port|}, @verb{#|some command#} and -@verb{|yggdrasil:PUB;PRV;PEER[,...]|} formats. +@code{yggdrasil:PUB;PRV;PEER[,@dots{}]} formats. If you specify @option{-ucspi} option, then it is assumed that you run -@command{nncp-call} command under some UCSPI-TCP compatible utility, +@command{@ref{nncp-call}} command under some UCSPI-TCP compatible utility, that provides read/write channels through 6/7 file descriptors. @option{-mcd-wait} options tells to wait up to specified number of @@ -55,7 +56,7 @@ the packet is received, initiate a call. @option{-autotoss} option runs tosser on node's spool every second during the call. All @option{-autotoss-*} options is the same as in -@ref{nncp-toss} command. +@command{@ref{nncp-toss}} command. Partly downloaded packets are stored in @file{.part} files. By default all downloaded files are sequentially checksummed in the background, @@ -64,8 +65,8 @@ option is set, then no checksumming is done, renaming fully downloaded files to @file{.nock} extension. Pay attention that checksumming can be time consuming and connection could be lost during that check, so remote node won't be notified that the file is finished. If you run -@ref{nncp-check, @command{nncp-check -nock}}, that will checksum files -and strip the @file{.nock} extension, then repeated call to remote node -will notify about packet's completion. Also it will be notified if -@ref{nncp-toss, tossing} created @file{seen/} file. -Read @ref{CfgNoCK, more} about @option{-nock} option. +@command{@ref{nncp-check} -nock}, that will checksum files and strip the +@file{.nock} extension, then repeated call to remote node will notify about +packet's completion. Also it will be notified if @ref{nncp-toss, tossing} +created @file{seen/} file. Read @ref{CfgNoCK, more} about @option{-nock} +option. diff --git a/doc/cmd/nncp-caller.texi b/doc/cmd/nncp-caller.texi index a4d0dc5..275db7d 100644 --- a/doc/cmd/nncp-caller.texi +++ b/doc/cmd/nncp-caller.texi @@ -1,4 +1,5 @@ @node nncp-caller +@pindex nncp-caller @section nncp-caller @example @@ -12,4 +13,4 @@ Optional number of @option{NODE}s tells to ignore other ones. Otherwise all nodes with specified @emph{calls} configuration field will be called. -Look at @ref{nncp-call} for more information. +Look at @command{@ref{nncp-call}} for more information. diff --git a/doc/cmd/nncp-cfgdir.texi b/doc/cmd/nncp-cfgdir.texi index c4f96e4..853dd10 100644 --- a/doc/cmd/nncp-cfgdir.texi +++ b/doc/cmd/nncp-cfgdir.texi @@ -1,4 +1,5 @@ @node nncp-cfgdir +@pindex nncp-cfgdir @section nncp-cfgdir @example diff --git a/doc/cmd/nncp-cfgenc.texi b/doc/cmd/nncp-cfgenc.texi index 80fab22..02070c3 100644 --- a/doc/cmd/nncp-cfgenc.texi +++ b/doc/cmd/nncp-cfgenc.texi @@ -1,4 +1,5 @@ @node nncp-cfgenc +@pindex nncp-cfgenc @section nncp-cfgenc @example diff --git a/doc/cmd/nncp-cfgmin.texi b/doc/cmd/nncp-cfgmin.texi index d0125ac..91043cb 100644 --- a/doc/cmd/nncp-cfgmin.texi +++ b/doc/cmd/nncp-cfgmin.texi @@ -1,4 +1,7 @@ @node nncp-cfgmin +@cindex stripped configuration +@cindex minimized configuration +@pindex nncp-cfgmin @section nncp-cfgmin @example @@ -7,5 +10,5 @@ $ nncp-cfgmin [options] > stripped.hjson Print out stripped configuration version: only path to @ref{Spool, spool}, path to log file, neighbours public keys are stayed. This is -useful mainly for usage with @ref{nncp-xfer} that has to know only -neighbours, without private keys involving. +useful mainly for usage with @command{@ref{nncp-xfer}} that has to know +only neighbours, without private keys involving. diff --git a/doc/cmd/nncp-cfgnew.texi b/doc/cmd/nncp-cfgnew.texi index 0f7ab37..ccd47c6 100644 --- a/doc/cmd/nncp-cfgnew.texi +++ b/doc/cmd/nncp-cfgnew.texi @@ -1,4 +1,5 @@ @node nncp-cfgnew +@pindex nncp-cfgnew @section nncp-cfgnew @example diff --git a/doc/cmd/nncp-check.texi b/doc/cmd/nncp-check.texi index 4a257af..57bb379 100644 --- a/doc/cmd/nncp-check.texi +++ b/doc/cmd/nncp-check.texi @@ -1,4 +1,5 @@ @node nncp-check +@pindex nncp-check @section nncp-check @example diff --git a/doc/cmd/nncp-cronexpr.texi b/doc/cmd/nncp-cronexpr.texi index f06202a..50821d0 100644 --- a/doc/cmd/nncp-cronexpr.texi +++ b/doc/cmd/nncp-cronexpr.texi @@ -1,4 +1,5 @@ @node nncp-cronexpr +@pindex nncp-cronexpr @section nncp-cronexpr @example diff --git a/doc/cmd/nncp-daemon.texi b/doc/cmd/nncp-daemon.texi index 15e1233..95c27b9 100644 --- a/doc/cmd/nncp-daemon.texi +++ b/doc/cmd/nncp-daemon.texi @@ -1,4 +1,5 @@ @node nncp-daemon +@pindex nncp-daemon @section nncp-daemon @example @@ -10,8 +11,8 @@ $ nncp-daemon [options] Start listening TCP daemon, wait for incoming connections and run @ref{Sync, synchronization protocol} with each of them. You can run -@ref{nncp-toss} utility in background to process inbound packets from -time to time. +@command{@ref{nncp-toss}} utility in background to process inbound +packets from time to time. @option{-maxconn} option specifies how many simultaneous clients daemon can handle. @option{-bind} option specifies @option{addr:port} it must @@ -36,7 +37,7 @@ uucp stream tcp6 nowait nncpuser /usr/local/bin/nncp-daemon nncp-daemon -quiet - @option{-autotoss} option runs tosser on node's spool every second during the call. All @option{-autotoss-*} options is the same as in -@ref{nncp-toss} command. +@command{@ref{nncp-toss}} command. Read @ref{CfgNoCK, more} about @option{-nock} option. diff --git a/doc/cmd/nncp-exec.texi b/doc/cmd/nncp-exec.texi index eec6a7e..8b9c753 100644 --- a/doc/cmd/nncp-exec.texi +++ b/doc/cmd/nncp-exec.texi @@ -1,4 +1,5 @@ @node nncp-exec +@pindex nncp-exec @section nncp-exec @example @@ -22,6 +23,9 @@ exec: { } @end verbatim +@vindex NNCP_SELF +@vindex NNCP_SENDER +@vindex NNCP_NICE then executing @verb{|echo My message | nncp-exec -replynice 123 REMOTE sendmail root@localhost|} will lead to execution of: diff --git a/doc/cmd/nncp-file.texi b/doc/cmd/nncp-file.texi index 802e817..078a6ba 100644 --- a/doc/cmd/nncp-file.texi +++ b/doc/cmd/nncp-file.texi @@ -1,4 +1,5 @@ @node nncp-file +@pindex nncp-file @section nncp-file @example diff --git a/doc/cmd/nncp-freq.texi b/doc/cmd/nncp-freq.texi index aa35f99..049339c 100644 --- a/doc/cmd/nncp-freq.texi +++ b/doc/cmd/nncp-freq.texi @@ -1,4 +1,5 @@ @node nncp-freq +@pindex nncp-freq @section nncp-freq @example diff --git a/doc/cmd/nncp-hash.texi b/doc/cmd/nncp-hash.texi index babd150..afed745 100644 --- a/doc/cmd/nncp-hash.texi +++ b/doc/cmd/nncp-hash.texi @@ -1,4 +1,5 @@ @node nncp-hash +@pindex nncp-hash @section nncp-hash @example diff --git a/doc/cmd/nncp-log.texi b/doc/cmd/nncp-log.texi index 6ac6a7a..5cbc281 100644 --- a/doc/cmd/nncp-log.texi +++ b/doc/cmd/nncp-log.texi @@ -1,4 +1,5 @@ @node nncp-log +@pindex nncp-log @section nncp-log @example diff --git a/doc/cmd/nncp-pkt.texi b/doc/cmd/nncp-pkt.texi index b3391b4..ab0495a 100644 --- a/doc/cmd/nncp-pkt.texi +++ b/doc/cmd/nncp-pkt.texi @@ -1,4 +1,5 @@ @node nncp-pkt +@pindex nncp-pkt @section nncp-pkt @example @@ -20,7 +21,7 @@ Sender: 2WHBV3TPZHDOZGUJEH563ZEK7M33J4UESRFO4PDKWD5KZNPROABQ (self) @option{-dump} option outputs plain packet's payload (if it is file transmission, then it will be the file itself as an example). If it is an encrypted packet, then it will be decrypted first, outputing the -included plain packet, that can be fed to @command{nncp-pkt} again: +included plain packet, that can be fed to @command{@ref{nncp-pkt}} again: @example Packet type: plain diff --git a/doc/cmd/nncp-reass.texi b/doc/cmd/nncp-reass.texi index 7cae84b..6251113 100644 --- a/doc/cmd/nncp-reass.texi +++ b/doc/cmd/nncp-reass.texi @@ -1,4 +1,5 @@ @node nncp-reass +@pindex nncp-reass @section nncp-reass @example diff --git a/doc/cmd/nncp-rm.texi b/doc/cmd/nncp-rm.texi index f36178a..4c74f0a 100644 --- a/doc/cmd/nncp-rm.texi +++ b/doc/cmd/nncp-rm.texi @@ -1,4 +1,5 @@ @node nncp-rm +@pindex nncp-rm @section nncp-rm @example @@ -19,7 +20,7 @@ This command is aimed to delete various files from your spool directory: @item If @option{-tmp} option is specified, then it will delete all temporary files in @file{spool/tmp} directory. Files may stay in it when -commands like @ref{nncp-file} fail for some reason. +commands like @command{@ref{nncp-file}} fail for some reason. @item If @option{-lock} option is specified, then all @file{.lock} files will be deleted in your spool directory. diff --git a/doc/cmd/nncp-stat.texi b/doc/cmd/nncp-stat.texi index 5759a01..ae552fd 100644 --- a/doc/cmd/nncp-stat.texi +++ b/doc/cmd/nncp-stat.texi @@ -1,4 +1,5 @@ @node nncp-stat +@pindex nncp-stat @section nncp-stat @example diff --git a/doc/cmd/nncp-toss.texi b/doc/cmd/nncp-toss.texi index da4b3be..f3bbf65 100644 --- a/doc/cmd/nncp-toss.texi +++ b/doc/cmd/nncp-toss.texi @@ -1,4 +1,5 @@ @node nncp-toss +@pindex nncp-toss @section nncp-toss @example @@ -23,10 +24,11 @@ tells what it will do. running this command as a daemon. @option{-seen} option creates empty @file{seen/XXX} file after -successful tossing of @file{XXX} packet. @ref{nncp-xfer}, -@ref{nncp-bundle}, @ref{nncp-daemon} and @ref{nncp-call} commands skip -inbound packets that has been already seen, processed and tossed. This -is helpful to prevent duplicates. +successful tossing of @file{XXX} packet. @command{@ref{nncp-xfer}}, +@command{@ref{nncp-bundle}}, @command{@ref{nncp-daemon}} and +@command{@ref{nncp-call}} commands skip inbound packets that has been +already seen, processed and tossed. This is helpful to prevent +duplicates. @option{-nofile}, @option{-nofreq}, @option{-noexec}, @option{-notrns}, @option{-noarea} options allow disabling any kind of packet types processing. diff --git a/doc/cmd/nncp-trns.texi b/doc/cmd/nncp-trns.texi index c9b77cc..d1be039 100644 --- a/doc/cmd/nncp-trns.texi +++ b/doc/cmd/nncp-trns.texi @@ -1,4 +1,5 @@ @node nncp-trns +@pindex nncp-trns @section nncp-trns @example diff --git a/doc/cmd/nncp-xfer.texi b/doc/cmd/nncp-xfer.texi index 70edaf8..a97892a 100644 --- a/doc/cmd/nncp-xfer.texi +++ b/doc/cmd/nncp-xfer.texi @@ -1,4 +1,5 @@ @node nncp-xfer +@pindex nncp-xfer @section nncp-xfer @example @@ -20,12 +21,12 @@ remove them. @option{-rx} option tells only to move inbound packets addressed to us. @option{-tx} option tells exactly the opposite: move only outbound packets. -@ref{nncp-cfgmin} could be useful for creating stripped minimalistic -configuration file version without any private keys. +@command{@ref{nncp-cfgmin}} could be useful for creating stripped +minimalistic configuration file version without any private keys. @file{DIR} directory has the following structure: @file{RECIPIENT/SENDER/PACKET}, where @file{RECIPIENT} is Base32 encoded destination node, @file{SENDER} is Base32 encoded sender node. -Also look for @ref{nncp-bundle}, especially if you deal with CD-ROM and -tape drives. +Also look for @command{@ref{nncp-bundle}}, especially if you deal with +CD-ROM and tape drives. diff --git a/doc/comparison.ru.texi b/doc/comparison.ru.texi index 933d157..ad48377 100644 --- a/doc/comparison.ru.texi +++ b/doc/comparison.ru.texi @@ -10,28 +10,28 @@ @multitable @columnfractions 0.40 0.15 0.15 0.15 0.15 @headitem @tab UUCP @tab FTN @tab NNCP @tab SMTP -@item Простота настройки @tab Средне @tab Сложно @tab Легко @tab Сложно -@item Передача почты @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} -@item Передача новостей @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Передача файлов @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Мультвещательная передача @tab Нет @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Разбиение файлов на части @tab Нет @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Удалённое исполнение команд @tab @strong{Да} @tab Нет @tab @strong{Да} @tab Нет -@item Возобновляемое скачивание @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Приоритезация пакетов @tab @strong{Да} @tab Нет @tab @strong{Да} @tab Нет -@item Сжатие почты @tab Нет @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Интеграция с SMTP @tab @strong{Да} @tab Нет @tab @strong{Да} @tab N/A -@item Push/poll модель @tab @strong{Обе} @tab @strong{Обе} @tab @strong{Обе} @tab Push -@item DTN @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет -@item Предполагаемый размер сети @tab Дюжины @tab Глобально @tab Дюжины @tab Глобально -@item Маршрутизация @tab Ручное/статичное @tab Федеративное @tab Ручное/статичное @tab Федеративное -@item Поддержка телефонной сети @tab @strong{Да} @tab @strong{Да} @tab Возможно @tab Нет -@item Анонимные участники @tab @strong{Да} @tab Нет @tab Нет @tab @strong{Да} -@item Аутентификация участников @tab PAP @tab PAP/CHAP @tab публичный ключ @tab Нет -@item Шифрование пакетов @tab Нет @tab Нет @tab @strong{Да} @tab Нет -@item Приватность метаданных @tab Нет @tab Нет @tab @strong{Да} @tab Нет -@item Проверка целостности пакетов @tab Нет @tab Нет @tab @strong{Да} @tab Нет -@item Дружелюбность к флоппинету @tab Нет @tab Частично @tab @strong{Да} @tab Нет +@item Простота настройки @tab Средне @tab Сложно @tab Легко @tab Сложно +@item Передача почты @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} +@item Передача новостей @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Передача файлов @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Мультвещательная передача @tab Нет @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Разбиение файлов на части @tab Нет @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Удалённое исполнение команд @tab @strong{Да} @tab Нет @tab @strong{Да} @tab Нет +@item Возобновляемое скачивание @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Приоритезация пакетов @tab @strong{Да} @tab Нет @tab @strong{Да} @tab Нет +@item Сжатие почты @tab Нет @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Интеграция с SMTP @tab @strong{Да} @tab Нет @tab @strong{Да} @tab N/A +@item Push/poll модель @tab @strong{Обе} @tab @strong{Обе} @tab @strong{Обе} @tab Push +@item DTN @tab @strong{Да} @tab @strong{Да} @tab @strong{Да} @tab Нет +@item Предполагаемый размер сети @tab Дюжины @tab Глобально @tab Дюжины @tab Глобально +@item Маршрутизация @tab Ручное/статичное @tab Федеративное @tab Ручное/статичное @tab Федеративное +@item Поддержка телефонной сети @tab @strong{Да} @tab @strong{Да} @tab Возможно @tab Нет +@item Анонимные участники @tab @strong{Да} @tab Нет @tab Нет @tab @strong{Да} +@item Аутентификация участников @tab PAP @tab PAP/CHAP @tab публичный ключ @tab Нет +@item Шифрование пакетов @tab Нет @tab Нет @tab @strong{Да} @tab Нет +@item Приватность метаданных @tab Нет @tab Нет @tab @strong{Да} @tab Нет +@item Проверка целостности пакетов @tab Нет @tab Нет @tab @strong{Да} @tab Нет +@item Дружелюбность к флоппинету @tab Нет @tab Частично @tab @strong{Да} @tab Нет @end multitable diff --git a/doc/comparison.texi b/doc/comparison.texi index d4e7ec6..7d5e02f 100644 --- a/doc/comparison.texi +++ b/doc/comparison.texi @@ -1,36 +1,41 @@ @node Comparison +@cindex comparison +@cindex SMTP +@cindex FTN +@cindex FidoNet +@cindex UUCP @unnumbered Comparison with existing solutions Here is comparison with @url{https://en.wikipedia.org/wiki/UUCP, UUCP} -(Unix to Unix copy), FTN (@url{https://en.wikipedia.org/wiki/FidoNet, -FidoNet} Technology Networks) and @url{https://en.wikipedia.org/wiki/SMTP, SMTP} +(Unix to Unix copy), FTN (@url{https://en.wikipedia.org/wiki/FidoNet, FidoNet} +Technology Networks) and @url{https://en.wikipedia.org/wiki/SMTP, SMTP} (because it is also store-and-forward solution). @multitable @columnfractions 0.40 0.15 0.15 0.15 0.15 @headitem @tab UUCP @tab FTN @tab NNCP @tab SMTP -@item Ease of setup @tab Medium @tab Hard @tab Easy @tab Hard -@item Mail transmission @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} -@item News transmission @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No -@item File transmission @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No -@item Multicast transmission @tab No @tab @strong{Yes} @tab @strong{Yes} @tab No -@item Chunked files @tab No @tab @strong{Yes} @tab @strong{Yes} @tab No -@item Remote command execution @tab @strong{Yes} @tab No @tab @strong{Yes} @tab No -@item Resumable downloads @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No -@item Packets prioritizing @tab @strong{Yes} @tab No @tab @strong{Yes} @tab No -@item Mail compression @tab No @tab @strong{Yes} @tab @strong{Yes} @tab No -@item SMTP integration @tab @strong{Yes} @tab No @tab @strong{Yes} @tab N/A -@item Push/poll @tab @strong{Both} @tab @strong{Both} @tab @strong{Both} @tab Push -@item DTN @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No -@item Intended network size @tab Dozens @tab Global @tab Dozens @tab Global -@item Routing @tab Manual/static @tab Federated @tab Manual/static @tab Federated -@item PSTN support @tab @strong{Yes} @tab @strong{Yes} @tab Possible @tab No -@item Anonymous peers @tab @strong{Yes} @tab No @tab No @tab @strong{Yes} -@item Peers authentication @tab PAP @tab PAP/CHAP @tab public-key @tab No -@item Packets encryption @tab No @tab No @tab @strong{Yes} @tab No -@item Metadata privacy @tab No @tab No @tab @strong{Yes} @tab No -@item Packets integrity check @tab No @tab No @tab @strong{Yes} @tab No -@item Sneakernet friendliness @tab No @tab Partially @tab @strong{Yes} @tab No +@item Ease of setup @tab Medium @tab Hard @tab Easy @tab Hard +@item Mail transmission @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} +@item News transmission @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No +@item File transmission @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No +@item Multicast transmission @tab No @tab @strong{Yes} @tab @strong{Yes} @tab No +@item Chunked files @tab No @tab @strong{Yes} @tab @strong{Yes} @tab No +@item Remote command execution @tab @strong{Yes} @tab No @tab @strong{Yes} @tab No +@item Resumable downloads @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No +@item Packets prioritizing @tab @strong{Yes} @tab No @tab @strong{Yes} @tab No +@item Mail compression @tab No @tab @strong{Yes} @tab @strong{Yes} @tab No +@item SMTP integration @tab @strong{Yes} @tab No @tab @strong{Yes} @tab N/A +@item Push/poll @tab @strong{Both} @tab @strong{Both} @tab @strong{Both} @tab Push +@item DTN @tab @strong{Yes} @tab @strong{Yes} @tab @strong{Yes} @tab No +@item Intended network size @tab Dozens @tab Global @tab Dozens @tab Global +@item Routing @tab Manual/static @tab Federated @tab Manual/static @tab Federated +@item PSTN support @tab @strong{Yes} @tab @strong{Yes} @tab Possible @tab No +@item Anonymous peers @tab @strong{Yes} @tab No @tab No @tab @strong{Yes} +@item Peers authentication @tab PAP @tab PAP/CHAP @tab public-key @tab No +@item Packets encryption @tab No @tab No @tab @strong{Yes} @tab No +@item Metadata privacy @tab No @tab No @tab @strong{Yes} @tab No +@item Packets integrity check @tab No @tab No @tab @strong{Yes} @tab No +@item Sneakernet friendliness @tab No @tab Partially @tab @strong{Yes} @tab No @end multitable @@ -87,6 +92,7 @@ FidoNet} Technology Networks) and @url{https://en.wikipedia.org/wiki/SMTP, SMTP} UUCP and NNCP does not known nothing about routing. You have to explicitly tell how to send (what hops to use) packets to each node. +@cindex PSTN @item PSTN support UUCP and FidoNet always have been working with modems out-of-box. Only many years later they gained support for working over TCP/IP @@ -94,11 +100,15 @@ FidoNet} Technology Networks) and @url{https://en.wikipedia.org/wiki/SMTP, SMTP} TCP daemon, but nothing prohibits using of another 8-bit aware online transport. +@cindex anonymity +@cindex Sybil attack @item Anonymous peers NNCP and FTN are friend-to-friend networks exclusively. This is very secure and mitigates many possible man-in-the-middle (MitM) and @url{https://en.wikipedia.org/wiki/Sybil_attack, Sybil} attacks. +@cindex sneakernet +@cindex floppynet @item Sneakernet friendliness No one, except NNCP, supports data exchanging via removable storages likes flash drives, CD-ROMs, tapes and hard drives out-of-box. It @@ -108,6 +118,7 @@ FidoNet} Technology Networks) and @url{https://en.wikipedia.org/wiki/SMTP, SMTP} @end table +@cindex UUCP commands Also there is @url{https://changelog.complete.org/archives/10165-asynchronous-email-exim-over-nncp-or-uucp, copy of} comparable commands of UUCP and NNCP, just for the interest: @@ -115,29 +126,34 @@ comparable commands of UUCP and NNCP, just for the interest: @multitable @columnfractions 0.5 0.25 0.25 @headitem Purpose @tab UUCP @tab NNCP +@pindex uucico +@pindex uupoll +@pindex uux +@pindex uucp +@pindex uuxqt @item Connect to remote system @tab @command{uucico -s}, @command{uupoll} - @tab @command{nncp-call}, @command{nncp-caller} + @tab @command{@ref{nncp-call}}, @command{nncp-caller} @item Receive connection (pipe, daemon, etc) @tab @command{uucico} (@option{-l} or similar) - @tab @command{nncp-daemon} + @tab @command{@ref{nncp-daemon}} @item Request remote execution, @code{stdin} piped in @tab @command{uux} - @tab @command{nncp-exec} + @tab @command{@ref{nncp-exec}} @item Copy file to remote machine @tab @command{uucp} - @tab @command{nncp-file} + @tab @command{@ref{nncp-file}} @item Copy file from remote machine @tab @command{uucp} - @tab @command{nncp-freq} + @tab @command{@ref{nncp-freq}} @item Process received requests @tab @command{uuxqt} - @tab @command{nncp-toss} + @tab @command{@ref{nncp-toss}} @item Move outbound requests to dir (for USB stick, airgap, etc) @tab N/A - @tab @command{nncp-xfer} + @tab @command{@ref{nncp-xfer}} @item Create streaming package of outbound requests @tab N/A - @tab @command{nncp-bundle} + @tab @command{@ref{nncp-bundle}} @end multitable diff --git a/doc/contacts.texi b/doc/contacts.texi index 63473b8..01803d0 100644 --- a/doc/contacts.texi +++ b/doc/contacts.texi @@ -1,4 +1,8 @@ @node Contacts +@cindex contacts +@cindex maillist +@cindex IRC +@cindex Matrix @unnumbered Contacts Please send questions regarding the use of NNCP, bug reports and patches to diff --git a/doc/cronexpr.texi b/doc/cronexpr.texi index e0e4394..58ce7c8 100644 --- a/doc/cronexpr.texi +++ b/doc/cronexpr.texi @@ -1,3 +1,4 @@ +@cindex cron @anchor{CronExpr} This is copy-pasted documentation from @code{github.com/gorhill/cronexpr} library used there. @@ -5,13 +6,13 @@ This is copy-pasted documentation from @multitable @columnfractions .2 .1 .2 .5 @headitem Field name @tab Mandatory? @tab Allowed values @tab Allowed special characters -@item Seconds @tab No @tab 0-59 @tab @verb{|* / , -|} -@item Minutes @tab Yes @tab 0-59 @tab @verb{|* / , -|} -@item Hours @tab Yes @tab 0-23 @tab @verb{|* / , -|} -@item Day of month @tab Yes @tab 1-31 @tab @verb{|* / , - L W|} -@item Month @tab Yes @tab 1-12 or JAN-DEC @tab @verb{|* / , -|} -@item Day of week @tab Yes @tab 0-6 or SUN-SAT @tab @verb{|* / , - L #|} -@item Year @tab No @tab 1970–2099 @tab @verb{|* / , -|} +@item Seconds @tab No @tab 0-59 @tab @verb{|* / , -|} +@item Minutes @tab Yes @tab 0-59 @tab @verb{|* / , -|} +@item Hours @tab Yes @tab 0-23 @tab @verb{|* / , -|} +@item Day of month @tab Yes @tab 1-31 @tab @verb{|* / , - L W|} +@item Month @tab Yes @tab 1-12 or JAN-DEC @tab @verb{|* / , -|} +@item Day of week @tab Yes @tab 0-6 or SUN-SAT @tab @verb{|* / , - L #|} +@item Year @tab No @tab 1970-2099 @tab @verb{|* / , -|} @end multitable diff --git a/doc/download.texi b/doc/download.texi index 7e61492..f6c259e 100644 --- a/doc/download.texi +++ b/doc/download.texi @@ -1,4 +1,8 @@ @node Tarballs +@cindex tarball +@cindex dependency +@cindex licencing +@cindex download @section Prepared tarballs You can obtain releases source code prepared tarballs from the links below. @@ -45,6 +49,13 @@ And additional ones for Yggdrasil support: @multitable {XXXXX} {XXXX-XX-XX} {XXXX KiB} {meta4 link sig} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} @headitem Version @tab Date @tab Size @tab Tarball @tab SHA256 checksum +@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, link} + @url{download/nncp-8.5.0.tar.xz.sig, sig} +@tab @code{E8850D27 70C4FA74 5CF9B9A9 0CEEE5D6 05E50FA5 031A0813 49844C15 3E7BBFF4} + @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} diff --git a/doc/eblob.texi b/doc/eblob.texi index 3a5c08d..a7e9b8f 100644 --- a/doc/eblob.texi +++ b/doc/eblob.texi @@ -1,4 +1,6 @@ @node EBlob +@cindex eblob +@cindex encrypted configuration @unnumbered EBlob format EBlob is an encrypted blob (binary large object, in the terms of @@ -20,6 +22,9 @@ is @strong{not} the password. Password is a short string of high entropy low-entropy characters. Low-entropy text is much more easier to remember, and its length provides pretty enough entropy as a result. +@cindex password +@cindex balloon +@cindex Argon2 Password strengthening function is applied to that passphrase to mitigate brute-force and dictionary attacks on it. Here, @url{https://crypto.stanford.edu/balloon/, Balloon} memory-hard password diff --git a/doc/index.texi b/doc/index.texi index 95b8a8b..37a7ab9 100644 --- a/doc/index.texi +++ b/doc/index.texi @@ -17,15 +17,21 @@ A copy of the license is included in the section entitled "Copying conditions". @end copying @node Top +@c dummy cindex, to pass through the current info's bug, which can skip +@c the first index entry during searching +@cindex 0 @top NNCP +@cindex Pedro @verbatiminclude pedro.txt @include about.texi +@cindex articles There are also articles about its usage outside this website: @itemize +@item @url{https://www.complete.org/nncp/, Various related articles} by John Goerzen @item @url{https://habr.com/en/post/330712/, NNCP: лечение online- и цензуро- зависимости store-and-forward методом} (on russian) @item @url{https://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) @@ -60,6 +66,7 @@ There are also articles about its usage outside this website: * EBlob format: EBlob * Mirrors:: * Thanks:: +* Indices:: * Contacts and feedback: Contacts * Copying conditions: Copying @end menu @@ -89,6 +96,7 @@ There are also articles about its usage outside this website: @include eblob.texi @include mirrors.texi @include thanks.texi +@include indices.texi @include contacts.texi @node Copying diff --git a/doc/indices.texi b/doc/indices.texi new file mode 100644 index 0000000..542d4ef --- /dev/null +++ b/doc/indices.texi @@ -0,0 +1,14 @@ +@node Indices +@unnumbered Indices + +@node Concepts Index +@section Concepts Index +@printindex cp + +@node Programs Index +@section Programs Index +@printindex pg + +@node Variables Index +@section Variables Index +@printindex vr diff --git a/doc/install.texi b/doc/install.texi index 9f54d77..e948d81 100644 --- a/doc/install.texi +++ b/doc/install.texi @@ -1,19 +1,45 @@ @node Installation +@cindex installation +@cindex packages +@cindex distributions @unnumbered Installation Possibly NNCP package already exists for your distribution: @itemize -@item @url{https://www.freshports.org/net/nncp/, FreeBSD ports} + +@cindex Arch Linux +@cindex AUR +@item Arch Linux @url{https://aur.archlinux.org/packages/nncp, AUR} + +@cindex Debian +@item @url{https://tracker.debian.org/pkg/nncp, Debian packages} + +@cindex DragonFly @item @url{https://github.com/DragonFlyBSD/DPorts/tree/master/net/nncp, DragonFly BSD ports} + +@cindex FreeBSD +@item @url{https://www.freshports.org/net/nncp/, FreeBSD ports} + +@cindex Guix +@item GNU @url{https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/uucp.scm, Guix} + +@cindex NetBSD +@item @url{https://pkgsrc.se/wip/nncp, NetBSD package} + +@cindex NixOS @item @url{https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/misc/nncp, NixOS packages} + +@cindex Void Linux @item @url{https://github.com/void-linux/void-packages/blob/master/srcpkgs/nncp/template, Void Linux} -@item @url{https://tracker.debian.org/pkg/nncp, Debian packages} @end itemize +@cindex POSIX NNCP should run on any POSIX-compatible operating system. -NNCP is written on @url{https://golang.org/, Go} programming language +@pindex go +@pindex texinfo +NNCP is written on @url{https://go.dev/, Go} programming language and you have to install Go compiler 1.13+ version. @url{http://cr.yp.to/redo.html, redo} build system is recommended for convenience. @url{https://www.gnu.org/software/texinfo/, Texinfo} is diff --git a/doc/integration/bittorrent.texi b/doc/integration/bittorrent.texi index 841391e..f3136c8 100644 --- a/doc/integration/bittorrent.texi +++ b/doc/integration/bittorrent.texi @@ -1,4 +1,5 @@ @node BitTorrent +@cindex BitTorrent integration @section BitTorrent and huge files If dealing with @ref{Git}, @ref{Feeds, web feeds} and @ref{Multimedia, @@ -6,6 +7,7 @@ multimedia} goes relatively fast, then BitTorrent and huge files consumes much time. You can not wait for downloads finish, but want to queue them after. +@pindex aria2 @url{http://aria2.github.io/, aria2} multi-protocol download utility could be used for solving that issue conveniently. It supports HTTP, HTTPS, FTP, SFTP and BitTorrent protocols, together with @@ -15,6 +17,7 @@ URIs, Web-seeding, selective downloads, LPD. @command{aria2} can accelerate HTTP*/*FTP downloads by segmented multiple parallel connections. +@pindex aria2-downloaded.sh You can queue you files after they are completely downloaded. @file{aria2-downloaded.sh} contents: diff --git a/doc/integration/download.texi b/doc/integration/download.texi index c4ca2ac..df88be2 100644 --- a/doc/integration/download.texi +++ b/doc/integration/download.texi @@ -1,4 +1,7 @@ @node DownloadService +@cindex download service +@pindex warcer.sh +@pindex wgeter.sh @section Downloading service Previous sections tell about manual downloading and sending results to diff --git a/doc/integration/exim.texi b/doc/integration/exim.texi index 26472ea..70557bb 100644 --- a/doc/integration/exim.texi +++ b/doc/integration/exim.texi @@ -1,4 +1,5 @@ @node Exim +@cindex Exim integration @section Integration with Exim This section is unaltered copy-paste of @@ -17,6 +18,8 @@ eventual delivery (over the Internet, LAN, whatever). This is fairly simple in Exim. +@pindex bsmtp +@pindex rmail We actually have two choices for how to do this: @command{bsmtp} or @command{rmail} mode. bsmtp (batch SMTP) is the more modern way, and is essentially a derivative of SMTP that explicitly can be queued @@ -58,8 +61,8 @@ nncp: .endif @end example -This is pretty straightforward. We pipe to @command{nncp-exec}, run it -as the nncp user. @command{nncp-exec} sends it to a target node and runs +This is pretty straightforward. We pipe to @command{@ref{nncp-exec}}, run it +as the nncp user. @command{@ref{nncp-exec}} sends it to a target node and runs whatever that node has called @command{rsmtp} (the command to receive bsmtp data). When the target node processes the request, it will run the configured command and pipe the data in to it. @@ -96,6 +99,7 @@ exec: @{ The @option{-bS} option is what tells Exim to receive BSMTP on @code{stdin}. +@vindex MAIN_TRUSTED_USERS Now, you need to tell Exim that nncp is a trusted user (able to set From headers arbitrarily). Assuming you are running NNCP as the @code{nncp} user, then add @code{MAIN_TRUSTED_USERS = nncp} to a file such as diff --git a/doc/integration/feeds.texi b/doc/integration/feeds.texi index 27a25c1..33e210c 100644 --- a/doc/integration/feeds.texi +++ b/doc/integration/feeds.texi @@ -1,6 +1,10 @@ @node Feeds +@cindex Web feeds integration +@cindex RSS feeds integration +@cindex Atom feeds integration @section Integration with Web feeds +@pindex r2e RSS and Atom feeds could be collected using @url{https://github.com/wking/rss2email, rss2email} program. It converts all incoming feed entries to email messages. Read about how to integrate @@ -18,7 +22,7 @@ $ r2e new rss-robot@@address.com and add feeds you want to retrieve: @example -$ r2e add http://www.git.cypherpunks.ru/?p=nncp.git;a=atom +$ r2e add http://www.nncpgo.org/download/releases.atom @end example and run the process: @@ -26,3 +30,20 @@ and run the process: @example $ r2e run @end example + +@pindex feeder +But it is more flexible and advisable to use use +@url{https://www.feeder.stargrave.org/, feeder} (NNCP's author creation) +that also transforms feed entries to Maildir email messages. Incoming +entries are placed in @file{new/} Maildir directories, so you can easily +send all of them: + +@example +% tar cf - **/new/*(.) | zstdmt | nncp-file - remote.node:feeds-`date -Iseconds`.tar.zst +% feeder/dir/contrib/feeds-oldenize.zsh +@end example + +Unlike @command{r2e}, @command{feeder} has also +@url{http://www.feeder.stargrave.org/Enclosures.html, enclosures} and +@url{http://www.feeder.stargrave.org/WARCs.html, WARCs} downloading +capabilities, that are also stored as a files on the disk. diff --git a/doc/integration/freqindex.texi b/doc/integration/freqindex.texi index cec8463..68f5e27 100644 --- a/doc/integration/freqindex.texi +++ b/doc/integration/freqindex.texi @@ -1,4 +1,5 @@ @node FreqIndex +@cindex index files @section Index files for freqing In many cases you do not know exact files list on remote machine you diff --git a/doc/integration/git.texi b/doc/integration/git.texi index a159cf8..66ae5b4 100644 --- a/doc/integration/git.texi +++ b/doc/integration/git.texi @@ -1,4 +1,6 @@ @node Git +@cindex git integration +@pindex git-bundle @section Integration with Git @url{https://git-scm.com/, Git} version control system already has all diff --git a/doc/integration/index.texi b/doc/integration/index.texi index 315868b..885bacf 100644 --- a/doc/integration/index.texi +++ b/doc/integration/index.texi @@ -1,4 +1,5 @@ @node Integration +@cindex integration with existing software @unnumbered Integration with existing software Here is some examples of how you can solve popular tasks with NNCP, diff --git a/doc/integration/multimedia.texi b/doc/integration/multimedia.texi index bcdfb7b..20ed06c 100644 --- a/doc/integration/multimedia.texi +++ b/doc/integration/multimedia.texi @@ -1,16 +1,19 @@ @node Multimedia +@cindex multimedia integration +@cindex pindex youtube-dl +@cindex pindex yt-dlp +@cindex cindex YouTube @section Integration with multimedia streaming Many video and audio streams could be downloaded using -@url{http://yt-dl.org/, youtube-dl} program. -@url{https://rg3.github.io/youtube-dl/supportedsites.html, Look} how +@url{https://github.com/yt-dlp/yt-dlp, yt-dlp} program. +@url{https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md, Look} how many of them are supported, including @emph{Dailymotion}, @emph{Vimeo} and @emph{YouTube}. -When you multimedia becomes an ordinary file, you can transfer it easily. +When your multimedia becomes an ordinary file, you can transfer it easily. @example -$ youtube-dl \ - --exec 'nncp-file @{@} remote.node:' \ +$ yt-dlp --exec 'nncp-file @{@} remote.node:' \ 'https://www.youtube.com/watch?list=PLd2Cw8x5CytxPAEBwzilrhQUHt_UN10FJ' @end example diff --git a/doc/integration/postfix.texi b/doc/integration/postfix.texi index f02dca0..3ad4807 100644 --- a/doc/integration/postfix.texi +++ b/doc/integration/postfix.texi @@ -1,4 +1,6 @@ @node Postfix +@cindex Postfix integration +@pindex postfix @section Integration with Postfix This section is taken from @url{http://www.postfix.org/UUCP_README.html, @@ -12,9 +14,9 @@ mail to a LAN that is connected via NNCP. @itemize -@item You need an @ref{nncp-exec} program that extracts the sender -address from mail that arrives via NNCP, and that feeds the mail into -the Postfix @command{sendmail} command. +@item You need an @command{@ref{nncp-exec}} program that extracts the +sender address from mail that arrives via NNCP, and that feeds the mail +into the Postfix @command{sendmail} command. @item Define a @command{pipe(8)} based mail delivery transport for delivery via NNCP: @@ -24,13 +26,16 @@ nncp unix - n n - - pipe flags=Rqhu user=nncp argv=nncp-exec -quiet $nexthop sendmail $recipient @end example -This runs the @command{nncp-exec} command to place outgoing mail into +This runs the @command{@ref{nncp-exec}} command to place outgoing mail into the NNCP queue after replacing @var{$nexthop} by the receiving NNCP node and after replacing @var{$recipient} by the recipients. The -@command{pipe(8)} delivery agent executes the @command{nncp-exec} +@command{pipe(8)} delivery agent executes the @command{@ref{nncp-exec}} command without assistance from the shell, so there are no problems with shell meta characters in command-line parameters. +@pindex sendmail.sh +@vindex Return-Path +@pindex reformail Pay attention to @code{flags}, containing @code{R}, telling Postfix to include @code{Return-Path:} header. Otherwise that envelope sender information may be lost. Possibly you will also need somehow to @@ -42,6 +47,9 @@ extract with: @verbatiminclude sendmail.sh +@vindex From_ +@cindex mbox +@pindex maildrop Also pay attention that @command{maildrop} does not like @code{From_} mbox-style header, so you possibly want: @@ -92,9 +100,9 @@ Here is how to relay mail from a LAN via NNCP to the Internet. @itemize -@item You need an @ref{nncp-exec} program that extracts the sender -address from mail that arrives via NNCP, and that feeds the mail into -the Postfix @command{sendmail} command. +@item You need an @command{@ref{nncp-exec}} program that extracts the +sender address from mail that arrives via NNCP, and that feeds the mail +into the Postfix @command{sendmail} command. @item Specify that all remote mail must be sent via the @command{nncp} mail transport to your NNCP gateway host, say, @emph{nncp-gateway}: @@ -121,10 +129,10 @@ nncp unix - n n - - pipe flags=Fqhu user=nncp argv=nncp-exec -quiet $nexthop sendmail $recipient @end example -This runs the @command{nncp-exec} command to place outgoing mail into +This runs the @command{@ref{nncp-exec}} command to place outgoing mail into the NNCP queue. It substitutes the hostname (@emph{nncp-gateway}, or whatever you specified) and the recipients before execution of the -command. The @command{nncp-exec} command is executed without assistance +command. The @command{@ref{nncp-exec}} command is executed without assistance from the shell, so there are no problems with shell meta characters. @item Execute the command @command{postfix reload} to make the changes diff --git a/doc/integration/ppp.texi b/doc/integration/ppp.texi index e274cd1..e18dda7 100644 --- a/doc/integration/ppp.texi +++ b/doc/integration/ppp.texi @@ -1,12 +1,15 @@ @node PPP +@cindex PPP +@cindex serial link +@cindex serial connection @section Serial connection -It is not trivial to run online @command{nncp-daemon}, -@command{nncp-call} and @command{nncp-caller} commands over the serial -link, because it is link without built-in error detection. For efficient -usage you have to use some kind of window-sliding error correction -protocol, like Kermit, ZMODEM, UUCP's g-protocol and similar well known -ones. +It is not trivial to run online @command{@ref{nncp-daemon}}, +@command{@ref{nncp-call}} and @command{@ref{nncp-caller}} commands over +the serial link, because it is link without built-in error detection. +For efficient usage you have to use some kind of window-sliding error +correction protocol, like Kermit, ZMODEM, UUCP's g-protocol and similar +well known ones. However TCP is already satisfying and existing protocol for the same purposes. So it would be more easier to bring up the IP interconnection diff --git a/doc/integration/warc.texi b/doc/integration/warc.texi index 361967c..4c58729 100644 --- a/doc/integration/warc.texi +++ b/doc/integration/warc.texi @@ -1,4 +1,6 @@ @node WARCs +@cindex WARC +@pindex wget @section Integration with Web pages Simple HTML web page can be downloaded very easily for sending and @@ -62,6 +64,7 @@ $ wget [--page-requisites] [--recursive] \ [@dots{}] http://www.example.com/ @end example +@pindex tofuproxy That command will create @file{www.example.com-XXX.warc} web archive. It could produce specialized segmented @url{https://en.wikipedia.org/wiki/Gzip, gzip} and diff --git a/doc/integrity.texi b/doc/integrity.texi index 171cdc1..7ece02c 100644 --- a/doc/integrity.texi +++ b/doc/integrity.texi @@ -1,4 +1,10 @@ @node Integrity +@cindex integrity check +@cindex authenticity check +@cindex OpenPGP +@cindex gpg +@cindex GnuPG +@cindex WKD @section Tarballs integrity check You @strong{have to} check downloaded archives integrity and verify diff --git a/doc/log.texi b/doc/log.texi index 74a8c6d..8d3d137 100644 --- a/doc/log.texi +++ b/doc/log.texi @@ -1,10 +1,14 @@ @node Log +@cindex log format +@cindex logging +@cindex recfile +@pindex recutils @unnumbered Log format Log is a plaintext file consisting of @url{https://www.gnu.org/software/recutils/, recfile} records. It can be -read by human, but it is better to use either @ref{nncp-log}, or -@command{recutils} utilities for selecting and formatting the required +read by human, but it is better to use either @command{@ref{nncp-log}}, +or @command{recutils} utilities for selecting and formatting the required fields. Two example records from it: diff --git a/doc/mcd.texi b/doc/mcd.texi index 958e0fe..a161f03 100644 --- a/doc/mcd.texi +++ b/doc/mcd.texi @@ -1,4 +1,6 @@ @node MCD +@cindex MCD +@cindex multicast discovery @unnumbered MultiCast Discovery MCD is an addition to online @ref{Sync, synchronization protocol}, that @@ -7,10 +9,11 @@ in local area network. It is very simple: @itemize @item - @ref{nncp-daemon} sends multicast messages about its presence from - time to time. See @ref{CfgMCDSend, mcd-send} configuration option. + @command{@ref{nncp-daemon}} sends multicast messages about its + presence from time to time. See @ref{CfgMCDSend, mcd-send} + configuration option. @item - When @ref{nncp-caller} sees them, it adds them as the most + When @command{@ref{nncp-caller}} sees them, it adds them as the most preferred addresses to already known ones. If MCD address announcement was not refreshed after two minutes -- it is removed. See @ref{CfgMCDListen, mcd-listen} and @@ -30,5 +33,5 @@ identifier of the node. It is sent as UDP packet on IPv6 @strong{@verb{|ff02::4e4e:4350|}} (hexadecimal ASCII @verb{|NNCP|}) multicast address and @strong{5400} port. Operating system will use IPv6 link-local address as a source one, with the port taken from -@command{nncp-daemon}'s @option{-bind} option. That way, IP packet +@command{@ref{nncp-daemon}}'s @option{-bind} option. That way, IP packet itself will carry the link-scope reachable address of the daemon. diff --git a/doc/mirrors.texi b/doc/mirrors.texi index c809260..315543a 100644 --- a/doc/mirrors.texi +++ b/doc/mirrors.texi @@ -1,4 +1,5 @@ @node Mirrors +@cindex mirror @unnumbered Mirrors Main NNCP website is hosted on two geographically distant servers @@ -7,8 +8,11 @@ connectivity is provided by Hurricane Electric tunnel broker. Only one of those servers supports TLS and another just proxies the traffic to it. So TLS-capable version has less availability. +@cindex DANE +@cindex DNSCurve +@cindex ca.cypherpunks.ru It can be authenticated with -@url{http://ca.cypherpunks.ru/, ca.cypherpunks.ru} certificate, through the +@url{http://www.ca.cypherpunks.ru/, ca.cypherpunks.ru} certificate, through the @url{https://datatracker.ietf.org/doc/html/rfc6698, DANE} record, that in turn can be authenticated with @url{https://dnscurve.org/, DNSCurve}-secured @@ -18,8 +22,12 @@ signed with @code{CF60 E89A 5923 1E76 E263 6422 AE1A 8109 E498 57EF} @url{https://en.wikipedia.org/wiki/OpenPGP, OpenPGP} @url{http://www.stargrave.org/Contacts.html, public key}. +Also there is @url{https://yggdrasil-network.github.io/, Yggdrasil} +accessible address: @url{http://y.www.nncpgo.org/}. + @table @asis +@cindex quux.org @item @url{https://nncp.mirrors.quux.org/} Its creation @url{http://lists.cypherpunks.ru/archive/nncp-devel/2108/0310.html, announcement}. diff --git a/doc/mth.texi b/doc/mth.texi index 72a38d9..5e8b75c 100644 --- a/doc/mth.texi +++ b/doc/mth.texi @@ -1,4 +1,8 @@ @node MTH +@cindex MTH +@cindex hashing +@cindex merkle tree +@cindex BLAKE3 @unnumbered Merkle Tree Hashing NNCP uses @url{https://github.com/BLAKE3-team/BLAKE3, BLAKE3} hash diff --git a/doc/multicast.texi b/doc/multicast.texi index fbb31ad..1c8913f 100644 --- a/doc/multicast.texi +++ b/doc/multicast.texi @@ -1,4 +1,5 @@ @node Multicast +@cindex multicast area @unnumbered Multicast areas NNCP has ability to multicast packets: send single packet to multiple @@ -10,7 +11,8 @@ networks). Each multicast group is identified by so-called @strong{area}. Area consists of private/public Curve25519 keypairs for @ref{Encrypted area, packets encryption}, identity (BLAKE2b-256 hash of the public key) and -possible subscribers. Areas are created with @ref{nncp-cfgnew} command. +possible subscribers. Areas are created with @command{@ref{nncp-cfgnew}} +command. You can make either file or exec transmissions to the areas. Those ordinary file/exec packets are double wrapped in: @@ -23,6 +25,7 @@ that encrypted packet to the others) can should it to the subscribers further @end itemize +@vindex MsgHash Area's message identity (@code{MsgHash}) is the hash of the encrypted packet header. Because the area packet, containing the encrypted packet, is relayed as-is without any modifications, that area message's hash @@ -106,13 +109,13 @@ $ nncp-toss -node self @enumerate @item -@command{nncp-file} creates an encrypted packet with area packet and +@command{@ref{nncp-file}} creates an encrypted packet with area packet and encrypted packet inside it, with our own @code{self} node as a recipient (in the @file{SPOOL/SELF/tx} directory). It also creates the @file{SPOOL/SELF/area/AREA/MsgHash} file. @item -@command{nncp-toss} sees @file{tx/} file and "opens" it, applying the +@command{@ref{nncp-toss}} sees @file{tx/} file and "opens" it, applying the area message tossing procedure as described above. That will create outgoing packets in @file{SPOOL/nodeB/tx} and @file{SPOOL/nodeD/tx} directories with @file{SPOOL/nodeB/area/AREA/MsgHash} diff --git a/doc/news.ru.texi b/doc/news.ru.texi index 161708e..eae883a 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -1,6 +1,33 @@ @node Новости @section Новости +@node Релиз 8.6.0 +@subsection Релиз 8.6.0 +@itemize + +@item +@command{nncp-xfer} проверяет сходится ли контрольная сумма +скопированного локально пакета и исходного. + +@item +@command{nncp-call} имеет плохой код возврата если в очередях на приём и +отправку остаются незаконченные задания. + +@item +Появилась @command{nncp-ack} команда, которая отправляет явное +подтверждение доставки пакета (ACK пакет). Это подтверждение удаляет +упомянутый пакет из исходящего spool-а. + +@item +Появилась возможность отключения @code{fsync} операции +@env{$NNCPNOSYNC=1} переменной окружения. + +@item +Добавлены разнообразные индексы в документации, что должно помочь при +поиске в ней. + +@end itemize + @node Релиз 8.5.0 @subsection Релиз 8.5.0 @itemize @@ -61,7 +88,7 @@ Yggdrasil использует IPv6+TCP сетевой стэк написанн качестве обычного TCP сервера внутри overlay сети. @item -Конфигурационные строки Yggdrasil вида @code{prv;bind1,bind2;pub...} +Конфигурационные строки Yggdrasil вида @code{prv;bind1,bind2;pub@dots{}} заменены на URL-подобные (@code{yggdrasils://PRV?bind=BIND1&bind=BIND2&pub=PUB}). @item @@ -303,7 +330,7 @@ NNCP собирается на NetBSD. @itemize @item -Исправлено падение при fsync директорий после создания @file{.seen} файлов. +Исправлено падение при @code{fsync} директорий после создания @file{.seen} файлов. @end itemize @@ -717,7 +744,7 @@ SP протокол порождает меньше вызовов записе невозможности online аутентификации нод. @item -Явная синхронизация (fsync) директорий для гарантированного +Явная синхронизация (@code{fsync}) директорий для гарантированного переименования файлов. @end itemize @@ -927,8 +954,8 @@ pipe вызов сторонней команды. нужно использовать @verb{|nncp-exec NODE sendmail RECIPIENT|}. @item @option{sendmail} опция конфигурационного файла заменена на более гибкую - @option{exec}. @verb{|sendmail: [...]|} нужно заменить на @verb{|exec: - sendmail: [...]|}. + @option{exec}. @code{sendmail: [@dots{}]} нужно заменить на + @code{exec: sendmail: [@dots{}]}. @end itemize @item diff --git a/doc/news.texi b/doc/news.texi index 09b21bc..884a91e 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -1,8 +1,34 @@ @node News +@cindex news @unnumbered News See also this page @ref{Новости, on russian}. +@node Release 8_6_0 +@section Release 8.6.0 +@itemize + +@item +@command{nncp-xfer} checks if locally copied packet's checksum differs +from the source's one. + +@item +@command{nncp-call} has bad return code if its queues contain unfinished jobs. + +@item +@command{nncp-ack} command appeared, that sends explicit packet receipt +acknowledgement (ACK packet). That acknowledgement deletes referenced +packet from the outbound spool. + +@item +Ability to turn @code{fsync} operation off using @env{$NNCPNOSYNC=1} +environment variable. + +@item +Added various indices in documentation, that should help searching in it. + +@end itemize + @node Release 8_5_0 @section Release 8.5.0 @itemize @@ -62,7 +88,7 @@ transport protocol, making it able to work as an ordinary TCP server inside overlay network. @item -Yggdrasil's @code{prv;bind1,bind2;pub...}-like configuration strings are +Yggdrasil's @code{prv;bind1,bind2;pub@dots{}}-like configuration strings are replaced with URL-like ones (@code{yggdrasils://PRV?bind=BIND1&bind=BIND2&pub=PUB}). @item @@ -297,7 +323,7 @@ command. @itemize @item -Fixed failing directories fsync after @file{.seen} file creation. +Fixed failing directories @code{fsync} after @file{.seen} file creation. @end itemize @@ -699,7 +725,7 @@ Bugfix: private and public Noise keys were swapped in newly created configuration files, that lead to inability to authenticate online peers. @item -Explicit directories fsync-ing for guaranteed files renaming. +Explicit directories @code{fsync}-ing for guaranteed files renaming. @end itemize @@ -901,8 +927,8 @@ option in configuration file and using @command{nncp-exec} command: you must use @verb{|nncp-exec NODE sendmail RECIPIENT|}. @item @option{sendmail} configuration file option is replaced with - @option{exec}. @verb{|sendmail: [...]|} must be replaced with - @verb{|exec: sendmail: [...]|}. + @option{exec}. @code{sendmail: [@dots{}]} must be replaced with + @code{exec: sendmail: [@dots{}]}. @end itemize @item diff --git a/doc/niceness.texi b/doc/niceness.texi index 4686c09..3550c9e 100644 --- a/doc/niceness.texi +++ b/doc/niceness.texi @@ -1,4 +1,6 @@ @node Niceness +@cindex niceness +@cindex priority @unnumbered Niceness Each transmitted packet has niceness level, as Unix has @command{nice} @@ -10,20 +12,25 @@ Send big files with higher nice level! That will guarantee you that higher priority packets, like mail messages, will pass first, even when lower priority packet was already been partially downloaded. -There are default niceness levels built-in for @ref{nncp-exec}, -@ref{nncp-file} and @ref{nncp-freq} commands. But pay attention that it -can give information about underlying payload to the adversary! +There are default niceness levels built-in for +@command{@ref{nncp-exec}}, @command{@ref{nncp-file}} and +@command{@ref{nncp-freq}} commands. But pay attention that it can give +information about underlying payload to the adversary! There are 1-255 niceness levels. They could be specified either as integer, or using aliases with delta modifiers: @table @emph +@vindex FLASH @item FLASH (F) Urgent priority. +@vindex PRIORITY @item PRIORITY (P) High priority. Command execution/mail use that priority by default. +@vindex NORMAL @item NORMAL (N) Normal priority. File requests use that priority by default. +@vindex BULK @item BULK (B) Bundles shipped on a "least effort" basis. File transmission use that priority by default. diff --git a/doc/pkt/area.texi b/doc/pkt/area.texi index 172c09c..1073ca6 100644 --- a/doc/pkt/area.texi +++ b/doc/pkt/area.texi @@ -1,4 +1,5 @@ @node Encrypted area +@cindex encrypted area packet @section Encrypted area packet @ref{Multicast} area messages contains the encrypted packet, that is diff --git a/doc/pkt/encrypted.texi b/doc/pkt/encrypted.texi index 7b8ed21..ead9478 100644 --- a/doc/pkt/encrypted.texi +++ b/doc/pkt/encrypted.texi @@ -1,4 +1,7 @@ @node Encrypted +@cindex encrypted packet +@cindex AEAD +@cindex ChaCha20-Poly1305 @section Encrypted packet Encrypted packets are the only files found in spools, in exchangeable diff --git a/doc/pkt/index.texi b/doc/pkt/index.texi index f19d1ca..8dba7bc 100644 --- a/doc/pkt/index.texi +++ b/doc/pkt/index.texi @@ -1,4 +1,6 @@ @node Packet +@cindex packet format +@cindex XDR @unnumbered Packet format All packets are diff --git a/doc/pkt/plain.texi b/doc/pkt/plain.texi index 46d66ea..235b813 100644 --- a/doc/pkt/plain.texi +++ b/doc/pkt/plain.texi @@ -1,4 +1,5 @@ @node Plain +@cindex plain packet @section Plain packet Plain packet contains either the whole file, or file request (freq), or @@ -27,6 +28,7 @@ drive. @item trns (transition) @item exec-fat (uncompressed exec) @item area (@ref{Multicast, multicast} area message) + @item ack (receipt acknowledgement) @end enumerate @item Niceness @tab unsigned integer @tab @@ -43,6 +45,7 @@ drive. @item UTF-8 encoded, zero byte separated, exec's arguments @item Node's id the transition packet must be relayed on @item Multicast area's id + @item Packet's id (its @ref{MTH} hash) @end itemize @end multitable @@ -61,6 +64,7 @@ Depending on the packet's type, payload could store: compressed exec body @item Whole encrypted packet we need to relay on @item Multicast area message wrap with another encrypted packet inside +@item Nothing, if it is acknowledgement packet @end itemize Also depending on packet's type, niceness level means: @@ -141,4 +145,15 @@ So plain packets can hold following paths and payloads: @end example See also @ref{Encrypted area, encrypted area packet}. +@item ack +@example + +------- PATH --------+ + / \ ++-------------------------+ +| PKT ID | 0x00 ... 0x00 | ++-------------------------+ + \ / + PATHLEN +@end example + @end table diff --git a/doc/sources.texi b/doc/sources.texi index 9ff82a9..474d27c 100644 --- a/doc/sources.texi +++ b/doc/sources.texi @@ -1,4 +1,7 @@ @node Sources +@cindex sources +@cindex source code +@cindex git @section Development source code Development source code contains the latest version of the code. It may @@ -10,4 +13,7 @@ to use @ref{Tarballs, tarballs} instead. $ git clone --branch develop git://git.cypherpunks.ru/nncp.git nncp @end example -You can also use @url{https://git.cypherpunks.ru/nncp.git}. +You can also use +@url{https://git.cypherpunks.ru/nncp.git}, +@url{http://git.cypherpunks.ru/nncp.git}, +@url{http://y.git.cypherpunks.ru/nncp.git} URLs instead. diff --git a/doc/sp.texi b/doc/sp.texi index e7f4895..36f5cc7 100644 --- a/doc/sp.texi +++ b/doc/sp.texi @@ -1,10 +1,14 @@ @node Sync +@cindex sync protocol +@cindex online protocol +@cindex synchronization @unnumbered Synchronization protocol So-called synchronization protocol (SP) is used in current TCP daemon's implementation. It is used for synchronizing @ref{Spool, spool} directory contents between two nodes. +@cindex XMODEM It is aimed to be very simple and effective. It uses reliable transport like TCP connections. It must be effective both on single-duplex and full-duplex links: for example satellites have very high throughput but @@ -12,11 +16,13 @@ high-delay links, so acknowledging of each received packet, like @url{https://en.wikipedia.org/wiki/XMODEM, XMODEM} does, causes unacceptable performance degradation. +@vindex NNCPDEADLINE Internally it uses various timeouts and deadlines. One of them used extensively is 10 seconds default deadline timeout. You can override it with @env{$NNCPDEADLINE} environment variable, that could be useful with very high delay links. +@cindex Noise-IK SP works on top of @url{http://noiseprotocol.org/noise.html#interactive-patterns, @code{Noise_IK_25519_ChaChaPoly_BLAKE2b}} protocol. Each Noise packet @@ -54,6 +60,7 @@ just an unsigned integer telling what body structure follows. @table @emph +@cindex HALT payload @item HALT Stop file transmission, empty sending queue on the remote side. Actually @emph{HALT} packet does not have any body, only the header @@ -66,6 +73,7 @@ just an unsigned integer telling what body structure follows. +------+ @end verbatim +@cindex PING payload @item PING Dummy packet only used for determining workability of the connection. @@ -75,6 +83,7 @@ just an unsigned integer telling what body structure follows. +------+ @end verbatim +@cindex INFO payload @item INFO Information about the file we have for transmission. @@ -97,6 +106,7 @@ just an unsigned integer telling what body structure follows. Unique file identifier, its checksum @end multitable +@cindex FREQ payload @item FREQ File transmission request. Ask remote side to queue the file for transmission. @@ -117,6 +127,7 @@ just an unsigned integer telling what body structure follows. Offset from which remote side must transmit the file @end multitable +@cindex FILE payload @item FILE Chunk of file. @@ -139,6 +150,7 @@ just an unsigned integer telling what body structure follows. Chunk of file itself @end multitable +@cindex DONE payload @item DONE Signal remote side that we have successfully downloaded the file. diff --git a/doc/spool.texi b/doc/spool.texi index 61ec8c3..c7ddb31 100644 --- a/doc/spool.texi +++ b/doc/spool.texi @@ -1,4 +1,5 @@ @node Spool +@cindex spool directory @unnumbered Spool directory Spool directory holds @ref{Encrypted, encrypted packets} received from @@ -18,6 +19,7 @@ spool/tmp @table @file +@cindex tmp directory @item tmp directory contains various temporary files that under normal circumstances are renamed to necessary files inside other directories. @@ -27,10 +29,13 @@ filesystem for working renaming. @item 2WHBV3TPZHDOZGUJEH563ZEK7M33J4UESRFO4PDKWD5KZNPROABQ is an example Base32-encoded neighbour identifier. +@cindex rx directory +@cindex tx directory @item rx, tx directories are for incoming and outgoing encrypted packets. @file{rx} contains currently unfinished, non-checked, unprocessed, etc packets. +@cindex lock files @item toss.lock, rx.lock, tx.lock Lock files. Only single process can work with @file{rx}/@file{tx} directories at once. @@ -40,39 +45,43 @@ is an example @ref{Encrypted, encrypted packet}. Its filename is Base32 encoded @ref{MTH} hash of the whole contents. It can be integrity checked anytime. +@cindex part files @item LYT64MWSNDK34CVYOO7TA6ZCJ3NWI2OUDBBMX2A4QWF34FIRY4DQ.part is an example @strong{partly} received file. It can appear only when online transfer is used. Its filename is sent by remote side and until file is fully downloaded -- it plays no role. +@cindex nock files @item LYT64MWSNDK34CVYOO7TA6ZCJ3NWI2OUDBBMX2A4QWF34FIRY4DQ.nock non-checksummed (NoCK) @strong{fully} received file. Its checksum is -verified against its filename either by @ref{nncp-check}, or by working -online daemons. If it is correct, then its extension is trimmed. +verified against its filename either by @command{@ref{nncp-check}}, or +by working online daemons. If it is correct, then its extension is trimmed. +@cindex seen files @item seen/LYT64MWSNDK34CVYOO7TA6ZCJ3NWI2OUDBBMX2A4QWF34FIRY4DQ -@ref{nncp-toss} utility can be invoked with @option{-seen} option, -leading to creation of @file{seen/} files, telling that the file with -specified hash has already been processed before. It could be useful -when there are use-cases where multiple ways of packets transfer +@command{@ref{nncp-toss}} utility can be invoked with @option{-seen} +option, leading to creation of @file{seen/} files, telling that the file +with specified hash has already been processed before. It could be +useful when there are use-cases where multiple ways of packets transfer available and there is possibility of duplicates reception. You have to manually remove them, when you do not need them (probably because they are expired). +@cindex hdr files @anchor{HdrFile} @item hdr/LYT64MWSNDK34CVYOO7TA6ZCJ3NWI2OUDBBMX2A4QWF34FIRY4DQ If no @ref{CfgNoHdr, nohdr} option is enabled in configuration file, then @file{hdr/} files are automatically created for every ordinary (fully received and checksummed) packet. It literally contains just the header of the corresponding packet. It will be automatically created -even during simple @ref{nncp-stat} call. On filesystems with big -blocksize (ZFS for example) it can greatly help listing the packets in -directories, because it prevents unnecessary read-amplification. On +even during simple @command{@ref{nncp-stat}} call. On filesystems with +big blocksize (ZFS for example) it can greatly help listing the packets +in directories, because it prevents unnecessary read-amplification. On other filesystems probably it won't help at all, or even harm performance. There is a hack: you can create more dense @file{hdr/} allocation by -removing all @file{hdr/} files and then running @command{nncp-stat}, +removing all @file{hdr/} files and then running @command{@ref{nncp-stat}}, that will recreate them. In many cases many @file{hdr/} files will be allocated more or less linearly on the disk, decreasing listing time even more. diff --git a/doc/thanks.texi b/doc/thanks.texi index 12592bc..b682d92 100644 --- a/doc/thanks.texi +++ b/doc/thanks.texi @@ -1,4 +1,5 @@ @node Thanks +@cindex thanks @unnumbered Thanks There are people deserving to be thanked for helping this project: diff --git a/doc/usecases.ru/airgap.texi b/doc/usecases.ru/airgap.texi index a6591d6..06b1b32 100644 --- a/doc/usecases.ru/airgap.texi +++ b/doc/usecases.ru/airgap.texi @@ -37,7 +37,7 @@ neigh: { @emph{bob-airgap} доступен путём посылки промежуточного ретранслируемого пакета через узел @emph{bob}. -Любая команда типа @command{nncp-file myfile bob-airgap:} автоматически +Любая команда типа @command{@ref{nncp-file} myfile bob-airgap:} автоматически создаст инкапсулированный пакет: один непосредственно для целевой точки, а другой несущий его для промежуточного узла. @@ -45,5 +45,4 @@ neigh: { пакете, кроме его полного размера и приоритета. Все промежуточные пакеты тоже зашифрованы: используя хорошо известную технологию @url{https://ru.wikipedia.org/wiki/%D0%9B%D1%83%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F, -луковой маршрутизации}. @emph{bob} не может прочитать пакеты -@emph{bob-airgap}. +луковичного шифрования}. @emph{bob} не может прочитать пакеты @emph{bob-airgap}. diff --git a/doc/usecases.ru/caller.texi b/doc/usecases.ru/caller.texi index af80359..898e31c 100644 --- a/doc/usecases.ru/caller.texi +++ b/doc/usecases.ru/caller.texi @@ -8,7 +8,8 @@ хотите проходить любому трафику когда узел доступен через ЛВС (LAN). Вы легко можете настроить ваши предпочтения в @ref{Call, настройках -звонков} для @ref{nncp-caller} команды, используемой при online связи. +звонков} для @command{@ref{nncp-caller}} команды, используемой при +online связи. @verbatim neigh: { diff --git a/doc/usecases.ru/mail.texi b/doc/usecases.ru/mail.texi index 48a3474..8e64cc6 100644 --- a/doc/usecases.ru/mail.texi +++ b/doc/usecases.ru/mail.texi @@ -19,7 +19,7 @@ Postfix}/@url{http://www.exim.org/, Exim} SMTP сервер подключённ KISS}! Просто скажите вашим обоим Postfix/Exim-ам (на сервере и ноутбуке) -отправлять сообщения через NNCP (@ref{nncp-exec}) на заданный узел. +отправлять сообщения через NNCP (@command{@ref{nncp-exec}}) на заданный узел. Более подробно читайте для Postfix @ref{Postfix, здесь}, а для Exim @ref{Exim, здесь}. Вся почта будет сохранятся в NNCP @ref{Spool, спуле}, который после обмена данных и распаковки вызовет локальный diff --git a/doc/usecases.ru/nolink.texi b/doc/usecases.ru/nolink.texi index bacc7c0..a74b461 100644 --- a/doc/usecases.ru/nolink.texi +++ b/doc/usecases.ru/nolink.texi @@ -8,7 +8,7 @@ Представьте, что вы послали два файла узлу @emph{bob}. Вставьте USB устройство (SD гораздо предпочтительнее!) хранения, подмонтируйте и -запустите @ref{nncp-xfer}: +запустите @command{@ref{nncp-xfer}}: @example $ nncp-xfer -node bob /media/usbstick @@ -35,5 +35,8 @@ $ nncp-xfer /media/usbstick @end example чтобы найти все пакеты относящиеся к их узлу и локально скопируют для -дальнейшей обработки. @command{nncp-xfer} это единственная команда +дальнейшей обработки. @command{@ref{nncp-xfer}} это единственная команда используемая с переносными устройствами хранения. + +Вы также можете опционально использовать явное подтверждение приёма +пакетов, как описано в @command{@ref{nncp-ack}}. diff --git a/doc/usecases.ru/pop.texi b/doc/usecases.ru/pop.texi index 98a9312..d8ce1fc 100644 --- a/doc/usecases.ru/pop.texi +++ b/doc/usecases.ru/pop.texi @@ -1,9 +1,10 @@ @node UsecasePOPRU @subsection Легковесная и быстрая замена POP3/IMAP4 -@ref{nncp-daemon} может быть соединён с @ref{nncp-caller} длительное -время -- он создаёт TCP соединение на многие часы. Когда SMTP сервер -получает письмо, то вызывает @ref{nncp-exec} для создания исходящего +@command{@ref{nncp-daemon}} может быть соединён с +@command{@ref{nncp-caller}} длительное время -- он создаёт TCP +соединение на многие часы. Когда SMTP сервер получает письмо, то +вызывает @command{@ref{nncp-exec}} для создания исходящего зашифрованного пакета. Демон ежесекундно проверяет исходящую директорию и сразу же посылает оповещение о недоставленных пакетах противоположной стороне, которая сразу же их может скачать. diff --git a/doc/usecases.ru/spy.texi b/doc/usecases.ru/spy.texi index a81035b..90cecc1 100644 --- a/doc/usecases.ru/spy.texi +++ b/doc/usecases.ru/spy.texi @@ -30,10 +30,10 @@ Bluetooth и WiFi могут быть и довольно быстрыми, по вы не "распаковываете" эти пакеты сразу же на том же самом устройстве. Распаковка (чтение этих зашифрованных пакетов с извлечением переданных файлов и почтовых сообщений) может и должна бы быть произведена на -отдельном компьютере (@ref{nncp-cfgmin} команда может помочь с созданием -конфигурационного файла без приватных ключей для этой цели). +отдельном компьютере (@command{@ref{nncp-cfgmin}} команда может помочь с +созданием конфигурационного файла без приватных ключей для этой цели). Если вы действительно хотите взять с собой приватные ключи, то -@ref{nncp-cfgenc} команда способна зашифровать ваш конфигурационный -файл. Парольная фраза вами введённая усиливается функцией нагружающей и -центральный процессор и память. +@command{@ref{nncp-cfgenc}} команда способна зашифровать ваш +конфигурационный файл. Парольная фраза вами введённая усиливается +функцией нагружающей и центральный процессор и память. diff --git a/doc/usecases/airgap.texi b/doc/usecases/airgap.texi index 2c75d19..a764ca6 100644 --- a/doc/usecases/airgap.texi +++ b/doc/usecases/airgap.texi @@ -1,4 +1,5 @@ @node UsecaseAirgap +@cindex air-gap @section Highly secure isolated air-gap computers If you worry much about security, then air-gapped computer could be the @@ -35,11 +36,11 @@ reached via online connection using @emph{lan} address. @emph{bob-airgap} can be reached by sending intermediate relay packet through the @emph{bob}. -Any command like @command{nncp-file myfile bob-airgap:} will +Any command like @command{@ref{nncp-file} myfile bob-airgap:} will automatically create an encapsulated packet: one for the destination endpoint, and other carrying it for intermediate relaying node. Pay attention that relaying node knows nothing about the packet inside, but just its size and priority. Transition packets are encrypted too: using well-known @url{https://en.wikipedia.org/wiki/Onion_routing, onion -routing} technology. @emph{bob} can not read @emph{bob-airgap}'s packets. +encryption} technology. @emph{bob} can not read @emph{bob-airgap}'s packets. diff --git a/doc/usecases/caller.texi b/doc/usecases/caller.texi index df40dce..d4091cc 100644 --- a/doc/usecases/caller.texi +++ b/doc/usecases/caller.texi @@ -7,9 +7,8 @@ files at that time, but keep high priority email infrequently passing through in anytime. Also you wish to pass any kind of traffic when the node is available through the LAN. -You can easily set your preferences in @ref{Call, call -configurations} for @ref{nncp-caller} command used in online -communications. +You can easily set your preferences in @ref{Call, call configurations} +for @command{@ref{nncp-caller}} command used in online communications. @verbatim neigh: { diff --git a/doc/usecases/index.texi b/doc/usecases/index.texi index 938908f..9f99cfc 100644 --- a/doc/usecases/index.texi +++ b/doc/usecases/index.texi @@ -1,4 +1,5 @@ @node Use cases +@cindex use cases @unnumbered Use cases See also this page @ref{Сценарии, on russian}. diff --git a/doc/usecases/mail.texi b/doc/usecases/mail.texi index 2336136..f152d2d 100644 --- a/doc/usecases/mail.texi +++ b/doc/usecases/mail.texi @@ -17,7 +17,7 @@ overcomplicated and bloated for the simple task. Not an option. @url{https://en.wikipedia.org/wiki/KISS_principle, KISS}! Just tell both of your Postfix/Exim (on the server and notebook) to drop -email as a mail via NNCP (@ref{nncp-exec}) to specified node. +email as a mail via NNCP (@command{@ref{nncp-exec}}) to specified node. More information for Postfix is @ref{Postfix, here} and for Exim is @ref{Exim, here}. All mail will be stored in NNCP @ref{Spool, spool}, diff --git a/doc/usecases/nolink.texi b/doc/usecases/nolink.texi index 7886e81..fc8a40b 100644 --- a/doc/usecases/nolink.texi +++ b/doc/usecases/nolink.texi @@ -1,4 +1,6 @@ @node UsecaseNoLink +@cindex extreme environments +@cindex lack of link @section Extreme terrestrial environments, no link This is some kind of too slow link. Offline delivery methods is the only @@ -6,7 +8,7 @@ choice. Just send files as shown in previous section, but use removable media for transferring packets to other nodes. Assume that you send two files to @emph{bob} node. Insert USB storage -device (SD is preferable!), mount it and run @ref{nncp-xfer}: +device (SD is preferable!), mount it and run @command{@ref{nncp-xfer}}: @example $ nncp-xfer -node bob /media/usbstick @@ -32,5 +34,8 @@ $ nncp-xfer /media/usbstick @end example to find all packets related to their node and copy them locally for -further processing. @command{nncp-xfer} is the only command used with +further processing. @command{@ref{nncp-xfer}} is the only command used with removable devices. + +You can also optionally wait for explicit packets receipt +acknowledgement as described in @command{@ref{nncp-ack}}. diff --git a/doc/usecases/pop.texi b/doc/usecases/pop.texi index 5edc3e8..4fa13a5 100644 --- a/doc/usecases/pop.texi +++ b/doc/usecases/pop.texi @@ -1,12 +1,15 @@ @node UsecasePOP +@cindex POP3 replacement +@cindex IMAP4 replacement @section Lightweight fast POP3/IMAP4 replacement -@ref{nncp-daemon} can be connected with @ref{nncp-caller} for a long -time -- it can create TCP connection that lasts for many hours. When -SMTP server receives mail, it will call @ref{nncp-exec} creating an -outbound encrypted packet. Daemon checks outbound directory each second -and immediately sends notification about undelivered packets to remote -side, that also downloads it at once. +@command{@ref{nncp-daemon}} can be connected with +@command{@ref{nncp-caller}} for a long time -- it can create TCP +connection that lasts for many hours. When SMTP server receives mail, it +will call @command{@ref{nncp-exec}} creating an outbound encrypted +packet. Daemon checks outbound directory each second and immediately +sends notification about undelivered packets to remote side, that also +downloads it at once. There are only dozens of bytes notifying about incoming packets, dozens of bytes telling to download those packets. Mail packets are compressed diff --git a/doc/usecases/qos.texi b/doc/usecases/qos.texi index 8089888..4013e35 100644 --- a/doc/usecases/qos.texi +++ b/doc/usecases/qos.texi @@ -1,4 +1,7 @@ @node UsecaseQoS +@cindex expensive link +@cindex slow link +@cindex bad QoS @section Slow/expensive link for high-volume data, bad QoS Assume that you can give your relatively cheap 2 TiB removable hard diff --git a/doc/usecases/satellite.texi b/doc/usecases/satellite.texi index d152a3b..2a587af 100644 --- a/doc/usecases/satellite.texi +++ b/doc/usecases/satellite.texi @@ -1,4 +1,5 @@ @node UsecaseSatelliteLinks +@cindex satellite link @section Satellite links Satellite links have @strong{very} high delays together with high diff --git a/doc/usecases/spy.texi b/doc/usecases/spy.texi index b1e1de8..4762ba6 100644 --- a/doc/usecases/spy.texi +++ b/doc/usecases/spy.texi @@ -1,4 +1,5 @@ @node UsecaseSpy +@cindex reconnaissance, spying, intelligence, covert operations @section Reconnaissance, spying, intelligence, covert agents Those guys know how Internet is a dangerous place incompatible with @@ -26,9 +27,9 @@ and so on -- it is not so bad, because you are not carrying private keys with it (don't you?), you do not "toss" those packets immediately on the same device. Tossing (reading those encrypted packets and extracting transferred files and mail messages) could and should be done on a -separate computer (@ref{nncp-cfgmin} command could help creating +separate computer (@command{@ref{nncp-cfgmin}} command could help creating configuration file without private keys for that purpose). -If you really want to carry your private keys, then @ref{nncp-cfgenc} +If you really want to carry your private keys, then @command{@ref{nncp-cfgenc}} command will be able to encrypt your configuration file. Passphrase you enter is strengthened with both CPU and memory hard function. diff --git a/doc/usecases/unreliable.texi b/doc/usecases/unreliable.texi index 93a40d9..2ed3856 100644 --- a/doc/usecases/unreliable.texi +++ b/doc/usecases/unreliable.texi @@ -1,4 +1,5 @@ @node UsecaseUnreliable +@cindex unreliable link @section Unreliable/expensive communication link Assume that you have got slow modem/radio/cellular link that frequently diff --git a/doc/workflow.texi b/doc/workflow.texi index 8015b16..fbd3eea 100644 --- a/doc/workflow.texi +++ b/doc/workflow.texi @@ -1,44 +1,57 @@ @node Workflow +@cindex workflow @unnumbered Workflow NNCP consists of several utilities. As a rule you will have the following workflow: @enumerate -@item Run @ref{nncp-cfgnew} on each node to create an initial + +@item Run @command{@ref{nncp-cfgnew}} on each node to create an initial @ref{Configuration, configuration} file. + @item Tune it up and set at least @ref{Spool, spool} and log paths. + @item Share your public keys and reachability addressees with your neighbours. Add their keys to your configuration file and do any other required configuration about their reachability, permissions of file or freq transmission. -@item Use @ref{nncp-file}, @ref{nncp-freq}, @ref{nncp-exec} -(look @ref{Postfix, how} Postfix and @ref{Exim, how} Exim SMTP servers -could be configured) commands to queue file, freq and exec -transmissions. Repeat as many times any time as you wish. + +@item Use @command{@ref{nncp-file}}, @command{@ref{nncp-freq}}, +@command{@ref{nncp-exec}} (look @ref{Postfix, how} Postfix and +@ref{Exim, how} Exim SMTP servers could be configured) commands to queue +file, freq and exec transmissions. Repeat as many times any time as you +wish. + @item Depending on connection methods, either: @itemize - @item run @ref{nncp-daemon} to accept remotely initiated connections - to your node - @item run either @ref{nncp-call} or @ref{nncp-caller} to initiate - connection to required nodes from time to time - @item use @ref{nncp-xfer} with removable storage devices for copying - packets to/from other nodes - @item use @ref{nncp-bundle} with either sequential storage devices - or broadcasting transmissions for copying packets + @item run @command{@ref{nncp-daemon}} to accept remotely initiated + connections to your node + @item run either @command{@ref{nncp-call}} or + @command{@ref{nncp-caller}} to initiate connection to required nodes + from time to time + @item use @command{@ref{nncp-xfer}} with removable storage devices + for copying packets to/from other nodes + @item use @command{@ref{nncp-bundle}} with either sequential storage + devices or broadcasting transmissions for copying packets @end itemize + @item After successful packet exchanging (or just simply from time to -time), run @ref{nncp-toss} for tossing (decrypting and processing) all -inbound queues to receive exec messages, files, file requests and relay -transition packets to other nodes. +time), run @command{@ref{nncp-toss}} for tossing (decrypting and +processing) all inbound queues to receive exec messages, files, file +requests and relay transition packets to other nodes. + +@item Optionally do not forget about explicit receipt acknowledgement +ability with @command{@ref{nncp-ack}}. + @end enumerate @itemize @item If you wish to encrypt your configuration file containing your -private keys, then use @ref{nncp-cfgenc} utility. You can always use an -encrypted config without decrypting it in temporary memory file. +private keys, then use @command{@ref{nncp-cfgenc}} utility. You can +always use an encrypted config without decrypting it in temporary memory file. @item If you wish to strip off any private keys from your config, then -use @ref{nncp-cfgmin} utility. It will be useful for transferring +use @command{@ref{nncp-cfgmin}} utility. It will be useful for transferring messages with offline methods, but tossing them later on the machine with private keys. @end itemize diff --git a/doc/yggdrasil.texi b/doc/yggdrasil.texi index 18fa270..6492375 100644 --- a/doc/yggdrasil.texi +++ b/doc/yggdrasil.texi @@ -1,4 +1,5 @@ @node Yggdrasil +@cindex yggdrasil @unnumbered Yggdrasil support NNCP is able to act as a node of @@ -15,31 +16,34 @@ system's network stack, that would require use of some kind full-featured TUN network interface, there is pure Go built-in stack, responsible for IPv6 and TCP protocols support. You do not need to think about network interfaces, addressing and firewall setup at all: -@ref{nncp-daemon} acts as Yggdrasil IPv6 reachable host, listening on -single TCP port. You can reach it using ordinary non-Yggdrasil capable -version of @ref{nncp-call}, calling corresponding 200::/7 IPv6 address -through native Yggdrasil daemon created TUN interface. -@ref{nncp-daemon}, @ref{nncp-call}* can freely peer with Yggdrasil -nodes, reusing existing infrastructure. +@command{@ref{nncp-daemon}} acts as Yggdrasil IPv6 reachable host, +listening on single TCP port. You can reach it using ordinary +non-Yggdrasil capable version of @command{@ref{nncp-call}}, calling +corresponding 200::/7 IPv6 address through native Yggdrasil daemon +created TUN interface. @command{@ref{nncp-daemon}}, +@command{@ref{nncp-call}}* can freely peer with Yggdrasil nodes, reusing +existing infrastructure. Only minor modifications were done to current NNCP's tools: @itemize -@item @ref{nncp-daemon} has @option{-yggdrasil yggdrasils://} option, -making it also as a Yggdrasil listener network node. It can +@cindex yggdrasils schema +@item @command{@ref{nncp-daemon}} has @option{-yggdrasil yggdrasils://} +option, making it also as a Yggdrasil listener network node. It can automatically connect to other peers and participate in routing. It does not have to answer NNCP's online protocol requests at all and just can be some intermediate routing point in the whole mesh network. -@item @ref{nncp-call}/@ref{nncp-caller} commands understand +@cindex yggdrasilc schema +@item @command{@ref{nncp-call}}/@command{@ref{nncp-caller}} commands understand @code{yggdrasilc://} addresses, pointing to the desired Yggdrasil's public key (that also acts as the destination host's address). Yggdrasil background goroutine is automatically started, connecting to the specified Yggdrasil entrypoints, calling remote NNCP node and initiating NNCP's native @ref{Sync, online protocol} handshake on top of that. -@item @ref{nncp-cfgnew} is able to generate ed25519 keypair. +@item @command{@ref{nncp-cfgnew}} is able to generate ed25519 keypair. @item @ref{CfgYggdrasilAliases, Configuration file} optionally contains @code{yggdrasil-aliases} map. @@ -63,25 +67,29 @@ Private: 571fb05c81e62a572096566fd48e87ad47e706b1f600dd625ebbf86d310332624fd6413 You should share that public key with other NNCP peers. @item -Start @ref{nncp-daemon} listening on Yggdrasil's incoming connections. +Start @command{@ref{nncp-daemon}} listening on Yggdrasil's incoming connections. You have to specify: @itemize +@vindex PrivateKey @item Your private key (generated above). Yggdrasil's @code{PrivateKey} analogue. @item Optional non-default port you will listen on Yggdrasil's IPv6 address. +@vindex Listen @item Optional list of bind addresses, used for peering between the nodes. Yggdrasil's @code{Listen} analogue. +@vindex Peers @item Optional list of peer addresses you should connect to. Yggdrasil's @code{Peers} analogue. +@vindex AllowedPublicKeys @item Optional list of allowed peer public keys, allowed for incoming peering connections from. Yggdrasil's @code{AllowedPublicKeys} analogue. diff --git a/makedist.sh b/makedist.sh index 0c90ba8..00c1bb0 100755 --- a/makedist.sh +++ b/makedist.sh @@ -69,7 +69,7 @@ cat > $texi < "$tarball".asc meta4-create -file "$tarball" -mtime "$tarball" -sig "$tarball".asc \ http://www.nncpgo.org/download/"$tarball" \ + http://y.www.nncpgo.org/download/"$tarball" \ https://nncp.mirrors.quux.org/download/"$tarball" > "$tarball".meta4 size=$(( $(stat -f %z $tarball) / 1024 )) diff --git a/ports/nncp/Makefile b/ports/nncp/Makefile index 6ff741a..05c0ad1 100644 --- a/ports/nncp/Makefile +++ b/ports/nncp/Makefile @@ -1,5 +1,5 @@ PORTNAME= nncp -DISTVERSION= 7.6.0 +DISTVERSION= 8.6.0 CATEGORIES= net MASTER_SITES= http://www.nncpgo.org/download/ diff --git a/ports/nncp/pkg-plist b/ports/nncp/pkg-plist index e360a4a..e89c748 100644 --- a/ports/nncp/pkg-plist +++ b/ports/nncp/pkg-plist @@ -1,3 +1,4 @@ +bin/nncp-ack bin/nncp-bundle bin/nncp-call bin/nncp-caller diff --git a/src/call.go b/src/call.go index c4e04cb..95a70d6 100644 --- a/src/call.go +++ b/src/call.go @@ -50,6 +50,7 @@ type Call struct { AutoTossNoExec bool AutoTossNoTrns bool AutoTossNoArea bool + AutoTossNoACK bool } func (ctx *Ctx) CallNode( @@ -116,7 +117,7 @@ func (ctx *Ctx) CallNode( ctx.LogI("call-started", les, func(les LEs) string { return fmt.Sprintf("Connection to %s (%s)", node.Name, addr) }) - state.Wait() + isGood = state.Wait() ctx.LogI("call-finished", append( les, LE{"Duration", int64(state.Duration.Seconds())}, @@ -137,7 +138,6 @@ func (ctx *Ctx) CallNode( humanize.IBytes(uint64(state.TxSpeed)), ) }) - isGood = true conn.Close() break } else { diff --git a/src/cfg.go b/src/cfg.go index 0937ab0..98bc80c 100644 --- a/src/cfg.go +++ b/src/cfg.go @@ -38,6 +38,7 @@ const ( CfgPathEnv = "NNCPCFG" CfgSpoolEnv = "NNCPSPOOL" CfgLogEnv = "NNCPLOG" + CfgNoSync = "NNCPNOSYNC" ) var ( diff --git a/src/cmd/nncp-ack/main.go b/src/cmd/nncp-ack/main.go new file mode 100644 index 0000000..e972028 --- /dev/null +++ b/src/cmd/nncp-ack/main.go @@ -0,0 +1,138 @@ +/* +NNCP -- Node to Node copy, utilities for store-and-forward data exchange +Copyright (C) 2016-2022 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. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +// Send packet receipt acknowledgement via NNCP. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "go.cypherpunks.ru/nncp/v8" +) + +func usage() { + fmt.Fprintf(os.Stderr, nncp.UsageHeader()) + fmt.Fprintf(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 -node NODE[,...]\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Usage: %s -node NODE -pkt PKT\n", os.Args[0]) + fmt.Fprintln(os.Stderr, "Options:") + 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") + minSizeRaw = flag.Uint64("minsize", 0, "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") + doAll = flag.Bool("all", false, "ACK all rx packet for all nodes") + nodesRaw = flag.String("node", "", "ACK rx packets for that node") + pktRaw = flag.String("pkt", "", "ACK only that packet") + 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 + flag.Parse() + if *warranty { + fmt.Println(nncp.Warranty) + return + } + if *version { + fmt.Println(nncp.VersionGet()) + return + } + nice, err := nncp.NicenessParse(*niceRaw) + if err != nil { + log.Fatalln(err) + } + + ctx, err := nncp.CtxFromCmdline( + *cfgPath, + *spoolPath, + *logPath, + *quiet, + *showPrgrs, + *omitPrgrs, + *debug, + ) + if err != nil { + log.Fatalln("Error during initialization:", err) + } + if ctx.Self == nil { + log.Fatalln("Config lacks private keys") + } + + ctx.Umask() + minSize := int64(*minSizeRaw) * 1024 + + var nodes []*nncp.Node + if *nodesRaw != "" { + for _, nodeRaw := range strings.Split(*nodesRaw, ",") { + node, err := ctx.FindNode(nodeRaw) + if err != nil { + log.Fatalln("Invalid -node specified:", err) + } + nodes = append(nodes, node) + } + } + if *doAll { + if len(nodes) != 0 { + usage() + os.Exit(1) + } + for _, node := range ctx.Neigh { + nodes = append(nodes, node) + } + } else if len(nodes) == 0 { + usage() + os.Exit(1) + } + + if *pktRaw != "" { + if len(nodes) != 1 { + usage() + os.Exit(1) + } + nncp.ViaOverride(*viaOverride, ctx, nodes[0]) + if err = ctx.TxACK(nodes[0], nice, *pktRaw, minSize); err != nil { + log.Fatalln(err) + } + return + } + + for _, node := range nodes { + for job := range ctx.Jobs(node.Id, nncp.TRx) { + pktName := filepath.Base(job.Path) + if err = ctx.TxACK(node, nice, pktName, minSize); err != nil { + log.Fatalln(err) + } + } + } +} diff --git a/src/cmd/nncp-bundle/main.go b/src/cmd/nncp-bundle/main.go index d5603a9..071ecea 100644 --- a/src/cmd/nncp-bundle/main.go +++ b/src/cmd/nncp-bundle/main.go @@ -483,8 +483,10 @@ func main() { if err = bufTmp.Flush(); err != nil { log.Fatalln("Error during flushing:", err) } - if err = tmp.Sync(); err != nil { - log.Fatalln("Error during syncing:", err) + if !nncp.NoSync { + if err = tmp.Sync(); err != nil { + log.Fatalln("Error during syncing:", err) + } } if err = tmp.Close(); err != nil { log.Fatalln("Error during closing:", err) diff --git a/src/cmd/nncp-call/main.go b/src/cmd/nncp-call/main.go index 82cec19..4d8fb06 100644 --- a/src/cmd/nncp-call/main.go +++ b/src/cmd/nncp-call/main.go @@ -71,6 +71,7 @@ func main() { 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") ) log.SetFlags(log.Lshortfile) flag.Usage = usage @@ -217,6 +218,7 @@ func main() { *autoTossNoExec, *autoTossNoTrns, *autoTossNoArea, + *autoTossNoACK, ) } diff --git a/src/cmd/nncp-caller/main.go b/src/cmd/nncp-caller/main.go index 6902441..50d9bf4 100644 --- a/src/cmd/nncp-caller/main.go +++ b/src/cmd/nncp-caller/main.go @@ -59,6 +59,7 @@ func main() { 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") ) log.SetFlags(log.Lshortfile) flag.Usage = usage @@ -219,6 +220,7 @@ func main() { call.AutoTossNoExec || *autoTossNoExec, call.AutoTossNoTrns || *autoTossNoTrns, call.AutoTossNoArea || *autoTossNoArea, + call.AutoTossNoACK || *autoTossNoACK, ) } diff --git a/src/cmd/nncp-daemon/main.go b/src/cmd/nncp-daemon/main.go index 5fd6f6d..710b687 100644 --- a/src/cmd/nncp-daemon/main.go +++ b/src/cmd/nncp-daemon/main.go @@ -158,6 +158,7 @@ func main() { 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") ) log.SetFlags(log.Lshortfile) flag.Usage = usage @@ -217,6 +218,7 @@ func main() { *autoTossNoExec, *autoTossNoTrns, *autoTossNoArea, + *autoTossNoACK, ) } <-nodeIdC // call completion @@ -303,6 +305,7 @@ func main() { *autoTossNoExec, *autoTossNoTrns, *autoTossNoArea, + *autoTossNoACK, ) } <-nodeIdC // call completion diff --git a/src/cmd/nncp-pkt/main.go b/src/cmd/nncp-pkt/main.go index 54844dc..d40b8c5 100644 --- a/src/cmd/nncp-pkt/main.go +++ b/src/cmd/nncp-pkt/main.go @@ -74,6 +74,8 @@ func doPlain(ctx *nncp.Ctx, pkt nncp.Pkt, dump, decompress bool) { payloadType = "exec uncompressed" case nncp.PktTypeArea: payloadType = "area" + case nncp.PktTypeACK: + payloadType = "acknowledgement" } var path string switch pkt.Type { @@ -92,6 +94,8 @@ func doPlain(ctx *nncp.Ctx, pkt nncp.Pkt, dump, decompress bool) { if areaId, err := nncp.AreaIdFromString(path); err == nil { path = fmt.Sprintf("%s (%s)", path, ctx.AreaName(areaId)) } + case nncp.PktTypeACK: + path = nncp.Base32Codec.EncodeToString(pkt.Path[:pkt.PathLen]) default: path = string(pkt.Path[:pkt.PathLen]) } diff --git a/src/cmd/nncp-reass/main.go b/src/cmd/nncp-reass/main.go index 0882d28..d095f95 100644 --- a/src/cmd/nncp-reass/main.go +++ b/src/cmd/nncp-reass/main.go @@ -237,8 +237,10 @@ func process(ctx *nncp.Ctx, path string, keep, dryRun, stdout, dumpMeta bool) bo log.Fatalln("Can not flush:", err) } if tmp != nil { - if err = tmp.Sync(); err != nil { - log.Fatalln("Can not sync:", err) + if !nncp.NoSync { + if err = tmp.Sync(); err != nil { + log.Fatalln("Can not sync:", err) + } } if err = tmp.Close(); err != nil { log.Fatalln("Can not close:", err) diff --git a/src/cmd/nncp-toss/main.go b/src/cmd/nncp-toss/main.go index 4eca181..76bb765 100644 --- a/src/cmd/nncp-toss/main.go +++ b/src/cmd/nncp-toss/main.go @@ -49,6 +49,7 @@ func main() { noExec = flag.Bool("noexec", false, "Do not process \"exec\" packets") 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") spoolPath = flag.String("spool", "", "Override path to spool") logPath = flag.String("log", "", "Override path to logfile") quiet = flag.Bool("quiet", false, "Print only errors") @@ -110,14 +111,14 @@ func main() { node.Id, nncp.TRx, nice, - *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, + *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, *noACK, ) || isBad if nodeId == *ctx.SelfId { isBad = ctx.Toss( node.Id, nncp.TTx, nice, - *dryRun, false, true, true, true, true, *noArea, + *dryRun, false, true, true, true, true, *noArea, *noACK, ) || isBad } } @@ -150,14 +151,14 @@ func main() { nodeId, nncp.TRx, nice, - *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, + *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, *noACK, ) if *nodeId == *ctx.SelfId { ctx.Toss( nodeId, nncp.TTx, nice, - *dryRun, false, true, true, true, true, *noArea, + *dryRun, false, true, true, true, true, *noArea, *noACK, ) } } diff --git a/src/cmd/nncp-xfer/main.go b/src/cmd/nncp-xfer/main.go index 41e8c61..a1ef5fa 100644 --- a/src/cmd/nncp-xfer/main.go +++ b/src/cmd/nncp-xfer/main.go @@ -266,7 +266,7 @@ func main() { fd.Close() continue } - if _, err = fd.Seek(0, 0); err != nil { + if _, err = fd.Seek(0, io.SeekStart); err != nil { log.Fatalln(err) } tmp, err := ctx.NewTmpFileWHash() @@ -284,7 +284,7 @@ func main() { w.CloseWithError(err) } }() - if _, err = nncp.CopyProgressed( + _, err = nncp.CopyProgressed( tmp.W, r, "Rx", append( les, @@ -292,13 +292,24 @@ func main() { nncp.LE{K: "FullSize", V: fiInt.Size()}, ), ctx.ShowPrgrs, - ); err != nil { + ) + fd.Close() + if err != nil { ctx.LogE("xfer-rx", les, err, logMsg) + tmp.Cancel() isBad = true + continue } - fd.Close() - if isBad { + if err = tmp.W.Flush(); err != nil { + ctx.LogE("xfer-rx", les, err, logMsg) + tmp.Cancel() + isBad = true + continue + } + if tmp.Checksum() != fiInt.Name() { + ctx.LogE("xfer-rx", les, errors.New("checksum mismatch"), logMsg) tmp.Cancel() + isBad = true continue } if err = tmp.Commit(filepath.Join( @@ -477,13 +488,15 @@ Tx: isBad = true continue } - if err = tmp.Sync(); err != nil { - tmp.Close() - ctx.LogE("xfer-tx-sync", les, err, func(les nncp.LEs) string { - return logMsg(les) + ": syncing" - }) - isBad = true - continue + if !nncp.NoSync { + if err = tmp.Sync(); err != nil { + tmp.Close() + ctx.LogE("xfer-tx-sync", les, err, func(les nncp.LEs) string { + return logMsg(les) + ": syncing" + }) + isBad = true + continue + } } if err = tmp.Close(); err != nil { ctx.LogE("xfer-tx-close", les, err, func(les nncp.LEs) string { diff --git a/src/go.mod b/src/go.mod index c9efbb7..fb0eb03 100644 --- a/src/go.mod +++ b/src/go.mod @@ -10,17 +10,18 @@ require ( github.com/google/btree v1.0.1 // indirect github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 github.com/hjson/hjson-go v3.1.0+incompatible - github.com/klauspost/compress v1.13.6 + github.com/klauspost/compress v1.14.4 + github.com/klauspost/cpuid/v2 v2.0.11 // indirect github.com/yggdrasil-network/yggdrasil-go v0.4.2 go.cypherpunks.ru/balloon v1.1.1 go.cypherpunks.ru/recfile v0.4.3 - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 - golang.org/x/net v0.0.0-20210614182718-04defd469f4e - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e + golang.org/x/crypto v0.0.0-20220214200702-86341886e292 + golang.org/x/net v0.0.0-20220225172249-27dd8689420f + golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect inet.af/netstack v0.0.0-20211120045802-8aa80cf23d3c - lukechampine.com/blake3 v1.1.6 + lukechampine.com/blake3 v1.1.7 ) go 1.13 diff --git a/src/go.sum b/src/go.sum index 7443dc9..b6fc52d 100644 --- a/src/go.sum +++ b/src/go.sum @@ -27,10 +27,11 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hjson/hjson-go v3.1.0+incompatible h1:DY/9yE8ey8Zv22bY+mHV1uk2yRy0h8tKhZ77hEdi0Aw= github.com/hjson/hjson-go v3.1.0+incompatible/go.mod h1:qsetwF8NlsTsOTwZTApNlTCerV+b2GjYRRcIk4JMFio= github.com/kardianos/minwinsvc v1.0.0/go.mod h1:Bgd0oc+D0Qo3bBytmNtyRKVlp85dAloLKhfxanPFFRc= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= +github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.11 h1:i2lw1Pm7Yi/4O6XCSyJWqEHI2MDw2FzUK6o/D21xn2A= +github.com/klauspost/cpuid/v2 v2.0.11/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= 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= @@ -61,14 +62,15 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -85,8 +87,9 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= @@ -95,6 +98,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7-0.20210503195748-5c7c50ebbd4f/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -105,5 +109,5 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= inet.af/netstack v0.0.0-20211120045802-8aa80cf23d3c h1:nr31qYr+91rWD8klUkPx3eGTZzumCC414UJG1QRKZTc= inet.af/netstack v0.0.0-20211120045802-8aa80cf23d3c/go.mod h1:KOJdAzQzMLKzwFEdOOnrnSrLIhaFVB+NQoME/e5wllA= -lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= diff --git a/src/nncp.go b/src/nncp.go index b2303c0..0ae3470 100644 --- a/src/nncp.go +++ b/src/nncp.go @@ -40,7 +40,7 @@ along with this program. If not, see .` const Base32Encoded32Len = 52 var ( - Version string = "8.5.0" + Version string = "8.6.0" Base32Codec *base32.Encoding = base32.StdEncoding.WithPadding(base32.NoPadding) ) diff --git a/src/pkt.go b/src/pkt.go index 26c59e5..ba711a3 100644 --- a/src/pkt.go +++ b/src/pkt.go @@ -44,6 +44,7 @@ const ( PktTypeTrns PktType = iota PktTypeExecFat PktType = iota PktTypeArea PktType = iota + PktTypeACK PktType = iota MaxPathSize = 1<<8 - 1 diff --git a/src/sp.go b/src/sp.go index e8e477c..eca9544 100644 --- a/src/sp.go +++ b/src/sp.go @@ -1114,7 +1114,7 @@ func (state *SPState) StartWorkers( return nil } -func (state *SPState) Wait() { +func (state *SPState) Wait() bool { state.wg.Wait() close(state.payloads) close(state.pings) @@ -1130,12 +1130,15 @@ func (state *SPState) Wait() { if txDuration > 0 { state.TxSpeed = state.TxBytes / txDuration } + nothingLeft := len(state.queueTheir) == 0 for _, s := range state.fds { + nothingLeft = false s.fd.Close() } for pktName := range state.progressBars { ProgressKill(pktName) } + return nothingLeft } func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) { @@ -1461,13 +1464,15 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) { humanize.IBytes(uint64(fullsize)), ) } - err = fd.Sync() - if err != nil { - state.Ctx.LogE("sp-file-sync", lesp, err, func(les LEs) string { - return logMsg(les) + ": syncing" - }) - state.closeFd(filePathPart) - continue + if !NoSync { + err = fd.Sync() + if err != nil { + state.Ctx.LogE("sp-file-sync", lesp, err, func(les LEs) string { + return logMsg(les) + ": syncing" + }) + state.closeFd(filePathPart) + continue + } } if hasherAndOffset != nil { delete(state.fileHashers, filePath) diff --git a/src/tmp.go b/src/tmp.go index aee5867..4a43eaa 100644 --- a/src/tmp.go +++ b/src/tmp.go @@ -28,6 +28,12 @@ import ( "time" ) +var NoSync bool + +func init() { + NoSync = os.Getenv(CfgNoSync) != "" +} + func TempFile(dir, prefix string) (*os.File, error) { // Assume that probability of suffix collision is negligible suffix := strconv.FormatInt(time.Now().UnixNano()+int64(os.Getpid()), 16) @@ -77,6 +83,9 @@ func (tmp *TmpFileWHash) Cancel() { } func DirSync(dirPath string) error { + if NoSync { + return nil + } fd, err := os.Open(dirPath) if err != nil { return err @@ -102,9 +111,11 @@ func (tmp *TmpFileWHash) Commit(dir string) error { tmp.Fd.Close() return err } - if err = tmp.Fd.Sync(); err != nil { - tmp.Fd.Close() - return err + if !NoSync { + if err = tmp.Fd.Sync(); err != nil { + tmp.Fd.Close() + return err + } } if err = tmp.Fd.Close(); err != nil { return err diff --git a/src/toss.go b/src/toss.go index bdfcb31..ebe20fb 100644 --- a/src/toss.go +++ b/src/toss.go @@ -91,7 +91,7 @@ func jobProcess( pktSize uint64, jobPath string, decompressor *zstd.Decoder, - dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea bool, + dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool, ) error { defer pipeR.Close() sendmail := ctx.Neigh[*ctx.SelfId].Exec["sendmail"] @@ -329,16 +329,18 @@ func jobProcess( }) return err } - if err = tmp.Sync(); err != nil { - tmp.Close() - ctx.LogE("rx-sync", les, err, func(les LEs) string { - return fmt.Sprintf( - "Tossing file %s/%s (%s): %s: syncing", - sender.Name, pktName, - humanize.IBytes(pktSize), dst, - ) - }) - return err + if !NoSync { + if err = tmp.Sync(); err != nil { + tmp.Close() + ctx.LogE("rx-sync", les, err, func(les LEs) string { + return fmt.Sprintf( + "Tossing file %s/%s (%s): %s: syncing", + sender.Name, pktName, + humanize.IBytes(pktSize), dst, + ) + }) + return err + } } if err = tmp.Close(); err != nil { ctx.LogE("rx-close", les, err, func(les LEs) string { @@ -856,7 +858,7 @@ func jobProcess( uint64(pktSizeWithoutEnc(int64(pktSize))), "", decompressor, - dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, + dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK, ) }() _, _, _, err = PktEncRead( @@ -906,6 +908,64 @@ func jobProcess( } } + case PktTypeACK: + if noACK { + return nil + } + hsh := Base32Codec.EncodeToString(pkt.Path[:MTHSize]) + les := append(les, LE{"Type", "ack"}, LE{"Pkt", hsh}) + logMsg := func(les LEs) string { + return fmt.Sprintf("Tossing ack %s/%s: %s", sender.Name, pktName, hsh) + } + 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 err = os.Remove(pktPath); err != nil { + ctx.LogE("rx-ack", les, err, func(les LEs) string { + return logMsg(les) + ": removing packet" + }) + return err + } + } + } else { + ctx.LogD("rx-ack", les, func(les LEs) string { + return logMsg(les) + ": already disappeared" + }) + } + if !dryRun && doSeen { + if err := ensureDir(filepath.Dir(jobPath), SeenDir); err != nil { + return err + } + if fd, err := os.Create(jobPath2Seen(jobPath)); err == nil { + fd.Close() + if err = DirSync(filepath.Dir(jobPath)); err != nil { + ctx.LogE("rx-dirsync", les, err, func(les LEs) string { + return fmt.Sprintf( + "Tossing file %s/%s (%s): %s: dirsyncing", + sender.Name, pktName, + humanize.IBytes(pktSize), + filepath.Base(jobPath), + ) + }) + return err + } + } + } + if !dryRun { + if err = os.Remove(jobPath); err != nil { + ctx.LogE("rx", les, err, func(les LEs) string { + return logMsg(les) + ": removing job" + }) + return err + } else if ctx.HdrUsage { + os.Remove(JobPath2Hdr(jobPath)) + } + } + ctx.LogI("rx", les, func(les LEs) string { + return fmt.Sprintf("Got ACK packet from %s of %s", sender.Name, hsh) + }) + default: err = errors.New("unknown type") ctx.LogE( @@ -926,7 +986,7 @@ func (ctx *Ctx) Toss( nodeId *NodeId, xx TRxTx, nice uint8, - dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea bool, + dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool, ) bool { dirLock, err := ctx.LockDir(nodeId, "toss") if err != nil { @@ -994,7 +1054,7 @@ func (ctx *Ctx) Toss( uint64(pktSizeWithoutEnc(job.Size)), job.Path, decompressor, - dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, + dryRun, doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK, ) }() pipeWB := bufio.NewWriter(pipeW) @@ -1044,7 +1104,7 @@ func (ctx *Ctx) Toss( func (ctx *Ctx) AutoToss( nodeId *NodeId, nice uint8, - doSeen, noFile, noFreq, noExec, noTrns, noArea bool, + doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK bool, ) (chan struct{}, chan bool) { dw, err := ctx.NewDirWatcher( filepath.Join(ctx.Spool, nodeId.String(), string(TRx)), @@ -1066,7 +1126,7 @@ func (ctx *Ctx) AutoToss( case <-dw.C: bad = !ctx.Toss( nodeId, TRx, nice, false, - doSeen, noFile, noFreq, noExec, noTrns, noArea) || bad + doSeen, noFile, noFreq, noExec, noTrns, noArea, noACK) || bad } } }() diff --git a/src/toss_test.go b/src/toss_test.go index 6cb68eb..000653d 100644 --- a/src/toss_test.go +++ b/src/toss_test.go @@ -113,14 +113,14 @@ func TestTossExec(t *testing.T) { continue } ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec-1, - false, false, false, false, false, false, false) + false, false, false, false, false, false, false, false) 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, false, false, false, false, false, false, false) if len(dirFiles(rxPath)) == 0 { return false } @@ -133,7 +133,7 @@ func TestTossExec(t *testing.T) { ), } ctx.Toss(ctx.Self.Id, TRx, DefaultNiceExec, - false, false, false, false, false, false, false) + false, false, false, false, false, false, false, false) if len(dirFiles(rxPath)) != 0 { return false } @@ -220,13 +220,13 @@ func TestTossFile(t *testing.T) { rxPath := filepath.Join(spool, ctx.Self.Id.String(), string(TRx)) os.Rename(filepath.Join(spool, ctx.Self.Id.String(), string(TTx)), rxPath) ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFile, - false, false, false, false, false, false, false) + false, false, false, false, false, false, false, false) 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, false, false, false, false, false, false, false) { return false } if len(dirFiles(rxPath)) != 0 { @@ -303,7 +303,7 @@ func TestTossFileSameName(t *testing.T) { 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, false, false, false, false, false, false, false) expected := make(map[string]struct{}) expected["samefile"] = struct{}{} for i := 0; i < files-1; i++ { @@ -379,13 +379,13 @@ func TestTossFreq(t *testing.T) { 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, false, false, false, false, false, false, false) 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, false, false, false, false, false, false, false) if len(dirFiles(txPath)) != 0 || len(dirFiles(rxPath)) == 0 { return false } @@ -399,7 +399,7 @@ func TestTossFreq(t *testing.T) { } } ctx.Toss(ctx.Self.Id, TRx, DefaultNiceFreq, - false, false, false, false, false, false, false) + false, false, false, false, false, false, false, false) if len(dirFiles(txPath)) == 0 || len(dirFiles(rxPath)) != 0 { return false } @@ -504,7 +504,7 @@ func TestTossTrns(t *testing.T) { } } ctx.Toss(ctx.Self.Id, TRx, 123, - false, false, false, false, false, false, false) + false, false, false, false, false, false, false, false) if len(dirFiles(rxPath)) != 0 { return false } diff --git a/src/tx.go b/src/tx.go index 77db592..6e13f2e 100644 --- a/src/tx.go +++ b/src/tx.go @@ -453,7 +453,7 @@ func (ctx *Ctx) TxFile( } logMsg := func(les LEs) string { return fmt.Sprintf( - "File %s (%s) sent to %s:%s", + "File %s (%s) is sent to %s:%s", srcPath, humanize.IBytes(uint64(finalSize)), ctx.NodeName(node.Id), @@ -497,7 +497,7 @@ func (ctx *Ctx) TxFile( } logMsg := func(les LEs) string { return fmt.Sprintf( - "File %s (%s) sent to %s:%s", + "File %s (%s) is sent to %s:%s", srcPath, humanize.IBytes(uint64(size)), ctx.NodeName(node.Id), @@ -558,7 +558,7 @@ func (ctx *Ctx) TxFile( } logMsg := func(les LEs) string { return fmt.Sprintf( - "File %s (%s) sent to %s:%s", + "File %s (%s) is sent to %s:%s", srcPath, humanize.IBytes(uint64(metaPktSize)), ctx.NodeName(node.Id), @@ -604,7 +604,7 @@ func (ctx *Ctx) TxFreq( } logMsg := func(les LEs) string { return fmt.Sprintf( - "File request from %s:%s to %s sent", + "File request from %s:%s to %s is sent", ctx.NodeName(node.Id), srcPath, dstPath, ) @@ -675,7 +675,7 @@ func (ctx *Ctx) TxExec( } logMsg := func(les LEs) string { return fmt.Sprintf( - "Exec sent to %s@%s (%s)", + "Exec is sent to %s@%s (%s)", ctx.NodeName(node.Id), dst, humanize.IBytes(uint64(size)), ) } @@ -729,3 +729,39 @@ func (ctx *Ctx) TxTrns(node *Node, nice uint8, size int64, src io.Reader) error os.Symlink(nodePath, filepath.Join(ctx.Spool, node.Name)) return err } + +func (ctx *Ctx) TxACK( + node *Node, + nice uint8, + hsh string, + minSize int64, +) error { + hshRaw, err := Base32Codec.DecodeString(hsh) + if err != nil { + return err + } + if len(hshRaw) != MTHSize { + return errors.New("Invalid packet id size") + } + pkt, err := NewPkt(PktTypeACK, nice, []byte(hshRaw)) + if err != nil { + return err + } + src := bytes.NewReader([]byte{}) + _, _, err = ctx.Tx(node, pkt, nice, 0, minSize, MaxFileSize, src, hsh, nil) + les := LEs{ + {"Type", "ack"}, + {"Node", node.Id}, + {"Nice", int(nice)}, + {"Pkt", hsh}, + } + logMsg := func(les LEs) string { + return fmt.Sprintf("ACK to %s of %s is sent", ctx.NodeName(node.Id), hsh) + } + if err == nil { + ctx.LogI("tx", les, logMsg) + } else { + ctx.LogE("tx", les, err, logMsg) + } + return err +}