From 43efd1db1a6d19de15f2fc394615a006eaf5f96d Mon Sep 17 00:00:00 2001 From: rwxd Date: Tue, 10 Oct 2023 20:04:24 +0200 Subject: [PATCH 1/3] fix: cli command to unlock the autorestic running value --- cmd/unlock.go | 29 +++++++++++++++++++++++++++++ docs/pages/cli/unlock.md | 26 ++++++++++++++++++++++++++ 2 files changed, 55 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..6742917 --- /dev/null +++ b/cmd/unlock.go @@ -0,0 +1,29 @@ +package cmd + +import ( + "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 (ps aux | grep autorestic)", + 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() + err := lock.Unlock() + if err != nil { + colors.Error.Println("Could not unlock:", err) + return + } + + colors.Success.Println("Unlock successful") + }, +} + +func init() { + rootCmd.AddCommand(unlockCmd) +} diff --git a/docs/pages/cli/unlock.md b/docs/pages/cli/unlock.md new file mode 100644 index 0000000..96096f5 --- /dev/null +++ b/docs/pages/cli/unlock.md @@ -0,0 +1,26 @@ +# 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 +``` From ba51d1d0621686a77f80a27e5b2517dc5cb4bdef Mon Sep 17 00:00:00 2001 From: rwxd Date: Tue, 10 Oct 2023 20:56:55 +0200 Subject: [PATCH 2/3] fix(unlock cmd): get user confirmation in case an instance is still running --- cmd/unlock.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/cmd/unlock.go b/cmd/unlock.go index 6742917..042d43a 100644 --- a/cmd/unlock.go +++ b/cmd/unlock.go @@ -1,6 +1,11 @@ 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" @@ -9,11 +14,22 @@ import ( var unlockCmd = &cobra.Command{ Use: "unlock", - Short: "Unlock autorestic only if you are sure that no other instance is running (ps aux | grep autorestic)", + 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() + + if 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) @@ -27,3 +43,34 @@ To check you can run "ps aux | grep autorestic".`, func init() { rootCmd.AddCommand(unlockCmd) } + +// 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 +} From 8b6012034227a50a9b84f788997575aa5d8213d0 Mon Sep 17 00:00:00 2001 From: rwxd Date: Tue, 10 Oct 2023 21:23:17 +0200 Subject: [PATCH 3/3] fix(cmd unlock): add force flag --- cmd/unlock.go | 5 ++++- docs/pages/cli/unlock.md | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cmd/unlock.go b/cmd/unlock.go index 042d43a..cc109ae 100644 --- a/cmd/unlock.go +++ b/cmd/unlock.go @@ -20,7 +20,9 @@ To check you can run "ps aux | grep autorestic".`, Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - if isAutoresticRunning() { + 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) @@ -42,6 +44,7 @@ To check you can run "ps aux | grep autorestic".`, func init() { rootCmd.AddCommand(unlockCmd) + unlockCmd.Flags().Bool("force", false, "force unlock") } // isAutoresticRunning checks if autorestic is running diff --git a/docs/pages/cli/unlock.md b/docs/pages/cli/unlock.md index 96096f5..cb507c6 100644 --- a/docs/pages/cli/unlock.md +++ b/docs/pages/cli/unlock.md @@ -24,3 +24,9 @@ root 39260 0.0 0.0 6976 2696 pts/11 S+ 19:41 0:00 grep autorest ```bash autorestic unlock ``` + +Use the `--force` to prevent the confirmation prompt if an instance is running. + +```bash +autorestic unlock --force +```