Replace mapdns with daemon DNS
Serve daemon-managed .vm names directly from bangerd on 127.0.0.1:42069 instead of shelling out to mapdns. This keeps DNS state tied to VM lifecycle and lets the daemon rebuild records from running VMs after startup or reconcile. Add a small in-process authoritative DNS server, register and remove records from the VM start/stop/delete paths, and show the listener in daemon status. Remove the mapdns config and preflight surface, stop helper-flow DNS publishing in customize.sh and interactive.sh, drop dns.sh from the runtime bundle, and update docs/tests for the new local-resolver integration model. Validated with GOCACHE=/tmp/banger-gocache go test ./..., GOCACHE=/tmp/banger-gocache make build, and bash -n customize.sh interactive.sh.
This commit is contained in:
parent
430f66d5dd
commit
0a0b0b617b
24 changed files with 576 additions and 278 deletions
|
|
@ -22,6 +22,7 @@ import (
|
|||
"banger/internal/rpc"
|
||||
"banger/internal/store"
|
||||
"banger/internal/system"
|
||||
"banger/internal/vmdns"
|
||||
)
|
||||
|
||||
type Daemon struct {
|
||||
|
|
@ -35,10 +36,11 @@ type Daemon struct {
|
|||
once sync.Once
|
||||
pid int
|
||||
listener net.Listener
|
||||
vmDNS *vmdns.Server
|
||||
requestHandler func(context.Context, rpc.Request) rpc.Response
|
||||
}
|
||||
|
||||
func Open(ctx context.Context) (*Daemon, error) {
|
||||
func Open(ctx context.Context) (d *Daemon, err error) {
|
||||
layout, err := paths.Resolve()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
@ -59,7 +61,7 @@ func Open(ctx context.Context) (*Daemon, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
d := &Daemon{
|
||||
d = &Daemon{
|
||||
layout: layout,
|
||||
config: cfg,
|
||||
store: db,
|
||||
|
|
@ -69,11 +71,20 @@ func Open(ctx context.Context) (*Daemon, error) {
|
|||
pid: os.Getpid(),
|
||||
}
|
||||
d.logger.Info("daemon opened", "socket", layout.SocketPath, "state_dir", layout.StateDir, "runtime_dir", cfg.RuntimeDir, "log_level", cfg.LogLevel)
|
||||
if err := d.ensureDefaultImage(ctx); err != nil {
|
||||
if err = d.startVMDNS(vmdns.DefaultListenAddr); err != nil {
|
||||
d.logger.Error("daemon open failed", "stage", "start_vm_dns", "error", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
defer func() {
|
||||
if err != nil {
|
||||
_ = d.stopVMDNS()
|
||||
}
|
||||
}()
|
||||
if err = d.ensureDefaultImage(ctx); err != nil {
|
||||
d.logger.Error("daemon open failed", "stage", "ensure_default_image", "error", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
if err := d.reconcile(ctx); err != nil {
|
||||
if err = d.reconcile(ctx); err != nil {
|
||||
d.logger.Error("daemon open failed", "stage", "reconcile", "error", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -90,7 +101,7 @@ func (d *Daemon) Close() error {
|
|||
if d.listener != nil {
|
||||
_ = d.listener.Close()
|
||||
}
|
||||
err = d.store.Close()
|
||||
err = errors.Join(d.stopVMDNS(), d.store.Close())
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
|
@ -358,6 +369,27 @@ func (d *Daemon) backgroundLoop() {
|
|||
}
|
||||
}
|
||||
|
||||
func (d *Daemon) startVMDNS(addr string) error {
|
||||
server, err := vmdns.New(addr, d.logger)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
d.vmDNS = server
|
||||
if d.logger != nil {
|
||||
d.logger.Info("vm dns serving", "dns_addr", server.Addr())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Daemon) stopVMDNS() error {
|
||||
if d.vmDNS == nil {
|
||||
return nil
|
||||
}
|
||||
err := d.vmDNS.Close()
|
||||
d.vmDNS = nil
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *Daemon) ensureDefaultImage(ctx context.Context) error {
|
||||
if d.config.DefaultImageName == "" {
|
||||
return nil
|
||||
|
|
@ -477,6 +509,9 @@ func (d *Daemon) reconcile(ctx context.Context) error {
|
|||
return op.fail(err, vmLogAttrs(vm)...)
|
||||
}
|
||||
}
|
||||
if err := d.rebuildDNS(ctx); err != nil {
|
||||
return op.fail(err)
|
||||
}
|
||||
op.done()
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue