fix(unlock cmd): get user confirmation in case an instance is still running

This commit is contained in:
rwxd 2023-10-10 20:56:55 +02:00
parent 43efd1db1a
commit ba51d1d062
No known key found for this signature in database
GPG Key ID: 8C3FE917649EDF11

View File

@ -1,6 +1,11 @@
package cmd package cmd
import ( import (
"bytes"
"fmt"
"os/exec"
"strings"
"github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal"
"github.com/cupcakearmy/autorestic/internal/colors" "github.com/cupcakearmy/autorestic/internal/colors"
"github.com/cupcakearmy/autorestic/internal/lock" "github.com/cupcakearmy/autorestic/internal/lock"
@ -9,11 +14,22 @@ import (
var unlockCmd = &cobra.Command{ var unlockCmd = &cobra.Command{
Use: "unlock", 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. Long: `Unlock autorestic only if you are sure that no other instance is running.
To check you can run "ps aux | grep autorestic".`, To check you can run "ps aux | grep autorestic".`,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
internal.GetConfig() 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() err := lock.Unlock()
if err != nil { if err != nil {
colors.Error.Println("Could not unlock:", err) colors.Error.Println("Could not unlock:", err)
@ -27,3 +43,34 @@ To check you can run "ps aux | grep autorestic".`,
func init() { func init() {
rootCmd.AddCommand(unlockCmd) 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
}