sshx.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package sshx
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "gadmin/internal/admin/forms"
  6. "net"
  7. "os"
  8. "strconv"
  9. "time"
  10. "github.com/sirupsen/logrus"
  11. "golang.org/x/crypto/ssh"
  12. )
  13. type Message struct {
  14. Code int `json:"code"`
  15. Err string `json:"err"`
  16. Data any `json:"data"`
  17. }
  18. type Version struct {
  19. Err string `json:"error"`
  20. Data []string `json:"data"`
  21. }
  22. func Session(user, password, host string, port int) (sshSession *ssh.Session, err error) { //参数: 远程服务器用户名, 密码, ip, 端口
  23. sshClient, err := connector(user, password, host, port) //连接ssh
  24. if err != nil {
  25. return
  26. }
  27. sshSession, err = sshClient.NewSession()
  28. return
  29. }
  30. func connector(user, password, host string, port int) (sshClient *ssh.Client, err error) {
  31. auth := make([]ssh.AuthMethod, 0)
  32. auth = append(auth, ssh.Password(password))
  33. clientConfig := &ssh.ClientConfig{
  34. User: user,
  35. Auth: auth,
  36. Timeout: 30 * time.Second,
  37. HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
  38. return nil
  39. },
  40. }
  41. addr := host + ":" + strconv.Itoa(port)
  42. sshClient, err = ssh.Dial("tcp", addr, clientConfig) //连接ssh
  43. return
  44. }
  45. // ReleaseVersion 发版
  46. func ReleaseVersion(v string, i int) (err error) {
  47. session, err := Session(os.Getenv("LOGIN_SSH_USER"), os.Getenv("LOGIN_SSH_PASSWORD"), os.Getenv("LOGIN_SSH_HOST"), 22)
  48. if err != nil {
  49. return
  50. }
  51. defer session.Close()
  52. session.Stdout = os.Stdout
  53. session.Stderr = os.Stderr
  54. session.Stdin = os.Stdin
  55. cmd := fmt.Sprintf("cd %v && sudo ./version -op='update' -p='%v' -v='%v' -i='%v'", os.Getenv("LOGIN_RELEASE_PATH"), os.Getenv("LOGIN_RELEASE_PATH"), v, i)
  56. logrus.Warnf("ReleaseVersion cmd:%+v ", cmd)
  57. return session.Run(cmd)
  58. }
  59. // VersionList 版本列表
  60. func VersionList() (ds []string, err error) {
  61. session, err := Session(os.Getenv("LOGIN_SSH_USER"), os.Getenv("LOGIN_SSH_PASSWORD"), os.Getenv("LOGIN_SSH_HOST"), 22)
  62. if err != nil {
  63. return
  64. }
  65. defer session.Close()
  66. cmd := fmt.Sprintf("cd %v && sudo ./version -op='scan' ", os.Getenv("LOGIN_RELEASE_PATH"))
  67. b, err := session.Output(cmd)
  68. if err != nil {
  69. return
  70. }
  71. var ver Version
  72. err = json.Unmarshal(b, &ver)
  73. if err != nil {
  74. return
  75. }
  76. ds = ver.Data
  77. logrus.Warnf("VersionList cmd:%+v b:%+v ds:%+v err:%+v", cmd, string(b), ds, err)
  78. return
  79. }
  80. // GetVersionIndex 版本列表
  81. func GetVersionIndex(req forms.GetVersionIndexReq) (res *Message, err error) {
  82. session, err := Session(os.Getenv("LOGIN_SSH_USER"), os.Getenv("LOGIN_SSH_PASSWORD"), os.Getenv("LOGIN_SSH_HOST"), 22)
  83. if err != nil {
  84. return
  85. }
  86. defer session.Close()
  87. cmd := fmt.Sprintf("cd %v && sudo ./version -op='index' -p='%v' -v='%v'", os.Getenv("LOGIN_RELEASE_PATH"), os.Getenv("LOGIN_RELEASE_PATH"), req.Version)
  88. b, err := session.Output(cmd)
  89. if err != nil {
  90. return
  91. }
  92. logrus.Warnf("GetVersionIndex cmd:%+v b:%+v", cmd, string(b))
  93. err = json.Unmarshal(b, &res)
  94. return
  95. }