-
-
Notifications
You must be signed in to change notification settings - Fork 222
/
upload.go
103 lines (86 loc) · 2.44 KB
/
upload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package dispatcher
import (
"fmt"
"os"
"time"
"github.com/WangYihang/Platypus/internal/context"
"github.com/WangYihang/Platypus/internal/util/log"
oss "github.com/WangYihang/Platypus/internal/util/os"
"github.com/vbauerster/mpb/v6"
"github.com/vbauerster/mpb/v6/decor"
)
func (dispatcher commandDispatcher) Upload(args []string) {
if len(args) != 2 {
log.Error("Arguments error, use `Help Upload` to get more information")
dispatcher.UploadHelp([]string{})
return
}
if context.Ctx.Current == nil && context.Ctx.CurrentTermite == nil {
log.Error("The current client is not set, please use `Jump` command to select the current client")
return
}
src := args[0]
dst := args[1]
if context.Ctx.Current != nil {
if context.Ctx.Current.OS == oss.Windows {
log.Error("Upload command does not support Windows platform")
return
}
context.Ctx.Current.Upload(src, dst, false)
// TODO: Check file md5 to verify
log.Success("File %s uploaded to %s", src, dst)
return
}
if context.Ctx.CurrentTermite != nil {
log.Info("Uploading %s to %s from client: %s", src, dst, context.Ctx.CurrentTermite.OnelineDesc())
srcfd, err := os.OpenFile(src, os.O_RDONLY, 0644)
if err != nil {
log.Error(err.Error())
return
}
fi, _ := srcfd.Stat()
totalBytes := fi.Size()
// Progress bar
p := mpb.New(
mpb.WithWidth(64),
)
bar := p.Add(int64(totalBytes), mpb.NewBarFiller("[=>-|"),
mpb.PrependDecorators(
decor.CountersKibiByte("% .2f / % .2f"),
),
mpb.AppendDecorators(
decor.EwmaETA(decor.ET_STYLE_HHMMSS, 60),
decor.Name(" ] "),
decor.EwmaSpeed(decor.UnitKB, "% .2f", 60),
),
)
blockSize := int64(0x400 * 512) // 128KB
buffer := make([]byte, blockSize)
for i := int64(0); i < totalBytes; i += blockSize {
start := time.Now()
n, err := srcfd.Read(buffer)
if err != nil {
bar.Abort(true)
log.Error("%s", err)
return
}
if n, err = context.Ctx.CurrentTermite.WriteFileEx(dst, buffer[0:n]); err != nil {
log.Error("Failed to write data to target file: %s", err)
bar.Abort(true)
return
}
bar.IncrBy(n)
bar.DecoratorEwmaUpdate(time.Since(start))
}
p.Wait()
return
}
}
func (dispatcher commandDispatcher) UploadHelp(args []string) {
fmt.Println("Usage of Upload")
fmt.Println("\tUpload [SRC] [DST]")
}
func (dispatcher commandDispatcher) UploadDesc(args []string) {
fmt.Println("Upload")
fmt.Println("\tUpload file from local machine to remote server")
}