mofa 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c040f77b572291d756fff5efda245dda9c8501c
4
+ data.tar.gz: 9e86ec9be601d46863449dd070142748b59cd8b2
5
+ SHA512:
6
+ metadata.gz: 2c8263d05d553f4673f9450df9755fde8890f34816f85dfd786d5275ae94ccff6c2c51d61993a7fa7a0777c01324febae7d1c64a9f722e8845ac596177cb860e
7
+ data.tar.gz: d01aa5c8214ddfe139197675099985b1c83935f9c863add10448f14bd3f29e81af7baf6c04df0fb1137c5061a33eaddaee53cf6023b548d4b6c7462aa9bebfc4
data/lib/mofa.rb CHANGED
@@ -5,10 +5,12 @@ require 'mofa/version'
5
5
  require 'mofa/mofa_cmd'
6
6
  require 'mofa/hostlist'
7
7
  require 'mofa/runlist_map'
8
+ require 'mofa/attributes_map'
8
9
  require 'mofa/cookbook'
9
10
  require 'mofa/released_cookbook'
10
11
  require 'mofa/source_cookbook'
11
12
  require 'mofa/config'
13
+ require 'mofa/mofa_yml'
12
14
  require 'thor'
13
15
  require 'fileutils'
14
16
  require 'yaml'
@@ -0,0 +1,37 @@
1
+ class AttributesMap
2
+ attr_accessor :mp
3
+ attr_accessor :cookbook
4
+ attr_accessor :hostlist
5
+ attr_accessor :token
6
+ attr_accessor :option_runlist
7
+ attr_accessor :option_attributes
8
+
9
+ def self.create(cookbook, hostlist, token, option_runlist = nil, option_attributes = nil)
10
+ a = AttributesMap.new
11
+ a.cookbook = cookbook
12
+ a.hostlist = hostlist
13
+ a.token = token
14
+ a.option_runlist = option_runlist
15
+ a.option_attributes = option_attributes
16
+ a
17
+ end
18
+
19
+ def initialize
20
+ @mp = {}
21
+ end
22
+
23
+ def generate
24
+ attr_all_roles = cookbook.mofa_yml.get_attr_for_role('all')
25
+ attr_all_roles_local = cookbook.mofa_yml_local.get_attr_for_role('all')
26
+ attr_all_roles.merge!(attr_all_roles_local)
27
+ hostlist.list.each do |hostname|
28
+ # Again: the underlying rule here is -> shortname = role
29
+ attr_host_role = cookbook.mofa_yml.get_attr_for_role(Hostlist::get_role(hostname))
30
+ attr_host_role_local = cookbook.mofa_yml_local.get_attr_for_role(Hostlist::get_role(hostname))
31
+ attr_host_role.merge!(attr_host_role_local)
32
+ attr_per_host = attr_all_roles.merge(attr_host_role)
33
+ @mp.store(hostname, attr_per_host)
34
+ end
35
+ end
36
+
37
+ end
data/lib/mofa/cli.rb CHANGED
@@ -7,6 +7,8 @@ module Mofa
7
7
  include Thor::Actions
8
8
  include Mofa::Config
9
9
 
10
+ Mofa::Config.load
11
+
10
12
  @@option_verbose = false
11
13
  @@option_debug = false
12
14
 
@@ -16,8 +18,7 @@ module Mofa
16
18
  desc 'provision <cookbook>', 'provisions Targethost(s) using a given cookbook.'
17
19
  method_option :target, :type => :string, :aliases => '-t'
18
20
  method_option :runlist, :type => :string, :aliases => '-o'
19
-
20
- Mofa::Config.load
21
+ method_option :service_hostlist_url, :type => :string
21
22
 
22
23
  def provision(cookbook_name_or_path)
23
24
  set_verbosity
@@ -29,13 +30,12 @@ module Mofa
29
30
 
30
31
  token = MofaCmd.generate_token
31
32
 
32
- hostlist = Hostlist.create(target_filter)
33
+ hostlist = Hostlist.create(target_filter, options[:service_hostlist_url])
33
34
  cookbook = Cookbook.create(cookbook_name_or_path, token)
34
35
  runlist_map = RunlistMap.create(cookbook, hostlist, token, options[:runlist])
