require "specparser" class Environment enum Type Prefix RootFileSystem end getter name : String getter type : Type = Type::Prefix getter files = Array(ServiceDefinition::FileDefinition).new # The place we’ll put services’ data and configuration. @root : String? def initialize() initialize "root" end def initialize(@name, type = "prefix") @type = Type.parse type @files = Array(ServiceDefinition::FileDefinition).new # FIXME: Should this *really* be here? # FIXME: $ENVIRONMENT_ROOT @files << ServiceDefinition::FileDefinition.new "/srv/${ENVIRONMENT}", "environment root", creation_command: "mkdir -p /srv/${ENVIRONMENT} && chmod a+rwt /srv/${ENVIRONMENT}", deletion_command: "rmdir /srv/${ENVIRONMENT}" end def initialize(@name, specs : SpecParser) assignments = specs.assignments assignments["type"].try &.as_s.tap do |type| @type = Type.parse type end specs.sections.select(&.name.==("check")).each do |check| @files << ServiceDefinition::FileDefinition.new check end end def root @root || "#{SERVED_DATA_DIRECTORY}/#{@name}" end class_getter root = Environment.new class_getter all = [@@root] of Environment def self.load(path) return unless Dir.exists? path Dir.each_child path do |child| unless child.match /\.spec$/ next end file_path = "#{path}/#{child}" begin name = File.basename(child, ".spec") specs = SpecParser.parse File.read(file_path) environment = Environment.new name, specs rescue e STDERR << "error loading #{file_path}: " << e << "\n" # FIXME: Print stacktrace? Debug mode? next end @@all << environment end end def write(dir : String) File.write "#{dir}/#{@name}.spec", to_spec end def remove(dir : String) File.delete "#{dir}/#{@name}.spec" end def to_spec [ "type: #{@type.to_s}" ].join("\n") + "\n" end def self.get(name) _def = @@all.find &.name.==(name) if _def.nil? raise ::Service::Exception.new "Environment '#{name}' does not exist." end _def end def get_provider(token) Service.all.find do |service| service.environment == self && service.provides? token end.try &.id end def to_s "#{name} (#{type.to_s.downcase})" end end