diff --git a/docs/router_backup.1 b/docs/router_backup.1 index 5de12cc..42f63f5 100644 --- a/docs/router_backup.1 +++ b/docs/router_backup.1 @@ -8,6 +8,7 @@ ipng-router-backup \- SSH Router Backup Tool .RI [ --password " PASSWORD" ] .RI [ --key-file " KEYFILE" ] .RI [ --port " PORT" ] +.RI [ --host " HOSTNAME" ]... .SH DESCRIPTION .B router_backup is a tool for backing up router configurations via SSH. It connects to multiple routers defined in a YAML configuration file and executes commands, saving the output to files. @@ -30,6 +31,9 @@ SSH private key file path .BR --port " \fIPORT\fR" SSH port number (default: 22) .TP +.BR --host " \fIHOSTNAME\fR" +Specific host(s) to process (can be repeated, processes all if not specified) +.TP .BR --help Show help message .SH CONFIGURATION @@ -81,6 +85,11 @@ Using password authentication: .EX ipng-router-backup --config config.yaml --password mysecretpass .EE +.TP +Process specific hosts only: +.EX +ipng-router-backup --config config.yaml --host asw100 --host asw120 +.EE .SH FILES .TP .I /etc/ipng-router-backup/config.yaml.example diff --git a/src/router_backup.go b/src/router_backup.go index 89ed1d2..03bb434 100644 --- a/src/router_backup.go +++ b/src/router_backup.go @@ -221,6 +221,7 @@ func main() { var keyFile string var port int var outputDir string + var hostFilter []string var rootCmd = &cobra.Command{ Use: "ipng-router-backup", @@ -250,10 +251,23 @@ func main() { log.Fatal("No devices found in config file") } - successCount := 0 - totalCount := len(config.Devices) + // Filter devices if --host flags are provided + devicesToProcess := config.Devices + if len(hostFilter) > 0 { + devicesToProcess = make(map[string]Device) + for _, hostname := range hostFilter { + if deviceConfig, exists := config.Devices[hostname]; exists { + devicesToProcess[hostname] = deviceConfig + } else { + fmt.Printf("Warning: Host '%s' not found in config file\n", hostname) + } + } + } - for hostname, deviceConfig := range config.Devices { + successCount := 0 + totalCount := len(devicesToProcess) + + for hostname, deviceConfig := range devicesToProcess { fmt.Printf("\nProcessing device: %s (type: %s)\n", hostname, deviceConfig.Type) user := deviceConfig.User @@ -306,6 +320,7 @@ func main() { rootCmd.Flags().StringVar(&keyFile, "key-file", "", "SSH private key file path") rootCmd.Flags().IntVar(&port, "port", 22, "SSH port") rootCmd.Flags().StringVar(&outputDir, "output-dir", "/tmp", "Output directory for command output files") + rootCmd.Flags().StringSliceVar(&hostFilter, "host", []string{}, "Specific host(s) to process (can be repeated, processes all if not specified)") rootCmd.MarkFlagRequired("config")