knife-node-attribute 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,58 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ knife-attribute (0.1.0)
5
+ chef (>= 0.10.4)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ chef (11.6.0)
11
+ erubis
12
+ highline (>= 1.6.9)
13
+ json (>= 1.4.4, <= 1.7.7)
14
+ mixlib-authentication (>= 1.3.0)
15
+ mixlib-cli (~> 1.3.0)
16
+ mixlib-config (>= 1.1.2)
17
+ mixlib-log (>= 1.3.0)
18
+ mixlib-shellout
19
+ net-ssh (~> 2.6)
20
+ net-ssh-multi (~> 1.1.0)
21
+ ohai (>= 0.6.0)
22
+ rest-client (>= 1.0.4, < 1.7.0)
23
+ yajl-ruby (~> 1.1)
24
+ erubis (2.7.0)
25
+ highline (1.6.19)
26
+ ipaddress (0.8.0)
27
+ json (1.7.7)
28
+ mime-types (1.25)
29
+ mixlib-authentication (1.3.0)
30
+ mixlib-log
31
+ mixlib-cli (1.3.0)
32
+ mixlib-config (1.1.2)
33
+ mixlib-log (1.6.0)
34
+ mixlib-shellout (1.2.0)
35
+ net-ssh (2.6.8)
36
+ net-ssh-gateway (1.2.0)
37
+ net-ssh (>= 2.6.5)
38
+ net-ssh-multi (1.1)
39
+ net-ssh (>= 2.1.4)
40
+ net-ssh-gateway (>= 0.99.0)
41
+ ohai (6.18.0)
42
+ ipaddress
43
+ mixlib-cli
44
+ mixlib-config
45
+ mixlib-log
46
+ mixlib-shellout
47
+ systemu
48
+ yajl-ruby
49
+ rest-client (1.6.7)
50
+ mime-types (>= 1.16)
51
+ systemu (2.5.2)
52
+ yajl-ruby (1.1.0)
53
+
54
+ PLATFORMS
55
+ ruby
56
+
57
+ DEPENDENCIES
58
+ knife-attribute!
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2013 Daniel Schauenberg
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,35 @@
1
+ # knife-node-attribute
2
+
3
+ ## Overview
4
+ knife plugin to interact with the various attributes on a nodes.
5
+
6
+ ## Usage
7
+ Show all attributes on the node (or a specific one if given):
8
+
9
+ knife node attribute show foo.example.org
10
+ knife node attribute show foo.example.org normal [foo:bar]
11
+ knife node attribute show foo.example.org default [foo:bar]
12
+ knife node attribute show foo.example.org override [foo:bar]
13
+
14
+ Delete a specific attribute on a node:
15
+
16
+ knife node attribute delete foo.example.org normal foo:bar
17
+ knife node attribute delete foo.example.org default foo:bar
18
+ knife node attribute delete foo.example.org override foo:bar
19
+
20
+
21
+ ## Installation
22
+ Just get it from rubygems:
23
+
24
+ gem install knife-node-attribute
25
+
26
+
27
+ ## Contribute
28
+ - fork the project
29
+ - make your awesome changes
30
+ - send a pull request
31
+
32
+ ## Thanks
33
+ [@jonlives](https://github.com/jonlives) for his plugins which I took as
34
+ examples and [@jgoulah](http://github.com/jgoulah) for the
35
+ inspiration.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
@@ -0,0 +1,17 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'knife-node-attribute'
5
+ gem.version = '0.2.0'
6
+ gem.authors = ["Daniel Schauenberg"]
7
+ gem.email = 'd@unwiredcouch.com'
8
+ gem.homepage = 'https://github.com/mrtazz/knife-node-attribute'
9
+ gem.summary = "knife plugin to show or delete node attributes"
10
+ gem.description = "knife plugin to show or delete node attributes"
11
+
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.name = "knife-node-attribute"
14
+ gem.require_paths = ["lib"]
15
+
16
+ gem.add_runtime_dependency 'chef', '>= 0.10.4'
17
+ end
@@ -0,0 +1,164 @@
1
+ require 'chef/knife'
2
+
3
+
4
+ ATTRIBUTE_CLASSES = [:normal, :default, :override]
5
+
6
+ module KnifeNodeAttribute
7
+
8
+ module Helpers
9
+ def get_node(name)
10
+
11
+ puts "Looking for an fqdn of #{name} or name of #{name}"
12
+
13
+ searcher = Chef::Search::Query.new
14
+ result = searcher.search(:node, "fqdn:#{name} OR name:#{name}")
15
+
16
+ knife_search = Chef::Knife::Search.new
17
+ node = result.first.first
18
+ if node.nil?
19
+ ui.error "Could not find a node with the fqdn of #{name} or name of #{name}"
20
+ exit 1
21
+ end
22
+ return node
23
+ end
24
+
25
+
26
+ # helper methods to get attributes from a node
27
+ def get_all_attributes(node)
28
+ {"default" => get_default_attributes(node),
29
+ "normal" => get_normal_attributes(node),
30
+ "override" => get_override_attributes(node)}
31
+ end
32
+
33
+ def get_default_attributes(node)
34
+ node.default_attrs
35
+ end
36
+
37
+ def get_normal_attributes(node)
38
+ node.normal_attrs
39
+ end
40
+
41
+ def get_override_attributes(node)
42
+ node.override_attrs
43
+ end
44
+
45
+ end
46
+
47
+ class NodeAttributeShow < Chef::Knife
48
+ include KnifeNodeAttribute::Helpers
49
+
50
+ banner 'knife node attribute show HOSTNAME [NORMAL|DEFAULT|OVERRIDE] [colon:separated:key]'
51
+
52
+ def parse_args
53
+ unless node_name = name_args[0]
54
+ show_usage
55
+ ui.error "You need to specify a node"
56
+ exit 1
57
+ end
58
+ if name_args[1].nil?
59
+ attribute_class = :all
60
+ else
61
+ attribute_class = name_args[1].downcase.to_sym
62
+ # if we passed a valid attribute class, the next one could be an
63
+ # attribute name. If it's invalid, it might be the attribute name
64
+ if ATTRIBUTE_CLASSES.include? attribute_class
65
+ attribute_name = name_args[2] || ""
66
+ else
67
+ attribute_name = attribute_class
68
+ attribute_class = :all
69
+ end
70
+ end
71
+
72
+ {:nodename => node_name,
73
+ :class => attribute_class,
74
+ :name => attribute_name.split(":")}
75
+ end
76
+
77
+
78
+ def run
79
+ args = parse_args
80
+ method = "get_#{args[:class]}_attributes".to_sym
81
+
82
+ node = get_node(args[:nodename])
83
+ attribute_hash = self.send(method, node)
84
+ # this eval business is awful, I should probably come up with something
85
+ # smarter
86
+ getter = args[:name].empty? ? "" : "['#{args[:name].join("']['")}']"
87
+ if args[:name].nil?
88
+ pp attribute_hash
89
+ else
90
+ begin
91
+ pp eval "attribute_hash#{getter}"
92
+ rescue NoMethodError
93
+ ui.error "Key not found"
94
+ end
95
+ end
96
+ end
97
+
98
+ end
99
+
100
+ class NodeAttributeDelete < Chef::Knife
101
+ include KnifeNodeAttribute::Helpers
102
+
103
+ banner 'knife node attribute delete HOSTNAME NORMAL|DEFAULT|OVERRIDE colon:separated:key'
104
+
105
+ def parse_args
106
+ unless node_name = name_args[0]
107
+ show_usage
108
+ ui.error "You need to specify a node"
109
+ exit 1
110
+ end
111
+ if name_args[1].nil?
112
+ show_usage
113
+ ui.error "No attribute level given. (e.g. override, normal, default)"
114
+ exit 1
115
+ else
116
+ attribute_class = name_args[1].downcase.to_sym
117
+ # if we passed a valid attribute class, the next one could be an
118
+ # attribute name. If it's invalid, it might be the attribute name
119
+ unless ATTRIBUTE_CLASSES.include? attribute_class
120
+ show_usage
121
+ ui.error "Wrong attribute level given. (e.g. override, normal, default)"
122
+ exit 1
123
+ end
124
+ end
125
+
126
+ unless attribute_name = name_args[2]
127
+ show_usage
128
+ ui.error "No attribute name given."
129
+ exit 1
130
+ end
131
+
132
+ {:nodename => node_name,
133
+ :class => attribute_class,
134
+ :name => attribute_name.split(":")}
135
+ end
136
+
137
+ def run
138
+ args = parse_args
139
+ method = "#{args[:class]}_attrs".to_sym
140
+
141
+ node = get_node(args[:nodename])
142
+ # this eval business is awful, I should probably come up with something
143
+ # smarter
144
+ if args[:name].length == 1
145
+ delete_method = "node.#{method}.delete('#{args[:name].last}')"
146
+ else
147
+ parent_hash = args[:name][0, args[:name].length - 1]
148
+ delete_method = "node.#{method}['#{parent_hash.join("']['")}'].delete('#{args[:name].last}')"
149
+ end
150
+ begin
151
+ eval delete_method
152
+ node.save
153
+ msg = parent_hash.nil? ? "" : " from parent structure #{parent_hash.join(':')}"
154
+ puts "Key #{args[:name].last}#{msg} deleted."
155
+ rescue StandardError => e
156
+ ui.error "An error occured while trying to delete the node key:"
157
+ puts e.to_s
158
+ end
159
+ end
160
+
161
+ end
162
+
163
+ end
164
+
@@ -0,0 +1,4 @@
1
+ module KnifeNodeAttribute
2
+ VERSION = "0.2.0"
3
+ end
4
+
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knife-node-attribute
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Daniel Schauenberg
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-09-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chef
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.4
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.10.4
30
+ description: knife plugin to show or delete node attributes
31
+ email: d@unwiredcouch.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - Gemfile
37
+ - Gemfile.lock
38
+ - LICENSE
39
+ - README.md
40
+ - Rakefile
41
+ - knife-node-attribute.gemspec
42
+ - lib/chef/knife/knife-node-attribute.rb
43
+ - lib/knife-node-attribute.rb
44
+ homepage: https://github.com/mrtazz/knife-node-attribute
45
+ licenses: []
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 1.8.25
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: knife plugin to show or delete node attributes
68
+ test_files: []
69
+ has_rdoc: