Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: cli command to unlock the autorestic running value #329

Merged
merged 3 commits into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
```