| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- // package serv_rpc -- сервер RPC-запросов
- package serv_rpc
- import (
- "fmt"
- "log"
- "net"
- "net/http"
- "net/rpc"
- "os"
- "wartank/pkg/types"
- )
- type ServRpc struct {
- serv types.IServer
- }
- // NewServRpc -- возвращает новый сервер RPC-запросов
- func NewServRpc(serv types.IServer) (*ServRpc, error) {
- if serv == nil {
- return nil, fmt.Errorf("NewServRpc(): IServer==nil")
- }
- sf := &ServRpc{
- serv: serv,
- }
- return sf, nil
- }
- // Run -- запускает сервис в работу
- func (sf *ServRpc) Run() {
- rpc.Register(sf)
- rpc.HandleHTTP()
- url := os.Getenv("SERVER_RPC_URL")
- if url == "" {
- log.Printf("ServRpc.Run(): env SERVER_RPC_URL not set\n")
- return
- }
- log.Printf("SERVER_RPC_URL=%v\n", url)
- lister, err := net.Listen("tcp", url)
- if err != nil {
- log.Printf("NewServRc(): listen error, err=\n\t%v\n", err)
- sf.serv.CancelApp()
- return
- }
- go http.Serve(lister, nil)
- }
- // EchoReq -- эхо запрос на сервер
- type EchoReq struct{}
- // EchoResp -- эхо ответ на запрос
- type EchoResp struct {
- Result string
- }
- // Echo -- эхо запрос для клиента
- func (sf *ServRpc) Echo(req *EchoReq, resp *EchoResp) error {
- log.Println("ServRpc.Echo()")
- resp.Result = "WarTank!"
- return nil
- }
- // LoginReq -- запрос на логин на сервер
- type LoginReq struct {
- Login string
- Pass string
- }
- // LoginResp -- ответ на запрос логина
- //
- // Вернёт ошибку если:
- // 1. Нужно создать админа
- // 2. Неверная пара логин/пароль
- type LoginResp struct {
- Result string
- }
- // Login -- запросвхода на сервер
- func (sf *ServRpc) Login(req *LoginReq, resp *LoginResp) error {
- log.Println("ServRpc.Login()")
- store := sf.serv.Store()
- _, err := store.Get("/users/admin")
- if err != nil {
- return fmt.Errorf("ServRpc.Login(): not have admin")
- }
- binData, err := store.Get("/users/" + req.Login)
- if err != nil {
- return fmt.Errorf("ServRpc.Login(): bad account")
- }
- strPass := string(binData)
- if req.Pass != strPass {
- return fmt.Errorf("ServRpc.Login(): bad account")
- }
- resp.Result = "ok"
- return nil
- }
- // MakeAdminReq -- запрос насоздание админа
- type MakeAdminReq struct {
- Pass string
- }
- // MakeAdminResp -- ответ на создание админа
- type MakeAdminResp struct {
- Result string
- }
- // MakeAdmin -- создание админа на бот-сервере
- func (sf *ServRpc) MakeAdmin(req *MakeAdminReq, resp *MakeAdminResp) error {
- log.Println("ServRpc.MakeAdmin()")
- store := sf.serv.Store()
- _, err := store.Get("/users/admin")
- if err == nil {
- return fmt.Errorf("ServRpc.Login(): admin already exists")
- }
- err = store.Put("/users/admin", req.Pass)
- if err != nil {
- return fmt.Errorf("ServRpc.Login(): in put admin to store, err=\n\t%w", err)
- }
- resp.Result = "ok"
- return nil
- }
|