diff options
| author | elijah <elijah@riseup.net> | 2012-10-09 00:05:44 -0700 | 
|---|---|---|
| committer | elijah <elijah@riseup.net> | 2012-10-09 00:05:44 -0700 | 
| commit | 73b126976ad7843eb47a84944cf191bf05b14216 (patch) | |
| tree | 918656f8d7c637e8c7a8f0c010eff55bfd98ae1b /cli/lib | |
| parent | 578ac2f5dc7432317d7a022bed9d869ab89ee45c (diff) | |
fixed paths
Diffstat (limited to 'cli/lib')
| -rw-r--r-- | cli/lib/leap_cli.rb | 19 | ||||
| -rw-r--r-- | cli/lib/leap_cli/commands/README | 101 | ||||
| -rw-r--r-- | cli/lib/leap_cli/commands/compile.rb | 15 | ||||
| -rw-r--r-- | cli/lib/leap_cli/commands/deploy.rb | 20 | ||||
| -rw-r--r-- | cli/lib/leap_cli/commands/init.rb | 24 | ||||
| -rw-r--r-- | cli/lib/leap_cli/commands/list.rb | 61 | ||||
| -rw-r--r-- | cli/lib/leap_cli/commands/pre.rb | 38 | ||||
| -rw-r--r-- | cli/lib/leap_cli/config.rb | 119 | ||||
| -rw-r--r-- | cli/lib/leap_cli/config_list.rb | 77 | ||||
| -rw-r--r-- | cli/lib/leap_cli/config_manager.rb | 200 | ||||
| -rw-r--r-- | cli/lib/leap_cli/init.rb | 74 | ||||
| -rw-r--r-- | cli/lib/leap_cli/log.rb | 44 | ||||
| -rw-r--r-- | cli/lib/leap_cli/path.rb | 79 | ||||
| -rw-r--r-- | cli/lib/leap_cli/version.rb | 3 | 
14 files changed, 0 insertions, 874 deletions
| diff --git a/cli/lib/leap_cli.rb b/cli/lib/leap_cli.rb deleted file mode 100644 index b935e35..0000000 --- a/cli/lib/leap_cli.rb +++ /dev/null @@ -1,19 +0,0 @@ -module LeapCli; end - -unless defined?(LeapCli::VERSION) -  # ^^ I am not sure why this is needed. -  require 'leap_cli/version.rb' -end - -require 'leap_cli/init' -require 'leap_cli/path' -require 'leap_cli/log' -require 'leap_cli/config' -require 'leap_cli/config_list' -require 'leap_cli/config_manager' - -unless String.method_defined?(:to_a) -  class String -    def to_a; [self]; end -  end -end
\ No newline at end of file diff --git a/cli/lib/leap_cli/commands/README b/cli/lib/leap_cli/commands/README deleted file mode 100644 index 00fcd84..0000000 --- a/cli/lib/leap_cli/commands/README +++ /dev/null @@ -1,101 +0,0 @@ -This directory contains ruby source files that define the available sub-commands of the `leap` executable. - -For example, the command: - -  leap init <directory> - -Lives in lib/leap_cli/commands/init.rb - -These files use a DSL (called GLI) for defining command suites. -See https://github.com/davetron5000/gli for more information. - - -      c.command -      c.commands -      c.default_command -      c.default_value -      c.get_default_command -      c.commands -      c.commands_declaration_order - -      c.flag -      c.flags -      c.switch -      c.switches - -      c.long_desc - -      c.default_desc -      c.default_description -      c.desc -      c.description -      c.long_description -      c.context_description -      c.usage - -      c.arg_name -      c.arguments_description -      c.arguments_options - -      c.skips_post -      c.skips_pre -      c.skips_around - -      c.action - -      c.copy_options_to_aliases -      c.nodoc -      c.aliases -      c.execute -      c.names - - -#desc 'Describe some switch here' -#switch [:s,:switch] - -#desc 'Describe some flag here' -#default_value 'the default' -#arg_name 'The name of the argument' -#flag [:f,:flagname] - -# desc 'Describe deploy here' -# arg_name 'Describe arguments to deploy here' -# command :deploy do |c| -#   c.action do |global_options,options,args| -#     puts "deploy command ran" -#   end -# end - -# desc 'Describe dryrun here' -# arg_name 'Describe arguments to dryrun here' -# command :dryrun do |c| -#   c.action do |global_options,options,args| -#     puts "dryrun command ran" -#   end -# end - -# desc 'Describe add-node here' -# arg_name 'Describe arguments to add-node here' -# command :"add-node" do |c| -#   c.desc 'Describe a switch to init' -#   c.switch :s -# -#   c.desc 'Describe a flag to init' -#   c.default_value 'default' -#   c.flag :f -#   c.action do |global_options,options,args| -#     puts "add-node command ran" -#   end -# end - -# post do |global,command,options,args| -#   # Post logic here -#   # Use skips_post before a command to skip this -#   # block on that command only -# end - -# on_error do |exception| -#   # Error logic here -#   # return false to skip default error handling -#   true -# end diff --git a/cli/lib/leap_cli/commands/compile.rb b/cli/lib/leap_cli/commands/compile.rb deleted file mode 100644 index 6b38de5..0000000 --- a/cli/lib/leap_cli/commands/compile.rb +++ /dev/null @@ -1,15 +0,0 @@ -module LeapCli -  module Commands - -    desc 'Compile json files to hiera configs' -    command :compile do |c| -      c.action do |global_options,options,args| -        manager = ConfigManager.new -        manager.load(Path.provider) -        Path.ensure_dir(Path.hiera) -        manager.export(Path.hiera) -      end -    end - -  end -end
\ No newline at end of file diff --git a/cli/lib/leap_cli/commands/deploy.rb b/cli/lib/leap_cli/commands/deploy.rb deleted file mode 100644 index 3694a38..0000000 --- a/cli/lib/leap_cli/commands/deploy.rb +++ /dev/null @@ -1,20 +0,0 @@ -module LeapCli -  module Commands - -    desc 'Apply recipes to a node or set of nodes' -    long_desc 'The node filter can be the name of a node, service, or tag.' -    arg_name '<node filter>' -    command :deploy do |c| -      c.action do |global_options,options,args| -        nodes = ConfigManager.filter(args) -        say "Deploying to these nodes: #{nodes.keys.join(', ')}" -        if agree "Continue? " -          say "deploy not yet implemented" -        else -          say "OK. Bye." -        end -      end -    end - -  end -end
\ No newline at end of file diff --git a/cli/lib/leap_cli/commands/init.rb b/cli/lib/leap_cli/commands/init.rb deleted file mode 100644 index 75cc876..0000000 --- a/cli/lib/leap_cli/commands/init.rb +++ /dev/null @@ -1,24 +0,0 @@ -module LeapCli -  module Commands -    desc 'Creates a new provider configuration directory.' -    arg_name '<directory>' -    skips_pre -    command :init do |c| -      c.action do |global_options,options,args| -        directory = args.first -        unless directory && directory.any? -          help_now! "Directory name is required." -        end -        directory = File.expand_path(directory) -        if File.exists?(directory) -          raise "#{directory} already exists." -        end -        if agree("Create directory '#{directory}'? ") -          LeapCli.init(directory) -        else -          puts "OK, bye." -        end -      end -    end -  end -end
\ No newline at end of file diff --git a/cli/lib/leap_cli/commands/list.rb b/cli/lib/leap_cli/commands/list.rb deleted file mode 100644 index a186049..0000000 --- a/cli/lib/leap_cli/commands/list.rb +++ /dev/null @@ -1,61 +0,0 @@ -module LeapCli -  module Commands - -    def self.print_config_table(type, config_list) -      style = {:border_x => '-', :border_y => ':', :border_i => '-', :width => 60} - -      if type == :services -        t = table do -          self.style = style -          self.headings = ['SERVICE', 'NODES'] -          list = config_list.keys.sort -          list.each do |name| -            add_row [name, config_list[name].nodes.keys.join(', ')] -            add_separator unless name == list.last -          end -        end -        puts t -        puts "\n\n" -      elsif type == :tags -        t = table do -          self.style = style -          self.headings = ['TAG', 'NODES'] -          list = config_list.keys.sort -          list.each do |name| -            add_row [name, config_list[name].nodes.keys.join(', ')] -            add_separator unless name == list.last -          end -        end -        puts t -        puts "\n\n" -      elsif type == :nodes -        t = table do -          self.style = style -          self.headings = ['NODE', 'SERVICES', 'TAGS'] -          list = config_list.keys.sort -          list.each do |name| -            add_row [name, config_list[name].services.to_a.join(', '), config_list[name].tags.to_a.join(', ')] -            add_separator unless name == list.last -          end -        end -        puts t -      end -    end - -    desc 'List nodes and their classifications' -    long_desc 'Prints out a listing of nodes, services, or tags.' -    arg_name 'filter' -    command :list do |c| -      c.action do |global_options,options,args| -        if args.any? -          print_config_table(:nodes, ConfigManager.filter(args)) -        else -          print_config_table(:services, ConfigManager.services) -          print_config_table(:tags,     ConfigManager.tags) -          print_config_table(:nodes,  ConfigManager.nodes) -        end -      end -    end - -  end -end diff --git a/cli/lib/leap_cli/commands/pre.rb b/cli/lib/leap_cli/commands/pre.rb deleted file mode 100644 index ae58fc8..0000000 --- a/cli/lib/leap_cli/commands/pre.rb +++ /dev/null @@ -1,38 +0,0 @@ - -# -# check to make sure we can find the root directory of the platform -# -module LeapCli -  module Commands - -    desc 'Verbosity level 0..2' -    arg_name 'level' -    default_value '0' -    flag [:v, :verbose] - -    desc 'Specify the root directory' -    arg_name 'path' -    default_value Path.root -    flag [:root] - -    pre do |global,command,options,args| -      # -      # set verbosity -      # -      LeapCli.log_level = global[:verbose].to_i - -      # -      # require a root directory -      # -      if global[:root] -        Path.set_root(global[:root]) -      end -      if Path.ok? -        true -      else -        exit_now!("Could not find the root directory. Change current working directory or try --root") -      end -    end - -  end -end diff --git a/cli/lib/leap_cli/config.rb b/cli/lib/leap_cli/config.rb deleted file mode 100644 index 44e66be..0000000 --- a/cli/lib/leap_cli/config.rb +++ /dev/null @@ -1,119 +0,0 @@ -module LeapCli -  # -  # This class represents the configuration for a single node, service, or tag. -  # -  class Config < Hash - -    def initialize(config_type, manager) -      @manager = manager -      @type = config_type -    end - -    # -    # lazily eval dynamic values when we encounter them. -    # -    def [](key) -      value = fetch(key, nil) -      if value.is_a? Array -        value -      elsif value.nil? -        nil -      else -        if value =~ /^= (.*)$/ -          value = eval($1) -          self[key] = value -        end -        value -      end -    end - -    # -    # make the type appear to be a normal Hash in yaml. -    # -    def to_yaml_type -     "!map" -    end - -    # -    # just like Hash#to_yaml, but sorted -    # -    def to_yaml(opts = {}) -      YAML::quick_emit(self, opts) do |out| -        out.map(taguri, to_yaml_style) do |map| -          keys.sort.each do |k| -            v = self.fetch(k) -            map.add(k, v) -          end -        end -      end -    end - -    # -    # make obj['name'] available as obj.name -    # -    def method_missing(method, *args, &block) -      if has_key?(method.to_s) -        self[method.to_s] -      else -        super -      end -    end - -    # -    # convert self into a plain hash, but only include the specified keys -    # -    def to_h(*keys) -      keys.map(&:to_s).inject({}) do |hsh, key| -        if has_key?(key) -          hsh[key] = self[key] -        end -        hsh -      end -    end - -    def nodes -      if @type == :node -        @manager.nodes -      else -        @nodes ||= ConfigList.new -      end -    end - -    def services -      if @type == :node -        self['services'] || [] -      else -        @manager.services -      end -    end - -    def tags -      if @type == :node -        self['tags'] || [] -      else -        @manager.tags -      end -    end - -    private - -    ## -    ## MACROS -    ## these are methods used when eval'ing a value in the .json configuration -    ## - -    # -    # inserts the contents of a file -    # -    def file(filename) -      filepath = Path.find_file(name, filename) -      if filepath -        File.read(filepath) -      else -        log0('no such file, "%s"' % filename) -        "" -      end -    end - -  end # class -end # module
\ No newline at end of file diff --git a/cli/lib/leap_cli/config_list.rb b/cli/lib/leap_cli/config_list.rb deleted file mode 100644 index c8ff23b..0000000 --- a/cli/lib/leap_cli/config_list.rb +++ /dev/null @@ -1,77 +0,0 @@ -module LeapCli -  class ConfigList < Hash - -    def initialize(config=nil) -      if config -        self << config -      end -    end - -    # -    # if the key is a hash, we treat it as a condition and filter all the configs using the condition -    # -    # for example: -    # -    #   nodes[:public_dns => true] -    # -    # will return a ConfigList with node configs that have public_dns set to true -    # -    def [](key) -      if key.is_a? Hash -        results = ConfigList.new -        field, match_value = key.to_a.first -        field = field.is_a?(Symbol) ? field.to_s : field -        match_value = match_value.is_a?(Symbol) ? match_value.to_s : match_value -        each do |name, config| -          value = config[field] -          if !value.nil? -            if value.is_a? Array -              if value.includes?(match_value) -                results[name] = config -              end -            else -              if value == match_value -                results[name] = config -              end -            end -          end -        end -        results -      else -        super -      end -    end - -    def <<(config) -      if config.is_a? ConfigList -        self.merge!(config) -      else -        self[config['name']] = config -      end -    end - -    # -    # converts the hash of configs into an array of hashes, with ONLY the specified fields -    # -    def fields(*fields) -      result = [] -      keys.sort.each do |name| -        result << self[name].to_h(*fields) -      end -      result -    end - -    # -    # like fields(), but returns an array of values instead of an array of hashes. -    # -    def field(field) -      field = field.to_s -      result = [] -      keys.sort.each do |name| -        result << self[name][field] -      end -      result -    end - -  end -end diff --git a/cli/lib/leap_cli/config_manager.rb b/cli/lib/leap_cli/config_manager.rb deleted file mode 100644 index d383cc1..0000000 --- a/cli/lib/leap_cli/config_manager.rb +++ /dev/null @@ -1,200 +0,0 @@ -require 'oj' -require 'yaml' - -module LeapCli - -  class ConfigManager - -    attr_reader :services, :tags, :nodes - -    ## -    ## IMPORT EXPORT -    ## - -    # -    # load .json configuration files -    # -    def load(dir) -      @services = load_all_json("#{dir}/services/*.json") -      @tags     = load_all_json("#{dir}/tags/*.json") -      @common   = load_all_json("#{dir}/common.json")['common'] -      @nodes    = load_all_json("#{dir}/nodes/*.json", :node) -      @nodes.each do |name, node| -        apply_inheritance(node) -      end -      @nodes.each do |name, node| -        node.each {|key,value| node[key] } # force evaluation of dynamic values -      end -    end - -    # -    # save compiled hiera .yaml files -    # -    def export(dir) -      Dir.glob(dir + '/*.yaml').each do |f| -        File.unlink(f) -      end -      @nodes.each do |name, node| -        File.open("#{dir}/#{name}.#{node.domain_internal}.yaml", 'w') do |f| -          f.write node.to_yaml -        end -      end -    end - -    ## -    ## FILTERING -    ## - -    # -    # returns a node list consisting only of nodes that satisfy the filter criteria. -    # -    # filter: condition [condition] [condition] [+condition] -    # condition: [node_name | service_name | tag_name] -    # -    # if conditions is prefixed with +, then it works like an AND. Otherwise, it works like an OR. -    # -    def filter(filters) -      if filters.empty? -        return nodes -      end -      if filters[0] =~ /^\+/ -        # don't let the first filter have a + prefix -        filters[0] = filters[0][1..-1] -      end - -      node_list = ConfigList.new -      filters.each do |filter| -        if filter =~ /^\+/ -          keep_list = nodes_for_filter(filter[1..-1]) -          node_list.delete_if do |name, node| -            if keep_list[name] -              false -            else -              true -            end -          end -        else -          node_list << nodes_for_filter(filter) -        end -      end -      return node_list -    end - -    ## -    ## CLASS METHODS -    ## - -    def self.manager -      @manager ||= begin -        manager = ConfigManager.new -        manager.load(Path.provider) -        manager -      end -    end - -    def self.filter(filters); manager.filter(filters); end -    def self.nodes; manager.nodes; end -    def self.services; manager.services; end -    def self.tags; manager.tags; end - -    private - -    def load_all_json(pattern, config_type = :class) -      results = ConfigList.new -      Dir.glob(pattern).each do |filename| -        obj = load_json(filename, config_type) -        if obj -          name = File.basename(filename).sub(/\.json$/,'') -          obj['name'] = name -          results[name] = obj -        end -      end -      results -    end - -    def load_json(filename, config_type) -      log2 { filename.sub(/^#{Regexp.escape(Path.root)}/,'') } - -      # -      # read file, strip out comments -      # (File.read(filename) would be faster, but we like ability to have comments) -      # -      buffer = StringIO.new -      File.open(filename) do |f| -        while (line = f.gets) -          next if line =~ /^\s*#/ -          buffer << line -        end -      end - -      # parse json, and flatten hash -      begin -        hash = Oj.load(buffer.string) || {} -      rescue SyntaxError => exc -        log0 'Error in file "%s":' % filename -        log0 exc.to_s -        return nil -      end -      return flatten_hash(hash, Config.new(config_type, self)) -    end - -    # -    # remove all the nesting from a hash. -    # -    def flatten_hash(input = {}, output = {}, options = {}) -      input.each do |key, value| -        key = options[:prefix].nil? ? "#{key}" : "#{options[:prefix]}#{options[:delimiter]||"_"}#{key}" -        if value.is_a? Hash -          flatten_hash(value, output, :prefix => key, :delimiter => options[:delimiter]) -        else -          output[key]  = value -        end -      end -      output -    end - -    # -    # makes this node inherit options from the common, service, and tag json files. -    # -    def apply_inheritance(node) -      new_node = Config.new(:node, self) -      new_node.merge!(@common) -      if node['services'] -        node['services'].sort.each do |node_service| -          service = @services[node_service] -          if service.nil? -            log0('Error in node "%s": the service "%s" does not exist.' % [node['name'], node_service]) -          else -            new_node.merge!(service) -            service.nodes << node # this is odd, but we want the node pointer, not new_node pointer. -          end -        end -      end -      if node['tags'] -        node['tags'].sort.each do |node_tag| -          tag = @tags[node_tag] -          if tag.nil? -            log0('Error in node "%s": the tag "%s" does not exist.' % [node['name'], node_tag]) -          else -            new_node.merge!(tag) -            tag.nodes << node -          end -        end -      end -      new_node.merge!(node) -      node.replace(new_node) -    end - -    def nodes_for_filter(filter) -      if node = self.nodes[filter] -        ConfigList.new(node) -      elsif service = self.services[filter] -        service.nodes -      elsif tag = self.tags[filter] -        tag.nodes -      end -    end - -  end - -end diff --git a/cli/lib/leap_cli/init.rb b/cli/lib/leap_cli/init.rb deleted file mode 100644 index bebede7..0000000 --- a/cli/lib/leap_cli/init.rb +++ /dev/null @@ -1,74 +0,0 @@ -require 'fileutils' - -module LeapCli -  # -  # creates new provider directory -  # -  def self.init(directory) -    dirs = [directory] -    mkdirs(dirs, false, false) - -    Dir.chdir(directory) do -      dirs = ["nodes", "services", "keys", "tags"] -      mkdirs(dirs, false, false) - -      #puts "Creating .provider" -      #FileUtils.touch('.provider') - -      mkfile("provider.json", PROVIDER_CONTENT) -      mkfile("common.json", COMMON_CONTENT) -    end -  end - -  def self.mkfile(filename, content) -    puts "Creating #{filename}" -    File.open(filename, 'w') do |f| -      f.write content -    end -  end - -  def self.mkdirs(dirs,force,dry_run) -    exists = false -    if !force -      dirs.each do |dir| -        if File.exist? dir -          raise "#{dir} exists; use --force to override" -          exists = true -        end -      end -    end -    if !exists -      dirs.each do |dir| -        puts "Creating #{dir}/" -        if dry_run -          puts "dry-run; #{dir} not created" -        else -          FileUtils.mkdir_p dir -        end -      end -    else -      puts "Exiting..." -      return false -    end -    true -  end - -  PROVIDER_CONTENT = <<EOS -# -# Global provider definition file. -# -{ -  "domain": "example.org" -} -EOS - -  COMMON_CONTENT = <<EOS -# -# Options put here are inherited by all nodes. -# -{ -  "domain": "example.org" -} -EOS - -end diff --git a/cli/lib/leap_cli/log.rb b/cli/lib/leap_cli/log.rb deleted file mode 100644 index f51ca1e..0000000 --- a/cli/lib/leap_cli/log.rb +++ /dev/null @@ -1,44 +0,0 @@ -module LeapCli - -  def self.log_level -    @log_level -  end - -  def self.log_level=(value) -    @log_level = value -  end - -end - -def log0(message=nil, &block) -  if message -    puts message -  elsif block -    puts yield(block) -  end -end - -def log1(message=nil, &block) -  if LeapCli.log_level > 0 -    if message -      puts message -    elsif block -      puts yield(block) -    end -  end -end - -def log2(message=nil, &block) -  if LeapCli.log_level > 1 -    if message -      puts message -    elsif block -      puts yield(block) -    end -  end -end - -def help!(message=nil) -  ENV['GLI_DEBUG'] = "false" -  help_now!(message) -end diff --git a/cli/lib/leap_cli/path.rb b/cli/lib/leap_cli/path.rb deleted file mode 100644 index 5dc8fe8..0000000 --- a/cli/lib/leap_cli/path.rb +++ /dev/null @@ -1,79 +0,0 @@ -require 'fileutils' - -module LeapCli -  module Path - -    def self.root -      @root ||= File.expand_path("#{provider}/..") -    end - -    def self.platform -      @platform ||= File.expand_path("#{root}/leap_platform") -    end - -    def self.provider -      @provider ||= if @root -        File.expand_path("#{root}/provider") -      else -        find_in_directory_tree('provider.json') -      end -    end - -    def self.hiera -      @hiera ||= "#{provider}/hiera" -    end - -    def self.files -      @files ||= "#{provider}/files" -    end - -    def self.ok? -      provider != '/' -    end - -    def self.set_root(root_path) -      @root = File.expand_path(root_path) -      raise "No such directory '#{@root}'" unless File.directory?(@root) -    end - -    def self.ensure_dir(dir) -      unless File.directory?(dir) -        if File.exists?(dir) -          raise 'Unable to create directory "%s", file already exists.' % dir -        else -          FileUtils.mkdir_p(dir) -        end -      end -    end - -    def self.find_file(name, filename) -      path = [Path.files, filename].join('/') -      return path if File.exists?(path) -      path = [Path.files, name, filename].join('/') -      return path if File.exists?(path) -      path = [Path.files, 'nodes', name, filename].join('/') -      return path if File.exists?(path) -      path = [Path.files, 'services', name, filename].join('/') -      return path if File.exists?(path) -      path = [Path.files, 'tags', name, filename].join('/') -      return path if File.exists?(path) - -      # give up -      return nil -    end - -    private - -    def self.find_in_directory_tree(filename) -      search_dir = Dir.pwd -      while search_dir != "/" -        Dir.foreach(search_dir) do |f| -          return search_dir if f == filename -        end -        search_dir = File.dirname(search_dir) -      end -      return search_dir -    end - -  end -end diff --git a/cli/lib/leap_cli/version.rb b/cli/lib/leap_cli/version.rb deleted file mode 100644 index c272647..0000000 --- a/cli/lib/leap_cli/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -module LeapCli -  VERSION = '0.0.1' -end | 
