Files
portmaster/service/control/module.go

75 lines
1.4 KiB
Go

package control
import (
"fmt"
"sync"
"sync/atomic"
"time"
"github.com/safing/portmaster/base/config"
"github.com/safing/portmaster/service/compat"
"github.com/safing/portmaster/service/firewall/interception"
"github.com/safing/portmaster/service/mgr"
)
var logPrefix = "control: "
type Control struct {
mgr *mgr.Manager
instance instance
locker sync.Mutex
pauseWorker *mgr.WorkerMgr
isPaused bool
isPausedSPN bool
pauseStartTime time.Time
pauseDuration time.Duration
}
type instance interface {
Config() *config.Config
Interception() *interception.Interception
Compat() *compat.Compat
SPNGroup() *mgr.ExtendedGroup
}
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")
}
mgr := mgr.New("Control")
module := &Control{
mgr: mgr,
instance: instance,
}
if err := module.prep(); err != nil {
return nil, err
}
return module, nil
}
func (c *Control) Manager() *mgr.Manager {
return c.mgr
}
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()
}