ftps-client-go/ftpsClient.go

198 lines
4.4 KiB
Go
Raw Normal View History

2023-11-04 17:55:35 +08:00
package main
import (
"crypto/tls"
"flag"
"fmt"
2023-11-05 00:16:24 +08:00
"io"
2023-11-04 17:55:35 +08:00
"log"
"os"
2023-11-05 00:16:24 +08:00
"path/filepath"
2023-11-04 17:55:35 +08:00
"time"
2023-11-05 00:16:24 +08:00
"gopkg.in/dutchcoders/goftp.v1"
2023-11-04 17:55:35 +08:00
)
var (
host string = ""
port string = ""
user string = ""
pswd string = ""
loc string = ""
rmt string = ""
act string = ""
suffix string = ""
retry int = 0
intrv int = 0
2023-11-04 17:55:35 +08:00
)
2023-11-06 09:39:10 +08:00
var ftp *goftp.FTP
2023-11-04 17:55:35 +08:00
func init() {
2023-11-06 09:45:04 +08:00
//flag.StringVar(&host, "h", "203.93.100.58", "FTPS Server Address")
flag.StringVar(&host, "s", "10.60.254.52", "FTPS Server Address")
2023-11-04 17:55:35 +08:00
flag.StringVar(&port, "o", "3031", "FTPS Server Port")
flag.StringVar(&user, "u", "idte", "Username")
flag.StringVar(&pswd, "p", "wistronTE2022", "Password")
2023-11-05 00:16:24 +08:00
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")
2023-11-05 00:16:24 +08:00
flag.IntVar(&intrv, "I", 10, "Retry Interval (Seconds)")
flag.IntVar(&retry, "T", 5, "Retry Times")
2023-11-04 17:55:35 +08:00
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)
}
2023-11-06 09:39:10 +08:00
err := _InitFTP()
2023-11-04 17:55:35 +08:00
if err != nil {
os.Exit(1)
}
2023-11-06 14:20:46 +08:00
defer ftp.Close()
2023-11-05 00:16:24 +08:00
switch act {
case "list":
2023-11-06 09:39:10 +08:00
_List(rmt)
2023-11-05 00:16:24 +08:00
case "dnld":
2023-11-06 09:39:10 +08:00
_Download(loc, rmt)
2023-11-05 00:16:24 +08:00
case "upld":
2023-11-06 09:39:10 +08:00
_Upload(loc, rmt)
2023-11-05 00:16:24 +08:00
default:
2023-11-06 09:39:10 +08:00
_List(rmt)
}
}
func _InitFTP() error {
var err error
for i := 0; i <= retry; i++ {
if i > 0 {
2023-11-07 10:02:42 +08:00
log.Println("[###] Retrying Connect ...")
2023-11-06 09:39:10 +08:00
}
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
}
2023-11-06 14:00:58 +08:00
break
2023-11-06 09:39:10 +08:00
}
if err != nil {
log.Printf("[***] %s; %s\r\n", rmt, loc)
return err
2023-11-05 00:16:24 +08:00
}
2023-11-06 09:39:10 +08:00
return nil
2023-11-05 00:16:24 +08:00
}
2023-11-06 09:39:10 +08:00
func _List(path string) {
2023-11-05 00:16:24 +08:00
files, err := ftp.List(path)
if err != nil {
log.Printf("[ERR] %s\r\n", err.Error())
return
}
for _, f := range files {
fmt.Print(f)
}
}
2023-11-06 09:39:10 +08:00
func _Download(local, remote string) {
2023-11-05 00:16:24 +08:00
log.Printf("[MSG] Downloading: %s\r\n", remote)
var err error
baseRemote := filepath.Base(remote)
2023-11-05 00:16:24 +08:00
for i := 0; i <= retry; i++ {
if i > 0 {
time.Sleep(time.Second * time.Duration(intrv))
2023-11-06 09:39:10 +08:00
log.Printf("[###] Retrying Download %d/%d: %s\r\n", i, retry, remote)
2023-11-05 00:16:24 +08:00
}
_, err = ftp.Retr(remote, func(rdr io.Reader) error {
wtr, oserr := os.Create(local + baseRemote)
2023-11-05 00:16:24 +08:00
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 {
2023-11-06 09:39:10 +08:00
log.Printf("[***] %s; %s\r\n", remote, local)
2023-11-07 10:02:42 +08:00
log.Printf("[ERR] Download NG: %s; %s", remote, err.Error())
2023-11-05 00:16:24 +08:00
return
}
log.Printf("[MSG] Download OK: %s\r\n", remote)
}
2023-11-06 09:39:10 +08:00
func _Upload(local, remote string) {
2023-11-05 00:16:24 +08:00
log.Printf("[MSG] Uploading: %s\r\n", local)
baseLocal := filepath.Base(local)
2023-11-05 00:16:24 +08:00
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
}
}
2023-11-05 00:16:24 +08:00
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)
2023-11-05 00:16:24 +08:00
}
err = ftp.Cwd(remote)
if err != nil {
continue
}
err = ftp.Upload(local + suffix)
2023-11-05 00:16:24 +08:00
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())
2023-11-05 00:16:24 +08:00
return
2023-11-04 17:55:35 +08:00
}
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
}
}
2023-11-05 00:16:24 +08:00
log.Printf("[MSG] Upload OK: %s\r\n", local)
2023-11-04 17:55:35 +08:00
}