summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2010-12-18 23:22:14 +0000
committerChristian Pointner <equinox@spreadspace.org>2010-12-18 23:22:14 +0000
commit917afcfe5d9c9a084518c1ba10e057af41c1ea8f (patch)
treecaa56effdfe7d8de4f7f9c63f20a47a12ea21b8a
parentmoved dispatch table to command_table (diff)
implemented first version of the response table
git-svn-id: https://svn.spreadspace.org/gcsd/trunk@68 ac14a137-c7f1-4531-abe0-07747231d213
-rw-r--r--src/Makefile1
-rw-r--r--src/command_queue.lua5
-rw-r--r--src/modules/debug_shell.lua2
-rw-r--r--src/modules/exec.lua3
-rw-r--r--src/modules/stdio.lua3
-rw-r--r--src/response_table.lua65
6 files changed, 74 insertions, 5 deletions
diff --git a/src/Makefile b/src/Makefile
index 8201b72..4bdd2da 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -58,6 +58,7 @@ LUA_SRCS := client_list.lua \
module_list.lua \
command_queue.lua \
command_table.lua \
+ response_table.lua \
main_loop.lua
LUA_BYTECODE := $(EXECUTABLE).lc
diff --git a/src/command_queue.lua b/src/command_queue.lua
index 2bb34c6..6bfd3d6 100644
--- a/src/command_queue.lua
+++ b/src/command_queue.lua
@@ -60,6 +60,11 @@ function command_queue:get_current_command()
return self.current
end
+function command_queue:get_expected_response()
+ if(self.current == nil) then return end
+ return self.current.expected_response
+end
+
function command_queue:get_next_command()
if(self.current ~= nil) then return nil end
diff --git a/src/modules/debug_shell.lua b/src/modules/debug_shell.lua
index b431cd3..a0d187e 100644
--- a/src/modules/debug_shell.lua
+++ b/src/modules/debug_shell.lua
@@ -242,7 +242,7 @@ function debug_shell:exec_cmd(socket)
if(not param or param == '') then socket.out_buffer = socket.out_buffer .. "Error: please specify a command\n"
else
socket.out_buffer = socket.out_buffer .. "enqueing command: " .. param .. "\n"
- command_queue:enqueue(param, "", 10000)
+ command_queue:enqueue(param, "ok\n", 10000)
end
else
socket.out_buffer = socket.out_buffer .. "unknown command\n"
diff --git a/src/modules/exec.lua b/src/modules/exec.lua
index 9ec082a..a10503f 100644
--- a/src/modules/exec.lua
+++ b/src/modules/exec.lua
@@ -88,8 +88,7 @@ function exec:new(config, runtype)
if(inst.config.runtype == defines.IN_MODULE) then
self.in_buffer = command_table:dispatch(self.in_buffer)
else
- -- TODO: part of expected response handling
- command_queue:command_completed()
+ self.in_buffer = response_table:dispatch(self.in_buffer)
end
return defines.OK
diff --git a/src/modules/stdio.lua b/src/modules/stdio.lua
index 943b6c5..74795c1 100644
--- a/src/modules/stdio.lua
+++ b/src/modules/stdio.lua
@@ -66,8 +66,7 @@ function stdio:new(config, runtype)
if(inst.config.runtype == defines.IN_MODULE) then
self.in_buffer = command_table:dispatch(self.in_buffer)
else
- -- TODO: part of expected response handling
- command_queue:command_completed()
+ self.in_buffer = response_table:dispatch(self.in_buffer)
end
return defines.OK
diff --git a/src/response_table.lua b/src/response_table.lua
new file mode 100644
index 0000000..31ac0c5
--- /dev/null
+++ b/src/response_table.lua
@@ -0,0 +1,65 @@
+--
+-- gcsd
+--
+-- gcsd the generic command sequencer daemon can be used to serialize
+-- commands sent over various paralell communication channels to a
+-- single command output. It can be seen as a multiplexer for any
+-- kind of communication between a single resource and various clients
+-- which want to submit commands to it or query information from it.
+-- gcsd is written in C and Lua. The goal is to provide an easy to
+-- understand high level API based on Lua which can be used to
+-- implement the business logic of the so formed multiplexer daemon.
+--
+--
+-- Copyright (C) 2009-2010 Markus Grueneis <gimpf@spreadspace.org>
+-- Christian Pointner <equinox@spreadspace.org>
+--
+-- This file is part of gcsd.
+--
+-- gcsd is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- any later version.
+--
+-- gcsd is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with gcsd. If not, see <http://www.gnu.org/licenses/>.
+--
+
+response_table = {}
+response_table.regex_to_handler = {
+ [".*\n"] = function(match) log.printf(log.DEBUG, "got response: %s", match) end
+}
+
+function response_table:dispatch(response_buffer)
+ local init = 1
+ repeat
+ local had_match = false
+ local regex = command_queue:get_expected_response()
+ if regex then
+ local match = string.match(response_buffer, "^" .. regex, init)
+ if match then
+ log.printf(log.DEBUG, "got expected response ('%s'), command completed", match)
+ -- TODO: send expected response to original requestor
+ command_queue:command_completed()
+ init = init + string.len(match)
+ end
+ end
+ -- TODO: check if ooor's are allowed when there is an expected response
+ for regex, handler in pairs(self.regex_to_handler) do
+ local match = string.match(response_buffer, "^" .. regex, init)
+ if match then
+ handler(match)
+ had_match = true
+ init = init + string.len(match)
+ break
+ end
+ end
+ until (not had_match)
+
+ return string.sub(response_buffer, init + 1)
+end