mirror of
https://github.com/safing/portbase
synced 2025-04-10 20:49:09 +00:00
117 lines
2.7 KiB
Go
117 lines
2.7 KiB
Go
package modules
|
|
|
|
import "sync/atomic"
|
|
|
|
// Status holds an exported status summary of the modules system.
|
|
type Status struct {
|
|
Modules map[string]*ModuleStatus
|
|
Total struct {
|
|
Workers int
|
|
Tasks int
|
|
MicroTasks int
|
|
CtrlFuncRunning int
|
|
}
|
|
Config struct {
|
|
MicroTasksThreshhold int
|
|
MediumPriorityDelay string
|
|
LowPriorityDelay string
|
|
}
|
|
}
|
|
|
|
// ModuleStatus holds an exported status summary of one module.
|
|
type ModuleStatus struct { //nolint:maligned
|
|
Enabled bool
|
|
|
|
Status string
|
|
FailureType string
|
|
FailureID string
|
|
FailureMsg string
|
|
|
|
Workers int
|
|
Tasks int
|
|
MicroTasks int
|
|
CtrlFuncRunning bool
|
|
}
|
|
|
|
// GetStatus exports status data from the module system.
|
|
func GetStatus() *Status {
|
|
// Check if modules have been initialized.
|
|
if modulesLocked.IsNotSet() {
|
|
return nil
|
|
}
|
|
|
|
// Create new status.
|
|
status := &Status{
|
|
Modules: make(map[string]*ModuleStatus, len(modules)),
|
|
}
|
|
|
|
// Add config.
|
|
status.Config.MicroTasksThreshhold = int(atomic.LoadInt32(microTasksThreshhold))
|
|
status.Config.MediumPriorityDelay = defaultMediumPriorityMaxDelay.String()
|
|
status.Config.LowPriorityDelay = defaultLowPriorityMaxDelay.String()
|
|
|
|
// Gather status data.
|
|
for name, module := range modules {
|
|
moduleStatus := &ModuleStatus{
|
|
Enabled: module.Enabled(),
|
|
Status: getStatusName(module.Status()),
|
|
Workers: int(atomic.LoadInt32(module.workerCnt)),
|
|
Tasks: int(atomic.LoadInt32(module.taskCnt)),
|
|
MicroTasks: int(atomic.LoadInt32(module.microTaskCnt)),
|
|
CtrlFuncRunning: module.ctrlFuncRunning.IsSet(),
|
|
}
|
|
|
|
// Add failure status.
|
|
failureStatus, failureID, failureMsg := module.FailureStatus()
|
|
moduleStatus.FailureType = getFailureStatusName(failureStatus)
|
|
moduleStatus.FailureID = failureID
|
|
moduleStatus.FailureMsg = failureMsg
|
|
|
|
// Add to total counts.
|
|
status.Total.Workers += moduleStatus.Workers
|
|
status.Total.Tasks += moduleStatus.Tasks
|
|
status.Total.MicroTasks += moduleStatus.MicroTasks
|
|
if moduleStatus.CtrlFuncRunning {
|
|
status.Total.CtrlFuncRunning++
|
|
}
|
|
|
|
// Add to export.
|
|
status.Modules[name] = moduleStatus
|
|
}
|
|
|
|
return status
|
|
}
|
|
|
|
func getStatusName(status uint8) string {
|
|
switch status {
|
|
case StatusDead:
|
|
return "dead"
|
|
case StatusPreparing:
|
|
return "preparing"
|
|
case StatusOffline:
|
|
return "offline"
|
|
case StatusStopping:
|
|
return "stopping"
|
|
case StatusStarting:
|
|
return "starting"
|
|
case StatusOnline:
|
|
return "online"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
func getFailureStatusName(status uint8) string {
|
|
switch status {
|
|
case FailureNone:
|
|
return ""
|
|
case FailureHint:
|
|
return "hint"
|
|
case FailureWarning:
|
|
return "warning"
|
|
case FailureError:
|
|
return "error"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|