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
|
package main
import (
"fmt"
"log"
"os"
"time"
"gscp/internal/config"
"gscp/internal/local"
"gscp/internal/remote"
"gscp/internal/transfer"
)
func main() {
// Parse command-line arguments
cfg := config.ParseArgs()
if cfg.Verbose {
log.Printf("Starting parallel SCP with configuration:")
log.Printf(" Destination: %s", cfg.Dest)
log.Printf(" Remote User: %s", cfg.RemoteUser)
log.Printf(" Remote Host: %s", cfg.RemoteHost)
log.Printf(" Remote Path: %s", cfg.RemotePath)
log.Printf(" Parallelism: %d", cfg.Parallelism)
log.Printf(" Lock Dir: %s", cfg.LockDir)
log.Printf(" Cipher: %s", cfg.CipherOption)
}
// Create lock directory if it doesn't exist
err := os.MkdirAll(cfg.LockDir, 0755)
if err != nil {
log.Fatalf("Failed to create lock directory: %v", err)
}
// Get remote file list
remoteFiles, err := remote.GetFiles(cfg)
if err != nil {
log.Fatalf("Failed to get remote files: %v", err)
}
if cfg.Verbose {
log.Printf("Found %d remote files", len(remoteFiles))
}
// Get local file list
localFiles, err := local.GetFiles(cfg.Dest)
if err != nil {
log.Fatalf("Failed to get local files: %v", err)
}
if cfg.Verbose {
log.Printf("Found %d local files", len(localFiles))
}
// Compute diff (files that exist on remote but not on local)
diffFiles := transfer.GetDiffFiles(remoteFiles, localFiles)
if cfg.Verbose {
log.Printf("Found %d files to copy", len(diffFiles))
}
// If only listing files, print them and exit
if cfg.OnlyListFiles {
for _, file := range diffFiles {
fmt.Println(file)
}
return
}
// Copy files in parallel
start := time.Now()
copiedFiles := transfer.CopyFilesInParallel(diffFiles, cfg)
elapsed := time.Since(start)
log.Printf("Done! Copied %d/%d files in %s", copiedFiles, len(diffFiles), elapsed)
}
|