ardtweeno 0.0.2 → 0.2.5

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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +179 -1
  3. data/COPYING +4 -3
  4. data/Gemfile +29 -0
  5. data/Gemfile.lock +76 -0
  6. data/INSTALL +12 -0
  7. data/Procfile +1 -0
  8. data/README.md +26 -2
  9. data/Rakefile +14 -7
  10. data/lib/ardtweeno/api.rb +542 -0
  11. data/lib/ardtweeno/configreader.rb +65 -0
  12. data/lib/ardtweeno/db.rb +51 -0
  13. data/lib/ardtweeno/dispatcher.rb +538 -0
  14. data/lib/ardtweeno/exceptions.rb +33 -0
  15. data/lib/ardtweeno/node.rb +117 -0
  16. data/lib/ardtweeno/nodemanager.rb +300 -0
  17. data/lib/ardtweeno/packet.rb +98 -0
  18. data/lib/ardtweeno/restapi.rb +266 -0
  19. data/lib/ardtweeno/serialparser.rb +221 -0
  20. data/lib/ardtweeno.rb +120 -1
  21. data/public/glossy_green_button.svg +123 -0
  22. data/public/glossy_red_button.svg +75 -0
  23. data/public/main.css +129 -0
  24. data/public/raspberrypi.jpg +0 -0
  25. data/resources/conf.yaml +41 -0
  26. data/resources/nodelist.yaml +26 -0
  27. data/resources/serialparser.js +84 -0
  28. data/test/api_test.rb +255 -0
  29. data/test/dispatcher_test.rb +115 -0
  30. data/test/node_test.rb +105 -0
  31. data/test/nodemanager_test.rb +167 -0
  32. data/test/packet_test.rb +75 -0
  33. data/test/parser_test.rb +147 -0
  34. data/test/post_watch +11 -0
  35. data/test/rest_api_test.rb +248 -0
  36. data/test/run_mock +17 -0
  37. data/test/run_packet_push +14 -0
  38. data/test/serialport_mock.rb +43 -0
  39. data/test/test_helper.rb +15 -0
  40. data/test/tty0tty-1.1/AUTHORS +1 -0
  41. data/test/tty0tty-1.1/COPYING +340 -0
  42. data/test/tty0tty-1.1/INSTALL +18 -0
  43. data/test/tty0tty-1.1/README +52 -0
  44. data/test/tty0tty-1.1/THANKS +4 -0
  45. data/test/tty0tty-1.1/TODO +3 -0
  46. data/test/tty0tty-1.1/VERSION +4 -0
  47. data/test/tty0tty-1.1/module/Makefile +41 -0
  48. data/{bin/ardtweeno → test/tty0tty-1.1/module/Module.symvers} +0 -0
  49. data/test/tty0tty-1.1/module/modules.order +1 -0
  50. data/test/tty0tty-1.1/module/tty0tty.c +678 -0
  51. data/test/tty0tty-1.1/module/tty0tty.ko +0 -0
  52. data/test/tty0tty-1.1/module/tty0tty.mod.c +51 -0
  53. data/test/tty0tty-1.1/module/tty0tty.mod.o +0 -0
  54. data/test/tty0tty-1.1/module/tty0tty.o +0 -0
  55. data/test/tty0tty-1.1/pts/Makefile +10 -0
  56. data/test/tty0tty-1.1/pts/tty0tty +0 -0
  57. data/test/tty0tty-1.1/pts/tty0tty.c +222 -0
  58. data/views/createpost.erb +45 -0
  59. data/views/home.erb +59 -0
  60. metadata +89 -37
  61. data/README +0 -1
  62. data/test/Rakefile +0 -6
  63. data/test/features/ardtweeno.feature +0 -14
  64. data/test/features/step_definitions/ardtweeno_steps.rb +0 -24
@@ -0,0 +1,300 @@
1
+ ####################################################################################################
2
+ # @author David Kirwan <davidkirwanirl@gmail.com>
3
+ # @description Node Management class for the Ardtweeno Mesh Network
4
+ #
5
+ # @date 21-02-2013
6
+ ####################################################################################################
7
+
8
+ # Imports
9
+ require 'rubygems'
10
+ require 'logger'
11
+ require 'yaml'
12
+ require 'json'
13
+ require 'ardtweeno'
14
+ require 'typhoeus'
15
+
16
+
17
+ module Ardtweeno
18
+
19
+ ##
20
+ # Ardtweeno::NodeManager class for the Ardtweeno Mesh Network
21
+ #
22
+ class NodeManager
23
+
24
+ attr_accessor :nodeList, :zones, :log, :watchlist
25
+
26
+
27
+ ##
28
+ # Ardtweeno::NodeManager#new constructor
29
+ #
30
+ # * *Args* :
31
+ # - ++ -> options Hash{:log Logger, :nodelist Array[Ardtweeno::Node]}
32
+ # * *Returns* :
33
+ # -
34
+ # * *Raises* :
35
+ #
36
+ def initialize(options={})
37
+ @log = Ardtweeno.options[:log] ||= Logger.new(STDOUT)
38
+ @log.level = Ardtweeno.options[:level] ||= Logger::DEBUG
39
+
40
+ @watchlist = Array.new
41
+
42
+ @nodeList = options[:nodelist] ||= Array.new
43
+ end
44
+
45
+
46
+ ##
47
+ # Ardtweeno::NodeManager#flush empties the packetqueue inside each Ardtweeno:Node
48
+ #
49
+ # * *Args* :
50
+ # - ++ ->
51
+ # * *Returns* :
52
+ # -
53
+ # * *Raises* :
54
+ # -
55
+ #
56
+ def flush()
57
+ @nodeList.each do |i|
58
+ i.packetqueue = Array.new
59
+ end
60
+ end
61
+
62
+
63
+
64
+ ##
65
+ # Ardtweeno::NodeManager#addNode adds an Ardtweeno::Node to the managed node list
66
+ #
67
+ # * *Args* :
68
+ # - ++ -> Ardtweeno::Node
69
+ # * *Returns* :
70
+ # - true || false
71
+ # * *Raises* :
72
+ # - Ardtweeno::NotANode
73
+ #
74
+ def addNode(node)
75
+ if node.class == Ardtweeno::Node
76
+ @log.debug "Size of nodeList before addition: #{@nodeList.size}"
77
+ @nodeList << node
78
+ @log.debug "Size of nodeList after addition: #{@nodeList.size}"
79
+
80
+ return true
81
+ else
82
+ raise Ardtweeno::NotANode, "Error Ardtweeno::NodeManager#addNode expects an Ardtweeno::Node as a parameter"
83
+ end
84
+ end
85
+
86
+
87
+ ##
88
+ # Ardtweeno::NodeManager#removeNode removes an Ardtweeno::Node from the managed nodeList
89
+ #
90
+ # * *Args* :
91
+ # - ++ -> {:node, :key}
92
+ # * *Returns* :
93
+ # - Ardtweeno::Node
94
+ # * *Raises* :
95
+ # - Ardtweeno::NotInNodeList
96
+ #
97
+ def removeNode(options={})
98
+ @log.debug "removeNode function called, searching for node in list"
99
+
100
+ begin
101
+ found = search(options)
102
+ @nodeList.delete(found)
103
+
104
+ return found
105
+
106
+ rescue Ardtweeno::NotInNodeList
107
+ return nil
108
+ end
109
+
110
+ end
111
+
112
+
113
+ ##
114
+ # Ardtweeno::NodeManager#search provides an interface to search the managed Ardtweeno::Node list
115
+ # takes a single parameter hash, expects :node or :key search strings corresponding with the
116
+ # Ardtweeno::Node you wish to search for, and returns this Node if found
117
+ # Raises Ardtweeno::NotInNodeList exception if entry not found in the list
118
+ #
119
+ # * *Args* :
120
+ # - ++ -> options Hash{:node String, :key String}
121
+ # * *Returns* :
122
+ # - Ardtweeno::Node
123
+ # * *Raises* :
124
+ # - Ardtweeno::NotInNodeList
125
+ #
126
+ def search(options={})
127
+ key = options[:key] ||= nil
128
+ node = options[:node] ||= nil
129
+
130
+ if key.nil? and node.nil? then
131
+ raise Ardtweeno::NotInNodeList, "Error key does not match any Ardtweeno::Node being maintained by this Ardtweeno::NodeManager"
132
+ end
133
+
134
+ unless key.nil? then
135
+ @log.debug "Searching the Nodelist for key: " + key
136
+
137
+ @nodeList.each do |i|
138
+ @log.debug "Comparing #{key} with #{i.key}"
139
+ if i.key == key
140
+ @log.debug "Match found, returning node"
141
+ return i
142
+ end
143
+ end
144
+
145
+ end
146
+
147
+ unless node.nil? then
148
+ @log.debug "Searching the Nodelist for node: " + node
149
+
150
+ @nodeList.each do |i|
151
+ @log.debug "Comparing #{node} with #{i.node}"
152
+ if i.node == node
153
+ @log.debug "Match found, returning #{i.to_s}"
154
+ return i
155
+ end
156
+ end
157
+ end
158
+
159
+
160
+ @log.debug "Node not found!"
161
+ # Raise NotInNodeList exception if list has been traversed and a corresponding node was
162
+ # not found
163
+ raise Ardtweeno::NotInNodeList, "Error key does not match any Ardtweeno::Node being maintained by this Ardtweeno::NodeManager"
164
+ end
165
+
166
+
167
+ ##
168
+ # Ardtweeno::NodeManager#watched? checks if a node has been added to a watchlist
169
+ #
170
+ # * *Args* :
171
+ # - ++ -> Ardtweeno::Node node
172
+ # * *Returns* :
173
+ # - True || False
174
+ # * *Raises* :
175
+ # -
176
+ #
177
+ def watched?(node)
178
+
179
+ @watchlist.each do |i|
180
+
181
+ @log.debug "Comparing " + i[:node].node + " and " + node.node
182
+ if i[:node].node == node.node
183
+ return true
184
+ end
185
+ end
186
+
187
+ return false
188
+
189
+ end
190
+
191
+
192
+ ##
193
+ # Ardtweeno::NodeManager#addWatch adds a node to the watchlist
194
+ #
195
+ # * *Args* :
196
+ # - ++ -> String node, Hash watch { String :node, String :notifyURL,
197
+ # String :method, String :timeouts }
198
+ # * *Returns* :
199
+ # -
200
+ # * *Raises* :
201
+ # - Ardtweeno::NotInNodeList
202
+ #
203
+ def addWatch(params)
204
+ begin
205
+ node = search({:node=>params[:node]})
206
+ @log.debug "Found Node: " + node.inspect
207
+
208
+ watch = { :node=>node,
209
+ :notifyURL=> params[:notifyURL],
210
+ :method=>"POST",
211
+ :timeout=>"60"
212
+ }
213
+
214
+ @log.debug "Adding watch: " + watch.inspect
215
+
216
+ @watchlist << watch
217
+
218
+ rescue Ardtweeno::NotInNodeList => e
219
+ raise e
220
+ rescue Exception => e
221
+ raise e
222
+ end
223
+ end
224
+
225
+
226
+ ##
227
+ # Ardtweeno::NodeManager#removeWatch removes a node from the watchlist
228
+ #
229
+ # * *Args* :
230
+ # - ++ -> String node
231
+ # * *Returns* :
232
+ # -
233
+ # * *Raises* :
234
+ # - Ardtweeno::NotInNodeList
235
+ #
236
+ def removeWatch(node)
237
+ begin
238
+ node = search({:node=>node})
239
+
240
+ @watchlist.each do |i|
241
+ if i[:node] == node
242
+ @watchlist.delete(i)
243
+ end
244
+ end
245
+
246
+ rescue Ardtweeno::NotInNodeList => e
247
+ raise e
248
+ end
249
+ end
250
+
251
+
252
+ ##
253
+ # Ardtweeno::NodeManager#pushNotification pushes a notification to the node watcher
254
+ #
255
+ # * *Args* :
256
+ # - ++ -> String node
257
+ # * *Returns* :
258
+ # -
259
+ # * *Raises* :
260
+ # -
261
+ #
262
+ def pushNotification(node)
263
+
264
+ @log.debug "Traversing watchlist"
265
+ @watchlist.each do |i|
266
+
267
+ @log.debug "Comparing " + i[:node].node + " to " + node
268
+
269
+ if i[:node].node == node
270
+
271
+ @log.debug "Associated watch found, checking for method " + i[:method]
272
+
273
+ if i[:method] == "POST"
274
+ @log.debug "HTTP POST method executing"
275
+ @log.debug "URL: #{i[:notifyURL]}"
276
+ @log.debug "Title: Push notification"
277
+ @log.debug "Content: #{i[:node].node}"
278
+ @log.debug "Code: #{i[:node].to_s}"
279
+
280
+ Typhoeus::Request.post(i[:notifyURL],
281
+ :body=> { :title=>"Push notification",
282
+ :content=>"#{i[:node].node}",
283
+ :code=>""})
284
+ elsif i[:method] == "GET"
285
+ @log.debug "HTTP GET method executing"
286
+ Typhoeus::Request.get(i[:notifyURL],
287
+ :body=> { :title=>"Push notification",
288
+ :content=>"#{i[:node].node}",
289
+ :code=>""})
290
+ end
291
+
292
+ end
293
+ end
294
+
295
+ end
296
+
297
+
298
+
299
+ end
300
+ end
@@ -0,0 +1,98 @@
1
+ ####################################################################################################
2
+ # @author David Kirwan <davidkirwanirl@gmail.com>
3
+ # @description Packet Communication storage class for the Ardtweeno system
4
+ #
5
+ # @date 14-11-2012
6
+ ####################################################################################################
7
+
8
+ # Imports
9
+ require 'rubygems'
10
+ require 'logger'
11
+ require 'yaml'
12
+ require 'json'
13
+ require 'date'
14
+
15
+
16
+ module Ardtweeno
17
+
18
+ ##
19
+ # Ardtweeno::Packet Communication storage class for the Ardtweeno system
20
+ #
21
+ class Packet
22
+
23
+ # Class fields
24
+ attr_accessor :key, :seqNo, :date, :hour, :minute, :node, :data
25
+
26
+ ##
27
+ # Ardtweeno::Packet#new for the Packet class
28
+ # * *Args* :
29
+ # - ++ -> :seqNo, :key, :data
30
+ # * *Returns* :
31
+ # -
32
+ # * *Raises* :
33
+ #
34
+ def initialize(newSeqNo, newKey, newData)
35
+
36
+ # Create a DateTime instance
37
+ today = DateTime.now
38
+ theDate = today.year.to_s() + "-" + "%02d" % today.month.to_s() + "-" + "%02d" % today.day.to_s()
39
+
40
+ # Default values
41
+ @date = theDate
42
+ @hour = ("%02d" % today.hour).to_s
43
+ @minute = ("%02d" % today.min).to_s
44
+ @data = newData
45
+ @key = newKey
46
+
47
+ # Need to implement a lookup function for key to node value
48
+ @node = "defaultNode"
49
+
50
+ if newSeqNo.class == Fixnum
51
+ @seqNo = newSeqNo
52
+ elsif newSeqNo.class == String
53
+ @seqNo = newSeqNo.to_i
54
+ end
55
+
56
+ end
57
+
58
+
59
+ ##
60
+ # Ardtweeno::Packet#to_s returns a representation of the current instance state in String form
61
+ #
62
+ # * *Args* :
63
+ # - ++ ->
64
+ # * *Returns* :
65
+ # - String
66
+ # * *Raises* :
67
+ #
68
+ def to_s
69
+ # Build the string up from field data
70
+ str = "Packet No: " + @seqNo.to_s + " Key: " + @key + " Node: " + @node + " Date: " + @date +
71
+ " " + @hour + ":" + @minute + " Data: " + @data.to_s
72
+
73
+ # Returns the built string
74
+ return str
75
+ end
76
+
77
+
78
+ ##
79
+ # Ardtweeno::Packet#to_json returns a representation of the current instance state in JSON form
80
+ #
81
+ # * *Args* :
82
+ # - ++ ->
83
+ # * *Returns* :
84
+ # - String
85
+ # * *Raises* :
86
+ #
87
+ def to_json(options={})
88
+
89
+ jsonStr = '{"date":"' + @date + '","hour":"' + @hour + '","minute":"' +
90
+ @minute.to_s + '","node":"' + @node + '","key":"' + @key + '","seqNo":' +
91
+ @seqNo.to_s + ',"data":' + @data.to_json + '}'
92
+
93
+ return jsonStr
94
+ end
95
+
96
+
97
+ end
98
+ end
@@ -0,0 +1,266 @@
1
+ $stdout.sync = true
2
+ ####################################################################################################
3
+ # @author David Kirwan <davidkirwanirl@gmail.com>
4
+ # @description Ardtweeno Application Gateway HTTP REST API Sinatra Script
5
+ #
6
+ # @date 08-02-2013
7
+ ####################################################################################################
8
+ ##### Require statements
9
+ require 'rubygems'
10
+ require 'sinatra/base'
11
+ require 'ardtweeno'
12
+ require 'logger'
13
+ require 'rufus/scheduler'
14
+
15
+ class RESTAPI < Sinatra::Base
16
+
17
+ ##### Variables
18
+ enable :static, :sessions, :logging
19
+ set :environment, :production
20
+ set :root, File.join(File.dirname(__FILE__) + '/../../')
21
+ set :public_folder, Proc.new {File.join(root, '/public')}
22
+ set :views, Proc.new {File.join(root, '/views')}
23
+
24
+ # Posts Array
25
+ set :posts, Array.new
26
+
27
+ # Create the logger instance
28
+ set :log, Logger.new(STDOUT)
29
+ set :level, Logger::DEBUG
30
+ #set :level, Logger::INFO
31
+ #set :level, Logger::WARN
32
+
33
+ # Options hash
34
+ set :options, {:log => settings.log, :level => settings.level}
35
+
36
+ # Rufus-scheduler object
37
+ set :scheduler, Rufus::Scheduler.start_new
38
+
39
+ # Setup the system for use
40
+ Ardtweeno.setup(settings.options)
41
+ @@theDispatcher = Ardtweeno::Dispatcher.instance
42
+
43
+ #########################################################################################################
44
+
45
+
46
+ settings.scheduler.every '60m' do
47
+
48
+ begin
49
+ settings.log.debug "Running scheduled data flush"
50
+ @@theDispatcher.flush()
51
+
52
+ rescue Ardtweeno::DBError => e
53
+ settings.log.warn "ERROR: #{e.message}"
54
+ end
55
+
56
+ end
57
+
58
+
59
+ #########################################################################################################
60
+
61
+
62
+ get '/' do
63
+ redirect '/home'
64
+ end
65
+
66
+
67
+ get '/home' do
68
+ running = @@theDispatcher.running?
69
+ theposts = settings.posts
70
+
71
+ if theposts.length >= 5
72
+ theposts = theposts[(theposts.length - 5), theposts.length]
73
+ end
74
+
75
+ erb :home, :locals => {:running => running, :postdata => theposts.reverse}
76
+ end
77
+
78
+
79
+ get '/b97cb9ae44747ee263363463b7e56/create/post' do
80
+ running = @@theDispatcher.running?
81
+ erb :createpost, :locals => {:running => running}
82
+ end
83
+
84
+
85
+ post '/b97cb9ae44747ee263363463b7e56/create/post' do
86
+ settings.log.debug params.inspect
87
+
88
+ thePost = Hash.new
89
+
90
+ unless params["title"].nil? then thePost[:posttitle] = params["title"]; end
91
+ unless params["content"].nil? then thePost[:postcontent] = params["content"]; end
92
+ unless params["code"].nil? then thePost[:postcode] = params["code"]; end
93
+
94
+ settings.posts << thePost
95
+
96
+ redirect '/home'
97
+ end
98
+
99
+
100
+ not_found do
101
+ '404 Page Not Found'
102
+ end
103
+
104
+
105
+ #########################################################################################################
106
+
107
+
108
+ get '/api/v1/zones' do
109
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
110
+ settings.log.debug "The retrieve zones hook has been called"
111
+
112
+ begin
113
+ @@theDispatcher.retrieve_zones(params).to_json # Returns String in JSON form
114
+ rescue Exception => e
115
+ throw :halt, [ 500, "500 Internal Server Error" ]
116
+ end
117
+ end
118
+
119
+
120
+ get '/api/v1/zones/:zonename' do |zoneid|
121
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
122
+ settings.log.debug "The retrieve zones hook has been called"
123
+
124
+ begin
125
+ @@theDispatcher.retrieve_zones(params).to_json # Returns String in JSON form
126
+ rescue Exception => e
127
+ throw :halt, [ 500, "500 Internal Server Error" ]
128
+ end
129
+ end
130
+
131
+
132
+ #########################################################################################################
133
+
134
+
135
+ get '/api/v1/packets' do
136
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
137
+ settings.log.debug "The retrieve packets hook has been called"
138
+
139
+ begin
140
+ @@theDispatcher.retrieve_packets(params).to_json # Returns String in JSON form
141
+ rescue Exception => e
142
+ throw :halt, [ 500, "500 Internal Server Error" ]
143
+ end
144
+ end
145
+
146
+
147
+ post '/api/v1/packets' do
148
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
149
+ settings.log.debug "The add packets hook has been called"
150
+
151
+ settings.log.debug "Add packet API request: " + params[:payload]
152
+ begin
153
+ @@theDispatcher.store(params[:payload])
154
+
155
+ rescue Ardtweeno::NodeNotAuthorised => e
156
+ throw :halt, [ 401, "401 Unauthorised" ]
157
+ rescue Exception => e
158
+ throw :halt, [ 400, "400 Bad Request" ]
159
+ end
160
+ end
161
+
162
+
163
+ #########################################################################################################
164
+
165
+ get '/api/v1/nodes' do
166
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
167
+ settings.log.debug "The retrieve nodes hook has been called"
168
+
169
+ begin
170
+ @@theDispatcher.retrieve_nodes(params).to_json # Returns String in JSON form
171
+ rescue Exception => e
172
+ throw :halt, [ 500, "500 Internal Server Error" ]
173
+ end
174
+ end
175
+
176
+
177
+ #########################################################################################################
178
+
179
+ post '/api/v1/watch/:node' do |node|
180
+ settings.log.debug params.inspect
181
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
182
+ settings.log.debug "The add watch to node hook has been called"
183
+
184
+ begin
185
+ @@theDispatcher.addWatch(params)
186
+ rescue Exception => e
187
+ throw :halt, [ 400, "400 Bad Request" ]
188
+ end
189
+
190
+ end
191
+
192
+
193
+ #########################################################################################################
194
+
195
+ get '/api/v1/system/config' do
196
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
197
+ settings.log.debug "The system config hook has been called, querying the Ardtweeno gateway to retrieve config"
198
+
199
+ begin
200
+ return @@theDispatcher.config.to_json
201
+ rescue Exception => e
202
+ throw :halt, [ 500, "500 Internal Server Error" ]
203
+ end
204
+
205
+ end
206
+
207
+
208
+ get '/api/v1/system/start' do
209
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
210
+ settings.log.debug "The system start hook has been called, launching the Ardtweeno system"
211
+
212
+ begin
213
+ @@theDispatcher.start
214
+ rescue Exception => e
215
+ throw :halt, [ 500, "500 Internal Server Error" ]
216
+ end
217
+
218
+ "The Ardtweeno system is launching, this will take a moment..."
219
+ end
220
+
221
+
222
+ get '/api/v1/system/stop' do
223
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
224
+ settings.log.debug "The system stop hook has been called, shutting the Ardtweeno system down..."
225
+
226
+ begin
227
+ @@theDispatcher.stop
228
+ rescue Exception => e
229
+ throw :halt, [ 500, "500 Internal Server Error" ]
230
+ end
231
+
232
+ "The Ardtweeno system is shutting down, this will take a moment..."
233
+ end
234
+
235
+
236
+ # This is currently not implemented correctly
237
+ get '/api/v1/system/reboot' do
238
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
239
+ settings.log.debug "The system reboot hook has been called, rebooting the host"
240
+
241
+ begin
242
+ @@theDispatcher.reboot
243
+ rescue Exception => e
244
+ throw :halt, [ 500, "500 Internal Server Error" ]
245
+ end
246
+
247
+ "The host is rebooting, this will take a moment..."
248
+ end
249
+
250
+
251
+ get '/api/v1/system/status' do
252
+ throw :halt, [ 404, "404 Page Not Found" ] unless @@theDispatcher.authenticate?(params[:key])
253
+ settings.log.debug "The system status hook has been called, reading the host configuration"
254
+
255
+ begin
256
+ return {:running=>@@theDispatcher.running?}.to_json
257
+ rescue Exception => e
258
+ throw :halt, [ 500, "500 Internal Server Error" ]
259
+ end
260
+
261
+ end
262
+
263
+ #########################################################################################################
264
+
265
+ # End of RESTAPI Class
266
+ end