From: Sergey Matveev Date: Sun, 11 Jun 2017 09:54:22 +0000 (+0300) Subject: Merge branch 'develop' X-Git-Tag: 0.9^0 X-Git-Url: http://www.git.cypherpunks.ru/?a=commitdiff_plain;h=880046f865422c188637131622227507404478e6;hp=f114a0e54fffe0521a94693c433e0ed4a1e416f0;p=nncp.git Merge branch 'develop' --- diff --git a/VERSION b/VERSION index aec258d..b63ba69 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8 +0.9 diff --git a/doc/download.texi b/doc/download.texi index 213d429..887f516 100644 --- a/doc/download.texi +++ b/doc/download.texi @@ -24,6 +24,10 @@ Tarballs include all necessary required libraries: @multitable {XXXXX} {XXXX KiB} {link sign} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} @headitem Version @tab Size @tab Tarball @tab SHA256 checksum +@item @ref{Release 0.8, 0.8} @tab 932 KiB +@tab @url{download/nncp-0.8.tar.xz, link} @url{download/nncp-0.8.tar.xz.sig, sign} +@tab @code{9BD607D5 C5551857 B7E9277D 0E857936 1DB7353A E0F1556E EA9B1D91 8305B184} + @item @ref{Release 0.7, 0.7} @tab 783 KiB @tab @url{download/nncp-0.7.tar.xz, link} @url{download/nncp-0.7.tar.xz.sig, sign} @tab @code{D3407323 F89296DD 743FA764 51964B43 794E61BE 0E1D2DD4 ABD02042 B94FFC4F} diff --git a/doc/news.ru.texi b/doc/news.ru.texi index cae730d..668c4fe 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -1,6 +1,14 @@ @node Новости @section Новости +@node Релиз 0.9 +@subsection Релиз 0.9 +@itemize +@item +Исправлена обработка @option{-rx}/@option{-tx} опций @command{nncp-call} +команды. Они игнорировались. +@end itemize + @node Релиз 0.8 @subsection Релиз 0.8 @itemize diff --git a/doc/news.texi b/doc/news.texi index 0358a6c..3d55767 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -3,6 +3,14 @@ See also this page @ref{Новости, on russian}. +@node Release 0.9 +@section Release 0.9 +@itemize +@item +Fix @option{-rx}/@option{-tx} arguments processing in +@command{nncp-call} command. They were ignored. +@end itemize + @node Release 0.8 @section Release 0.8 @itemize diff --git a/ports/nncp/Makefile b/ports/nncp/Makefile index e4086f7..00e5818 100644 --- a/ports/nncp/Makefile +++ b/ports/nncp/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ PORTNAME= nncp -PORTVERSION= 0.8 +PORTVERSION= 0.9 CATEGORIES= net MASTER_SITES= http://www.nncpgo.org/download/ \ http://sourceforge.net/projects/nncp/files/ diff --git a/src/cypherpunks.ru/nncp/call.go b/src/cypherpunks.ru/nncp/call.go index 5b8e058..496720a 100644 --- a/src/cypherpunks.ru/nncp/call.go +++ b/src/cypherpunks.ru/nncp/call.go @@ -23,7 +23,7 @@ import ( "strconv" ) -func (ctx *Ctx) CallNode(node *Node, addrs []string, nice uint8, xxOnly *TRxTx, onlineDeadline, maxOnlineTime uint) (isGood bool) { +func (ctx *Ctx) CallNode(node *Node, addrs []string, nice uint8, xxOnly TRxTx, onlineDeadline, maxOnlineTime uint) (isGood bool) { for _, addr := range addrs { sds := SDS{"node": node.Id, "addr": addr} ctx.LogD("call", sds, "dialing") diff --git a/src/cypherpunks.ru/nncp/cfg.go b/src/cypherpunks.ru/nncp/cfg.go index 3400ed8..3a642f6 100644 --- a/src/cypherpunks.ru/nncp/cfg.go +++ b/src/cypherpunks.ru/nncp/cfg.go @@ -64,7 +64,7 @@ type NodeYAML struct { type CallYAML struct { Cron string Nice *int `nice,omitempty` - Xx *string `xx,omitempty` + Xx string `xx,omitempty` Addr *string `addr,omitempty` OnlineDeadline *uint `onlinedeadline,omitempty` MaxOnlineTime *uint `maxonlinetime,omitempty` @@ -187,15 +187,14 @@ func NewNode(name string, yml NodeYAML) (*Node, error) { nice = uint8(*callYml.Nice) } var xx TRxTx - if callYml.Xx != nil { - switch *callYml.Xx { - case "rx": - xx = TRx - case "tx": - xx = TTx - default: - return nil, errors.New("xx field must be either \"rx\" or \"tx\"") - } + switch callYml.Xx { + case "rx": + xx = TRx + case "tx": + xx = TTx + case "": + default: + return nil, errors.New("xx field must be either \"rx\" or \"tx\"") } var addr *string if callYml.Addr != nil { @@ -219,7 +218,7 @@ func NewNode(name string, yml NodeYAML) (*Node, error) { calls = append(calls, &Call{ Cron: expr, Nice: nice, - Xx: &xx, + Xx: xx, Addr: addr, OnlineDeadline: onlineDeadline, MaxOnlineTime: maxOnlineTime, diff --git a/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go b/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go index 9694639..42f761f 100644 --- a/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go +++ b/src/cypherpunks.ru/nncp/cmd/nncp-call/main.go @@ -126,7 +126,7 @@ func main() { } } - if !ctx.CallNode(node, addrs, nice, &xxOnly, *onlineDeadline, *maxOnlineTime) { + if !ctx.CallNode(node, addrs, nice, xxOnly, *onlineDeadline, *maxOnlineTime) { os.Exit(1) } } diff --git a/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go b/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go index b3678cd..e6ec2d3 100644 --- a/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go +++ b/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go @@ -91,7 +91,7 @@ func main() { } ctx.LogD("daemon", nncp.SDS{"addr": conn.RemoteAddr()}, "accepted") go func(conn net.Conn) { - state, err := ctx.StartR(conn, nice, nil) + state, err := ctx.StartR(conn, nice, "") if err == nil { ctx.LogI("call-start", nncp.SDS{"node": state.Node.Id}, "connected") state.Wait() diff --git a/src/cypherpunks.ru/nncp/humanizer.go b/src/cypherpunks.ru/nncp/humanizer.go index 49b715a..7abfcab 100644 --- a/src/cypherpunks.ru/nncp/humanizer.go +++ b/src/cypherpunks.ru/nncp/humanizer.go @@ -237,6 +237,8 @@ func (ctx *Ctx) Humanize(s string) string { if err, exists := sds["err"]; exists { msg += ": " + err } + case "lockdir": + msg = fmt.Sprintf("Acquire lock for %s: %s", sds["path"], sds["err"]) default: return s } diff --git a/src/cypherpunks.ru/nncp/lockdir.go b/src/cypherpunks.ru/nncp/lockdir.go new file mode 100644 index 0000000..25316b8 --- /dev/null +++ b/src/cypherpunks.ru/nncp/lockdir.go @@ -0,0 +1,54 @@ +/* +NNCP -- Node to Node copy, utilities for store-and-forward data exchange +Copyright (C) 2016-2017 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, either version 3 of the License, or +(at your option) any later version. + +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 . +*/ + +package nncp + +import ( + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +func (ctx *Ctx) LockDir(nodeId *NodeId, xx TRxTx) (*os.File, error) { + ctx.ensureRxDir(nodeId) + lockPath := filepath.Join(ctx.Spool, nodeId.String(), string(xx)) + ".lock" + dirLock, err := os.OpenFile( + lockPath, + os.O_CREATE|os.O_WRONLY, + os.FileMode(0600), + ) + if err != nil { + ctx.LogE("lockdir", SDS{"path": lockPath, "err": err}, "") + return nil, err + } + err = unix.Flock(int(dirLock.Fd()), unix.LOCK_EX|unix.LOCK_NB) + if err != nil { + ctx.LogE("lockdir", SDS{"path": lockPath, "err": err}, "") + dirLock.Close() + return nil, err + } + return dirLock, nil +} + +func (ctx *Ctx) UnlockDir(fd *os.File) { + if fd != nil { + unix.Flock(int(fd.Fd()), unix.LOCK_UN) + fd.Close() + } +} diff --git a/src/cypherpunks.ru/nncp/node.go b/src/cypherpunks.ru/nncp/node.go index 22fa3fb..1ea4903 100644 --- a/src/cypherpunks.ru/nncp/node.go +++ b/src/cypherpunks.ru/nncp/node.go @@ -70,7 +70,7 @@ type NodeOur struct { type Call struct { Cron *cronexpr.Expression Nice uint8 - Xx *TRxTx + Xx TRxTx Addr *string OnlineDeadline uint MaxOnlineTime uint diff --git a/src/cypherpunks.ru/nncp/sp.go b/src/cypherpunks.ru/nncp/sp.go index 8b64be1..be84510 100644 --- a/src/cypherpunks.ru/nncp/sp.go +++ b/src/cypherpunks.ru/nncp/sp.go @@ -180,7 +180,7 @@ type SPState struct { TxSpeed int64 rxLock *os.File txLock *os.File - xxOnly *TRxTx + xxOnly TRxTx isDead bool sync.RWMutex } @@ -264,20 +264,20 @@ func (ctx *Ctx) infosOur(nodeId *NodeId, nice uint8, seen *map[[32]byte]struct{} return payloadsSplit(payloads) } -func (ctx *Ctx) StartI(conn net.Conn, nodeId *NodeId, nice uint8, xxOnly *TRxTx, onlineDeadline, maxOnlineTime uint) (*SPState, error) { +func (ctx *Ctx) StartI(conn net.Conn, nodeId *NodeId, nice uint8, xxOnly TRxTx, onlineDeadline, maxOnlineTime uint) (*SPState, error) { err := ctx.ensureRxDir(nodeId) if err != nil { return nil, err } var rxLock *os.File - if xxOnly != nil && *xxOnly == TRx { + if xxOnly == "" || xxOnly == TRx { rxLock, err = ctx.LockDir(nodeId, TRx) if err != nil { return nil, err } } var txLock *os.File - if xxOnly != nil && *xxOnly == TTx { + if xxOnly == "" || xxOnly == TTx { txLock, err = ctx.LockDir(nodeId, TTx) if err != nil { return nil, err @@ -312,7 +312,7 @@ func (ctx *Ctx) StartI(conn net.Conn, nodeId *NodeId, nice uint8, xxOnly *TRxTx, } var infosPayloads [][]byte - if xxOnly == nil || *xxOnly != TTx { + if xxOnly == "" || xxOnly == TTx { infosPayloads = ctx.infosOur(nodeId, nice, &state.infosOurSeen) } var firstPayload []byte @@ -358,7 +358,7 @@ func (ctx *Ctx) StartI(conn net.Conn, nodeId *NodeId, nice uint8, xxOnly *TRxTx, return &state, err } -func (ctx *Ctx) StartR(conn net.Conn, nice uint8, xxOnly *TRxTx) (*SPState, error) { +func (ctx *Ctx) StartR(conn net.Conn, nice uint8, xxOnly TRxTx) (*SPState, error) { started := time.Now() conf := noise.Config{ CipherSuite: NoiseCipherSuite, @@ -417,7 +417,7 @@ func (ctx *Ctx) StartR(conn net.Conn, nice uint8, xxOnly *TRxTx) (*SPState, erro return nil, err } var rxLock *os.File - if xxOnly != nil && *xxOnly == TRx { + if xxOnly == "" || xxOnly == TRx { rxLock, err = ctx.LockDir(node.Id, TRx) if err != nil { return nil, err @@ -425,7 +425,7 @@ func (ctx *Ctx) StartR(conn net.Conn, nice uint8, xxOnly *TRxTx) (*SPState, erro } state.rxLock = rxLock var txLock *os.File - if xxOnly != nil && *xxOnly == TTx { + if xxOnly == "" || xxOnly == TTx { txLock, err = ctx.LockDir(node.Id, TTx) if err != nil { return nil, err @@ -434,7 +434,7 @@ func (ctx *Ctx) StartR(conn net.Conn, nice uint8, xxOnly *TRxTx) (*SPState, erro state.txLock = txLock var infosPayloads [][]byte - if xxOnly == nil || *xxOnly != TTx { + if xxOnly == "" || xxOnly == TTx { infosPayloads = ctx.infosOur(node.Id, nice, &state.infosOurSeen) } var firstPayload []byte @@ -499,22 +499,24 @@ func (state *SPState) StartWorkers(conn net.Conn, infosPayloads [][]byte, payloa } }() - go func() { - for range time.Tick(time.Second) { - for _, payload := range state.ctx.infosOur( - state.Node.Id, - state.nice, - &state.infosOurSeen, - ) { - state.ctx.LogD( - "sp-work", - SdsAdd(sds, SDS{"size": strconv.Itoa(len(payload))}), - "queuing new info", - ) - state.payloads <- payload + if state.xxOnly == "" || state.xxOnly == TTx { + go func() { + for range time.Tick(time.Second) { + for _, payload := range state.ctx.infosOur( + state.Node.Id, + state.nice, + &state.infosOurSeen, + ) { + state.ctx.LogD( + "sp-work", + SdsAdd(sds, SDS{"size": strconv.Itoa(len(payload))}), + "queuing new info", + ) + state.payloads <- payload + } } - } - }() + }() + } state.wg.Add(1) go func() { @@ -737,7 +739,7 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) { continue } state.ctx.LogD("sp-process", sdsp, "received") - if state.xxOnly != nil && *state.xxOnly == TTx { + if state.xxOnly == TTx { continue } state.Lock() diff --git a/src/cypherpunks.ru/nncp/toss.go b/src/cypherpunks.ru/nncp/toss.go index 4ae9711..2fb4cbb 100644 --- a/src/cypherpunks.ru/nncp/toss.go +++ b/src/cypherpunks.ru/nncp/toss.go @@ -36,7 +36,6 @@ import ( "github.com/davecgh/go-xdr/xdr2" "github.com/dustin/go-humanize" "golang.org/x/crypto/blake2b" - "golang.org/x/sys/unix" ) func newNotification(fromTo *FromToYAML, subject string) io.Reader { @@ -48,40 +47,7 @@ func newNotification(fromTo *FromToYAML, subject string) io.Reader { )) } -func (ctx *Ctx) LockDir(nodeId *NodeId, xx TRxTx) (*os.File, error) { - ctx.ensureRxDir(nodeId) - lockPath := filepath.Join(ctx.Spool, nodeId.String(), string(xx)) + ".lock" - dirLock, err := os.OpenFile( - lockPath, - os.O_CREATE|os.O_WRONLY, - os.FileMode(0600), - ) - if err != nil { - ctx.LogE("lockdir", SDS{"path": lockPath, "err": err}, "") - return nil, err - } - err = unix.Flock(int(dirLock.Fd()), unix.LOCK_EX|unix.LOCK_NB) - if err != nil { - ctx.LogE("lockdir", SDS{"path": lockPath, "err": err}, "") - dirLock.Close() - return nil, err - } - return dirLock, nil -} - -func (ctx *Ctx) UnlockDir(fd *os.File) { - if fd != nil { - unix.Flock(int(fd.Fd()), unix.LOCK_UN) - fd.Close() - } -} - func (ctx *Ctx) Toss(nodeId *NodeId, nice uint8, dryRun bool) bool { - dirLock, err := ctx.LockDir(nodeId, TRx) - if err != nil { - return false - } - defer ctx.UnlockDir(dirLock) isBad := false for job := range ctx.Jobs(nodeId, TRx) { pktName := filepath.Base(job.Fd.Name()) diff --git a/src/golang.org/x/sys b/src/golang.org/x/sys index 98b5b1e..0b25a40 160000 --- a/src/golang.org/x/sys +++ b/src/golang.org/x/sys @@ -1 +1 @@ -Subproject commit 98b5b1e7e80eb60271c8dc4eba6521ec2c3e811e +Subproject commit 0b25a408a50076fbbcae6b7ac0ea5fbb0b085e79