utils.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package servicelib
  2. import (
  3. "crypto/sha256"
  4. "encoding/hex"
  5. "fmt"
  6. "io"
  7. "net"
  8. "net/url"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. )
  13. func IsAddrInUse(network, addr string) bool {
  14. ln, err := net.Listen(network, addr)
  15. if err != nil {
  16. return true
  17. }
  18. _ = ln.Close()
  19. return false
  20. }
  21. func WriteVersionFile(dir, version string) error {
  22. file := filepath.Join(dir, "version.txt")
  23. tmp := file + ".tmp"
  24. if err := os.MkdirAll(dir, 0755); err != nil {
  25. return err
  26. }
  27. if err := os.WriteFile(tmp, []byte(version+"\n"), 0644); err != nil {
  28. return err
  29. }
  30. return os.Rename(tmp, file)
  31. }
  32. func ReadVersionFile(dir string) (string, error) {
  33. file := filepath.Join(dir, "version.txt")
  34. data, err := os.ReadFile(file)
  35. if err != nil {
  36. return "", err
  37. }
  38. return strings.TrimSpace(string(data)), nil
  39. }
  40. type UpgradeURL struct {
  41. Scheme string
  42. Host string
  43. User string
  44. Pass string
  45. Path string
  46. }
  47. func ParseUpgradeURL(rawURL string) (*UpgradeURL, error) {
  48. u, err := url.Parse(rawURL)
  49. if err != nil {
  50. return nil, fmt.Errorf("invalid url: %w", err)
  51. }
  52. if u.Scheme == "" {
  53. return nil, fmt.Errorf("scheme is required")
  54. }
  55. scheme := strings.ToLower(u.Scheme)
  56. switch scheme {
  57. case "ftp", "ftps", "http", "https":
  58. default:
  59. return nil, fmt.Errorf("unsupported scheme: %s", scheme)
  60. }
  61. if u.Host == "" {
  62. return nil, fmt.Errorf("host is required")
  63. }
  64. result := &UpgradeURL{
  65. Scheme: scheme,
  66. Host: u.Host,
  67. Path: u.Path,
  68. }
  69. if u.User != nil {
  70. result.User = u.User.Username()
  71. if pass, ok := u.User.Password(); ok {
  72. result.Pass = pass
  73. }
  74. }
  75. return result, nil
  76. }
  77. func CheckFileSHA256(file string, expected string) error {
  78. f, err := os.Open(file)
  79. if err != nil {
  80. return err
  81. }
  82. defer f.Close()
  83. hash := sha256.New()
  84. if _, err := io.Copy(hash, f); err != nil {
  85. return err
  86. }
  87. actual := hex.EncodeToString(hash.Sum(nil))
  88. if !strings.EqualFold(actual, expected) {
  89. return fmt.Errorf("文件校验失败: 期望 %s, 实际 %s", expected, actual)
  90. }
  91. return nil
  92. }