visage-app 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.
Files changed (40) hide show
  1. data/.gitignore +9 -0
  2. data/README.md +138 -0
  3. data/Rakefile +33 -0
  4. data/VERSION +1 -0
  5. data/bin/visage +17 -0
  6. data/config.ru +7 -0
  7. data/features/json.feature +66 -0
  8. data/features/site.feature +9 -0
  9. data/features/step_definitions/form_steps.rb +6 -0
  10. data/features/step_definitions/json_steps.rb +79 -0
  11. data/features/step_definitions/result_steps.rb +19 -0
  12. data/features/step_definitions/site_steps.rb +4 -0
  13. data/features/step_definitions/visage_steps.rb +20 -0
  14. data/features/step_definitions/webrat_steps.rb +42 -0
  15. data/features/support/env.rb +36 -0
  16. data/features/visage.feature +11 -0
  17. data/lib/visage/collectd/json.rb +142 -0
  18. data/lib/visage/collectd/profile.rb +36 -0
  19. data/lib/visage/config/fallback-colors.yaml +82 -0
  20. data/lib/visage/config/init.rb +33 -0
  21. data/lib/visage/config/plugin-colors.yaml +63 -0
  22. data/lib/visage/config/profiles.yaml +35 -0
  23. data/lib/visage/config/profiles.yaml.sample +33 -0
  24. data/lib/visage/config.rb +51 -0
  25. data/lib/visage/patches.rb +18 -0
  26. data/lib/visage/public/favicon.gif +0 -0
  27. data/lib/visage/public/javascripts/application.js +4 -0
  28. data/lib/visage/public/javascripts/g.line.js +217 -0
  29. data/lib/visage/public/javascripts/g.raphael.js +7 -0
  30. data/lib/visage/public/javascripts/graph.js +510 -0
  31. data/lib/visage/public/javascripts/mootools-1.2.3-core.js +4036 -0
  32. data/lib/visage/public/javascripts/mootools-1.2.3.1-more.js +104 -0
  33. data/lib/visage/public/javascripts/raphael-min.js +7 -0
  34. data/lib/visage/public/javascripts/raphael.js +3215 -0
  35. data/lib/visage/public/stylesheets/screen.css +96 -0
  36. data/lib/visage/views/index.haml +48 -0
  37. data/lib/visage/views/layout.haml +22 -0
  38. data/lib/visage/views/single.haml +43 -0
  39. data/lib/visage-app.rb +81 -0
  40. metadata +142 -0
