Archived
1
0
This repository has been archived on 2023-08-12. You can view files and clone it, but cannot push or open issues or pull requests.
nntpchan/contrib/backends/nntpchan-daemon/daemon/main.cpp

141 lines
3.7 KiB
C++
Raw Normal View History

2016-10-15 18:12:01 +05:00
#include "ini.hpp"
2017-10-11 18:48:27 +05:00
#include <nntpchan/crypto.hpp>
#include <nntpchan/storage.hpp>
#include <nntpchan/nntp_server.hpp>
#include <nntpchan/event.hpp>
#include <nntpchan/exec_frontend.hpp>
#include <nntpchan/staticfile_frontend.hpp>
2016-10-15 18:12:01 +05:00
#include <vector>
#include <string>
int main(int argc, char * argv[]) {
if (argc != 2) {
std::cerr << "usage: " << argv[0] << " config.ini" << std::endl;
return 1;
}
nntpchan::Crypto crypto;
2017-05-03 20:37:09 +05:00
2016-10-15 18:12:01 +05:00
nntpchan::Mainloop loop;
2017-05-03 18:44:42 +05:00
2016-10-15 18:12:01 +05:00
nntpchan::NNTPServer nntp(loop);
2017-05-03 18:44:42 +05:00
2017-05-03 22:33:04 +05:00
2016-10-15 18:12:01 +05:00
std::string fname(argv[1]);
std::ifstream i(fname);
if(i.is_open()) {
INI::Parser conf(i);
2017-05-03 18:44:42 +05:00
2017-05-03 22:33:04 +05:00
std::vector<std::string> requiredSections = {"nntp", "articles"};
2017-05-03 18:44:42 +05:00
2016-10-15 18:12:01 +05:00
auto & level = conf.top();
2017-05-03 18:44:42 +05:00
2016-10-15 18:12:01 +05:00
for ( const auto & section : requiredSections ) {
if(level.sections.find(section) == level.sections.end()) {
std::cerr << "config file " << fname << " does not have required section: ";
std::cerr << section << std::endl;
return 1;
}
}
2017-05-03 22:33:04 +05:00
auto & storeconf = level.sections["articles"].values;
2016-10-15 18:12:01 +05:00
2017-05-03 22:33:04 +05:00
if (storeconf.find("store_path") == storeconf.end()) {
std::cerr << "storage section does not have 'store_path' value" << std::endl;
2016-10-15 18:12:01 +05:00
return 1;
}
2017-05-03 22:33:04 +05:00
nntp.SetStoragePath(storeconf["store_path"]);
2017-05-03 18:44:42 +05:00
2016-10-15 18:12:01 +05:00
auto & nntpconf = level.sections["nntp"].values;
if (nntpconf.find("bind") == nntpconf.end()) {
std::cerr << "nntp section does not have 'bind' value" << std::endl;
return 1;
}
2017-05-03 22:33:04 +05:00
if(nntpconf.find("instance_name") == nntpconf.end()) {
std::cerr << "nntp section lacks 'instance_name' value" << std::endl;
return 1;
}
nntp.SetInstanceName(nntpconf["instance_name"]);
2016-10-15 22:53:35 +05:00
if (nntpconf.find("authdb") != nntpconf.end()) {
nntp.SetLoginDB(nntpconf["authdb"]);
}
if ( level.sections.find("frontend") != level.sections.end())
{
2016-10-18 16:03:51 +05:00
// frontend enabled
2016-10-18 17:17:40 +05:00
auto & frontconf = level.sections["frontend"].values;
if (frontconf.find("type") == frontconf.end())
{
2016-10-18 16:03:51 +05:00
std::cerr << "frontend section provided but 'type' value not provided" << std::endl;
return 1;
}
2016-10-18 17:17:40 +05:00
auto ftype = frontconf["type"];
if (ftype == "exec")
{
if (frontconf.find("exec") == frontconf.end())
{
2016-10-18 16:03:51 +05:00
std::cerr << "exec frontend specified but no 'exec' value provided" << std::endl;
return 1;
}
2016-10-18 17:17:40 +05:00
nntp.SetFrontend(new nntpchan::ExecFrontend(frontconf["exec"]));
}
else if (ftype == "staticfile")
{
auto required = {
"template_dir", "out_dir", "template_dialect", "max_pages"
};
for (const auto & opt : required)
{
if(frontconf.find(opt) == frontconf.end())
{
std::cerr << "staticfile frontend specified but no '" << opt << "' value provided" << std::endl;
return 1;
}
}
auto maxPages = std::stoi(frontconf["max_pages"]);
if(maxPages <= 0)
{
std::cerr << "max_pages invalid value '" << frontconf["max_pages"] << "'" << std::endl;
return 1;
}
nntp.SetFrontend(new nntpchan::StaticFileFrontend(nntpchan::CreateTemplateEngine(frontconf["template_dialect"]), frontconf["template_dir"], frontconf["out_dir"], maxPages));
}
else
{
2016-10-18 16:03:51 +05:00
std::cerr << "unknown frontend type '" << ftype << "'" << std::endl;
2017-05-03 22:33:04 +05:00
return 1;
2016-10-18 16:03:51 +05:00
}
2017-05-03 18:44:42 +05:00
2016-10-18 16:03:51 +05:00
}
2017-05-03 18:44:42 +05:00
2016-10-18 16:03:51 +05:00
auto & a = nntpconf["bind"];
2016-10-15 18:12:01 +05:00
try {
2017-05-03 18:44:42 +05:00
nntp.Bind(a);
2016-10-15 18:12:01 +05:00
} catch ( std::exception & ex ) {
std::cerr << "failed to bind: " << ex.what() << std::endl;
return 1;
}
2017-05-03 18:44:42 +05:00
2017-05-03 22:33:04 +05:00
std::cerr << "nntpd for " << nntp.InstanceName() << " bound to " << a << std::endl;
2017-05-03 18:44:42 +05:00
loop.Run();
2016-10-15 18:12:01 +05:00
} else {
std::cerr << "failed to open " << fname << std::endl;
return 1;
}
2017-05-03 18:44:42 +05:00
2016-10-15 18:12:01 +05:00
}