pimon 0.1.9 → 0.1.10

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.
data/Gemfile CHANGED
@@ -1,17 +1,20 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'haml', '~> 4.0.0'
4
- gem 'sinatra', '~> 1.4.1', :require => 'sinatra/base'
3
+ gem 'rake', '~> 10.1.0'
4
+ gem 'haml', '~> 4.0.3'
5
+ gem 'sinatra', '~> 1.4.3', :require => 'sinatra/base'
5
6
  gem 'em-websocket', '= 0.3.8'
6
7
  gem 'sinatra-websocket', '~> 0.2.1'
7
- gem 'thin', '~> 1.5.0'
8
+ gem 'sys-uptime', '~> 0.6.1'
9
+ gem 'thin', '~> 1.5.1'
8
10
 
9
- gem 'pry', '~> 0.9.12' , :group => [:development, :test]
11
+ gem 'pry', '~> 0.9.12.2' , :group => [:development, :test]
10
12
 
11
13
  group :test do
12
14
  gem 'rack-test', '~> 0.6.2'
13
- gem 'rspec', '~> 2.13.0'
15
+ gem 'rspec', '~> 2.14.1'
14
16
  gem 'simplecov', '~> 0.7.1', :require => false
15
17
  gem 'simplecov-rcov', '~> 0.2.3'
16
18
  gem 'timecop', '~> 0.6.1'
19
+ gem 'coveralls', '~> 0.6.7', require: false
17
20
  end
@@ -1,19 +1,28 @@
1
1
  GEM
2
- remote: http://rubygems.org/
2
+ remote: https://rubygems.org/
3
3
  specs:
4
4
  addressable (2.3.3)
5
5
  coderay (1.0.9)
6
+ colorize (0.5.8)
7
+ coveralls (0.6.7)
8
+ colorize
9
+ multi_json (~> 1.3)
10
+ rest-client
11
+ simplecov (>= 0.7)
12
+ thor
6
13
  daemons (1.1.9)
7
- diff-lcs (1.2.1)
14
+ diff-lcs (1.2.4)
8
15
  em-websocket (0.3.8)
9
16
  addressable (>= 2.1.1)
10
17
  eventmachine (>= 0.12.9)
11
18
  eventmachine (1.0.3)
12
- haml (4.0.0)
19
+ ffi (1.4.0)
20
+ haml (4.0.3)
13
21
  tilt
14
22
  method_source (0.8.1)
23
+ mime-types (1.23)
15
24
  multi_json (1.6.1)
16
- pry (0.9.12)
25
+ pry (0.9.12.2)
17
26
  coderay (~> 1.0.5)
18
27
  method_source (~> 0.8)
19
28
  slop (~> 3.4)
@@ -22,48 +31,57 @@ GEM
22
31
  rack
23
32
  rack-test (0.6.2)
24
33
  rack (>= 1.0)
25
- rspec (2.13.0)
26
- rspec-core (~> 2.13.0)
27
- rspec-expectations (~> 2.13.0)
28
- rspec-mocks (~> 2.13.0)
29
- rspec-core (2.13.1)
30
- rspec-expectations (2.13.0)
34
+ rake (10.1.0)
35
+ rest-client (1.6.7)
36
+ mime-types (>= 1.16)
37
+ rspec (2.14.1)
38
+ rspec-core (~> 2.14.0)
39
+ rspec-expectations (~> 2.14.0)
40
+ rspec-mocks (~> 2.14.0)
41
+ rspec-core (2.14.4)
42
+ rspec-expectations (2.14.0)
31
43
  diff-lcs (>= 1.1.3, < 2.0)
32
- rspec-mocks (2.13.0)
44
+ rspec-mocks (2.14.1)
33
45
  simplecov (0.7.1)
34
46
  multi_json (~> 1.0)
35
47
  simplecov-html (~> 0.7.1)
36
48
  simplecov-html (0.7.1)
37
49
  simplecov-rcov (0.2.3)
38
50
  simplecov (>= 0.4.1)
39
- sinatra (1.4.1)
40
- rack (~> 1.5, >= 1.5.2)
51
+ sinatra (1.4.3)
52
+ rack (~> 1.4)
41
53
  rack-protection (~> 1.4)
42
54
  tilt (~> 1.3, >= 1.3.4)
43
55
  sinatra-websocket (0.2.1)
44
56
  em-websocket (~> 0.3.6)
45
57
  eventmachine
46
58
  thin (>= 1.3.1)
