Commit 842621e5 authored by Pavel Vainerman's avatar Pavel Vainerman

(LogDB): реализовал независимость от configure.xml.

Теперь можно указать отдельный xml-файл с настроечной секцией, не содержащий всю структуру uniset.
parent 1218d57e
......@@ -35,17 +35,43 @@
using namespace uniset;
using namespace std;
// --------------------------------------------------------------------------
LogDB::LogDB( const string& name , const string& prefix ):
LogDB::LogDB( const string& name, int argc, const char* const* argv, const string& prefix ):
myname(name)
{
dblog = make_shared<DebugStream>();
auto conf = uniset_conf();
auto xml = conf->getConfXML();
std::string specconfig;
conf->initLogStream(dblog, prefix + "log" );
int i = uniset::findArgParam("--" + prefix + "single-confile", argc, argv);
if( i != -1 )
specconfig = uniset::getArgParam("--" + prefix + "single-confile", argc, argv,"");
xmlNode* cnode = conf->findNode(xml->getFirstNode(), "LogDB", name);
std::shared_ptr<UniXML> xml;
if( specconfig.empty() )
{
cout << myname << "(init): init from uniset configure..." << endl;
uniset_init(argc, argv, "configure.xml");
auto conf = uniset_conf();
xml = conf->getConfXML();
conf->initLogStream(dblog, prefix + "log" );
}
else
{
cout << myname << "(init): init from single-confile " << specconfig << endl;
xml = make_shared<UniXML>();
try
{
xml->open(specconfig);
}
catch( std::exception& ex )
{
throw ex;
}
}
xmlNode* cnode = xml->findNode(xml->getFirstNode(), "LogDB", name);
if( !cnode )
{
......@@ -57,11 +83,11 @@ LogDB::LogDB( const string& name , const string& prefix ):
UniXML::iterator it(cnode);
qbufSize = conf->getArgPInt("--" + prefix + "buffer-size", it.getProp("bufferSize"), qbufSize);
maxdbRecords = conf->getArgPInt("--" + prefix + "max-records", it.getProp("maxRecords"), qbufSize);
maxwsocks = conf->getArgPInt("--" + prefix + "max-websockets", it.getProp("maxWebsockets"), maxwsocks);
qbufSize = uniset::getArgPInt("--" + prefix + "buffer-size", argc, argv, it.getProp("bufferSize"), qbufSize);
maxdbRecords = uniset::getArgPInt("--" + prefix + "max-records", argc, argv, it.getProp("maxRecords"), qbufSize);
maxwsocks = uniset::getArgPInt("--" + prefix + "max-websockets", argc, argv, it.getProp("maxWebsockets"), maxwsocks);
std::string s_overflow = conf->getArg2Param("--" + prefix + "overflow-factor", it.getProp("overflowFactor"), "1.3");
std::string s_overflow = uniset::getArg2Param("--" + prefix + "overflow-factor", argc, argv, it.getProp("overflowFactor"), "1.3");
float ovf = atof(s_overflow.c_str());
numOverflow = lroundf( (float)maxdbRecords * ovf );
......@@ -135,7 +161,7 @@ LogDB::LogDB( const string& name , const string& prefix ):
}
const std::string dbfile = conf->getArgParam("--" + prefix + "dbfile", it.getProp("dbfile"));
const std::string dbfile = uniset::getArgParam("--" + prefix + "dbfile", argc, argv, it.getProp("dbfile"));
if( dbfile.empty() )
{
......@@ -159,8 +185,8 @@ LogDB::LogDB( const string& name , const string& prefix ):
#ifndef DISABLE_REST_API
httpHost = conf->getArgParam("--" + prefix + "httpserver-host", "localhost");
httpPort = conf->getArgInt("--" + prefix + "httpserver-port", "8080");
httpHost = uniset::getArgParam("--" + prefix + "httpserver-host", argc, argv, "localhost");
httpPort = uniset::getArgInt("--" + prefix + "httpserver-port", argc, argv, "8080");
dblog1 << myname << "(init): http server parameters " << httpHost << ":" << httpPort << endl;
Poco::Net::SocketAddress sa(httpHost, httpPort);
......@@ -303,9 +329,7 @@ size_t LogDB::getFirstOfOldRecord( size_t maxnum )
//--------------------------------------------------------------------------------------------
std::shared_ptr<LogDB> LogDB::init_logdb( int argc, const char* const* argv, const std::string& prefix )
{
auto conf = uniset_conf();
string name = conf->getArgParam("--" + prefix + "name", "");
string name = uniset::getArgParam("--" + prefix + "name", argc, argv, "LogDB");
if( name.empty() )
{
......@@ -313,12 +337,13 @@ std::shared_ptr<LogDB> LogDB::init_logdb( int argc, const char* const* argv, con
return nullptr;
}
return make_shared<LogDB>(name, prefix);
return make_shared<LogDB>(name, argc, argv, prefix);
}
// -----------------------------------------------------------------------------
void LogDB::help_print()
{
cout << "Default: prefix='logdb'" << endl;
cout << "--prefix-single-confile conf.xml - Отдельный конфигурационный файл (не требующий структуры uniset)" << endl;
cout << "--prefix-name name - Имя. Для поиска настроечной секции в configure.xml" << endl;
cout << "--prefix-buffer-size sz - Размер буфера (до скидывания в БД)." << endl;
cout << "--prefix-max-records sz - Максимальное количество записей в БД. При превышении, старые удаляются. 0 - не удалять" << endl;
......
......@@ -125,7 +125,6 @@ namespace uniset
чтение данных от логсерверов, посылка сообщений в websockets, запись в БД.
При этом обработка запросов REST API реализуется отдельными потоками контролируемыми libpoco.
\todo conf: Отвязать конфигурирование от uniset (uniset_conf). Чтобы можно было просто указать xml-файл с настройками
\todo conf: может быть даже добавить поддержку конфигурирования в формате yaml.
\todo Добавить настройки таймаутов, размера буфера, размера для резервирования под строку, количество потоков для http и т.п.
\todo db: Сделать настройку, для формата даты и времени при выгрузке из БД (при формировании json).
......@@ -135,6 +134,8 @@ namespace uniset
\todo WebSocket: доделать настройку всевозможных timeout-ов
\todo db: возможно всё-таки стоит парсить логи на предмет loglevel, и тогда уж и дату с временем вынимать
\todo web: генерировать html-страничку со списком подключения к логам с использованием готового шаблона
\todo db: ведение БД сделать отключаемым в настройках (чтобы можно было запускать только как сервис наблюдения за логами в реальном времени)
\todo db: сделать в RESET API команду включения или отключения запись логов в БД, для управления "на ходу"
*/
class LogDB:
public EventLoopServer
......@@ -144,7 +145,7 @@ namespace uniset
#endif
{
public:
LogDB( const std::string& name, const std::string& prefix = "" );
LogDB( const std::string& name, int argc, const char* const* argv, const std::string& prefix );
virtual ~LogDB();
/*! глобальная функция для инициализации объекта */
......
<?xml version="1.0" encoding="utf-8"?>
<LogDB name="LogDB">
<logserver name="ses" ip="localhost" port="21107" cmd="-d level8 ALL" description="(ses): управление электростанцией"/>
<logserver name="geu" ip="localhost" port="21202" cmd="-a any -d any .*ulog.* -d level8 ALL" description="(geu): управление ГЭУ1 (правый борт)"/>
<logserver name="logserver1" ip="localhost" port="3333" cmd="-s level1" description="Лог сервер процесса управления N1"/>
<logserver name="logserver2" ip="localhost" port="3333" cmd="" description="Лог сервер процесса управления N2"/>
</LogDB>
......@@ -17,8 +17,6 @@ int main(int argc, char** argv)
return 0;
}
uniset_init(argc, argv, "configure.xml");
auto db = LogDB::init_logdb(argc, argv);
if( !db )
......
#!/bin/sh
ulimit -Sc 1000000
#uniset2-start.sh -g \
./uniset2-logdb --logdb-single-confile logdb-conf.xml --logdb-name LogDB \
--logdb-log-add-levels any \
--logdb-dbfile ./test.db \
--logdb-buffer-size 5 \
--logdb-httpserver-port 8888 \
--logdb-max-records 20000 \
$*
......@@ -248,6 +248,22 @@ namespace uniset
return defval;
}
/*! получить значение, если пустое, то defval, если defval="" return defval2 */
inline std::string getArg2Param(const std::string& name,
int _argc, const char* const* _argv,
const std::string& defval, const std::string& defval2 = "") noexcept
{
std::string s(uniset::getArgParam(name, _argc, _argv, ""));
if( !s.empty() )
return s;
if( !defval.empty() )
return defval;
return defval2;
}
inline int getArgInt( const std::string& name,
int _argc, const char* const* _argv,
const std::string& defval = "" ) noexcept
......@@ -255,6 +271,19 @@ namespace uniset
return uni_atoi(getArgParam(name, _argc, _argv, defval));
}
inline int getArgPInt( const std::string& name,
int _argc, const char* const* _argv,
const std::string& strdefval, int defval ) noexcept
{
std::string param = uniset::getArgParam(name, _argc, _argv, strdefval);
if( param.empty() && strdefval.empty() )
return defval;
return uniset::uni_atoi(param);
}
/*! Проверка наличия параметра в командной строке
\param name - название параметра
\param _argc - argc
......
......@@ -515,15 +515,7 @@ namespace uniset
// -------------------------------------------------------------------------
std::string Configuration::getArg2Param( const std::string& name, const std::string& defval, const std::string& defval2 ) const noexcept
{
string s(uniset::getArgParam(name, _argc, _argv, ""));
if( !s.empty() )
return s;
if( !defval.empty() )
return defval;
return defval2;
return uniset::getArg2Param(name,_argc,_argv,defval,defval2);
}
string Configuration::getArgParam( const string& name, const string& defval ) const noexcept
......@@ -538,25 +530,14 @@ namespace uniset
int Configuration::getArgPInt( const string& name, int defval ) const noexcept
{
string param = getArgParam(name, "");
if( param.empty() )
return defval;
return uniset::uni_atoi(param);
return uniset::getArgPInt(name,_argc,_argv,"",defval);
}
int Configuration::getArgPInt( const string& name, const string& strdefval, int defval ) const noexcept
{
string param = getArgParam(name, strdefval);
if( param.empty() && strdefval.empty() )
return defval;
return uniset::uni_atoi(param);
return uniset::getArgPInt(name,_argc,_argv,strdefval,defval);
}
// -------------------------------------------------------------------------
void Configuration::initParameters()
{
......
......@@ -291,6 +291,20 @@ TEST_CASE("UniSetTypes: getArgParam", "[utypes][getArgParam]" )
REQUIRE( getArgParam("--unknownparam2", argc, argv) == "" );
}
// -----------------------------------------------------------------------------
TEST_CASE("UniSetTypes: getArg2Param", "[utypes][getArg2Param]" )
{
// inline std::string getArg2Param(const std::string& name,
// int _argc, const char* const* _argv,
// const std::string& defval, const std::string& defval2 = "") noexcept
int argc = 5;
char* argv[] = {"progname", "--param1", "val", "--param2", "val2"};
REQUIRE( getArg2Param("--param1", argc, argv, "") == "val" );
REQUIRE( getArg2Param("--param2", argc, argv, "") == "val2" );
REQUIRE( getArg2Param("--unknownparam", argc, argv, "val3") == "val3" );
REQUIRE( getArg2Param("--unknownparam2", argc, argv,"","val4") == "val4" );
}
// -----------------------------------------------------------------------------
TEST_CASE("UniSetTypes: getArgInt", "[utypes][getArgInt]" )
{
// inline int getArgInt( const std::string& name,
......@@ -304,6 +318,20 @@ TEST_CASE("UniSetTypes: getArgInt", "[utypes][getArgInt]" )
REQUIRE( getArgInt("--unknownparam", argc, argv, "3") == 3 );
}
// -----------------------------------------------------------------------------
TEST_CASE("UniSetTypes: getArgPInt", "[utypes][getArgPInt]" )
{
// inline int getArgPInt( const std::string& name,
// int _argc, const char* const* _argv,
// const std::string& strdefval, int defval ) noexcept
int argc = 5;
char* argv[] = {"progname", "--param1", "1", "--param2", "text"};
REQUIRE( getArgPInt("--param1", argc, argv, "", 0) == 1 );
REQUIRE( getArgPInt("--param2", argc, argv, "", 0) == 0 );
REQUIRE( getArgPInt("--unknownparam", argc, argv, "3", 0) == 3 );
REQUIRE( getArgPInt("--unknownparam", argc, argv, "", 42) == 42 );
}
// -----------------------------------------------------------------------------
TEST_CASE("UniSetTypes: is_digit", "[utypes][is_digit]" )
{
// bool is_digit( const std::string& s ) noexcept;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment