From af3b994f002fcab899a7d2a896f5748fee1fb891 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 26 Jun 2026 22:42:15 +0200 Subject: [PATCH] cli backup #1106 --- cmd/backup.go | 36 ++++++++++++++++++++++++++++++++++++ cmd/cmd.go | 16 ++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 cmd/backup.go diff --git a/cmd/backup.go b/cmd/backup.go new file mode 100644 index 0000000..313b4d1 --- /dev/null +++ b/cmd/backup.go @@ -0,0 +1,36 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/alireza0/s-ui/config" + "github.com/alireza0/s-ui/database" +) + +func backupDb(output string, exclude string) { + if output == "" { + fmt.Println("backup failed: -output is required (use - for stdout)") + return + } + if err := database.InitDB(config.GetDBPath()); err != nil { + fmt.Println("backup failed:", err) + return + } + data, err := database.GetDb(exclude) + if err != nil { + fmt.Println("backup failed:", err) + return + } + if output == "-" { + if _, err := os.Stdout.Write(data); err != nil { + fmt.Fprintln(os.Stderr, "backup failed:", err) + } + return + } + if err := os.WriteFile(output, data, 0600); err != nil { + fmt.Println("backup failed:", err) + return + } + fmt.Println("backup saved to", output) +} diff --git a/cmd/cmd.go b/cmd/cmd.go index df99053..6432774 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -16,6 +16,7 @@ func ParseCmd() { adminCmd := flag.NewFlagSet("admin", flag.ExitOnError) settingCmd := flag.NewFlagSet("setting", flag.ExitOnError) + backupCmd := flag.NewFlagSet("backup", flag.ExitOnError) var username string var password string @@ -25,6 +26,10 @@ func ParseCmd() { var subPath string var reset bool var show bool + var output string + var exclude string + backupCmd.StringVar(&output, "output", "", "backup output file path (use - for stdout)") + backupCmd.StringVar(&exclude, "exclude", "", "comma-separated tables to exclude: changes,stats") settingCmd.BoolVar(&reset, "reset", false, "reset all settings") settingCmd.BoolVar(&show, "show", false, "show current settings") settingCmd.IntVar(&port, "port", 0, "set panel port") @@ -46,10 +51,13 @@ func ParseCmd() { fmt.Println(" uri Show panel URI") fmt.Println(" migrate migrate form older version") fmt.Println(" setting set/reset/show settings") + fmt.Println(" backup create a database backup") fmt.Println() adminCmd.Usage() fmt.Println() settingCmd.Usage() + fmt.Println() + backupCmd.Usage() } flag.Parse() @@ -105,6 +113,14 @@ func ParseCmd() { updateSetting(port, path, subPort, subPath) showSetting() } + + case "backup": + err := backupCmd.Parse(os.Args[2:]) + if err != nil { + fmt.Println(err) + return + } + backupDb(output, exclude) default: fmt.Println("Invalid subcommands") flag.Usage()