198 lines
4.5 KiB
Go
198 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"gopkg.in/dutchcoders/goftp.v1"
|
|
)
|
|
|
|
var (
|
|
host string = ""
|
|
port string = ""
|
|
user string = ""
|
|
pswd string = ""
|
|
loc string = ""
|
|
rmt string = ""
|
|
act string = ""
|
|
suffix string = ""
|
|
retry int = 0
|
|
intrv int = 0
|
|
)
|
|
var ftp *goftp.FTP
|
|
|
|
func init() {
|
|
//flag.StringVar(&host, "h", "203.93.100.58", "FTPS Server Address")
|
|
flag.StringVar(&host, "s", "10.60.254.52", "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.StringVar(&suffix, "X", ".PENDING", "Temporary filename suffix while uploading")
|
|
flag.IntVar(&intrv, "I", 10, "Retry Interval (Seconds)")
|
|
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)
|
|
}
|
|
|
|
err := _InitFTP()
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
defer ftp.Close()
|
|
|
|
switch act {
|
|
case "list":
|
|
_List(rmt)
|
|
case "dnld":
|
|
_Download(loc, rmt)
|
|
case "upld":
|
|
_Upload(loc, rmt)
|
|
default:
|
|
_List(rmt)
|
|
}
|
|
}
|
|
|
|
func _InitFTP() error {
|
|
var err error
|
|
for i := 0; i <= retry; i++ {
|
|
if i > 0 {
|
|
log.Println("[###] Retrying Connect ...")
|
|
}
|
|
ftp, err = goftp.Connect(fmt.Sprintf("%s:%s", host, port))
|
|
if err != nil {
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
|
continue
|
|
}
|
|
|
|
cfg := tls.Config{
|
|
InsecureSkipVerify: true,
|
|
MinVersion: tls.VersionTLS10,
|
|
}
|
|
|
|
err = ftp.AuthTLS(&cfg)
|
|
if err != nil {
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
|
continue
|
|
}
|
|
|
|
err = ftp.Login(user, pswd)
|
|
if err != nil {
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
if err != nil {
|
|
log.Printf("[***] %s; %s\r\n", rmt, loc)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func _List(path string) {
|
|
files, err := ftp.List(path)
|
|
if err != nil {
|
|
log.Printf("[ERR] %s\r\n", err.Error())
|
|
return
|
|
}
|
|
for _, f := range files {
|
|
fmt.Print(f)
|
|
}
|
|
}
|
|
|
|
func _Download(local, remote string) {
|
|
log.Printf("[MSG] Downloading: %s\r\n", remote)
|
|
var err error
|
|
baseRemote := filepath.Base(remote)
|
|
for i := 0; i <= retry; i++ {
|
|
if i > 0 {
|
|
time.Sleep(time.Second * time.Duration(intrv))
|
|
log.Printf("[###] Retrying Download %d/%d: %s\r\n", i, retry, remote)
|
|
}
|
|
_, err = ftp.Retr(remote, func(rdr io.Reader) error {
|
|
wtr, oserr := os.Create(local + baseRemote)
|
|
if oserr != nil {
|
|
return oserr
|
|
}
|
|
defer wtr.Close()
|
|
_, ioerr := io.Copy(wtr, rdr)
|
|
if ioerr != nil {
|
|
return ioerr
|
|
}
|
|
return nil
|
|
})
|
|
if err == nil {
|
|
break
|
|
}
|
|
}
|
|
if err != nil {
|
|
log.Printf("[***] %s; %s\r\n", remote, local)
|
|
log.Printf("[ERR] Download NG: %s; %s", remote, err.Error())
|
|
return
|
|
}
|
|
log.Printf("[MSG] Download OK: %s\r\n", remote)
|
|
}
|
|
|
|
func _Upload(local, remote string) {
|
|
log.Printf("[MSG] Uploading: %s\r\n", local+suffix)
|
|
baseLocal := filepath.Base(local)
|
|
var err error
|
|
if suffix != "" {
|
|
err = os.Rename(local, local+suffix)
|
|
if err != nil {
|
|
log.Printf("[ERR] Rename Local File: %s -> %s; %s\r\n", local, local+suffix, err.Error())
|
|
return
|
|
}
|
|
}
|
|
for i := 0; i <= retry; i++ {
|
|
if i > 0 {
|
|
time.Sleep(time.Second * time.Duration(intrv))
|
|
log.Printf("[###] Retrying Upload %d/%d: %s\r\n", i, retry, local+suffix)
|
|
}
|
|
err = ftp.Cwd(remote)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
err = ftp.Upload(local + suffix)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
if err != nil {
|
|
log.Printf("[***] %s; %s\r\n", remote, local+suffix)
|
|
log.Printf("[ERR] Upload NG: %s; %s", local+suffix, err.Error())
|
|
return
|
|
}
|
|
if suffix != "" {
|
|
err = ftp.Rename(remote+"/"+baseLocal+suffix, remote+"/"+baseLocal)
|
|
if err != nil {
|
|
log.Printf("[ERR] Rename Remote File: %s --> %s; %s\r\n", remote+"/"+baseLocal+suffix, remote+"/"+baseLocal, err.Error())
|
|
return
|
|
}
|
|
err = os.Rename(local+suffix, local)
|
|
if err != nil {
|
|
log.Printf("[ERR] Rename Local File: %s -> %s; %s\r\n", local+suffix, local, err.Error())
|
|
return
|
|
}
|
|
}
|
|
log.Printf("[MSG] Upload OK: %s\r\n", local)
|
|
}
|