mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
all: make router setup/cleanup works more generally
This commit is contained in:
committed by
Cuong Manh Le
parent
66cb7cc21d
commit
9ed8e49a08
@@ -275,22 +275,19 @@ func initCLI() {
|
||||
if cp := router.CertPool(); cp != nil {
|
||||
rootCertPool = cp
|
||||
}
|
||||
// Perform router setup/cleanup if ctrld could not be direct listener.
|
||||
if !couldBeDirectListener(cfg.FirstListener()) {
|
||||
p.onStarted = append(p.onStarted, func() {
|
||||
mainLog.Debug().Msg("router setup")
|
||||
if err := p.router.Setup(); err != nil {
|
||||
mainLog.Error().Err(err).Msg("could not configure router")
|
||||
}
|
||||
})
|
||||
p.onStopped = append(p.onStopped, func() {
|
||||
mainLog.Debug().Msg("router cleanup")
|
||||
if err := p.router.Cleanup(); err != nil {
|
||||
mainLog.Error().Err(err).Msg("could not cleanup router")
|
||||
}
|
||||
p.resetDNS()
|
||||
})
|
||||
}
|
||||
p.onStarted = append(p.onStarted, func() {
|
||||
mainLog.Debug().Msg("router setup")
|
||||
if err := p.router.Setup(); err != nil {
|
||||
mainLog.Error().Err(err).Msg("could not configure router")
|
||||
}
|
||||
})
|
||||
p.onStopped = append(p.onStopped, func() {
|
||||
mainLog.Debug().Msg("router cleanup")
|
||||
if err := p.router.Cleanup(); err != nil {
|
||||
mainLog.Error().Err(err).Msg("could not cleanup router")
|
||||
}
|
||||
p.resetDNS()
|
||||
})
|
||||
}
|
||||
|
||||
close(waitCh)
|
||||
@@ -404,7 +401,7 @@ func initCLI() {
|
||||
return
|
||||
}
|
||||
|
||||
if router.Name() != "" && !couldBeDirectListener(cfg.FirstListener()) {
|
||||
if router.Name() != "" {
|
||||
mainLog.Debug().Msg("cleaning up router before installing")
|
||||
_ = p.router.Cleanup()
|
||||
}
|
||||
@@ -504,15 +501,18 @@ func initCLI() {
|
||||
Short: "Stop the ctrld service",
|
||||
Args: cobra.NoArgs,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
prog := &prog{}
|
||||
s, err := newService(prog, svcConfig)
|
||||
tryReadingConfig(false)
|
||||
v.Unmarshal(&cfg)
|
||||
p := &prog{router: router.New(&cfg)}
|
||||
s, err := newService(p, svcConfig)
|
||||
if err != nil {
|
||||
mainLog.Error().Msg(err.Error())
|
||||
return
|
||||
}
|
||||
initLogging()
|
||||
if doTasks([]task{{s.Stop, true}}) {
|
||||
prog.resetDNS()
|
||||
p.router.Cleanup()
|
||||
p.resetDNS()
|
||||
mainLog.Notice().Msg("Service stopped")
|
||||
}
|
||||
},
|
||||
@@ -591,7 +591,9 @@ func initCLI() {
|
||||
NOTE: Uninstalling will set DNS to values provided by DHCP.`,
|
||||
Args: cobra.NoArgs,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
p := &prog{}
|
||||
tryReadingConfig(false)
|
||||
v.Unmarshal(&cfg)
|
||||
p := &prog{router: router.New(&cfg)}
|
||||
s, err := newService(p, svcConfig)
|
||||
if err != nil {
|
||||
mainLog.Error().Msg(err.Error())
|
||||
@@ -1157,19 +1159,20 @@ func uninstall(p *prog, s service.Service) {
|
||||
}
|
||||
initLogging()
|
||||
if doTasks(tasks) {
|
||||
r := router.New(&cfg)
|
||||
if err := r.Uninstall(svcConfig); err != nil {
|
||||
if err := p.router.ConfigureService(svcConfig); err != nil {
|
||||
mainLog.Fatal().Err(err).Msg("could not configure service")
|
||||
}
|
||||
if err := p.router.Uninstall(svcConfig); err != nil {
|
||||
mainLog.Warn().Err(err).Msg("post uninstallation failed, please check system/service log for details error")
|
||||
return
|
||||
}
|
||||
// Stop already reset DNS on router.
|
||||
if router.Name() == "" {
|
||||
p.resetDNS()
|
||||
p.resetDNS()
|
||||
if router.Name() != "" {
|
||||
mainLog.Debug().Msg("Router cleanup")
|
||||
}
|
||||
mainLog.Debug().Msg("Router cleanup")
|
||||
// Stop already did router.Cleanup and report any error if happens,
|
||||
// ignoring error here to prevent false positive.
|
||||
_ = r.Cleanup()
|
||||
_ = p.router.Cleanup()
|
||||
mainLog.Notice().Msg("Service uninstalled")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ func resetDNS(iface *net.Interface) (err error) {
|
||||
if ctrldnet.IPv6Available(ctx) {
|
||||
c := client6.NewClient()
|
||||
conversation, err := c.Exchange(iface.Name)
|
||||
if err != nil {
|
||||
if err != nil && !errAddrInUse(err) {
|
||||
mainLog.Debug().Err(err).Msg("could not exchange DHCPv6")
|
||||
}
|
||||
for _, packet := range conversation {
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net"
|
||||
"os"
|
||||
"strconv"
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/kardianos/service"
|
||||
|
||||
@@ -216,7 +218,7 @@ func (p *prog) setDNS() {
|
||||
logger.Debug().Msg("setting DNS for interface")
|
||||
ns := lc.IP
|
||||
switch {
|
||||
case couldBeDirectListener(lc):
|
||||
case lc.IsDirectDnsListener():
|
||||
// If ctrld is direct listener, use 127.0.0.1 as nameserver.
|
||||
ns = "127.0.0.1"
|
||||
case lc.Port != 53:
|
||||
@@ -294,3 +296,11 @@ func runLogServer(sockPath string) net.Conn {
|
||||
}
|
||||
return server
|
||||
}
|
||||
|
||||
func errAddrInUse(err error) bool {
|
||||
opErr, ok := err.(*net.OpError)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return errors.Is(opErr.Err, syscall.EADDRINUSE)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user