brigade-monitor 0.0.6 → 0.1.0

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: c3fb94fa396f710eec90358473fc93714f18b9f2
4
- data.tar.gz: df8751ddc28316fd2329d457ce68b575f245c3d3
3
+ metadata.gz: 0f4f620255dcb2564130a447d620fa4a87ed24db
4
+ data.tar.gz: 77758c22724815b610be70234fcff7e471bdce34
5
5
  SHA512:
6
- metadata.gz: 36a5992c5b13450b7e0f0c1c5d84e023b589ffdaab69bb88ab6fb2589171af7188d9dcda764082cd28952795d782680f2a90e5211e2f940156e9d966bb4581dd
7
- data.tar.gz: fff8601a70766f3e8b8e49023025814c16e9aa1f328f2230c55f82590dd5e7bd93ca985daddcbc211eeed19ca30375b217fad2bfc477df295a186ebfeedb98fe
6
+ metadata.gz: b276d063318d5b298d90d395d478ce3de9f4996f68f09a0af893ff01bc7d415f4eef6fbf37a03c7bddb0517db3069b43e6335f29001d0a7302b85f9d2cbf4a05
7
+ data.tar.gz: f9cdaabf396ad617885e1c6593492cb69d2d94fca49ff6acc71fd0e598d2a846e9cc042e0a91acad36672e7f87217351b8af6531833f178dc7e21a3ea44c3a3b
@@ -3,11 +3,15 @@
3
3
  require 'awesome_print'
4
4
  require 'brigade/monitor'
5
5
  require 'cgminer/api'
6
+ require 'logger'
6
7
  require 'optparse'
7
8
  require 'yaml'
8
9
 
9
10
  me = File.basename(__FILE__)
10
11
 
12
+ log = Logger.new(STDOUT)
13
+ log.level = Logger::WARN
14
+
11
15
  options = {}
12
16
  optparse = OptionParser.new do |opts|
13
17
  opts.banner = "Usage: #{me} [options]"
@@ -17,6 +21,14 @@ optparse = OptionParser.new do |opts|
17
21
  opts.on('-k', '--key API-KEY', String, 'Brigade API key') do |key|
18
22
  options[:key] = key
19
23
  end
24
+ opts.on('-d', '--debug LEVEL', [:debug, :info], 'Debug level (DEBUG, INFO)') do |dbg|
25
+ case dbg
26
+ when :debug
27
+ log.level = Logger::DEBUG
28
+ when :info
29
+ log.level = Logger::INFO
30
+ end
31
+ end
20
32
  opts.on('-v', '--version', 'Print application version') do
21
33
  puts "#{me} v#{Brigade::Monitor::VERSION}"
22
34
  exit
@@ -34,81 +46,11 @@ end
34
46
  key = options.fetch(:key, config['api-key'])
35
47
  fail 'Brigade API key is required' if key.nil?
36
48
 
37
- # XXX connect once, check API key validity
38
-
39
49
  # build a hash-o-miner clients
40
50
  miners = config['miners'].map do |miner|
41
- {
42
- name: miner[0],
43
- client: CGMiner::API::Client.new(miner[1]['host'], miner[1]['port'])
44
- }
51
+ client = CGMiner::API::Client.new(miner[1]['host'], miner[1]['port'])
52
+ { name: miner[0], client: client }
45
53
  end
46
54
 