47
- slop (3.4.4)
48
- thin (1.5.0)
59
+ slop (3.4.5)
60
+ sys-uptime (0.6.1)
61
+ ffi (>= 1.0.0)
62
+ thin (1.5.1)
49
63
  daemons (>= 1.0.9)
50
64
  eventmachine (>= 0.12.6)
51
65
  rack (>= 1.0.0)
52
- tilt (1.3.5)
66
+ thor (0.18.1)
67
+ tilt (1.4.1)
53
68
  timecop (0.6.1)
54
69
 
55
70
  PLATFORMS
56
71
  ruby
57
72
 
58
73
  DEPENDENCIES
74
+ coveralls (~> 0.6.7)
59
75
  em-websocket (= 0.3.8)
60
- haml (~> 4.0.0)
61
- pry (~> 0.9.12)
76
+ haml (~> 4.0.3)
77
+ pry (~> 0.9.12.2)
62
78
  rack-test (~> 0.6.2)
63
- rspec (~> 2.13.0)
79
+ rake (~> 10.1.0)
80
+ rspec (~> 2.14.1)
64
81
  simplecov (~> 0.7.1)
65
82
  simplecov-rcov (~> 0.2.3)
66
- sinatra (~> 1.4.1)
83
+ sinatra (~> 1.4.3)
67
84
  sinatra-websocket (~> 0.2.1)
