mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-28 22:23:24 +00:00
While at it, also ensure custom config is ignored when running on router, because we need to point to 127.0.0.1:53 (dnsmasq listener).
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
package router
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
func setupMerlin() error {
|
|
buf, err := os.ReadFile(merlinDNSMasqPostConfPath)
|
|
// Already setup.
|
|
if bytes.Contains(buf, []byte(merlinDNSMasqPostConfMarker)) {
|
|
return nil
|
|
}
|
|
if err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
|
|
merlinDNSMasqPostConf, err := dnsMasqConf()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
data := strings.Join([]string{
|
|
merlinDNSMasqPostConf,
|
|
"\n",
|
|
merlinDNSMasqPostConfMarker,
|
|
"\n",
|
|
string(buf),
|
|
}, "\n")
|
|
// Write dnsmasq post conf file.
|
|
if err := os.WriteFile(merlinDNSMasqPostConfPath, []byte(data), 0750); err != nil {
|
|
return err
|
|
}
|
|
// Restart dnsmasq service.
|
|
if err := merlinRestartDNSMasq(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := nvramSetup(nvramKV()); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func cleanupMerlin() error {
|
|
// Restore old configs.
|
|
if err := nvramRestore(nvramKV()); err != nil {
|
|
return err
|
|
}
|
|
buf, err := os.ReadFile(merlinDNSMasqPostConfPath)
|
|
if err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
// Restore dnsmasq post conf file.
|
|
if err := os.WriteFile(merlinDNSMasqPostConfPath, merlinParsePostConf(buf), 0750); err != nil {
|
|
return err
|
|
}
|
|
// Restart dnsmasq service.
|
|
if err := merlinRestartDNSMasq(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func postInstallMerlin() error {
|
|
return nil
|
|
}
|
|
|
|
func merlinRestartDNSMasq() error {
|
|
if out, err := exec.Command("service", "restart_dnsmasq").CombinedOutput(); err != nil {
|
|
return fmt.Errorf("restart_dnsmasq: %s, %w", string(out), err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func merlinParsePostConf(buf []byte) []byte {
|
|
if len(buf) == 0 {
|
|
return nil
|
|
}
|
|
parts := bytes.Split(buf, []byte(merlinDNSMasqPostConfMarker))
|
|
if len(parts) != 1 {
|
|
return bytes.TrimLeftFunc(parts[1], unicode.IsSpace)
|
|
}
|
|
return buf
|
|
}
|