commit 1cad3d4e5e0b230f4d3f0a7295b162b5c5d6db43
parent 951d8c0fe3cf3f92fd7f471ec2493228daafe8cb
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Mon, 30 Jan 2023 15:33:45 -0800
dkfupload
Diffstat:
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")
+}