@item
@command{nncp-cfgenc} ошибочно трижды спрашивал парольную фразу при шифровании.
+@item
+@command{nncp-stat} выводит сводку о частично скачанных пакетах.
+
@item
Обновлены зависимые библиотеки.
@item
@command{nncp-cfgenc} mistakenly asked passphrase three times during encryption.
+@item
+@command{nncp-stat} reports about partly downloaded packets.
+
@item
Updated dependencies.
flag.PrintDefaults()
}
-func jobPrint(xx nncp.TRxTx, job nncp.Job) {
+func jobPrint(xx nncp.TRxTx, job nncp.Job, suffix string) {
fmt.Printf(
- "\t%s %s %s (nice: %s)\n",
+ "\t%s %s%s %s (nice: %s)\n",
string(xx),
- nncp.Base32Codec.EncodeToString(job.HshValue[:]),
+ nncp.Base32Codec.EncodeToString(job.HshValue[:]), suffix,
humanize.IBytes(uint64(job.Size)),
nncp.NicenessFmt(job.PktEnc.Nice),
)
rxBytes := make(map[uint8]int64)
noCKNums := make(map[uint8]int)
noCKBytes := make(map[uint8]int64)
+ partNums := 0
+ partBytes := int64(0)
for job := range ctx.Jobs(node.Id, nncp.TRx) {
if *showPkt {
- jobPrint(nncp.TRx, job)
+ jobPrint(nncp.TRx, job, "")
}
rxNums[job.PktEnc.Nice] = rxNums[job.PktEnc.Nice] + 1
rxBytes[job.PktEnc.Nice] = rxBytes[job.PktEnc.Nice] + job.Size
}
for job := range ctx.JobsNoCK(node.Id) {
if *showPkt {
- jobPrint(nncp.TRx, job)
+ jobPrint(nncp.TRx, job, ".nock")
}
noCKNums[job.PktEnc.Nice] = noCKNums[job.PktEnc.Nice] + 1
noCKBytes[job.PktEnc.Nice] = noCKBytes[job.PktEnc.Nice] + job.Size
}
+ for job := range ctx.JobsPart(node.Id) {
+ if *showPkt {
+ fmt.Printf(
+ "\t%s %s.part %s\n",
+ string(nncp.TRx),
+ nncp.Base32Codec.EncodeToString(job.HshValue[:]),
+ humanize.IBytes(uint64(job.Size)),
+ )
+ }
+ partNums++
+ partBytes += job.Size
+ }
txNums := make(map[uint8]int)
txBytes := make(map[uint8]int64)
for job := range ctx.Jobs(node.Id, nncp.TTx) {
if *showPkt {
- jobPrint(nncp.TTx, job)
+ jobPrint(nncp.TTx, job, "")
}
txNums[job.PktEnc.Nice] = txNums[job.PktEnc.Nice] + 1
txBytes[job.PktEnc.Nice] = txBytes[job.PktEnc.Nice] + job.Size
}
var nice uint8
+ if partNums > 0 {
+ fmt.Printf(
+ "\tpart: % 10s, % 3d pkts\n",
+ humanize.IBytes(uint64(partBytes)), partNums,
+ )
+ }
for nice = 1; nice > 0; nice++ {
rxNum, rxExists := rxNums[nice]
txNum, txExists := txNums[nice]
return err
}
-func (ctx *Ctx) jobsFind(nodeId *NodeId, xx TRxTx, nock bool) chan Job {
+func (ctx *Ctx) jobsFind(nodeId *NodeId, xx TRxTx, nock, part bool) chan Job {
rxPath := filepath.Join(ctx.Spool, nodeId.String(), string(xx))
jobs := make(chan Job, 16)
go func() {
hshValue, err = Base32Codec.DecodeString(
strings.TrimSuffix(name, NoCKSuffix),
)
+ } else if part {
+ if !strings.HasSuffix(name, PartSuffix) ||
+ len(name) != Base32Encoded32Len+len(PartSuffix) {
+ continue
+ }
+ hshValue, err = Base32Codec.DecodeString(
+ strings.TrimSuffix(name, PartSuffix),
+ )
} else {
if len(name) != Base32Encoded32Len {
continue
pth := filepath.Join(rxPath, name)
hdrExists := true
var fd *os.File
- if nock {
+ if nock || part {
fd, err = os.Open(pth)
} else {
fd, err = os.Open(pth + HdrSuffix)
if err != nil {
continue
}
+ if part {
+ job := Job{
+ Path: pth,
+ Size: fi.Size(),
+ HshValue: new([MTHSize]byte),
+ }
+ copy(job.HshValue[:], hshValue)
+ jobs <- job
+ continue
+ }
pktEnc, pktEncRaw, err := ctx.HdrRead(fd)
fd.Close()
- if err != nil || pktEnc.Magic != MagicNNCPEv5.B {
+ if err != nil {
+ continue
+ }
+ switch pktEnc.Magic {
+ case MagicNNCPEv1.B:
+ err = MagicNNCPEv1.TooOld()
+ case MagicNNCPEv2.B:
+ err = MagicNNCPEv2.TooOld()
+ case MagicNNCPEv3.B:
+ err = MagicNNCPEv3.TooOld()
+ case MagicNNCPEv4.B:
+ err = MagicNNCPEv4.TooOld()
+ case MagicNNCPEv5.B:
+ default:
+ err = BadMagic
+ }
+ if err != nil {
+ ctx.LogE("job", LEs{
+ {"XX", string(xx)},
+ {"Name", name},
+ {"Size", fi.Size()},
+ }, err, func(les LEs) string {
+ return fmt.Sprintf(
+ "Job %s/%s size: %s",
+ string(xx), name,
+ humanize.IBytes(uint64(fi.Size())),
+ )
+ })
continue
}
ctx.LogD("job", LEs{
}
func (ctx *Ctx) Jobs(nodeId *NodeId, xx TRxTx) chan Job {
- return ctx.jobsFind(nodeId, xx, false)
+ return ctx.jobsFind(nodeId, xx, false, false)
}
func (ctx *Ctx) JobsNoCK(nodeId *NodeId) chan Job {
- return ctx.jobsFind(nodeId, TRx, true)
+ return ctx.jobsFind(nodeId, TRx, true, false)
+}
+
+func (ctx *Ctx) JobsPart(nodeId *NodeId) chan Job {
+ return ctx.jobsFind(nodeId, TRx, false, true)
}