summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2016-12-21 11:06:48 -0800
committerelijah <elijah@riseup.net>2016-12-21 11:06:48 -0800
commitc0f489c4226c924fa1d96d12cba7eb5f63ccaf64 (patch)
tree0c56b92b262f3f7718cfc628644f2756f4caf1c9
parent4116559c43b36cf69dc128769cbae857c53f094f (diff)
add command `leap node disable` and `leap node enable`
-rw-r--r--lib/leap_cli/commands/node.rb27
-rw-r--r--lib/leap_cli/config/environment.rb30
-rw-r--r--lib/leap_cli/config/node.rb4
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
#