serv_rpc.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. store := sf.serv.Store()
  72. binData, err := store.Get("/users/" + req.Login)
  73. if err != nil {
  74. return fmt.Errorf("ServRpc.Login(): bad account")
  75. }
  76. strPass := string(binData)
  77. if req.Pass != strPass {
  78. return fmt.Errorf("ServRpc.Login(): bad account")
  79. }
  80. resp.Result = "ok"
  81. return nil
  82. }