From: Sergey Matveev Date: Sat, 27 Apr 2019 20:38:57 +0000 (+0300) Subject: nncp-call -pkts option X-Git-Tag: 4.0^2~6 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d3f7d4d7498baf1c4c0180e0344442eb499c30a3;p=nncp.git nncp-call -pkts option --- diff --git a/doc/cmds.texi b/doc/cmds.texi index 4e82102..ac665ac 100644 --- a/doc/cmds.texi +++ b/doc/cmds.texi @@ -96,6 +96,7 @@ their integrity. [-maxonlinetime INT] [-rx|-tx] [-list] + [-pkts PKT,PKT,...] [-rxrate INT] [-txrate INT] NODE[:ADDR] [FORCEADDR] @@ -117,6 +118,9 @@ overrides @ref{CfgOnlineDeadline, @emph{onlinedeadline}}. @ref{CfgXxRate, rxrate/txrate}. @option{-list} option allows you to list packets of remote node, without any transmission. +You can specify what packets your want to download, by specifying +@option{-pkts} option with comma-separated list of packets identifiers. + @node nncp-caller @section nncp-caller diff --git a/doc/news.ru.texi b/doc/news.ru.texi index 4eb8fec..480a565 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -17,6 +17,8 @@ @command{nncp-call} теперь может только показывать список пакетов на удалённой машине, без их передачи. @item +@command{nncp-call} может скачивать только чётко указанные пакеты. +@item Зависимые библиотеки обновлены. @item Небольшие исправления ошибок. diff --git a/doc/news.texi b/doc/news.texi index 571a094..baf52c0 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -18,6 +18,8 @@ Available free space checking before copying in @command{nncp-xfer}, @command{nncp-call} has ability only to listen packets on remote node, without its transmission. @item +@command{nncp-call} has ability to download only specified packets. +@item Dependant libraries are updated. @item Minor bugfixes. diff --git a/src/cypherpunks.ru/nncp/call.go b/src/cypherpunks.ru/nncp/call.go index 853dbae..4a56950 100644 --- a/src/cypherpunks.ru/nncp/call.go +++ b/src/cypherpunks.ru/nncp/call.go @@ -43,7 +43,8 @@ func (ctx *Ctx) CallNode( xxOnly TRxTx, rxRate, txRate int, onlineDeadline, maxOnlineTime uint, - listOnly bool) (isGood bool) { + listOnly bool, + onlyPkts map[[32]byte]bool) (isGood bool) { for _, addr := range addrs { sds := SDS{"node": node.Id, "addr": addr} ctx.LogD("call", sds, "dialing") @@ -63,6 +64,7 @@ func (ctx *Ctx) CallNode( onlineDeadline, maxOnlineTime, listOnly, + onlyPkts, ) if err == nil { ctx.LogI("call-start", sds, "connected") diff --git a/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go b/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go index d853443..7919b6a 100644 --- a/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go +++ b/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go @@ -39,19 +39,20 @@ func usage() { func main() { var ( - cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file") - niceRaw = flag.String("nice", nncp.NicenessFmt(255), "Minimal required niceness") - rxOnly = flag.Bool("rx", false, "Only receive packets") - txOnly = flag.Bool("tx", false, "Only transmit packets") - listOnly = flag.Bool("list", false, "Only list remote packets") - rxRate = flag.Int("rxrate", 0, "Maximal receive rate, pkts/sec") - txRate = flag.Int("txrate", 0, "Maximal transmit rate, pkts/sec") - spoolPath = flag.String("spool", "", "Override path to spool") - logPath = flag.String("log", "", "Override path to logfile") - quiet = flag.Bool("quiet", false, "Print only errors") - debug = flag.Bool("debug", false, "Print debug messages") - version = flag.Bool("version", false, "Print version information") - warranty = flag.Bool("warranty", false, "Print warranty information") + cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file") + niceRaw = flag.String("nice", nncp.NicenessFmt(255), "Minimal required niceness") + rxOnly = flag.Bool("rx", false, "Only receive packets") + txOnly = flag.Bool("tx", false, "Only transmit packets") + listOnly = flag.Bool("list", false, "Only list remote packets") + onlyPktsRaw = flag.String("pkts", "", "Recieve only that packets, comma separated") + rxRate = flag.Int("rxrate", 0, "Maximal receive rate, pkts/sec") + txRate = flag.Int("txrate", 0, "Maximal transmit rate, pkts/sec") + spoolPath = flag.String("spool", "", "Override path to spool") + logPath = flag.String("log", "", "Override path to logfile") + quiet = flag.Bool("quiet", false, "Print only errors") + debug = flag.Bool("debug", false, "Print debug messages") + version = flag.Bool("version", false, "Print version information") + warranty = flag.Bool("warranty", false, "Print warranty information") onlineDeadline = flag.Uint("onlinedeadline", 0, "Override onlinedeadline option") maxOnlineTime = flag.Uint("maxonlinetime", 0, "Override maxonlinetime option") @@ -124,6 +125,21 @@ func main() { } } + var onlyPkts map[[32]byte]bool + if len(*onlyPktsRaw) > 0 { + splitted = strings.Split(*onlyPktsRaw, ",") + onlyPkts = make(map[[32]byte]bool, len(splitted)) + for _, pktIdRaw := range splitted { + pktId, err := nncp.FromBase32(pktIdRaw) + if err != nil { + log.Fatalln("Invalid packet specified: ", err) + } + pktIdArr := new([32]byte) + copy(pktIdArr[:], pktId) + onlyPkts[*pktIdArr] = true + } + } + if !ctx.CallNode( node, addrs, @@ -134,6 +150,7 @@ func main() { *onlineDeadline, *maxOnlineTime, *listOnly, + onlyPkts, ) { os.Exit(1) } diff --git a/src/cypherpunks.ru/nncp/cmd/nncp-caller/main.go b/src/cypherpunks.ru/nncp/cmd/nncp-caller/main.go index 24334cf..1930715 100644 --- a/src/cypherpunks.ru/nncp/cmd/nncp-caller/main.go +++ b/src/cypherpunks.ru/nncp/cmd/nncp-caller/main.go @@ -133,6 +133,7 @@ func main() { call.OnlineDeadline, call.MaxOnlineTime, false, + nil, ) node.Lock() node.Busy = false diff --git a/src/cypherpunks.ru/nncp/sp.go b/src/cypherpunks.ru/nncp/sp.go index 22078c5..f188fd3 100644 --- a/src/cypherpunks.ru/nncp/sp.go +++ b/src/cypherpunks.ru/nncp/sp.go @@ -198,6 +198,7 @@ type SPState struct { txRate int isDead bool listOnly bool + onlyPkts map[[32]byte]bool sync.RWMutex } @@ -288,7 +289,9 @@ func (ctx *Ctx) StartI( xxOnly TRxTx, rxRate, txRate int, onlineDeadline, maxOnlineTime uint, - listOnly bool) (*SPState, error) { + listOnly bool, + onlyPkts map[[32]byte]bool, +) (*SPState, error) { err := ctx.ensureRxDir(nodeId) if err != nil { return nil, err @@ -340,6 +343,7 @@ func (ctx *Ctx) StartI( rxRate: rxRate, txRate: txRate, listOnly: listOnly, + onlyPkts: onlyPkts, } var infosPayloads [][]byte @@ -839,7 +843,7 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) { SdsAdd(sdsp, SDS{"offset": strconv.FormatInt(offset, 10)}), "", ) - if !state.listOnly { + if !state.listOnly && (state.onlyPkts == nil || state.onlyPkts[*info.Hash]) { replies = append(replies, MarshalSP( SPTypeFreq, SPFreq{info.Hash, uint64(offset)},