mirror of
https://github.com/safing/portmaster
synced 2025-09-01 10:09:11 +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>
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package nameserver
|
|
|
|
import (
|
|
"net"
|
|
"os"
|
|
|
|
processInfo "github.com/shirou/gopsutil/process"
|
|
|
|
"github.com/safing/portmaster/base/log"
|
|
"github.com/safing/portmaster/service/network/packet"
|
|
"github.com/safing/portmaster/service/network/state"
|
|
)
|
|
|
|
var commonResolverIPs = []net.IP{
|
|
net.IPv4zero,
|
|
net.IPv4(127, 0, 0, 1), // default
|
|
net.IPv4(127, 0, 0, 53), // some resolvers on Linux
|
|
net.IPv6zero,
|
|
net.IPv6loopback,
|
|
}
|
|
|
|
func findConflictingProcess(ip net.IP, port uint16) (conflictingProcess *processInfo.Process) {
|
|
// Evaluate which IPs to check.
|
|
var ipsToCheck []net.IP
|
|
if ip.Equal(net.IPv4zero) || ip.Equal(net.IPv6zero) {
|
|
ipsToCheck = commonResolverIPs
|
|
} else {
|
|
ipsToCheck = []net.IP{ip}
|
|
}
|
|
|
|
// Find the conflicting process.
|
|
var err error
|
|
for _, resolverIP := range ipsToCheck {
|
|
conflictingProcess, err = getListeningProcess(resolverIP, port)
|
|
switch {
|
|
case err != nil:
|
|
// Log the error and let the worker try again.
|
|
log.Warningf("nameserver: failed to find conflicting service: %s", err)
|
|
case conflictingProcess != nil:
|
|
// Conflicting service found.
|
|
return conflictingProcess
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func getListeningProcess(resolverIP net.IP, resolverPort uint16) (*processInfo.Process, error) {
|
|
pid, _, err := state.Lookup(&packet.Info{
|
|
Inbound: true,
|
|
Version: 0, // auto-detect
|
|
Protocol: packet.UDP,
|
|
Src: nil, // do not record direction
|
|
SrcPort: 0, // do not record direction
|
|
Dst: resolverIP,
|
|
DstPort: resolverPort,
|
|
}, true)
|
|
if err != nil {
|
|
// there may be nothing listening on :53
|
|
return nil, nil //nolint:nilerr // Treat lookup error as "not found".
|
|
}
|
|
|
|
// Ignore if it's us for some reason.
|
|
if pid == os.Getpid() {
|
|
return nil, nil
|
|
}
|
|
|
|
proc, err := processInfo.NewProcess(int32(pid))
|
|
if err != nil {
|
|
// Process may have disappeared already.
|
|
return nil, err
|
|
}
|
|
|
|
return proc, nil
|
|
}
|