Skip to content

Commit

Permalink
all: openbsd support
Browse files Browse the repository at this point in the history
  • Loading branch information
ainar-g committed Jun 3, 2021
1 parent 084564e commit 512ee6d
Show file tree
Hide file tree
Showing 12 changed files with 116 additions and 71 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ and this project adheres to

### Added

- Experimental OpenBSD support for AMD64 and ARM64 ([#2439]).
- Support for custom port in DNS-over-HTTPS profiles for Apple's devices
([#3172]).
- `darwin/arm64` support ([#2443]).
Expand Down Expand Up @@ -52,6 +53,7 @@ released by then.

- Go 1.15 support.

[#2439]: https://github.com/AdguardTeam/AdGuardHome/issues/2439
[#2441]: https://github.com/AdguardTeam/AdGuardHome/issues/2441
[#2443]: https://github.com/AdguardTeam/AdGuardHome/issues/2443
[#3136]: https://github.com/AdguardTeam/AdGuardHome/issues/3136
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ go-check: go-tools go-lint go-test
go-os-check:
env GOOS='darwin' "$(GO.MACRO)" vet ./internal/...
env GOOS='freebsd' "$(GO.MACRO)" vet ./internal/...
env GOOS='openbsd' "$(GO.MACRO)" vet ./internal/...
env GOOS='linux' "$(GO.MACRO)" vet ./internal/...
env GOOS='windows' "$(GO.MACRO)" vet ./internal/...

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/s
* macOS ARM: [64-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_darwin_arm64.zip)
* FreeBSD: [64-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_amd64.tar.gz), [32-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_386.tar.gz)
* FreeBSD ARM: [64-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_arm64.tar.gz), [32-bit ARMv5](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_armv5.tar.gz), [32-bit ARMv6](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_armv6.tar.gz), [32-bit ARMv7](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_armv7.tar.gz)
* OpenBSD: (coming soon)
* OpenBSD ARM: (coming soon)

* Edge channel builds
* Linux: [64-bit](https://static.adguard.com/adguardhome/edge/AdGuardHome_linux_amd64.tar.gz), [32-bit](https://static.adguard.com/adguardhome/edge/AdGuardHome_linux_386.tar.gz)
Expand All @@ -299,6 +301,8 @@ curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/s
* macOS ARM: [64-bit](https://static.adguard.com/adguardhome/edge/AdGuardHome_darwin_arm64.zip)
* FreeBSD: [64-bit](https://static.adguard.com/adguardhome/edge/AdGuardHome_freebsd_amd64.tar.gz), [32-bit](https://static.adguard.com/adguardhome/edge/AdGuardHome_freebsd_386.tar.gz)
* FreeBSD ARM: [64-bit](https://static.adguard.com/adguardhome/edge/AdGuardHome_freebsd_arm64.tar.gz), [32-bit ARMv5](https://static.adguard.com/adguardhome/edge/AdGuardHome_freebsd_armv5.tar.gz), [32-bit ARMv6](https://static.adguard.com/adguardhome/edge/AdGuardHome_freebsd_armv6.tar.gz), [32-bit ARMv7](https://static.adguard.com/adguardhome/edge/AdGuardHome_freebsd_armv7.tar.gz)
* OpenBSD: [64-bit (experimental)](https://static.adguard.com/adguardhome/edge/AdGuardHome_openbsd_amd64.tar.gz)
* OpenBSD ARM: [64-bit (experimental)](https://static.adguard.com/adguardhome/edge/AdGuardHome_openbsd_arm64.tar.gz)


<a id="reporting-issues"></a>
Expand Down
15 changes: 11 additions & 4 deletions internal/aghos/os.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,25 @@ import (
"fmt"
"os/exec"
"syscall"

"github.com/AdguardTeam/golibs/errors"
)

// ErrUnsupported is returned when the functionality is unsupported on the
// current operating system.
const ErrUnsupported errors.Error = "unsupported"

// CanBindPrivilegedPorts checks if current process can bind to privileged
// ports.
func CanBindPrivilegedPorts() (can bool, err error) {
return canBindPrivilegedPorts()
}

// SetRlimit sets user-specified limit of how many fd's we can use
// https://github.com/AdguardTeam/AdGuardHome/internal/issues/659.
func SetRlimit(val uint) {
setRlimit(val)
// SetRlimit sets user-specified limit of how many fd's we can use.
//
// See https://github.com/AdguardTeam/AdGuardHome/internal/issues/659.
func SetRlimit(val uint64) (err error) {
return setRlimit(val)
}

// HaveAdminRights checks if the current user has root (administrator) rights.
Expand Down
14 changes: 5 additions & 9 deletions internal/aghos/os_bsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,18 @@ package aghos
import (
"os"
"syscall"

"github.com/AdguardTeam/golibs/log"
)

func canBindPrivilegedPorts() (can bool, err error) {
return HaveAdminRights()
}

func setRlimit(val uint) {
func setRlimit(val uint64) (err error) {
var rlim syscall.Rlimit
rlim.Max = uint64(val)
rlim.Cur = uint64(val)
err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
if err != nil {
log.Error("Setrlimit() failed: %v", err)
}
rlim.Max = val
rlim.Cur = val

return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
}

func haveAdminRights() (bool, error) {
Expand Down
10 changes: 3 additions & 7 deletions internal/aghos/os_freebsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,18 @@ package aghos
import (
"os"
"syscall"

"github.com/AdguardTeam/golibs/log"
)

func canBindPrivilegedPorts() (can bool, err error) {
return HaveAdminRights()
}

func setRlimit(val uint) {
func setRlimit(val uint64) (err error) {
var rlim syscall.Rlimit
rlim.Max = int64(val)
rlim.Cur = int64(val)
err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
if err != nil {
log.Error("Setrlimit() failed: %v", err)
}

return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
}

func haveAdminRights() (bool, error) {
Expand Down
13 changes: 5 additions & 8 deletions internal/aghos/os_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"strings"
"syscall"

"github.com/AdguardTeam/golibs/log"
"golang.org/x/sys/unix"
)

Expand All @@ -23,14 +22,12 @@ func canBindPrivilegedPorts() (can bool, err error) {
return cnbs == 1 || adm, err
}

func setRlimit(val uint) {
func setRlimit(val uint64) (err error) {
var rlim syscall.Rlimit
rlim.Max = uint64(val)
rlim.Cur = uint64(val)
err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
if err != nil {
log.Error("Setrlimit() failed: %v", err)
}
rlim.Max = val
rlim.Cur = val

return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim)
}

func haveAdminRights() (bool, error) {
Expand Down
3 changes: 2 additions & 1 deletion internal/aghos/os_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ func canBindPrivilegedPorts() (can bool, err error) {
return HaveAdminRights()
}

func setRlimit(val uint) {
func setRlimit(val uint64) (err error) {
return ErrUnsupported
}

func haveAdminRights() (bool, error) {
Expand Down
2 changes: 1 addition & 1 deletion internal/home/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ type configuration struct {
AuthBlockMin uint `yaml:"block_auth_min"`
ProxyURL string `yaml:"http_proxy"` // Proxy address for our HTTP client
Language string `yaml:"language"` // two-letter ISO 639-1 language code
RlimitNoFile uint `yaml:"rlimit_nofile"` // Maximum number of opened fd's per process (0: default)
RlimitNoFile uint64 `yaml:"rlimit_nofile"` // Maximum number of opened fd's per process (0: default)
DebugPProf bool `yaml:"debug_pprof"` // Enable pprof HTTP server on port 6060

// TTL for a web session (in hours)
Expand Down
55 changes: 34 additions & 21 deletions internal/home/home.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,15 @@ func Main(clientBuildFS fs.FS) {
}()

if args.serviceControlAction != "" {
// TODO(a.garipov): github.com/kardianos/service doesn't seem to
// support OpenBSD currently. Either patch it to do so or make
// our own implementation of the service.System interface.
if runtime.GOOS == "openbsd" {
log.Fatal("service actions are not supported on openbsd")
}

handleServiceControlAction(args, clientBuildFS)

return
}

Expand Down Expand Up @@ -175,7 +183,7 @@ func setupContext(args options) {
Context.mux = http.NewServeMux()
}

func setupConfig(args options) {
func setupConfig(args options) (err error) {
config.DHCP.WorkDir = Context.workDir
config.DHCP.HTTPRegister = httpRegister
config.DHCP.ConfigModified = onConfigModified
Expand All @@ -186,7 +194,7 @@ func setupConfig(args options) {
// now which assume that the DHCP server can be nil despite this
// condition. Inspect them and perhaps rewrite them to use
// Enabled() instead.
log.Fatalf("can't initialize dhcp module")
return fmt.Errorf("initing dhcp: %w", err)
}

Context.updater = updater.NewUpdater(&updater.Config{
Expand All @@ -208,9 +216,11 @@ func setupConfig(args options) {
Context.clients.Init(config.Clients, Context.dhcpServer, Context.etcHosts)
config.Clients = nil

if (runtime.GOOS == "linux" || runtime.GOOS == "darwin") &&
config.RlimitNoFile != 0 {
aghos.SetRlimit(config.RlimitNoFile)
if config.RlimitNoFile != 0 {
err = aghos.SetRlimit(config.RlimitNoFile)
if err != nil && !errors.Is(err, aghos.ErrUnsupported) {
return fmt.Errorf("setting rlimit: %w", err)
}
}

// override bind host/port from the console
Expand All @@ -223,6 +233,8 @@ func setupConfig(args options) {
if len(args.pidFile) != 0 && writePIDFile(args.pidFile) {
Context.pidFileName = args.pidFile
}

return nil
}

func initWeb(args options, clientBuildFS fs.FS) (web *Web, err error) {
Expand Down Expand Up @@ -266,8 +278,16 @@ func initWeb(args options, clientBuildFS fs.FS) (web *Web, err error) {
return web, nil
}

func fatalOnError(err error) {
if err != nil {
log.Fatal(err)
}
}

// run performs configurating and starts AdGuard Home.
func run(args options, clientBuildFS fs.FS) {
var err error

// configure config filename
initConfigFilename(args)

Expand All @@ -294,14 +314,13 @@ func run(args options, clientBuildFS fs.FS) {
// but also avoid relying on automatic Go init() function
filtering.InitModule()

setupConfig(args)
err = setupConfig(args)
fatalOnError(err)

if !Context.firstRun {
// Save the updated config
err := config.write()
if err != nil {
log.Fatal(err)
}
err = config.write()
fatalOnError(err)

if config.DebugPProf {
mux := http.NewServeMux()
Expand All @@ -318,7 +337,7 @@ func run(args options, clientBuildFS fs.FS) {
}
}

err := os.MkdirAll(Context.getDataDir(), 0o755)
err = os.MkdirAll(Context.getDataDir(), 0o755)
if err != nil {
log.Fatalf("Cannot create DNS data dir at %s: %s", Context.getDataDir(), err)
}
Expand Down Expand Up @@ -352,20 +371,14 @@ func run(args options, clientBuildFS fs.FS) {
}

Context.web, err = initWeb(args, clientBuildFS)
if err != nil {
log.Fatal(err)
}
fatalOnError(err)

Context.subnetDetector, err = aghnet.NewSubnetDetector()
if err != nil {
log.Fatal(err)
}
fatalOnError(err)

if !Context.firstRun {
err = initDNSServer()
if err != nil {
log.Fatalf("%s", err)
}
fatalOnError(err)

Context.tls.Start()
Context.etcHosts.Start()
Expand All @@ -374,7 +387,7 @@ func run(args options, clientBuildFS fs.FS) {
serr := startDNSServer()
if serr != nil {
closeDNSServer()
log.Fatal(serr)
fatalOnError(serr)
}
}()

Expand Down
Loading

0 comments on commit 512ee6d

Please sign in to comment.