Files
ctrld/cmd/cli/self_kill_unix.go
Cuong Manh Le 8b98faa441 cmd/cli: do not mask err argument of selfUninstall
The err should be preserved, so if we passed the error around, other
functions could still check for utility error code correctly.
2024-08-07 15:54:22 +07:00

57 lines
1.4 KiB
Go

//go:build unix
package cli
import (
"errors"
"fmt"
"os"
"os/exec"
"runtime"
"syscall"
"github.com/Control-D-Inc/ctrld/internal/controld"
"github.com/rs/zerolog"
)
func selfUninstall(uninstallErr error, p *prog, logger zerolog.Logger) {
var uer *controld.UtilityErrorResponse
if errors.As(uninstallErr, &uer) && uer.ErrorField.Code == controld.InvalidConfigCode {
if runtime.GOOS == "linux" {
s, err := newService(p, svcConfig)
if err != nil {
logger.Warn().Err(err).Msg("failed to create new service")
} else {
selfUninstallLinux(uninstallErr, p, logger)
_ = s.Stop()
os.Exit(0)
}
}
bin, err := os.Executable()
if err != nil {
logger.Fatal().Err(err).Msg("could not determine executable")
}
args := []string{"uninstall"}
if !deactivationPinNotSet() {
args = append(args, fmt.Sprintf("--pin=%d", cdDeactivationPin))
}
cmd := exec.Command(bin, args...)
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
if err := cmd.Start(); err != nil {
logger.Fatal().Err(err).Msg("could not start self uninstall command")
}
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
logger.Warn().Msgf("service was uninstalled because device %q does not exist", cdUID)
_ = cmd.Wait()
os.Exit(0)
}
}
func selfUninstallLinux(err error, p *prog, logger zerolog.Logger) {
if uninstallIfInvalidCdUID(err, p, logger) {
logger.Warn().Msgf("service was uninstalled because device %q does not exist", cdUID)
}
}