ronin-wrapper 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ronin/artifact_runner.rb +3 -2
- data/lib/ronin/chef.rb +8 -10
- data/lib/ronin/config.rb +21 -14
- data/lib/ronin/etcd.rb +51 -9
- data/lib/ronin/puppet.rb +6 -6
- data/lib/ronin/ronin.rb +27 -9
- data/lib/ronin/run_list.rb +18 -14
- data/lib/ronin/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53e2dbec8e427757f3f6aa4dd83f44da312e738a
|
4
|
+
data.tar.gz: d9826525467d51515bd6e17b84a7a4d3f0f02fa9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3caca00937edd64378164774cac21fa6ffe5f21577a9f69960fdabff2ae180ab14d3ac4006ed0b5d6e693f9b96da786d85ea5f2b459d0226315383b62152d6be
|
7
|
+
data.tar.gz: 2144ce58a9df7fea7f7d68819660bef0e7a3d9dfc0f54789b26b0a9edc930a452ef43b55aac3060075a019f6e8e08b353a43af15439452e7b1c01e54f5102924
|
@@ -28,8 +28,9 @@ module Ronin
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def download_and_report_changes
|
31
|
-
|
32
|
-
|
31
|
+
@items = @run_list.items
|
32
|
+
Parallel.each(@items, :in_threads => Ronin::Util.num_cores) do |item|
|
33
|
+
@actual_branch = Ronin::Git.branch(item[:name])
|
33
34
|
|
34
35
|
if File.exist?("#{Ronin::Config[:artifact_path]}/#{item[:name]}")
|
35
36
|
if item[:branch] != 'master'
|
data/lib/ronin/chef.rb
CHANGED
@@ -19,17 +19,18 @@ require 'ronin/log'
|
|
19
19
|
require 'json'
|
20
20
|
|
21
21
|
module Ronin
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
class Chef
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@run_list = "#{Ronin::Config[:artifact_path]}/ronin.json"
|
26
|
+
@solo_conf = "#{Ronin::Config[:artifact_path]}/ronin-chef-solo.rb"
|
27
|
+
@recipes = Ronin::RunList.new.artifacts
|
28
|
+
end
|
26
29
|
|
27
30
|
def create_run_list
|
28
31
|
Ronin::Log.info("Building Chef run list at #{@run_list}.")
|
29
|
-
|
30
32
|
@rl = []
|
31
33
|
@rl_obj = {}
|
32
|
-
|
33
34
|
@recipes.each do |r|
|
34
35
|
@rl << "recipe[#{r}]"
|
35
36
|
Ronin::Log.info("Adding recipe '#{r}' to run list.")
|
@@ -41,7 +42,6 @@ module Ronin
|
|
41
42
|
f.write(@rl_obj.to_json)
|
42
43
|
end
|
43
44
|
end
|
44
|
-
module_function :create_run_list
|
45
45
|
|
46
46
|
def run
|
47
47
|
self.create_run_list
|
@@ -51,7 +51,6 @@ module Ronin
|
|
51
51
|
@cmd.run_command
|
52
52
|
self.clean_up
|
53
53
|
end
|
54
|
-
module_function :run
|
55
54
|
|
56
55
|
def create_solo_conf
|
57
56
|
@solo_config = "file_cache_path '/var/tmp/ronin/chef-solo'\ncookbook_path '#{Ronin::Config[:artifact_path]}'\n"
|
@@ -60,7 +59,6 @@ module Ronin
|
|
60
59
|
f.write(@solo_config)
|
61
60
|
end
|
62
61
|
end
|
63
|
-
module_function :create_solo_conf
|
64
62
|
|
65
63
|
def clean_up
|
66
64
|
Ronin::Log.info("Cleaning up Chef run list at #{@run_list}.")
|
@@ -69,6 +67,6 @@ module Ronin
|
|
69
67
|
Ronin::Log.info("Cleaning up Chef-Solo config at #{@solo_conf}.")
|
70
68
|
File.delete(@solo_conf)
|
71
69
|
end
|
72
|
-
|
70
|
+
|
73
71
|
end
|
74
72
|
end
|
data/lib/ronin/config.rb
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
require 'mixlib/config'
|
17
|
+
require 'ronin/etcd'
|
17
18
|
|
18
19
|
module Ronin
|
19
20
|
class Config
|
@@ -27,19 +28,25 @@ module Ronin
|
|
27
28
|
puts "No configuration file at #{config_file}, using defaults."
|
28
29
|
end
|
29
30
|
|
30
|
-
config_strict_mode
|
31
|
-
default :
|
32
|
-
default :
|
33
|
-
default :
|
34
|
-
default :
|
35
|
-
default :
|
36
|
-
default :
|
37
|
-
default :
|
38
|
-
default :
|
39
|
-
default :
|
40
|
-
default :
|
31
|
+
config_strict_mode true
|
32
|
+
default :config_from_etcd, false
|
33
|
+
default :lock_file, '/var/tmp/ronin.lock'
|
34
|
+
default :log_path, '/var/log/ronin'
|
35
|
+
default :log_level, :info
|
36
|
+
default :update_on_change, true
|
37
|
+
default :interpreter, 'chef'
|
38
|
+
default :artifact_path, '/var/lib/ronin/artifacts'
|
39
|
+
default :run_list_type, 'yaml'
|
40
|
+
default :run_list_file, '/etc/ronin/artifacts.yaml'
|
41
|
+
default :etcd_host, '127.0.0.1'
|
42
|
+
default :etcd_port, 4001
|
43
|
+
default :etcd_conn_timeout, 5
|
44
|
+
default :etcd_read_timeout, 5
|
45
|
+
default :etcd_use_ssl, false
|
46
|
+
default :etcd_ssl_ca_cert, ''
|
47
|
+
default :etcd_ssl_cert, ''
|
48
|
+
default :etcd_ssl_key, ''
|
49
|
+
default :etcd_keys, [ 'common', 'env', 'node' ]
|
41
50
|
|
42
51
|
end
|
43
|
-
end
|
44
|
-
|
45
|
-
|
52
|
+
end
|
data/lib/ronin/etcd.rb
CHANGED
@@ -20,25 +20,67 @@ require 'socket'
|
|
20
20
|
require 'json'
|
21
21
|
|
22
22
|
# Add test data thus.
|
23
|
-
|
24
|
-
#
|
23
|
+
|
24
|
+
#curl -L http://127.0.0.1:4001/v2/keys/ronin/config/common -X PUT -d value='{
|
25
|
+
# "artifacts": [
|
25
26
|
# "https://github.com/opscode-cookbooks/motd-tail"
|
26
27
|
# ]
|
27
28
|
#}'
|
28
29
|
|
30
|
+
#curl -L http://127.0.0.1:4001/v2/keys/ronin/config/common -X PUT -d value='{
|
31
|
+
# "log_path": "/var/log/ronin",
|
32
|
+
# "interpreter": ":chef",
|
33
|
+
# "artifact_path": "/var/lib/ronin/artifacts",
|
34
|
+
# "update_on_change": "true",
|
35
|
+
# "run_list_type": ":etcd",
|
36
|
+
# "run_list_file": "/etc/ronin/artifacts.yaml"
|
37
|
+
#}'
|
38
|
+
|
29
39
|
module Ronin
|
30
40
|
module Etcd
|
31
|
-
|
41
|
+
|
42
|
+
def get_key(type, key)
|
32
43
|
# Will add error handling... one day.
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@http =
|
36
|
-
@http.
|
44
|
+
@path = "/v2/keys/ronin/#{type}/#{key}"
|
45
|
+
@http = Net::HTTP.new(Ronin::Config[:etcd_host], Ronin::Config[:etcd_port])
|
46
|
+
@http.read_timeout = Ronin::Config[:etcd_read_timeout]
|
47
|
+
@http.open_timeout = Ronin::Config[:etcd_conn_timeout]
|
48
|
+
|
49
|
+
if Ronin::Config[:etcd_use_ssl]
|
50
|
+
@http.use_ssl = true
|
51
|
+
unless Ronin::Config[:etcd_ssl_cert] = ''
|
52
|
+
@http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
53
|
+
store = OpenSSL::X509::Store.new
|
54
|
+
store.add_cert(OpenSSL::X509::Certificate.new(File.read(Ronin::Config[:etcd_ssl_ca_cert])))
|
55
|
+
@http.cert_store = store
|
56
|
+
@http.key = OpenSSL::PKey::RSA.new(File.read(Ronin::Config[:etcd_ssl_cert]))
|
57
|
+
@http.cert = OpenSSL::X509::Certificate.new(File.read(Ronin::Config[:etcd_ssl_key]))
|
58
|
+
end
|
59
|
+
else
|
60
|
+
@http.use_ssl = false
|
61
|
+
end
|
62
|
+
|
37
63
|
@request = Net::HTTP::Get.new(@path)
|
38
64
|
@result = @http.request(@request)
|
39
|
-
|
40
|
-
|
65
|
+
return JSON.parse(@result.body)['node']['value']
|
66
|
+
end
|
67
|
+
module_function :get_key
|
68
|
+
|
69
|
+
def get_config
|
70
|
+
@hostname = Socket.gethostname
|
71
|
+
@common = JSON.parse(Ronin::Etcd.get_key('config', 'common'))
|
72
|
+
#@specific = JSON.parse(Ronin::Etcd.get_key('config', @hostname))
|
73
|
+
#return @common.merge(@specific)
|
74
|
+
end
|
75
|
+
module_function :get_config
|
76
|
+
|
77
|
+
def get_run_list
|
78
|
+
@hostname = Socket.gethostname
|
79
|
+
@common = JSON.parse(Ronin::Etcd.get_key('run_list', 'common'))['artifacts']
|
80
|
+
#@specific = JSON.parse(Ronin::Etcd.get_key('run_list', @hostname))['artifacts']
|
81
|
+
#return (@common+@specific).uniq
|
41
82
|
end
|
42
83
|
module_function :get_run_list
|
84
|
+
|
43
85
|
end
|
44
86
|
end
|
data/lib/ronin/puppet.rb
CHANGED
@@ -18,10 +18,12 @@ require 'ronin/config'
|
|
18
18
|
require 'ronin/log'
|
19
19
|
|
20
20
|
module Ronin
|
21
|
-
|
21
|
+
class Puppet
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
def initialize
|
24
|
+
@run_list = "#{Ronin::Config[:artifact_path]}/ronin.pp"
|
25
|
+
@modules = Ronin::RunList.new.artifacts
|
26
|
+
end
|
25
27
|
|
26
28
|
def create_run_list
|
27
29
|
Ronin::Log.info("Building Puppet run list at #{@run_list}.")
|
@@ -32,7 +34,6 @@ module Ronin
|
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
35
|
-
module_function :create_run_list
|
36
37
|
|
37
38
|
def run
|
38
39
|
self.create_run_list
|
@@ -41,12 +42,11 @@ module Ronin
|
|
41
42
|
@cmd.run_command
|
42
43
|
self.clean_up
|
43
44
|
end
|
44
|
-
module_function :run
|
45
45
|
|
46
46
|
def clean_up
|
47
47
|
Ronin::Log.info("Cleaning up Puppet run list at #{@run_list}.")
|
48
48
|
File.delete(@run_list)
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
end
|
52
52
|
end
|
data/lib/ronin/ronin.rb
CHANGED
@@ -23,6 +23,20 @@ require 'ronin/log'
|
|
23
23
|
module Ronin
|
24
24
|
def run
|
25
25
|
|
26
|
+
if Ronin::Config[:config_from_etcd] == true
|
27
|
+
Ronin::Log.info("Pulling configuration items from etcd (#{Ronin::Config[:etcd_host]}:#{Ronin::Config[:etcd_port]}).")
|
28
|
+
|
29
|
+
Ronin::Etcd.get_config.each do |k, v|
|
30
|
+
Ronin::Log.info("Setting #{k} to #{v}.")
|
31
|
+
|
32
|
+
if v.start_with?(':')
|
33
|
+
v = v[1..-1].to_sym
|
34
|
+
end
|
35
|
+
|
36
|
+
Ronin::Config["#{k}"] = v
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
26
40
|
Ronin::Log.level = Ronin::Config[:log_level]
|
27
41
|
|
28
42
|
if Ronin::Util.find_cmd("git").nil?
|
@@ -40,23 +54,27 @@ module Ronin
|
|
40
54
|
if Ronin::Util.find_cmd("chef-solo").nil? and Ronin::Config[:interpreter] == :puppet
|
41
55
|
abort("You need to have Chef-Solo installed to perform this command with Chef set as the interpreter.")
|
42
56
|
else
|
43
|
-
$CHEFSOLO_BIN = Ronin::Util.find_cmd("
|
57
|
+
$CHEFSOLO_BIN = Ronin::Util.find_cmd("chef-solo")
|
44
58
|
end
|
45
59
|
|
46
60
|
unless File.exists?(Ronin::Config[:lock_file])
|
47
61
|
Ronin::Log.info("Dropping lock file. (#{Ronin::Config[:lock_file]})")
|
48
62
|
File.new(Ronin::Config[:lock_file], "w")
|
49
63
|
|
50
|
-
|
51
|
-
|
52
|
-
|
64
|
+
r = Ronin::ArtifactRunner.new
|
65
|
+
changes = r.download_and_report_changes
|
66
|
+
r.purge_unused
|
53
67
|
|
54
|
-
if
|
55
|
-
if Ronin::Config[:interpreter] ==
|
56
|
-
Ronin::Puppet.
|
57
|
-
|
58
|
-
|
68
|
+
if changes
|
69
|
+
if Ronin::Config[:interpreter] == 'puppet'
|
70
|
+
runner = Ronin::Puppet.new
|
71
|
+
runner.run
|
72
|
+
elsif Ronin::Config[:interpreter] == 'chef'
|
73
|
+
runner = Ronin::Chef.new
|
74
|
+
runner.run
|
59
75
|
end
|
76
|
+
else
|
77
|
+
Ronin::Log.info("No changes detected, not running interpretor.")
|
60
78
|
end
|
61
79
|
Ronin::Log.info("Deleting lock file and exiting. (#{Ronin::Config[:lock_file]})")
|
62
80
|
File.delete(Ronin::Config[:lock_file])
|
data/lib/ronin/run_list.rb
CHANGED
@@ -23,24 +23,28 @@ module Ronin
|
|
23
23
|
|
24
24
|
def initialize
|
25
25
|
@run_list = {}
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
|
27
|
+
if Ronin::Config[:run_list_type] == 'etcd'
|
28
|
+
@artifacts_raw = Ronin::Etcd.get_run_list
|
29
|
+
else
|
30
|
+
@artifacts_raw = YAML.load_file(Ronin::Config['run_list_file'])['artifacts']
|
30
31
|
end
|
31
32
|
|
32
|
-
@artifacts_raw.
|
33
|
-
if a.include?(";")
|
34
|
-
@repo = a.split(";")[0].sub(/(\/)+$/,'')
|
35
|
-
@branch = a.split(";")[1]
|
36
|
-
else
|
37
|
-
@repo = a
|
38
|
-
@branch = 'master'
|
39
|
-
end
|
33
|
+
unless @artifacts_raw.nil?
|
40
34
|
|
41
|
-
@
|
35
|
+
@artifacts_raw.each do |a|
|
36
|
+
if a.include?(";")
|
37
|
+
@repo = a.split(";")[0].sub(/(\/)+$/,'')
|
38
|
+
@branch = a.split(";")[1]
|
39
|
+
else
|
40
|
+
@repo = a
|
41
|
+
@branch = 'master'
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
+
@name = @repo.split("/").last
|
45
|
+
|
46
|
+
@run_list[@name] = { :name => @name, :repo => @repo, :branch => @branch }
|
47
|
+
end
|
44
48
|
end
|
45
49
|
|
46
50
|
@run_list
|
data/lib/ronin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ronin-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Milford
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yajl-ruby
|