mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
This change improves compatibility with newer UniFi OS versions while maintaining backward compatibility with UniFi OS 4.2 and earlier. The refactoring also reduces code duplication and improves maintainability by centralizing dnsmasq configuration path logic.
103 lines
2.1 KiB
Go
103 lines
2.1 KiB
Go
package ubios
|
|
|
|
import (
|
|
"bytes"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"github.com/kardianos/service"
|
|
|
|
"github.com/Control-D-Inc/ctrld"
|
|
"github.com/Control-D-Inc/ctrld/internal/router/dnsmasq"
|
|
"github.com/Control-D-Inc/ctrld/internal/router/edgeos"
|
|
)
|
|
|
|
const Name = "ubios"
|
|
|
|
type Ubios struct {
|
|
cfg *ctrld.Config
|
|
dnsmasqConfPath string
|
|
}
|
|
|
|
// New returns a router.Router for configuring/setup/run ctrld on Ubios routers.
|
|
func New(cfg *ctrld.Config) *Ubios {
|
|
return &Ubios{
|
|
cfg: cfg,
|
|
dnsmasqConfPath: filepath.Join(dnsmasq.UbiosConfPath(), dnsmasq.UbiosConfName),
|
|
}
|
|
}
|
|
|
|
func (u *Ubios) ConfigureService(config *service.Config) error {
|
|
return nil
|
|
}
|
|
|
|
func (u *Ubios) Install(config *service.Config) error {
|
|
// See comment in (*edgeos.EdgeOS).Install method.
|
|
if edgeos.ContentFilteringEnabled() {
|
|
return edgeos.ErrContentFilteringEnabled
|
|
}
|
|
// See comment in (*edgeos.EdgeOS).Install method.
|
|
if edgeos.DnsShieldEnabled() {
|
|
return edgeos.ErrDnsShieldEnabled
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (u *Ubios) Uninstall(_ *service.Config) error {
|
|
return nil
|
|
}
|
|
|
|
func (u *Ubios) PreRun() error {
|
|
return nil
|
|
}
|
|
|
|
func (u *Ubios) Setup() error {
|
|
if u.cfg.FirstListener().IsDirectDnsListener() {
|
|
return nil
|
|
}
|
|
data, err := dnsmasq.ConfTmplWithCacheDisabled(dnsmasq.ConfigContentTmpl, u.cfg, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := os.WriteFile(u.dnsmasqConfPath, []byte(data), 0600); err != nil {
|
|
return err
|
|
}
|
|
// Restart dnsmasq service.
|
|
if err := restartDNSMasq(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (u *Ubios) Cleanup() error {
|
|
if u.cfg.FirstListener().IsDirectDnsListener() {
|
|
return nil
|
|
}
|
|
// Remove the custom dnsmasq config
|
|
if err := os.Remove(u.dnsmasqConfPath); err != nil {
|
|
return err
|
|
}
|
|
// Restart dnsmasq service.
|
|
if err := restartDNSMasq(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func restartDNSMasq() error {
|
|
buf, err := os.ReadFile(dnsmasq.UbiosPidFile())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pid, err := strconv.ParseUint(string(bytes.TrimSpace(buf)), 10, 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
proc, err := os.FindProcess(int(pid))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return proc.Kill()
|
|
}
|