boinc_drone 0.0.1 → 0.0.2

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.
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