Files
portmaster/service/control/module.go

85 lines
1.7 KiB
Go

package control
import (
"fmt"
"sync"
"sync/atomic"
"time"
"github.com/safing/portmaster/base/config"
"github.com/safing/portmaster/base/notifications"
"github.com/safing/portmaster/service/mgr"
)
type PauseInfo struct {
Interception bool // Whether Portmaster interception is paused
SPN bool // Whether SPN is paused
TillTime time.Time // When the pause will end
}
type Control struct {
mgr *mgr.Manager
instance instance
states *mgr.StateMgr
locker sync.Mutex
resumeWorker *mgr.WorkerMgr
pauseNotification *notifications.Notification
pauseInfo PauseInfo
cfgSpnEnabled config.BoolOption
}
type instance interface {
Config() *config.Config
InterceptionGroup() *mgr.GroupModule
SPNGroup() *mgr.ExtendedGroup
IsShuttingDown() bool
}
var (
singleton atomic.Bool
)
func New(instance instance) (*Control, error) {
if !singleton.CompareAndSwap(false, true) {
return nil, fmt.Errorf("control: New failed: instance already created")
}
m := mgr.New("Control")
module := &Control{
mgr: m,
instance: instance,
states: mgr.NewStateMgr(m),
cfgSpnEnabled: config.GetAsBool("spn/enable", false),
}
if err := module.prep(); err != nil {
return nil, err
}
return module, nil
}
func (c *Control) Manager() *mgr.Manager {
return c.mgr
}
func (u *Control) States() *mgr.StateMgr {
return u.states
}
func (c *Control) Start() error {
return nil
}
func (c *Control) Stop() error {
c.locker.Lock()
defer c.locker.Unlock()
c.stopResumeWorker()
return nil
}
func (c *Control) prep() error {
return c.registerAPIEndpoints()
}