github.com/safing/portbase@v0.19.5/modules/export.go (about) 1 package modules 2 3 import "sync/atomic" 4 5 // Status holds an exported status summary of the modules system. 6 type Status struct { 7 Modules map[string]*ModuleStatus 8 Total struct { 9 Workers int 10 Tasks int 11 MicroTasks int 12 CtrlFuncRunning int 13 } 14 Config struct { 15 MicroTasksThreshhold int 16 MediumPriorityDelay string 17 LowPriorityDelay string 18 } 19 } 20 21 // ModuleStatus holds an exported status summary of one module. 22 type ModuleStatus struct { //nolint:maligned 23 Enabled bool 24 25 Status string 26 FailureType string 27 FailureID string 28 FailureMsg string 29 30 Workers int 31 Tasks int 32 MicroTasks int 33 CtrlFuncRunning bool 34 } 35 36 // GetStatus exports status data from the module system. 37 func GetStatus() *Status { 38 // Check if modules have been initialized. 39 if modulesLocked.IsNotSet() { 40 return nil 41 } 42 43 // Create new status. 44 status := &Status{ 45 Modules: make(map[string]*ModuleStatus, len(modules)), 46 } 47 48 // Add config. 49 status.Config.MicroTasksThreshhold = int(atomic.LoadInt32(microTasksThreshhold)) 50 status.Config.MediumPriorityDelay = defaultMediumPriorityMaxDelay.String() 51 status.Config.LowPriorityDelay = defaultLowPriorityMaxDelay.String() 52 53 // Gather status data. 54 for name, module := range modules { 55 moduleStatus := &ModuleStatus{ 56 Enabled: module.Enabled(), 57 Status: getStatusName(module.Status()), 58 Workers: int(atomic.LoadInt32(module.workerCnt)), 59 Tasks: int(atomic.LoadInt32(module.taskCnt)), 60 MicroTasks: int(atomic.LoadInt32(module.microTaskCnt)), 61 CtrlFuncRunning: module.ctrlFuncRunning.IsSet(), 62 } 63 64 // Add failure status. 65 failureStatus, failureID, failureMsg := module.FailureStatus() 66 moduleStatus.FailureType = getFailureStatusName(failureStatus) 67 moduleStatus.FailureID = failureID 68 moduleStatus.FailureMsg = failureMsg 69 70 // Add to total counts. 71 status.Total.Workers += moduleStatus.Workers 72 status.Total.Tasks += moduleStatus.Tasks 73 status.Total.MicroTasks += moduleStatus.MicroTasks 74 if moduleStatus.CtrlFuncRunning { 75 status.Total.CtrlFuncRunning++ 76 } 77 78 // Add to export. 79 status.Modules[name] = moduleStatus 80 } 81 82 return status 83 } 84 85 func getStatusName(status uint8) string { 86 switch status { 87 case StatusDead: 88 return "dead" 89 case StatusPreparing: 90 return "preparing" 91 case StatusOffline: 92 return "offline" 93 case StatusStopping: 94 return "stopping" 95 case StatusStarting: 96 return "starting" 97 case StatusOnline: 98 return "online" 99 default: 100 return "unknown" 101 } 102 } 103 104 func getFailureStatusName(status uint8) string { 105 switch status { 106 case FailureNone: 107 return "" 108 case FailureHint: 109 return "hint" 110 case FailureWarning: 111 return "warning" 112 case FailureError: 113 return "error" 114 default: 115 return "unknown" 116 } 117 }