foremancli 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/foremancli +200 -0
- data/foremancli.gemspec +42 -0
- data/lib/foremancli/version.rb +3 -0
- metadata +101 -0
data/bin/foremancli
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright (C) 2011 Vijay Brian Gupta brian.gupta@brandorr.com
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU General Public License
|
6
|
+
# as published by the Free Software Foundation; either version 2
|
7
|
+
# of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
17
|
+
# USA.
|
18
|
+
|
19
|
+
require "optparse"
|
20
|
+
|
21
|
+
collections_filterable = [
|
22
|
+
:architectures,
|
23
|
+
:common_parameters,
|
24
|
+
:config_templates,
|
25
|
+
:domains,
|
26
|
+
:environments,
|
27
|
+
:fact_values,
|
28
|
+
:hosts,
|
29
|
+
:hostgroups,
|
30
|
+
:media,
|
31
|
+
:puppetclasses,
|
32
|
+
:reports,
|
33
|
+
:roles,
|
34
|
+
:settings,
|
35
|
+
:lookup_keys,
|
36
|
+
:dashboard,
|
37
|
+
:operatingsystems,
|
38
|
+
:subnets,
|
39
|
+
:ptables,
|
40
|
+
:users
|
41
|
+
]
|
42
|
+
|
43
|
+
collections = [
|
44
|
+
:auth_source_ldaps,
|
45
|
+
:hypervisors,
|
46
|
+
:lookup_values,
|
47
|
+
:smart_proxies,
|
48
|
+
:statistics,
|
49
|
+
:usergroups,
|
50
|
+
]
|
51
|
+
|
52
|
+
collections_not_implemented = [ :audits, :bookmarks ]
|
53
|
+
|
54
|
+
@foreman_user = ENV['FOREMAN_USER'] if ENV['FOREMAN_USER']
|
55
|
+
@foreman_pass = ENV['FOREMAN_PASSWORD'] if ENV['FOREMAN_PASSWORD']
|
56
|
+
@foreman_url = ENV['FOREMAN_SERVER'] if ENV['FOREMAN_SERVER']
|
57
|
+
|
58
|
+
options = {}
|
59
|
+
OptionParser.new do |opts|
|
60
|
+
opts.banner = "Usage: " + File.basename($0) + " [options] ..."
|
61
|
+
|
62
|
+
options[:debug] = false
|
63
|
+
opts.on( "-d", "--debug", "Output more information" ) do
|
64
|
+
options[:debug] = true
|
65
|
+
end
|
66
|
+
options[:username] = false
|
67
|
+
opts.on( '-u', '--user USER', "Foreman user") do |f|
|
68
|
+
options[:username] = f
|
69
|
+
end
|
70
|
+
options[:password] = false
|
71
|
+
opts.on( "-p", "--pass PASSWORD", "Foreman password" ) do |f|
|
72
|
+
options[:password] = f
|
73
|
+
end
|
74
|
+
options[:server] = false
|
75
|
+
opts.on( "-s", "--server URL", "Foreman Server URL" ) do |f|
|
76
|
+
options[:server] = f
|
77
|
+
end
|
78
|
+
options[:json] = false
|
79
|
+
opts.on( "--json", "JSON output" ) do
|
80
|
+
options[:json] = true
|
81
|
+
end
|
82
|
+
options[:yaml] = false
|
83
|
+
opts.on( "--yaml", "YAML output" ) do
|
84
|
+
options[:yaml] = true
|
85
|
+
end
|
86
|
+
options[:status] = false
|
87
|
+
opts.on( "--status", "Foreman status" ) do
|
88
|
+
options[:status] = true
|
89
|
+
end
|
90
|
+
# options[:dashboard] = false
|
91
|
+
# opts.on( "--dashboard", "Foreman dashboard" ) do |f|
|
92
|
+
# options[:dashboard] = f
|
93
|
+
# end
|
94
|
+
options[:custom] = false
|
95
|
+
opts.on( "--custom COLLECTION", "Custom COLLECTION string, see: http://theforeman.org/projects/foreman/wiki/API" ) do |f|
|
96
|
+
options[:custom] = f
|
97
|
+
end
|
98
|
+
collections_filterable.each do |collection|
|
99
|
+
options[collection] = false
|
100
|
+
opts.on("--#{collection} [filter]", "Retreive a list of #{collection}") do |f|
|
101
|
+
options[collection] = f || true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
collections.each do |collection|
|
105
|
+
options[collection] = false
|
106
|
+
opts.on("--#{collection}", "Retreive a list of #{collection}") do
|
107
|
+
options[collection] = true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
collections_not_implemented.each do |collection|
|
111
|
+
options[collection] = false
|
112
|
+
opts.on("--#{collection}", "Not implemented") do
|
113
|
+
options[collection] = true
|
114
|
+
end
|
115
|
+
end
|
116
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
117
|
+
puts opts
|
118
|
+
puts ""
|
119
|
+
puts " ENVIRONMENT VARIABLES:"
|
120
|
+
puts ""
|
121
|
+
puts " FOREMAN_SERVER Foreman Server URL"
|
122
|
+
puts " FOREMAN_USER Foreman user"
|
123
|
+
puts " FOREMAN_PASSWORD Foreman password"
|
124
|
+
puts ""
|
125
|
+
puts " CLI options take precendence over ENVIRONMENT VARIABLES"
|
126
|
+
puts ""
|
127
|
+
puts " FILTERS:"
|
128
|
+
puts ""
|
129
|
+
puts " Please see:"
|
130
|
+
puts " http://theforeman.org/projects/foreman/wiki/Search_API"
|
131
|
+
puts ""
|
132
|
+
puts " Examples:"
|
133
|
+
puts " --hosts \"domain = domain.com AND class = squid\""
|
134
|
+
puts " --hosts \"domain = domain.com AND facts.architecture = x86_64 AND \\"
|
135
|
+
puts " class = module::class"
|
136
|
+
puts " --classes \"name = squid\""
|
137
|
+
puts " --domains \"name = domain.com\""
|
138
|
+
puts ""
|
139
|
+
exit 1
|
140
|
+
end
|
141
|
+
end.parse!
|
142
|
+
if options.values.uniq == [false]
|
143
|
+
warn "Use -h, --help for usage."
|
144
|
+
exit 1
|
145
|
+
end
|
146
|
+
|
147
|
+
require "rubygems"
|
148
|
+
require "rest_client"
|
149
|
+
require "json"
|
150
|
+
require "yaml"
|
151
|
+
|
152
|
+
@foreman_user = options.delete(:username) if options[:username]
|
153
|
+
@foreman_pass = options.delete(:password) if options[:password]
|
154
|
+
@foreman_url = options.delete(:server) if options[:server]
|
155
|
+
@usejson = options.delete(:json) if options[:json]
|
156
|
+
@useyaml = options.delete(:yaml) if options[:yaml]
|
157
|
+
@custom = options.delete(:custom) if options[:custom]
|
158
|
+
@status = options.delete(:status) if options[:status]
|
159
|
+
|
160
|
+
RestClient.log = 'stdout' if options.delete(:debug)
|
161
|
+
|
162
|
+
def get_collection(path, options = {})
|
163
|
+
JSON.parse(RestClient::Request.new({:method => :get,
|
164
|
+
:url => "#{@foreman_url}/#{path.to_s.chomp('/')}",
|
165
|
+
:user => @foreman_user, :password => @foreman_pass,
|
166
|
+
:headers => { :accept => :json, :content_type => :json }}.merge(options)).execute.to_s)
|
167
|
+
end
|
168
|
+
|
169
|
+
def search_collection(path,search)
|
170
|
+
get_collection(path, :url => "#{@foreman_url}/#{path}?search=#{URI.encode(search)}")
|
171
|
+
end
|
172
|
+
|
173
|
+
def format
|
174
|
+
return "json" if @usejson
|
175
|
+
return "yaml" if @useyaml
|
176
|
+
end
|
177
|
+
|
178
|
+
def print_response response
|
179
|
+
puts(case format
|
180
|
+
when "json"
|
181
|
+
JSON.pretty_generate(response)
|
182
|
+
when "yaml"
|
183
|
+
YAML.dump(response)
|
184
|
+
else
|
185
|
+
(response.first.is_a?(Hash) ? response.map{|o| o.inspect} : response).join("\n")
|
186
|
+
end)
|
187
|
+
end
|
188
|
+
|
189
|
+
options.each do |collection, filter|
|
190
|
+
next unless filter
|
191
|
+
if filter == true
|
192
|
+
print_response(get_collection(collection))
|
193
|
+
else
|
194
|
+
print_response(search_collection(collection, filter))
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
print_response(get_collection(@custom)) if @custom
|
199
|
+
|
200
|
+
puts JSON.pretty_generate(get_collection("status")) if @status
|
data/foremancli.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
$:.push('lib')
|
4
|
+
require "foremancli/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "foremancli"
|
8
|
+
s.version = Foremancli::VERSION.dup
|
9
|
+
s.date = "2012-01-11"
|
10
|
+
s.summary = "This is the CLI for Foreman, which is a provisioning tool and node classifier for sysadmins."
|
11
|
+
s.email = "brian.gupta@brandorr.com"
|
12
|
+
s.homepage = "https://github.com/ohadlevy/foreman/blob/master/extras/cli/foremancli"
|
13
|
+
s.authors = ['Brian Gupta']
|
14
|
+
|
15
|
+
s.description = <<-EOF
|
16
|
+
This is the CLI for Foreman, which is a provisioning tool and node classifier for sysadmins.
|
17
|
+
EOF
|
18
|
+
|
19
|
+
dependencies = [
|
20
|
+
[:runtime, "rest-client", "~> 1.4"],
|
21
|
+
[:runtime, "json", "~> 1.4"],
|
22
|
+
]
|
23
|
+
|
24
|
+
s.files = Dir['**/*']
|
25
|
+
s.test_files = Dir['test/**/*'] + Dir['spec/**/*']
|
26
|
+
s.executables = Dir['bin/*'].map { |f| File.basename(f) }
|
27
|
+
s.require_paths = ["lib"]
|
28
|
+
|
29
|
+
|
30
|
+
## Make sure you can build the gem on older versions of RubyGems too:
|
31
|
+
s.rubygems_version = "1.3.7"
|
32
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
33
|
+
s.specification_version = 3 if s.respond_to? :specification_version
|
34
|
+
|
35
|
+
dependencies.each do |type, name, version|
|
36
|
+
if s.respond_to?("add_#{type}_dependency")
|
37
|
+
s.send("add_#{type}_dependency", name, version)
|
38
|
+
else
|
39
|
+
s.add_dependency(name, version)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: foremancli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 13
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 4
|
9
|
+
- 1
|
10
|
+
version: 0.4.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Brian Gupta
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-11 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rest-client
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 4
|
33
|
+
version: "1.4"
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: json
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 7
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 4
|
48
|
+
version: "1.4"
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
description: |
|
52
|
+
This is the CLI for Foreman, which is a provisioning tool and node classifier for sysadmins.
|
53
|
+
|
54
|
+
email: brian.gupta@brandorr.com
|
55
|
+
executables:
|
56
|
+
- foremancli
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files: []
|
60
|
+
|
61
|
+
files:
|
62
|
+
- bin/foremancli
|
63
|
+
- foremancli-0.4.1.gem
|
64
|
+
- foremancli.gemspec
|
65
|
+
- lib/foremancli/version.rb
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: https://github.com/ohadlevy/foreman/blob/master/extras/cli/foremancli
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 3
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
requirements: []
|
94
|
+
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 1.3.7
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: This is the CLI for Foreman, which is a provisioning tool and node classifier for sysadmins.
|
100
|
+
test_files: []
|
101
|
+
|