require "file_utils" require "./config.cr" START_PORT = 49152 PORTS_CACHE_DIRECTORY = "#{CACHE_DIRECTORY}/ports/" service = ARGV[0] wanted_default_port = ARGV[1]?.try &.to_i service_port_file = "#{PORTS_CACHE_DIRECTORY}/#{service.gsub /\//, ":"}" begin if File.exists? service_port_file puts File.read service_port_file exit 0 end FileUtils.mkdir_p PORTS_CACHE_DIRECTORY used_ports = Dir.children(PORTS_CACHE_DIRECTORY) .map { |x| "#{PORTS_CACHE_DIRECTORY}/#{x}" } .map { |x| File.read(x).to_i } .sort port = START_PORT if wanted_default_port && ! used_ports.any? &.==(wanted_default_port) port = wanted_default_port else while used_ports.any? &.==(port) port = port + 1 end end File.write service_port_file, port puts port rescue e STDERR.puts "error: #{e.message}" exit 1 end