diff options
| -rw-r--r-- | lib/leap_cli/commands/compile.rb | 93 | ||||
| -rw-r--r-- | lib/leap_cli/commands/test.rb | 3 | ||||
| -rw-r--r-- | lib/leap_cli/config/manager.rb | 11 | 
3 files changed, 102 insertions, 5 deletions
| diff --git a/lib/leap_cli/commands/compile.rb b/lib/leap_cli/commands/compile.rb index 3cdd5dd..0fc95ca 100644 --- a/lib/leap_cli/commands/compile.rb +++ b/lib/leap_cli/commands/compile.rb @@ -2,13 +2,27 @@  module LeapCli    module Commands -    desc 'Compiles node configuration files into hiera files used for deployment.' +    desc "Compile generated files."      command :compile do |c| -      c.action do |global_options,options,args| -        compile_hiera_files +      c.desc 'Compiles node configuration files into hiera files used for deployment.' +      c.command :all do |all| +        all.action do |global_options,options,args| +          compile_hiera_files +        end        end + +      c.desc "Compile a DNS zone file for your provider." +      c.command :zone do |zone| +        zone.action do |global_options, options, args| +          compile_zone_file +        end +      end + +      c.default_command :all      end +    protected +      def compile_hiera_files(nodes=nil)        # these must come first        update_compiled_ssh_configs @@ -23,5 +37,78 @@ module LeapCli        update_known_hosts      end +    ## +    ## ZONE FILE +    ## + +    def relative_hostname(fqdn) +      @domain_regexp ||= /\.?#{Regexp.escape(provider.domain)}$/ +      fqdn.sub(@domain_regexp, '') +    end + +    # +    # serial is any number less than 2^32 (4294967296) +    # +    def compile_zone_file +      f = $stdout + +      f.puts ZONE_HEADER % [provider.domain, provider.domain, provider.domain] + +      max_width = manager.nodes.values.inject(0) {|max, node| [max, relative_hostname(node.domain.full).length].max } +      put_line = lambda {|host, line| f.puts("%-#{max_width}s %s" % [host, line])} + +      if provider['dns'] && provider.dns['nameservers'] +        provider.dns.nameservers.each do |ns| +          put_line.call "", "IN NS #{ns}." +        end +      end + +      manager.environments.each do |env| +        next if env == 'local' +        nodes = manager.nodes[:environment => env] +        next unless nodes.any? +        f.puts ENV_HEADER % (env.nil? ? 'default' : env) +        nodes.each_node do |node| +          if node.dns.public +            hostname = relative_hostname(node.domain.full) +            put_line.call relative_hostname(node.domain.full), "IN A      #{node.ip_address}" +          end +          if node['dns']['aliases'] +            node['dns']['aliases'].each do |host_alias| +              if host_alias != node.domain.full +                put_line.call relative_hostname(host_alias), "IN CNAME  #{relative_hostname(node.domain.full)}" +              end +            end +          end +          if node.services.include? 'mx' +            put_line.call relative_hostname(node.domain.full_suffix), "IN MX 10  #{relative_hostname(node.domain.full)}" +          end +        end +      end +    end + +    ENV_HEADER = %[ +;; +;; ENVIRONMENT %s +;; + +] + +    ZONE_HEADER = %[ +;; +;; BIND data file for %s +;; + +$TTL 600 + +@ IN SOA %s. %s. ( +  0000          ; serial +  7200          ; refresh (  24 hours) +  3600          ; retry   (   2 hours) +  1209600       ; expire  (1000 hours) +  600 )         ; minimum (   2 days) +; +] +    end  end
\ No newline at end of file diff --git a/lib/leap_cli/commands/test.rb b/lib/leap_cli/commands/test.rb index 8fe6e11..c240a70 100644 --- a/lib/leap_cli/commands/test.rb +++ b/lib/leap_cli/commands/test.rb @@ -28,8 +28,7 @@ module LeapCli; module Commands      assert_config! 'provider.ca.client_certificates.unlimited_prefix'      assert_config! 'provider.ca.client_certificates.limited_prefix'      template = read_file! Path.find_file(:test_client_openvpn_template) -    environments = [nil] + manager.tags.collect {|name, tag| tag['environment']}.compact -    environments.each do |env| +    manager.environments.each do |env|        vpn_nodes = manager.nodes[:environment => env][:services => 'openvpn']['openvpn.allow_limited' => true]        if vpn_nodes.any?          generate_test_client_cert(provider.ca.client_certificates.limited_prefix) do |key, cert| diff --git a/lib/leap_cli/config/manager.rb b/lib/leap_cli/config/manager.rb index 05df22f..f34566c 100644 --- a/lib/leap_cli/config/manager.rb +++ b/lib/leap_cli/config/manager.rb @@ -19,10 +19,21 @@ module LeapCli        attr_reader :services, :tags, :nodes, :provider, :common, :secrets        attr_reader :base_services, :base_tags, :base_provider, :base_common +      # +      # returns the Hash of the contents of facts.json +      #        def facts          @facts ||= JSON.parse(Util.read_file(:facts) || "{}")        end +      # +      # returns an Array of all the environments defined for this provider. +      # the returned array includes nil (for the default environment) +      # +      def environments +        @environments ||= [nil] + self.tags.collect {|name, tag| tag['environment']}.compact +      end +        ##        ## IMPORT EXPORT        ## | 