47
- api = Brigade::Monitor::API.new(key)
48
- loop do
49
-
50
- updates = []
51
-
52
- miners.each do |miner|
53
- begin
54
- summary = miner[:client].summary
55
- devs = miner[:client].devs
56
- pools = miner[:client].pools
57
-
58
- # XXX check status replies on each command?
59
-
60
- update = {
61
- host: miner[:name],
62
- uptime: summary.body[0]['Elapsed'],
63
- mhash: summary.body[0]['MHS 5s'],
64
- rejectpct: summary.body[0]['Pool Rejected%'],
65
- asics: [],
66
- fpgas: [],
67
- gpus: [],
68
- pools: []
69
- }
70
-
71
- devs.body.each do |dev|
72
- if dev.has_key? 'GPU'
73
- update[:gpus] << {
74
- index: dev['GPU'],
75
- temperature: dev['Temperature'],
76
- enabled: dev['Enabled'] == 'Y',
77
- status: :ok, # XXX enumerate statuses
78
- uptime: dev['Device Elapsed'],
79
- mhash: dev['MHS 5s'],
80
- rejectpct: dev['Device Rejected%']
81
- }
82
- else
83
- puts "Skipped device: #{dev}"
84
- end
85
- end
86
-
87
- pools.body.each do |pool|
88
- update[:pools] << {
89
- index: pool['POOL'],
90
- url: pool['URL'],
91
- status: :ok, # XXX enumerate statuses
92
- active: pool['Stratum Active'],
93
- rejectpct: pool['Pool Rejected%']
94
- }
95
- end
96
-
97
- updates << update
98
- rescue Net::OpenTimeout
99
- puts "Timed out: #{miner}"
100
- # XXX put something in the update to indicate it barfed
101
- rescue Exception => e
102
- puts "Some other error: #{miner} (#{e.class})"
103
- # XXX put something in the update to indicate it barfed
104
- end
105
- end
106
-
107
- response = api.hosts(updates)
108
- unless 200 == response.code
109
- puts "XXX: response: #{response.code}"
110
- end
111
-
112
- sleep 60
113
-
114
- end
55
+ mon = Brigade::Monitor::Monitor.new(key, miners, log)
56
+ mon.run
@@ -1,2 +1,3 @@
1
1
  require 'brigade/monitor/api'
2
+ require 'brigade/monitor/monitor'
2
3
  require 'brigade/monitor/version'
@@ -8,8 +8,9 @@ module Brigade
8
8
  include HTTParty
9
9
  base_uri 'https://app.brigade.io/api/v1'
10
10
 
11
- def initialize(key)
11
+ def initialize(key, logger)
12
12
  @key = key
13
+ @log = logger
13
14
  end
14
15
 
15
16
  def hosts(data)
@@ -19,8 +20,8 @@ module Brigade
19
20
  private
20
21
 
21
22
  def command(command, params)
22
- params.merge!({ token: @key })
23
- self.class.post(command, query: params, verify: false)
23
+ @log.debug("Posting command: #{command}, params: #{params}")
24
+ self.class.post(command, query: params.merge({ token: @key }), verify: false)
24
25
  end
25
26
 
26
27
  end
