Branch :
require Facts
require File
require Socket
require TLS
require TLS.Config
(r = fork()) ; void
if (r < 0) do
exit(1)
end
if r == 0 do
TLS.init()
server_config = TLS.Config.new()
TLS.Config.set_cert_file(server_config, "/etc/ssl/fullchain.pem")
TLS.Config.set_key_file(server_config, "/etc/ssl/private/privkey.pem")
server_tls = TLS.server()
TLS.configure(server_tls, server_config)
server_facts = Facts.database()
puts("server: listening on 15004")
server = Socket.listen(hostname(), "15004")
if server.fd < 0 do
puts("server: listen failed")
exit_subprocess(1)
end
puts("server: starting acceptor loop")
acceptor = Facts.acceptor_loop(server_facts, server, server_tls)
if ! acceptor do
puts("server: acceptor_loop failed")
exit_subprocess(1)
end
puts("server: acceptor loop started, waiting for client")
sleep(6)
Facts.with_tags(server_facts, ?, ?, ?, fn (fact) {
puts("server: received #{inspect(fact)}")
})
puts("server: OK")
sleep(2)
Facts.acceptor_loop_join(acceptor)
Facts.close_all(server_facts)
Facts.delete(server_facts)
TLS.Config.free(server_config)
TLS.free(server_tls)
exit_subprocess(0)
else
sleep(2)
TLS.init()
client_config = TLS.Config.new()
TLS.Config.set_ca_file(client_config, TLS.ca_cert_path())
client_facts = Facts.database()
Facts.set_priority(client_facts, (U8) 1)
puts("client: connecting to 15004")
if ! Facts.connect(client_facts, hostname(), "15004", client_config) do
puts("client: connect failed")
exit(1)
end
puts("client: adding fact")
Facts.add_tags(client_facts, :a, :b, :c)
sleep(2)
puts("client: checking for facts")
Facts.with_tags(client_facts, ?, ?, ?, fn (fact) {
puts("client: has #{inspect(fact)}")
})
Facts.close_all(client_facts)
Facts.delete(client_facts)
TLS.Config.free(client_config)
puts("client: OK")
wait()
end
0