36
+ attributes_map = AttributesMap.create(cookbook, hostlist, token, options[:runlist], options[:attributes])
35
37
 
36
- mofa_cmd = MofaCmd.create(cookbook, hostlist, runlist_map, token)
37
-
38
-
38
+ mofa_cmd = MofaCmd.create(cookbook, hostlist, runlist_map, attributes_map, token)
39
39
  mofa_cmd.prepare
40
40
  mofa_cmd.execute
41
41
  mofa_cmd.cleanup
data/lib/mofa/cookbook.rb CHANGED
@@ -13,6 +13,8 @@ class Cookbook
13
13
  attr_accessor :pkg_uri
14
14
  attr_accessor :source_uri
15
15
  attr_accessor :cookbooks_url
16
+ attr_accessor :mofa_yml
17
+ attr_accessor :mofa_yml_local
16
18
  attr_accessor :token
17
19
 
18
20
  def self.create(cookbook_name_or_path='.', token=nil)
@@ -34,7 +36,8 @@ class Cookbook
34
36
  end
35
37
  cb.token = token
36
38
  cb.autodetect_type
37
-
39
+ cb.load_mofa_yml
40
+ cb.load_mofa_yml_local
38
41
  cb
39
42
 
40
43
  end
@@ -45,13 +48,14 @@ class Cookbook
45
48
  base_indicator = Mofa::Config.config['cookbook_type_indicator']['base']
46
49
 
47
50
  say "Autodetecting Cookbook Architectural Type... "
51
+
48
52
  case
49
53
  when @name.match(env_indicator)
50
54
  @type = 'env'
51
- when @name.match(wrapper_indicator)
52
- @type = 'wrapper'
53
55
  when @name.match(base_indicator)
54
56
  @type = 'base'
57
+ when @name.match(wrapper_indicator)
58
+ @type = 'wrapper'
55
59
  else
56
60
  @type = 'application'
57
61
  end
data/lib/mofa/hostlist.rb CHANGED
@@ -9,21 +9,41 @@ class Hostlist
9
9
  attr_accessor :filter
10
10
  attr_accessor :api_key
11
11
 
12
- def self.create(filter = nil)
12
+ def self.create(filter = nil, service_hostlist_url = nil)
13
13
  hl = Hostlist.new
14
14
  filter ||= Mofa::Config.config['service_hostlist_default_filter']
15
+ service_hostlist_url ||= Mofa::Config.config['service_hostlist_url']
15
16
  hl.filter = filter
16
17
  hl.service_host = Mofa::Config.config['service_hostlist_url'].gsub(/^http:\/\//, '').gsub(/\/.*$/, '').gsub(/:.*$/, '')
17
- hl.service_url = Mofa::Config.config['service_hostlist_url']
18
+ hl.service_url = service_hostlist_url
18
19
  hl.api_key = Mofa::Config.config['service_hostlist_api_key']
19
20
  hl
20
21
  end
21
22
 
23
+ def self.get_shortname(hostname)
24
+ hostname.gsub(/\..*$/, '')
25
+ end
26
+
27
+ def self.get_role(hostname)
28
+ Hostlist::get_shortname(hostname).gsub(/\d+$/, '')
29
+ end
30
+
22
31
  def retrieve
23
- fail "Hostlist Service not reachable! (cannot ping #{service_host})" unless up?
24
- response = RestClient.get(@service_url, { :params => {:key => api_key}})
25
- hosts_list_json = JSON.parse response.body
26
- @list = hosts_list_json['data'].collect { |i| i['cname'] }
32
+ case
33
+ when @service_url.match(/^http/)
34
+ fail "Hostlist Service not reachable! (cannot ping #{service_host})" unless up?
35
+ response = RestClient.get(@service_url, {:params => {:key => api_key}})
36
+ hosts_list_json = JSON.parse response.body
37
+ @list = hosts_list_json['data'].collect { |i| i['cname'] }
38
+ when @service_url.match(/^file:/)
39
+ json_file = @service_url.gsub(/^file:\/\//, '')
40
+ if File.exist?(json_file)
41
+ hosts_list_json = JSON.parse(File.read(json_file))
42
+ @list = hosts_list_json['data'].collect { |i| i['cname'] }
43
+ end
44
+ else
45
+ fail "Hostlist Service Url either has to be a http(s):// or a file:/// Url!"
46
+ end
27
47
 
28
48
  apply_filter
29
49
  sort_by_domainname
@@ -43,7 +63,7 @@ class Hostlist
43
63
 
44
64
  puts "regex=#{regex}"
45
65
 
46
- @list.select! {|hostname| hostname.match(regex) }
66
+ @list.select! { |hostname| hostname.match(regex) }
47
67
  end
48
68
 
49
69
  def sort_by_domainname
@@ -55,7 +75,7 @@ class Hostlist
55
75
  end
56
76
 
57
77
  def filter_by_runlist_map(runlist_map)
58
- @list.select! { |hostname| runlist_map.mp.key?(hostname)}
78
+ @list.select! { |hostname| runlist_map.mp.key?(hostname) }
59
79
  end
60
80
 
61
81
  end
data/lib/mofa/mofa_cmd.rb CHANGED
@@ -6,31 +6,34 @@ class MofaCmd
6
6
  attr_accessor :cookbook
7
7
  attr_accessor :hostlist
8
8
  attr_accessor :runlist_map
9
+ attr_accessor :attributes_map
9
10
 
10
11
  def self.generate_token
11
12
  Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
12
13
  end
13
14
 
14
- def self.create(cookbook, hostlist, runlist_map, token)
15
+ def self.create(cookbook, hostlist, runlist_map, attributes_map, token)
15
16
  mofa_cmd = MofaCmd.new
16
17
  mofa_cmd.token = token
17
18
  mofa_cmd.cookbook = cookbook
18
19
  mofa_cmd.hostlist = hostlist
19
20
  mofa_cmd.runlist_map = runlist_map
21
+ mofa_cmd.attributes_map = attributes_map
20
22
  mofa_cmd
21
23
  end
22
24
 
23
25
  def prepare
24
26
  cookbook.prepare
25
- fail "Hostlist Service not reachable! (cannot ping #{hostlist.service_url})" unless hostlist.up?
26
27
  end
27
28
 
28
29
  def execute
29
30
  cookbook.execute
30
31
  hostlist.retrieve
31
32
  runlist_map.generate
33
+ attributes_map.generate
32
34
 
33
35
  puts "Runlist Map: #{runlist_map.mp.inspect}"
36
+ puts "Attributes Map: #{attributes_map.mp.inspect}"
34
37
  puts "Hostlist before runlist filtering: #{hostlist.list.inspect}"
35
38
 
36
39
  hostlist.filter_by_runlist_map(runlist_map)
@@ -87,7 +90,7 @@ class MofaCmd
87
90
 
88
91
  # remotely create a data_bags folder structure on the target host
89
92
  if File.directory?("#{cookbook.source_dir}/data_bags")
90
- Dir.entries("#{cookbook.source_dir}/data_bags").select{|f| !f.match(/^\.\.?$/)}.each do |data_bag|
93
+ Dir.entries("#{cookbook.source_dir}/data_bags").select { |f| !f.match(/^\.\.?$/) }.each do |data_bag|
91
94
  puts "Remotely creating data_bags dir \"#{solo_dir}/data_bags/#{data_bag}\""
92
95
  out = ssh_exec!(ssh, "[ -d #{solo_dir}/data_bags/#{data_bag} ] || mkdir -p #{solo_dir}/data_bags/#{data_bag}")
93
96
  puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
@@ -120,6 +123,9 @@ class MofaCmd
120
123
  puts "Remotely creating \"#{solo_dir}/node.json\""
121
124
  node_json = {}
122
125
  node_json.store('run_list', runlist_map.mp[hostname])
126
+ attributes_map.mp[hostname].each do |key, value|
127
+ node_json.store(key, value)
128
+ end
123
129
 
124
130
  sftp.file.open("#{solo_dir}/node.json", "w") do |file|
125
131
  file.write(JSON.pretty_generate(node_json))
@@ -127,8 +133,8 @@ class MofaCmd
127
133
 
128
134
  # remotely create data_bag items
129
135
  if File.directory?("#{cookbook.source_dir}/data_bags")
130
- Dir.entries("#{cookbook.source_dir}/data_bags").select{|f| !f.match(/^\.\.?$/)}.each do |data_bag|
131
- Dir.entries("#{cookbook.source_dir}/data_bags/#{data_bag}").select{|f| f.match(/\.json$/)}.each do |data_bag_item|
136
+ Dir.entries("#{cookbook.source_dir}/data_bags").select { |f| !f.match(/^\.\.?$/) }.each do |data_bag|
137
+ Dir.entries("#{cookbook.source_dir}/data_bags/#{data_bag}").select { |f| f.match(/\.json$/) }.each do |data_bag_item|
132
138
  puts "Uploading data_bag_item #{data_bag_item}... "
133
139
  sftp.upload!("#{cookbook.source_dir}/data_bags/#{data_bag}/#{data_bag_item}", "#{solo_dir}/data_bags/#{data_bag}/#{data_bag_item}")
134
140
  puts "OK."
@@ -0,0 +1,40 @@
1
+ class MofaYml
2
+ attr_accessor :cookbook
3
+ attr_accessor :yml
4
+
5
+ def initialize
6
+ @yml = {}
7
+ end
8
+
9
+ def self.load_from_file(path_to_mofayml, cookbook)
10
+ mfyml = MofaYml.new
11
+ mfyml.cookbook = cookbook
12
+ if File.exist?(path_to_mofayml)
13
+ mfyml.parse_and_load(path_to_mofayml)
14
+ end
15
+ mfyml
16
+ end
17
+
18
+ def get_attr_for_role(role_name)
19
+ attr = {}
20
+ if @yml.key?('roles') # && @yml['roles'].kind_of?(Array)
21
+ @yml['roles'].each do |role|
22
+ if role.key?('name') && role['name'] == role_name
23
+ if role.key?('attributes')
24
+ attr = role['attributes']
25
+ end
26
+ end
27
+ end
28
+ end
29
+ attr
30
+ end
31
+
32
+ def parse_and_load(path_to_mofayml)
33
+ # for now only __ENV_COOKBOOK__ for cookbook name is supported
34
+ file_contents = File.read(path_to_mofayml)
35
+ file_contents.gsub!(/__ENV_COOKBOOK__/, @cookbook.name)
36
+ puts "FileContents: #{file_contents}"
37
+ @yml = YAML.load(file_contents)
38
+ puts "Parsed: #{@yml}"
39
+ end
40
+ end
@@ -47,7 +47,9 @@ class RunlistMap
47
47
 
48
48
  def set_default_runlist_for_every_host
49
49
  hostlist.list.each do |hostname|
50
- @mp.store(hostname, @default_runlist)
50
+ if cookbook.recipies.include?(@default_runlist.split(/::/)[1])
51
+ @mp.store(hostname, @default_runlist)
52
+ end
51
53
  end
52
54
  end
53
55
 
@@ -41,6 +41,14 @@ class SourceCookbook < Cookbook
41
41
  source_uri.gsub(/^file:\/\//, '')
42
42
  end
43
43
 
44
+ def load_mofa_yml
45
+ @mofa_yml = MofaYml.load_from_file("#{source_dir}/.mofa.yml", self)
46
+ end
47
+
48
+ def load_mofa_yml_local
49
+ @mofa_yml_local = MofaYml.load_from_file("#{source_dir}/.mofa.local.yml", self)
50
+ end
51
+
44
52
  def autodetect_name
45
53
  say "Autodetecting Cookbook Name... "
46
54
  @name = open("#{source_dir}/metadata.rb").grep(/^name/)[0].gsub(/^name[^a-zA-Z0-9_-]*/, '').gsub(/.$/, '').chomp
@@ -54,8 +62,8 @@ class SourceCookbook < Cookbook
54
62
  end
55
63
 
56
64
  def recipes
57
- recipes = Dir.entries("#{source_dir}/recipes").select {|f| f.match(/.rb$/)}
58
- recipes.map! {|f| f.gsub(/\.rb/, '')}
65
+ recipes = Dir.entries("#{source_dir}/recipes").select { |f| f.match(/.rb$/) }
66
+ recipes.map! { |f| f.gsub(/\.rb/, '') }
59
67
  end
60
68
 
61
69
  def cleanup!
data/lib/mofa/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mofa
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/mofa.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.version = Mofa::VERSION
7
7
  s.authors = ["Alexander Birk"]
8
8
  s.email = ["birk@pingworks.de"]
9
- s.homepage = "https://github.com/birka/mofa"
9
+ s.homepage = "https://github.com/pingworks/mofa"
10
10
  s.summary = %q{a lightweight remote chef-solo runner}
11
11
  s.description = %q{a lightweight remote chef-solo runner}
12
12
  s.rubyforge_project = "mofa"
@@ -26,4 +26,4 @@ Gem::Specification.new do |s|
26
26
  s.add_runtime_dependency "net-ping"
27
27
  s.add_runtime_dependency "user_config"
28
28
  s.add_runtime_dependency "chronic"
29
- end
29
+ end
metadata CHANGED
@@ -1,206 +1,181 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mofa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Alexander Birk
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-03-31 00:00:00.000000000 Z
11
+ date: 2015-04-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: fakefs
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: guard-minitest
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: thor
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: json
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rest-client
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: net-ssh
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :runtime
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: net-sftp
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - '>='
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :runtime
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - '>='
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: net-ping
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
- - - ! '>='
143
+ - - '>='
164
144
  - !ruby/object:Gem::Version
165
145
  version: '0'
166
146
  type: :runtime
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
- - - ! '>='
150
+ - - '>='
172
151
  - !ruby/object:Gem::Version
173
152
  version: '0'
174
153
  - !ruby/object:Gem::Dependency
175
154
  name: user_config
176
155
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
156
  requirements:
179
- - - ! '>='
157
+ - - '>='
180
158
  - !ruby/object:Gem::Version
181
159
  version: '0'
182
160
  type: :runtime
183
161
  prerelease: false
184
162
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
163
  requirements:
187
- - - ! '>='
164
+ - - '>='
188
165
  - !ruby/object:Gem::Version
189
166
  version: '0'
190
167
  - !ruby/object:Gem::Dependency
191
168
  name: chronic
192
169
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
170
  requirements:
195
- - - ! '>='
171
+ - - '>='
196
172
  - !ruby/object:Gem::Version
197
173
  version: '0'
198
174
  type: :runtime
199
175
  prerelease: false
200
176
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
177
  requirements:
203
- - - ! '>='
178
+ - - '>='
204
179
  - !ruby/object:Gem::Version
205
180
  version: '0'
206
181
  description: a lightweight remote chef-solo runner
@@ -221,38 +196,40 @@ files:
221
196
  - bin/mofa
222
197
  - config.yml.erb
223
198
  - lib/mofa.rb
199
+ - lib/mofa/attributes_map.rb
224
200
  - lib/mofa/cli.rb
225
201
  - lib/mofa/config.rb
226
202
  - lib/mofa/cookbook.rb
227
203
  - lib/mofa/hostlist.rb
228
204
  - lib/mofa/mofa_cmd.rb
205
+ - lib/mofa/mofa_yml.rb
229
206
  - lib/mofa/released_cookbook.rb
230
207
  - lib/mofa/runlist_map.rb
231
208
  - lib/mofa/source_cookbook.rb
232
209
  - lib/mofa/version.rb
233
210
  - mofa.gemspec
234
- homepage: https://github.com/birka/mofa
211
+ homepage: https://github.com/pingworks/mofa
235
212
  licenses: []
213
+ metadata: {}
236
214
  post_install_message:
237
215
  rdoc_options: []
238
216
  require_paths:
239
217
  - lib
240
218
  required_ruby_version: !ruby/object:Gem::Requirement
241
- none: false
242
219
  requirements:
243
- - - ! '>='
220
+ - - '>='
244
221
  - !ruby/object:Gem::Version
245
222
  version: '0'
246
223
  required_rubygems_version: !ruby/object:Gem::Requirement
247
- none: false
248
224
  requirements:
249
- - - ! '>='
225
+ - - '>='
250
226
  - !ruby/object:Gem::Version
251
227
  version: '0'
252
228
  requirements: []
253
229
  rubyforge_project: mofa
254
- rubygems_version: 1.8.23
230
+ rubygems_version: 2.4.6
255
231
  signing_key:
256
- specification_version: 3
232
+ specification_version: 4
257
233
  summary: a lightweight remote chef-solo runner
258
234
  test_files: []
235
+ has_rdoc: