nitos_testbed_rc 1.0.0.pre.4 → 1.0.0.pre.5
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.
- data/bin/cm_proxy +122 -66
- data/bin/frisbee_proxy +120 -64
- data/bin/install_ntrc +3 -1
- data/bin/omf6 +380 -201
- data/etc/cm_proxy_conf.yaml +5 -0
- data/etc/frisbee_proxy_conf.yaml +3 -0
- data/lib/nitos_testbed_rc/cm_factory.rb +113 -67
- data/lib/nitos_testbed_rc/frisbee.rb +13 -6
- data/lib/nitos_testbed_rc/imagezip_client.rb +16 -14
- data/lib/nitos_testbed_rc/imagezip_server.rb +5 -3
- data/lib/nitos_testbed_rc/user.rb +118 -32
- data/lib/nitos_testbed_rc/user_factory.rb +1 -1
- data/lib/version.rb +1 -1
- data/nitos_testbed_rc.gemspec +2 -2
- metadata +7 -7
data/etc/cm_proxy_conf.yaml
CHANGED
@@ -9,9 +9,14 @@
|
|
9
9
|
:entity_cert: /root/.omf/cm_factory.pem
|
10
10
|
:entity_key: /root/.omf/cm_factory.pkey
|
11
11
|
|
12
|
+
# URL for the rest interface of the broker
|
13
|
+
:broker_url: https://nitlab.inf.uth.gr:8001
|
14
|
+
|
12
15
|
#time (in seconds) before timeout error occurs
|
13
16
|
:timeout: 80
|
17
|
+
|
14
18
|
#operation mode for OmfCommon.init (development, production, etc)
|
15
19
|
:operationMode: development
|
20
|
+
|
16
21
|
#testbed xmpp topic
|
17
22
|
:testbedTopic: am_controller
|
data/etc/frisbee_proxy_conf.yaml
CHANGED
@@ -9,6 +9,9 @@
|
|
9
9
|
:entity_cert: /root/.omf/frisbee_factory.pem
|
10
10
|
:entity_key: /root/.omf/frisbee_factory.pkey
|
11
11
|
|
12
|
+
# URL for the rest interface of the broker
|
13
|
+
:broker_url: https://nitlab.inf.uth.gr:8001
|
14
|
+
|
12
15
|
#operation Mode for OmfCommon.init (development, production, etc)
|
13
16
|
:operationMode: development
|
14
17
|
|
@@ -29,8 +29,8 @@ module OmfRc::ResourceProxy::CMFactory
|
|
29
29
|
next
|
30
30
|
end
|
31
31
|
nod = {}
|
32
|
-
nod[:node_name] = value.node[:
|
33
|
-
value.node[:
|
32
|
+
nod[:node_name] = value.node[:name]
|
33
|
+
value.node[:interfaces].each do |i|
|
34
34
|
if i[:role] == "control"
|
35
35
|
nod[:node_ip] = i[:ip][:address]
|
36
36
|
nod[:node_mac] = i[:mac]
|
@@ -38,7 +38,7 @@ module OmfRc::ResourceProxy::CMFactory
|
|
38
38
|
nod[:node_cm_ip] = i[:ip][:address]
|
39
39
|
end
|
40
40
|
end
|
41
|
-
nod[:node_cm_ip] = value.node[:
|
41
|
+
nod[:node_cm_ip] = value.node[:cmc][:ip][:address]
|
42
42
|
# nod = {node_name: "node1", node_ip: "10.0.0.1", node_mac: "00-03-1d-0d-4b-96", node_cm_ip: "10.0.0.101"}
|
43
43
|
|
44
44
|
case value[:status].to_sym
|
@@ -53,65 +53,6 @@ module OmfRc::ResourceProxy::CMFactory
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
work("wait_until_ping") do |res, ip|
|
57
|
-
t = 0
|
58
|
-
resp = false
|
59
|
-
loop do
|
60
|
-
sleep 2
|
61
|
-
status = system("ping #{ip} -c 2 -w 2")
|
62
|
-
if t < @timeout
|
63
|
-
if status == true
|
64
|
-
resp = true
|
65
|
-
break
|
66
|
-
end
|
67
|
-
else
|
68
|
-
resp = false
|
69
|
-
break
|
70
|
-
end
|
71
|
-
t += 2
|
72
|
-
end
|
73
|
-
resp
|
74
|
-
end
|
75
|
-
|
76
|
-
work("wait_until_no_ping") do |res, ip|
|
77
|
-
t = 0
|
78
|
-
resp = false
|
79
|
-
loop do
|
80
|
-
sleep 2
|
81
|
-
status = system("ping #{ip} -c 2 -w 2")
|
82
|
-
if t < @timeout
|
83
|
-
if status == false
|
84
|
-
resp = true
|
85
|
-
break
|
86
|
-
end
|
87
|
-
else
|
88
|
-
resp = false
|
89
|
-
break
|
90
|
-
end
|
91
|
-
t += 2
|
92
|
-
end
|
93
|
-
resp
|
94
|
-
end
|
95
|
-
|
96
|
-
#this is used by other methods in this scope
|
97
|
-
work("get_status") do |res, node|
|
98
|
-
debug "http://#{node[:node_cm_ip].to_s}/state"
|
99
|
-
doc = Nokogiri::XML(open("http://#{node[:node_cm_ip].to_s}/state"))
|
100
|
-
resp = doc.xpath("//Response//line//value").text.strip
|
101
|
-
debug "state response: #{resp}"
|
102
|
-
|
103
|
-
if resp == 'on'
|
104
|
-
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
105
|
-
if File.exists?("#{symlink_name}")
|
106
|
-
:on_pxe
|
107
|
-
else
|
108
|
-
:on
|
109
|
-
end
|
110
|
-
elsif resp == 'off'
|
111
|
-
:off
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
56
|
#this is used by the get status call
|
116
57
|
work("status") do |res, node|
|
117
58
|
debug "Status url: http://#{node[:node_cm_ip].to_s}/state"
|
@@ -127,14 +68,22 @@ module OmfRc::ResourceProxy::CMFactory
|
|
127
68
|
next
|
128
69
|
end
|
129
70
|
|
71
|
+
ans = doc.xpath("//Response//line//value").text
|
72
|
+
ans.strip!
|
73
|
+
|
130
74
|
res.inform(:status, {
|
131
|
-
current: "#{
|
75
|
+
current: "#{ans}",
|
132
76
|
node_name: "#{node[:node_name].to_s}"
|
133
77
|
}, :ALL)
|
134
78
|
sleep 1 #this solves the getting stuck problem.
|
135
79
|
end
|
136
80
|
|
137
81
|
work("start_node") do |res, node, wait|
|
82
|
+
node[:node_mac] = node[:node_mac].downcase.gsub(/:/, '-')
|
83
|
+
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
84
|
+
if File.exists?(symlink_name)
|
85
|
+
File.delete(symlink_name)
|
86
|
+
end
|
138
87
|
debug "Start_node url: http://#{node[:node_cm_ip].to_s}/on"
|
139
88
|
begin
|
140
89
|
doc = Nokogiri::XML(open("http://#{node[:node_cm_ip].to_s}/on"))
|
@@ -143,17 +92,26 @@ module OmfRc::ResourceProxy::CMFactory
|
|
143
92
|
event_type: "HTTP",
|
144
93
|
exit_code: "-1",
|
145
94
|
node_name: "#{node[:node_name].to_s}",
|
146
|
-
msg: "failed to reach cm, ip: #{node[:node_cm_ip].to_s}."
|
95
|
+
msg: "#{node[:name]} failed to reach cm, ip: #{node[:node_cm_ip].to_s}."
|
147
96
|
}, :ALL)
|
148
97
|
next
|
149
98
|
end
|
150
99
|
|
151
|
-
|
100
|
+
ans = doc.xpath("//Response").text
|
101
|
+
ans.strip!
|
102
|
+
|
103
|
+
if ans == 'ok'
|
152
104
|
res.inform(:status, {
|
153
105
|
node_name: "#{node[:node_name].to_s}",
|
154
106
|
current: :booting,
|
155
107
|
desired: :running
|
156
108
|
}, :ALL)
|
109
|
+
elsif ans == 'already on'
|
110
|
+
res.inform(:status, {
|
111
|
+
node_name: "#{node[:node_name].to_s}",
|
112
|
+
current: :running,
|
113
|
+
desired: :running
|
114
|
+
}, :ALL)
|
157
115
|
end
|
158
116
|
|
159
117
|
if wait
|
@@ -176,6 +134,11 @@ module OmfRc::ResourceProxy::CMFactory
|
|
176
134
|
end
|
177
135
|
|
178
136
|
work("stop_node") do |res, node, wait|
|
137
|
+
node[:node_mac] = node[:node_mac].downcase.gsub(/:/, '-')
|
138
|
+
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
139
|
+
if File.exists?(symlink_name)
|
140
|
+
File.delete(symlink_name)
|
141
|
+
end
|
179
142
|
begin
|
180
143
|
debug "Shutting down node '#{node[:node_name]}' through ssh."
|
181
144
|
ssh = Net::SSH.start(node[:node_ip], 'root')#, :password => @password)
|
@@ -192,12 +155,22 @@ module OmfRc::ResourceProxy::CMFactory
|
|
192
155
|
debug "ssh failed, using CM card instead."
|
193
156
|
debug "Stop_node url: http://#{node[:node_cm_ip].to_s}/off"
|
194
157
|
doc = Nokogiri::XML(open("http://#{node[:node_cm_ip].to_s}/off"))
|
195
|
-
|
158
|
+
|
159
|
+
ans = doc.xpath("//Response").text
|
160
|
+
ans.strip!
|
161
|
+
|
162
|
+
if ans == 'ok'
|
196
163
|
res.inform(:status, {
|
197
164
|
node_name: "#{node[:node_name].to_s}",
|
198
165
|
current: :running,
|
199
166
|
desired: :stopped
|
200
167
|
}, :ALL)
|
168
|
+
elsif ans == 'already off'
|
169
|
+
res.inform(:status, {
|
170
|
+
node_name: "#{node[:node_name].to_s}",
|
171
|
+
current: :stopped,
|
172
|
+
desired: :stopped
|
173
|
+
}, :ALL)
|
201
174
|
end
|
202
175
|
rescue
|
203
176
|
res.inform(:error, {
|
@@ -230,6 +203,11 @@ module OmfRc::ResourceProxy::CMFactory
|
|
230
203
|
end
|
231
204
|
|
232
205
|
work("reset_node") do |res, node, wait|
|
206
|
+
node[:node_mac] = node[:node_mac].downcase.gsub(/:/, '-')
|
207
|
+
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
208
|
+
if File.exists?(symlink_name)
|
209
|
+
File.delete(symlink_name)
|
210
|
+
end
|
233
211
|
begin
|
234
212
|
debug "Rebooting node '#{node[:node_name]}' through ssh."
|
235
213
|
ssh = Net::SSH.start(node[:node_ip], 'root')#, :password => @password)
|
@@ -249,7 +227,7 @@ module OmfRc::ResourceProxy::CMFactory
|
|
249
227
|
if doc.xpath("//Response").text == 'ok'
|
250
228
|
res.inform(:status, {
|
251
229
|
node_name: "#{node[:node_name].to_s}",
|
252
|
-
current: :
|
230
|
+
current: :resetted,
|
253
231
|
desired: :resetted
|
254
232
|
}, :ALL)
|
255
233
|
end
|
@@ -285,6 +263,7 @@ module OmfRc::ResourceProxy::CMFactory
|
|
285
263
|
|
286
264
|
work("start_node_pxe") do |res, node|
|
287
265
|
resp = res.get_status(node)
|
266
|
+
node[:node_mac] = node[:node_mac].downcase.gsub(/:/, '-')
|
288
267
|
if resp == :on
|
289
268
|
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
290
269
|
if !File.exists?("#{symlink_name}")
|
@@ -341,6 +320,11 @@ module OmfRc::ResourceProxy::CMFactory
|
|
341
320
|
desired: :pxe_on
|
342
321
|
}, :ALL)
|
343
322
|
else
|
323
|
+
node[:node_mac] = node[:node_mac].downcase.gsub(/:/, '-')
|
324
|
+
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
325
|
+
if File.exists?(symlink_name)
|
326
|
+
File.delete(symlink_name)
|
327
|
+
end
|
344
328
|
res.inform(:error, {
|
345
329
|
event_type: "TIME_OUT",
|
346
330
|
exit_code: "-1",
|
@@ -352,6 +336,7 @@ module OmfRc::ResourceProxy::CMFactory
|
|
352
336
|
end
|
353
337
|
|
354
338
|
work("start_node_pxe_off") do |res, node, action|
|
339
|
+
node[:node_mac] = node[:node_mac].downcase.gsub(/:/, '-')
|
355
340
|
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
356
341
|
if File.exists?(symlink_name)
|
357
342
|
File.delete(symlink_name)
|
@@ -416,4 +401,65 @@ module OmfRc::ResourceProxy::CMFactory
|
|
416
401
|
end
|
417
402
|
sleep 1
|
418
403
|
end
|
404
|
+
|
405
|
+
#this is used by other methods in this scope
|
406
|
+
work("wait_until_ping") do |res, ip|
|
407
|
+
t = 0
|
408
|
+
resp = false
|
409
|
+
loop do
|
410
|
+
sleep 2
|
411
|
+
status = system("ping #{ip} -c 2 -w 2")
|
412
|
+
if t < @timeout
|
413
|
+
if status == true
|
414
|
+
resp = true
|
415
|
+
break
|
416
|
+
end
|
417
|
+
else
|
418
|
+
resp = false
|
419
|
+
break
|
420
|
+
end
|
421
|
+
t += 2
|
422
|
+
end
|
423
|
+
resp
|
424
|
+
end
|
425
|
+
|
426
|
+
#this is used by other methods in this scope
|
427
|
+
work("wait_until_no_ping") do |res, ip|
|
428
|
+
t = 0
|
429
|
+
resp = false
|
430
|
+
loop do
|
431
|
+
sleep 2
|
432
|
+
status = system("ping #{ip} -c 2 -w 2")
|
433
|
+
if t < @timeout
|
434
|
+
if status == false
|
435
|
+
resp = true
|
436
|
+
break
|
437
|
+
end
|
438
|
+
else
|
439
|
+
resp = false
|
440
|
+
break
|
441
|
+
end
|
442
|
+
t += 2
|
443
|
+
end
|
444
|
+
resp
|
445
|
+
end
|
446
|
+
|
447
|
+
#this is used by other methods in this scope
|
448
|
+
work("get_status") do |res, node|
|
449
|
+
debug "http://#{node[:node_cm_ip].to_s}/state"
|
450
|
+
doc = Nokogiri::XML(open("http://#{node[:node_cm_ip].to_s}/state"))
|
451
|
+
resp = doc.xpath("//Response//line//value").text.strip
|
452
|
+
debug "state response: #{resp}"
|
453
|
+
|
454
|
+
if resp == 'on'
|
455
|
+
symlink_name = "/tftpboot/pxelinux.cfg/01-#{node[:node_mac]}"
|
456
|
+
if File.exists?("#{symlink_name}")
|
457
|
+
:on_pxe
|
458
|
+
else
|
459
|
+
:on
|
460
|
+
end
|
461
|
+
elsif resp == 'off'
|
462
|
+
:off
|
463
|
+
end
|
464
|
+
end
|
419
465
|
end
|
@@ -40,14 +40,14 @@ module OmfRc::ResourceProxy::Frisbee #frisbee client
|
|
40
40
|
next
|
41
41
|
end
|
42
42
|
nod = {}
|
43
|
-
nod[:node_name] = client.opts.node.
|
44
|
-
client.opts.node.
|
43
|
+
nod[:node_name] = client.opts.node.name
|
44
|
+
client.opts.node.interfaces.each do |i|
|
45
45
|
if i[:role] == "control"
|
46
46
|
nod[:node_ip] = i[:ip][:address]
|
47
47
|
nod[:node_mac] = i[:mac]
|
48
48
|
end
|
49
49
|
end
|
50
|
-
nod[:node_cm_ip] = client.opts.node.
|
50
|
+
nod[:node_cm_ip] = client.opts.node.cmc.ip.address
|
51
51
|
#nod = {node_name: "node1", node_ip: "10.0.0.1", node_mac: "00-03-1d-0d-4b-96", node_cm_ip: "10.0.0.101"}
|
52
52
|
client.property.multicast_interface = nod[:node_ip]
|
53
53
|
client.property.app_id = client.hrn.nil? ? client.uid : client.hrn
|
@@ -55,10 +55,11 @@ module OmfRc::ResourceProxy::Frisbee #frisbee client
|
|
55
55
|
command = "#{client.property.binary_path} -i #{client.property.multicast_interface} -m #{client.property.multicast_address} -p #{client.property.port} #{client.property.hardrive}"
|
56
56
|
debug "Executing command #{command}"
|
57
57
|
|
58
|
+
output = ''
|
58
59
|
host = Net::Telnet.new("Host" => client.property.multicast_interface.to_s, "Timeout" => 200, "Prompt" => /[\w().-]*[\$#>:.]\s?(?:\(enable\))?\s*$/)
|
59
60
|
host.cmd(command.to_s) do |c|
|
60
|
-
if c
|
61
|
-
c = c.
|
61
|
+
if c[0,8] == "Progress"
|
62
|
+
c = c.split[1]
|
62
63
|
client.inform(:status, {
|
63
64
|
status_type: 'FRISBEE',
|
64
65
|
event: "STDOUT",
|
@@ -66,6 +67,12 @@ module OmfRc::ResourceProxy::Frisbee #frisbee client
|
|
66
67
|
node: client.property.node_topic,
|
67
68
|
msg: "#{c.to_s}"
|
68
69
|
}, :ALL)
|
70
|
+
elsif c[0,5] == "Wrote"
|
71
|
+
c = c.split("\n")
|
72
|
+
output = "#{c.first}\n#{c.last}"
|
73
|
+
elsif c[0,6] == "\nWrote"
|
74
|
+
c = c.split("\n")
|
75
|
+
output = "#{c[1]}\n#{c.last}"
|
69
76
|
end
|
70
77
|
end
|
71
78
|
|
@@ -74,7 +81,7 @@ module OmfRc::ResourceProxy::Frisbee #frisbee client
|
|
74
81
|
event: "EXIT",
|
75
82
|
app: client.property.app_id,
|
76
83
|
node: client.property.node_topic,
|
77
|
-
msg:
|
84
|
+
msg: output
|
78
85
|
}, :ALL)
|
79
86
|
host.close
|
80
87
|
end
|
@@ -40,8 +40,8 @@ module OmfRc::ResourceProxy::ImagezipClient #Imagezip client
|
|
40
40
|
end
|
41
41
|
|
42
42
|
nod = {}
|
43
|
-
nod[:node_name] = client.opts.node.
|
44
|
-
client.opts.node.
|
43
|
+
nod[:node_name] = client.opts.node.name
|
44
|
+
client.opts.node.interfaces.each do |i|
|
45
45
|
if i[:role] == "control"
|
46
46
|
nod[:node_ip] = i[:ip][:address]
|
47
47
|
nod[:node_mac] = i[:mac]
|
@@ -49,25 +49,27 @@ module OmfRc::ResourceProxy::ImagezipClient #Imagezip client
|
|
49
49
|
nod[:node_cm_ip] = i[:ip][:address]
|
50
50
|
end
|
51
51
|
end
|
52
|
-
nod[:node_cm_ip] = client.opts.node.
|
52
|
+
nod[:node_cm_ip] = client.opts.node.cmc.ip.address
|
53
53
|
|
54
54
|
client.property.app_id = client.hrn.nil? ? client.uid : client.hrn
|
55
55
|
|
56
56
|
command = "#{client.property.binary_path} -o -z1 #{client.property.hardrive} - | /bin/nc -q 0 #{client.property.ip} #{client.property.port}"
|
57
57
|
debug "Executing command #{command}"
|
58
58
|
# nod = {node_name: "node1", node_ip: "10.0.0.1", node_mac: "00-03-1d-0d-4b-96", node_cm_ip: "10.0.0.101"}
|
59
|
-
|
59
|
+
summary = ''
|
60
60
|
host = Net::Telnet.new("Host" => nod[:node_ip], "Timeout" => false)#, "Prompt" => /[\w().-]*[\$#>:.]\s?(?:\(enable\))?\s*$/)
|
61
61
|
host.cmd(command.to_s) do |c|
|
62
|
-
if c.to_s != "\n" && c[0,5] != "\n/usr" && c.to_s != "." && c.to_s != ".." && c.to_s != "..."
|
63
|
-
#puts '
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
62
|
+
# if c.to_s != "\n" && c[0,5] != "\n/usr" && c.to_s != "." && c.to_s != ".." && c.to_s != "..."
|
63
|
+
# puts '---------(' + c.to_s + ')-----------'
|
64
|
+
if c.include? 'compressed'
|
65
|
+
summary = c
|
66
|
+
# client.inform(:status, {
|
67
|
+
# status_type: 'IMAGEZIP',
|
68
|
+
# event: "STDOUT",
|
69
|
+
# app: client.property.app_id,
|
70
|
+
# node: client.property.node_topic,
|
71
|
+
# msg: "#{c.to_s}"
|
72
|
+
# }, :ALL)
|
71
73
|
end
|
72
74
|
end
|
73
75
|
|
@@ -76,7 +78,7 @@ module OmfRc::ResourceProxy::ImagezipClient #Imagezip client
|
|
76
78
|
event: "EXIT",
|
77
79
|
app: client.property.app_id,
|
78
80
|
node: client.property.node_topic,
|
79
|
-
msg:
|
81
|
+
msg: summary
|
80
82
|
}, :ALL)
|
81
83
|
host.close
|
82
84
|
end
|
@@ -25,6 +25,8 @@ module OmfRc::ResourceProxy::ImagezipServer #Imagezip server
|
|
25
25
|
|
26
26
|
hook :after_initial_configured do |server|
|
27
27
|
server.property.app_id = server.hrn.nil? ? server.uid : server.hrn
|
28
|
+
server.property.image_name = server.property.image_name.nil? ? @fconf[:imageDir] + '/' + @fconf[:defaultImage] : server.property.image_name
|
29
|
+
server.property.image_name = server.property.image_name.start_with?('/') ? server.property.image_name : @fconf[:imageDir] + '/' + server.property.image_name
|
28
30
|
|
29
31
|
@app = ExecApp.new(server.property.app_id, server.build_command_line, server.property.map_err_to_out) do |event_type, app_id, msg|
|
30
32
|
server.process_event(server, event_type, app_id, msg)
|
@@ -36,10 +38,10 @@ module OmfRc::ResourceProxy::ImagezipServer #Imagezip server
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def process_event(res, event_type, app_id, msg)
|
39
|
-
logger.info "
|
41
|
+
logger.info "ImagezipServer: App Event from '#{app_id}' - #{event_type}: '#{msg}'"
|
40
42
|
if event_type == 'EXIT' #maybe i should inform you for every event_type, we'll see.
|
41
43
|
res.inform(:status, {
|
42
|
-
status_type: '
|
44
|
+
status_type: 'IMAGEZIP_SERVER',
|
43
45
|
event: event_type.to_s.upcase,
|
44
46
|
app: app_id,
|
45
47
|
exit_code: msg,
|
@@ -47,7 +49,7 @@ module OmfRc::ResourceProxy::ImagezipServer #Imagezip server
|
|
47
49
|
}, :ALL)
|
48
50
|
elsif event_type == 'STDOUT'
|
49
51
|
res.inform(:status, {
|
50
|
-
status_type: '
|
52
|
+
status_type: 'IMAGEZIP_SERVER',
|
51
53
|
event: event_type.to_s.upcase,
|
52
54
|
app: app_id,
|
53
55
|
exit_code: msg,
|
@@ -23,11 +23,29 @@ module OmfRc::ResourceProxy::User
|
|
23
23
|
FileUtils.mkdir_p(path)
|
24
24
|
end
|
25
25
|
|
26
|
-
File.write("#{path}/
|
26
|
+
File.write("#{path}/user_cert.pem", value)
|
27
|
+
|
28
|
+
path = "/home/#{res.property.username}/.omf/etc"
|
29
|
+
unless File.directory?(path)#create the directory if it doesn't exist (it will never exist)
|
30
|
+
FileUtils.mkdir_p(path)
|
31
|
+
end
|
32
|
+
|
33
|
+
conf_file = File.read('/etc/nitos_testbed_rc/omf_script_conf.yaml')
|
34
|
+
conf_file.sub!(' script_user', " #{res.property.username}")
|
35
|
+
conf_file.sub!(' testserver', " #{res.topics.first.address.split('@').last}")
|
36
|
+
|
37
|
+
File.write("#{path}/omf_script_conf.yaml", conf_file)
|
38
|
+
|
39
|
+
cmd = "chown -R #{res.property.username}:#{res.property.username} /home/#{res.property.username}"
|
40
|
+
system(cmd)
|
27
41
|
end
|
28
42
|
|
29
43
|
configure :auth_keys do |res, value|
|
30
|
-
|
44
|
+
path = "/home/#{res.property.username}/.ssh"
|
45
|
+
unless File.directory?(path)#create the directory if it doesn't exist (it will never exist)
|
46
|
+
FileUtils.mkdir_p(path)
|
47
|
+
end
|
48
|
+
File.open("#{path}/authorized_keys", 'w') do |file|
|
31
49
|
value.each do |v|
|
32
50
|
file.puts v
|
33
51
|
end
|
@@ -44,6 +62,73 @@ module OmfRc::ResourceProxy::User
|
|
44
62
|
ExecApp.new(user.property.app_id, user.build_command_line, user.property.map_err_to_out) do |event_type, app_id, msg|
|
45
63
|
user.process_event(user, event_type, app_id, msg)
|
46
64
|
end
|
65
|
+
|
66
|
+
# user.add_user
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
work('add_user') do |user|
|
71
|
+
cmd = "#{user.property.binary_path} -d /home/#{user.property.username} -s /bin/bash #{user.property.username}"
|
72
|
+
puts "exec command: #{cmd}"
|
73
|
+
# result = system(cmd)
|
74
|
+
out = IO.popen(cmd)
|
75
|
+
result = true
|
76
|
+
if result
|
77
|
+
key = OpenSSL::PKey::RSA.new(2048)
|
78
|
+
pub_key = key.public_key
|
79
|
+
path = "/home/#{user.property.username}/.ssh/"
|
80
|
+
unless File.directory?(path)#create the directory if it doesn't exist (it will never exist)
|
81
|
+
FileUtils.mkdir_p(path)
|
82
|
+
end
|
83
|
+
File.write("#{path}/pub_key.pem", pub_key.to_pem)
|
84
|
+
File.write("#{path}/key.pem", key.to_pem)
|
85
|
+
sleep 1
|
86
|
+
user.inform(:status, {
|
87
|
+
status_type: 'APP_EVENT',
|
88
|
+
event: 'EXIT',
|
89
|
+
exit_code: 0,
|
90
|
+
msg: 'User created',
|
91
|
+
uid: user.uid, # do we really need this? Should be identical to 'src'
|
92
|
+
pub_key: pub_key.to_s
|
93
|
+
}, :ALL)
|
94
|
+
else #error returned
|
95
|
+
if $?.exitstatus == 9 #user already exists error
|
96
|
+
path = "/home/#{user.property.username}/.ssh/"
|
97
|
+
|
98
|
+
if File.exists?("#{path}/pub_key.pem") && File.exists?("#{path}/key.pem")#if keys exist just read the pub_key for the inform
|
99
|
+
file = File.open("#{path}/pub_key.pem", "rb")
|
100
|
+
pub_key = file.read
|
101
|
+
file.close
|
102
|
+
else
|
103
|
+
key = OpenSSL::PKey::RSA.new(2048)
|
104
|
+
pub_key = key.public_key
|
105
|
+
path = "/home/#{user.property.username}/.ssh/"
|
106
|
+
unless File.directory?(path)#create the directory if it doesn't exist (it will never exist)
|
107
|
+
FileUtils.mkdir_p(path)
|
108
|
+
end
|
109
|
+
File.write("#{path}/pub_key.pem", pub_key.to_pem)
|
110
|
+
File.write("#{path}/key.pem", key.to_pem)
|
111
|
+
end
|
112
|
+
sleep 1
|
113
|
+
user.inform(:status, {
|
114
|
+
status_type: 'APP_EVENT',
|
115
|
+
event: 'EXIT',
|
116
|
+
exit_code: 0,
|
117
|
+
msg: 'User already exists, ssh keys created.',
|
118
|
+
uid: user.uid, # do we really need this? Should be identical to 'src'
|
119
|
+
pub_key: pub_key.to_s
|
120
|
+
}, :ALL)
|
121
|
+
else
|
122
|
+
user.inform(:status, {
|
123
|
+
status_type: 'APP_EVENT',
|
124
|
+
event: 'EXIT',
|
125
|
+
exit_code: -1,
|
126
|
+
msg: 'User creation failed',
|
127
|
+
uid: user.uid, # do we really need this? Should be identical to 'src'
|
128
|
+
pub_key: pub_key.to_s
|
129
|
+
}, :ALL)
|
130
|
+
end
|
131
|
+
end
|
47
132
|
end
|
48
133
|
|
49
134
|
# This method processes an event coming from the application instance, which
|
@@ -70,18 +155,18 @@ module OmfRc::ResourceProxy::User
|
|
70
155
|
FileUtils.mkdir_p(path)
|
71
156
|
end
|
72
157
|
|
73
|
-
File.write("#{path}/
|
74
|
-
File.write("#{path}/
|
158
|
+
File.write("#{path}/id_rsa.pub", pub_key.to_pem)
|
159
|
+
File.write("#{path}/id_rsa", key.to_pem)
|
75
160
|
|
76
161
|
res.inform(:status, {
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
162
|
+
status_type: 'APP_EVENT',
|
163
|
+
event: event_type.to_s.upcase,
|
164
|
+
app: app_id,
|
165
|
+
exit_code: msg,
|
166
|
+
msg: msg,
|
167
|
+
uid: res.uid, # do we really need this? Should be identical to 'src'
|
168
|
+
pub_key: pub_key.to_pem
|
169
|
+
}, :ALL)
|
85
170
|
else #if msg!=0 then the application failed to complete
|
86
171
|
path = "/home/#{res.property.username}/.ssh/"
|
87
172
|
if File.exists?("#{path}/pub_key.pem") && File.exists?("#{path}/key.pem")#if keys exist just read the pub_key for the inform
|
@@ -98,36 +183,37 @@ module OmfRc::ResourceProxy::User
|
|
98
183
|
FileUtils.mkdir_p(path)
|
99
184
|
end
|
100
185
|
|
101
|
-
File.write("#{path}/
|
102
|
-
File.write("#{path}/
|
186
|
+
File.write("#{path}/id_rsa.pub", pub_key.to_pem)
|
187
|
+
File.write("#{path}/id_rsa", key.to_pem)
|
103
188
|
end
|
104
189
|
res.inform(:status, {
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
190
|
+
status_type: 'APP_EVENT',
|
191
|
+
event: event_type.to_s.upcase,
|
192
|
+
app: app_id,
|
193
|
+
exit_code: msg,
|
194
|
+
msg: msg,
|
195
|
+
uid: res.uid, # do we really need this? Should be identical to 'src'
|
196
|
+
pub_key: pub_key.to_pem
|
197
|
+
}, :ALL)
|
113
198
|
end
|
114
199
|
else
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
200
|
+
# puts "(((((((((((((( error: #{msg} ))))))))))))))))))"
|
201
|
+
# res.inform(:status, {
|
202
|
+
# status_type: 'APP_EVENT',
|
203
|
+
# event: event_type.to_s.upcase,
|
204
|
+
# app: app_id,
|
205
|
+
# msg: msg,
|
206
|
+
# uid: res.uid
|
207
|
+
# }, :ALL)
|
122
208
|
end
|
123
209
|
end
|
124
210
|
|
125
211
|
# Build the command line, which will be used to add a new user.
|
126
212
|
#
|
127
213
|
work('build_command_line') do |res|
|
128
|
-
cmd_line = "env -i " # Start with a 'clean' environment
|
129
|
-
cmd_line
|
130
|
-
cmd_line += "
|
214
|
+
# cmd_line = "env -i " # Start with a 'clean' environment
|
215
|
+
cmd_line = res.property.binary_path + " " # the /usr/sbin/useradd
|
216
|
+
cmd_line += "-d /home/#{res.property.username} -s /bin/bash #{res.property.username}" # the username, -m for adding folder -s for default shell to /bin/bash, removed -d /home/#{res.property.username}
|
131
217
|
cmd_line
|
132
218
|
end
|
133
219
|
end
|
data/lib/version.rb
CHANGED
data/nitos_testbed_rc.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
# specify any dependencies here; for example:
|
22
|
-
s.add_runtime_dependency "omf_common", "~> 6.1.
|
23
|
-
s.add_runtime_dependency "omf_rc", "~> 6.1.
|
22
|
+
s.add_runtime_dependency "omf_common", "~> 6.1.3"
|
23
|
+
s.add_runtime_dependency "omf_rc", "~> 6.1.3"
|
24
24
|
s.add_runtime_dependency "nokogiri", "~> 1.6.0"
|
25
25
|
s.add_development_dependency "net-ssh", "~> 2.8.0"
|
26
26
|
end
|