diff options
| -rw-r--r-- | lib/leap_cli/commands/node.rb | 27 | ||||
| -rw-r--r-- | lib/leap_cli/config/environment.rb | 30 | ||||
| -rw-r--r-- | lib/leap_cli/config/node.rb | 4 | 
3 files changed, 55 insertions, 6 deletions
| diff --git a/lib/leap_cli/commands/node.rb b/lib/leap_cli/commands/node.rb index 60540de9..9cde15bc 100644 --- a/lib/leap_cli/commands/node.rb +++ b/lib/leap_cli/commands/node.rb @@ -45,6 +45,23 @@ module LeapCli; module Commands          do_node_rm(global_options, options, args)        end      end + +    node.desc 'Mark a node as disabled.' +    node.arg_name 'NAME' +    node.command :disable do |cmd| +      cmd.action do |global_options,options,args| +        do_node_disable(global_options, options, args) +      end +    end + +    node.desc 'Mark a node as enabled.' +    node.arg_name 'NAME' +    node.command :enable do |cmd| +      cmd.action do |global_options,options,args| +        do_node_enable(global_options, options, args) +      end +    end +    end    ## @@ -126,4 +143,14 @@ module LeapCli; module Commands      remove_node_facts(node.name)    end +  def do_node_enable(global, options, args) +    node = get_node_from_args(args, include_disabled: true) +    node.update_json({}, remove: ["enabled"]) +  end + +  def do_node_disable(global, options, args) +    node = get_node_from_args(args, include_disabled: true) +    node.update_json("enabled" => false) +  end +  end; end diff --git a/lib/leap_cli/config/environment.rb b/lib/leap_cli/config/environment.rb index ce570839..0410ef5b 100644 --- a/lib/leap_cli/config/environment.rb +++ b/lib/leap_cli/config/environment.rb @@ -122,14 +122,25 @@ module LeapCli; module Config      end      # -    # Alters the node's json config file. Unfortunately, doing this will -    # strip out all the comments. +    # Alters the node's json config file. As a side effect, all comments get +    # moved to the top of the file.      # -    def update_node_json(node, new_values) +    # NOTE: This does a shallow merge! In other words, a call like this... +    # +    #     update_node_json(node, {"webapp" => {"domain" => "example.org"}) +    # +    # ...is probably not what you want, because it will entirely remove all +    # existing entries under "webapp". +    # +    def update_node_json(node, new_values, options=nil)        node_json_path = Path.named_path([:node_config, node.name]) +      comments       = read_comments(node_json_path)        old_data       = load_json(node_json_path, Config::Node) +      options && options[:remove] && options[:remove].each do |key| +        old_data.delete(key) +      end        new_data       = old_data.merge(new_values) -      new_contents   = JSON.sorted_generate(new_data) + "\n" +      new_contents   = [comments, JSON.sorted_generate(new_data), "\n"].join        Util::write_file! node_json_path, new_contents      end @@ -152,6 +163,17 @@ module LeapCli; module Config        results      end +    def read_comments(filename) +      buffer = StringIO.new +      File.open(filename, "rb", :encoding => 'UTF-8') do |f| +        while (line = f.gets) +          next unless line =~ /^\s*\/\// +          buffer << line +        end +      end +      return buffer.string.force_encoding('utf-8') +    end +      def load_json(filename, object_class, options={})        if !File.exist?(filename)          return object_class.new(self) diff --git a/lib/leap_cli/config/node.rb b/lib/leap_cli/config/node.rb index 23abdee3..a7c5c1e4 100644 --- a/lib/leap_cli/config/node.rb +++ b/lib/leap_cli/config/node.rb @@ -169,8 +169,8 @@ module LeapCli; module Config      #      # modifies the config file nodes/NAME.json for this node.      # -    def update_json(new_values) -      self.env.update_node_json(node, new_values) +    def update_json(new_values, options=nil) +      self.env.update_node_json(node, new_values, options)      end      # | 
