diff --git a/cmd/hoster_cli/commands/freePort.go b/cmd/hoster_cli/commands/freePort.go new file mode 100644 index 0000000..5688231 --- /dev/null +++ b/cmd/hoster_cli/commands/freePort.go @@ -0,0 +1,40 @@ +package commands + +import ( + "fmt" + "slices" + + "gitea.codeblob.work/pk/hoster/internals/conf" + "gitea.codeblob.work/pk/hoster/internals/helpers" + "github.com/urfave/cli/v2" +) + +func CmdCheckPort(c *cli.Context) error { + sitesAvail := conf.App.MustString("nginx.sitesAvailable") + existingProjects, err := helpers.FindHostConfigs(sitesAvail) + if err != nil { + return err + } + + usedPorts := []int{} + for _, project := range existingProjects { + usedPorts = append(usedPorts, project.InternalPort) + } + + port := conf.App.Int("nginx.portRangeStart") + freePort := 0 + for port <= conf.App.Int("nginx.portRangeEnd") { + if !slices.Contains(usedPorts, port) && helpers.IsFreePort(port) { + freePort = port + break + } + port++ + } + + if freePort == 0 { + return fmt.Errorf("no free port available") + } + + fmt.Printf("Free port: %d\n", freePort) + return nil +} diff --git a/cmd/hoster_cli/hoster.go b/cmd/hoster_cli/hoster.go index 879a2a6..2e534ce 100644 --- a/cmd/hoster_cli/hoster.go +++ b/cmd/hoster_cli/hoster.go @@ -16,7 +16,7 @@ func Execute() { app := &cli.App{ Name: "hoster", Usage: "Hoster", - Version: "1.1.0", + Version: "1.2.0", Commands: []*cli.Command{ { Name: "new", @@ -56,6 +56,20 @@ func Execute() { }, }, }, + { + Name: "port", + Subcommands: []*cli.Command{ + { + Name: "free", + Usage: "Get the next free port in the configured range", + Before: func(c *cli.Context) error { + conf.LoadConfig(filepath.Join(findHomeDir(), ".hoster.yml")) + return nil + }, + Action: commands.CmdCheckPort, + }, + }, + }, { Name: "check", Usage: "Check if newer versions of docker images are available",