grpcApi.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package grpcapi
  2. import (
  3. ctx "context"
  4. pb "github.com/OliveTin/OliveTin/gen/grpc"
  5. log "github.com/sirupsen/logrus"
  6. "google.golang.org/grpc"
  7. "net"
  8. acl "github.com/OliveTin/OliveTin/internal/acl"
  9. config "github.com/OliveTin/OliveTin/internal/config"
  10. executor "github.com/OliveTin/OliveTin/internal/executor"
  11. installationinfo "github.com/OliveTin/OliveTin/internal/installationinfo"
  12. )
  13. var (
  14. cfg *config.Config
  15. )
  16. type oliveTinAPI struct {
  17. pb.UnimplementedOliveTinApiServer
  18. executor *executor.Executor
  19. }
  20. func (api *oliveTinAPI) StartAction(ctx ctx.Context, req *pb.StartActionRequest) (*pb.StartActionResponse, error) {
  21. args := make(map[string]string)
  22. log.Debugf("SA %v", req)
  23. for _, arg := range req.Arguments {
  24. args[arg.Name] = arg.Value
  25. }
  26. execReq := executor.ExecutionRequest{
  27. ActionName: req.ActionName,
  28. Arguments: args,
  29. AuthenticatedUser: acl.UserFromContext(ctx, cfg),
  30. Cfg: cfg,
  31. }
  32. return api.executor.ExecRequest(&execReq), nil
  33. }
  34. func (api *oliveTinAPI) GetDashboardComponents(ctx ctx.Context, req *pb.GetDashboardComponentsRequest) (*pb.GetDashboardComponentsResponse, error) {
  35. user := acl.UserFromContext(ctx, cfg)
  36. res := actionsCfgToPb(cfg.Actions, user)
  37. if len(res.Actions) == 0 {
  38. log.Warn("Zero actions found - check that you have some actions defined, with a view permission")
  39. }
  40. log.Debugf("GetDashboardComponents: %v", res)
  41. return res, nil
  42. }
  43. func (api *oliveTinAPI) GetLogs(ctx ctx.Context, req *pb.GetLogsRequest) (*pb.GetLogsResponse, error) {
  44. ret := &pb.GetLogsResponse{}
  45. // TODO Limit to 10 entries or something to prevent browser lag.
  46. for _, logEntry := range api.executor.Logs {
  47. ret.Logs = append(ret.Logs, &pb.LogEntry{
  48. ActionTitle: logEntry.ActionTitle,
  49. ActionIcon: logEntry.ActionIcon,
  50. Datetime: logEntry.Datetime,
  51. Stdout: logEntry.Stdout,
  52. Stderr: logEntry.Stderr,
  53. TimedOut: logEntry.TimedOut,
  54. ExitCode: logEntry.ExitCode,
  55. Tags: logEntry.Tags,
  56. })
  57. }
  58. return ret, nil
  59. }
  60. /*
  61. This function is ONLY a helper for the UI - the arguments are validated properly
  62. on the StartAction -> Executor chain. This is here basically to provide helpful
  63. error messages more quickly before starting the action.
  64. */
  65. func (api *oliveTinAPI) ValidateArgumentType(ctx ctx.Context, req *pb.ValidateArgumentTypeRequest) (*pb.ValidateArgumentTypeResponse, error) {
  66. err := executor.TypeSafetyCheck("", req.Value, req.Type)
  67. desc := ""
  68. if err != nil {
  69. desc = err.Error()
  70. }
  71. return &pb.ValidateArgumentTypeResponse{
  72. Valid: err == nil,
  73. Description: desc,
  74. }, nil
  75. }
  76. func (api *oliveTinAPI) WhoAmI(ctx ctx.Context, req *pb.WhoAmIRequest) (*pb.WhoAmIResponse, error) {
  77. user := acl.UserFromContext(ctx, cfg)
  78. res := &pb.WhoAmIResponse{
  79. AuthenticatedUser: user.Username,
  80. }
  81. log.Warnf("usergroup: %v", user.Usergroup)
  82. return res, nil
  83. }
  84. func (api *oliveTinAPI) SosReport(ctx ctx.Context, req *pb.SosReportRequest) (*pb.SosReportResponse, error) {
  85. res := &pb.SosReportResponse{
  86. Alert: "Your SOS Report has been logged to OliveTin logs.",
  87. }
  88. log.Infof("\n" + installationinfo.GetSosReport())
  89. return res, nil
  90. }
  91. // Start will start the GRPC API.
  92. func Start(globalConfig *config.Config, ex *executor.Executor) {
  93. cfg = globalConfig
  94. lis, err := net.Listen("tcp", cfg.ListenAddressGrpcActions)
  95. if err != nil {
  96. log.Fatalf("Failed to listen - %v", err)
  97. }
  98. grpcServer := grpc.NewServer()
  99. pb.RegisterOliveTinApiServer(grpcServer, newServer(ex))
  100. err = grpcServer.Serve(lis)
  101. if err != nil {
  102. log.Fatalf("Could not start gRPC Server - %v", err)
  103. }
  104. }
  105. func newServer(ex *executor.Executor) *oliveTinAPI {
  106. server := oliveTinAPI{}
  107. server.executor = ex
  108. return &server
  109. }