From eaefba329238b64e1761fa2fc0e58d4a636ec850 Mon Sep 17 00:00:00 2001 From: jake Date: Sat, 19 Apr 2025 01:10:22 -0400 Subject: [PATCH 1/2] migrating to isSet and readme checks --- README.md | 8 ++++---- cmd/delete.go | 14 +++++--------- cmd/login.go | 3 ++- cmd/run.go | 17 +++++++---------- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 68c0d1e..5d5c4bd 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ go install code.jakeyoungdev.com/jake/mctl@main #it is recommended to use a tagg ## Setup ### Configuring mctl -mctl requires a one-time setup via the 'config' command before interacting with any servers, password is entered securely from the terminal +mctl requires a one-time setup via the 'config' command before interacting with any servers, password is entered securely from the terminal and encrypted ```bash mctl config -s -p ``` @@ -23,7 +23,7 @@ mctl login #makes auth request to server with saved password ``` ### Sending commands -If login is successful the app will enter the command loop, which allows commands to be sent directly to the server until 'mctl' is sent. Commands are sent as-is to the server, there is no validation of command syntax within mctl +If login is successful the app will enter the command loop, which allows commands to be sent directly to the server. Commands are sent as-is to the server, there is no validation of command syntax within mctl ``` Logging into X.X.X.X on port 61695 Connected! Type 'mctl' to close @@ -33,7 +33,7 @@ There are 0 of a max of 20 players online: ``` ### Saving commands -Commands can be saved under an alias for quick execution later, saved commands can contain placeholders '%s' that can be populated at runtime to allow for commands with unique runtime args to still be saved: +Commands can be saved under an alias for quick execution later, saved commands can contain placeholders '%s' that can be populated at runtime to allow for commands with unique runtime args to still be saved, see [example](#saving-and-running-example) for more: ```bash mctl save ``` @@ -90,7 +90,7 @@ mctl delete |server|s|yes|RCon address| ### Configuration file -All configuration data will be kept in /home/.mctl.yaml or C:\\Users\\username\\.mctl.yaml, passwords are encrypted for an added layer of security +All configuration data will be kept in the home directory and any sensitive data is encrypted for added security ## Security RCon is an inherently insecure protocol, passwords are sent in plaintext and, if possible, the port should not be exposed to the internet. It is best to keep these connections local or over a VPN diff --git a/cmd/delete.go b/cmd/delete.go index d0116cb..5508df6 100644 --- a/cmd/delete.go +++ b/cmd/delete.go @@ -17,16 +17,12 @@ var deleteCmd = &cobra.Command{ Short: "Delete a saved command", Long: `Deletes a command stored using the save command`, Run: func(cmd *cobra.Command, args []string) { - var cm map[string]any - cmdMap := viper.Get("customcmd") - if cmdMap == nil { - cm = make(map[string]any, 0) - } else { - cm = cmdMap.(map[string]any) + if viper.IsSet("customcmd") { + cmdMap := viper.Get("customcmd").(map[string]any) + delete(cmdMap, args[0]) + viper.Set("customcmd", cmdMap) + viper.WriteConfig() } - delete(cm, args[0]) - viper.Set("customcmd", cmdMap) - viper.WriteConfig() }, PreRunE: func(cmd *cobra.Command, args []string) error { if len(args) == 0 { diff --git a/cmd/login.go b/cmd/login.go index 6221594..84e22f9 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -58,9 +58,10 @@ var loginCmd = &cobra.Command{ }, PreRunE: func(cmd *cobra.Command, args []string) error { //ensure config command has been run - if viper.Get("server") == "" || viper.Get("password") == "" || viper.Get("port") == 0 { + if !viper.IsSet("server") || !viper.IsSet("password") || !viper.IsSet("port") { return errors.New("the 'config' command must be run before you can interact with servers") } + return nil }, } diff --git a/cmd/run.go b/cmd/run.go index 3cbae72..bf749c6 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -22,14 +22,7 @@ var runCmd = &cobra.Command{ Long: `Loads a saved command, injects the supplied arguments into the command, and sends the command to the remove server printing the response`, Run: func(cmd *cobra.Command, args []string) { - //check for command map - var cm map[string]any - cmdMap := viper.Get("customcmd") - if cmdMap == nil { - cm = make(map[string]any, 0) - } else { - cm = cmdMap.(map[string]any) - } + cm := viper.Get("customcmd").(map[string]any) //is this an existing command cmdRun, ok := cm[args[0]] if !ok { @@ -58,11 +51,15 @@ var runCmd = &cobra.Command{ fmt.Println(res) }, PreRunE: func(cmd *cobra.Command, args []string) error { - //ensure configuration has been setup - if viper.Get("server") == "" || viper.Get("password") == "" || viper.Get("port") == 0 { + //ensure config command has been run + if !viper.IsSet("server") || !viper.IsSet("password") || !viper.IsSet("port") { return errors.New("the 'config' command must be run before you can interact with servers") } + if !viper.IsSet("customcmd") { + return errors.New("no saved commands to run") + } + //ensure we have a command name al := len(args) if al == 0 { -- 2.47.2 From fc8acc7ce1345866d0cb6aee1589f147e716acf3 Mon Sep 17 00:00:00 2001 From: jake Date: Sat, 19 Apr 2025 01:13:28 -0400 Subject: [PATCH 2/2] version bump --- cmd/root.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/root.go b/cmd/root.go index ef0e5d9..aa93b8e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -14,7 +14,7 @@ var rootCmd = &cobra.Command{ Use: "mctl", Short: "A remote console client", Long: `mctl is a terminal-friendly remote console client made to manage game servers.`, - Version: "v0.3.2", + Version: "v0.3.3", // Run: func(cmd *cobra.Command, args []string) { }, } -- 2.47.2