boinc_drone 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c5739b02a34da53750e57b65f8d3637f8ba05090
4
- data.tar.gz: 90b309e06b5291e9a3e4c45d2d20f8a6418ecfcc
3
+ metadata.gz: 1a0b3edaf818d6f8d699f8888459b25c0de5391d
4
+ data.tar.gz: faeb1bfcd721bbed93b934810ebaac9ab84cf27a
5
5
  SHA512:
6
- metadata.gz: 8033985f2978eb08ab1ff376c55c81547746baa7c156226b986b5c0396f6eb7c28d81dac0682b4e988ebcfa45aeba8b7508935ac04f3934713e169e488d9f775
7
- data.tar.gz: f6d480a79806a355782daf3aefe19657b8870c825d2b658bac2e3c95d57b42b85034b3b30cded061f754dfaf35fb66362fb2baeac9b6718e5eeae2d757cec782
6
+ metadata.gz: 0293eb2091a7ef52f2738bc72412cea48e4760ca19d8f04beec6ed21ad5a1d620814efd6d82c67da0b9291c0a2db9d21ebc0d75d550b31371b62ead5a2afe181
7
+ data.tar.gz: 5a7dece293ac08ffc673d02f9b8d4ba42fefff19a3fb274d77bd2a3f0056b6b1dd6930b334f66b7e627d4aa23e9685caca9929186d9669453b069ef3dd34731d
data/README.md CHANGED
@@ -1,29 +1,214 @@
1
- # BoincDrone
1
+ # boinc_drone
2
+ This script allows the easily deployment of a [Boinc](https://boinc.berkeley.edu) process in a farm where each drone reports back to a main application in JSON.
2
3
 
3
- TODO: Write a gem description
4
+ ## Requirements
5
+ This script leverages the `boinccmd` command and will require that you have the [commandline tool](http://boinc.berkeley.edu/wiki/Boinccmd_tool) installed, configured, and running.
4
6
 
5
7
  ## Installation
8
+ Run this from your terminal:
6
9
 
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'boinc_drone'
10
+ ```bash
11
+ $ gem install "boinc_drone"
12
+ ```
10
13
 
11
14
  And then execute:
12
15
 
13
- $ bundle
14
-
15
- Or install it yourself as:
16
-
17
- $ gem install boinc_drone
16
+ ```bash
17
+ $ boinc_drone -a API_KEY -u WEBHOOK_URL -w WORKER_ID # worker_id is optional, it's included for the app this was made for
18
+ ```
18
19
 
19
20
  ## Usage
21
+ Every 60 seconds this script will read the commandline output of the `boinccmd --get_state` and convert it to some nice JSON and `POST` it to the supplied `WEBHOOK_URL` with `API_KEY` set as an `X-API-KEY` header. If the `POST` fails for any reason it will fail silently and just keep looping.
20
22
 
21
- TODO: Write usage instructions here
23
+ The request body's JSON:
24
+ ```json
25
+ {
26
+ "meta":{
27
+ "worker_id": WORKER_ID
28
+ },
29
+ "projects":[
30
+ {
31
+ "name":"LHC@home 1.0",
32
+ "master_url":"http://lhcathome.cern.ch/lhcathome/",
33
+ "user_name":"Matthew",
34
+ "team_name":"",
35
+ "resource_share":"100.000000",
36
+ "user_total_credit":"1767.307159",
37
+ "user_expavg_credit":"148.063753",
38
+ "host_total_credit":"1767.307159",
39
+ "host_expavg_credit":"148.063766",
40
+ "nrpc_failures":"0",
41
+ "master_fetch_failures":"0",
42
+ "master_fetch_pending":"no",
43
+ "scheduler_rpc_pending":"no",
44
+ "trickle_upload_pending":"no",
45
+ "attached_via_account_manager":"yes",
46
+ "ended":"no",
47
+ "suspended_via_gui":"no",
48
+ "don't_request_more_work":"no",
49
+ "disk_usage":"0.000000",
50
+ "last_rpc":"1405565949.830400",
51
+ "project_files_downloaded":"0.000000"
52
+ }
53
+ ],
54
+ "applications":[
55
+ {
56
+ "name":"sixtrack",
57
+ "project":"LHC@home 1.0"
58
+ }
59
+ ],
60
+ "application_versions":[
61
+ {
62
+ "application":"sixtrack",
63
+ "version":"451.07",
64
+ "project":"LHC@home 1.0"
65
+ },
66
+ {
67
+ "application":"sixtrack",
68
+ "version":"451.07",
69
+ "project":"LHC@home 1.0"
70
+ }
71
+ ],
72
+ "workunits":[
73
+ {
74
+ "name":"sd_HL_7.5_490_1.6_4D_err__1__s__62.31_60.32__0_2__6__35_1_sixvf_boinc7",
75
+ "fp_estimate":"1.800000e+14",
76
+ "fp_bound":"1.800000e+17",
77
+ "memory_bound":"95.37 MB",
78
+ "disk_bound":"190.73 MB"
79
+ },
80
+ {
81
+ "name":"sd_HL_7.5_490_1.6_4D_err__2__s__62.31_60.32__0_2__6__40_1_sixvf_boinc110",
82
+ "fp_estimate":"1.800000e+14",
83
+ "fp_bound":"1.800000e+17",
84
+ "memory_bound":"95.37 MB",
85
+ "disk_bound":"190.73 MB"
86
+ },
87
+ {
88
+ "name":"sd_HL_7.5_690_1.6_4D_err__1__s__62.31_60.32__10_12__6__50_1_sixvf_boinc95",
89
+ "fp_estimate":"1.800000e+14",
90
+ "fp_bound":"1.800000e+17",
91
+ "memory_bound":"95.37 MB",
92
+ "disk_bound":"190.73 MB"
93
+ },
94
+ {
95
+ "name":"sd_HL_7.5_340_1.8_4D_err__5__s__62.31_60.32__8_10__6__15_1_sixvf_boinc479",
96
+ "fp_estimate":"1.800000e+14",
97
+ "fp_bound":"1.800000e+17",
98
+ "memory_bound":"95.37 MB",
99
+ "disk_bound":"190.73 MB"
100
+ }
101
+ ],
102
+ "tasks":[
103
+ {
104
+ "name":"sd_HL_7.5_490_1.6_4D_err__1__s__62.31_60.32__0_2__6__35_1_sixvf_boinc7_1",
105
+ "wu_name":"sd_HL_7.5_490_1.6_4D_err__1__s__62.31_60.32__0_2__6__35_1_sixvf_boinc7",
106
+ "project_url":"http://lhcathome.cern.ch/lhcathome/",
107
+ "report_deadline":"Wed Jul 23 03:21:09 2014",
108
+ "ready_to_report":"no",
109
+ "got_server_ack":"no",
110
+ "final_cpu_time":"0.000000",
111
+ "state":"downloaded",
112
+ "scheduler_state":"scheduled",
113
+ "exit_status":"0",
114
+ "signal":"0",
115
+ "suspended_via_gui":"no",
116
+ "active_task_state":"EXECUTING",
117
+ "app_version_num":"45107",
118
+ "checkpoint_cpu_time":"32849.200000",
119
+ "current_cpu_time":"32864.980000",
120
+ "fraction_done":"0.888423",
121
+ "swap_size":"82915328.000000",
122
+ "working_set_size":"58507264.000000",
123
+ "estimated_cpu_time_remaining":"3262.893271"
124
+ },
125
+ {
126
+ "name":"sd_HL_7.5_490_1.6_4D_err__2__s__62.31_60.32__0_2__6__40_1_sixvf_boinc110_0",
127
+ "wu_name":"sd_HL_7.5_490_1.6_4D_err__2__s__62.31_60.32__0_2__6__40_1_sixvf_boinc110",
128
+ "project_url":"http://lhcathome.cern.ch/lhcathome/",
129
+ "report_deadline":"Wed Jul 23 03:21:09 2014",
130
+ "ready_to_report":"no",
131
+ "got_server_ack":"no",
132
+ "final_cpu_time":"0.000000",
133
+ "state":"downloaded",
134
+ "scheduler_state":"uninitialized",
135
+ "exit_status":"0",
136
+ "signal":"0",
137
+ "suspended_via_gui":"no",
138
+ "active_task_state":"UNINITIALIZED",
139
+ "app_version_num":"0",
140
+ "checkpoint_cpu_time":"0.000000",
141
+ "current_cpu_time":"0.000000",
142
+ "fraction_done":"0.000000",
143
+ "swap_size":"0.000000",
144
+ "working_set_size":"0.000000",
145
+ "estimated_cpu_time_remaining":"11111.865751"
146
+ },
147
+ {
148
+ "name":"sd_HL_7.5_690_1.6_4D_err__1__s__62.31_60.32__10_12__6__50_1_sixvf_boinc95_1",
149
+ "wu_name":"sd_HL_7.5_690_1.6_4D_err__1__s__62.31_60.32__10_12__6__50_1_sixvf_boinc95",
150
+ "project_url":"http://lhcathome.cern.ch/lhcathome/",
151
+ "report_deadline":"Wed Jul 23 04:30:48 2014",
152
+ "ready_to_report":"no",
153
+ "got_server_ack":"no",
154
+ "final_cpu_time":"0.000000",
155
+ "state":"downloaded",
156
+ "scheduler_state":"uninitialized",
157
+ "exit_status":"0",
158
+ "signal":"0",
159
+ "suspended_via_gui":"no",
160
+ "active_task_state":"UNINITIALIZED",
161
+ "app_version_num":"0",
162
+ "checkpoint_cpu_time":"0.000000",
163
+ "current_cpu_time":"0.000000",
164
+ "fraction_done":"0.000000",
165
+ "swap_size":"0.000000",
166
+ "working_set_size":"0.000000",
167
+ "estimated_cpu_time_remaining":"11111.865751"
168
+ },
169
+ {
170
+ "name":"sd_HL_7.5_340_1.8_4D_err__5__s__62.31_60.32__8_10__6__15_1_sixvf_boinc479_0",
171
+ "wu_name":"sd_HL_7.5_340_1.8_4D_err__5__s__62.31_60.32__8_10__6__15_1_sixvf_boinc479",
172
+ "project_url":"http://lhcathome.cern.ch/lhcathome/",
173
+ "report_deadline":"Wed Jul 23 06:30:58 2014",
174
+ "ready_to_report":"no",
175
+ "got_server_ack":"no",
176
+ "final_cpu_time":"0.000000",
177
+ "state":"downloaded",
178
+ "scheduler_state":"uninitialized",
179
+ "exit_status":"0",
180
+ "signal":"0",
181
+ "suspended_via_gui":"no",
182
+ "active_task_state":"UNINITIALIZED",
183
+ "app_version_num":"0",
184
+ "checkpoint_cpu_time":"0.000000",
185
+ "current_cpu_time":"0.000000",
186
+ "fraction_done":"0.000000",
187
+ "swap_size":"0.000000",
188
+ "working_set_size":"0.000000",
189
+ "estimated_cpu_time_remaining":"11111.865751"
190
+ }
191
+ ],
192
+ "time_stats":{
193
+ "now":"1405569063.884657",
194
+ "on_frac":"1.000000",
195
+ "connected_frac":"-1.000000",
196
+ "cpu_and_network_available_frac":"0.999854",
197
+ "active_frac":"0.999854",
198
+ "gpu_active_frac":"0.999854",
199
+ "client_start_time":"1405183215.367770",
200
+ "previous_uptime":"385848.516887"
201
+ }
202
+ }
203
+ ```
22
204
 
23
205
  ## Contributing
24
206
 
25
- 1. Fork it ( https://github.com/[my-github-username]/boinc_drone/fork )
207
+ 1. Fork it ( https://github.com/msull92/boinc_drone/fork )
26
208
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
209
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
210
  4. Push to the branch (`git push origin my-new-feature`)
29
211
  5. Create a new Pull Request
212
+
213
+ ## License
214
+ Do whatever you want with it, just don't hurt anyone or expect me to be responsible for your use of it.
data/bin/boinc_drone ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require "boinc_drone"
7
+ require "optparse"
8
+
9
+ params = {}
10
+ opt = OptionParser.new do |opt|
11
+ opt.on('-k', '--key KEY', 'API key') do |key|
12
+ params[:api_key] = key
13
+ end
14
+
15
+ opt.on('-u', '--url URL', 'Webhook URL') do |url|
16
+ things[:webhook_url] = url
17
+ end
18
+
19
+ opt.on('-w', '--worker ID', 'Woker ID') do |id|
20
+ things[:worker_id] = id
21
+ end
22
+ end
23
+
24
+ opt.parse
25
+
26
+ loop do
27
+ @report = BoincDrone::Report.new(params)
28
+ @report.post
29
+ sleep(60)
30
+ end
data/lib/boinc_drone.rb CHANGED
@@ -3,54 +3,57 @@ require "httparty"
3
3
  require "json"
4
4
 
5
5
  module BoincDrone
6
- @report = {
7
- meta: {
8
- worker_id: ENV["WORKER_ID"]
9
- }
10
- }
6
+ class Report
7
+ attr_accessor :api_key, :report, :webhook_url, :worker_id
8
+
9
+ def initialize(api_key: "ABC123", webhook_url: "http://localhost:3000", worker_id: "123456")
10
+ @api_key = api_key
11
+ @webhook_url = webhook_url
12
+ @worker_id = worker_id
13
+
14
+ @report = {
15
+ meta: {
16
+ worker_id: @worker_id
17
+ }
18
+ }
11
19
 
12
- input = `boinccmd --get_state`
13
- input.each_line do |line|
14
- if line.match(/======== (.+) ========/i)
15
- match = line.match(/======== (.+) ========/i)
16
- @scope = match.captures.first.gsub(" ", "_").downcase.to_sym
17
- instance_variable_set("@#{@scope.to_s}", [])
20
+ input = `boinccmd --get_state`
21
+ input.each_line do |line|
22
+ if line.match(/======== (.+) ========/i)
23
+ match = line.match(/======== (.+) ========/i)
24
+ @scope = match.captures.first.gsub(" ", "_").downcase.to_sym
25
+ instance_variable_set("@#{@scope.to_s}", [])
18
26
 
19
- if @scope == :time_stats
20
- @time_stats = {}
21
- @current = @time_stats
22
- end
23
- end
27
+ if @scope == :time_stats
28
+ @time_stats = {}
29
+ @current = @time_stats
30
+ end
31
+ end
24
32
 
25
- if line.match(/\d+\) -----------$/i)
26
- instance_variable_get("@#{@scope.to_s}") << {}
27
- @current = instance_variable_get("@#{@scope.to_s}").send(:last)
28
- elsif line.match(/(\S+): (.*)/i)
29
- match = line.match(/\s+(.+): (.*)/i)
30
- @current[match.captures.first.gsub(" ", "_").downcase.to_sym] = match.captures[1]
31
- else
32
- @report[@scope.to_sym] = instance_variable_get("@#{@scope.to_s}")
33
+ if line.match(/\d+\) -----------$/i)
34
+ instance_variable_get("@#{@scope.to_s}") << {}
35
+ @current = instance_variable_get("@#{@scope.to_s}").send(:last)
36
+ elsif line.match(/(\S+): (.*)/i)
37
+ match = line.match(/\s+(.+): (.*)/i)
38
+ @current[match.captures.first.gsub(" ", "_").downcase.to_sym] = match.captures[1]
39
+ else
40
+ @report[@scope.to_sym] = instance_variable_get("@#{@scope.to_s}")
41
+ end
42
+ end
33
43
  end
34
- end
35
-
36
- def post_report
37
- begin
38
- result = HTTParty.post(ENV["WEBHOOK_URL"],
39
- body: {
40
- report: @report
41
- },
42
- headers: {
43
- "X-API-KEY" => ENV["API_KEY"]
44
- }
45
- ).body
46
44
 
47
- unless result.status == 200
48
- sleep(60)
49
- post_report
45
+ def post
46
+ begin
47
+ HTTParty.post(@webhook_url,
48
+ body: {
49
+ report: @report
50
+ },
51
+ headers: {
52
+ "X-API-KEY" => @api_key
53
+ }
54
+ )
55
+ rescue => e
50
56
  end
51
- rescue => e
52
- sleep(60)
53
- post_report
54
57
  end
55
58
  end
56
59
  end
@@ -1,3 +1,3 @@
1
1
  module BoincDrone
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boinc_drone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Sullivan
@@ -56,7 +56,8 @@ description: This script allows the easily deployment of a boinc process farm wh
56
56
  each drone reports back to a main application.
57
57
  email:
58
58
  - msull92@gmail.com
59
- executables: []
59
+ executables:
60
+ - boinc_drone
60
61
  extensions: []
61
62
  extra_rdoc_files: []
62
63
  files:
@@ -65,6 +66,7 @@ files:
65
66
  - LICENSE.txt
66
67
  - README.md
67
68
  - Rakefile
69
+ - bin/boinc_drone
68
70
  - boinc_drone.gemspec
69
71
  - lib/boinc_drone.rb
70
72
  - lib/boinc_drone/version.rb