X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcmd%2Fnncp-toss%2Fmain.go;h=76bb7653b2e97f177e0313d1005b33b8f3ef9d84;hb=2e59e1d8da61bc5dee797d351e50e8ed114aa4c7;hp=af3a59d9bd8a144b08fa402dbaf99e755f39510f;hpb=0ee0ba3784ce20e69d8db6316c99e7f0b6d30809;p=nncp.git diff --git a/src/cmd/nncp-toss/main.go b/src/cmd/nncp-toss/main.go index af3a59d..76bb765 100644 --- a/src/cmd/nncp-toss/main.go +++ b/src/cmd/nncp-toss/main.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2021 Sergey Matveev +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 @@ -23,9 +23,10 @@ import ( "fmt" "log" "os" + "path/filepath" "time" - "go.cypherpunks.ru/nncp/v7" + "go.cypherpunks.ru/nncp/v8" ) func usage() { @@ -41,13 +42,14 @@ func main() { nodeRaw = flag.String("node", "", "Process only that node") niceRaw = flag.String("nice", nncp.NicenessFmt(255), "Minimal required niceness") dryRun = flag.Bool("dryrun", false, "Do not actually write any tossed data") - doSeen = flag.Bool("seen", false, "Create .seen files") + doSeen = flag.Bool("seen", false, "Create seen/ files") cycle = flag.Uint("cycle", 0, "Repeat tossing after N seconds in infinite loop") noFile = flag.Bool("nofile", false, "Do not process \"file\" packets") noFreq = flag.Bool("nofreq", false, "Do not process \"freq\" packets") 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") @@ -99,32 +101,65 @@ func main() { ctx.Umask() -Cycle: - isBad := false + if *cycle == 0 { + isBad := false + for nodeId, node := range ctx.Neigh { + if nodeOnly != nil && nodeId != *nodeOnly.Id { + continue + } + isBad = ctx.Toss( + node.Id, + nncp.TRx, + nice, + *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, *noACK, + ) || isBad + } + } + if isBad { + os.Exit(1) + } + return + } + + nodeIds := make(chan *nncp.NodeId) for nodeId, node := range ctx.Neigh { if nodeOnly != nil && nodeId != *nodeOnly.Id { continue } - isBad = ctx.Toss( - node.Id, + dw, err := ctx.NewDirWatcher( + filepath.Join(ctx.Spool, node.Id.String(), string(nncp.TRx)), + time.Second*time.Duration(*cycle), + ) + if err != nil { + log.Fatalln(err) + } + go func(nodeId *nncp.NodeId) { + for range dw.C { + nodeIds <- nodeId + } + }(node.Id) + } + for nodeId := range nodeIds { + ctx.Toss( + nodeId, nncp.TRx, nice, - *dryRun, *doSeen, *noFile, *noFreq, *noExec, *noTrns, *noArea, - ) || isBad - if nodeId == *ctx.SelfId { - isBad = ctx.Toss( - node.Id, + *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, - ) || isBad + *dryRun, false, true, true, true, true, *noArea, *noACK, + ) } } - if *cycle > 0 { - time.Sleep(time.Duration(*cycle) * time.Second) - goto Cycle - } - if isBad { - os.Exit(1) - } }