Commit 13ac8507 authored by Pavel Vainerman's avatar Pavel Vainerman

(LogDB): ушёл от использования getopt при разборе команд

(т.к. оставил только три команды set,add,del.
parent 00eb5a61
...@@ -62,6 +62,7 @@ LogDB::LogDB( const string& name , const string& prefix ): ...@@ -62,6 +62,7 @@ LogDB::LogDB( const string& name , const string& prefix ):
checkBufferTimer.set<LogDB, &LogDB::onCheckBuffer>(this); checkBufferTimer.set<LogDB, &LogDB::onCheckBuffer>(this);
UniXML::iterator sit(cnode); UniXML::iterator sit(cnode);
if( !sit.goChildren() ) if( !sit.goChildren() )
{ {
ostringstream err; ostringstream err;
...@@ -70,7 +71,7 @@ LogDB::LogDB( const string& name , const string& prefix ): ...@@ -70,7 +71,7 @@ LogDB::LogDB( const string& name , const string& prefix ):
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
for( ;sit.getCurrent(); sit++ ) for( ; sit.getCurrent(); sit++ )
{ {
auto l = make_shared<Log>(); auto l = make_shared<Log>();
...@@ -103,15 +104,15 @@ LogDB::LogDB( const string& name , const string& prefix ): ...@@ -103,15 +104,15 @@ LogDB::LogDB( const string& name , const string& prefix ):
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
// if( l->cmd.empty() ) // if( l->cmd.empty() )
// { // {
// ostringstream err; // ostringstream err;
// err << name << "(init): Unknown 'cmd' for '" << l->name << "'.."; // err << name << "(init): Unknown 'cmd' for '" << l->name << "'..";
// dbcrit << err.str() << endl; // dbcrit << err.str() << endl;
// throw uniset::SystemError(err.str()); // throw uniset::SystemError(err.str());
// } // }
// l->tcp = make_shared<UTCPStream>(); // l->tcp = make_shared<UTCPStream>();
l->dblog = dblog; l->dblog = dblog;
l->signal_on_read().connect(sigc::mem_fun(this, &LogDB::addLog)); l->signal_on_read().connect(sigc::mem_fun(this, &LogDB::addLog));
...@@ -128,6 +129,7 @@ LogDB::LogDB( const string& name , const string& prefix ): ...@@ -128,6 +129,7 @@ LogDB::LogDB( const string& name , const string& prefix ):
std::string dbfile = conf->getArgParam("--" + prefix + "-dbfile", it.getProp("dbfile")); std::string dbfile = conf->getArgParam("--" + prefix + "-dbfile", it.getProp("dbfile"));
if( dbfile.empty() ) if( dbfile.empty() )
{ {
ostringstream err; ostringstream err;
...@@ -137,12 +139,13 @@ LogDB::LogDB( const string& name , const string& prefix ): ...@@ -137,12 +139,13 @@ LogDB::LogDB( const string& name , const string& prefix ):
} }
db = unisetstd::make_unique<SQLiteInterface>(); db = unisetstd::make_unique<SQLiteInterface>();
if( !db->connect(dbfile, false) ) if( !db->connect(dbfile, false) )
{ {
ostringstream err; ostringstream err;
err << myname err << myname
<< "(init): DB connection error: " << "(init): DB connection error: "
<< db->error(); << db->error();
dbcrit << err.str() << endl; dbcrit << err.str() << endl;
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
...@@ -240,7 +243,7 @@ void LogDB::onTimer( ev::timer& t, int revents ) ...@@ -240,7 +243,7 @@ void LogDB::onTimer( ev::timer& t, int revents )
} }
// проверяем соединения.. // проверяем соединения..
for( const auto& s: logservers ) for( const auto& s : logservers )
{ {
if( !s->isConnected() ) if( !s->isConnected() )
{ {
...@@ -272,7 +275,7 @@ bool LogDB::Log::connect() noexcept ...@@ -272,7 +275,7 @@ bool LogDB::Log::connect() noexcept
if( tcp && tcp->isConnected() ) if( tcp && tcp->isConnected() )
return true; return true;
// dbinfo << name << "(connect): connect " << ip << ":" << port << "..." << endl; // dbinfo << name << "(connect): connect " << ip << ":" << port << "..." << endl;
if( peername.empty() ) if( peername.empty() )
peername = ip + ":" + std::to_string(port); peername = ip + ":" + std::to_string(port);
...@@ -281,8 +284,8 @@ bool LogDB::Log::connect() noexcept ...@@ -281,8 +284,8 @@ bool LogDB::Log::connect() noexcept
{ {
tcp = make_shared<UTCPStream>(); tcp = make_shared<UTCPStream>();
tcp->create(ip, port); tcp->create(ip, port);
// tcp->setReceiveTimeout( UniSetTimer::millisecToPoco(inTimeout) ); // tcp->setReceiveTimeout( UniSetTimer::millisecToPoco(inTimeout) );
// tcp->setSendTimeout( UniSetTimer::millisecToPoco(outTimeout) ); // tcp->setSendTimeout( UniSetTimer::millisecToPoco(outTimeout) );
tcp->setKeepAlive(true); tcp->setKeepAlive(true);
tcp->setBlocking(false); tcp->setBlocking(false);
dbinfo << name << "(connect): connect OK to " << ip << ":" << port << endl; dbinfo << name << "(connect): connect OK to " << ip << ":" << port << endl;
...@@ -304,7 +307,7 @@ bool LogDB::Log::connect() noexcept ...@@ -304,7 +307,7 @@ bool LogDB::Log::connect() noexcept
{ {
std::exception_ptr p = std::current_exception(); std::exception_ptr p = std::current_exception();
dbwarn << name << "(connect): connection " << peername << " error: " dbwarn << name << "(connect): connection " << peername << " error: "
<< (p ? p.__cxa_exception_type()->name() : "null") << endl; << (p ? p.__cxa_exception_type()->name() : "null") << endl;
} }
tcp->disconnect(); tcp->disconnect();
...@@ -327,9 +330,10 @@ void LogDB::Log::ioprepare( ev::dynamic_loop& loop ) ...@@ -327,9 +330,10 @@ void LogDB::Log::ioprepare( ev::dynamic_loop& loop )
//! \todo Пока закрываем глаза на не оптимальность, того, что парсим строку каждый раз //! \todo Пока закрываем глаза на не оптимальность, того, что парсим строку каждый раз
auto cmdlist = LogServerTypes::getCommands(cmd); auto cmdlist = LogServerTypes::getCommands(cmd);
if( !cmdlist.empty() ) if( !cmdlist.empty() )
{ {
for( const auto& msg: cmdlist ) for( const auto& msg : cmdlist )
wbuf.emplace(new UTCPCore::Buffer((unsigned char*)&msg, sizeof(msg))); wbuf.emplace(new UTCPCore::Buffer((unsigned char*)&msg, sizeof(msg)));
io.set(ev::WRITE); io.set(ev::WRITE);
...@@ -363,21 +367,22 @@ void LogDB::Log::read( ev::io& watcher ) ...@@ -363,21 +367,22 @@ void LogDB::Log::read( ev::io& watcher )
int n = tcp->available(); int n = tcp->available();
n = std::min(n,bufsize); n = std::min(n, bufsize);
if( n > 0 ) if( n > 0 )
{ {
tcp->receiveBytes(buf, n); tcp->receiveBytes(buf, n);
// нарезаем на строки // нарезаем на строки
for( size_t i=0; i<n; i++ ) for( size_t i = 0; i < n; i++ )
{ {
if( buf[i] != '\n' ) if( buf[i] != '\n' )
text += buf[i]; text += buf[i];
else else
{ {
sigRead.emit(this,text); sigRead.emit(this, text);
text = ""; text = "";
if( text.capacity() < reservsize ) if( text.capacity() < reservsize )
text.reserve(reservsize); text.reserve(reservsize);
} }
...@@ -386,13 +391,16 @@ void LogDB::Log::read( ev::io& watcher ) ...@@ -386,13 +391,16 @@ void LogDB::Log::read( ev::io& watcher )
else if( n == 0 ) else if( n == 0 )
{ {
dbinfo << name << ": " << ip << ":" << port << " connection is closed.." << endl; dbinfo << name << ": " << ip << ":" << port << " connection is closed.." << endl;
if( !text.empty() ) if( !text.empty() )
{ {
sigRead.emit(this,text); sigRead.emit(this, text);
text = ""; text = "";
if( text.capacity() < reservsize ) if( text.capacity() < reservsize )
text.reserve(reservsize); text.reserve(reservsize);
} }
close(); close();
} }
} }
...@@ -400,6 +408,7 @@ void LogDB::Log::read( ev::io& watcher ) ...@@ -400,6 +408,7 @@ void LogDB::Log::read( ev::io& watcher )
void LogDB::Log::write( ev::io& io ) void LogDB::Log::write( ev::io& io )
{ {
UTCPCore::Buffer* buffer = 0; UTCPCore::Buffer* buffer = 0;
if( wbuf.empty() ) if( wbuf.empty() )
{ {
io.set(EV_READ); io.set(EV_READ);
......
...@@ -115,37 +115,37 @@ namespace uniset ...@@ -115,37 +115,37 @@ namespace uniset
class Log class Log
{ {
public: public:
std::string name; std::string name;
std::string ip; std::string ip;
int port = { 0 }; int port = { 0 };
std::string cmd; std::string cmd;
std::string peername; std::string peername;
std::shared_ptr<DebugStream> dblog; std::shared_ptr<DebugStream> dblog;
bool connect() noexcept; bool connect() noexcept;
bool isConnected() const; bool isConnected() const;
void ioprepare( ev::dynamic_loop& loop ); void ioprepare( ev::dynamic_loop& loop );
void event( ev::io& watcher, int revents ); void event( ev::io& watcher, int revents );
void read( ev::io& watcher); void read( ev::io& watcher);
void write(ev::io& io ); void write( ev::io& io );
void close(); void close();
typedef sigc::signal<void, Log*, const std::string&> ReadSignal; typedef sigc::signal<void, Log*, const std::string&> ReadSignal;
ReadSignal signal_on_read(); ReadSignal signal_on_read();
private: private:
ReadSignal sigRead; ReadSignal sigRead;
ev::io io; ev::io io;
std::shared_ptr<UTCPStream> tcp; std::shared_ptr<UTCPStream> tcp;
static const int bufsize = { 10001 }; static const int bufsize = { 10001 };
char buf[bufsize]; char buf[bufsize];
static const size_t reservsize = { 1000 }; static const size_t reservsize = { 1000 };
std::string text; std::string text;
// буфер для посылаемых данных (write buffer) // буфер для посылаемых данных (write buffer)
std::queue<UTCPCore::Buffer*> wbuf; std::queue<UTCPCore::Buffer*> wbuf;
}; };
std::vector< std::shared_ptr<Log> > logservers; std::vector< std::shared_ptr<Log> > logservers;
......
...@@ -84,11 +84,6 @@ namespace uniset ...@@ -84,11 +84,6 @@ namespace uniset
* [-a | --add] info,warn,crit,... [logfilter] - Add log levels. * [-a | --add] info,warn,crit,... [logfilter] - Add log levels.
* [-d | --del] info,warn,crit,... [logfilter] - Delete log levels. * [-d | --del] info,warn,crit,... [logfilter] - Delete log levels.
* [-s | --set] info,warn,crit,... [logfilter] - Set log levels. * [-s | --set] info,warn,crit,... [logfilter] - Set log levels.
* [-o | --off] [logfilter] - Off the write log file (if enabled).
* [-e | --on] [logfilter] - On(enable) the write log file (if before disabled).
* [-r | --rotate] [logfilter] - rotate log file.
* [-u | --save-loglevels] [logfilter] - save log levels (disable restore after disconnected).
* [-y | --restore-loglevels] [logfilter] - restore default log levels.
* *
* 'logfilter' - regexp for name of log. Default: ALL logs * 'logfilter' - regexp for name of log. Default: ALL logs
*/ */
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#include <getopt.h> // не хорошо завязыватся на getopt.. но пока так удобнее
#include "UniSetTypes.h" #include "UniSetTypes.h"
#include "LogServerTypes.h" #include "LogServerTypes.h"
#include "Debug.h" #include "Debug.h"
...@@ -84,183 +83,55 @@ namespace uniset ...@@ -84,183 +83,55 @@ namespace uniset
logname[s] = '\0'; logname[s] = '\0';
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
static struct option longopts[] = static const std::string checkArg( size_t i, const std::vector<std::string>& v )
{ {
{ "add", required_argument, 0, 'a' }, if( i < v.size() && (v[i])[0] != '-' )
{ "del", required_argument, 0, 'd' }, return v[i];
{ "set", required_argument, 0, 's' },
{ "off", required_argument, 0, 'o' },
{ "on", required_argument, 0, 'e' },
{ "save-loglevels", required_argument, 0, 'u' },
{ "restore-loglevels", required_argument, 0, 'y' },
{ "rotate", optional_argument, 0, 'r' },
{ "logfilter", required_argument, 0, 'n' },
{ "timeout", required_argument, 0, 't' },
{ "reconnect-delay", required_argument, 0, 'x' },
{ NULL, 0, 0, 0 }
};
// --------------------------------------------------------------------------
static const char* checkArg( int i, int argc, const char* argv[] )
{
if( i < argc && (argv[i])[0] != '-' )
return argv[i];
return 0; return "";
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
std::vector<LogServerTypes::lsMessage> LogServerTypes::getCommands( const std::string& cmd ) std::vector<LogServerTypes::lsMessage> LogServerTypes::getCommands( const std::string& cmd )
{ {
// формируем argc, argv и проходим getopt-ом vector<lsMessage> vcmd;
// пока это самый простой способ..
auto v = uniset::explode_str(cmd,' '); auto v = uniset::explode_str(cmd,' ');
const size_t argc = v.size()+1;
const char** argv = new const char*[argc];
argv[0] = " "; if( v.empty() )
for( size_t i=1; i<argc; i++ ) return vcmd;
argv[i] = v[i-1].c_str(); // use strdup?
int optindex = 0;
int opt = 0;
vector<lsMessage> vcmd;
while(1) for( size_t i=0; i < v.size(); i++ )
{ {
opt = getopt_long(argc, (char**)argv, "la:d:s:n:eorx:t:uby:", longopts, &optindex); auto c = v[i];
if( opt == -1 )
break;
switch (opt)
{
case 'a':
{
LogServerTypes::Command cmd = LogServerTypes::cmdAddLevel;
std::string filter("");
std::string d = string(optarg);
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(cmd, (int)Debug::value(d), filter);
}
break;
case 'd':
{
LogServerTypes::Command cmd = LogServerTypes::cmdDelLevel;
std::string filter("");
std::string d = string(optarg);
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(cmd, (int)Debug::value(d), filter );
}
break;
case 's':
{
LogServerTypes::Command cmd = LogServerTypes::cmdSetLevel;
std::string filter("");
std::string d = string(optarg);
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(cmd, (int)Debug::value(d), filter );
}
break;
case 'l':
{
std::string filter("");
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(LogServerTypes::cmdList, 0, filter); string arg1 = checkArg(i+1, v);
} if( arg1.empty() )
break; continue;
case 'o': i++;
{
LogServerTypes::Command cmd = LogServerTypes::cmdOffLogFile;
std::string filter("");
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 ) std::string filter = checkArg(i+2,v);
filter = string(arg2); if( !filter.empty() )
i++;
vcmd.emplace_back(cmd, 0, filter); if( c == "-s" || c == "--set" )
} {
break; LogServerTypes::Command cmd = LogServerTypes::cmdSetLevel;
vcmd.emplace_back(cmd, (int)Debug::value(arg1), filter);
case 'u': // --save-loglevels }
{ else if( c == "-a" || c == "--add" )
LogServerTypes::Command cmd = LogServerTypes::cmdSaveLogLevel; {
std::string filter(""); LogServerTypes::Command cmd = LogServerTypes::cmdAddLevel;
const char* arg2 = checkArg(optind, argc, argv); vcmd.emplace_back(cmd, (int)Debug::value(arg1), filter);
}
if( arg2 ) else if( c == "-d" || c == "--del" )
filter = string(arg2); {
LogServerTypes::Command cmd = LogServerTypes::cmdDelLevel;
vcmd.emplace_back(cmd, 0, filter); vcmd.emplace_back(cmd, (int)Debug::value(arg1), filter);
}
break;
case 'y': // --restore-loglevels
{
LogServerTypes::Command cmd = LogServerTypes::cmdRestoreLogLevel;
std::string filter("");
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(cmd, 0, filter);
}
break;
case 'e':
{
LogServerTypes::Command cmd = LogServerTypes::cmdOnLogFile;
std::string filter("");
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(cmd, 0, filter);
}
break;
case 'r':
{
LogServerTypes::Command cmd = LogServerTypes::cmdRotate;
std::string filter("");
const char* arg2 = checkArg(optind, argc, argv);
if( arg2 )
filter = string(arg2);
vcmd.emplace_back(cmd, 0, filter);
}
break;
case '?':
default:
break;
} }
} }
delete[] argv;
return vcmd; return vcmd;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
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