package main import ( "context" "encoding/hex" "encoding/json" "fmt" "io" "os" "rtu_linux_services/servicelib" "strings" "time" "hnyfkj.com.cn/rtu/linux/utils/ftpclient" ) func getFtpUpgradeInfo(ctx context.Context, u *servicelib.UpgradeURL, timeout time.Duration) (upgradeInfo, error) { localFile, err := ftpclient.DownloadFileFromFtp(ctx, u.Host, u.User, u.Pass, u.Path, timeout) if err != nil { return upgradeInfo{}, err } defer os.Remove(localFile) data, err := os.ReadFile(localFile) if err != nil { return upgradeInfo{}, err } var info upgradeInfo if err := json.Unmarshal(data, &info); err != nil { return upgradeInfo{}, err } info.Version = strings.TrimSpace(info.Version) info.SHA256 = strings.TrimSpace(info.SHA256) if info.Version == "" { return upgradeInfo{}, fmt.Errorf("升级版本号不能为空") } if info.SHA256 == "" { return upgradeInfo{}, fmt.Errorf("升级校验值不能为空") } if len(info.SHA256) != 64 { return upgradeInfo{}, fmt.Errorf("升级校验值长度错误") } if _, err := hex.DecodeString(info.SHA256); err != nil { return upgradeInfo{}, fmt.Errorf("升级校验值格式错误") } return info, nil } func downloadFtpUpgradePackage(ctx context.Context, u *servicelib.UpgradeURL, localFile string, timeout time.Duration) error { file, err := ftpclient.DownloadFileFromFtp(ctx, u.Host, u.User, u.Pass, u.Path, timeout) if err != nil { return err } defer os.Remove(file) src, err := os.Open(file) if err != nil { return err } defer src.Close() dst, err := os.Create(localFile) if err != nil { return err } if _, err := io.Copy(dst, src); err != nil { dst.Close() _ = os.Remove(localFile) return err } if err := dst.Close(); err != nil { _ = os.Remove(localFile) return err } return nil }