@@ -0,0 +1,96 @@
1
+ /* resets */
2
+ body {
3
+ font-size: 62.5%;
4
+ }
5
+
6
+ * {
7
+ margin: 0;
8
+ padding: 0;
9
+ }
10
+
11
+ a {
12
+ text-decoration: none;
13
+ }
14
+
15
+ /* styles */
16
+
17
+ a { color: #3465a4; padding: 2px 0px; }
18
+ a:hover { color: white; background-color: #3465a4; }
19
+ a:visited { color: #75507b; }
20
+ a:hover:visited { color: white; background-color: #75507b; }
21
+ a:active { color: white; background-color: #cc0000; }
22
+
23
+ p {
24
+ margin: 0 0 1em;
25
+ }
26
+
27
+ li {
28
+ margin: 0.55em 0 0.55em 1em;
29
+ list-style-type: none;
30
+ }
31
+
32
+ body {
33
+ font-family: Bitstream Vera Serif, Baskerville, Garamond, serif;
34
+ font-size: 1.2em;
35
+ }
36
+
37
+ div#header {
38
+ float: left;
39
+ width: 20em;
40
+ }
41
+
42
+ div.nav {
43
+ float: left;
44
+ margin: 1em;
45
+ margin-right: 2em;
46
+ }
47
+
48
+ div.nav li {
49
+ margin-left: 2px;
50
+ }
51
+
52
+ div#header {
53
+ margin: 1em 0.5em;
54
+ }
55
+
56
+ div#graphs {
57
+ clear: both;
58
+ padding: 0 2em;
59
+ border-top: 1px dashed #babdb6;
60
+ margin-top: 2em;
61
+ }
62
+
63
+ div.graph {
64
+ margin: 0.5em 0;
65
+ clear: both;
66
+ }
67
+
68
+ h1, h2, h3, h4, h5 {
69
+ font-family: Bitstream Vera Sans, Helvetica Neue, sans-serif;
70
+ }
71
+
72
+ h2, h3, h4, h5 {
73
+ /*text-transform: uppercase;*/
74
+ }
75
+
76
+ h1 {
77
+ font-size: 4em;
78
+ }
79
+
80
+ h1 span.project-name {
81
+ padding: 0 0.1em 0.1em;
82
+ background-color: #3465a4;
83
+ color: white;
84
+ }
85
+
86
+ div#footer {
87
+ font-size: 0.6em;
88
+ color: gray;
89
+ text-align: center;
90
+ margin-bottom: 2em;
91
+ }
92
+
93
+ div#nothing {
94
+ margin-top: 1em;
95
+ }
96
+
@@ -0,0 +1,48 @@
1
+ %div#nav
2
+ %div#hosts.nav
3
+ %h2 Hosts
4
+ %ul
5
+ - if !Visage::Config.rrddir
6
+ %li
7
+ You need to specify <strong>rrddir</strong> in config/init.rb!
8
+ - elsif @hosts.empty?
9
+ %li
10
+ No hosts found. Please check <strong>rrddir</strong> in config/init.rb!
11
+ - else
12
+ - @hosts.each do |host|
13
+ %li
14
+ %a{:href => "/#{host}"}= host
15
+
16
+ - if host = params[:host]
17
+ %div#profiles.nav
18
+ %h2 Profiles
19
+
20
+ %ul
21
+ - @profiles.each do |profile|
22
+ %li
23
+ %a{:href => "/#{host}/#{profile.splat}"}= profile.name
24
+
25
+ %div#graphs
26
+ - if @profile && @profile.plugins
27
+ - @profile.plugins.each do |graph|
28
+ - plugin, plugin_instances = graph.split('/', 2)
29
+ - graph_id = "graph#{graph.gsub(/[^\w+]/, '_')}"
30
+ %div.graph
31
+ %div{:id => graph_id}
32
+ :javascript
33
+ window.addEvent('domready', function() {
34
+ var graph = new visageGraph('#{graph_id}', '#{params[:host]}', '#{plugin}', {
35
+ width: 900,
36
+ height: 220,
37
+ gridWidth: 800,
38
+ gridHeight: 200,
39
+ shade: #{Visage::Config.shade || false},
40
+ pluginInstance: '#{plugin_instances || ''}',
41
+ name: '#{plugin} on #{host}'
42
+ });
43
+ });
44
+
45
+ - else
46
+ %div#nothing
47
+ Sorry, nothing to display!
48
+
@@ -0,0 +1,22 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title Visage
5
+ %link{:rel => "icon", :type => "image/gif", :href => "/favicon.gif"}
6
+ %link{:rel => 'stylesheet', :href => '/stylesheets/screen.css', :type => 'text/css'}
7
+ %script{:type => "text/javascript", :src => "/javascripts/raphael-min.js"}
8
+ %script{:type => "text/javascript", :src => "/javascripts/g.raphael.js"}
9
+ %script{:type => "text/javascript", :src => "/javascripts/g.line.js"}
10
+ %script{:type => "text/javascript", :src => "/javascripts/mootools-1.2.3-core.js"}
11
+ %script{:type => "text/javascript", :src => "/javascripts/mootools-1.2.3.1-more.js"}
12
+ %script{:type => "text/javascript", :src => "/javascripts/graph.js"}
13
+ %script{:type => "text/javascript", :src => "/javascripts/application.js"}
14
+
15
+ %body
16
+ %div#wrapper
17
+ %div#header
18
+ %h1.project
19
+ %span.project-name Visage
20
+ %div#content
21
+ = yield
22
+
@@ -0,0 +1,43 @@
1
+ %div#header
2
+ %h1 Visage
3
+
4
+ %div#single
5
+ %h3 Graph
6
+ %div.labels.container
7
+ %div#graph.holder
8
+ :javascript
9
+ window.addEvent('domready', function() {
10
+ var graph = new visageGraph('graph', 'theodor', 'cpu-0', {
11
+ width: 900,
12
+ height: 220,
13
+ gridWidth: 800,
14
+ gridHeight: 200
15
+ });
16
+ });
17
+
18
+ %h3 Load
19
+ %div.labels.container
20
+ %div#graph-load.holder
21
+ :javascript
22
+ window.addEvent('domready', function() {
23
+ var graph = new visageGraph('graph-load', 'theodor', 'load', {
24
+ width: 900,
25
+ height: 220,
26
+ gridWidth: 800,
27
+ gridHeight: 200
28
+ });
29
+ });
30
+
31
+ %h3 Memory
32
+ %div.labels.container
33
+ %div#graph-memory.holder
34
+ :javascript
35
+ window.addEvent('domready', function() {
36
+ var graph = new visageGraph('graph-memory', 'theodor', 'memory', {
37
+ width: 900,
38
+ height: 220,
39
+ gridWidth: 800,
40
+ gridHeight: 200
41
+ });
42
+ });
43
+
data/lib/visage-app.rb ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pathname'
4
+ @root = Pathname.new(File.dirname(__FILE__)).expand_path
5
+ $: << @root.to_s
6
+
7
+ require 'sinatra'
8
+ require 'errand'
9
+ require 'yajl'
10
+ require 'haml'
11
+ require 'visage/collectd/json'
12
+ require 'visage/config'
13
+
14
+ set :public, @root.join('visage/public')
15
+ set :views, @root.join('visage/views')
16
+
17
+ configure do
18
+ require 'visage/config/init'
19
+
20
+ CollectdJSON.rrddir = Visage::Config.rrddir
21
+ Visage::Config::Profiles.profiles = Visage::Config.profiles
22
+ end
23
+
24
+ # infrastructure for embedding
25
+ get '/javascripts/visage.js' do
26
+ javascript = ""
27
+ %w{raphael-min g.raphael g.line mootools-1.2.3-core mootools-1.2.3.1-more graph}.each do |js|
28
+ javascript += File.read(File.join(__DIR__, 'public', 'javascripts', "#{js}.js"))
29
+ end
30
+ javascript
31
+ end
32
+
33
+ # user facing
34
+ get '/' do
35
+ @hosts = CollectdJSON.hosts
36
+ haml :index
37
+ end
38
+
39
+ get '/:host' do
40
+ @hosts = CollectdJSON.hosts
41
+ @profiles = Visage::Config::Profiles.all
42
+
43
+ haml :index
44
+ end
45
+
46
+ get '/:host/:profile' do
47
+ @hosts = CollectdJSON.hosts
48
+ @profiles = Visage::Config::Profiles.all
49
+ @profile = Visage::Config::Profiles.get(params[:profile])
50
+
51
+ haml :index
52
+ end
53
+
54
+ # JSON data backend
55
+
56
+ # /data/:host/:plugin/:optional_plugin_instance
57
+ get %r{/data/([^/]+)/([^/]+)((/[^/]+)*)} do
58
+ host = params[:captures][0]
59
+ plugin = params[:captures][1]
60
+ plugin_instances = params[:captures][2]
61
+
62
+ collectd = CollectdJSON.new(:rrddir => Visage::Config.rrddir,
63
+ :fallback_colors => Visage::Config.fallback_colors)
64
+ json = collectd.json(:host => host,
65
+ :plugin => plugin,
66
+ :plugin_instances => plugin_instances,
67
+ :start => params[:start],
68
+ :finish => params[:finish],
69
+ :plugin_colors => Visage::Config.plugin_colors)
70
+ # if the request is cross-domain, we need to serve JSONP
71
+ maybe_wrap_with_callback(json)
72
+ end
73
+
74
+ # wraps json with a callback method that JSONP clients can call
75
+ def maybe_wrap_with_callback(json)
76
+ if params[:callback]
77
+ params[:callback] + '(' + json + ')'
78
+ else
79
+ json
80
+ end
81
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: visage-app
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Lindsay Holmwood
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-06-24 00:00:00 -07:00
13
+ default_executable: visage
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sinatra
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "="
22
+ - !ruby/object:Gem::Version
23
+ version: "1.0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: tilt
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.1
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: haml
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ version: 3.0.13
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: errand
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.7.2
54
+ version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: yajl-ruby
57
+ type: :runtime
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.7.6
64
+ version:
65
+ description: Visage is a web interface for viewing collectd statistics. It also provides a JSON interface onto collectd's RRD data, giving you an easy way to mash up the data.
66
+ email: lindsay@holmwood.id.au
67
+ executables:
68
+ - visage
69
+ extensions: []
70
+
71
+ extra_rdoc_files:
72
+ - README.md
73
+ files:
74
+ - .gitignore
75
+ - README.md
76
+ - Rakefile
77
+ - VERSION
78
+ - bin/visage
79
+ - config.ru
80
+ - features/json.feature
81
+ - features/site.feature
82
+ - features/step_definitions/form_steps.rb
83
+ - features/step_definitions/json_steps.rb
84
+ - features/step_definitions/result_steps.rb
85
+ - features/step_definitions/site_steps.rb
86
+ - features/step_definitions/visage_steps.rb
87
+ - features/step_definitions/webrat_steps.rb
88
+ - features/support/env.rb
89
+ - features/visage.feature
90
+ - lib/visage-app.rb
91
+ - lib/visage/collectd/json.rb
92
+ - lib/visage/collectd/profile.rb
93
+ - lib/visage/config.rb
94
+ - lib/visage/config/fallback-colors.yaml
95
+ - lib/visage/config/init.rb
96
+ - lib/visage/config/plugin-colors.yaml
97
+ - lib/visage/config/profiles.yaml
98
+ - lib/visage/config/profiles.yaml.sample
99
+ - lib/visage/patches.rb
100
+ - lib/visage/public/favicon.gif
101
+ - lib/visage/public/javascripts/application.js
102
+ - lib/visage/public/javascripts/g.line.js
103
+ - lib/visage/public/javascripts/g.raphael.js
104
+ - lib/visage/public/javascripts/graph.js
105
+ - lib/visage/public/javascripts/mootools-1.2.3-core.js
106
+ - lib/visage/public/javascripts/mootools-1.2.3.1-more.js
107
+ - lib/visage/public/javascripts/raphael-min.js
108
+ - lib/visage/public/javascripts/raphael.js
109
+ - lib/visage/public/stylesheets/screen.css
110
+ - lib/visage/views/index.haml
111
+ - lib/visage/views/layout.haml
112
+ - lib/visage/views/single.haml
113
+ has_rdoc: true
114
+ homepage: http://github.com/auxesis/visage
115
+ licenses: []
116
+
117
+ post_install_message:
118
+ rdoc_options:
119
+ - --charset=UTF-8
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: "0"
127
+ version:
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: "0"
133
+ version:
134
+ requirements: []
135
+
136
+ rubyforge_project:
137
+ rubygems_version: 1.3.5
138
+ signing_key:
139
+ specification_version: 3
140
+ summary: a web (interface | service) for viewing collectd statistics
141
+ test_files: []
142
+