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  }