-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
121 lines (99 loc) · 2.48 KB
/
main.go
File metadata and controls
121 lines (99 loc) · 2.48 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
import (
"flag"
"fmt"
"log"
"time"
"github.com/songjiayang/s3sync/config"
"github.com/songjiayang/s3sync/scanner"
"github.com/songjiayang/s3sync/storage"
"github.com/songjiayang/s3sync/syncer"
)
var (
conf string
rootPath string
upload, download, d bool
lu, luf bool
defaultRootPath = "./data/test"
)
func init() {
flag.StringVar(&conf, "config", "./config.json", "the config file")
flag.StringVar(&rootPath, "r", defaultRootPath, "root path")
flag.BoolVar(&upload, "upload", false, "upload files to storage")
flag.BoolVar(&download, "download", false, "download files from storage")
flag.BoolVar(&lu, "lu", false, "list upload status")
flag.BoolVar(&luf, "luf", false, "list all upload failed files")
flag.BoolVar(&d, "d", false, "run sync task background with interval time, default: 30s")
}
func main() {
flag.Parse()
cfg, err := config.LoadFile(conf)
if err != nil {
fmt.Printf("config.LoadFile(%s), %v\n", conf, err)
return
}
// fix rootPath
if rootPath != defaultRootPath {
cfg.Root = rootPath
} else if cfg.Root == "" {
cfg.Root = defaultRootPath
}
syncStatus()
interval := cfg.Duration()
for {
if upload {
push(cfg)
}
if download {
pull(cfg)
}
if !d {
break
}
time.Sleep(interval)
log.Println("---------- interval loop ----------")
}
}
func push(cfg *config.Config) {
log.Println("start scan job .......")
s := scanner.NewScanner(cfg.Root, cfg.ScanWorker)
go s.Status()
s.Scan()
log.Println("total files is", len(s.Files()))
log.Println("end scan job .......")
stg := storage.NewStorage(cfg.DB)
stg.Recover()
stg.UpdateMapFiles(s.Files())
log.Println("start upload job .......")
log.Println("left upload files", stg.UploadFilesCount)
go stg.Status()
syncResult := syncer.NewSyncResult("upload")
syncer.Run(stg, cfg.SyncConfig, cfg.Trim, cfg.AutoContentType, cfg.Root, syncResult)
log.Println("end upload job .......")
syncResult.End()
syncResult.Persist()
log.Println("start touch db .......")
stg.PersistDB()
log.Println("end touch db .......")
}
func pull(cfg *config.Config) {
log.Println("start download job .......")
syncer.RunDownloader(cfg.SyncConfig, cfg.Root)
log.Println("end download job .......")
}
func syncStatus() {
if lu || luf {
rs := syncer.NewSyncResult("upload")
err := rs.Recover()
if err != nil {
log.Println("can not get upload result data")
return
}
if lu {
rs.PrintStat()
}
if luf {
rs.PrintFailedFiles()
}
}
}