From: Sergey Matveev Date: Thu, 8 Jul 2021 09:04:07 +0000 (+0300) Subject: nncp-trns X-Git-Tag: v7.2.0^2~7 X-Git-Url: http://www.git.cypherpunks.ru/?p=nncp.git;a=commitdiff_plain;h=8225239b10b39cd59277f713c010c2ab3ea70b88 nncp-trns --- diff --git a/bin/cmd.list b/bin/cmd.list index b85cb2a..693027a 100644 --- a/bin/cmd.list +++ b/bin/cmd.list @@ -17,4 +17,5 @@ nncp-reass nncp-rm nncp-stat nncp-toss +nncp-trns nncp-xfer diff --git a/doc/cmd/index.texi b/doc/cmd/index.texi index cb81543..a360e28 100644 --- a/doc/cmd/index.texi +++ b/doc/cmd/index.texi @@ -54,6 +54,7 @@ Packets creation commands * nncp-file:: * nncp-exec:: * nncp-freq:: +* nncp-trns:: Packets sharing commands @@ -88,6 +89,7 @@ Maintenance, monitoring and debugging commands: @include cmd/nncp-file.texi @include cmd/nncp-exec.texi @include cmd/nncp-freq.texi +@include cmd/nncp-trns.texi @include cmd/nncp-xfer.texi @include cmd/nncp-bundle.texi @include cmd/nncp-toss.texi diff --git a/doc/cmd/nncp-trns.texi b/doc/cmd/nncp-trns.texi new file mode 100644 index 0000000..8e66205 --- /dev/null +++ b/doc/cmd/nncp-trns.texi @@ -0,0 +1,13 @@ +@node nncp-trns +@section nncp-trns + +@example +$ nncp-trns [options] -via NODEx[,...] NODE:PKT +$ nncp-trns [options] -via NODEx[,...] /path/to/PKT + +@end example + +Transit specified encrypted packet via another @option{NODEx}es. +Just manual transition packets creator. Normally you should not use that +command at all, preferring automatic wrapping in transitional packets +using the general @option{-via} option and configuration's files one. diff --git a/doc/news.ru.texi b/doc/news.ru.texi index 86b0ccc..f4e801d 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -1,6 +1,15 @@ @node Новости @section Новости +@node Релиз 7.2.0 +@subsection Релиз 7.2.0 +@itemize + +@item +Появилась @command{nncp-trns} команда для ручного создания транзитных пакетов. + +@end itemize + @node Релиз 7.1.1 @subsection Релиз 7.1.1 @itemize diff --git a/doc/news.texi b/doc/news.texi index 731d8ef..e04631b 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -3,12 +3,21 @@ See also this page @ref{Новости, on russian}. +@node Release 7_2_0 +@section Release 7.2.0 +@itemize + +@item +@command{nncp-trns} command appeared for manual transition packets creation. +@end itemize + @node Release 7_1_1 @section Release 7.1.1 @itemize @item Fixed failing directories fsync after @file{.seen} file creation. + @end itemize @node Release 7_1_0 diff --git a/ports/nncp/Makefile b/ports/nncp/Makefile index e2f6166..7aed8a6 100644 --- a/ports/nncp/Makefile +++ b/ports/nncp/Makefile @@ -1,5 +1,5 @@ PORTNAME= nncp -DISTVERSION= 7.1.0 +DISTVERSION= 7.2.0 CATEGORIES= net MASTER_SITES= http://www.nncpgo.org/download/ diff --git a/ports/nncp/pkg-plist b/ports/nncp/pkg-plist index 6c422ad..268e547 100644 --- a/ports/nncp/pkg-plist +++ b/ports/nncp/pkg-plist @@ -17,6 +17,7 @@ bin/nncp-reass bin/nncp-rm bin/nncp-stat bin/nncp-toss +bin/nncp-trns bin/nncp-xfer @dir etc/newsyslog.conf.d @sample etc/nncp.conf.sample etc/newsyslog.conf.d/nncp.conf diff --git a/src/cmd/nncp-trns/main.go b/src/cmd/nncp-trns/main.go new file mode 100644 index 0000000..6c6e3d4 --- /dev/null +++ b/src/cmd/nncp-trns/main.go @@ -0,0 +1,143 @@ +/* +NNCP -- Node to Node copy, utilities for store-and-forward data exchange +Copyright (C) 2016-2021 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 . +*/ + +// Wrap existing encrypted packet to transition ones. +package main + +import ( + "flag" + "fmt" + "io" + "log" + "os" + "path/filepath" + "strings" + + "go.cypherpunks.ru/nncp/v7" +) + +func usage() { + fmt.Fprintf(os.Stderr, nncp.UsageHeader()) + fmt.Fprintf(os.Stderr, "nncp-trns -- transit existing encrypted packet\n\n") + fmt.Fprintf(os.Stderr, "Usage: %s [options] -via NODEx[,...] NODE:PKT\n", os.Args[0]) + fmt.Fprintf(os.Stderr, " (to transit SPOOL/NODE/tx/PKT)\n") + fmt.Fprintf(os.Stderr, " %s [options] -via NODEx[,...] /path/to/PKT\nOptions:\n", + os.Args[0]) + flag.PrintDefaults() +} + +func main() { + var ( + cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file") + niceRaw = flag.String("nice", nncp.NicenessFmt(nncp.DefaultNiceFile), "Outbound packet niceness") + viaOverride = flag.String("via", "", "Override Via path to destination node") + spoolPath = flag.String("spool", "", "Override path to spool") + logPath = flag.String("log", "", "Override path to logfile") + 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 + } + if flag.NArg() != 1 { + usage() + os.Exit(1) + } + 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() + + var pktPath string + var pktName string + if _, err = os.Stat(flag.Arg(0)); err == nil { + pktPath = flag.Arg(0) + pktName = filepath.Base(pktPath) + } else { + splitted := strings.Split(flag.Arg(0), ":") + if len(splitted) != 2 { + log.Fatalln("Invalid NODE:PKT specification") + } + node, err := ctx.FindNode(splitted[0]) + if err != nil { + log.Fatalln("Invalid NODE specified:", err) + } + pktPath = filepath.Join( + ctx.Spool, node.Id.String(), string(nncp.TTx), splitted[1], + ) + pktName = filepath.Base(splitted[1]) + } + + fd, err := os.Open(pktPath) + if err != nil { + log.Fatalln(err) + } + fi, err := fd.Stat() + if err != nil { + log.Fatalln(err) + } + pktEnc, _, err := ctx.HdrRead(fd) + if err != nil { + log.Fatalln(err) + } + if _, err = fd.Seek(0, io.SeekStart); err != nil { + log.Fatalln(err) + } + + node := ctx.Neigh[*pktEnc.Recipient] + nncp.ViaOverride(*viaOverride, ctx, node) + via := node.Via[:len(node.Via)-1] + node = ctx.Neigh[*node.Via[len(node.Via)-1]] + node.Via = via + + pktTrns, err := nncp.NewPkt(nncp.PktTypeTrns, 0, pktEnc.Recipient[:]) + if err != nil { + panic(err) + } + if _, err = ctx.Tx(node, pktTrns, nice, fi.Size(), 0, fd, pktName, nil); err != nil { + log.Fatalln(err) + } +} diff --git a/src/nncp.go b/src/nncp.go index d2042c3..4e0eb66 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 = "7.1.1" + Version string = "7.2.0" Base32Codec *base32.Encoding = base32.StdEncoding.WithPadding(base32.NoPadding) )