mirror of
https://github.com/safing/portmaster
synced 2025-04-20 10:59:10 +00:00
* Move portbase into monorepo * Add new simple module mgr * [WIP] Switch to new simple module mgr * Add StateMgr and more worker variants * [WIP] Switch more modules * [WIP] Switch more modules * [WIP] swtich more modules * [WIP] switch all SPN modules * [WIP] switch all service modules * [WIP] Convert all workers to the new module system * [WIP] add new task system to module manager * [WIP] Add second take for scheduling workers * [WIP] Add FIXME for bugs in new scheduler * [WIP] Add minor improvements to scheduler * [WIP] Add new worker scheduler * [WIP] Fix more bug related to new module system * [WIP] Fix start handing of the new module system * [WIP] Improve startup process * [WIP] Fix minor issues * [WIP] Fix missing subsystem in settings * [WIP] Initialize managers in constructor * [WIP] Move module event initialization to constrictors * [WIP] Fix setting for enabling and disabling the SPN module * [WIP] Move API registeration into module construction * [WIP] Update states mgr for all modules * [WIP] Add CmdLine operation support * Add state helper methods to module group and instance * Add notification and module status handling to status package * Fix starting issues * Remove pilot widget and update security lock to new status data * Remove debug logs * Improve http server shutdown * Add workaround for cleanly shutting down firewall+netquery * Improve logging * Add syncing states with notifications for new module system * Improve starting, stopping, shutdown; resolve FIXMEs/TODOs * [WIP] Fix most unit tests * Review new module system and fix minor issues * Push shutdown and restart events again via API * Set sleep mode via interface * Update example/template module * [WIP] Fix spn/cabin unit test * Remove deprecated UI elements * Make log output more similar for the logging transition phase * Switch spn hub and observer cmds to new module system * Fix log sources * Make worker mgr less error prone * Fix tests and minor issues * Fix observation hub * Improve shutdown and restart handling * Split up big connection.go source file * Move varint and dsd packages to structures repo * Improve expansion test * Fix linter warnings * Fix interception module on windows * Fix linter errors --------- Co-authored-by: Vladimir Stoilov <vladimir@safing.io>
104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package netenv
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/sha1"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/safing/portmaster/base/log"
|
|
"github.com/safing/portmaster/base/utils"
|
|
"github.com/safing/portmaster/service/mgr"
|
|
)
|
|
|
|
var (
|
|
networkChangeCheckTrigger = make(chan struct{}, 1)
|
|
networkChangedBroadcastFlag = utils.NewBroadcastFlag()
|
|
)
|
|
|
|
// GetNetworkChangedFlag returns a flag to be notified about a network change.
|
|
func GetNetworkChangedFlag() *utils.Flag {
|
|
return networkChangedBroadcastFlag.NewFlag()
|
|
}
|
|
|
|
func notifyOfNetworkChange() {
|
|
networkChangedBroadcastFlag.NotifyAndReset()
|
|
module.EventNetworkChange.Submit(struct{}{})
|
|
}
|
|
|
|
// TriggerNetworkChangeCheck triggers a network change check.
|
|
func TriggerNetworkChangeCheck() {
|
|
select {
|
|
case networkChangeCheckTrigger <- struct{}{}:
|
|
default:
|
|
}
|
|
}
|
|
|
|
func monitorNetworkChanges(ctx *mgr.WorkerCtx) error {
|
|
var lastNetworkChecksum []byte
|
|
|
|
serviceLoop:
|
|
for {
|
|
trigger := false
|
|
|
|
var ticker *time.Ticker
|
|
if Online() {
|
|
ticker = monitorNetworkChangeOnlineTicker
|
|
} else {
|
|
ticker = monitorNetworkChangeOfflineTicker
|
|
}
|
|
|
|
// wait for trigger
|
|
select {
|
|
case <-ctx.Done():
|
|
return nil
|
|
case <-networkChangeCheckTrigger:
|
|
// don't fall through because the online change check
|
|
// triggers the networkChangeCheck this way. If we would set
|
|
// trigger == true we would trigger the online check again
|
|
// resulting in a loop of pointless checks.
|
|
case <-ticker.C:
|
|
trigger = true
|
|
}
|
|
|
|
// check network for changes
|
|
// create hashsum of current network config
|
|
hasher := sha1.New() //nolint:gosec // not used for security
|
|
interfaces, err := osGetNetworkInterfaces()
|
|
if err != nil {
|
|
log.Warningf("netenv: failed to get interfaces: %s", err)
|
|
continue
|
|
}
|
|
for _, iface := range interfaces {
|
|
_, _ = io.WriteString(hasher, iface.Name)
|
|
// log.Tracef("adding: %s", iface.Name)
|
|
_, _ = io.WriteString(hasher, iface.Flags.String())
|
|
// log.Tracef("adding: %s", iface.Flags.String())
|
|
addrs, err := iface.Addrs()
|
|
if err != nil {
|
|
log.Warningf("netenv: failed to get addrs from interface %s: %s", iface.Name, err)
|
|
continue
|
|
}
|
|
for _, addr := range addrs {
|
|
_, _ = io.WriteString(hasher, addr.String())
|
|
// log.Tracef("adding: %s", addr.String())
|
|
}
|
|
}
|
|
newChecksum := hasher.Sum(nil)
|
|
|
|
// compare checksum with last
|
|
if !bytes.Equal(lastNetworkChecksum, newChecksum) {
|
|
if len(lastNetworkChecksum) == 0 {
|
|
lastNetworkChecksum = newChecksum
|
|
continue serviceLoop
|
|
}
|
|
lastNetworkChecksum = newChecksum
|
|
|
|
if trigger {
|
|
TriggerOnlineStatusInvestigation()
|
|
}
|
|
notifyOfNetworkChange()
|
|
}
|
|
|
|
}
|
|
}
|