subduino 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/subduino +18 -5
- data/duino/Makefile +2 -3
- data/duino/duino.pde +97 -66
- data/lib/subduino/ard_io.rb +33 -14
- data/lib/subduino/ard_ps.rb +47 -24
- data/lib/subduino/os.rb +49 -0
- data/lib/subduino/parse/bool.rb +1 -1
- data/lib/subduino/parse/energy.rb +18 -0
- data/lib/subduino/parse/flow.rb +13 -0
- data/lib/subduino/parse/lux.rb +1 -1
- data/lib/subduino/parse/presence.rb +9 -0
- data/lib/subduino/parse/pressure.rb +13 -0
- data/lib/subduino/parse/temp.rb +1 -1
- data/lib/subduino/parse.rb +3 -3
- data/lib/subduino/scaffold/Makefile +72 -73
- data/lib/subduino/scaffold/scaffold.pde +77 -0
- data/lib/subduino/store.rb +1 -1
- data/spec/subduino/parse_spec.rb +1 -1
- data/subduino.gemspec +8 -249
- metadata +8 -249
- data/webapp/Gemfile +0 -8
- data/webapp/Gemfile.lock +0 -14
- data/webapp/Rakefile +0 -49
- data/webapp/Readme.textile +0 -45
- data/webapp/VERSION +0 -1
- data/webapp/config.yml +0 -20
- data/webapp/lib/app.rb +0 -103
- data/webapp/lib/duino.rb +0 -206
- data/webapp/lib/environment.rb +0 -36
- data/webapp/lib/messenger.rb +0 -16
- data/webapp/public/app.css +0 -119
- data/webapp/public/app.js +0 -34
- data/webapp/public/custom.js +0 -187
- data/webapp/public/date_input.css +0 -149
- data/webapp/public/facebox.css +0 -83
- data/webapp/public/facebox.js +0 -319
- data/webapp/public/favicon.ico +0 -0
- data/webapp/public/faye.js +0 -1
- data/webapp/public/icons/alarm-clock-blue.png +0 -0
- data/webapp/public/icons/alarm-clock.png +0 -0
- data/webapp/public/icons/balloon-left.png +0 -0
- data/webapp/public/icons/bandaid.png +0 -0
- data/webapp/public/icons/bell-disable.png +0 -0
- data/webapp/public/icons/bell.png +0 -0
- data/webapp/public/icons/big_icon.png +0 -0
- data/webapp/public/icons/bomb.png +0 -0
- data/webapp/public/icons/bookmark.png +0 -0
- data/webapp/public/icons/box-label.png +0 -0
- data/webapp/public/icons/brightness-control-up.png +0 -0
- data/webapp/public/icons/brightness-control.png +0 -0
- data/webapp/public/icons/brightness-small.png +0 -0
- data/webapp/public/icons/broom.png +0 -0
- data/webapp/public/icons/bug.png +0 -0
- data/webapp/public/icons/calculator.png +0 -0
- data/webapp/public/icons/calendar-day.png +0 -0
- data/webapp/public/icons/camera.png +0 -0
- data/webapp/public/icons/cards-address.png +0 -0
- data/webapp/public/icons/chart.png +0 -0
- data/webapp/public/icons/clock-select.png +0 -0
- data/webapp/public/icons/color.png +0 -0
- data/webapp/public/icons/compass.png +0 -0
- data/webapp/public/icons/control-power-small.png +0 -0
- data/webapp/public/icons/control-power.png +0 -0
- data/webapp/public/icons/control-record-small.png +0 -0
- data/webapp/public/icons/cpus.png +0 -0
- data/webapp/public/icons/credit-card.png +0 -0
- data/webapp/public/icons/cross-small.png +0 -0
- data/webapp/public/icons/current.png +0 -0
- data/webapp/public/icons/dashboard.png +0 -0
- data/webapp/public/icons/database.png +0 -0
- data/webapp/public/icons/databases.png +0 -0
- data/webapp/public/icons/day.png +0 -0
- data/webapp/public/icons/door-big.png +0 -0
- data/webapp/public/icons/door-open-in.png +0 -0
- data/webapp/public/icons/door-open-out.png +0 -0
- data/webapp/public/icons/door-open.png +0 -0
- data/webapp/public/icons/door.png +0 -0
- data/webapp/public/icons/drive-globe.png +0 -0
- data/webapp/public/icons/equalizer.png +0 -0
- data/webapp/public/icons/exclamation-diamond.png +0 -0
- data/webapp/public/icons/exclamation.png +0 -0
- data/webapp/public/icons/eye-disable.png +0 -0
- data/webapp/public/icons/eye.png +0 -0
- data/webapp/public/icons/false.png +0 -0
- data/webapp/public/icons/favicon.png +0 -0
- data/webapp/public/icons/gear-small.png +0 -0
- data/webapp/public/icons/gear.png +0 -0
- data/webapp/public/icons/groups.png +0 -0
- data/webapp/public/icons/heart.png +0 -0
- data/webapp/public/icons/heart_empty.png +0 -0
- data/webapp/public/icons/info.png +0 -0
- data/webapp/public/icons/irrigation.png +0 -0
- data/webapp/public/icons/key.png +0 -0
- data/webapp/public/icons/lamp-big.png +0 -0
- data/webapp/public/icons/lightbulb.png +0 -0
- data/webapp/public/icons/lightbulb_off.png +0 -0
- data/webapp/public/icons/lightning-disable.png +0 -0
- data/webapp/public/icons/lightning-small.png +0 -0
- data/webapp/public/icons/lightning.png +0 -0
- data/webapp/public/icons/lock-unlock.png +0 -0
- data/webapp/public/icons/lock.png +0 -0
- data/webapp/public/icons/locked.png +0 -0
- data/webapp/public/icons/lux.png +0 -0
- data/webapp/public/icons/marker.png +0 -0
- data/webapp/public/icons/media-player-phone.png +0 -0
- data/webapp/public/icons/megaphone.png +0 -0
- data/webapp/public/icons/mem.png +0 -0
- data/webapp/public/icons/microphone.png +0 -0
- data/webapp/public/icons/monitor.png +0 -0
- data/webapp/public/icons/navigation.png +0 -0
- data/webapp/public/icons/night.png +0 -0
- data/webapp/public/icons/noise.png +0 -0
- data/webapp/public/icons/off.png +0 -0
- data/webapp/public/icons/on.png +0 -0
- data/webapp/public/icons/onoff.png +0 -0
- data/webapp/public/icons/pin.png +0 -0
- data/webapp/public/icons/plug--exclamation.png +0 -0
- data/webapp/public/icons/plug-disable.png +0 -0
- data/webapp/public/icons/plug.png +0 -0
- data/webapp/public/icons/rain.png +0 -0
- data/webapp/public/icons/refrigeration.png +0 -0
- data/webapp/public/icons/restart.png +0 -0
- data/webapp/public/icons/ruby.png +0 -0
- data/webapp/public/icons/server.png +0 -0
- data/webapp/public/icons/shield-disable.png +0 -0
- data/webapp/public/icons/shield.png +0 -0
- data/webapp/public/icons/socket--exclamation.png +0 -0
- data/webapp/public/icons/socket-disable.png +0 -0
- data/webapp/public/icons/socket.png +0 -0
- data/webapp/public/icons/start.png +0 -0
- data/webapp/public/icons/stop.png +0 -0
- data/webapp/public/icons/switch--exclamation.png +0 -0
- data/webapp/public/icons/switch-disable.png +0 -0
- data/webapp/public/icons/switch-small.png +0 -0
- data/webapp/public/icons/switch.png +0 -0
- data/webapp/public/icons/target.png +0 -0
- data/webapp/public/icons/television-off.png +0 -0
- data/webapp/public/icons/television.png +0 -0
- data/webapp/public/icons/temp.png +0 -0
- data/webapp/public/icons/terminal.png +0 -0
- data/webapp/public/icons/tick-small.png +0 -0
- data/webapp/public/icons/traffic-light-off.png +0 -0
- data/webapp/public/icons/traffic-light.png +0 -0
- data/webapp/public/icons/traffic.png +0 -0
- data/webapp/public/icons/true.png +0 -0
- data/webapp/public/icons/umbrella.png +0 -0
- data/webapp/public/icons/unlocked.png +0 -0
- data/webapp/public/icons/unmonitor.png +0 -0
- data/webapp/public/icons/unmonitored.png +0 -0
- data/webapp/public/icons/users.png +0 -0
- data/webapp/public/icons/vcard.png +0 -0
- data/webapp/public/icons/wall.png +0 -0
- data/webapp/public/icons/wall_brick.png +0 -0
- data/webapp/public/icons/wall_disable.png +0 -0
- data/webapp/public/icons/wand-disable.png +0 -0
- data/webapp/public/icons/wand.png +0 -0
- data/webapp/public/icons/warn.png +0 -0
- data/webapp/public/icons/weather_clouds.png +0 -0
- data/webapp/public/icons/weather_cloudy.png +0 -0
- data/webapp/public/icons/weather_lightning.png +0 -0
- data/webapp/public/icons/weather_rain.png +0 -0
- data/webapp/public/icons/weather_snow.png +0 -0
- data/webapp/public/icons/weather_sun.png +0 -0
- data/webapp/public/icons/wrench-screwdriver.png +0 -0
- data/webapp/public/icons/wrench.png +0 -0
- data/webapp/public/images/ajax-loader.gif +0 -0
- data/webapp/public/images/b.png +0 -0
- data/webapp/public/images/bendl.gif +0 -0
- data/webapp/public/images/bendr.gif +0 -0
- data/webapp/public/images/bendsb.gif +0 -0
- data/webapp/public/images/bg.jpg +0 -0
- data/webapp/public/images/bhead.gif +0 -0
- data/webapp/public/images/bheadl.gif +0 -0
- data/webapp/public/images/bheadr.gif +0 -0
- data/webapp/public/images/bl.png +0 -0
- data/webapp/public/images/bnd.gif +0 -0
- data/webapp/public/images/br.png +0 -0
- data/webapp/public/images/bread.gif +0 -0
- data/webapp/public/images/btnb.gif +0 -0
- data/webapp/public/images/btnb_.gif +0 -0
- data/webapp/public/images/btnm.gif +0 -0
- data/webapp/public/images/btnm_.gif +0 -0
- data/webapp/public/images/btns.gif +0 -0
- data/webapp/public/images/btns_.gif +0 -0
- data/webapp/public/images/cal.jpg +0 -0
- data/webapp/public/images/close.png +0 -0
- data/webapp/public/images/closelabel.gif +0 -0
- data/webapp/public/images/error.gif +0 -0
- data/webapp/public/images/ft.gif +0 -0
- data/webapp/public/images/hdr.gif +0 -0
- data/webapp/public/images/hdrl.gif +0 -0
- data/webapp/public/images/hdrr.gif +0 -0
- data/webapp/public/images/hld.jpg +0 -0
- data/webapp/public/images/imgb.gif +0 -0
- data/webapp/public/images/imgo.gif +0 -0
- data/webapp/public/images/imgt.gif +0 -0
- data/webapp/public/images/info.gif +0 -0
- data/webapp/public/images/jquery.wysiwyg.gif +0 -0
- data/webapp/public/images/li.gif +0 -0
- data/webapp/public/images/mbg.png +0 -0
- data/webapp/public/images/nsp.gif +0 -0
- data/webapp/public/images/phs.gif +0 -0
- data/webapp/public/images/sdd.jpg +0 -0
- data/webapp/public/images/sdd_.jpg +0 -0
- data/webapp/public/images/sidebar.gif +0 -0
- data/webapp/public/images/sorta.gif +0 -0
- data/webapp/public/images/sortd.gif +0 -0
- data/webapp/public/images/srch.gif +0 -0
- data/webapp/public/images/srch_.gif +0 -0
- data/webapp/public/images/success.gif +0 -0
- data/webapp/public/images/thumb1.jpg +0 -0
- data/webapp/public/images/thumb2.jpg +0 -0
- data/webapp/public/images/thumb3.jpg +0 -0
- data/webapp/public/images/tiny.gif +0 -0
- data/webapp/public/images/tiny_.gif +0 -0
- data/webapp/public/images/tl.png +0 -0
- data/webapp/public/images/tr.png +0 -0
- data/webapp/public/images/upload.gif +0 -0
- data/webapp/public/images/warning.gif +0 -0
- data/webapp/public/iui/backButton.png +0 -0
- data/webapp/public/iui/blueButton.png +0 -0
- data/webapp/public/iui/cancel.png +0 -0
- data/webapp/public/iui/grayButton.png +0 -0
- data/webapp/public/iui/greenButton.png +0 -0
- data/webapp/public/iui/iui-logo-touch-icon.png +0 -0
- data/webapp/public/iui/iui.css +0 -396
- data/webapp/public/iui/iui.js +0 -511
- data/webapp/public/iui/iuix.css +0 -1
- data/webapp/public/iui/iuix.js +0 -1
- data/webapp/public/iui/listArrow.png +0 -0
- data/webapp/public/iui/listArrowSel.png +0 -0
- data/webapp/public/iui/listGroup.png +0 -0
- data/webapp/public/iui/loading.gif +0 -0
- data/webapp/public/iui/pinstripes.png +0 -0
- data/webapp/public/iui/redButton.png +0 -0
- data/webapp/public/iui/selection.png +0 -0
- data/webapp/public/iui/thumb.png +0 -0
- data/webapp/public/iui/toggle.png +0 -0
- data/webapp/public/iui/toggleOn.png +0 -0
- data/webapp/public/iui/toolButton.png +0 -0
- data/webapp/public/iui/toolbar.png +0 -0
- data/webapp/public/iui/whiteButton.png +0 -0
- data/webapp/public/iui/yellowButton.png +0 -0
- data/webapp/public/jquery.img.preload.js +0 -152
- data/webapp/public/jquery.js +0 -154
- data/webapp/public/jquery.sparkline.js +0 -85
- data/webapp/public/jquery.tablesorter.min.js +0 -2
- data/webapp/public/jquery.visualize.js +0 -452
- data/webapp/public/jquery.wysiwyg.css +0 -56
- data/webapp/public/layout.css +0 -33
- data/webapp/public/right.js +0 -9
- data/webapp/public/rt.js +0 -7
- data/webapp/public/sparkline.js +0 -85
- data/webapp/public/style.css +0 -881
- data/webapp/public/visualize.css +0 -32
- data/webapp/spec/duino_spec.rb +0 -8
- data/webapp/spec/spec_helper.rb +0 -10
- data/webapp/views/command.haml +0 -4
- data/webapp/views/icon.haml +0 -6
- data/webapp/views/index.haml +0 -367
- data/webapp/views/layout.haml +0 -88
- data/webapp/views/mobile.haml +0 -21
- data/webapp/views/switch.haml +0 -56
- data/webapp/views/template.haml +0 -676
- data/webapp/views/top.haml +0 -4
- data/webapp/views/watch.haml +0 -26
data/webapp/Readme.textile
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
h2. Description
|
2
|
-
|
3
|
-
Friendly web "Arduino":http://arduino.cc
|
4
|
-
|
5
|
-
h2. Screenshots
|
6
|
-
|
7
|
-
|
8
|
-
h3. Requirements
|
9
|
-
|
10
|
-
* "Sinatra":http://sinatrarb.com/
|
11
|
-
|
12
|
-
h3. Install
|
13
|
-
|
14
|
-
|
15
|
-
gem install duino
|
16
|
-
|
17
|
-
h2. Usage
|
18
|
-
|
19
|
-
username: foo
|
20
|
-
</pre>
|
21
|
-
|
22
|
-
h2. Contributing
|
23
|
-
|
24
|
-
duino uses "ditz":http://ditz.rubyforge.org for issue tracking. Fork
|
25
|
-
duino, clone your copy and then run:
|
26
|
-
|
27
|
-
@ditz todo@
|
28
|
-
|
29
|
-
For more details on a specific issue:
|
30
|
-
|
31
|
-
@ditz show duino-1@
|
32
|
-
|
33
|
-
Make your changes that fix a bug, then resolve it.
|
34
|
-
|
35
|
-
@ditz close duino-1@
|
36
|
-
|
37
|
-
Commit, push your changes to GitHub, then send a pull request!
|
38
|
-
|
39
|
-
h3. Author
|
40
|
-
|
41
|
-
nofxx
|
42
|
-
|
43
|
-
h3. License
|
44
|
-
|
45
|
-
"WTFPL":http://sam.zoy.org/wtfpl/
|
data/webapp/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.1.0
|
data/webapp/config.yml
DELETED
data/webapp/lib/app.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
|
2
|
-
helpers do
|
3
|
-
|
4
|
-
def get_layout
|
5
|
-
return false if request.env['HTTP_XHR']
|
6
|
-
case request.env['HTTP_USER_AGENT']
|
7
|
-
when /iPhone|iPod/ then :mobile
|
8
|
-
when /Android|Nokia/ then :mobile
|
9
|
-
else true
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
end # helpers
|
14
|
-
|
15
|
-
before do
|
16
|
-
unless (DUINO_CONFIG['username'].nil? && DUINO_CONFIG['password'].nil?) || self.request.path_info == '/heartbeat'
|
17
|
-
use Rack::Auth::Basic do |user, pass|
|
18
|
-
[user, pass] == [DUINO_CONFIG['username'], DUINO_CONFIG['password']]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
# DUINO.ping
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
set :haml, {:format => :html5 }
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
get '/' do
|
32
|
-
@statuses = DUINO.status
|
33
|
-
@watches = []
|
34
|
-
# @statuses.each do |watch, status|
|
35
|
-
# @watches << watch.to_s
|
36
|
-
# end
|
37
|
-
# @watches = @watches.group_by { |w| @statuses[w][:state].to_s }
|
38
|
-
@sensors = DUINO.sensors || []
|
39
|
-
@host = `hostname`
|
40
|
-
@stats = Duino.cpu_status
|
41
|
-
@footer = "Subduino www v0.0.1 - #{@host}"
|
42
|
-
show(:index, @host)
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
get '/o' do
|
47
|
-
@commands = %w{ false false }
|
48
|
-
@watch = :all
|
49
|
-
show(:switch, "Pins Switch")
|
50
|
-
end
|
51
|
-
|
52
|
-
get '/i' do
|
53
|
-
@text = `hostname`
|
54
|
-
show(:icon)
|
55
|
-
end
|
56
|
-
|
57
|
-
get '/t' do
|
58
|
-
@text = `top -Hibn 1`.gsub("top - ", "")
|
59
|
-
show(:top)
|
60
|
-
end
|
61
|
-
|
62
|
-
get '/heartbeat' do
|
63
|
-
@statuses = DUINO.status
|
64
|
-
'OK'
|
65
|
-
end
|
66
|
-
|
67
|
-
get '/w/:watch' do
|
68
|
-
@watch = params["watch"]
|
69
|
-
@status = DUINO.status[@watch][:state]
|
70
|
-
@commands = Duino.possible_statuses(@status)
|
71
|
-
@log = DUINO.last_log(@watch)
|
72
|
-
show(:switch, @watch)
|
73
|
-
end
|
74
|
-
|
75
|
-
get '/w/:watch/:command' do
|
76
|
-
@watch = params["watch"]
|
77
|
-
@command = params["command"]
|
78
|
-
@success = DUINO.switch(@watch, @command)
|
79
|
-
# @success = false if @success == []
|
80
|
-
@log = DUINO.last_log(@watch)
|
81
|
-
show(:command, "#{@command}ing #{@watch}")
|
82
|
-
end
|
83
|
-
|
84
|
-
get '/g/:sensor' do
|
85
|
-
@watch = params["sensor"]
|
86
|
-
@name, @sensor = *DUINO.sensors(@watch).to_a[0]
|
87
|
-
@name = @name.capitalize
|
88
|
-
@log = DUINO.log @watch
|
89
|
-
# @child = DUINO.status.keys.each.select { |k| DUINO.status[k][:sensor] == @sensor } #.select { |w| w["sensor"] = @sensor }
|
90
|
-
# @child.map!{ |c| [c, DUINO.status[c][:state]]}
|
91
|
-
# @status = nil
|
92
|
-
# @commands = Duino.possible_statuses(@status)
|
93
|
-
show(:watch, "#{@name} #{@sensor} [sensor]")
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
private
|
98
|
-
|
99
|
-
def show(template, title = 'Duino')
|
100
|
-
@title = title
|
101
|
-
request.env['HTTP_XHR']
|
102
|
-
haml(template, :layout => get_layout)
|
103
|
-
end
|
data/webapp/lib/duino.rb
DELETED
@@ -1,206 +0,0 @@
|
|
1
|
-
|
2
|
-
class Duino
|
3
|
-
|
4
|
-
Config = YAML.load(File.read("config.yml"))
|
5
|
-
|
6
|
-
def initialize(config)
|
7
|
-
@config = config
|
8
|
-
@redis = Redis.new(:timeout => 0)
|
9
|
-
end
|
10
|
-
|
11
|
-
def sensors(one=nil)
|
12
|
-
sensors = Config["inputs"]
|
13
|
-
# s = one ? Sensors.select { |k,v| k.to_s == one.to_s } : Sensors
|
14
|
-
sensors.map do |s|
|
15
|
-
p s
|
16
|
-
val = @redis.get(s[0]) #rescue nil
|
17
|
-
next unless val
|
18
|
-
Subduino::Parse.work(s[1]["type"], val, s[1]["name"])
|
19
|
-
end.reject(&:nil?)
|
20
|
-
end
|
21
|
-
|
22
|
-
def switch(pins, comm)
|
23
|
-
comm = Message.new(comm =~ /start/).txt
|
24
|
-
puts "[OUT] #{pins} #{comm}"
|
25
|
-
command(comm)
|
26
|
-
end
|
27
|
-
|
28
|
-
def log(n)
|
29
|
-
key = n + "_log"
|
30
|
-
size = @redis.llen key
|
31
|
-
@redis.lrange key, size - 100, size
|
32
|
-
end
|
33
|
-
|
34
|
-
# ping server to ensure that it is responsive
|
35
|
-
def ping
|
36
|
-
tries = 3
|
37
|
-
begin
|
38
|
-
# @server.ping
|
39
|
-
rescue Exception => e
|
40
|
-
retry if (tries -= 1) > 1
|
41
|
-
raise e, "The server is not available (or you do not have permissions to access it)"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def last_log(watch)
|
46
|
-
format_log(log_command(watch, true))
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.possible_statuses(status)
|
50
|
-
# need to check, but god doesn't have a monitored and offline state...
|
51
|
-
case status
|
52
|
-
when :up then [true, true] #%w{start monitor}
|
53
|
-
when :unmonitored then [false, false] #%w{start monitor}
|
54
|
-
else [] # nil #[false, false] #%w{start stop restart}
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.ram_status
|
59
|
-
mem = `free -mo`.split(" ")
|
60
|
-
used, free, cached, swap = mem[8], mem[9], mem[12], mem[15]
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.cpu_status
|
64
|
-
#stat = `cat /proc/stat`.split(" ")
|
65
|
-
# top = `top -bn 1`
|
66
|
-
# info, tasks, cpus, mem, swap, *rest = *top
|
67
|
-
# # Use array to keep order (ruby < 1.9)
|
68
|
-
# [[:info, info.gsub(/top - |\d{2}:\d{2}(:\d{2})?(\s|,)|\saverage/, "")],
|
69
|
-
# [:cpus, cpus.gsub("Cpu\(s\): ", "").split(", ")[0..4].join(", ")],
|
70
|
-
# [:mem, mem.gsub("Mem: ", "").gsub(/(\d*k)/) { ($1.to_i / 1000).to_s }]]
|
71
|
-
[]
|
72
|
-
end
|
73
|
-
def status
|
74
|
-
status_command
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
|
79
|
-
def command(line)
|
80
|
-
@redis.publish('subduin', line) unless line.empty?
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
# def method_missing(meth,*args)
|
85
|
-
# if %w{groups status log quit terminate}.include?(meth.to_s)
|
86
|
-
# ping
|
87
|
-
# send("#{meth}_command")
|
88
|
-
# # elsif %w{start stop restart unmonitor monitor}.include?(meth.to_s)
|
89
|
-
# # ping
|
90
|
-
# # lifecycle_command(args.first, meth.to_s)
|
91
|
-
# else
|
92
|
-
# raise NoMethodError, meth
|
93
|
-
# end
|
94
|
-
# end
|
95
|
-
|
96
|
-
def groups_command
|
97
|
-
groups = []
|
98
|
-
@server.groups.each do |key, value|
|
99
|
-
groups << key
|
100
|
-
end
|
101
|
-
groups.sort
|
102
|
-
end
|
103
|
-
|
104
|
-
def status_command
|
105
|
-
# @server.status
|
106
|
-
end
|
107
|
-
|
108
|
-
#
|
109
|
-
# To make it look good (no horiz scrollbars) in the iphone
|
110
|
-
#
|
111
|
-
def format_log(raw)
|
112
|
-
return "..." unless raw
|
113
|
-
raw.split("\n").map do |l|
|
114
|
-
# clean stuff we don't need
|
115
|
-
l.gsub!(/I\s+|\(\w*\)|within bounds/, "") # gsub(/\(\w*\)/, """)
|
116
|
-
# if ok, span is green
|
117
|
-
ok = l =~ /\[ok\]/
|
118
|
-
if l =~ /\[\w*\]/
|
119
|
-
# get some data we want...
|
120
|
-
l.gsub(/\[\S*\s(\S*)\]\W+INFO: (\w*-?\w*|.*)?\s\[(\w*)?\]/, "<span class='gray'>\\1</span> | <span class='#{ok ? 'green' : 'red'}'>\\3</span> |").
|
121
|
-
# take only the integer from cpu
|
122
|
-
gsub(/cpu/, "cpu %").gsub(/(\d{1,3})\.\d*%/, "\\1").
|
123
|
-
# show mem usage in mb
|
124
|
-
gsub(/memory/, "mem mb").gsub(/(\d*kb)/) { ($1.to_i / 1000).to_s }
|
125
|
-
else
|
126
|
-
l.gsub(/\[\S*\s(\S*)\]\W+INFO: \w*\s(\w*)/, "<span class='gray'>\\1</span> | <span class='act'>act</span> | \\2")
|
127
|
-
end
|
128
|
-
|
129
|
-
end.reverse.join("</br>")
|
130
|
-
end
|
131
|
-
|
132
|
-
#TODO
|
133
|
-
def log_command(name, sample=false)
|
134
|
-
# begin
|
135
|
-
# Signal.trap('INT') { exit }
|
136
|
-
# # name = @args[1]
|
137
|
-
|
138
|
-
# unless name
|
139
|
-
# puts "You must specify a Task or Group name"
|
140
|
-
# exit!
|
141
|
-
# end
|
142
|
-
|
143
|
-
# t = Time.at(0)
|
144
|
-
# if sample
|
145
|
-
# @server.running_log(name, t)
|
146
|
-
# else
|
147
|
-
# loop do
|
148
|
-
# @server.running_log(name, t)
|
149
|
-
# t = Time.now
|
150
|
-
# sleep 1
|
151
|
-
# end
|
152
|
-
# end
|
153
|
-
# rescue God::NoSuchWatchError
|
154
|
-
# puts "No such watch"
|
155
|
-
# rescue DRb::DRbConnError
|
156
|
-
# puts "The server went away"
|
157
|
-
# end
|
158
|
-
end
|
159
|
-
|
160
|
-
def quit_command
|
161
|
-
begin
|
162
|
-
@server.terminate
|
163
|
-
return false
|
164
|
-
rescue DRb::DRbConnError
|
165
|
-
return true
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def terminate_command
|
170
|
-
stopped_all = false
|
171
|
-
if @server.stop_all
|
172
|
-
stopped_all = true
|
173
|
-
end
|
174
|
-
|
175
|
-
begin
|
176
|
-
@server.terminate
|
177
|
-
return false
|
178
|
-
rescue DRb::DRbConnError
|
179
|
-
return stopped_all
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
|
184
|
-
def lifecycle_command(*args)
|
185
|
-
# get the name of the watch/group
|
186
|
-
name = args.first
|
187
|
-
command = args.last
|
188
|
-
|
189
|
-
# send @command
|
190
|
-
watches = @server.control(name, command)
|
191
|
-
|
192
|
-
watches.empty? ? [] : watches
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|
196
|
-
|
197
|
-
|
198
|
-
# def halt!
|
199
|
-
# puts "Closing server"
|
200
|
-
# @redis.quit
|
201
|
-
# puts "..."
|
202
|
-
# exit
|
203
|
-
# end
|
204
|
-
|
205
|
-
# trap(:TERM) { halt! }
|
206
|
-
# trap(:INT) { halt! }
|
data/webapp/lib/environment.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__)))
|
3
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
4
|
-
|
5
|
-
require 'rubygems'
|
6
|
-
require 'sinatra'
|
7
|
-
require 'eventmachine'
|
8
|
-
require 'readline'
|
9
|
-
require 'redis'
|
10
|
-
require 'stringio'
|
11
|
-
require 'yaml'
|
12
|
-
require 'haml'
|
13
|
-
require 'optparse'
|
14
|
-
require 'duino'
|
15
|
-
require 'subduino/parse'
|
16
|
-
|
17
|
-
config = {
|
18
|
-
'username' => nil,
|
19
|
-
'password' => nil
|
20
|
-
}
|
21
|
-
|
22
|
-
begin
|
23
|
-
config.merge!(YAML.load(File.read(ARGV[0])))
|
24
|
-
DUINO_CONFIG = config
|
25
|
-
rescue
|
26
|
-
DUINO_CONFIG = config
|
27
|
-
end
|
28
|
-
DUINO = Duino.new(config)
|
29
|
-
|
30
|
-
# Require app
|
31
|
-
require "messenger"
|
32
|
-
include Messenger
|
33
|
-
require "app"
|
34
|
-
|
35
|
-
Sinatra::Application.public = File.dirname(__FILE__) + "/../public"
|
36
|
-
Sinatra::Application.views = File.dirname(__FILE__) + "/../views"
|
data/webapp/lib/messenger.rb
DELETED
data/webapp/public/app.css
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
color: #222;
|
3
|
-
}
|
4
|
-
|
5
|
-
.home_icon_div {
|
6
|
-
padding-top: 80px;
|
7
|
-
background: transparent url(../icons/big_icon.png) no-repeat scroll center center;
|
8
|
-
height: 300px;
|
9
|
-
}
|
10
|
-
|
11
|
-
.home_icon_txt {
|
12
|
-
font-size: 4em;
|
13
|
-
font-weight: bold;
|
14
|
-
color: #2f6a9f;
|
15
|
-
text-shadow: rgba(255, 255, 255, 0.75) 2px 2px 0;
|
16
|
-
margin-bottom: 50px
|
17
|
-
}
|
18
|
-
|
19
|
-
.home_icon_info {
|
20
|
-
position: absolute
|
21
|
-
top: -100px
|
22
|
-
font-size: 1em;
|
23
|
-
margin-bottom: 100px;
|
24
|
-
font-weight: bold;
|
25
|
-
color: #eee
|
26
|
-
}
|
27
|
-
|
28
|
-
fieldset > ul {
|
29
|
-
padding: 0px 10px;
|
30
|
-
}
|
31
|
-
|
32
|
-
fieldset > ul > li {
|
33
|
-
text-align: left;
|
34
|
-
background:#FFFFFF none repeat scroll 0 0;
|
35
|
-
position: relative;
|
36
|
-
margin: 0;
|
37
|
-
border-bottom: 1px solid #E0E0E0;
|
38
|
-
padding: 8px 0 8px 0px;
|
39
|
-
font-size: 20px;
|
40
|
-
font-weight: bold;
|
41
|
-
list-style: none;
|
42
|
-
}
|
43
|
-
|
44
|
-
fieldset > ul > li > a {
|
45
|
-
display: block;
|
46
|
-
margin: -8px 0 -8px -10px;
|
47
|
-
padding: 8px 32px 8px 10px;
|
48
|
-
text-decoration: none;
|
49
|
-
color: inherit;
|
50
|
-
background: url(iui/listArrow.png) no-repeat right center;
|
51
|
-
}
|
52
|
-
|
53
|
-
li img {
|
54
|
-
border:medium none;
|
55
|
-
float:left;
|
56
|
-
margin:4px 8px 0px 0px;
|
57
|
-
}
|
58
|
-
|
59
|
-
.pico {font-size: 0.6em; }
|
60
|
-
.tiny {font-size: 0.8em; }
|
61
|
-
li.tiny img { margin-top: 0px; }
|
62
|
-
|
63
|
-
.gray { color: #aaa; }
|
64
|
-
|
65
|
-
.green {
|
66
|
-
color: #00aa00;
|
67
|
-
font-weight: bold;
|
68
|
-
}
|
69
|
-
.red {
|
70
|
-
color: #aa0000;
|
71
|
-
font-weight: bold;
|
72
|
-
}
|
73
|
-
.act {
|
74
|
-
color: #999900;
|
75
|
-
font-weight: bold;
|
76
|
-
}
|
77
|
-
|
78
|
-
.yellowButton,
|
79
|
-
.greenButton {
|
80
|
-
display: block;
|
81
|
-
border-width: 0 12px;
|
82
|
-
padding: 10px;
|
83
|
-
text-align: center;
|
84
|
-
font-size: 20px;
|
85
|
-
font-weight: bold;
|
86
|
-
text-decoration: inherit;
|
87
|
-
color: inherit;
|
88
|
-
}
|
89
|
-
|
90
|
-
.greenButton {
|
91
|
-
-webkit-border-image: url(../iui/greenButton.png) 0 12 0 12;
|
92
|
-
color:#fff;
|
93
|
-
text-shadow: #007a00 0 -1px 0;
|
94
|
-
}
|
95
|
-
|
96
|
-
.yellowButton {
|
97
|
-
-webkit-border-image: url(../iui/yellowButton.png) 0 12 0 12;
|
98
|
-
color:#fff;
|
99
|
-
text-shadow: #007a7a 0 -1px 0;
|
100
|
-
}
|
101
|
-
|
102
|
-
.code {
|
103
|
-
font-size: 14px;
|
104
|
-
font-family: Courier;
|
105
|
-
color: #33EE33;
|
106
|
-
background-color: #222;
|
107
|
-
padding-left: 15px;
|
108
|
-
white-space: nowrap;
|
109
|
-
overflow: auto;
|
110
|
-
padding-top: 8px;
|
111
|
-
}
|
112
|
-
|
113
|
-
|
114
|
-
/* PC */
|
115
|
-
|
116
|
-
.right {
|
117
|
-
width: 50%;
|
118
|
-
float: right;
|
119
|
-
}
|
data/webapp/public/app.js
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
//FIXME: grr... bug if you run once, cancel, and try to run on another watch (hate js..)
|
2
|
-
function submitCommand(action, watch) {
|
3
|
-
var comm;
|
4
|
-
var act;
|
5
|
-
var s;
|
6
|
-
|
7
|
-
if (document.getElementById("toggle_" + action)) {
|
8
|
-
act = document.getElementById("toggle_" + action);
|
9
|
-
s = act.getAttribute("toggled");
|
10
|
-
|
11
|
-
if(action == "power") {
|
12
|
-
comm = (s == "true") ? "start" : "stop";
|
13
|
-
} else {
|
14
|
-
comm = (s == "true") ? "monitor" : "unmonitor";
|
15
|
-
}
|
16
|
-
} else {
|
17
|
-
comm = action;
|
18
|
-
}
|
19
|
-
|
20
|
-
// if (confirm("God will " + comm + " " + watch + "..")) {
|
21
|
-
//var results = document.getElementById("results");
|
22
|
-
var divTag = document.createElement("div");
|
23
|
-
divTag.id = "cresult";
|
24
|
-
document.body.appendChild(divTag);
|
25
|
-
var res = document.getElementById("cresult");
|
26
|
-
|
27
|
-
// res.innerHTML = "";
|
28
|
-
iui.showPageByHref("/w/" + watch + "/" + comm, null, null, res, null);
|
29
|
-
// } else {
|
30
|
-
//act.setAttribute("toggled", (s == "true") ? "false" : "true");
|
31
|
-
// }
|
32
|
-
return false;
|
33
|
-
}
|
34
|
-
|