{"record":{"id":"a1b1d89219ff189b","repo":"lima-vm/lima","slug":"daemon-q-is-not-available","errorCode":null,"errorMessage":"daemon %#q is not available","messagePattern":"daemon %#q is not available","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"pkg/networks/commands.go","lineNumber":100,"sourceCode":"\tif ok, _ := c.IsDaemonInstalled(daemon); !ok {\n\t\tdaemonPath, _ := c.DaemonPath(daemon)\n\t\treturn osutil.User{}, fmt.Errorf(\"daemon %#q (path=%#q) is not available\", daemon, daemonPath)\n\t}\n\t//nolint:gocritic // singleCaseSwitch: should rewrite switch statement to if statement\n\tswitch daemon {\n\tcase SocketVMNet:\n\t\treturn osutil.LookupUser(\"root\")\n\t}\n\treturn osutil.User{}, fmt.Errorf(\"daemon %#q not defined\", daemon)\n}\n\nfunc (c *Config) MkdirCmd() string {\n\treturn fmt.Sprintf(\"/bin/mkdir -m 775 -p %s\", c.Paths.VarRun)\n}\n\nfunc (c *Config) StartCmd(name, daemon string) string {\n\tif ok, _ := c.IsDaemonInstalled(daemon); !ok {\n\t\tpanic(fmt.Errorf(\"daemon %#q is not available\", daemon))\n\t}\n\tvar cmd string\n\tswitch daemon {\n\tcase SocketVMNet:\n\t\tnw := c.Networks[name]\n\t\tif c.Paths.SocketVMNet == \"\" {\n\t\t\tpanic(\"c.Paths.SocketVMNet is empty\")\n\t\t}\n\t\tcmd = fmt.Sprintf(\"%s --pidfile=%s --socket-group=%s --vmnet-mode=%s\",\n\t\t\tc.Paths.SocketVMNet, c.PIDFile(name, SocketVMNet), c.Group, nw.Mode)\n\t\tswitch nw.Mode {\n\t\tcase ModeBridged:\n\t\t\tcmd += fmt.Sprintf(\" --vmnet-interface=%s\", nw.Interface)\n\t\tcase ModeHost, ModeShared:\n\t\t\tcmd += fmt.Sprintf(\" --vmnet-gateway=%s --vmnet-dhcp-end=%s --vmnet-mask=%s\",\n\t\t\t\tnw.Gateway, nw.DHCPEnd, nw.NetMask)\n\t\t}\n\t\tcmd += \" \" + c.Sock(name)","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/lima-vm/lima/blob/dd909d0973cd84fa35f9e1693181b4585ea616c1/pkg/networks/commands.go#L82-L118","documentation":"Config.StartCmd builds the shell command that launches the network daemon. If IsDaemonInstalled reports the daemon is missing, it panics with 'daemon %#q is not available' because StartCmd returns only a string (no error) and cannot proceed sensibly. Unlike User(), this is a panic, not a returned error.","triggerScenarios":"startDaemon calls StartCmd(name, daemon) when Paths.SocketVMNet is empty or the configured binary does not exist — the same precondition that makes User() return its error.","commonSituations":"socket_vmnet not installed; networks.yaml missing the paths.socketVMNet entry; calling StartCmd from custom tooling without first verifying installation via IsDaemonInstalled.","solutions":["Install socket_vmnet and point paths.socketVMNet at the real binary","Call IsDaemonInstalled(daemon) and abort before invoking StartCmd","Prefer using the higher-level startDaemon flow that performs the check via User()"],"exampleFix":"// before\ncmd := cfg.StartCmd(net, networks.SocketVMNet) // panics if missing\n// after\nif ok, _ := cfg.IsDaemonInstalled(networks.SocketVMNet); !ok {\n    return fmt.Errorf(\"socket_vmnet not installed\")\n}\ncmd := cfg.StartCmd(net, networks.SocketVMNet)","handlingStrategy":"validation","validationCode":"ok, _ := cfg.IsDaemonInstalled(networks.SocketVMNet)\nif !ok {\n    return fmt.Errorf(\"refusing to build start command: socket_vmnet is not installed\")\n}\ncmd := cfg.StartCmd(name, networks.SocketVMNet)","typeGuard":null,"tryCatchPattern":"// StartCmd panics rather than returning an error — guard with recover()\nfunc safeStartCmd(cfg *networks.Config, name, daemon string) (cmd string, err error) {\n    defer func() { if r := recover(); r != nil { err = fmt.Errorf(\"%v\", r) } }()\n    return cfg.StartCmd(name, daemon), nil\n}","preventionTips":["Always call IsDaemonInstalled before StartCmd — StartCmd panics, it does not return errors","Wrap StartCmd in recover() when daemon installation cannot be guaranteed","Install socket_vmnet and configure paths.socketVMNet before network operations"],"tags":["network","daemon","panic","socket-vmnet","go"],"backgroundTag":"daemon-not-installed","analyzedSha":"dd909d0973cd84fa35f9e1693181b4585ea616c1","analyzedAt":"2026-09-01T14:24:59.842Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}