remote_access_client.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //go:build ee
  2. // +build ee
  3. package pro
  4. import (
  5. "fmt"
  6. "time"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/mq"
  10. "github.com/gravitl/netmaker/servercfg"
  11. "golang.org/x/exp/slog"
  12. )
  13. const racAutoDisableCheckInterval = 3 * time.Minute
  14. // AddRacHooks - adds hooks for Remote Access Client
  15. func AddRacHooks() {
  16. slog.Debug("adding RAC autodisable hook")
  17. logic.HookManagerCh <- models.HookDetails{
  18. Hook: racAutoDisableHook,
  19. Interval: racAutoDisableCheckInterval,
  20. }
  21. }
  22. // racAutoDisableHook - checks if RAC is enabled and if it is, checks if it should be disabled
  23. func racAutoDisableHook() error {
  24. slog.Debug("running RAC autodisable hook")
  25. users, err := logic.GetUsers()
  26. if err != nil {
  27. slog.Error("error getting users: ", "error", err)
  28. return err
  29. }
  30. clients, err := logic.GetAllExtClients()
  31. if err != nil {
  32. slog.Error("error getting clients: ", "error", err)
  33. return err
  34. }
  35. currentTime := time.Now()
  36. validityDuration := servercfg.GetJwtValidityDuration()
  37. for _, user := range users {
  38. if user.PlatformRoleID == models.AdminRole ||
  39. user.PlatformRoleID == models.SuperAdminRole {
  40. continue
  41. }
  42. if !currentTime.After(user.LastLoginTime.Add(validityDuration)) {
  43. continue
  44. }
  45. for _, client := range clients {
  46. if client.RemoteAccessClientID == "" {
  47. continue
  48. }
  49. if (client.OwnerID == user.UserName) &&
  50. client.Enabled {
  51. slog.Info(fmt.Sprintf("disabling ext client %s for user %s due to RAC autodisabling", client.ClientID, client.OwnerID))
  52. if err := disableExtClient(&client); err != nil {
  53. slog.Error("error disabling ext client in RAC autodisable hook", "error", err)
  54. continue // dont return but try for other clients
  55. }
  56. }
  57. }
  58. }
  59. slog.Debug("finished running RAC autodisable hook")
  60. return nil
  61. }
  62. func disableExtClient(client *models.ExtClient) error {
  63. if newClient, err := logic.ToggleExtClientConnectivity(client, false); err != nil {
  64. return err
  65. } else {
  66. // publish peer update to ingress gateway
  67. if ingressNode, err := logic.GetNodeByID(newClient.IngressGatewayID); err == nil {
  68. if err = mq.PublishPeerUpdate(false); err != nil {
  69. slog.Error("error updating ext clients on", "ingress", ingressNode.ID.String(), "err", err.Error())
  70. }
  71. ingressHost, err := logic.GetHost(ingressNode.HostID.String())
  72. if err != nil {
  73. return err
  74. }
  75. nodes, err := logic.GetAllNodes()
  76. if err != nil {
  77. return err
  78. }
  79. go mq.PublishSingleHostPeerUpdate(ingressHost, nodes, nil, []models.ExtClient{*client}, false, nil)
  80. } else {
  81. return err
  82. }
  83. }
  84. return nil
  85. }