mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-07-04 01:07:49 +02:00
all: refactor router code to use interface
So the code is more modular, easier to read/maintain.
This commit is contained in:
committed by
Cuong Manh Le
parent
78a7c87ecc
commit
aec2596262
@@ -0,0 +1,110 @@
|
||||
package firewalla
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/Control-D-Inc/ctrld/internal/router/dnsmasq"
|
||||
|
||||
"github.com/Control-D-Inc/ctrld"
|
||||
"github.com/kardianos/service"
|
||||
)
|
||||
|
||||
const (
|
||||
Name = "firewalla"
|
||||
|
||||
firewallaDNSMasqConfigPath = "/home/pi/.firewalla/config/dnsmasq_local/ctrld"
|
||||
firewallaConfigPostMainDir = "/home/pi/.firewalla/config/post_main.d"
|
||||
firewallaCtrldInitScriptPath = "/home/pi/.firewalla/config/post_main.d/start_ctrld.sh"
|
||||
)
|
||||
|
||||
type Firewalla struct {
|
||||
cfg *ctrld.Config
|
||||
}
|
||||
|
||||
// New returns a router.Router for configuring/setup/run ctrld on Firewalla routers.
|
||||
func New(cfg *ctrld.Config) *Firewalla {
|
||||
return &Firewalla{cfg: cfg}
|
||||
}
|
||||
|
||||
func (f *Firewalla) ConfigureService(_ *service.Config) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Firewalla) Install(_ *service.Config) error {
|
||||
// Writing startup script.
|
||||
if err := writeFirewallStartupScript(); err != nil {
|
||||
return fmt.Errorf("writing startup script: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Firewalla) Uninstall(_ *service.Config) error {
|
||||
// Removing startup script.
|
||||
if err := os.Remove(firewallaCtrldInitScriptPath); err != nil {
|
||||
return fmt.Errorf("removing startup script: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Firewalla) PreRun() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Firewalla) Configure() error {
|
||||
f.cfg.Listener["0"].IP = "0.0.0.0"
|
||||
f.cfg.Listener["0"].Port = 5354
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Firewalla) Setup() error {
|
||||
data, err := dnsmasq.FirewallaConfTmpl(dnsmasq.ConfigContentTmpl, f.cfg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("generating dnsmasq config: %w", err)
|
||||
}
|
||||
if err := os.WriteFile(firewallaDNSMasqConfigPath, []byte(data), 0600); err != nil {
|
||||
return fmt.Errorf("writing ctrld config: %w", err)
|
||||
}
|
||||
|
||||
// Restart dnsmasq service.
|
||||
if err := restartDNSMasq(); err != nil {
|
||||
return fmt.Errorf("restartDNSMasq: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Firewalla) Cleanup() error {
|
||||
// Removing current config.
|
||||
if err := os.Remove(firewallaDNSMasqConfigPath); err != nil {
|
||||
return fmt.Errorf("removing ctrld config: %w", err)
|
||||
}
|
||||
|
||||
// Restart dnsmasq service.
|
||||
if err := restartDNSMasq(); err != nil {
|
||||
return fmt.Errorf("restartDNSMasq: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeFirewallStartupScript() error {
|
||||
if err := os.MkdirAll(firewallaConfigPostMainDir, 0775); err != nil {
|
||||
return err
|
||||
}
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// This is called when "ctrld start ..." runs, so recording
|
||||
// the same command line arguments to use in startup script.
|
||||
argStr := strings.Join(os.Args[1:], " ")
|
||||
script := fmt.Sprintf("#!/bin/bash\n\nsudo %q %s\n", exe, argStr)
|
||||
return os.WriteFile(firewallaCtrldInitScriptPath, []byte(script), 0755)
|
||||
}
|
||||
|
||||
func restartDNSMasq() error {
|
||||
return exec.Command("systemctl", "restart", "firerouter_dns").Run()
|
||||
}
|
||||
Reference in New Issue
Block a user