l4d.tools/lib/l4d_server/launcher.rb
2026-01-18 19:24:39 +01:00

85 lines
2.3 KiB
Ruby

module L4dServer
class Launcher
def self.spawn(server)
new(server).spawn
end
def self.cleanup(server)
new(server).cleanup
end
def initialize(server)
@server = server
@template = server.server_template
end
def spawn
setup_directories
generate_config
mount_overlayfs
generate_systemd_unit
enable_and_start_service
rescue StandardError => e
Rails.logger.error("Failed to spawn server: #{e.message}")
Rails.logger.error(e.backtrace.join("\n"))
@server.update(status: :failed)
raise
end
def cleanup
unmount_overlayfs
cleanup_directories
end
private
def setup_directories
server_dir = L4dServer::Config.server_path(@server.id)
FileUtils.mkdir_p("#{server_dir}/upper")
FileUtils.mkdir_p("#{server_dir}/work")
FileUtils.mkdir_p("#{server_dir}/merged")
end
def generate_config
ConfigGenerator.generate(@server)
end
def mount_overlayfs
server_dir = L4dServer::Config.server_path(@server.id)
overlays = @template.template_overlays.ordered.map { |to| L4dServer::Config.overlay_path(to.overlay.slug) }.join(":")
lower_dirs = "#{overlays}:#{L4dServer::Config.installation_path}"
mount_cmd = "fuse-overlayfs -o lowerdir=#{lower_dirs},upperdir=#{server_dir}/upper,workdir=#{server_dir}/work #{server_dir}/merged"
success = system(mount_cmd)
raise "Failed to mount overlayfs" unless success
end
def generate_systemd_unit
SystemdManager.new(@server).create_unit_file
end
def enable_and_start_service
SystemdManager.new(@server).enable_and_start
@server.update(status: :starting)
end
def unmount_overlayfs
server_dir = L4dServer::Config.server_path(@server.id)
merged = "#{server_dir}/merged"
if Dir.exist?(merged)
system("mountpoint -q #{merged} && umount #{merged}")
end
rescue StandardError => e
Rails.logger.warn("Failed to unmount overlayfs: #{e.message}")
end
def cleanup_directories
server_dir = L4dServer::Config.server_path(@server.id)
FileUtils.rm_rf(server_dir) if Dir.exist?(server_dir)
rescue StandardError => e
Rails.logger.warn("Failed to cleanup directories: #{e.message}")
end
end
end