@@ -0,0 +1,136 @@
1
+ module Brigade
2
+ module Monitor
3
+
4
+ class Monitor
5
+
6
+ def initialize(key, miners, logger)
7
+ @key = key
8
+ @miners = miners
9
+ @log = logger
10
+ end
11
+
12
+ def run
13
+ api = Brigade::Monitor::API.new(@key, @log)
14
+
15
+ @log.info("Monitoring #{@miners.length} miners")
16
+ loop do
17
+ updates = []
18
+
19
+ @miners.each do |miner|
20
+ @log.debug("Beginning miner: #{miner}")
21
+
22
+ begin
23
+ updates << get_update(miner)
24
+ rescue Net::OpenTimeout => e
25
+ @log.warn("Net::OpenTimeout building update for #{miner[:name]} (#{e})")
26
+ # XXX put something in the update to indicate it barfed
27
+ rescue Exception => e
28
+ @log.error("Exception building update for #{miner[:name]} (#{e})")
29
+ # XXX put something in the update to indicate it barfed
30
+ end
31
+ end
32
+
33
+ if updates.empty?
34
+ @log.info("Updates empty, not submitting")
35
+ else
36
+ @log.info("Updates available (#{updates.length}), submitting")
37
+ begin
38
+ tries ||= 3
39
+ response = api.hosts(updates)
40
+ rescue Exception => e
41
+ @log.error("Exception submitting updates (#{e})")
42
+ unless (tries -= 1).zero?
43
+ @log.error('Retrying...')
44
+ retry
45
+ else
46
+ @log.error('Giving up for this update...')
47
+ end
48
+ else
49
+ if 401 == response.code
50
+ @log.error('Unauthorized response submitting updates, check API key!')
51
+ return
52
+ end
53
+ @log.info("Submitted updates (status: #{response.code})")
54
+ end
55
+ end
56
+
57
+ sleep 60
58
+
59
+ end
60
+ end
61
+
62
+ def get_update(miner)
63
+ summary = miner[:client].summary
64
+ devs = miner[:client].devs
65
+ pools = miner[:client].pools
66
+
67
+ # XXX check status replies on each command?
68
+
69
+ update = {
70
+ host: miner[:name],
71
+ uptime: summary.body[0]['Elapsed'],
72
+ mhash: summary.body[0]['MHS av'],
73
+ rejectpct: summary.body[0]['Pool Rejected%'],
74
+ asics: [],
75
+ fpgas: [],
76
+ gpus: [],
77
+ pools: []
78
+ }
79
+
80
+ devs.body.each do |dev|
81
+ if dev.has_key? 'GPU'
82
+ update[:gpus] << {
83
+ index: dev['GPU'],
84
+ temperature: dev['Temperature'],
85
+ enabled: dev['Enabled'] == 'Y',
86
+ status: :ok, # XXX enumerate statuses
87
+ uptime: dev['Device Elapsed'],
88
+ mhash: dev['MHS av'],
89
+ hwerrors: dev['Hardware Errors'],
90
+ rejectpct: dev['Device Rejected%']
91
+ }
92
+ elsif dev.has_key? 'ASC'
93
+ update[:asics] << {
94
+ index: dev['ASC'],
95
+ temperature: dev['Temperature'],
96
+ enabled: dev['Enabled'] == 'Y',
97
+ status: :ok, # XXX enumerate statuses
98
+ uptime: dev['Device Elapsed'],
99
+ mhash: dev['MHS av'],
100
+ hwerrors: dev['Hardware Errors'],
101
+ rejectpct: dev['Device Rejected%']
102
+ }
103
+ elsif dev.has_key? 'PGA'
104
+ update[:fpgas] << {
105
+ index: dev['PGA'],
106
+ temperature: dev['Temperature'],
107
+ enabled: dev['Enabled'] == 'Y',
108
+ status: :ok, # XXX enumerate statuses
109
+ uptime: dev['Device Elapsed'],
110
+ mhash: dev['MHS av'],
111
+ hwerrors: dev['Hardware Errors'],
112
+ rejectpct: dev['Device Rejected%']
113
+ }
114
+ else
115
+ @log.warn("Skipped unknown device: #{dev}")
116
+ end
117
+ end
118
+
119
+ pools.body.each do |pool|
120
+ update[:pools] << {
121
+ index: pool['POOL'],
122
+ url: pool['URL'],
123
+ status: :ok, # XXX enumerate statuses
124
+ active: pool['Stratum Active'],
125
+ rejectpct: pool['Pool Rejected%']
126
+ }
127
+ end
128
+
129
+ @log.debug("Built update: #{update}")
130
+ update
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+ end
@@ -1,5 +1,5 @@
1
1
  module Brigade
2
2
  module Monitor
3
- VERSION = '0.0.6'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brigade-monitor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Veys
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-11 00:00:00.000000000 Z
11
+ date: 2014-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -168,6 +168,7 @@ files:
168
168
  - brigade-monitor.gemspec
169
169
  - lib/brigade/monitor.rb
170
170
  - lib/brigade/monitor/api.rb
171
+ - lib/brigade/monitor/monitor.rb
171
172
  - lib/brigade/monitor/version.rb
172
173
  - sample-config.yaml
173
174
  - spec/spec_helper.rb