serv_rpc.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // package serv_rpc -- сервер RPC-запросов
  2. package serv_rpc
  3. import (
  4. "fmt"
  5. "log"
  6. "net"
  7. "net/http"
  8. "net/rpc"
  9. "os"
  10. "wartank/pkg/types"
  11. )
  12. type ServRpc struct {
  13. serv types.IServer
  14. }
  15. // NewServRpc -- возвращает новый сервер RPC-запросов
  16. func NewServRpc(serv types.IServer) (*ServRpc, error) {
  17. if serv == nil {
  18. return nil, fmt.Errorf("NewServRpc(): IServer==nil")
  19. }
  20. sf := &ServRpc{
  21. serv: serv,
  22. }
  23. return sf, nil
  24. }
  25. // Run -- запускает сервис в работу
  26. func (sf *ServRpc) Run() {
  27. rpc.Register(sf)
  28. rpc.HandleHTTP()
  29. url := os.Getenv("SERVER_RPC_URL")
  30. if url == "" {
  31. log.Printf("ServRpc.Run(): env SERVER_RPC_URL not set\n")
  32. return
  33. }
  34. log.Printf("SERVER_RPC_URL=%v\n", url)
  35. lister, err := net.Listen("tcp", url)
  36. if err != nil {
  37. log.Printf("NewServRc(): listen error, err=\n\t%v\n", err)
  38. sf.serv.CancelApp()
  39. return
  40. }
  41. go http.Serve(lister, nil)
  42. }
  43. // EchoReq -- эхо запрос на сервер
  44. type EchoReq struct{}
  45. // EchoResp -- эхо ответ на запрос
  46. type EchoResp struct {
  47. Result string
  48. }
  49. // Echo -- эхо запрос для клиента
  50. func (sf *ServRpc) Echo(req *EchoReq, resp *EchoResp) error {
  51. log.Println("ServRpc.Echo()")
  52. resp.Result = "WarTank!"
  53. return nil
  54. }
  55. // LoginReq -- запрос на логин на сервер
  56. type LoginReq struct {
  57. Login string
  58. Pass string
  59. }
  60. // LoginResp -- ответ на запрос логина
  61. //
  62. // Вернёт ошибку если:
  63. // 1. Нужно создать админа
  64. // 2. Неверная пара логин/пароль
  65. type LoginResp struct {
  66. Result string
  67. }
  68. // Login -- запросвхода на сервер
  69. func (sf *ServRpc) Login(req *LoginReq, resp *LoginResp) error {
  70. log.Println("ServRpc.Login()")
  71. if !sf.checkUser(req.Login, req.Pass) {
  72. if err := sf.newUser(req.Login, req.Pass); err != nil {
  73. return fmt.Errorf("ServRpc.Login(): in create login(%q/%q), err=\n\t%w", req.Login, req.Pass, err)
  74. }
  75. }
  76. resp.Result = "ok"
  77. return nil
  78. }
  79. // Создаёт нового пользователя
  80. func (sf *ServRpc) newUser(login, pass string) error {
  81. log.Println("ServRpc.newUser()")
  82. if login == "" {
  83. return fmt.Errorf("ServRpc.newUser(): login is empty")
  84. }
  85. if pass == "" {
  86. return fmt.Errorf("ServRpc.newUser(): pass is empty")
  87. }
  88. store := sf.serv.Store()
  89. err := store.Put("/users/"+login, pass)
  90. if err != nil {
  91. return fmt.Errorf("ServRpc.newUser(): in create user, err=\n\t%w", err)
  92. }
  93. return nil
  94. }
  95. // AddBotReq -- запрос добавления бота на сервер
  96. type AddBotReq struct {
  97. Login string
  98. Pass string
  99. BotLogin string
  100. BotPass string
  101. }
  102. // AddBotResp -- ответ добавления бота на сервер
  103. type AddBotResp struct {
  104. Result string
  105. }
  106. // AddBot -- добавляет бота на сервер
  107. func (sf *ServRpc) AddBot(req *AddBotReq, resp *AddBotResp) error {
  108. log.Println("ServRpc.AddBot()")
  109. if !sf.checkUser(req.Login, req.Pass) {
  110. return fmt.Errorf("ServRpc.AddBot(): bad login/pass")
  111. }
  112. if !sf.checkBot(req.BotLogin, req.BotPass) {
  113. if err := sf.newBot(req.BotLogin, req.BotPass); err != nil {
  114. return fmt.Errorf("ServRpc.AddBot(): in save bot(%q/%q), err=\n\t%w", req.BotLogin, req.BotPass, err)
  115. }
  116. }
  117. resp.Result = "ok"
  118. return nil
  119. }
  120. // Создаёт нового бота по требованию
  121. func (sf *ServRpc) newBot(login, pass string) error {
  122. log.Println("ServRpc.newBot()")
  123. if login == "" {
  124. return fmt.Errorf("ServRpc.newBot(): login is empty")
  125. }
  126. if pass == "" {
  127. return fmt.Errorf("ServRpc.newBot(): pass is empty")
  128. }
  129. store := sf.serv.Store()
  130. err := store.Put("/bots/"+login, pass)
  131. if err != nil {
  132. return fmt.Errorf("ServRpc.newBot(): in create bot, err=\n\t%w", err)
  133. }
  134. return nil
  135. }
  136. // Проверяет наличие бота в базе
  137. func (sf *ServRpc) checkBot(login, pass string) bool {
  138. log.Println("ServRpc.checkBot()")
  139. store := sf.serv.Store()
  140. binData, err := store.Get("/bots/" + login)
  141. if err != nil { // Нет такого логина бота
  142. return false
  143. }
  144. strPass := string(binData)
  145. return pass == strPass
  146. }
  147. // Проверяет пользователя по логину/паролю
  148. func (sf *ServRpc) checkUser(login, pass string) bool {
  149. log.Println("ServRpc.checkUser()")
  150. store := sf.serv.Store()
  151. binData, err := store.Get("/users/" + login)
  152. if err != nil { // Нет такого логина
  153. return false
  154. }
  155. strPass := string(binData)
  156. return pass == strPass
  157. }