diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 3ae97f2..99054da 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -850,7 +850,14 @@ NOTE: Uninstalling will set DNS to values provided by DHCP.`, checkHasElevatedPrivilege() }, Run: func(cmd *cobra.Command, args []string) { - s, err := newService(&prog{}, svcConfig) + bin, err := os.Executable() + if err != nil { + mainLog.Load().Fatal().Err(err).Msg("failed to get current ctrld binary path") + } + sc := &service.Config{} + *sc = *svcConfig + sc.Executable = bin + s, err := newService(&prog{}, sc) if err != nil { mainLog.Load().Error().Msg(err.Error()) return @@ -859,10 +866,6 @@ NOTE: Uninstalling will set DNS to values provided by DHCP.`, if _, err := s.Status(); errors.Is(err, service.ErrNotInstalled) { svcInstalled = false } - bin, err := os.Executable() - if err != nil { - mainLog.Load().Fatal().Err(err).Msg("failed to get current ctrld binary path") - } oldBin := bin + "_previous" baseUrl := upgradeChannel[upgradeChannelDefault] if len(args) > 0 { diff --git a/cmd/cli/service.go b/cmd/cli/service.go index ef37796..1de206f 100644 --- a/cmd/cli/service.go +++ b/cmd/cli/service.go @@ -21,7 +21,7 @@ func newService(i service.Interface, c *service.Config) (service.Service, error) } switch { case router.IsOldOpenwrt(), router.IsNetGearOrbi(): - return &procd{&sysV{s}}, nil + return &procd{sysV: &sysV{s}, svcConfig: c}, nil case router.IsGLiNet(): return &sysV{s}, nil case s.Platform() == "unix-systemv": @@ -89,18 +89,24 @@ func (s *sysV) Status() (service.Status, error) { // like old GL.iNET Opal router. type procd struct { *sysV + svcConfig *service.Config } func (s *procd) Status() (service.Status, error) { if !s.installed() { return service.StatusUnknown, service.ErrNotInstalled } - exe, err := os.Executable() - if err != nil { - return service.StatusUnknown, nil + bin := s.svcConfig.Executable + if bin == "" { + exe, err := os.Executable() + if err != nil { + return service.StatusUnknown, nil + } + bin = exe } + // Looking for something like "/sbin/ctrld run ". - shellCmd := fmt.Sprintf("ps | grep -q %q", exe+" [r]un ") + shellCmd := fmt.Sprintf("ps | grep -q %q", bin+" [r]un ") if err := exec.Command("sh", "-c", shellCmd).Run(); err != nil { return service.StatusStopped, nil } diff --git a/internal/router/service_merlin.go b/internal/router/service_merlin.go index 76ea938..8ab6d6a 100644 --- a/internal/router/service_merlin.go +++ b/internal/router/service_merlin.go @@ -49,11 +49,15 @@ func (s *merlinSvc) Platform() string { } func (s *merlinSvc) configPath() string { - path, err := os.Executable() - if err != nil { - return "" + bin := s.Config.Executable + if bin == "" { + path, err := os.Executable() + if err != nil { + return "" + } + bin = path } - return path + ".startup" + return bin + ".startup" } func (s *merlinSvc) template() *template.Template {