mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-07-04 01:07:49 +02:00
all: add support for pfsense
This commit is contained in:
committed by
Cuong Manh Le
parent
8fda856e24
commit
b143e46eb0
+2
-2
@@ -312,7 +312,7 @@ func initCLI() {
|
|||||||
{s.Start, true},
|
{s.Start, true},
|
||||||
}
|
}
|
||||||
if doTasks(tasks) {
|
if doTasks(tasks) {
|
||||||
if err := router.PostInstall(); err != nil {
|
if err := router.PostInstall(svcConfig); err != nil {
|
||||||
mainLog.Warn().Err(err).Msg("post installation failed, please check system/service log for details error")
|
mainLog.Warn().Err(err).Msg("post installation failed, please check system/service log for details error")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -468,7 +468,7 @@ NOTE: Uninstalling will set DNS to values provided by DHCP.`,
|
|||||||
}
|
}
|
||||||
prog.resetDNS()
|
prog.resetDNS()
|
||||||
mainLog.Debug().Msg("Router cleanup")
|
mainLog.Debug().Msg("Router cleanup")
|
||||||
if err := router.Cleanup(); err != nil {
|
if err := router.Cleanup(svcConfig); err != nil {
|
||||||
mainLog.Warn().Err(err).Msg("could not cleanup router")
|
mainLog.Warn().Err(err).Msg("could not cleanup router")
|
||||||
}
|
}
|
||||||
mainLog.Notice().Msg("Service uninstalled")
|
mainLog.Notice().Msg("Service uninstalled")
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
//go:build linux || freebsd
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
//go:build !linux
|
//go:build !linux && !freebsd
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ var clientInfoFiles = map[string]readClientInfoFunc{
|
|||||||
"/tmp/var/lib/misc/dnsmasq.leases": dnsmasqReadClientInfoFile, // Tomato
|
"/tmp/var/lib/misc/dnsmasq.leases": dnsmasqReadClientInfoFile, // Tomato
|
||||||
"/run/dnsmasq-dhcp.leases": dnsmasqReadClientInfoFile, // EdgeOS
|
"/run/dnsmasq-dhcp.leases": dnsmasqReadClientInfoFile, // EdgeOS
|
||||||
"/run/dhcpd.leases": iscDHCPReadClientInfoFile, // EdgeOS
|
"/run/dhcpd.leases": iscDHCPReadClientInfoFile, // EdgeOS
|
||||||
|
"/var/dhcpd/var/db/dhcpd.leases": iscDHCPReadClientInfoFile, // Pfsense
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *router) watchClientInfoTable() {
|
func (r *router) watchClientInfoTable() {
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package router
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/kardianos/service"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
rcPath = "/usr/local/etc/rc.d"
|
||||||
|
unboundRcPath = rcPath + "/unbound"
|
||||||
|
)
|
||||||
|
|
||||||
|
func setupPfsense() error {
|
||||||
|
// If Pfsense is in DNS Resolver mode, ensure no unbound processes running.
|
||||||
|
if _, err := exec.Command("service", "unbound", "onestatus").CombinedOutput(); err == nil {
|
||||||
|
if out, err := exec.Command("killall", "unbound").CombinedOutput(); err != nil {
|
||||||
|
return fmt.Errorf("could not killall unbound: %s: %w", string(out), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If Pfsense is in DNS Forwarder mode, ensure no dnsmasq processes running.
|
||||||
|
if _, err := exec.Command("service", "dnsmasq", "onestatus").CombinedOutput(); err == nil {
|
||||||
|
if out, err := exec.Command("killall", "dnsmasq").CombinedOutput(); err != nil {
|
||||||
|
return fmt.Errorf("could not killall unbound: %s: %w", string(out), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func cleanupPfsense(svc *service.Config) error {
|
||||||
|
if err := os.Remove(filepath.Join(rcPath, svc.Name+".sh")); err != nil {
|
||||||
|
return fmt.Errorf("os.Remove: %w", err)
|
||||||
|
}
|
||||||
|
if out, err := exec.Command(unboundRcPath, "onerestart").CombinedOutput(); err != nil {
|
||||||
|
return fmt.Errorf("could not restart unbound: %s: %w", string(out), err)
|
||||||
|
}
|
||||||
|
if out, err := exec.Command(unboundRcPath, "onerestart").CombinedOutput(); err != nil {
|
||||||
|
return fmt.Errorf("could not restart unbound: %s: %w", string(out), err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func postInstallPfsense(svc *service.Config) error {
|
||||||
|
// pfsense need ".sh" extension for script to be run at boot.
|
||||||
|
// See: https://docs.netgate.com/pfsense/en/latest/development/boot-commands.html#shell-script-option
|
||||||
|
oldname := filepath.Join(rcPath, svc.Name)
|
||||||
|
newname := filepath.Join(rcPath, svc.Name+".sh")
|
||||||
|
_ = os.Remove(newname)
|
||||||
|
if err := os.Symlink(oldname, newname); err != nil {
|
||||||
|
return fmt.Errorf("os.Symlink: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ const (
|
|||||||
Synology = "synology"
|
Synology = "synology"
|
||||||
Tomato = "tomato"
|
Tomato = "tomato"
|
||||||
EdgeOS = "edgeos"
|
EdgeOS = "edgeos"
|
||||||
|
Pfsense = "pfsense"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrNotSupported reports the current router is not supported error.
|
// ErrNotSupported reports the current router is not supported error.
|
||||||
@@ -39,7 +40,7 @@ type router struct {
|
|||||||
// IsSupported reports whether the given platform is supported by ctrld.
|
// IsSupported reports whether the given platform is supported by ctrld.
|
||||||
func IsSupported(platform string) bool {
|
func IsSupported(platform string) bool {
|
||||||
switch platform {
|
switch platform {
|
||||||
case EdgeOS, DDWrt, Merlin, OpenWrt, Synology, Tomato, Ubios:
|
case EdgeOS, DDWrt, Merlin, OpenWrt, Pfsense, Synology, Tomato, Ubios:
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -47,7 +48,7 @@ func IsSupported(platform string) bool {
|
|||||||
|
|
||||||
// SupportedPlatforms return all platforms that can be configured to run with ctrld.
|
// SupportedPlatforms return all platforms that can be configured to run with ctrld.
|
||||||
func SupportedPlatforms() []string {
|
func SupportedPlatforms() []string {
|
||||||
return []string{EdgeOS, DDWrt, Merlin, OpenWrt, Synology, Tomato, Ubios}
|
return []string{EdgeOS, DDWrt, Merlin, OpenWrt, Pfsense, Synology, Tomato, Ubios}
|
||||||
}
|
}
|
||||||
|
|
||||||
var configureFunc = map[string]func() error{
|
var configureFunc = map[string]func() error{
|
||||||
@@ -55,6 +56,7 @@ var configureFunc = map[string]func() error{
|
|||||||
DDWrt: setupDDWrt,
|
DDWrt: setupDDWrt,
|
||||||
Merlin: setupMerlin,
|
Merlin: setupMerlin,
|
||||||
OpenWrt: setupOpenWrt,
|
OpenWrt: setupOpenWrt,
|
||||||
|
Pfsense: setupPfsense,
|
||||||
Synology: setupSynology,
|
Synology: setupSynology,
|
||||||
Tomato: setupTomato,
|
Tomato: setupTomato,
|
||||||
Ubios: setupUbiOS,
|
Ubios: setupUbiOS,
|
||||||
@@ -64,7 +66,7 @@ var configureFunc = map[string]func() error{
|
|||||||
func Configure(c *ctrld.Config) error {
|
func Configure(c *ctrld.Config) error {
|
||||||
name := Name()
|
name := Name()
|
||||||
switch name {
|
switch name {
|
||||||
case EdgeOS, DDWrt, Merlin, OpenWrt, Synology, Tomato, Ubios:
|
case EdgeOS, DDWrt, Merlin, OpenWrt, Pfsense, Synology, Tomato, Ubios:
|
||||||
if c.HasUpstreamSendClientInfo() {
|
if c.HasUpstreamSendClientInfo() {
|
||||||
r := routerPlatform.Load()
|
r := routerPlatform.Load()
|
||||||
r.sendClientInfo = true
|
r.sendClientInfo = true
|
||||||
@@ -99,7 +101,7 @@ func ConfigureService(sc *service.Config) error {
|
|||||||
}
|
}
|
||||||
case OpenWrt:
|
case OpenWrt:
|
||||||
sc.Option["SysvScript"] = openWrtScript
|
sc.Option["SysvScript"] = openWrtScript
|
||||||
case EdgeOS, Merlin, Synology, Tomato, Ubios:
|
case EdgeOS, Merlin, Pfsense, Synology, Tomato, Ubios:
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -118,7 +120,7 @@ func PreStart() (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PostInstall performs task after installing ctrld on router.
|
// PostInstall performs task after installing ctrld on router.
|
||||||
func PostInstall() error {
|
func PostInstall(svc *service.Config) error {
|
||||||
name := Name()
|
name := Name()
|
||||||
switch name {
|
switch name {
|
||||||
case EdgeOS:
|
case EdgeOS:
|
||||||
@@ -129,6 +131,8 @@ func PostInstall() error {
|
|||||||
return postInstallMerlin()
|
return postInstallMerlin()
|
||||||
case OpenWrt:
|
case OpenWrt:
|
||||||
return postInstallOpenWrt()
|
return postInstallOpenWrt()
|
||||||
|
case Pfsense:
|
||||||
|
return postInstallPfsense(svc)
|
||||||
case Synology:
|
case Synology:
|
||||||
return postInstallSynology()
|
return postInstallSynology()
|
||||||
case Tomato:
|
case Tomato:
|
||||||
@@ -140,7 +144,7 @@ func PostInstall() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup cleans ctrld setup on the router.
|
// Cleanup cleans ctrld setup on the router.
|
||||||
func Cleanup() error {
|
func Cleanup(svc *service.Config) error {
|
||||||
name := Name()
|
name := Name()
|
||||||
switch name {
|
switch name {
|
||||||
case EdgeOS:
|
case EdgeOS:
|
||||||
@@ -151,6 +155,8 @@ func Cleanup() error {
|
|||||||
return cleanupMerlin()
|
return cleanupMerlin()
|
||||||
case OpenWrt:
|
case OpenWrt:
|
||||||
return cleanupOpenWrt()
|
return cleanupOpenWrt()
|
||||||
|
case Pfsense:
|
||||||
|
return cleanupPfsense(svc)
|
||||||
case Synology:
|
case Synology:
|
||||||
return cleanupSynology()
|
return cleanupSynology()
|
||||||
case Tomato:
|
case Tomato:
|
||||||
@@ -167,6 +173,8 @@ func ListenAddress() string {
|
|||||||
switch name {
|
switch name {
|
||||||
case EdgeOS, DDWrt, Merlin, OpenWrt, Synology, Tomato, Ubios:
|
case EdgeOS, DDWrt, Merlin, OpenWrt, Synology, Tomato, Ubios:
|
||||||
return "127.0.0.1:5354"
|
return "127.0.0.1:5354"
|
||||||
|
case Pfsense:
|
||||||
|
// On pfsense, we run ctrld as DNS resolver.
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -200,6 +208,8 @@ func distroName() string {
|
|||||||
return EdgeOS
|
return EdgeOS
|
||||||
case haveFile("/etc/ubnt/init/vyatta-router"):
|
case haveFile("/etc/ubnt/init/vyatta-router"):
|
||||||
return EdgeOS // For 2.x
|
return EdgeOS // For 2.x
|
||||||
|
case isPfsense():
|
||||||
|
return Pfsense
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -223,3 +233,8 @@ func unameU() []byte {
|
|||||||
out, _ := exec.Command("uname", "-u").Output()
|
out, _ := exec.Command("uname", "-u").Output()
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isPfsense() bool {
|
||||||
|
b, err := os.ReadFile("/etc/platform")
|
||||||
|
return err == nil && bytes.HasPrefix(b, []byte("pfSense"))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user