serverCmd.go 2.3 KB

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