mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-28 22:23:24 +00:00
The err should be preserved, so if we passed the error around, other functions could still check for utility error code correctly.
57 lines
1.4 KiB
Go
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)
|
|
}
|
|
}
|