From 12f6143bb4572dad073e7b68a9ff7be786b52b1f Mon Sep 17 00:00:00 2001 From: Florian <40308458+rwxd@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:26:12 +0100 Subject: [PATCH] fix: cli command to unlock the autorestic running value (#329) * fix: cli command to unlock the autorestic running value * fix(unlock cmd): get user confirmation in case an instance is still running * fix(cmd unlock): add force flag --- cmd/unlock.go | 79 ++++++++++++++++++++++++++++++++++++++++ docs/pages/cli/unlock.md | 32 ++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 cmd/unlock.go create mode 100644 docs/pages/cli/unlock.md diff --git a/cmd/unlock.go b/cmd/unlock.go new file mode 100644 index 0000000..cc109ae --- /dev/null +++ b/cmd/unlock.go @@ -0,0 +1,79 @@ +package cmd + +import ( + "bytes" + "fmt" + "os/exec" + "strings" + + "github.com/cupcakearmy/autorestic/internal" + "github.com/cupcakearmy/autorestic/internal/colors" + "github.com/cupcakearmy/autorestic/internal/lock" + "github.com/spf13/cobra" +) + +var unlockCmd = &cobra.Command{ + Use: "unlock", + Short: "Unlock autorestic only if you are sure that no other instance is running", + Long: `Unlock autorestic only if you are sure that no other instance is running. +To check you can run "ps aux | grep autorestic".`, + Run: func(cmd *cobra.Command, args []string) { + internal.GetConfig() + + force, _ := cmd.Flags().GetBool("force") + + if !force && isAutoresticRunning() { + colors.Error.Print("Another autorestic instance is running. Are you sure you want to unlock? (yes/no): ") + var response string + fmt.Scanln(&response) + if strings.ToLower(response) != "yes" { + colors.Primary.Println("Unlocking aborted.") + return + } + } + + err := lock.Unlock() + if err != nil { + colors.Error.Println("Could not unlock:", err) + return + } + + colors.Success.Println("Unlock successful") + }, +} + +func init() { + rootCmd.AddCommand(unlockCmd) + unlockCmd.Flags().Bool("force", false, "force unlock") +} + +// isAutoresticRunning checks if autorestic is running +// and returns true if it is. +// It also prints the processes to stdout. +func isAutoresticRunning() bool { + cmd := exec.Command("sh", "-c", "ps aux | grep autorestic") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return false + } + + lines := strings.Split(out.String(), "\n") + autoresticProcesses := []string{} + + for _, line := range lines { + if strings.Contains(line, "autorestic") && !strings.Contains(line, "grep autorestic") { + autoresticProcesses = append(autoresticProcesses, line) + } + } + + if len(autoresticProcesses) > 0 { + colors.Faint.Println("Found autorestic processes:") + for _, proc := range autoresticProcesses { + colors.Faint.Println(proc) + } + return true + } + return false +} diff --git a/docs/pages/cli/unlock.md b/docs/pages/cli/unlock.md new file mode 100644 index 0000000..cb507c6 --- /dev/null +++ b/docs/pages/cli/unlock.md @@ -0,0 +1,32 @@ +# Unlock + +In case autorestic throws the error message `an instance is already running. exiting`, but there is no instance running you can unlock the lock. + +To verify that there is no instance running you can use `ps aux | grep autorestic`. + +Example with no instance running: + +```bash +> ps aux | grep autorestic +root 39260 0.0 0.0 6976 2696 pts/11 S+ 19:41 0:00 grep autorestic +``` + +Example with an instance running: + +```bash +> ps aux | grep autorestic +root 29465 0.0 0.0 1162068 7380 pts/7 Sl+ 19:28 0:00 autorestic --ci backup -a +root 39260 0.0 0.0 6976 2696 pts/11 S+ 19:41 0:00 grep autorestic +``` + +**If an instance is running you should not unlock as it could lead to data loss!** + +```bash +autorestic unlock +``` + +Use the `--force` to prevent the confirmation prompt if an instance is running. + +```bash +autorestic unlock --force +```