dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 1cad3d4e5e0b230f4d3f0a7295b162b5c5d6db43
parent 951d8c0fe3cf3f92fd7f471ec2493228daafe8cb
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 30 Jan 2023 15:33:45 -0800

dkfupload

Diffstat:
Acmd/dkfupload/main.go | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+), 0 deletions(-)

diff --git a/cmd/dkfupload/main.go b/cmd/dkfupload/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "flag" + "github.com/dustin/go-humanize" + "log" + "os" + "sync" +) + +func main() { + var nbThreads int + var apiKey string + var fileName string + var dry bool + flag.StringVar(&apiKey, "api-key", "", "dkf api key") + flag.StringVar(&fileName, "file", "", "file to upload") + flag.StringVar(&fileName, "f", "", "file to upload") + flag.IntVar(&nbThreads, "threads", 20, "nb threads") + flag.BoolVar(&dry, "dry", false, "dry run") + flag.Parse() + + const maxChunkSize = 10 << 20 // 10MB + + f, _ := os.Open(fileName) + fs, _ := f.Stat() + fileSize := fs.Size() + nbChunks := fileSize / maxChunkSize + + log.Println("file: ", fs.Name()) + log.Printf("file size: %s (%s) \n", humanize.Bytes(uint64(fileSize)), humanize.Comma(fileSize)) + log.Printf("Chunks size: %s (%s)\n", humanize.Bytes(uint64(maxChunkSize)), humanize.Comma(maxChunkSize)) + log.Println("Nb chunks: ", nbChunks) + log.Println("Nb threads: ", nbThreads) + + ch := make(chan int64) + go func() { + for chunkNum := int64(0); chunkNum < nbChunks; chunkNum++ { + ch <- chunkNum + } + close(ch) + }() + + wg := &sync.WaitGroup{} + wg.Add(nbThreads) + for i := 0; i < nbThreads; i++ { + go func(i int, wg *sync.WaitGroup) { + for chunkNum := range ch { + offset := int64(chunkNum) * maxChunkSize + buf := make([]byte, maxChunkSize) + n, _ := f.ReadAt(buf, offset) + log.Printf("Thread #%d read %d | from %d to %d \n", i, n, offset, offset+maxChunkSize) + if !dry { + // TODO: http post the chunk to server + } + } + wg.Done() + }(i, wg) + } + + wg.Wait() + log.Printf("All done\n") +}