summaryrefslogtreecommitdiff
path: root/lib/oxidized/api
diff options
context:
space:
mode:
Diffstat (limited to 'lib/oxidized/api')
-rw-r--r--lib/oxidized/api/web.rb19
-rw-r--r--lib/oxidized/api/web/public/css/oxidized.css35
-rw-r--r--lib/oxidized/api/web/views/default.haml4
-rw-r--r--lib/oxidized/api/web/views/head.haml3
-rw-r--r--lib/oxidized/api/web/views/node.haml6
-rw-r--r--lib/oxidized/api/web/views/nodes.haml27
-rw-r--r--lib/oxidized/api/web/webapp.rb98
7 files changed, 192 insertions, 0 deletions
diff --git a/lib/oxidized/api/web.rb b/lib/oxidized/api/web.rb
new file mode 100644
index 0000000..9a5a507
--- /dev/null
+++ b/lib/oxidized/api/web.rb
@@ -0,0 +1,19 @@
+module Oxidized
+ module API
+ class Web
+ attr_reader :thread
+ def initialize nodes, listen
+ require 'oxidized/api/web/webapp'
+ addr, port = listen.to_s.split ':'
+ port, addr = addr, nil if not port
+ WebApp.set :server, %w(puma)
+ WebApp.set :bind, addr if addr
+ WebApp.set :port, port
+ WebApp.set :nodes, nodes
+ end
+ def run
+ @thread = Thread.new { WebApp.run! }
+ end
+ end
+ end
+end
diff --git a/lib/oxidized/api/web/public/css/oxidized.css b/lib/oxidized/api/web/public/css/oxidized.css
new file mode 100644
index 0000000..8455513
--- /dev/null
+++ b/lib/oxidized/api/web/public/css/oxidized.css
@@ -0,0 +1,35 @@
+body {
+ background: #fdf6e3;
+ color: #002b36;
+}
+
+a:link {
+ /* color: #268bd2; */
+ color: #dc322f;
+ text-decoration: none;
+}
+
+a:visited {
+}
+
+a:hover {
+ color: #d33682;
+ text-decoration: underline;
+}
+
+a:active {
+}
+
+tr.odd {
+ background: #eee8d5;
+}
+
+tr.even {
+ background: #fdf6e3;
+}
+
+tr:hover {
+ background: #586e75;
+ color: #fdf6e3;
+}
+
diff --git a/lib/oxidized/api/web/views/default.haml b/lib/oxidized/api/web/views/default.haml
new file mode 100644
index 0000000..1ff1f4b
--- /dev/null
+++ b/lib/oxidized/api/web/views/default.haml
@@ -0,0 +1,4 @@
+%html
+ !=haml :head
+ %body
+ =@data
diff --git a/lib/oxidized/api/web/views/head.haml b/lib/oxidized/api/web/views/head.haml
new file mode 100644
index 0000000..1619512
--- /dev/null
+++ b/lib/oxidized/api/web/views/head.haml
@@ -0,0 +1,3 @@
+%head
+ %title oxidized
+ %link{:rel=>'stylesheet', :href=>'/css/oxidized.css'}
diff --git a/lib/oxidized/api/web/views/node.haml b/lib/oxidized/api/web/views/node.haml
new file mode 100644
index 0000000..6c68e07
--- /dev/null
+++ b/lib/oxidized/api/web/views/node.haml
@@ -0,0 +1,6 @@
+%html
+ !=haml :head
+ %body
+ -out='';PP.pp(@data,out)
+ %pre
+ =out
diff --git a/lib/oxidized/api/web/views/nodes.haml b/lib/oxidized/api/web/views/nodes.haml
new file mode 100644
index 0000000..4bc0b14
--- /dev/null
+++ b/lib/oxidized/api/web/views/nodes.haml
@@ -0,0 +1,27 @@
+%html
+ !=haml :head
+ %body
+ %a(href="/reload") reload list of nodes
+ %table
+ %tr
+ %th Name
+ %th IP
+ %th Group
+ %th Last Status
+ %th Last Time
+ %th Config
+ %th Update
+ -trclass = %w(even odd)
+ -@data.sort_by{|e|e[:name]}.each do |node|
+ -klass = trclass.rotate!.first
+ %tr{:class=>klass}
+ %td
+ %a(href="/node/show/#{node[:name]}") #{node[:name]}
+ %td= node[:ip]
+ %td= node[:group]
+ %td= node[:status]
+ %td= node[:time]
+ %td
+ %a(href="/node/fetch/#{node[:full_name]}") config
+ %td
+ %a(href="/node/next/#{node[:full_name]}") update
diff --git a/lib/oxidized/api/web/webapp.rb b/lib/oxidized/api/web/webapp.rb
new file mode 100644
index 0000000..13bd0ab
--- /dev/null
+++ b/lib/oxidized/api/web/webapp.rb
@@ -0,0 +1,98 @@
+require 'sinatra/base'
+require 'sinatra/json'
+require 'haml'
+require 'pp'
+module Oxidized
+ module API
+ class WebApp < Sinatra::Base
+
+ get '/nodes.?:format?' do
+ @data = nodes.list.map do |node|
+ node[:status] = 'never'
+ node[:time] = 'never'
+ node[:group] = 'default' unless node[:group]
+ if node[:last]
+ node[:status] = node[:last][:status]
+ node[:time] = node[:last][:end]
+ end
+ node
+ end
+ out :nodes
+ end
+
+ get '/reload.?:format?' do
+ nodes.load
+ @data = 'reloaded list of nodes'
+ out
+ end
+
+
+ get '/node/fetch/:node' do
+ node, @json = route_parse :node
+ @data = nodes.fetch node, nil
+ out :text
+ end
+
+ get '/node/fetch/:group/:node' do
+ node, @json = route_parse :node
+ @data = nodes.fetch node, params[:group]
+ out :text
+ end
+
+
+ get '/node/next/:node' do
+ node, @json = route_parse :node
+ nodes.next node
+ redirect '/nodes' unless @json
+ @data = 'ok'
+ out
+ end
+
+ # use this to attach author/email/message to commit
+ put '/node/next/:node' do
+ node, @json = route_parse :node
+ opt = JSON.load request.body.read
+ nodes.next node, opt
+ redirect '/nodes' unless @json
+ @data = 'ok'
+ out
+ end
+
+ get '/node/show/:node' do
+ node, @json = route_parse :node
+ @data = nodes.show node
+ out :node
+ end
+
+ #get '/node/:node' do
+ # @data = nodes.show params[:node]
+ # out
+ #end
+
+ def out template=:default
+ if @json or params[:format] == 'json'
+ json @data
+ elsif template == :text
+ content_type :text
+ @data
+ else
+ haml template
+ end
+ end
+
+ def nodes
+ settings.nodes
+ end
+
+ def route_parse param
+ json = false
+ e = params[param].split '.'
+ if e.last == 'json'
+ e.pop
+ json = true
+ end
+ [e.join('.'), json]
+ end
+ end
+ end
+end