rpc.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. package api
  2. import (
  3. "os"
  4. "time"
  5. "google.golang.org/grpc"
  6. "github.com/Sirupsen/logrus"
  7. "github.com/cad/ovpm"
  8. "github.com/cad/ovpm/pb"
  9. "golang.org/x/net/context"
  10. )
  11. type UserService struct{}
  12. func (s *UserService) List(ctx context.Context, req *pb.UserListRequest) (*pb.UserResponse, error) {
  13. logrus.Debug("rpc call: user list")
  14. var ut []*pb.UserResponse_User
  15. users, err := ovpm.GetAllUsers()
  16. if err != nil {
  17. logrus.Errorf("users can not be fetched: %v", err)
  18. os.Exit(1)
  19. return nil, err
  20. }
  21. for _, user := range users {
  22. ut = append(ut, &pb.UserResponse_User{
  23. ServerSerialNumber: user.GetServerSerialNumber(),
  24. Username: user.GetUsername(),
  25. CreatedAt: user.GetCreatedAt(),
  26. IPNet: user.GetIPNet(),
  27. NoGW: user.IsNoGW(),
  28. HostID: user.GetHostID(),
  29. })
  30. }
  31. return &pb.UserResponse{Users: ut}, nil
  32. }
  33. func (s *UserService) Create(ctx context.Context, req *pb.UserCreateRequest) (*pb.UserResponse, error) {
  34. logrus.Debugf("rpc call: user create: %s", req.Username)
  35. var ut []*pb.UserResponse_User
  36. user, err := ovpm.CreateNewUser(req.Username, req.Password, req.NoGW, req.HostID)
  37. if err != nil {
  38. return nil, err
  39. }
  40. pbUser := pb.UserResponse_User{
  41. Username: user.GetUsername(),
  42. ServerSerialNumber: user.GetServerSerialNumber(),
  43. NoGW: user.IsNoGW(),
  44. HostID: user.GetHostID(),
  45. }
  46. ut = append(ut, &pbUser)
  47. return &pb.UserResponse{Users: ut}, nil
  48. }
  49. func (s *UserService) Update(ctx context.Context, req *pb.UserUpdateRequest) (*pb.UserResponse, error) {
  50. logrus.Debugf("rpc call: user update: %s", req.Username)
  51. var ut []*pb.UserResponse_User
  52. user, err := ovpm.GetUser(req.Username)
  53. if err != nil {
  54. return nil, err
  55. }
  56. var noGW bool
  57. switch req.Gwpref {
  58. case pb.UserUpdateRequest_NOGW:
  59. noGW = true
  60. case pb.UserUpdateRequest_GW:
  61. noGW = false
  62. default:
  63. noGW = user.NoGW
  64. }
  65. user.Update(req.Password, noGW, req.HostID)
  66. pbUser := pb.UserResponse_User{
  67. Username: user.GetUsername(),
  68. ServerSerialNumber: user.GetServerSerialNumber(),
  69. NoGW: user.IsNoGW(),
  70. HostID: user.GetHostID(),
  71. }
  72. ut = append(ut, &pbUser)
  73. return &pb.UserResponse{Users: ut}, nil
  74. }
  75. func (s *UserService) Delete(ctx context.Context, req *pb.UserDeleteRequest) (*pb.UserResponse, error) {
  76. logrus.Debugf("rpc call: user delete: %s", req.Username)
  77. var ut []*pb.UserResponse_User
  78. user, err := ovpm.GetUser(req.Username)
  79. if err != nil {
  80. return nil, err
  81. }
  82. pbUser := pb.UserResponse_User{
  83. Username: user.GetUsername(),
  84. ServerSerialNumber: user.GetServerSerialNumber(),
  85. HostID: user.GetHostID(),
  86. }
  87. ut = append(ut, &pbUser)
  88. err = user.Delete()
  89. if err != nil {
  90. return nil, err
  91. }
  92. return &pb.UserResponse{Users: ut}, nil
  93. }
  94. func (s *UserService) Renew(ctx context.Context, req *pb.UserRenewRequest) (*pb.UserResponse, error) {
  95. logrus.Debugf("rpc call: user renew cert: %s", req.Username)
  96. var ut []*pb.UserResponse_User
  97. user, err := ovpm.GetUser(req.Username)
  98. if err != nil {
  99. return nil, err
  100. }
  101. pbUser := pb.UserResponse_User{
  102. Username: user.GetUsername(),
  103. ServerSerialNumber: user.GetServerSerialNumber(),
  104. HostID: user.GetHostID(),
  105. }
  106. ut = append(ut, &pbUser)
  107. err = user.Renew()
  108. if err != nil {
  109. return nil, err
  110. }
  111. return &pb.UserResponse{Users: ut}, nil
  112. }
  113. func (s *UserService) GenConfig(ctx context.Context, req *pb.UserGenConfigRequest) (*pb.UserGenConfigResponse, error) {
  114. logrus.Debugf("rpc call: user genconfig: %s", req.Username)
  115. user, err := ovpm.GetUser(req.Username)
  116. if err != nil {
  117. return nil, err
  118. }
  119. configBlob, err := ovpm.DumpsClientConfig(user.GetUsername())
  120. if err != nil {
  121. return nil, err
  122. }
  123. return &pb.UserGenConfigResponse{ClientConfig: configBlob}, nil
  124. }
  125. type VPNService struct{}
  126. func (s *VPNService) Status(ctx context.Context, req *pb.VPNStatusRequest) (*pb.VPNStatusResponse, error) {
  127. logrus.Debugf("rpc call: vpn status")
  128. server, err := ovpm.GetServerInstance()
  129. if err != nil {
  130. return nil, err
  131. }
  132. response := pb.VPNStatusResponse{
  133. Name: server.Name,
  134. SerialNumber: server.SerialNumber,
  135. Hostname: server.Hostname,
  136. Port: server.Port,
  137. Cert: server.Cert,
  138. CACert: server.CACert,
  139. Net: server.Net,
  140. Mask: server.Mask,
  141. CreatedAt: server.CreatedAt.Format(time.UnixDate),
  142. }
  143. return &response, nil
  144. }
  145. func (s *VPNService) Init(ctx context.Context, req *pb.VPNInitRequest) (*pb.VPNInitResponse, error) {
  146. logrus.Debugf("rpc call: vpn init")
  147. if err := ovpm.Init(req.Hostname, req.Port); err != nil {
  148. logrus.Errorf("server can not be created: %v", err)
  149. }
  150. return &pb.VPNInitResponse{}, nil
  151. }
  152. type NetworkService struct{}
  153. func (s *NetworkService) List(ctx context.Context, req *pb.NetworkListRequest) (*pb.NetworkListResponse, error) {
  154. logrus.Debug("rpc call: network list")
  155. var nt []*pb.Network
  156. networks := ovpm.GetAllNetworks()
  157. for _, network := range networks {
  158. nt = append(nt, &pb.Network{
  159. Name: network.GetName(),
  160. CIDR: network.GetCIDR(),
  161. Type: network.GetType().String(),
  162. CreatedAt: network.GetCreatedAt(),
  163. AssociatedUsernames: network.GetAssociatedUsernames(),
  164. Via: network.GetVia(),
  165. })
  166. }
  167. return &pb.NetworkListResponse{Networks: nt}, nil
  168. }
  169. func (s *NetworkService) Create(ctx context.Context, req *pb.NetworkCreateRequest) (*pb.NetworkCreateResponse, error) {
  170. logrus.Debugf("rpc call: network create: %s", req.Name)
  171. network, err := ovpm.CreateNewNetwork(req.Name, req.CIDR, ovpm.NetworkTypeFromString(req.Type), req.Via)
  172. if err != nil {
  173. return nil, err
  174. }
  175. n := pb.Network{
  176. Name: network.GetName(),
  177. CIDR: network.GetCIDR(),
  178. Type: network.GetType().String(),
  179. CreatedAt: network.GetCreatedAt(),
  180. AssociatedUsernames: network.GetAssociatedUsernames(),
  181. Via: network.GetVia(),
  182. }
  183. return &pb.NetworkCreateResponse{Network: &n}, nil
  184. }
  185. func (s *NetworkService) Delete(ctx context.Context, req *pb.NetworkDeleteRequest) (*pb.NetworkDeleteResponse, error) {
  186. logrus.Debugf("rpc call: network delete: %s", req.Name)
  187. network, err := ovpm.GetNetwork(req.Name)
  188. if err != nil {
  189. return nil, err
  190. }
  191. err = network.Delete()
  192. if err != nil {
  193. return nil, err
  194. }
  195. n := pb.Network{
  196. Name: network.GetName(),
  197. CIDR: network.GetCIDR(),
  198. Type: network.GetType().String(),
  199. CreatedAt: network.GetCreatedAt(),
  200. AssociatedUsernames: network.GetAssociatedUsernames(),
  201. Via: network.GetVia(),
  202. }
  203. return &pb.NetworkDeleteResponse{Network: &n}, nil
  204. }
  205. func (s *NetworkService) GetAllTypes(ctx context.Context, req *pb.NetworkGetAllTypesRequest) (*pb.NetworkGetAllTypesResponse, error) {
  206. logrus.Debugf("rpc call: network get-types")
  207. var networkTypes []*pb.NetworkType
  208. for _, nt := range ovpm.GetAllNetworkTypes() {
  209. if nt == ovpm.UNDEFINEDNET {
  210. continue
  211. }
  212. networkTypes = append(networkTypes, &pb.NetworkType{Type: nt.String(), Description: nt.Description()})
  213. }
  214. return &pb.NetworkGetAllTypesResponse{Types: networkTypes}, nil
  215. }
  216. func (s *NetworkService) GetAssociatedUsers(ctx context.Context, req *pb.NetworkGetAssociatedUsersRequest) (*pb.NetworkGetAssociatedUsersResponse, error) {
  217. logrus.Debugf("rpc call: network get-associated-users")
  218. network, err := ovpm.GetNetwork(req.Name)
  219. if err != nil {
  220. return nil, err
  221. }
  222. usernames := network.GetAssociatedUsernames()
  223. return &pb.NetworkGetAssociatedUsersResponse{Usernames: usernames}, nil
  224. }
  225. func (s *NetworkService) Associate(ctx context.Context, req *pb.NetworkAssociateRequest) (*pb.NetworkAssociateResponse, error) {
  226. logrus.Debugf("rpc call: network associate")
  227. network, err := ovpm.GetNetwork(req.Name)
  228. if err != nil {
  229. return nil, err
  230. }
  231. err = network.Associate(req.Username)
  232. if err != nil {
  233. return nil, err
  234. }
  235. return &pb.NetworkAssociateResponse{}, nil
  236. }
  237. func (s *NetworkService) Dissociate(ctx context.Context, req *pb.NetworkDissociateRequest) (*pb.NetworkDissociateResponse, error) {
  238. logrus.Debugf("rpc call: network dissociate")
  239. network, err := ovpm.GetNetwork(req.Name)
  240. if err != nil {
  241. return nil, err
  242. }
  243. err = network.Dissociate(req.Username)
  244. if err != nil {
  245. return nil, err
  246. }
  247. return &pb.NetworkDissociateResponse{}, nil
  248. }
  249. // NewRPCServer returns a new gRPC server.
  250. func NewRPCServer() *grpc.Server {
  251. s := grpc.NewServer()
  252. pb.RegisterUserServiceServer(s, &UserService{})
  253. pb.RegisterVPNServiceServer(s, &VPNService{})
  254. pb.RegisterNetworkServiceServer(s, &NetworkService{})
  255. return s
  256. }