summaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2010-12-28 03:19:57 +0000
committerChristian Pointner <equinox@spreadspace.org>2010-12-28 03:19:57 +0000
commit2ff79c65051ceb468ee0a48c732a2a496a525bda (patch)
tree7902564d5149b7d66fa3585962f3a2ca5bd9f015 /src/modules
parentadded default port number to tcp_listen (diff)
added tcp.client and tcp.connect
added tcp_connect module some cleanup and small fixes git-svn-id: https://svn.spreadspace.org/gcsd/trunk@85 ac14a137-c7f1-4531-abe0-07747231d213
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/exec.lua4
-rw-r--r--src/modules/tcp_connect.lua150
-rw-r--r--src/modules/tcp_listen.lua6
3 files changed, 155 insertions, 5 deletions
diff --git a/src/modules/exec.lua b/src/modules/exec.lua
index 1556087..46f540e 100644
--- a/src/modules/exec.lua
+++ b/src/modules/exec.lua
@@ -78,7 +78,7 @@ function exec:new(config, runtype)
local buffer, err = rawio.read(self.fd, 100)
if(buffer == nil) then
log.printf(log.ERROR, inst.name .. ": connection error: %s", err)
- return defines.KILL_MODULE_CLASS
+ return defines.KILL_MODULE
end
self.in_buffer = self.in_buffer .. buffer
@@ -102,7 +102,7 @@ function exec:new(config, runtype)
local len, err = rawio.write(self.fd, self.out_buffer)
if(len == nil) then
log.printf(log.ERROR, inst.name .. ": connection error: %s", err)
- ret = defines.KILL_MODULE_CLASS
+ ret = defines.KILL_MODULE
else
self.out_buffer = string.sub(self.out_buffer, len+1)
end
diff --git a/src/modules/tcp_connect.lua b/src/modules/tcp_connect.lua
new file mode 100644
index 0000000..c5171ea
--- /dev/null
+++ b/src/modules/tcp_connect.lua
@@ -0,0 +1,150 @@
+--
+-- 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/>.
+--
+
+-- tcp_connect module class
+local tcp_connect = {}
+tcp_connect.properties = { type=defines.INOUT_MODULE, name="tcp-connect", max_instances=-1 }
+tcp_connect.next_id = 0
+
+-- create new instance of tcp_connect module class
+function tcp_connect:new(config, runtype)
+ local inst = {}
+ inst.class = self
+ inst.config = config
+ inst.config.runtype = runtype
+ if(config.name == nil or config.name == "") then
+ inst.name = self.properties.name .. self.next_id
+ self.next_id = self.next_id + 1
+ else
+ inst.name = config.name
+ end
+
+ local handle, connected = tcp.client(config.addr, config.port, config.resolv_type, config.source)
+ if(not handle) then
+ return nil
+ end
+ inst.connected = connected
+
+ handle.in_buffer = ""
+ handle.out_buffer = ""
+ function handle:read()
+ -- TODO: which size should we request??
+ local buffer, err = tcp.recv(self.fd, 100)
+ if(buffer == nil) then
+ log.printf(log.ERROR, inst.name .. ": connection error: %s", err)
+ return defines.KILL_MODULE -- TODO: reconnect
+ end
+ if(#buffer == 0) then
+ log.printf(log.INFO, inst.name .. ": connection closed")
+ return defines.KILL_MODULE -- TODO: reconnect
+ end
+
+ self.in_buffer = self.in_buffer .. buffer
+ if(inst.config.runtype == defines.IN_MODULE) then
+ self.in_buffer = command_table:dispatch(self.in_buffer)
+ else
+ self.in_buffer = response_table:dispatch(self.in_buffer)
+ end
+
+ return defines.OK
+ end
+ function handle:write()
+ local len, err = tcp.send(self.fd, self.out_buffer)
+ if(len == nil) then
+ log.printf(log.ERROR, inst.name .. ": connection error: %s", err)
+ ret = defines.KILL_MODULE -- TODO: reconnect
+ else
+ self.out_buffer = string.sub(self.out_buffer, len+1)
+ end
+ if(inst.config.runtype == defines.OUT_MODULE and self.out_buffer == "") then
+ command_queue:command_sent()
+ end
+ return defines.OK
+ end
+
+ local client = {}
+ client.module_instance = inst
+ client.name = inst.name .. "#0"
+ function client:process_response() end
+ function client:process_timeout() end
+ function client:get_read_handles()
+ return { handle }
+ end
+ function client:get_write_handles()
+ if(handle.out_buffer ~= "") then
+ return { handle }
+ else
+ return {}
+ end
+ end
+ function client:cleanup()
+ rawio.close(handle.fd)
+ end
+ handle.client_instance = client
+
+ local connect_handle = {}
+ connect_handle.fd = handle.fd
+ function connect_handle:read() return defines.OK end
+ function connect_handle:write()
+ local connected, err = tcp.connect(handle.fd)
+ if(not connected) then
+ return defines.KILL_MODULE
+ end
+ inst.connected = true
+ client_list:register(client)
+ return defines.OK
+ end
+ connect_handle.client_instance = client
+
+ function inst:cleanup()
+ client_list:unregister_by_module(self)
+ end
+ function inst:get_read_handles()
+ return {}
+ end
+ function inst:get_write_handles()
+ if(not inst.connected) then
+ return { connect_handle }
+ else
+ return {}
+ end
+ end
+ function inst:start_command(command)
+ handle.out_buffer = command
+ end
+ setmetatable(inst, {})
+ getmetatable(inst).__gc = function() inst:cleanup() end
+
+ return inst
+end
+
+return tcp_connect
diff --git a/src/modules/tcp_listen.lua b/src/modules/tcp_listen.lua
index 9fa28ed..365e116 100644
--- a/src/modules/tcp_listen.lua
+++ b/src/modules/tcp_listen.lua
@@ -68,7 +68,7 @@ function tcp_listen:new(config, runtype)
local client_handle = {}
client_handle.fd = new_client
- client_handle.client_instance = nil
+ client_handle.client_instance = nil
client_handle.in_buffer = ""
client_handle.out_buffer = ""
function client_handle:read()
@@ -112,10 +112,10 @@ function tcp_listen:new(config, runtype)
client.name = inst.name .. "#" .. tcp.endtostring(addr)
function client:process_response() end
function client:process_timeout() end
- function client:get_read_handles()
+ function client:get_read_handles()
return { client_handle }
end
- function client:get_write_handles()
+ function client:get_write_handles()
if(client_handle.out_buffer ~= "") then
return { client_handle }
else