From 917afcfe5d9c9a084518c1ba10e057af41c1ea8f Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 18 Dec 2010 23:22:14 +0000 Subject: implemented first version of the response table git-svn-id: https://svn.spreadspace.org/gcsd/trunk@68 ac14a137-c7f1-4531-abe0-07747231d213 --- src/Makefile | 1 + src/command_queue.lua | 5 ++++ src/modules/debug_shell.lua | 2 +- src/modules/exec.lua | 3 +-- src/modules/stdio.lua | 3 +-- src/response_table.lua | 65 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/response_table.lua 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 +-- Christian Pointner +-- +-- 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 . +-- + +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 -- cgit v1.2.3