diff --git a/v3/cmd/wails3/main.go b/v3/cmd/wails3/main.go index 5f620220d..95038b616 100644 --- a/v3/cmd/wails3/main.go +++ b/v3/cmd/wails3/main.go @@ -44,6 +44,8 @@ func main() { //plugin.NewSubCommandFunction("list", "List plugins", commands.PluginList) plugin.NewSubCommandFunction("init", "Initialise a new plugin", commands.PluginInit) //plugin.NewSubCommandFunction("add", "Add a plugin", commands.PluginAdd) + tool := app.NewSubCommand("tool", "Various tools") + tool.NewSubCommandFunction("checkport", "Checks if a port is open. Useful for testing if vite is running.", commands.ToolCheckPort) app.NewSubCommandFunction("version", "Print the version", commands.Version) diff --git a/v3/internal/commands/tool_checkport.go b/v3/internal/commands/tool_checkport.go new file mode 100644 index 000000000..1c209008c --- /dev/null +++ b/v3/internal/commands/tool_checkport.go @@ -0,0 +1,36 @@ +package commands + +import ( + "fmt" + "net" + "time" +) + +type ToolCheckPortOptions struct { + Host string `name:"h" description:"Host to check" default:"localhost"` + Port int `name:"p" description:"Port to check"` +} + +func isPortOpen(ip string, port int) bool { + timeout := time.Second + conn, err := net.DialTimeout("tcp", net.JoinHostPort(ip, fmt.Sprintf("%d", port)), timeout) + if err != nil { + return false + } + + // If there's no error, close the connection and return true. + if conn != nil { + _ = conn.Close() + } + return true +} + +func ToolCheckPort(options *ToolCheckPortOptions) error { + if options.Port == 0 { + return fmt.Errorf("please use the -p flag to specify a port") + } + if !isPortOpen(options.Host, options.Port) { + return fmt.Errorf("port %d is not open on %s", options.Port, options.Host) + } + return nil +}