Mercurial > thymian
diff server/main.cpp @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/main.cpp Tue Aug 17 11:19:54 2021 +0200 @@ -0,0 +1,155 @@ +#include <tnt/tntnet.h> +#include <tntdb.h> + +#include "web_logmachine.h" + +#include <logger.h> +#include <config.h> + +#include <templater.h> +#include <csignal> + +void exit_work(const char* source) +{ + log_critical() << "WORK SOURCE:" << source; +} + +void exit_on_error() +{ + exit_work("exit_on_error"); +} + +void signal_handler(int signum) +{ + log_warning() << "Signal caught " << signum; + exit_work("signal_handler"); + _Exit(1); +} + +void atexit_handler() +{ + std::cerr << "Atexit handler" << std::endl; + exit_work("atexit_handler"); +} + +int main(int argc, char* argv[]) +{ + std::cout << "thymian 0.1 starting" << std::endl; + (void)argc;(void)argv; + + unafrog::logger::instance().add_log_machine(new web_logmachine); + + info() << "--------------------- App starting [PID:" << getpid() << "] ---------------------"; + + std::set_unexpected (exit_on_error); + std::set_terminate(exit_on_error); + atexit(atexit_handler); + + struct sigaction new_action, old_action; + + /* Set up the structure to specify the new action. */ + new_action.sa_handler = signal_handler; + sigemptyset (&new_action.sa_mask); + new_action.sa_flags = 0; + + sigaction (SIGINT, nullptr, &old_action); + if (old_action.sa_handler != SIG_IGN) + { + sigaction (SIGINT, &new_action, nullptr); + } + + sigaction (SIGHUP, nullptr, &old_action); + if (old_action.sa_handler != SIG_IGN) + { + sigaction (SIGHUP, &new_action, nullptr); + } + + sigaction (SIGTERM, nullptr, &old_action); + if (old_action.sa_handler != SIG_IGN) + { + sigaction (SIGTERM, &new_action, nullptr); + } + + sigaction (SIGSEGV, nullptr, &old_action); + if (old_action.sa_handler != SIG_IGN) + { + sigaction (SIGSEGV, &new_action, nullptr); + } + + sigaction (SIGKILL, nullptr, &old_action); + if (old_action.sa_handler != SIG_IGN) + { + sigaction (SIGKILL, &new_action, nullptr); + } + + srand(static_cast<unsigned int>(::time(nullptr))); + + try + { + + if(!config::instance().valid()) + { + log_critical() << "configuration failure, exiting"; + return 1; + } + + // check that all the templates are where they are supposed to be + if(!template_warehouse::instance().checkTemplates()) + { + log_critical() << "Cannot find some templates. Giving up"; + return 1; + } + + // start the web server + tnt::Tntnet app; + app.listen("*", 8999); + + auto pngMap = app.mapUrl("^/img/(.*).png$", "filer"); // the supported images + auto filer1 = app.mapUrl("^/img/(.*).ico$", "filer"); + auto filer2 = app.mapUrl("^/img/(.*).gif$", "filer"); + auto filer3 = app.mapUrl("^/img/(.*).jpg$", "filer"); + auto filer10Global = app.mapUrl("/(.*).js$", "filer"); // javascript handler + auto filerPdf = app.mapUrl("^/pdfs/(.*).pdf$", "filer"); // the PDF downloader + + auto pngMapCurrentTheme = app.mapUrl("^/theme/current/img/(.*).png$", "filer"); // the supported images from the current theme + auto filer1CurrentTheme = app.mapUrl("^/theme/current/img/(.*).ico$", "filer"); + auto filer2CurrentTheme = app.mapUrl("^/theme/current/img/(.*).gif$", "filer"); + auto filer3CurrentTheme = app.mapUrl("^/theme/current/img/(.*).jpg$", "filer"); + auto filer10 = app.mapUrl("^/theme/current/(.*).js$", "filer"); // javascript handler for current theme + auto filer10scriptDirTheme = app.mapUrl("^/theme/current/script/(.*).js$", "filer"); // javascript handler for current theme + auto filer12CurrentTheme = app.mapUrl("/theme/current/(.*).css$", "filer"); // the css files regardless ofwhere they are + auto filer12DirTheme = app.mapUrl("/theme/current/css/(.*).css$", "filer"); // the css files regardless ofwhere they are + + auto filer4 = app.mapUrl("/(.*).png$", "filer"); + auto filer5 = app.mapUrl("/(.*).ico$", "filer"); + auto filer6 = app.mapUrl("/(.*).gif$", "filer"); + auto filer7 = app.mapUrl("/(.*).jpg$", "filer"); + auto filer8 = app.mapUrl("/(.*).html$", "filer"); + auto filer9 = app.mapUrl("/(.*).htm$", "filer"); + auto filer10ScriptDirGlobal = app.mapUrl("/js/(.*).js$", "filer"); // javascript handler + auto filer12 = app.mapUrl("/(.*).css$", "filer"); // the css files regardless ofwhere they are + auto filer12StyleDirGlobal = app.mapUrl("/css/(.*).css$", "filer"); // the css files in a global directory + auto filer13 = app.mapUrl("/robots.txt$", "filer"); + + auto homepage = app.mapUrl("^/$", "root"); // / (ie: homepage) + + auto langNo = app.mapUrl("^/no$", "main_root_sender"); // / (ie: homepage in norwegian) + auto langGb = app.mapUrl("^/gb$", "main_root_sender"); // / (ie: homepage in english) + auto langRo = app.mapUrl("^/ro$", "main_root_sender"); // / (ie: homepage in romanian) + auto langHu = app.mapUrl("^/hu$", "main_root_sender"); // / (ie: homepage in hungarian) + + auto categoryLister = app.mapUrl("^/l/(.*)", "category_root_sender"); // / (ie: lists of various food categories) + + auto recipeSender = app.mapUrl("^/r/(.*)", "r"); // / (ie: the recipes themselves) + + + app.run(); + } + catch (const std::exception& e) + { + emergency() << e.what(); + exit(1); + } + log_critical() << "bye bye cruel world"; + exit(0); +}
