mirror of
https://github.com/safing/portmaster
synced 2025-09-04 19:49:15 +00:00
Create initial version of new package status
This commit is contained in:
parent
bdeddc41f9
commit
9cb0641f19
7 changed files with 258 additions and 0 deletions
14
status/const.go
Normal file
14
status/const.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
// Definitions of Security and Status Levels
|
||||||
|
const (
|
||||||
|
SecurityLevelOff uint8 = 0
|
||||||
|
SecurityLevelDynamic uint8 = 1
|
||||||
|
SecurityLevelSecure uint8 = 2
|
||||||
|
SecurityLevelFortress uint8 = 3
|
||||||
|
|
||||||
|
StatusOff uint8 = 0
|
||||||
|
StatusError uint8 = 1
|
||||||
|
StatusWarning uint8 = 2
|
||||||
|
StatusOk uint8 = 3
|
||||||
|
)
|
64
status/get.go
Normal file
64
status/get.go
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/Safing/portbase/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
currentSecurityLevel *uint32
|
||||||
|
selectedSecurityLevel *uint32
|
||||||
|
threatLevel *uint32
|
||||||
|
portmasterStatus *uint32
|
||||||
|
gate17Status *uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var (
|
||||||
|
currentSecurityLevelValue uint32
|
||||||
|
selectedSecurityLevelValue uint32
|
||||||
|
threatLevelValue uint32
|
||||||
|
portmasterStatusValue uint32
|
||||||
|
gate17StatusValue uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
currentSecurityLevel = ¤tSecurityLevelValue
|
||||||
|
selectedSecurityLevel = &selectedSecurityLevelValue
|
||||||
|
threatLevel = &threatLevelValue
|
||||||
|
portmasterStatus = &portmasterStatusValue
|
||||||
|
gate17Status = &gate17StatusValue
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCurrentSecurityLevel returns the current security level.
|
||||||
|
func GetCurrentSecurityLevel() uint8 {
|
||||||
|
return uint8(atomic.LoadUint32(currentSecurityLevel))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSelectedSecurityLevel returns the selected security level.
|
||||||
|
func GetSelectedSecurityLevel() uint8 {
|
||||||
|
return uint8(atomic.LoadUint32(selectedSecurityLevel))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetThreatLevel returns the current threat level.
|
||||||
|
func GetThreatLevel() uint8 {
|
||||||
|
return uint8(atomic.LoadUint32(threatLevel))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPortmasterStatus returns the current Portmaster status.
|
||||||
|
func GetPortmasterStatus() uint8 {
|
||||||
|
return uint8(atomic.LoadUint32(portmasterStatus))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGate17Status returns the current Gate17 status.
|
||||||
|
func GetGate17Status() uint8 {
|
||||||
|
return uint8(atomic.LoadUint32(gate17Status))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConfigByLevel returns whether the given security level dependent config option is on or off.
|
||||||
|
func GetConfigByLevel(name string) func() bool {
|
||||||
|
activatedLevel := config.GetAsInt(name, int64(SecurityLevelDynamic))
|
||||||
|
return func() bool {
|
||||||
|
return uint8(activatedLevel()) <= GetCurrentSecurityLevel()
|
||||||
|
}
|
||||||
|
}
|
16
status/get_test.go
Normal file
16
status/get_test.go
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
|
||||||
|
// only test for panics
|
||||||
|
GetCurrentSecurityLevel()
|
||||||
|
GetSelectedSecurityLevel()
|
||||||
|
GetThreatLevel()
|
||||||
|
GetPortmasterStatus()
|
||||||
|
GetGate17Status()
|
||||||
|
option := GetConfigByLevel("invalid")
|
||||||
|
option()
|
||||||
|
|
||||||
|
}
|
65
status/set.go
Normal file
65
status/set.go
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
import "sync/atomic"
|
||||||
|
|
||||||
|
// SetCurrentSecurityLevel sets the current security level.
|
||||||
|
func SetCurrentSecurityLevel(level uint8) {
|
||||||
|
sysStatusLock.Lock()
|
||||||
|
defer sysStatusLock.Unlock()
|
||||||
|
sysStatus.CurrentSecurityLevel = level
|
||||||
|
atomicUpdateCurrentSecurityLevel(level)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetSelectedSecurityLevel sets the selected security level.
|
||||||
|
func SetSelectedSecurityLevel(level uint8) {
|
||||||
|
sysStatusLock.Lock()
|
||||||
|
defer sysStatusLock.Unlock()
|
||||||
|
sysStatus.SelectedSecurityLevel = level
|
||||||
|
atomicUpdateSelectedSecurityLevel(level)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetThreatLevel sets the current threat level.
|
||||||
|
func SetThreatLevel(level uint8) {
|
||||||
|
sysStatusLock.Lock()
|
||||||
|
defer sysStatusLock.Unlock()
|
||||||
|
sysStatus.ThreatLevel = level
|
||||||
|
atomicUpdateThreatLevel(level)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetPortmasterStatus sets the current Portmaster status.
|
||||||
|
func SetPortmasterStatus(status uint8) {
|
||||||
|
sysStatusLock.Lock()
|
||||||
|
defer sysStatusLock.Unlock()
|
||||||
|
sysStatus.PortmasterStatus = status
|
||||||
|
atomicUpdatePortmasterStatus(status)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetGate17Status sets the current Gate17 status.
|
||||||
|
func SetGate17Status(status uint8) {
|
||||||
|
sysStatusLock.Lock()
|
||||||
|
defer sysStatusLock.Unlock()
|
||||||
|
sysStatus.Gate17Status = status
|
||||||
|
atomicUpdateGate17Status(status)
|
||||||
|
}
|
||||||
|
|
||||||
|
// update functions for atomic stuff
|
||||||
|
|
||||||
|
func atomicUpdateCurrentSecurityLevel(level uint8) {
|
||||||
|
atomic.StoreUint32(currentSecurityLevel, uint32(level))
|
||||||
|
}
|
||||||
|
|
||||||
|
func atomicUpdateSelectedSecurityLevel(level uint8) {
|
||||||
|
atomic.StoreUint32(selectedSecurityLevel, uint32(level))
|
||||||
|
}
|
||||||
|
|
||||||
|
func atomicUpdateThreatLevel(level uint8) {
|
||||||
|
atomic.StoreUint32(threatLevel, uint32(level))
|
||||||
|
}
|
||||||
|
|
||||||
|
func atomicUpdatePortmasterStatus(status uint8) {
|
||||||
|
atomic.StoreUint32(portmasterStatus, uint32(status))
|
||||||
|
}
|
||||||
|
|
||||||
|
func atomicUpdateGate17Status(status uint8) {
|
||||||
|
atomic.StoreUint32(gate17Status, uint32(status))
|
||||||
|
}
|
14
status/set_test.go
Normal file
14
status/set_test.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestSet(t *testing.T) {
|
||||||
|
|
||||||
|
// only test for panics
|
||||||
|
SetCurrentSecurityLevel(0)
|
||||||
|
SetSelectedSecurityLevel(0)
|
||||||
|
SetThreatLevel(0)
|
||||||
|
SetPortmasterStatus(0)
|
||||||
|
SetGate17Status(0)
|
||||||
|
|
||||||
|
}
|
49
status/status.go
Normal file
49
status/status.go
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
var (
|
||||||
|
sysStatusLock sync.RWMutex
|
||||||
|
sysStatus *SystemStatus
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
sysStatus = &SystemStatus{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SystemStatus saves basic information about the current system status.
|
||||||
|
type SystemStatus struct {
|
||||||
|
// database.Base
|
||||||
|
CurrentSecurityLevel uint8
|
||||||
|
SelectedSecurityLevel uint8
|
||||||
|
|
||||||
|
ThreatLevel uint8 `json:",omitempty" bson:",omitempty"`
|
||||||
|
ThreatReason string `json:",omitempty" bson:",omitempty"`
|
||||||
|
|
||||||
|
PortmasterStatus uint8 `json:",omitempty" bson:",omitempty"`
|
||||||
|
PortmasterStatusMsg string `json:",omitempty" bson:",omitempty"`
|
||||||
|
|
||||||
|
Gate17Status uint8 `json:",omitempty" bson:",omitempty"`
|
||||||
|
Gate17StatusMsg string `json:",omitempty" bson:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// FmtSecurityLevel returns the current security level as a string.
|
||||||
|
func FmtSecurityLevel() string {
|
||||||
|
current := GetCurrentSecurityLevel()
|
||||||
|
selected := GetSelectedSecurityLevel()
|
||||||
|
var s string
|
||||||
|
switch current {
|
||||||
|
case SecurityLevelOff:
|
||||||
|
s = "Off"
|
||||||
|
case SecurityLevelDynamic:
|
||||||
|
s = "Dynamic"
|
||||||
|
case SecurityLevelSecure:
|
||||||
|
s = "Secure"
|
||||||
|
case SecurityLevelFortress:
|
||||||
|
s = "Fortress"
|
||||||
|
}
|
||||||
|
if current != selected {
|
||||||
|
s += "*"
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
36
status/status_test.go
Normal file
36
status/status_test.go
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
package status
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestStatus(t *testing.T) {
|
||||||
|
|
||||||
|
SetCurrentSecurityLevel(SecurityLevelOff)
|
||||||
|
SetSelectedSecurityLevel(SecurityLevelOff)
|
||||||
|
if FmtSecurityLevel() != "Off" {
|
||||||
|
t.Error("unexpected string representation")
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCurrentSecurityLevel(SecurityLevelDynamic)
|
||||||
|
SetSelectedSecurityLevel(SecurityLevelDynamic)
|
||||||
|
if FmtSecurityLevel() != "Dynamic" {
|
||||||
|
t.Error("unexpected string representation")
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCurrentSecurityLevel(SecurityLevelSecure)
|
||||||
|
SetSelectedSecurityLevel(SecurityLevelSecure)
|
||||||
|
if FmtSecurityLevel() != "Secure" {
|
||||||
|
t.Error("unexpected string representation")
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCurrentSecurityLevel(SecurityLevelFortress)
|
||||||
|
SetSelectedSecurityLevel(SecurityLevelFortress)
|
||||||
|
if FmtSecurityLevel() != "Fortress" {
|
||||||
|
t.Error("unexpected string representation")
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSelectedSecurityLevel(SecurityLevelDynamic)
|
||||||
|
if FmtSecurityLevel() != "Fortress*" {
|
||||||
|
t.Error("unexpected string representation")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue