upgrade_ftp.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "context"
  4. "encoding/hex"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "os"
  9. "rtu_linux_services/servicelib"
  10. "strings"
  11. "time"
  12. "hnyfkj.com.cn/rtu/linux/utils/ftpclient"
  13. )
  14. func getFtpUpgradeInfo(ctx context.Context, u *servicelib.UpgradeURL, timeout time.Duration) (upgradeInfo, error) {
  15. localFile, err := ftpclient.DownloadFileFromFtp(ctx, u.Host, u.User, u.Pass, u.Path, timeout)
  16. if err != nil {
  17. return upgradeInfo{}, err
  18. }
  19. defer os.Remove(localFile)
  20. data, err := os.ReadFile(localFile)
  21. if err != nil {
  22. return upgradeInfo{}, err
  23. }
  24. var info upgradeInfo
  25. if err := json.Unmarshal(data, &info); err != nil {
  26. return upgradeInfo{}, err
  27. }
  28. info.Version = strings.TrimSpace(info.Version)
  29. info.SHA256 = strings.TrimSpace(info.SHA256)
  30. if info.Version == "" {
  31. return upgradeInfo{}, fmt.Errorf("升级版本号不能为空")
  32. }
  33. if info.SHA256 == "" {
  34. return upgradeInfo{}, fmt.Errorf("升级校验值不能为空")
  35. }
  36. if len(info.SHA256) != 64 {
  37. return upgradeInfo{}, fmt.Errorf("升级校验值长度错误")
  38. }
  39. if _, err := hex.DecodeString(info.SHA256); err != nil {
  40. return upgradeInfo{}, fmt.Errorf("升级校验值格式错误")
  41. }
  42. return info, nil
  43. }
  44. func downloadFtpUpgradePackage(ctx context.Context, u *servicelib.UpgradeURL, localFile string, timeout time.Duration) error {
  45. file, err := ftpclient.DownloadFileFromFtp(ctx, u.Host, u.User, u.Pass, u.Path, timeout)
  46. if err != nil {
  47. return err
  48. }
  49. defer os.Remove(file)
  50. src, err := os.Open(file)
  51. if err != nil {
  52. return err
  53. }
  54. defer src.Close()
  55. dst, err := os.Create(localFile)
  56. if err != nil {
  57. return err
  58. }
  59. if _, err := io.Copy(dst, src); err != nil {
  60. dst.Close()
  61. _ = os.Remove(localFile)
  62. return err
  63. }
  64. if err := dst.Close(); err != nil {
  65. _ = os.Remove(localFile)
  66. return err
  67. }
  68. return nil
  69. }