support temporary filename suffix while uploading

This commit is contained in:
r0n1n7an 2025-08-04 19:27:32 +08:00
parent e299ca4c24
commit e2b96364e8

View File

@ -14,27 +14,29 @@ import (
) )
var ( var (
host string = "" host string = ""
port string = "" port string = ""
user string = "" user string = ""
pswd string = "" pswd string = ""
loc string = "" loc string = ""
rmt string = "" rmt string = ""
act string = "" act string = ""
retry int = 0 suffix string = ""
intrv int = 0 retry int = 0
intrv int = 0
) )
var ftp *goftp.FTP var ftp *goftp.FTP
func init() { func init() {
//flag.StringVar(&host, "h", "203.93.100.58", "FTPS Server Address") //flag.StringVar(&host, "h", "203.93.100.58", "FTPS Server Address")
flag.StringVar(&host, "h", "10.60.254.52", "FTPS Server Address") flag.StringVar(&host, "s", "10.60.254.52", "FTPS Server Address")
flag.StringVar(&port, "o", "3031", "FTPS Server Port") flag.StringVar(&port, "o", "3031", "FTPS Server Port")
flag.StringVar(&user, "u", "idte", "Username") flag.StringVar(&user, "u", "idte", "Username")
flag.StringVar(&pswd, "p", "wistronTE2022", "Password") flag.StringVar(&pswd, "p", "wistronTE2022", "Password")
flag.StringVar(&loc, "L", "./", "Local Path") flag.StringVar(&loc, "L", "./", "Local Path")
flag.StringVar(&rmt, "R", "/", "Remote Path") flag.StringVar(&rmt, "R", "/", "Remote Path")
flag.StringVar(&act, "A", "list", "Action: list,upld,dnld") 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(&intrv, "I", 10, "Retry Interval (Seconds)")
flag.IntVar(&retry, "T", 5, "Retry Times") flag.IntVar(&retry, "T", 5, "Retry Times")
flag.Parse() flag.Parse()
@ -118,14 +120,14 @@ func _List(path string) {
func _Download(local, remote string) { func _Download(local, remote string) {
log.Printf("[MSG] Downloading: %s\r\n", remote) log.Printf("[MSG] Downloading: %s\r\n", remote)
var err error var err error
base := filepath.Base(remote) baseRemote := filepath.Base(remote)
for i := 0; i <= retry; i++ { for i := 0; i <= retry; i++ {
if i > 0 { if i > 0 {
time.Sleep(time.Second * time.Duration(intrv)) time.Sleep(time.Second * time.Duration(intrv))
log.Printf("[###] Retrying Download %d/%d: %s\r\n", i, retry, remote) log.Printf("[###] Retrying Download %d/%d: %s\r\n", i, retry, remote)
} }
_, err = ftp.Retr(remote, func(rdr io.Reader) error { _, err = ftp.Retr(remote, func(rdr io.Reader) error {
wtr, oserr := os.Create(local + base) wtr, oserr := os.Create(local + baseRemote)
if oserr != nil { if oserr != nil {
return oserr return oserr
} }
@ -150,26 +152,46 @@ func _Download(local, remote string) {
func _Upload(local, remote string) { func _Upload(local, remote string) {
log.Printf("[MSG] Uploading: %s\r\n", local) log.Printf("[MSG] Uploading: %s\r\n", local)
baseLocal := filepath.Base(local)
var err error 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++ { for i := 0; i <= retry; i++ {
if i > 0 { if i > 0 {
time.Sleep(time.Second * time.Duration(intrv)) time.Sleep(time.Second * time.Duration(intrv))
log.Printf("[###] Retrying Upload %d/%d: %s\r\n", i, retry, local) log.Printf("[###] Retrying Upload %d/%d: %s\r\n", i, retry, local+suffix)
} }
err = ftp.Cwd(remote) err = ftp.Cwd(remote)
if err != nil { if err != nil {
continue continue
} }
err = ftp.Upload(local) err = ftp.Upload(local + suffix)
if err != nil { if err != nil {
continue continue
} }
break break
} }
if err != nil { if err != nil {
log.Printf("[***] %s; %s\r\n", remote, local) log.Printf("[***] %s; %s\r\n", remote, local+suffix)
log.Printf("[ERR] Upload NG: %s; %s", local, err.Error()) log.Printf("[ERR] Upload NG: %s; %s", local+suffix, err.Error())
return 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) log.Printf("[MSG] Upload OK: %s\r\n", local)
} }