84 lines
2.1 KiB
C++
84 lines
2.1 KiB
C++
// Copyright (2019-2023) Paul Scherrer Institute
|
|
|
|
#include <csignal>
|
|
#include "../common/Logger.h"
|
|
#include "JFJochWriterHttp.h"
|
|
#include "StreamWriter.h"
|
|
|
|
static Pistache::Http::Endpoint *httpEndpoint;
|
|
static StreamWriter *writer;
|
|
volatile static bool quitok = false;
|
|
|
|
static void sigHandler (int sig){
|
|
switch(sig){
|
|
case SIGINT:
|
|
case SIGQUIT:
|
|
case SIGTERM:
|
|
case SIGHUP:
|
|
default:
|
|
httpEndpoint->shutdown();
|
|
quitok = true;
|
|
writer->Cancel();
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void setUpUnixSignals(std::vector<int> quitSignals) {
|
|
sigset_t blocking_mask;
|
|
sigemptyset(&blocking_mask);
|
|
for (auto sig : quitSignals)
|
|
sigaddset(&blocking_mask, sig);
|
|
|
|
struct sigaction sa;
|
|
sa.sa_handler = sigHandler;
|
|
sa.sa_mask = blocking_mask;
|
|
sa.sa_flags = 0;
|
|
|
|
for (auto sig : quitSignals)
|
|
sigaction(sig, &sa, nullptr);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
RegisterHDF5Filter();
|
|
|
|
static Logger logger("jfjoch_writer_http");
|
|
|
|
if ((argc != 3) && (argc != 4)) {
|
|
logger.Error("Usage ./jfjoch_writer_http <target ZMQ addr> <TCP port> {<repub ZMQ addr to bind>}");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
uint16_t http_port = atoi(argv[2]);
|
|
std::string repub_address;
|
|
if (argc == 4)
|
|
repub_address = argv[3];
|
|
|
|
ZMQContext context;
|
|
Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(http_port));
|
|
|
|
writer = new StreamWriter(context, logger, argv[1], repub_address);
|
|
httpEndpoint = new Pistache::Http::Endpoint(addr);
|
|
|
|
auto router = std::make_shared<Pistache::Rest::Router>();
|
|
|
|
auto opts = Pistache::Http::Endpoint::options().threads(8);
|
|
opts.flags(Pistache::Tcp::Options::ReuseAddr);
|
|
httpEndpoint->init(opts);
|
|
|
|
std::vector<int> sigs{SIGQUIT, SIGINT, SIGTERM, SIGHUP};
|
|
setUpUnixSignals(sigs);
|
|
|
|
std::thread writer_thread([] {
|
|
while (!quitok)
|
|
writer->Run();
|
|
});
|
|
|
|
JFJochWriterHttp writer_http(*writer, router);
|
|
|
|
httpEndpoint->setHandler(router->handler());
|
|
httpEndpoint->serve();
|
|
writer_thread.join();
|
|
logger.Info("Clean stop");
|
|
exit(EXIT_SUCCESS);
|
|
}
|