X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcypherpunks.ru%2Fnncp%2Fcmd%2Fnncp-daemon%2Fmain.go;h=67e2c533f410b3b8410bc2bab74b80f160f299e3;hb=dd92823db3d72fb21a4c712a7fb052dce16443dd;hp=de2f936d8636c58ccb769d276936b5852e25d496;hpb=cca813a5428d68fc711000ab436652a0fb21c4be;p=nncp.git diff --git a/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go b/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go index de2f936..67e2c53 100644 --- a/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go +++ b/src/cypherpunks.ru/nncp/cmd/nncp-daemon/main.go @@ -1,11 +1,10 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2017 Sergey Matveev +Copyright (C) 2016-2019 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. +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 @@ -16,17 +15,17 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -// NNCP TCP daemon +// NNCP TCP daemon. package main import ( "flag" "fmt" - "io/ioutil" "log" "net" "os" "strconv" + "time" "cypherpunks.ru/nncp" "golang.org/x/net/netutil" @@ -34,21 +33,70 @@ import ( func usage() { fmt.Fprintf(os.Stderr, nncp.UsageHeader()) - fmt.Fprintln(os.Stderr, "nncp-daemon -- TCP daemon\n") - fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:", os.Args[0]) + fmt.Fprintf(os.Stderr, "nncp-daemon -- TCP daemon\n\n") + fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0]) flag.PrintDefaults() } +type InetdConn struct { + r *os.File + w *os.File +} + +func (ic *InetdConn) Read(p []byte) (n int, err error) { + return ic.r.Read(p) +} + +func (ic *InetdConn) Write(p []byte) (n int, err error) { + return ic.w.Write(p) +} + +func (ic *InetdConn) SetReadDeadline(t time.Time) error { + return ic.r.SetReadDeadline(t) +} + +func (ic *InetdConn) SetWriteDeadline(t time.Time) error { + return ic.w.SetWriteDeadline(t) +} + +func performSP(ctx *nncp.Ctx, conn nncp.ConnDeadlined, nice uint8) { + state := nncp.SPState{ + Ctx: ctx, + Nice: nice, + } + if err := state.StartR(conn); err == nil { + ctx.LogI("call-start", nncp.SDS{"node": state.Node.Id}, "connected") + state.Wait() + ctx.LogI("call-finish", nncp.SDS{ + "node": state.Node.Id, + "duration": strconv.FormatInt(int64(state.Duration.Seconds()), 10), + "rxbytes": strconv.FormatInt(state.RxBytes, 10), + "txbytes": strconv.FormatInt(state.TxBytes, 10), + "rxspeed": strconv.FormatInt(state.RxSpeed, 10), + "txspeed": strconv.FormatInt(state.TxSpeed, 10), + }, "") + } else { + nodeId := "unknown" + if state.Node != nil { + nodeId = state.Node.Id.String() + } + ctx.LogE("call-start", nncp.SDS{"node": nodeId, "err": err}, "") + } +} + func main() { var ( - cfgPath = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file") - niceRaw = flag.Int("nice", 255, "Minimal required niceness") - bind = flag.String("bind", ":5400", "Address to bind to") - maxConn = flag.Int("maxconn", 128, "Maximal number of simultaneous connections") - quiet = flag.Bool("quiet", false, "Print only errors") - debug = flag.Bool("debug", false, "Enable debugging information") - 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") + bind = flag.String("bind", "[::]:5400", "Address to bind to") + inetd = flag.Bool("inetd", false, "Is it started as inetd service") + maxConn = flag.Int("maxconn", 128, "Maximal number of simultaneous connections") + 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") ) flag.Usage = usage flag.Parse() @@ -60,28 +108,31 @@ func main() { fmt.Println(nncp.VersionGet()) return } - if *niceRaw < 1 || *niceRaw > 255 { - log.Fatalln("-nice must be between 1 and 255") + nice, err := nncp.NicenessParse(*niceRaw) + if err != nil { + log.Fatalln(err) } - nice := uint8(*niceRaw) - cfgRaw, err := ioutil.ReadFile(*cfgPath) + ctx, err := nncp.CtxFromCmdline(*cfgPath, *spoolPath, *logPath, *quiet, *debug) if err != nil { - log.Fatalln("Can not read config:", err) + log.Fatalln("Error during initialization:", err) } - ctx, err := nncp.CfgParse(cfgRaw) - if err != nil { - log.Fatalln("Can not parse config:", err) + if ctx.Self == nil { + log.Fatalln("Config lacks private keys") + } + + if *inetd { + os.Stderr.Close() + conn := &InetdConn{os.Stdin, os.Stdout} + performSP(ctx, conn, nice) + return } - ctx.Quiet = *quiet - ctx.Debug = *debug ln, err := net.Listen("tcp", *bind) if err != nil { log.Fatalln("Can not listen:", err) } ln = netutil.LimitListener(ln, *maxConn) - ctx.LogI("daemon", nncp.SDS{"bind": *bind}, "listening") for { conn, err := ln.Accept() if err != nil { @@ -89,21 +140,7 @@ func main() { } ctx.LogD("daemon", nncp.SDS{"addr": conn.RemoteAddr()}, "accepted") go func(conn net.Conn) { - state, err := ctx.StartR(conn, nice, nil) - if err == nil { - ctx.LogI("call-start", nncp.SDS{"node": state.NodeId}, "connected") - state.Wait() - ctx.LogI("call-finish", nncp.SDS{ - "node": state.NodeId, - "duration": strconv.FormatInt(int64(state.Duration.Seconds()), 10), - "rxbytes": strconv.FormatInt(state.RxBytes, 10), - "txbytes": strconv.FormatInt(state.TxBytes, 10), - "rxspeed": strconv.FormatInt(state.RxSpeed, 10), - "txspeed": strconv.FormatInt(state.TxSpeed, 10), - }, "") - } else { - ctx.LogE("call-start", nncp.SDS{"node": state.NodeId, "err": err}, "") - } + performSP(ctx, conn, nice) conn.Close() }(conn) }