smart_proxy_salt 2.0.0 → 2.1.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.
- checksums.yaml +4 -4
- data/lib/smart_proxy_salt/api_request.rb +45 -0
- data/lib/smart_proxy_salt/{salt_main.rb → cli.rb} +27 -28
- data/lib/smart_proxy_salt/rest.rb +31 -0
- data/lib/smart_proxy_salt/salt.rb +21 -2
- data/lib/smart_proxy_salt/salt_api.rb +20 -2
- data/lib/smart_proxy_salt/version.rb +1 -1
- data/settings.d/salt.yml.example +7 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3351c2de7272f0dbb7b148909a51ad602199427d
|
4
|
+
data.tar.gz: 64aa21a514991c9b241451210c1972df71a61ee5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70501217d2996bb1a95dc6845396a0cf8df049c3642626eb219d3d84f1cc058b15558aeac6acacdd3b722a89d7ae2e99b3db06e5baf71537061959a049ea1f2b
|
7
|
+
data.tar.gz: 4ce92e47305d9ea121449067c6945fcbeb92a94378b9ba259d8709d4e6fe9d7f7563289c318fa0363fa20d5b1ceeefed7577d35a33d18507d0d329794289191c
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
require 'net/https'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module Proxy::Salt
|
7
|
+
class ApiError < RuntimeError; end
|
8
|
+
|
9
|
+
class ApiRequest
|
10
|
+
attr_reader :url, :username, :password, :auth
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@url = Proxy::Salt::Plugin.settings.api_url
|
14
|
+
@auth = Proxy::Salt::Plugin.settings.api_auth
|
15
|
+
@username = Proxy::Salt::Plugin.settings.api_username
|
16
|
+
@password = Proxy::Salt::Plugin.settings.api_password
|
17
|
+
|
18
|
+
begin
|
19
|
+
URI.parse(url)
|
20
|
+
rescue URI::InvalidURIError => e
|
21
|
+
raise ConfigurationError.new("Invalid Salt api_url setting: #{e}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def post(path, options = {})
|
26
|
+
uri = URI.parse(url)
|
27
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
28
|
+
http.use_ssl = uri.scheme == 'https'
|
29
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
30
|
+
path = [uri.path, path].join('/') unless uri.path.empty?
|
31
|
+
|
32
|
+
request = Net::HTTP::Post.new(URI.join(uri.to_s, path).path)
|
33
|
+
request.add_field('Accept', 'application/json')
|
34
|
+
request.set_form_data(options.merge(:username => username, :password => password, :eauth => auth))
|
35
|
+
|
36
|
+
response = http.request(request)
|
37
|
+
|
38
|
+
if response.is_a? Net::HTTPOK
|
39
|
+
JSON.load(response.body)
|
40
|
+
else
|
41
|
+
raise ApiError.new("Failed to query Salt API (#{response.code}): #{response.body}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,34 +1,8 @@
|
|
1
|
-
module Proxy::Salt
|
1
|
+
module Proxy::Salt::CLI
|
2
2
|
extend ::Proxy::Log
|
3
3
|
extend ::Proxy::Util
|
4
4
|
|
5
5
|
class << self
|
6
|
-
|
7
|
-
# Move these to a util thingy later
|
8
|
-
def shell_command(cmd, wait = true)
|
9
|
-
begin
|
10
|
-
c = popen(cmd)
|
11
|
-
unless wait
|
12
|
-
Process.detach(c.pid)
|
13
|
-
return 0
|
14
|
-
end
|
15
|
-
Process.wait(c.pid)
|
16
|
-
logger.info("Result: #{c.read}")
|
17
|
-
rescue Exception => e
|
18
|
-
logger.error("Exception '#{e}' when executing '#{cmd}'")
|
19
|
-
return false
|
20
|
-
end
|
21
|
-
logger.warn("Non-null exit code when executing '#{cmd}'") if $?.exitstatus != 0
|
22
|
-
$?.exitstatus == 0
|
23
|
-
end
|
24
|
-
|
25
|
-
def popen(cmd)
|
26
|
-
# 1.8.7 note: this assumes that cli options are space-separated
|
27
|
-
cmd = cmd.join(' ') unless RUBY_VERSION > '1.8.7'
|
28
|
-
logger.debug("about to execute: #{cmd}")
|
29
|
-
IO.popen(cmd)
|
30
|
-
end
|
31
|
-
|
32
6
|
def autosign_file
|
33
7
|
Proxy::Salt::Plugin.settings.autosign_file
|
34
8
|
end
|
@@ -136,6 +110,32 @@ module Proxy::Salt
|
|
136
110
|
|
137
111
|
end
|
138
112
|
|
113
|
+
private
|
114
|
+
|
115
|
+
def shell_command(cmd, wait = true)
|
116
|
+
begin
|
117
|
+
c = popen(cmd)
|
118
|
+
unless wait
|
119
|
+
Process.detach(c.pid)
|
120
|
+
return 0
|
121
|
+
end
|
122
|
+
Process.wait(c.pid)
|
123
|
+
logger.info("Result: #{c.read}")
|
124
|
+
rescue Exception => e
|
125
|
+
logger.error("Exception '#{e}' when executing '#{cmd}'")
|
126
|
+
return false
|
127
|
+
end
|
128
|
+
logger.warn("Non-null exit code when executing '#{cmd}'") if $?.exitstatus != 0
|
129
|
+
$?.exitstatus == 0
|
130
|
+
end
|
131
|
+
|
132
|
+
def popen(cmd)
|
133
|
+
# 1.8.7 note: this assumes that cli options are space-separated
|
134
|
+
cmd = cmd.join(' ') unless RUBY_VERSION > '1.8.7'
|
135
|
+
logger.debug("about to execute: #{cmd}")
|
136
|
+
IO.popen(cmd)
|
137
|
+
end
|
138
|
+
|
139
139
|
def find_salt_binaries
|
140
140
|
@salt_key = which('salt-key')
|
141
141
|
unless File.exists?("#{@salt_key}")
|
@@ -159,6 +159,5 @@ module Proxy::Salt
|
|
159
159
|
logger.debug "Found sudo at #{@sudo}"
|
160
160
|
@sudo = "#{@sudo}"
|
161
161
|
end
|
162
|
-
|
163
162
|
end
|
164
163
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'smart_proxy_salt/api_request'
|
3
|
+
|
4
|
+
module Proxy::Salt::Rest
|
5
|
+
extend ::Proxy::Log
|
6
|
+
extend ::Proxy::Util
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def environments_list
|
10
|
+
Proxy::Salt::ApiRequest.new.post('/run', :fun => 'fileserver.envs', :client => 'runner')['return'][0].to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def states_list(environment)
|
14
|
+
states = []
|
15
|
+
files = Proxy::Salt::ApiRequest.new.post('/run', :fun => 'fileserver.file_list',
|
16
|
+
:saltenv => environment,
|
17
|
+
:client => 'runner')['return'][0]
|
18
|
+
|
19
|
+
files.each do |file|
|
20
|
+
if file =~ /\.sls\Z/ && file != "top.sls"
|
21
|
+
states << file.gsub('.sls', '')
|
22
|
+
.gsub('/init', '')
|
23
|
+
.chomp('/')
|
24
|
+
.gsub('/', '.')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
states.to_s
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,13 +1,32 @@
|
|
1
|
+
require 'smart_proxy_salt/cli'
|
2
|
+
require 'smart_proxy_salt/rest'
|
3
|
+
|
1
4
|
module Proxy::Salt
|
2
5
|
class NotFound < RuntimeError; end
|
3
6
|
|
4
7
|
class Plugin < ::Proxy::Plugin
|
5
8
|
plugin 'salt', Proxy::Salt::VERSION
|
6
9
|
|
7
|
-
default_settings :autosign_file
|
8
|
-
|
10
|
+
default_settings :autosign_file => '/etc/salt/autosign.conf',
|
11
|
+
:salt_command_user => 'root',
|
12
|
+
:use_api => false
|
9
13
|
|
10
14
|
http_rackup_path File.expand_path('salt_http_config.ru', File.expand_path('../', __FILE__))
|
11
15
|
https_rackup_path File.expand_path('salt_http_config.ru', File.expand_path('../', __FILE__))
|
12
16
|
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def method_missing(m, *args, &block)
|
20
|
+
# Use API, if it supports it, otherwise fallback to the CLI
|
21
|
+
if Proxy::Salt::Plugin.settings.use_api && Proxy::Salt::Rest.respond_to?(m)
|
22
|
+
Proxy::Salt::Rest.send(m, *args, &block)
|
23
|
+
elsif Proxy::Salt::CLI.respond_to?(m)
|
24
|
+
Proxy::Salt::CLI.send(m, *args, &block)
|
25
|
+
elsif !Proxy::Salt::Plugin.settings.use_api && Proxy::Salt::Rest.respond_to?(m)
|
26
|
+
raise NotImplementedError, 'You must enable the Salt API to use this feature.'
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
13
32
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'sinatra'
|
2
2
|
require 'smart_proxy_salt/salt'
|
3
|
-
require 'smart_proxy_salt/salt_main'
|
4
3
|
|
5
4
|
module Proxy::Salt
|
6
5
|
class Api < ::Sinatra::Base
|
@@ -37,6 +36,26 @@ module Proxy::Salt
|
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
39
|
+
get '/environments' do
|
40
|
+
content_type :json
|
41
|
+
begin
|
42
|
+
Proxy::Salt::environments_list
|
43
|
+
rescue => e
|
44
|
+
log_halt 406, "Failed to list environments: #{e}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
get '/environments/:environment' do
|
49
|
+
content_type :json
|
50
|
+
begin
|
51
|
+
Proxy::Salt::states_list params[:environment]
|
52
|
+
rescue Proxy::Salt::NotFound => e
|
53
|
+
log_halt 404, "#{e}"
|
54
|
+
rescue => e
|
55
|
+
log_halt 406, "Failed to list states for #{params[:host]}: #{e}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
40
59
|
post '/highstate/:host' do
|
41
60
|
content_type :json
|
42
61
|
begin
|
@@ -82,6 +101,5 @@ module Proxy::Salt
|
|
82
101
|
log_halt 406, "Failed to list keys: #{e}"
|
83
102
|
end
|
84
103
|
end
|
85
|
-
|
86
104
|
end
|
87
105
|
end
|
data/settings.d/salt.yml.example
CHANGED
@@ -2,3 +2,10 @@
|
|
2
2
|
:enabled: true
|
3
3
|
:autosign_file: /etc/salt/autosign.conf
|
4
4
|
:salt_command_user: root
|
5
|
+
# Some features require using the Salt API - such as listing
|
6
|
+
# environments and retrieving state info
|
7
|
+
:use_api: false
|
8
|
+
:api_url: https://localhost:8080
|
9
|
+
:api_auth: pam
|
10
|
+
:api_username: saltuser
|
11
|
+
:api_password: password
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_proxy_salt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Moll
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-05-09 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: SaltStack Plug-In for Foreman's Smart Proxy
|
15
15
|
email: foreman-dev@googlegroups.com
|
@@ -27,10 +27,12 @@ files:
|
|
27
27
|
- cron/smart_proxy_salt
|
28
28
|
- etc/foreman.yaml.example
|
29
29
|
- lib/smart_proxy_salt.rb
|
30
|
+
- lib/smart_proxy_salt/api_request.rb
|
31
|
+
- lib/smart_proxy_salt/cli.rb
|
32
|
+
- lib/smart_proxy_salt/rest.rb
|
30
33
|
- lib/smart_proxy_salt/salt.rb
|
31
34
|
- lib/smart_proxy_salt/salt_api.rb
|
32
35
|
- lib/smart_proxy_salt/salt_http_config.ru
|
33
|
-
- lib/smart_proxy_salt/salt_main.rb
|
34
36
|
- lib/smart_proxy_salt/version.rb
|
35
37
|
- sbin/upload-salt-reports
|
36
38
|
- settings.d/salt.yml.example
|