serverCmd.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package service
  2. import (
  3. "fmt"
  4. "github.com/lejianwen/rustdesk-api/v2/model"
  5. "net"
  6. "time"
  7. )
  8. type ServerCmdService struct{}
  9. // List
  10. func (is *ServerCmdService) List(page, pageSize uint) (res *model.ServerCmdList) {
  11. res = &model.ServerCmdList{}
  12. res.Page = int64(page)
  13. res.PageSize = int64(pageSize)
  14. tx := DB.Model(&model.ServerCmd{})
  15. tx.Count(&res.Total)
  16. tx.Scopes(Paginate(page, pageSize))
  17. tx.Find(&res.ServerCmds)
  18. return
  19. }
  20. // Info
  21. func (is *ServerCmdService) Info(id uint) *model.ServerCmd {
  22. u := &model.ServerCmd{}
  23. DB.Where("id = ?", id).First(u)
  24. return u
  25. }
  26. // Delete
  27. func (is *ServerCmdService) Delete(u *model.ServerCmd) error {
  28. return DB.Delete(u).Error
  29. }
  30. // Create
  31. func (is *ServerCmdService) Create(u *model.ServerCmd) error {
  32. res := DB.Create(u).Error
  33. return res
  34. }
  35. // SendCmd 发送命令
  36. func (is *ServerCmdService) SendCmd(target string, cmd string, arg string) (string, error) {
  37. port := 0
  38. switch target {
  39. case model.ServerCmdTargetIdServer:
  40. port = Config.Rustdesk.IdServerPort - 1
  41. case model.ServerCmdTargetRelayServer:
  42. port = Config.Rustdesk.RelayServerPort
  43. }
  44. //组装命令
  45. cmd = cmd + " " + arg
  46. res, err := is.SendSocketCmd("v6", port, cmd)
  47. if err == nil {
  48. return res, nil
  49. }
  50. //v6连接失败,尝试v4
  51. res, err = is.SendSocketCmd("v4", port, cmd)
  52. if err == nil {
  53. return res, nil
  54. }
  55. return "", err
  56. }
  57. // SendSocketCmd
  58. func (is *ServerCmdService) SendSocketCmd(ty string, port int, cmd string) (string, error) {
  59. addr := "[::1]"
  60. tcp := "tcp6"
  61. if ty == "v4" {
  62. tcp = "tcp"
  63. addr = "127.0.0.1"
  64. }
  65. conn, err := net.Dial(tcp, fmt.Sprintf("%s:%v", addr, port))
  66. if err != nil {
  67. Logger.Debugf("%s connect to id server failed: %v", ty, err)
  68. return "", err
  69. }
  70. defer conn.Close()
  71. //发送命令
  72. _, err = conn.Write([]byte(cmd))
  73. if err != nil {
  74. Logger.Debugf("%s send cmd failed: %v", ty, err)
  75. return "", err
  76. }
  77. time.Sleep(100 * time.Millisecond)
  78. //读取返回
  79. buf := make([]byte, 1024)
  80. n, err := conn.Read(buf)
  81. if err != nil && err.Error() != "EOF" {
  82. Logger.Debugf("%s read response failed: %v", ty, err)
  83. return "", err
  84. }
  85. return string(buf[:n]), nil
  86. }
  87. func (is *ServerCmdService) Update(f *model.ServerCmd) error {
  88. return DB.Model(f).Updates(f).Error
  89. }