nitos_testbed_rc 1.0.0.pre.4 → 1.0.0.pre.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|