161 lines
3.4 KiB
Plaintext
161 lines
3.4 KiB
Plaintext
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"crypto/tls"
|
||
|
|
"flag"
|
||
|
|
"fmt"
|
||
|
|
"log"
|
||
|
|
"os"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/secsy/goftp"
|
||
|
|
)
|
||
|
|
|
||
|
|
var (
|
||
|
|
host string = ""
|
||
|
|
port string = ""
|
||
|
|
user string = ""
|
||
|
|
pswd string = ""
|
||
|
|
rmt string = ""
|
||
|
|
loc string = ""
|
||
|
|
act string = ""
|
||
|
|
debug bool = false
|
||
|
|
retry int = 0
|
||
|
|
)
|
||
|
|
|
||
|
|
func init() {
|
||
|
|
flag.BoolVar(&debug, "d", false, "Show Debug Messages")
|
||
|
|
flag.StringVar(&host, "h", "203.93.100.58", "FTPS Server Address")
|
||
|
|
flag.StringVar(&port, "o", "3031", "FTPS Server Port")
|
||
|
|
flag.StringVar(&user, "u", "idte", "Username")
|
||
|
|
flag.StringVar(&pswd, "p", "wistronTE2022", "Password")
|
||
|
|
flag.StringVar(&loc, "L", "", "Local Path")
|
||
|
|
flag.StringVar(&rmt, "R", "", "Remote Path")
|
||
|
|
flag.StringVar(&act, "A", "list", "Action: list,upld,dnld")
|
||
|
|
flag.IntVar(&retry, "T", 5, "Retry Times")
|
||
|
|
flag.Parse()
|
||
|
|
}
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
log.SetFlags(log.Ldate | log.Ltime)
|
||
|
|
log.SetOutput(os.Stdout)
|
||
|
|
|
||
|
|
if host == "" || port == "" || user == "" || pswd == "" {
|
||
|
|
log.Println("[ERR] Invalid Arguments.")
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
|
||
|
|
cfg := goftp.Config{
|
||
|
|
User: user,
|
||
|
|
Password: pswd,
|
||
|
|
Timeout: time.Second * 30,
|
||
|
|
TLSMode: goftp.TLSExplicit,
|
||
|
|
TLSConfig: &tls.Config{
|
||
|
|
InsecureSkipVerify: true,
|
||
|
|
MinVersion: tls.VersionTLS10,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
client, err := goftp.DialConfig(cfg, host+":"+port)
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
defer client.Close()
|
||
|
|
|
||
|
|
cwd, err := client.Getwd()
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
if debug {
|
||
|
|
log.Printf("[MSG] CWD: %s\r\n", cwd)
|
||
|
|
}
|
||
|
|
|
||
|
|
switch act {
|
||
|
|
case "list":
|
||
|
|
_List(client, rmt)
|
||
|
|
case "dnld":
|
||
|
|
_Download(client, loc, rmt)
|
||
|
|
case "upld":
|
||
|
|
_Upload(client, loc, rmt)
|
||
|
|
default:
|
||
|
|
_List(client, loc)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func _List(client *goftp.Client, path string) {
|
||
|
|
fis, err := client.ReadDir(path)
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
|
||
|
|
fmt.Println("### Name;Size;ModTime;IsDir")
|
||
|
|
for _, f := range fis {
|
||
|
|
fmt.Printf("%v;%v;%v;%v\r\n", f.Name(), f.Size(), f.ModTime().Format("2006-01-02 15:04:05"), f.IsDir())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func _Download(client *goftp.Client, local, remote string) {
|
||
|
|
if local == "" || remote == "" {
|
||
|
|
log.Println("[ERR] Invalid Local/Remote Path")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
log.Printf("[MSG] Downloading %s\r\n", remote)
|
||
|
|
var err error
|
||
|
|
var wtr *os.File
|
||
|
|
defer wtr.Close()
|
||
|
|
for r := 0; r <= retry; r++ {
|
||
|
|
if r > 0 {
|
||
|
|
time.Sleep(time.Second * 1)
|
||
|
|
log.Printf("[MSG] Retrying %d: %s\r\n", r, remote)
|
||
|
|
}
|
||
|
|
wtr, err = os.Create(local)
|
||
|
|
if err != nil {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
err = client.Retrieve(remote, wtr)
|
||
|
|
if err != nil {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("[ERR] Download NG: %s\r\n", remote)
|
||
|
|
log.Printf("[###] %s\r\n", err.Error())
|
||
|
|
} else {
|
||
|
|
log.Printf("[MSG] Download OK: %s\r\n", remote)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func _Upload(client *goftp.Client, local, remote string) {
|
||
|
|
if local == "" || remote == "" {
|
||
|
|
log.Println("[ERR] Invalid Local/Remote Path")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
log.Printf("[MSG] Uploading %s\r\n", local)
|
||
|
|
var err error
|
||
|
|
var rdr *os.File
|
||
|
|
defer rdr.Close()
|
||
|
|
for r := 0; r <= retry; r++ {
|
||
|
|
if r > 0 {
|
||
|
|
time.Sleep(time.Second * 1)
|
||
|
|
log.Printf("[MSG] Retrying %d: %s\r\n", r, local)
|
||
|
|
}
|
||
|
|
rdr, err = os.Open(local)
|
||
|
|
if err != nil {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
err = client.Store(remote, rdr)
|
||
|
|
if err != nil {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("[ERR] Upload NG: %s\r\n", local)
|
||
|
|
log.Printf("[###] %s\r\n", err.Error())
|
||
|
|
} else {
|
||
|
|
log.Printf("[MSG] Upload OK: %s\r\n", local)
|
||
|
|
}
|
||
|
|
}
|