Last active
June 24, 2016 19:09
-
-
Save davidbirdsong/8ca702499658bf93bf594bbb7a4946fc to your computer and use it in GitHub Desktop.
tcp syslog test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local coroutine = require('coroutine') | |
local socket = require('socket') | |
local string = require('string') | |
local table = require('table') | |
local io = require('io') | |
local write = io.write | |
local syslog_grammar, address, port | |
if read_config then | |
if read_config('syslog_format') then | |
local syslog = require("syslog") | |
syslog_grammar = syslog.build_rsyslog_grammar( | |
read_config('syslog_format') | |
) | |
end | |
address = read_config("address") or "127.0.0.1" | |
port = read_config("port") or 5565 | |
end | |
local server = assert(socket.bind(address, port)) | |
server:settimeout(0) | |
local threads = {} | |
local sockets = {server} | |
local logger = read_config("Logger") | |
local function rsyslog_msg(buf) | |
local msg = { | |
Type = "syslog", | |
Payload = nil, | |
} | |
msg.fields = syslog_grammar:match(buf) | |
if not msg.fields then return nil end | |
-- short circuit | |
msg.Fields = msg.fields | |
msg.fields = nil | |
if true then return msg end | |
msg.Payload = msg.fields.msg | |
msg.fields.msg = nil | |
if msg.fields.timestamp then msg.Timestamp = msg.fields.timestamp end | |
msg.fields.timestamp = nil | |
if msg.fields.syslogtag then | |
msg.Logger = msg.fields.syslogtag.programname | |
msg.Pid = msg.fields.syslogtag.pid | |
end | |
msg.Fields = msg.fields | |
msg.fields = nil | |
return msg | |
end | |
local function handle_client(client, caddr, cport) | |
local found, consumed, need = false, 0, 8192 * 4 | |
client:settimeout(0) | |
write('in handle client', "\n") | |
local m | |
while client do | |
write("client receive", "\n") | |
local buf, err= client:receive('*l') | |
write("buf:", buf, "\n") | |
if err == "closed" then | |
write("connection closed", "\n") | |
return | |
end | |
if not buf then | |
write("connection return emptey buf", "\n") | |
end | |
m = rsyslog_msg(buf) | |
if m then | |
write("injecting", m.Payload, "\n") | |
--local l, e = pcall(inject_message, m) | |
inject_message( m) | |
write("injected !!!!!","\n") | |
write("injected !!!!!", l, e, "\n") | |
end | |
coroutine.yield() | |
end | |
write("falling off", "\n") | |
end | |
function process_message() | |
while true do | |
local ready = socket.select(sockets, nil, 1) | |
if ready then | |
for _, s in ipairs(ready) do | |
if s == server then | |
local client = s:accept() | |
if client then | |
local caddr, cport = client:getpeername() | |
write('new conn [', caddr, ':', cport, "]\n") | |
if not caddr then | |
caddr = "unknown" | |
cport = 0 | |
end | |
sockets[#sockets + 1] = client | |
threads[client] = coroutine.create( | |
function() | |
handle_client(client, caddr, cport) | |
end | |
) | |
write('new coroutine', "\n") | |
end | |
else | |
if threads[s] then | |
write('coroutine resume', "\n") | |
local status = coroutine.resume(threads[s]) | |
write('coroutine resume result: ', tostring(status), "\n") | |
if not status then | |
s:close() | |
write('closing conn', "\n") | |
for i = #sockets, 2, -1 do | |
if s == sockets[i] then | |
table.remove(sockets, i) | |
break | |
end | |
end | |
threads[s] = nil | |
end | |
else | |
write('s not in threads', "\n") | |
end | |
end | |
end | |
end | |
end | |
return 0 | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment