-- GPL3+ Copyright 2025 by Sean Conner. -- luacheck: ignore 611 631 local syslog = require "org.conman.syslog" local signal = require "org.conman.signal" local errno = require "org.conman.errno" local tls = require "org.conman.nfl.tls" local nfl = require "org.conman.nfl" local net = require "org.conman.net" local SYSLOG = "127.0.0.1" local HOST = "brevard.conman.org" local CERT = "brevard.conman.org.cert.pem" local KEY = "brevard.conman.org.key.pem" local ISSUER = "/C=US/ST=FL/O=Conman Laboratories/OU=Security Division/CN=Conman Laboratories CA/emailAddress=ca@conman.org" local clients = {} -- ************************************************************************* local function client_main(ios) local function main() while #clients[ios.__co] > 0 do local data = table.remove(clients[ios.__co],1) local okay,err = ios:write(data,'\n') if not okay then syslog('error',"tls:write()=%s",err) return end end clients[ios.__co].ready = true if not coroutine.yield() then return end clients[ios.__co].ready = false return main() end ios:_handshake() if ios.__ctx:peer_cert_issuer() ~= ISSUER then ios:close() return end syslog('info',"remote=%s",ios.__remote.addr) clients[ios.__co] = { ready = false } main() clients[ios.__co] = nil syslog('info',"remote=%s disconnecting",ios.__remote.addr) ios:close() end -- ************************************************************************* signal.catch('int') signal.catch('term') local laddr = net.address(SYSLOG,'udp',514) local lsock = net.socket(laddr.family,'udp') lsock:bind(laddr) nfl.SOCKETS:insert(lsock,'r',function() local _,data,err = lsock:recv() if data then for co,queue in pairs(clients) do table.insert(queue,data) if queue.ready then nfl.schedule(co,true) end end else syslog('error',"recv()=%s",errno[err]) end end) local okay,err = tls.listen(HOST,514,client_main,function(conf) conf:verify_client() return conf:keypair_file(CERT,KEY) and conf:protocols("tlsv1.3") end) if not okay then syslog('error',"tls.listen()=%s",err) os.exit(1,true) end nfl.server_eventloop(function() return signal.caught() end) os.exit(0,true)