metasploit_data_models 0.7.0 → 0.11.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.travis.yml +1 -0
- data/app/models/mdm/host.rb +352 -26
- data/app/models/mdm/loot.rb +72 -7
- data/app/models/mdm/{module_action.rb → module/action.rb} +3 -3
- data/app/models/mdm/{module_arch.rb → module/arch.rb} +3 -3
- data/app/models/mdm/{module_author.rb → module/author.rb} +3 -3
- data/app/models/mdm/module/detail.rb +280 -0
- data/app/models/mdm/{module_mixin.rb → module/mixin.rb} +3 -3
- data/app/models/mdm/{module_platform.rb → module/platform.rb} +3 -3
- data/app/models/mdm/module/ref.rb +48 -0
- data/app/models/mdm/{module_target.rb → module/target.rb} +3 -3
- data/app/models/mdm/note.rb +61 -6
- data/app/models/mdm/ref.rb +39 -1
- data/app/models/mdm/service.rb +85 -7
- data/app/models/mdm/session.rb +100 -6
- data/app/models/mdm/vuln.rb +104 -24
- data/db/migrate/20130228214900_change_required_columns_to_null_false_in_web_vulns.rb +1 -17
- data/db/migrate/20130412154159_change_foreign_key_in_module_actions.rb +25 -0
- data/db/migrate/20130412171844_change_foreign_key_in_module_archs.rb +25 -0
- data/db/migrate/20130412173121_change_foreign_key_in_module_authors.rb +25 -0
- data/db/migrate/20130412173640_change_foreign_key_in_module_mixins.rb +25 -0
- data/db/migrate/20130412174254_change_foreign_key_in_module_platforms.rb +25 -0
- data/db/migrate/20130412174719_change_foreign_key_in_module_refs.rb +25 -0
- data/db/migrate/20130412175040_change_foreign_key_in_module_targets.rb +25 -0
- data/db/migrate/20130430151353_change_required_columns_to_null_false_in_hosts.rb +11 -0
- data/db/migrate/20130430162145_enforce_address_uniqueness_in_workspace_in_hosts.rb +23 -0
- data/lib/mdm/module.rb +4 -0
- data/lib/metasploit_data_models.rb +1 -0
- data/lib/metasploit_data_models/change_required_columns_to_null_false.rb +23 -0
- data/lib/metasploit_data_models/version.rb +1 -1
- data/spec/app/models/mdm/host_spec.rb +411 -0
- data/spec/app/models/mdm/host_tag_spec.rb +13 -0
- data/spec/app/models/mdm/{module_action_spec.rb → module/action_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_arch_spec.rb → module/arch_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_author_spec.rb → module/author_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_detail_spec.rb → module/detail_spec.rb} +101 -11
- data/spec/app/models/mdm/{module_mixin_spec.rb → module/mixin_spec.rb} +6 -6
- data/spec/app/models/mdm/{module_platform_spec.rb → module/platform_spec.rb} +6 -6
- data/spec/app/models/mdm/module/ref_spec.rb +62 -0
- data/spec/app/models/mdm/{module_target_spec.rb → module/target_spec.rb} +6 -6
- data/spec/app/models/mdm/ref_spec.rb +62 -0
- data/spec/app/models/mdm/tag_spec.rb +13 -0
- data/spec/app/models/mdm/vuln_ref_spec.rb +13 -0
- data/spec/app/models/mdm/vuln_spec.rb +231 -0
- data/spec/dummy/db/schema.rb +20 -20
- data/spec/factories/mdm/host_tags.rb +9 -0
- data/spec/factories/mdm/hosts.rb +65 -0
- data/spec/factories/mdm/module/actions.rb +14 -0
- data/spec/factories/mdm/module/archs.rb +14 -0
- data/spec/factories/mdm/{module_authors.rb → module/authors.rb} +4 -4
- data/spec/factories/mdm/module/details.rb +66 -0
- data/spec/factories/mdm/module/mixins.rb +14 -0
- data/spec/factories/mdm/module/platforms.rb +14 -0
- data/spec/factories/mdm/module/refs.rb +14 -0
- data/spec/factories/mdm/{module_targets.rb → module/targets.rb} +3 -3
- data/spec/factories/mdm/refs.rb +9 -0
- data/spec/factories/mdm/tags.rb +14 -0
- data/spec/factories/mdm/vuln_refs.rb +4 -0
- data/spec/factories/mdm/vulns.rb +20 -0
- metadata +78 -45
- data/app/models/mdm/module_detail.rb +0 -59
- data/app/models/mdm/module_ref.rb +0 -24
- data/spec/app/models/mdm/module_ref_spec.rb +0 -38
- data/spec/factories/mdm/module_actions.rb +0 -14
- data/spec/factories/mdm/module_archs.rb +0 -14
- data/spec/factories/mdm/module_details.rb +0 -9
- data/spec/factories/mdm/module_mixins.rb +0 -14
- data/spec/factories/mdm/module_platforms.rb +0 -14
- data/spec/factories/mdm/module_refs.rb +0 -14
@@ -0,0 +1,231 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mdm::Vuln do
|
4
|
+
subject(:vuln) do
|
5
|
+
FactoryGirl.build(:mdm_vuln)
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'associations' do
|
9
|
+
it { should belong_to(:host).class_name('Mdm::Host') }
|
10
|
+
it { should belong_to(:service).class_name('Mdm::Service') }
|
11
|
+
it { should have_many(:module_refs).class_name('Mdm::Module::Ref').through(:refs) }
|
12
|
+
# @todo https://www.pivotaltracker.com/story/show/49004623
|
13
|
+
it { should have_many(:refs).class_name('Mdm::Ref').through(:vulns_refs) }
|
14
|
+
it { should have_many(:vuln_attempts).class_name('Mdm::VulnAttempt').dependent(:destroy) }
|
15
|
+
it { should have_many(:vuln_details).class_name('Mdm::VulnDetail').dependent(:destroy) }
|
16
|
+
# @todo https://www.pivotaltracker.com/story/show/49004623
|
17
|
+
it { should have_many(:vulns_refs).class_name('Mdm::VulnRef').dependent(:destroy) }
|
18
|
+
|
19
|
+
context 'module_details' do
|
20
|
+
it { should have_many(:module_details).class_name('Mdm::Module::Detail').through(:module_refs) }
|
21
|
+
|
22
|
+
context 'with Mdm::Refs' do
|
23
|
+
let(:names) do
|
24
|
+
2.times.collect {
|
25
|
+
FactoryGirl.generate :mdm_ref_name
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
let!(:refs) do
|
30
|
+
names.collect do |name|
|
31
|
+
FactoryGirl.create(:mdm_ref, :name => name)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with Mdm::VulnRefs' do
|
36
|
+
let!(:vuln_refs) do
|
37
|
+
refs.collect { |ref|
|
38
|
+
FactoryGirl.create(:mdm_vuln_ref, :ref => ref, :vuln => vuln)
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'with Mdm::Module::Detail' do
|
43
|
+
let!(:module_detail) do
|
44
|
+
FactoryGirl.create(
|
45
|
+
:mdm_module_detail
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with Mdm::Module::Refs with same names as Mdm::Refs' do
|
50
|
+
let!(:module_refs) do
|
51
|
+
names.each do |name|
|
52
|
+
FactoryGirl.create(
|
53
|
+
:mdm_module_ref,
|
54
|
+
:detail => module_detail,
|
55
|
+
:name => name
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should list unique Mdm::Module::Detail' do
|
61
|
+
vuln.module_details.should =~ [module_detail]
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should have duplicate Mdm::Module::Details if collected through chain' do
|
65
|
+
refs = []
|
66
|
+
|
67
|
+
# @todo https://www.pivotaltracker.com/story/show/49004623
|
68
|
+
vuln.vulns_refs.each do |vuln_ref|
|
69
|
+
refs << vuln_ref.ref
|
70
|
+
end
|
71
|
+
|
72
|
+
module_refs = []
|
73
|
+
|
74
|
+
refs.each do |ref|
|
75
|
+
module_refs += ref.module_refs
|
76
|
+
end
|
77
|
+
|
78
|
+
module_details = []
|
79
|
+
|
80
|
+
module_refs.each do |module_ref|
|
81
|
+
module_details << module_ref.detail
|
82
|
+
end
|
83
|
+
|
84
|
+
vuln.module_details.count.should < module_details.length
|
85
|
+
module_details.uniq.count.should == vuln.module_details.count
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'database' do
|
95
|
+
context 'columns' do
|
96
|
+
it { should have_db_column(:exploited_at).of_type(:datetime) }
|
97
|
+
it { should have_db_column(:host_id).of_type(:integer) }
|
98
|
+
it { should have_db_column(:info).of_type(:string) }
|
99
|
+
it { should have_db_column(:name).of_type(:string) }
|
100
|
+
it { should have_db_column(:service_id).of_type(:integer) }
|
101
|
+
|
102
|
+
context 'counter caches' do
|
103
|
+
it { should have_db_column(:vuln_attempt_count).of_type(:integer).with_options(:default => 0) }
|
104
|
+
it { should have_db_column(:vuln_detail_count).of_type(:integer).with_options(:default => 0) }
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'timestamps' do
|
108
|
+
it { should have_db_column(:created_at).of_type(:datetime) }
|
109
|
+
it { should have_db_column(:updated_at).of_type(:datetime) }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'factories' do
|
115
|
+
context 'mdm_host_vuln' do
|
116
|
+
subject(:mdm_host_vuln) do
|
117
|
+
FactoryGirl.build(:mdm_host_vuln)
|
118
|
+
end
|
119
|
+
|
120
|
+
it { should be_valid }
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'mdm_service_vuln' do
|
124
|
+
subject(:mdm_service_vuln) do
|
125
|
+
FactoryGirl.build(:mdm_service_vuln)
|
126
|
+
end
|
127
|
+
|
128
|
+
it { should be_valid }
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'mdm_vuln' do
|
132
|
+
subject(:mdm_vuln) do
|
133
|
+
FactoryGirl.build(:mdm_vuln)
|
134
|
+
end
|
135
|
+
|
136
|
+
it { should be_valid }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'scopes' do
|
141
|
+
context 'search' do
|
142
|
+
context 'with Mdm::Vuln' do
|
143
|
+
subject(:results) do
|
144
|
+
described_class.search(query)
|
145
|
+
end
|
146
|
+
|
147
|
+
let!(:vuln) do
|
148
|
+
FactoryGirl.create(:mdm_vuln)
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'with Mdm::Ref' do
|
152
|
+
let!(:ref) do
|
153
|
+
FactoryGirl.create(:mdm_ref)
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'with Mdm::VulnRef' do
|
157
|
+
let!(:vuln_ref) do
|
158
|
+
FactoryGirl.create(:mdm_vuln_ref, :ref => ref, :vuln => vuln)
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'with query matching Mdm::Ref#name' do
|
162
|
+
let(:query) do
|
163
|
+
ref.name
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should match Mdm::Vuln' do
|
167
|
+
results.should =~ [vuln]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'with query matching Mdm::Ref#name' do
|
172
|
+
let(:query) do
|
173
|
+
"Not #{ref.name}"
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'should not match Mdm::Vuln' do
|
177
|
+
results.should be_empty
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'without Mdm::VulnRef' do
|
183
|
+
context 'with query matching Mdm::Vuln#name' do
|
184
|
+
let(:query) do
|
185
|
+
vuln.name
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should match Mdm::Vuln' do
|
189
|
+
results.should =~ [vuln]
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context 'with query not matching Mdm::Vuln#name' do
|
194
|
+
let(:query) do
|
195
|
+
"Not #{vuln.name}"
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'should not match Mdm::Vuln' do
|
199
|
+
results.should be_empty
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'with query matching Mdm::Vuln#info' do
|
204
|
+
let(:query) do
|
205
|
+
vuln.info
|
206
|
+
end
|
207
|
+
|
208
|
+
it 'should match Mdm::Vuln' do
|
209
|
+
results.should =~ [vuln]
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context 'without query matching Mdm::Vuln#info' do
|
214
|
+
let(:query) do
|
215
|
+
"Not #{vuln.info}"
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'should not match Mdm::Vuln' do
|
219
|
+
results.should be_empty
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'validations' do
|
229
|
+
it { should validate_presence_of :name }
|
230
|
+
end
|
231
|
+
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended to check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:version =>
|
14
|
+
ActiveRecord::Schema.define(:version => 20130430162145) do
|
15
15
|
|
16
16
|
create_table "api_keys", :force => true do |t|
|
17
17
|
t.text "token"
|
@@ -135,7 +135,7 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
135
135
|
|
136
136
|
create_table "hosts", :force => true do |t|
|
137
137
|
t.datetime "created_at"
|
138
|
-
t.string "address"
|
138
|
+
t.string "address", :limit => nil, :null => false
|
139
139
|
t.string "mac"
|
140
140
|
t.string "comm"
|
141
141
|
t.string "name"
|
@@ -145,7 +145,7 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
145
145
|
t.string "os_sp"
|
146
146
|
t.string "os_lang"
|
147
147
|
t.string "arch"
|
148
|
-
t.integer "workspace_id"
|
148
|
+
t.integer "workspace_id", :null => false
|
149
149
|
t.datetime "updated_at"
|
150
150
|
t.text "purpose"
|
151
151
|
t.string "info", :limit => 65536
|
@@ -160,12 +160,12 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
160
160
|
t.integer "cred_count", :default => 0
|
161
161
|
end
|
162
162
|
|
163
|
-
add_index "hosts", ["address"], :name => "index_hosts_on_address"
|
164
163
|
add_index "hosts", ["name"], :name => "index_hosts_on_name"
|
165
164
|
add_index "hosts", ["os_flavor"], :name => "index_hosts_on_os_flavor"
|
166
165
|
add_index "hosts", ["os_name"], :name => "index_hosts_on_os_name"
|
167
166
|
add_index "hosts", ["purpose"], :name => "index_hosts_on_purpose"
|
168
167
|
add_index "hosts", ["state"], :name => "index_hosts_on_state"
|
168
|
+
add_index "hosts", ["workspace_id", "address"], :name => "index_hosts_on_workspace_id_and_address", :unique => true
|
169
169
|
|
170
170
|
create_table "hosts_tags", :id => false, :force => true do |t|
|
171
171
|
t.integer "host_id"
|
@@ -224,26 +224,26 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
224
224
|
end
|
225
225
|
|
226
226
|
create_table "module_actions", :force => true do |t|
|
227
|
-
t.integer "
|
227
|
+
t.integer "detail_id"
|
228
228
|
t.text "name"
|
229
229
|
end
|
230
230
|
|
231
|
-
add_index "module_actions", ["
|
231
|
+
add_index "module_actions", ["detail_id"], :name => "index_module_actions_on_module_detail_id"
|
232
232
|
|
233
233
|
create_table "module_archs", :force => true do |t|
|
234
|
-
t.integer "
|
234
|
+
t.integer "detail_id"
|
235
235
|
t.text "name"
|
236
236
|
end
|
237
237
|
|
238
|
-
add_index "module_archs", ["
|
238
|
+
add_index "module_archs", ["detail_id"], :name => "index_module_archs_on_module_detail_id"
|
239
239
|
|
240
240
|
create_table "module_authors", :force => true do |t|
|
241
|
-
t.integer "
|
241
|
+
t.integer "detail_id"
|
242
242
|
t.text "name"
|
243
243
|
t.text "email"
|
244
244
|
end
|
245
245
|
|
246
|
-
add_index "module_authors", ["
|
246
|
+
add_index "module_authors", ["detail_id"], :name => "index_module_authors_on_module_detail_id"
|
247
247
|
|
248
248
|
create_table "module_details", :force => true do |t|
|
249
249
|
t.datetime "mtime"
|
@@ -269,34 +269,34 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
269
269
|
add_index "module_details", ["refname"], :name => "index_module_details_on_refname"
|
270
270
|
|
271
271
|
create_table "module_mixins", :force => true do |t|
|
272
|
-
t.integer "
|
272
|
+
t.integer "detail_id"
|
273
273
|
t.text "name"
|
274
274
|
end
|
275
275
|
|
276
|
-
add_index "module_mixins", ["
|
276
|
+
add_index "module_mixins", ["detail_id"], :name => "index_module_mixins_on_module_detail_id"
|
277
277
|
|
278
278
|
create_table "module_platforms", :force => true do |t|
|
279
|
-
t.integer "
|
279
|
+
t.integer "detail_id"
|
280
280
|
t.text "name"
|
281
281
|
end
|
282
282
|
|
283
|
-
add_index "module_platforms", ["
|
283
|
+
add_index "module_platforms", ["detail_id"], :name => "index_module_platforms_on_module_detail_id"
|
284
284
|
|
285
285
|
create_table "module_refs", :force => true do |t|
|
286
|
-
t.integer "
|
286
|
+
t.integer "detail_id"
|
287
287
|
t.text "name"
|
288
288
|
end
|
289
289
|
|
290
|
-
add_index "module_refs", ["
|
290
|
+
add_index "module_refs", ["detail_id"], :name => "index_module_refs_on_module_detail_id"
|
291
291
|
add_index "module_refs", ["name"], :name => "index_module_refs_on_name"
|
292
292
|
|
293
293
|
create_table "module_targets", :force => true do |t|
|
294
|
-
t.integer "
|
294
|
+
t.integer "detail_id"
|
295
295
|
t.integer "index"
|
296
296
|
t.text "name"
|
297
297
|
end
|
298
298
|
|
299
|
-
add_index "module_targets", ["
|
299
|
+
add_index "module_targets", ["detail_id"], :name => "index_module_targets_on_module_detail_id"
|
300
300
|
|
301
301
|
create_table "nexpose_consoles", :force => true do |t|
|
302
302
|
t.datetime "created_at", :null => false
|
@@ -596,7 +596,7 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
596
596
|
|
597
597
|
create_table "wmap_requests", :force => true do |t|
|
598
598
|
t.string "host"
|
599
|
-
t.string "address"
|
599
|
+
t.string "address", :limit => nil
|
600
600
|
t.integer "port"
|
601
601
|
t.integer "ssl"
|
602
602
|
t.string "meth", :limit => 32
|
@@ -613,7 +613,7 @@ ActiveRecord::Schema.define(:version => 20130423211152) do
|
|
613
613
|
|
614
614
|
create_table "wmap_targets", :force => true do |t|
|
615
615
|
t.string "host"
|
616
|
-
t.string "address"
|
616
|
+
t.string "address", :limit => nil
|
617
617
|
t.integer "port"
|
618
618
|
t.integer "ssl"
|
619
619
|
t.integer "selected"
|
data/spec/factories/mdm/hosts.rb
CHANGED
@@ -10,9 +10,74 @@ FactoryGirl.define do
|
|
10
10
|
#
|
11
11
|
address { generate :mdm_ipv4_address }
|
12
12
|
name { generate :mdm_host_name }
|
13
|
+
|
14
|
+
factory :full_mdm_host do
|
15
|
+
arch { generate :mdm_host_arch }
|
16
|
+
comm { generate :mdm_host_comm }
|
17
|
+
comments { generate :mdm_host_comments }
|
18
|
+
info { generate :mdm_host_info }
|
19
|
+
mac { generate :mdm_host_mac }
|
20
|
+
os_flavor { generate :mdm_host_os_flavor }
|
21
|
+
os_lang { generate :mdm_host_os_lang }
|
22
|
+
os_name { generate :mdm_host_os_name }
|
23
|
+
os_sp { generate :mdm_host_os_sp }
|
24
|
+
purpose { generate :mdm_host_purpose }
|
25
|
+
scope { generate :mdm_host_scope }
|
26
|
+
state { generate :mdm_host_state }
|
27
|
+
virtual_host { generate :mdm_host_virtual_host }
|
28
|
+
end
|
13
29
|
end
|
14
30
|
|
15
31
|
sequence :mdm_host_name do |n|
|
16
32
|
"mdm_host_#{n}"
|
17
33
|
end
|
34
|
+
|
35
|
+
sequence :mdm_host_arch, Mdm::Host::ARCHITECTURES.cycle
|
36
|
+
|
37
|
+
sequence :mdm_host_comm do |n|
|
38
|
+
"Mdm::Host#comm #{n}"
|
39
|
+
end
|
40
|
+
|
41
|
+
sequence :mdm_host_comments do |n|
|
42
|
+
"Mdm::Host#comments #{n}"
|
43
|
+
end
|
44
|
+
|
45
|
+
sequence :mdm_host_info do |n|
|
46
|
+
"Mdm::Host#info #{n}"
|
47
|
+
end
|
48
|
+
|
49
|
+
sequence :mdm_host_mac do |n|
|
50
|
+
without_separators = "%012X" % n
|
51
|
+
octet_strings = without_separators.scan(/.{2}/)
|
52
|
+
formatted = octet_strings.join(':')
|
53
|
+
|
54
|
+
formatted
|
55
|
+
end
|
56
|
+
|
57
|
+
sequence :mdm_host_os_flavor do |n|
|
58
|
+
"Mdm::Host#os_flavor #{n}"
|
59
|
+
end
|
60
|
+
|
61
|
+
sequence :mdm_host_os_lang do |n|
|
62
|
+
"Mdm::Host#os_lang #{n}"
|
63
|
+
end
|
64
|
+
|
65
|
+
sequence :mdm_host_os_name, Mdm::Host::OPERATING_SYSTEM_NAMES.cycle
|
66
|
+
|
67
|
+
sequence :mdm_host_os_sp do |n|
|
68
|
+
"Mdm::Host#os_sp #{n}"
|
69
|
+
end
|
70
|
+
|
71
|
+
sequence :mdm_host_purpose do |n|
|
72
|
+
"Mdm::Host#purpose #{n}"
|
73
|
+
end
|
74
|
+
|
75
|
+
sequence :mdm_host_scope do |n|
|
76
|
+
n.to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
sequence :mdm_host_state, Mdm::Host::STATES.cycle
|
80
|
+
|
81
|
+
virtual_hosts = ['VMWare', 'QEMU', 'XEN']
|
82
|
+
sequence :mdm_host_virtual_host, virtual_hosts.cycle
|
18
83
|
end
|