Skip to content

Commit

Permalink
fix: cli command to unlock the autorestic running value (#329)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
rwxd authored Mar 12, 2024
1 parent a6bf1d1 commit 12f6143
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 0 deletions.
79 changes: 79 additions & 0 deletions cmd/unlock.go
Original file line number Diff line number Diff line change
@@ -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
}
32 changes: 32 additions & 0 deletions docs/pages/cli/unlock.md
Original file line number Diff line number Diff line change
@@ -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
```

0 comments on commit 12f6143

Please sign in to comment.