omf_rc_shm 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +56 -45
- data/config/config.yml +29 -0
- data/config/scheduled_app.rb +23 -0
- data/lib/omf_rc/resource_proxy/scheduled_application.rb +12 -6
- data/lib/omf_rc/resource_proxy/shm_node.rb +1 -1
- data/lib/omf_rc_shm/version.rb +1 -1
- metadata +4 -4
- data/config/rc.yml.sample +0 -20
- data/config/test.rb +0 -25
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MmNiYWI3NTM2N2I0ZGRiMDNhZDc2MTY2ODM2MzM5ZTQ0YjgxMDBlMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MWMzN2M1OWQyNzJlOGE3NGNmNDVhMWI1YWE5NWM1NGU4YmU4MWM3Ng==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZmY2ZjdhZjhmNTVlNTg0Y2QzMzVjZTFiMGY3NDBmODY3MTk3N2Y4NzNjMjU4
|
10
|
+
ZWMwZmIxYTQzZjU4ODkyNTI4OGZmZmZlMGJhMmFiNDJiZjMxYWE2MDMwMDBj
|
11
|
+
YmUxYWU0M2E3OGFhZTQ3MjM4ZDgyODBmNjc1ZWNhZjVkMDFhNDQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWQ4NjJhYzU5ODBjNDE4MWVkNjQ1NDRlNmM2NDBjMDdlNDM0NDlhOTY1YTQ1
|
14
|
+
OTFhYTg3YWZmODYwNDIxYmI5NWQ4OTNkZjZiNmNhOTljNmRjM2Q5MDk3ODRk
|
15
|
+
ZTM3OGE2YzYzMWIxN2M2OTMyMjk3Yjg4YTlkNDhlMmY0MDJmMWI=
|
data/README.md
CHANGED
@@ -1,80 +1,91 @@
|
|
1
1
|
# OmfRcShm
|
2
2
|
|
3
|
-
An extension to
|
3
|
+
An extension to the OMF RC, which provides support for the Structure Health Monitoring (SHM) project.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
Install it as:
|
8
8
|
|
9
|
-
$ gem install omf_rc_shm
|
9
|
+
$ gem install omf_rc_shm --no-ri --no-rdoc
|
10
|
+
|
11
|
+
(if the above command returns that it cannot download data from https://rubygems.org, then try again with the additional option `--source http://rubygems.org` and discard any subsequent SSL warning)
|
10
12
|
|
11
13
|
Setup startup script
|
12
14
|
|
13
15
|
$ install_omf_rc -c -i
|
14
16
|
|
15
|
-
|
17
|
+
This installs a generic OMF RC configuration file in `/etc/omf_rc/config.yml`, you should modify it following the [SHM-specific configuration example](config/config.yml):
|
16
18
|
|
17
19
|
---
|
18
|
-
:uri:
|
20
|
+
:uri: local://local
|
19
21
|
:environment: production
|
22
|
+
:debug: false
|
20
23
|
|
21
24
|
:resources:
|
22
25
|
- :type: shm_node
|
23
|
-
:uid: <%=
|
24
|
-
:app_definition_file:
|
26
|
+
:uid: <%= ip = `ifconfig br0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1].split('.') ; 'node' + (ip[2].to_i*256+ip[3].to_i).to_s.rjust(4,'0') %>
|
27
|
+
:app_definition_file: /etc/omf_rc/scheduled_app.rb
|
28
|
+
:ruby_path: /usr/local/bin/ruby
|
29
|
+
:watchdog_timer: 15
|
30
|
+
|
25
31
|
:add_default_factories: false
|
26
32
|
:factories:
|
27
33
|
- :require: omf_rc_shm
|
28
34
|
|
35
|
+
Where
|
36
|
+
|
37
|
+
* `:uri:` is the URI for the communication scheme to use, e.g. `local://local` (= no communication) or `xmpp://user:password@some.xmpp.server` (= use XMPP server at some.xmpp.server)
|
38
|
+
* `:uid:` is the ID given to this resource (e.g. the above example constructs an ID similar to 'node1234' based on the IP address of the 'br0' interface)
|
39
|
+
* `:app_definition_file:` is the path to the file with the default application schedule
|
40
|
+
* `:ruby_path:` where to find the ruby binary
|
41
|
+
* `:watchdog_timer:` number of second between each watchdog timer top-up (comment that parameter to disable the watchdog timer)
|
42
|
+
|
29
43
|
## Define applications
|
30
44
|
|
31
|
-
|
45
|
+
The default schedule for the applications to run is in a file located at the path assigned to the above `:app_definition_file:` parameter. You should create such a file following the [default application schedule example](config/scheduled_app.rb):
|
32
46
|
|
33
47
|
Example:
|
34
48
|
|
35
|
-
|
36
|
-
"
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
parameters: {
|
42
|
-
udp_local_host: { cmd: "--udp:local_host", value: "0.0.0.0" }
|
43
|
-
},
|
44
|
-
oml: {
|
45
|
-
experiment: "otr2_#{Time.now.to_i}",
|
46
|
-
id: "otr2",
|
47
|
-
available_mps: [
|
48
|
-
{
|
49
|
-
mp: "udp_in",
|
50
|
-
fields: [
|
51
|
-
{ field: "flow_id", type: :long },
|
52
|
-
{ field: "seq_no", type: :long },
|
53
|
-
{ field: "pkt_length", type: :long },
|
54
|
-
{ field: "dst_host", type: :string },
|
55
|
-
{ field: "dst_port", type: :long }
|
56
|
-
]
|
57
|
-
}
|
58
|
-
],
|
59
|
-
collection: [
|
60
|
-
{
|
61
|
-
url: "tcp://0.0.0.0:3003",
|
62
|
-
streams: [
|
63
|
-
{
|
64
|
-
mp: "udp_in",
|
65
|
-
interval: 3
|
66
|
-
}
|
67
|
-
]
|
68
|
-
}
|
69
|
-
]
|
70
|
-
}
|
49
|
+
defApplication("my_app_name") do |a|
|
50
|
+
a.binary_path = "/usr/bin/my_app"
|
51
|
+
a.schedule = "*/5 * * * *"
|
52
|
+
a.timeout = 20
|
53
|
+
a.parameters = {
|
54
|
+
udp_target_host: { cmd: "--udp-target", value: "0.0.0.0", mandatory: true }
|
71
55
|
}
|
72
|
-
|
56
|
+
a.use_oml = true
|
57
|
+
a.oml = {
|
58
|
+
experiment: "my_experiment_#{Time.now.to_i}",
|
59
|
+
id: "some_ID",
|
60
|
+
collection: [
|
61
|
+
{
|
62
|
+
url: "tcp:0.0.0.0:3003",
|
63
|
+
streams: [
|
64
|
+
{
|
65
|
+
mp: "udp_in", samples: 1
|
66
|
+
}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
]
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
Where
|
73
74
|
|
75
|
+
* `binary_path` is local path to the application's binary
|
76
|
+
* `schedule` is the definition of the schedule to run the application on. It can be either the string 'now' (= run this application as soon as possible) or a cron-type formatted schedule (see [crontab manual](http://www.google.com/search?q=man+crontab))
|
77
|
+
* `timeout` the time in second after which the application should be stopped, set to 0 to let the application stop by itself
|
78
|
+
* `parameters` the list of command line parameters that this application accepts, see the [OMF Documentation](https://github.com/mytestbed/omf/blob/master/doc/APPLICATION_PROXY.mkd#parameter-properties) for more detail
|
79
|
+
* `use_oml` enable OML instrumentation
|
80
|
+
* `oml` OML instrumentation parameters, see the [OML Config Documentation](http://omf.mytestbed.net/doc/oml/latest/liboml2.conf.5) for more detail. NOTE: if the sub-parameter `id:` is missing, the `:uid:` for this resource will be used by default, as requested by the SHM team.
|
81
|
+
|
82
|
+
Additional definition for application to be schedule may be added following the above definition in the same file.
|
74
83
|
|
75
84
|
## Usage
|
76
85
|
|
77
|
-
|
86
|
+
The RC with SHM extension should start up automatically during boot.
|
87
|
+
|
88
|
+
However, if you need to start it manually you may use the command `omf_rc -c <path_to_config_file>`
|
78
89
|
|
79
90
|
## Contributing
|
80
91
|
|
data/config/config.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Use this with standard omf_rc
|
2
|
+
---
|
3
|
+
# URI to the communication system
|
4
|
+
# - local://local for no oustide communication
|
5
|
+
# - xmpp://user:password@some.xmpp.server to use XMPP communication via
|
6
|
+
# some.xmpp.server, using the specified user and password
|
7
|
+
:uri: local://local
|
8
|
+
:environment: production
|
9
|
+
:debug: false
|
10
|
+
|
11
|
+
:resources:
|
12
|
+
- :type: shm_node
|
13
|
+
# ID to give to this SHM node
|
14
|
+
# by default construct 'node1234' ID based on IP address of the br0 interface
|
15
|
+
# as requested by the SHM team
|
16
|
+
:uid: <%= ip = `ifconfig br0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1].split('.') ; 'node' + (ip[2].to_i*256+ip[3].to_i).to_s.rjust(4,'0') %>
|
17
|
+
# Path to the file with the default application schedule
|
18
|
+
:app_definition_file: /etc/omf_rc/scheduled_app.rb
|
19
|
+
# Path to find the Ruby binary
|
20
|
+
:ruby_path: /usr/local/bin/ruby
|
21
|
+
# The top-up value in second for the watchdog timer (must be lower than timeout value)
|
22
|
+
# Comment that line to disable the watchdog timer
|
23
|
+
:watchdog_timer: 15
|
24
|
+
|
25
|
+
:add_default_factories: false # Not loading default type factories
|
26
|
+
|
27
|
+
:factories: # Additional resources which can be created by this RC
|
28
|
+
- :require: omf_rc_shm
|
29
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
defApplication("my_app_name") do |a|
|
2
|
+
a.binary_path = "/usr/bin/my_app"
|
3
|
+
a.schedule = "*/5 * * * *"
|
4
|
+
a.timeout = 20
|
5
|
+
a.parameters = {
|
6
|
+
udp_target_host: { cmd: "--udp-target", value: "0.0.0.0", mandatory: true }
|
7
|
+
}
|
8
|
+
a.use_oml = true
|
9
|
+
a.oml = {
|
10
|
+
experiment: "my_experiment_#{Time.now.to_i}",
|
11
|
+
id: "some_ID",
|
12
|
+
collection: [
|
13
|
+
{
|
14
|
+
url: "tcp:0.0.0.0:3003",
|
15
|
+
streams: [
|
16
|
+
{
|
17
|
+
mp: "udp_in", samples: 1
|
18
|
+
}
|
19
|
+
]
|
20
|
+
}
|
21
|
+
]
|
22
|
+
}
|
23
|
+
end
|
@@ -32,6 +32,7 @@
|
|
32
32
|
# - :experiment (String) name of the experiment in which this application
|
33
33
|
# is scheduled
|
34
34
|
# - :id (String) OML id to use for this application when it is scheduled
|
35
|
+
# if nil, then use this application's parent id
|
35
36
|
# - parameters (Hash) the command line parameters available for this app.
|
36
37
|
# This hash is of the form: { :param1 => attribut1, ... }
|
37
38
|
# with param1 being the id of this parameter for this Proxy and
|
@@ -82,7 +83,6 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
82
83
|
MAX_PARAMETER_NUMBER = 1000
|
83
84
|
DEFAULT_MANDATORY_PARAMETER = false
|
84
85
|
|
85
|
-
property :ruby_path
|
86
86
|
property :app_id, :default => nil
|
87
87
|
property :description, :default => ''
|
88
88
|
property :binary_path, :default => nil
|
@@ -104,6 +104,8 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
104
104
|
property :file_change_callback, :default => nil
|
105
105
|
property :file_read_offset, :default => {}
|
106
106
|
property :app_log_dir, :default => '/tmp/omf_scheduled_app'
|
107
|
+
property :ruby_path
|
108
|
+
property :parent_id
|
107
109
|
|
108
110
|
# @!macro group_hook
|
109
111
|
#
|
@@ -285,6 +287,7 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
285
287
|
if res.property.state == :scheduled
|
286
288
|
info "Removing cron job for '#{res.property.app_id}'"
|
287
289
|
CronEdit::Crontab.Remove res.property.app_id
|
290
|
+
restart_cron = `/etc/init.d/cron restart` # Vixie Cron on Angstrom requires restart!
|
288
291
|
pid_file = "#{res.property.app_log_dir}/#{res.property.app_id}.pid.log"
|
289
292
|
File.readlines(pid_file).each do |line|
|
290
293
|
begin
|
@@ -319,9 +322,9 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
319
322
|
res.property.schedule = t.strftime("%-M %-H %-d %-m *")
|
320
323
|
end
|
321
324
|
Dir.mkdir(res.property.app_log_dir) if !Dir.exist?(res.property.app_log_dir)
|
322
|
-
stderr_file = "#{res.property.app_log_dir}/#{res.property.app_id}.err.log"
|
323
|
-
stdout_file = "#{res.property.app_log_dir}/#{res.property.app_id}.out.log"
|
324
|
-
pid_file = "#{res.property.app_log_dir}/#{res.property.app_id}.pid.log"
|
325
|
+
stderr_file = "#{res.property.app_log_dir}/#{res.property.app_id}.#{res.uid}.err.log"
|
326
|
+
stdout_file = "#{res.property.app_log_dir}/#{res.property.app_id}.#{res.uid}.out.log"
|
327
|
+
pid_file = "#{res.property.app_log_dir}/#{res.property.app_id}.#{res.uid}.pid.log"
|
325
328
|
File.delete(stderr_file) if File.exist?(stderr_file)
|
326
329
|
File.delete(stdout_file) if File.exist?(stdout_file)
|
327
330
|
File.delete(pid_file) if File.exist?(pid_file)
|
@@ -334,6 +337,7 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
334
337
|
info "Adding cron job for '#{res.property.app_id}' with schedule '#{res.property.schedule}' and command '#{cmd}'"
|
335
338
|
|
336
339
|
CronEdit::Crontab.Add res.property.app_id, "#{res.property.schedule} #{cmd}"
|
340
|
+
restart_cron = `/etc/init.d/cron restart` # Vixie Cron on Angstrom requires restart!
|
337
341
|
res.property.file_change_callback = Proc.new do |modified, added, removed|
|
338
342
|
removed.each do |file|
|
339
343
|
res.property.file_read_offset[file]=nil
|
@@ -348,13 +352,14 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
348
352
|
event_type = "STDOUT"
|
349
353
|
if file.include? ".err.log"
|
350
354
|
event_type = "STDERR"
|
351
|
-
if line.include? "exited with
|
355
|
+
if line.include? "exited with status:"
|
352
356
|
if line.split(":").last.to_i == 0
|
353
357
|
event_type = "DONE.OK"
|
354
358
|
else
|
355
359
|
event_type = "DONE.ERROR"
|
356
360
|
end
|
357
361
|
end
|
362
|
+
event_type = "DONE.OK" if line.include? "killed by signal:"
|
358
363
|
end
|
359
364
|
res.process_event(res, event_type, res.property.app_id, line)
|
360
365
|
end
|
@@ -509,7 +514,8 @@ module OmfRc::ResourceProxy::ScheduledApplication
|
|
509
514
|
o = res.property.oml
|
510
515
|
ofile = "/tmp/#{res.uid}-#{Time.now.to_i}.xml"
|
511
516
|
of = File.open(ofile,'w')
|
512
|
-
|
517
|
+
oid = o.id.nil? ? res.property.parent_id : o.id
|
518
|
+
of << "<omlc experiment='#{o.experiment}' id='#{oid}'>\n"
|
513
519
|
o.collection.each do |c|
|
514
520
|
of << " <collect url='#{c.url}'>\n"
|
515
521
|
c.streams.each do |m|
|
@@ -19,7 +19,7 @@ module OmfRc::ResourceProxy::ShmNode
|
|
19
19
|
|
20
20
|
OmfRcShm.app.definitions.each do |name, app_opts|
|
21
21
|
info "Got definition #{app_opts.inspect}, now schedule them..."
|
22
|
-
opts = app_opts.properties.merge(hrn: name, ruby_path: node.property.ruby_path)
|
22
|
+
opts = app_opts.properties.merge(hrn: name, ruby_path: node.property.ruby_path, parent_id: node.uid)
|
23
23
|
s_app = OmfRc::ResourceFactory.create(:scheduled_application, opts)
|
24
24
|
OmfCommon.el.after(5) do
|
25
25
|
s_app.configure_state(:scheduled)
|
data/lib/omf_rc_shm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omf_rc_shm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NICTA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,8 +108,8 @@ files:
|
|
108
108
|
- README.md
|
109
109
|
- Rakefile
|
110
110
|
- bin/cronjob_app_wrapper
|
111
|
-
- config/
|
112
|
-
- config/
|
111
|
+
- config/config.yml
|
112
|
+
- config/scheduled_app.rb
|
113
113
|
- lib/omf_rc/resource_proxy/scheduled_application.rb
|
114
114
|
- lib/omf_rc/resource_proxy/shm_node.rb
|
115
115
|
- lib/omf_rc_shm.rb
|
data/config/rc.yml.sample
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# Use this with standard omf_rc
|
2
|
-
---
|
3
|
-
:uri: local://local
|
4
|
-
:environment: development
|
5
|
-
:debug: false
|
6
|
-
|
7
|
-
:resources:
|
8
|
-
- :type: shm_node
|
9
|
-
:uid: <%= ip = `ifconfig br0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1].split('.') ; 'node' + (ip[2].to_i*256+ip[3].to_i).to_s.rjust(4,'0') %>
|
10
|
-
:app_definition_file: path_to_your_app_definition_file
|
11
|
-
:ruby_path: <full_path_to_ruby>
|
12
|
-
# Uncomment :watchdog_timer line to start the watchdog time, set the top-up
|
13
|
-
# value in second (make sure to have it lower than timeout value)
|
14
|
-
#:watchdog_timer: 15
|
15
|
-
|
16
|
-
:add_default_factories: false # Not loading default type factories
|
17
|
-
|
18
|
-
:factories: # Additional resources which can be created by this RC
|
19
|
-
- :require: omf_rc_shm
|
20
|
-
|
data/config/test.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
defApplication("otr2") do |a|
|
2
|
-
a.schedule = "* * * * *"
|
3
|
-
a.timeout = 20
|
4
|
-
a.binary_path = "/usr/bin/otr2"
|
5
|
-
a.use_oml = true
|
6
|
-
a.parameters = {
|
7
|
-
udp_local_host: { cmd: "--udp:local_host", value: "0.0.0.0" }
|
8
|
-
}
|
9
|
-
a.oml = {
|
10
|
-
experiment: "otr2_#{Time.now.to_i}",
|
11
|
-
id: "otr2",
|
12
|
-
collection: [
|
13
|
-
{
|
14
|
-
url: "tcp:0.0.0.0:3003",
|
15
|
-
streams: [
|
16
|
-
{
|
17
|
-
mp: "udp_in",
|
18
|
-
interval: 3
|
19
|
-
}
|
20
|
-
]
|
21
|
-
}
|
22
|
-
]
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|