68
- thin (~> 1.5.0)
85
+ sys-uptime (~> 0.6.1)
86
+ thin (~> 1.5.1)
69
87
  timecop (~> 0.6.1)
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Pimon
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/pedrocarrico/pimon.png)](http://travis-ci.org/pedrocarrico/pimon) [![Dependency Status](https://gemnasium.com/pedrocarrico/pimon.png?travis)](https://gemnasium.com/pedrocarrico/pimon) [![Gem Version](https://badge.fury.io/rb/pimon.png)](http://badge.fury.io/rb/pimon) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/pedrocarrico/pimon)
3
+ [![Build Status](https://secure.travis-ci.org/pedrocarrico/pimon.png)](http://travis-ci.org/pedrocarrico/pimon) [![Dependency Status](https://gemnasium.com/pedrocarrico/pimon.png?travis)](https://gemnasium.com/pedrocarrico/pimon) [![Gem Version](https://badge.fury.io/rb/pimon.png)](http://badge.fury.io/rb/pimon) [![Code Climate](https://codeclimate.com/github/pedrocarrico/pimon.png)](https://codeclimate.com/github/pedrocarrico/pimon) [![Coverage Status](https://coveralls.io/repos/pedrocarrico/pimon/badge.png?branch=master)](https://coveralls.io/r/pedrocarrico/pimon)
4
4
 
5
5
  ![Pimon](http://pedrocarrico.net/pimon.jpg "Pimon")
6
6
 
@@ -58,27 +58,11 @@ The temperature stat is only available with the latest Raspbian distro (2012-09-
58
58
  not work if you're developing on other systems.
59
59
  Pimon only works with Ruby 1.9+, please refer to [my blog](http://blog.pedrocarrico.net/post/29478085586/compiling-and-installing-ruby-on-the-raspberry-pi-using "Compiling and installing ruby on the raspberry pi using rbenv…") for a way to install Ruby 1.9.3 on your Raspberry Pi.
60
60
 
61
- ## Deployment with capistrano
62
- To deploy on your raspberry pi you just have to have ssh enabled and your keys authorized.
63
- Then you can deploy with capistrano using:
64
- ```
65
- cap deploy:setup
66
- cap deploy:cold
67
- ```
68
-
69
- This will setup your raspberry pi and deploy the application.
70
- To start and stop the application you have the usual:
71
- ```
72
- cap deploy:start
73
- cap deploy:stop
74
- ```
75
- I would recommend installing as a gem and tweak your own configuration file instead of deploying with capistrano as
76
- this feature will probably be discontinued in the future.
77
-
78
61
  ## TODO
79
62
  1. Improve disk stats, have a way of having custom mount points
80
- 2. Show uptime
81
- 3. Change configuration in realtime
63
+ 2. Change configuration in realtime
64
+ 3. Cpu frequency probe
65
+ 4. Persist stats
82
66
 
83
67
  ## Copyright
84
68
  Licensed under the [WTFPL](http://en.wikipedia.org/wiki/WTFPL "Do What The Fuck You Want To Public License") license.
@@ -39,7 +39,6 @@ class Pimon < Sinatra::Base
39
39
  end
40
40
 
41
41
  configure :test do
42
-
43
42
  config = PimonConfig.create_new("#{File.dirname(__FILE__)}/../config/test.yml")
44
43
 
45
44
  set :config, config
@@ -0,0 +1,13 @@
1
+ require 'pimon/probe/probe'
2
+ require 'sys/uptime'
3
+
4
+ class Probe::Uptime < Probe
5
+
6
+ def self.check
7
+ Sys::Uptime.dhms
8
+ end
9
+
10
+ def self.symbol
11
+ :uptime
12
+ end
13
+ end
@@ -1,120 +1,154 @@
1
1
  $(function () {
2
- var i = 0,
3
- titleStats,
4
- rotateFaviconInterval;
2
+ var i = 0,
3
+ titleStats,
4
+ rotateFaviconInterval,
5
+ ws;
6
+
7
+ function changeFavicon(o) {
8
+ titleStats = [
9
+ { 'legend' : 'CPU', 'stat' : o.cpu.stats[o.cpu.stats.length - 1], 'color' : o.cpu.color, 'unit' : o.cpu.unit } ,
10
+ { 'legend' : 'MEM', 'stat' : o.mem.stats[o.mem.stats.length - 1], 'color' : o.mem.color, 'unit' : o.mem.unit } ,
11
+ { 'legend' : 'SWAP', 'stat' : o.swap.stats[o.swap.stats.length - 1], 'color' : o.swap.color, 'unit' : o.swap.unit},
12
+ { 'legend' : 'DISK', 'stat' : o.disk.stats[o.disk.stats.length - 1], 'color' : o.disk.color, 'unit' : o.disk.unit},
13
+ { 'legend' : 'TEMP', 'stat' : o.temp.stats[o.temp.stats.length - 1], 'color' : o.temp.color, 'unit' : o.temp.unit} ];
14
+ i = 0;
15
+ if (rotateFaviconInterval === undefined) {
16
+ rotateFavicon(titleStats);
17
+ rotateFaviconInterval = setInterval(function() { rotateFavicon(titleStats); }, 3000);
18
+ }
19
+ }
20
+
21
+ function rotateFavicon(titleStats) {
22
+ Piecon.setOptions({
23
+ color: titleStats[i].color, // Pie chart color
24
+ background: '#bbb', // Empty pie chart color
25
+ shadow: '#fff', // Outer ring color
26
+ fallback: 'force' // Toggles displaying percentage in the title bar (possible values - true, false, 'force')
27
+ });
28
+ Piecon.setProgress(titleStats[i].stat);
5
29
 
6
- function changeFavicon(o) {
7
- titleStats = [
8
- { 'legend' : 'CPU', 'stat' : o.cpu.stats[o.cpu.stats.length - 1], 'color' : o.cpu.color, 'unit' : o.cpu.unit } ,
9
- { 'legend' : 'MEM', 'stat' : o.mem.stats[o.mem.stats.length - 1], 'color' : o.mem.color, 'unit' : o.mem.unit } ,
10
- { 'legend' : 'SWAP', 'stat' : o.swap.stats[o.swap.stats.length - 1], 'color' : o.swap.color, 'unit' : o.swap.unit},
11
- { 'legend' : 'DISK', 'stat' : o.disk.stats[o.disk.stats.length - 1], 'color' : o.disk.color, 'unit' : o.disk.unit},
12
- { 'legend' : 'TEMP', 'stat' : o.temp.stats[o.temp.stats.length - 1], 'color' : o.temp.color, 'unit' : o.temp.unit} ];
13
- i = 0;
14
- if (rotateFaviconInterval === undefined) {
15
- rotateFavicon(titleStats);
16
- rotateFaviconInterval = setInterval(function() { rotateFavicon(titleStats); }, 3000);
30
+ $('title').text(titleStats[i].stat + titleStats[i].unit + ' ' + titleStats[i].legend);
31
+ i++;
32
+ if (i >= titleStats.length) {
33
+ i = 0;
34
+ }
35
+ }
36
+
37
+ function drawChart(o) {
38
+ new Highcharts.Chart({
39
+ chart: {
40
+ renderTo: 'chart',
41
+ type: 'line',
42
+ marginRight: 130,
43
+ marginBottom: 25
44
+ },
45
+ title: {
46
+ text: 'Pimon',
47
+ x: -20
48
+ },
49
+ subtitle: {
50
+ text: o.hostname,
51
+ x: -20
52
+ },
53
+ xAxis: {
54
+ categories: o.time.stats
55
+ },
56
+ yAxis: {
57
+ title: {
58
+ text: 'Usage'
59
+ },
60
+ plotLines: [{
61
+ value: 0,
62
+ width: 1,
63
+ color: '#808080'
64
+ }],
65
+ max: 100,
66
+ min: 0
67
+ },
68
+ tooltip: {
69
+ formatter: function() {
70
+ return '<b>'+ this.series.name +'</b><br/>'+
71
+ this.x +': '+ this.y + (this.series.name === 'temp' ? o.temp.unit : '%');
17
72
  }
73
+ },
74
+ legend: {
75
+ layout: 'vertical',
76
+ align: 'right',
77
+ verticalAlign: 'top',
78
+ x: -10,
79
+ y: 100,
80
+ borderWidth: 0
81
+ },
82
+ series: [{
83
+ name: 'cpu',
84
+ color: o.cpu.color,
85
+ data: o.cpu.stats
86
+ },
87
+ {
88
+ name: 'mem',
89
+ color: o.mem.color,
90
+ data: o.mem.stats
91
+ },
92
+ {
93
+ name: 'swap',
94
+ color: o.swap.color,
95
+ data: o.swap.stats
96
+ },
97
+ {
98
+ name: 'disk',
99
+ color: o.disk.color,
100
+ data: o.disk.stats
101
+ },
102
+ {
103
+ name: 'temp',
104
+ color: o.temp.color,
105
+ data: o.temp.stats
106
+ }],
107
+ credits: {
108
+ enabled: false
109
+ }
110
+ });
111
+ }
112
+
113
+ function maybeInsertWordConnector(text, connector) {
114
+ return text !== '' ? text + connector : text;
115
+ }
116
+
117
+ function pluralize(count, word) {
118
+ return ((count === '1') ? ' ' + word : ' ' + word + 's');
119
+ }
120
+
121
+ function formatUptime(uptimeArray) {
122
+ var uptime = '',
123
+ days = uptimeArray[0],
124
+ hours = uptimeArray[1],
125
+ minutes = uptimeArray[2],
126
+ seconds = uptimeArray[3];
127
+
128
+ if (days !== '0') {
129
+ uptime = + ' ' + pluralize(days, 'day');
18
130
  }
19
131
 
20
- function rotateFavicon(titleStats) {
21
- Piecon.setOptions({
22
- color: titleStats[i]['color'], // Pie chart color
23
- background: '#bbb', // Empty pie chart color
24
- shadow: '#fff', // Outer ring color
25
- fallback: 'force' // Toggles displaying percentage in the title bar (possible values - true, false, 'force')
26
- });
27
- Piecon.setProgress(titleStats[i]['stat']);
28
-
29
- $('title').text(titleStats[i]['stat'] + titleStats[i]['unit'] + ' ' + titleStats[i]['legend']);
30
- i++;
31
- if (i >= titleStats.length) {
32
- i = 0;
33
- }
132
+ if (hours !== '0') {
133
+ uptime = maybeInsertWordConnector(uptime, ', ') + hours + ' ' + pluralize(hours, 'hour');
34
134
  }
35
135
 
36
- function drawChart(o) {
37
- new Highcharts.Chart({
38
- chart: {
39
- renderTo: 'chart',
40
- type: 'line',
41
- marginRight: 130,
42
- marginBottom: 25
43
- },
44
- title: {
45
- text: 'Pimon',
46
- x: -20
47
- },
48
- subtitle: {
49
- text: o.hostname,
50
- x: -20
51
- },
52
- xAxis: {
53
- categories: o.time.stats
54
- },
55
- yAxis: {
56
- title: {
57
- text: 'Usage'
58
- },
59
- plotLines: [{
60
- value: 0,
61
- width: 1,
62
- color: '#808080'
63
- }],
64
- max: 100,
65
- min: 0
66
- },
67
- tooltip: {
68
- formatter: function() {
69
- return '<b>'+ this.series.name +'</b><br/>'+
70
- this.x +': '+ this.y + (this.series.name === 'temp' ? o.temp.unit : '%');
71
- }
72
- },
73
- legend: {
74
- layout: 'vertical',
75
- align: 'right',
76
- verticalAlign: 'top',
77
- x: -10,
78
- y: 100,
79
- borderWidth: 0
80
- },
81
- series: [{
82
- name: 'cpu',
83
- color: o.cpu.color,
84
- data: o.cpu.stats
85
- },
86
- {
87
- name: 'mem',
88
- color: o.mem.color,
89
- data: o.mem.stats
90
- },
91
- {
92
- name: 'swap',
93
- color: o.swap.color,
94
- data: o.swap.stats
95
- },
96
- {
97
- name: 'disk',
98
- color: o.disk.color,
99
- data: o.disk.stats
100
- },
101
- {
102
- name: 'temp',
103
- color: o.temp.color,
104
- data: o.temp.stats
105
- }],
106
- credits: {
107
- enabled: false
108
- }
109
- });
136
+ if (minutes !== '0') {
137
+ uptime = maybeInsertWordConnector(uptime, ', ') + minutes + ' ' + pluralize(minutes, 'minute');
110
138
  }
111
139
 
112
- var ws = new WebSocket('ws://' + window.location.host + window.location.pathname);
113
- //ws.onopen = function() { console.log('opened socket'); };
114
- ws.onclose = function() { alert('Connection to Pimon server lost...'); };
115
- ws.onmessage = function(m) {
116
- var o = $.parseJSON(m.data);
117
- drawChart(o);
118
- changeFavicon(o);
119
- };
140
+ if (seconds !== '0') {
141
+ uptime = maybeInsertWordConnector(uptime, ' and ') + seconds + ' ' + pluralize(seconds, 'second');
142
+ }
143
+ return uptime;
144
+ }
145
+
146
+ ws = new WebSocket('ws://' + window.location.host + window.location.pathname);
147
+ ws.onclose = function() { alert('Connection to Pimon server lost...'); };
148
+ ws.onmessage = function(m) {
149
+ var o = $.parseJSON(m.data);
150
+ drawChart(o);
151
+ changeFavicon(o);
152
+ $('#uptime .up').text(formatUptime(o.uptime.slice(-1)[0]));
153
+ };
120
154
  });
@@ -0,0 +1,5 @@
1
+ (function(){var i={},j=null,k=null,f=null,g=null,h={},l={color:"#ff0084",background:"#bbb",shadow:"#fff",fallback:!1},c,o=navigator.userAgent.toLowerCase();c=function(e){return-1!==o.indexOf(e)};var p=c("msie");c("chrome");c("chrome")||c("safari");var q=c("safari")&&!c("chrome");c("mozilla")&&!c("chrome")&&c("safari");var m=function(e){for(var a=document.getElementsByTagName("link"),c=document.getElementsByTagName("head")[0],f=0,h=a.length;f<h;f++)("icon"===a[f].getAttribute("rel")||"shortcut icon"===
2
+ a[f].getAttribute("rel"))&&c.removeChild(a[f]);a=document.createElement("link");a.type="image/x-icon";a.rel="icon";a.href=e;document.getElementsByTagName("head")[0].appendChild(a)},n=function(){g||(g=document.createElement("canvas"),g.width=16,g.height=16);return g};i.setOptions=function(e){h={};for(var a in l)h[a]=e.hasOwnProperty(a)?e[a]:l[a];return this};i.setProgress=function(e){f||(f=document.title);if(!k||!j){var a;a:{a=document.getElementsByTagName("link");for(var c=0,i=a.length;c<i;c++)if("icon"===
3
+ a[c].getAttribute("rel")||"shortcut icon"===a[c].getAttribute("rel")){a=a[c];break a}a=!1}k=j=a?a.getAttribute("href"):"/favicon.ico"}if(!isNaN(parseFloat(e))&&isFinite(e))if(!n().getContext||p||q||!0==h.fallback)document.title=0<e?"("+e+"%) "+f:f;else{"force"===h.fallback&&(document.title=0<e?"("+e+"%) "+f:f);var g=e,b=n(),d=b.getContext("2d"),g=g||0,e=j;a=new Image;a.onload=function(){if(d){d.clearRect(0,0,16,16);d.beginPath();d.moveTo(b.width/2,b.height/2);d.arc(b.width/2,b.height/2,Math.min(b.width/
4
+ 2,b.height/2),0,Math.PI*2,false);d.fillStyle=h.shadow;d.fill();d.beginPath();d.moveTo(b.width/2,b.height/2);d.arc(b.width/2,b.height/2,Math.min(b.width/2,b.height/2)-2,0,Math.PI*2,false);d.fillStyle=h.background;d.fill();if(g>0){d.beginPath();d.moveTo(b.width/2,b.height/2);d.arc(b.width/2,b.height/2,Math.min(b.width/2,b.height/2)-2,-0.5*Math.PI,(-0.5+2*g/100)*Math.PI,false);d.lineTo(b.width/2,b.height/2);d.fillStyle=h.color;d.fill()}m(b.toDataURL())}};e.match(/^data/)||(a.crossOrigin="anonymous");
5
+ a.src=e}else return!1};i.reset=function(){f&&(document.title=f);k&&(j=k,m(j))};i.setOptions(l);window.Piecon=i})();
@@ -10,7 +10,7 @@ class Stats
10
10
  def index(queue, index)
11
11
  @stats[queue][index]
12
12
  end
13
-
13
+
14
14
  def push(queue, value)
15
15
  @stats[queue].push(value)
16
16
  end
@@ -6,6 +6,7 @@ require 'pimon/probe/memory_usage'
6
6
  require 'pimon/probe/swap_usage'
7
7
  require 'pimon/probe/time_check'
8
8
  require 'pimon/probe/temperature'
9
+ require 'pimon/probe/uptime'
9
10
  require 'pimon/stats'
10
11
 
11
12
  class StatsCollector
@@ -17,7 +18,8 @@ class StatsCollector
17
18
  Probe::MemoryUsage,
18
19
  Probe::SwapUsage,
19
20
  Probe::DiskUsage,
20
- Probe::Temperature
21
+ Probe::Temperature,
22
+ Probe::Uptime
21
23
  ]
22
24
  @stats = Stats.new(@probes.map(&:symbol).concat([:time]))
23
25
  end
@@ -38,10 +40,12 @@ class StatsCollector
38
40
 
39
41
  def show_stats
40
42
  time = @stats.range(:time)
43
+ uptime = @stats.range(:uptime)
41
44
 
42
45
  stats = {
43
46
  :time => { :stats => time.map { |t| (/\d\d:\d\d:\d\d/.match(t))[0] } },
44
- :hostname => @config.hostname
47
+ :hostname => @config.hostname,
48
+ :uptime => uptime
45
49
  }
46
50
 
47
51
  @probes.each do |probe|
@@ -1,3 +1,3 @@
1
1
  module Pimon
2
- VERSION = '0.1.9'.freeze
2
+ VERSION = '0.1.10'.freeze
3
3
  end
@@ -3,8 +3,10 @@
3
3
  %title Pimon
4
4
  %script{ :src => '//cdnjs.cloudflare.com/ajax/libs/jquery/1.8.0/jquery-1.8.0.min.js' }
5
5
  %script{ :src => '//cdnjs.cloudflare.com/ajax/libs/highcharts/2.3.1/highcharts.js' }
6
- %script{ :src => '//lipka.github.com/piecon/piecon.min.js' }
6
+ %script{ :src => '/piecon.min.js' }
7
7
  %script{ :src => '/index.js' }
8
8
  %body
9
9
  #chart
10
10
  #uptime
11
+ Uptime:
12
+ %strong.up
@@ -20,15 +20,16 @@ Gem::Specification.new do |s|
20
20
  s.executables = `git ls-files -- bin/pimon`.split("\n").map{ |f| File.basename(f) }
21
21
  s.require_paths = ['lib']
22
22
 
23
- s.add_runtime_dependency 'haml', '~> 4.0.0'
24
- s.add_runtime_dependency 'sinatra', '~> 1.4.1'
23
+ s.add_runtime_dependency 'haml', '~> 4.0.3'
24
+ s.add_runtime_dependency 'sinatra', '~> 1.4.3'
25
25
  s.add_runtime_dependency 'em-websocket', '= 0.3.8'
26
26
  s.add_runtime_dependency 'sinatra-websocket', '~> 0.2.1'
27
- s.add_runtime_dependency 'thin', '~> 1.5.0'
27
+ s.add_runtime_dependency 'sys-uptime', '~> 0.6.1'
28
+ s.add_runtime_dependency 'thin', '~> 1.5.1'
28
29
 
29
- s.add_development_dependency 'rack-test', '~> 0.6.2'
30
- s.add_development_dependency 'rspec', '~> 2.13.0'
31
- s.add_development_dependency 'simplecov', '~> 0.7.1'
32
- s.add_development_dependency 'simplecov-rcov', '~> 0.2.3'
33
- s.add_development_dependency 'timecop', '~> 0.6.1'
30
+ s.add_development_dependency 'rack-test', '~> 0.6.2'
31
+ s.add_development_dependency 'rspec', '~> 2.14.1'
32
+ s.add_development_dependency 'simplecov', '~> 0.7.1'
33
+ s.add_development_dependency 'simplecov-rcov', '~> 0.2.3'
34
+ s.add_development_dependency 'timecop', '~> 0.6.1'
34
35
  end
@@ -2,16 +2,16 @@
2
2
  # Check http://richardconroy.blogspot.pt/2010/01/issues-testing-sinatra-datamapper-app.html
3
3
  ENV['RACK_ENV'] = 'test'
4
4
 
5
- if ENV['COVERAGE']
5
+ if ENV['COVERAGE'] || ENV['TRAVIS']
6
6
  require 'simplecov'
7
+ require 'coveralls'
8
+ Coveralls.wear!
7
9
  require 'simplecov-rcov'
8
- class SimpleCov::Formatter::MergedFormatter
9
- def format(result)
10
- SimpleCov::Formatter::HTMLFormatter.new.format(result)
11
- SimpleCov::Formatter::RcovFormatter.new.format(result)
12
- end
13
- end
14
- SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
10
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
11
+ SimpleCov::Formatter::HTMLFormatter,
12
+ SimpleCov::Formatter::RcovFormatter,
13
+ Coveralls::SimpleCov::Formatter
14
+ ]
15
15
  SimpleCov.start do
16
16
  add_filter 'spec'
17
17
  end
@@ -16,6 +16,7 @@ describe 'StatsCollector' do
16
16
  Probe::MemoryUsage.should_receive(:check)
17
17
  Probe::SwapUsage.should_receive(:check)
18
18
  Probe::Temperature.should_receive(:check)
19
+ Probe::Uptime.should_receive(:check)
19
20
 
20
21
  @stats_collector.collect_stats
21
22
  end
@@ -24,6 +25,7 @@ describe 'StatsCollector' do
24
25
  should == {
25
26
  :time => { :stats => [] },
26
27
  :hostname => 'test_hostname',
28
+ :uptime => [],
27
29
  :cpu => { :stats => [], :color => '#D2691E', :unit => '%' },
28
30
  :mem => { :stats => [], :color => '#87CEFA', :unit => '%' },
29
31
  :swap => {:stats => [], :color => '#3CB371', :unit => '%' },
@@ -41,6 +43,7 @@ describe 'StatsCollector' do
41
43
  Probe::MemoryUsage.should_receive(:check).any_number_of_times.and_return(78)
42
44
  Probe::SwapUsage.should_receive(:check).any_number_of_times.and_return(50)
43
45
  Probe::Temperature.should_receive(:check).any_number_of_times.and_return(40)
46
+ Probe::Uptime.should_receive(:check).any_number_of_times.and_return([1,2,3,4])
44
47
 
45
48
  7.times do
46
49
  @stats_collector.collect_stats
@@ -51,6 +54,7 @@ describe 'StatsCollector' do
51
54
  should == {
52
55
  :time => { :stats => ['12:00:00', '12:00:00', '12:00:00', '12:00:00', '12:00:00', '12:00:00']},
53
56
  :hostname => 'test_hostname',
57
+ :uptime => [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]],
54
58
  :cpu => {:stats => [50, 50, 50, 50, 50, 50], :color => '#D2691E', :unit => '%'},
55
59
  :mem => { :stats => [78, 78, 78, 78, 78, 78], :color =>'#87CEFA', :unit => '%'},
56
60
  :swap=>{ :stats => [50, 50, 50, 50, 50, 50], :color => '#3CB371', :unit => '%'},
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pimon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-16 00:00:00.000000000 Z
12
+ date: 2013-08-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: haml
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 4.0.0
21
+ version: 4.0.3
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 4.0.0
29
+ version: 4.0.3
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: sinatra
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 1.4.1
37
+ version: 1.4.3
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 1.4.1
45
+ version: 1.4.3
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: em-websocket
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +75,22 @@ dependencies:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: 0.2.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: sys-uptime
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.6.1
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.6.1
78
94
  - !ruby/object:Gem::Dependency
79
95
  name: thin
80
96
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +98,7 @@ dependencies:
82
98
  requirements:
83
99
  - - ~>
84
100
  - !ruby/object:Gem::Version
85
- version: 1.5.0
101
+ version: 1.5.1
86
102
  type: :runtime
87
103
  prerelease: false
88
104
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,7 +106,7 @@ dependencies:
90
106
  requirements:
91
107
  - - ~>
92
108
  - !ruby/object:Gem::Version
93
- version: 1.5.0
109
+ version: 1.5.1
94
110
  - !ruby/object:Gem::Dependency
95
111
  name: rack-test
96
112
  requirement: !ruby/object:Gem::Requirement
@@ -114,7 +130,7 @@ dependencies:
114
130
  requirements:
115
131
  - - ~>
116
132
  - !ruby/object:Gem::Version
117
- version: 2.13.0
133
+ version: 2.14.1
118
134
  type: :development
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,7 +138,7 @@ dependencies:
122
138
  requirements:
123
139
  - - ~>
124
140
  - !ruby/object:Gem::Version
125
- version: 2.13.0
141
+ version: 2.14.1
126
142
  - !ruby/object:Gem::Dependency
127
143
  name: simplecov
128
144
  requirement: !ruby/object:Gem::Requirement
@@ -181,7 +197,6 @@ extra_rdoc_files: []
181
197
  files:
182
198
  - .gitignore
183
199
  - .travis.yml
184
- - Capfile
185
200
  - Gemfile
186
201
  - Gemfile.lock
187
202
  - README.md
@@ -194,12 +209,9 @@ files:
194
209
  - bin/random.h
195
210
  - bin/vmstat.c
196
211
  - config/config.ru
197
- - config/config_dev.ru
198
212
  - config/default.yml
199
- - config/deploy.rb
200
213
  - config/test.yml
201
214
  - config/test_broken.yml
202
- - config/thin/config.yml
203
215
  - lib/pimon.rb
204
216
  - lib/pimon/hash_extensions.rb
205
217
  - lib/pimon/pimon_config.rb
@@ -211,8 +223,10 @@ files:
211
223
  - lib/pimon/probe/system_memory.rb
212
224
  - lib/pimon/probe/temperature.rb
213
225
  - lib/pimon/probe/time_check.rb
226
+ - lib/pimon/probe/uptime.rb
214
227
  - lib/pimon/public/favicon.ico
215
228
  - lib/pimon/public/index.js
229
+ - lib/pimon/public/piecon.min.js
216
230
  - lib/pimon/stats.rb
217
231
  - lib/pimon/stats_collector.rb
218
232
  - lib/pimon/version.rb
data/Capfile DELETED
@@ -1,2 +0,0 @@
1
- load 'deploy' if respond_to?(:namespace)
2
- load 'config/deploy'
@@ -1,11 +0,0 @@
1
- require 'sinatra'
2
- require './pimon'
3
-
4
- root_dir = File.dirname(__FILE__) + "/.."
5
-
6
- set :environment, :development
7
- set :root, root_dir
8
- set :app_file, File.join(root_dir, 'pimon.rb')
9
- disable :run
10
-
11
- run Pimon
@@ -1,43 +0,0 @@
1
- set :application, "pimon"
2
- set :user, "pi"
3
-
4
- set :scm, :git
5
-
6
- set :repository, "git://github.com/pedrocarrico/pimon.git"
7
-
8
- set :deploy_to, '/home/pi/app/pimon'
9
- set :deploy_via, :remote_cache # quicker checkouts from github
10
-
11
- set :domain, 'raspberrypi'
12
- role :app, domain
13
- role :web, domain
14
-
15
- set :runner, user
16
- set :use_sudo, false
17
-
18
- after 'deploy:update_code', 'deploy:bundle_install'
19
-
20
- namespace :deploy do
21
- task :start, :roles => [:web, :app] do
22
- run "cd #{deploy_to}/current && PIMON_CONFIG=#{deploy_to}/shared/production.yml nohup thin -C config/thin/config.yml -R config/config.ru start"
23
- end
24
-
25
- task :stop, :roles => [:web, :app] do
26
- run "cd #{deploy_to}/current && nohup thin -C config/thin/config.yml -R config/config.ru stop"
27
- end
28
-
29
- task :restart, :roles => [:web, :app] do
30
- deploy.stop
31
- deploy.start
32
- end
33
-
34
- task :cold do
35
- deploy.update
36
- deploy.start
37
- end
38
-
39
- desc "run 'bundle install' to install Bundler's packaged gems for the current deploy"
40
- task :bundle_install, :roles => :app do
41
- run "cd #{deploy_to}/current && bundle install --without test development"
42
- end
43
- end
@@ -1,13 +0,0 @@
1
- environment: production
2
- chdir: /home/pi/app/pimon/current
3
- address: 127.0.0.1
4
- user: pi
5
- group: pi
6
- port: 4567
7
- pid: /home/pi/app/pimon/shared/pids/thin.pid
8
- rackup: /home/pi/app/pimon/current/config/config.ru
9
- log: /home/pi/app/pimon/shared/log/thin.log
10
- max_conns: 1024
11
- timeout: 30
12
- max_persistent_conns: 512
13
- daemonize: true