service/src/get-port.cr

42 lines
819 B
Crystal

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