diff options
Diffstat (limited to 'contrib')
44 files changed, 603 insertions, 3298 deletions
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 92b44e0db..6c2ee73ca 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -27,5 +27,4 @@ # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. add_subdirectory(epee) -add_subdirectory(otshell_utils) diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h index 554a48488..54e3e966d 100644 --- a/contrib/epee/include/console_handler.h +++ b/contrib/epee/include/console_handler.h @@ -277,11 +277,11 @@ namespace epee { if (!m_prompt.empty()) { - epee::log_space::set_console_color(epee::log_space::console_color_yellow, true); + epee::set_console_color(epee::console_color_yellow, true); std::cout << m_prompt; if (' ' != m_prompt.back()) std::cout << ' '; - epee::log_space::reset_console_color(); + epee::reset_console_color(); std::cout.flush(); } } @@ -310,7 +310,7 @@ namespace epee } if (!get_line_ret) { - LOG_PRINT("Failed to read line.", LOG_LEVEL_0); + MERROR("Failed to read line."); } string_tools::trim(command); diff --git a/contrib/epee/include/misc_log_ex.h b/contrib/epee/include/misc_log_ex.h index 82760dfff..f04282438 100644 --- a/contrib/epee/include/misc_log_ex.h +++ b/contrib/epee/include/misc_log_ex.h @@ -28,9 +28,13 @@ #ifndef _MISC_LOG_EX_H_ #define _MISC_LOG_EX_H_ -//#include <windows.h> -#include <atomic> -#include <string> +#include "static_initializer.h" +#include "string_tools.h" +#include "time_helper.h" +#include "misc_os_dependent.h" + +#include "syncobj.h" + #include <iostream> #include <sstream> #include <iomanip> @@ -38,42 +42,79 @@ #include <algorithm> #include <list> #include <map> +#include <string> #include <time.h> #include <boost/cstdint.hpp> #include <boost/thread.hpp> #include <boost/filesystem.hpp> #include <boost/algorithm/string.hpp> -#if defined(WIN32) -#include <io.h> -#else -#include <unistd.h> -#endif - -#include "static_initializer.h" -#include "string_tools.h" -#include "time_helper.h" -#include "misc_os_dependent.h" - -#include "syncobj.h" - - -#define LOG_LEVEL_SILENT -1 -#define LOG_LEVEL_0 0 -#define LOG_LEVEL_1 1 -#define LOG_LEVEL_2 2 -#define LOG_LEVEL_3 3 -#define LOG_LEVEL_4 4 -#define LOG_LEVEL_MIN LOG_LEVEL_SILENT -#define LOG_LEVEL_MAX LOG_LEVEL_4 - - -#define LOGGER_NULL 0 -#define LOGGER_FILE 1 -#define LOGGER_DEBUGGER 2 -#define LOGGER_CONSOLE 3 -#define LOGGER_DUMP 4 - +#define ELPP_THREAD_SAFE +#define ELPP_DEFAULT_LOG_FILE "" +#define ELPP_STACKTRACE 0 +#define ELPP_DISABLE_DEFAULT_CRASH_HANDLING +#define ELPP_DISABLE_CHECK_MACROS +#include "easylogging++.h" + +#define MONERO_DEFAULT_LOG_CATEGORY "default" + +#define MCFATAL(cat,x) CLOG(FATAL,cat) << x +#define MCERROR(cat,x) CLOG(ERROR,cat) << x +#define MCWARNING(cat,x) CLOG(WARNING,cat) << x +#define MCINFO(cat,x) CLOG(INFO,cat) << x +#define MCDEBUG(cat,x) CLOG(DEBUG,cat) << x +#define MCTRACE(cat,x) CLOG(TRACE,cat) << x +#define MCLOG(level,cat,x) ELPP_WRITE_LOG(el::base::Writer, level, el::base::DispatchAction::NormalLog, cat) << x + +#define MCLOG_COLOR(level,cat,color,x) MCLOG(level,cat,"\033[1;" color "m" << x << "\033[0m") +#define MCLOG_RED(level,cat,x) MCLOG_COLOR(level,cat,"31",x) +#define MCLOG_GREEN(level,cat,x) MCLOG_COLOR(level,cat,"32",x) +#define MCLOG_YELLOW(level,cat,x) MCLOG_COLOR(level,cat,"33",x) +#define MCLOG_BLUE(level,cat,x) MCLOG_COLOR(level,cat,"34",x) +#define MCLOG_MAGENTA(level,cat,x) MCLOG_COLOR(level,cat,"35",x) +#define MCLOG_CYAN(level,cat,x) MCLOG_COLOR(level,cat,"36",x) + +#define MLOG_RED(level,x) MCLOG_RED(level,MONERO_DEFAULT_LOG_CATEGORY,x) +#define MLOG_GREEN(level,x) MCLOG_GREEN(level,MONERO_DEFAULT_LOG_CATEGORY,x) +#define MLOG_YELLOW(level,x) MCLOG_YELLOW(level,MONERO_DEFAULT_LOG_CATEGORY,x) +#define MLOG_BLUE(level,x) MCLOG_BLUE(level,MONERO_DEFAULT_LOG_CATEGORY,x) +#define MLOG_MAGENTA(level,x) MCLOG_MAGENTA(level,MONERO_DEFAULT_LOG_CATEGORY,x) +#define MLOG_CYAN(level,x) MCLOG_CYAN(level,MONERO_DEFAULT_LOG_CATEGORY,x) + +#define MFATAL(x) MCFATAL(MONERO_DEFAULT_LOG_CATEGORY,x) +#define MERROR(x) MCERROR(MONERO_DEFAULT_LOG_CATEGORY,x) +#define MWARNING(x) MCWARNING(MONERO_DEFAULT_LOG_CATEGORY,x) +#define MINFO(x) MCINFO(MONERO_DEFAULT_LOG_CATEGORY,x) +#define MDEBUG(x) MCDEBUG(MONERO_DEFAULT_LOG_CATEGORY,x) +#define MTRACE(x) MCTRACE(MONERO_DEFAULT_LOG_CATEGORY,x) +#define MLOG(level,x) MCLOG(level,MONERO_DEFAULT_LOG_CATEGORY,x) + +#define MGINFO(x) MCINFO("global",x) +#define MGINFO_RED(x) MCLOG_RED(el::Level::Info, "global",x) +#define MGINFO_GREEN(x) MCLOG_GREEN(el::Level::Info, "global",x) +#define MGINFO_YELLOW(x) MCLOG_YELLOW(el::Level::Info, "global",x) +#define MGINFO_BLUE(x) MCLOG_BLUE(el::Level::Info, "global",x) +#define MGINFO_MAGENTA(x) MCLOG_MAGENTA(el::Level::Info, "global",x) +#define MGINFO_CYAN(x) MCLOG_CYAN(el::Level::Info, "global",x) + +#define LOG_ERROR(x) MERROR(x) +#define LOG_PRINT_L0(x) MWARNING(x) +#define LOG_PRINT_L1(x) MINFO(x) +#define LOG_PRINT_L2(x) MDEBUG(x) +#define LOG_PRINT_L3(x) MTRACE(x) +#define LOG_PRINT_L4(x) MTRACE(x) + +#define _dbg3(x) MTRACE(x) +#define _dbg2(x) MDEBUG(x) +#define _dbg1(x) MDEBUG(x) +#define _info(x) MINFO(x) +#define _note(x) MINFO(x) +#define _fact(x) MINFO(x) +#define _mark(x) MINFO(x) +#define _warn(x) MWARNING(x) +#define _erro(x) MERROR(x) + +#define MLOG_SET_THREAD_NAME(x) el::Loggers::setThreadName(x) #ifndef LOCAL_ASSERT #include <assert.h> @@ -85,6 +126,12 @@ #endif +std::string mlog_get_default_log_path(const char *default_filename); +void mlog_configure(const std::string &filename_base, bool console); +void mlog_set_categories(const char *categories); +void mlog_set_log_level(int level); +void mlog_set_log(const char *log); + namespace epee { namespace debug @@ -97,1312 +144,8 @@ namespace debug return e; } } -namespace log_space -{ - class logger; - class log_message; - class log_singletone; - - /************************************************************************/ - /* */ - /************************************************************************/ - enum console_colors - { - console_color_default, - console_color_white, - console_color_red, - console_color_green, - console_color_blue, - console_color_cyan, - console_color_magenta, - console_color_yellow - }; - - - struct ibase_log_stream - { - ibase_log_stream(){} - virtual ~ibase_log_stream(){} - virtual bool out_buffer( const char* buffer, int buffer_len , int log_level, int color, const char* plog_name = NULL)=0; - virtual int get_type(){return 0;} - - virtual bool set_max_logfile_size(uint64_t max_size){return true;}; - virtual bool set_log_rotate_cmd(const std::string& cmd){return true;}; - }; - - /************************************************************************/ - /* */ - /************************************************************************/ - /*struct ibase_log_value - { - public: - virtual void debug_out( std::stringstream* p_stream)const = 0; - };*/ - - /************************************************************************/ - /* */ - /************************************************************************/ - /*class log_message: public std::stringstream - { - public: - log_message(const log_message& lm): std::stringstream(), std::stringstream::basic_ios() - {} - log_message(){} - - template<class T> - log_message& operator<< (T t) - { - std::stringstream* pstrstr = this; - (*pstrstr) << t; - - return *this; - } - }; - inline - log_space::log_message& operator<<(log_space::log_message& sstream, const ibase_log_value& log_val) - { - log_val.debug_out(&sstream); - return sstream; - } - */ - /************************************************************************/ - /* */ - /************************************************************************/ - struct delete_ptr - { - template <class P> - void operator() (P p) - { - delete p.first; - } - }; - - /************************************************************************/ - /* */ - /************************************************************************/ - //------------------------------------------------------------------------ -#define max_dbg_str_len 80 -#ifdef _MSC_VER - class debug_output_stream: public ibase_log_stream - { - virtual bool out_buffer( const char* buffer, int buffer_len , int log_level, int color, const char* plog_name = NULL) - { - for ( int i = 0; i < buffer_len; i = i + max_dbg_str_len ) - { - std::string s( buffer + i, buffer_len- i < max_dbg_str_len ? - buffer_len - i : max_dbg_str_len ); - - ::OutputDebugStringA( s.c_str() ); - } - return true; - } - - }; -#endif - - inline bool is_stdout_a_tty() - { - static std::atomic<bool> initialized(false); - static std::atomic<bool> is_a_tty(false); - - if (!initialized.load(std::memory_order_acquire)) - { -#if defined(WIN32) - is_a_tty.store(0 != _isatty(_fileno(stdout)), std::memory_order_relaxed); -#else - is_a_tty.store(0 != isatty(fileno(stdout)), std::memory_order_relaxed); -#endif - initialized.store(true, std::memory_order_release); - } - - return is_a_tty.load(std::memory_order_relaxed); - } - - inline void set_console_color(int color, bool bright) - { - if (!is_stdout_a_tty()) - return; - - switch(color) - { - case console_color_default: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE| (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;37m"; - else - std::cout << "\033[0m"; -#endif - } - break; - case console_color_white: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;37m"; - else - std::cout << "\033[0;37m"; -#endif - } - break; - case console_color_red: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;31m"; - else - std::cout << "\033[0;31m"; -#endif - } - break; - case console_color_green: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;32m"; - else - std::cout << "\033[0;32m"; -#endif - } - break; - - case console_color_blue: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);//(bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;34m"; - else - std::cout << "\033[0;34m"; -#endif - } - break; - - case console_color_cyan: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;36m"; - else - std::cout << "\033[0;36m"; -#endif - } - break; - - case console_color_magenta: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;35m"; - else - std::cout << "\033[0;35m"; -#endif - } - break; - - case console_color_yellow: - { -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0)); -#else - if(bright) - std::cout << "\033[1;33m"; - else - std::cout << "\033[0;33m"; -#endif - } - break; - - } - } - - inline void reset_console_color() { - if (!is_stdout_a_tty()) - return; - -#ifdef WIN32 - HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); -#else - std::cout << "\033[0m"; - std::cout.flush(); -#endif - } - - class console_output_stream: public ibase_log_stream - { -#ifdef _MSC_VER - bool m_have_to_kill_console; -#endif - - public: - console_output_stream() - { -#ifdef _MSC_VER - - if(!::GetStdHandle(STD_OUTPUT_HANDLE)) - m_have_to_kill_console = true; - else - m_have_to_kill_console = false; - - ::AllocConsole(); -#endif - } - - ~console_output_stream() - { -#ifdef _MSC_VER - if(m_have_to_kill_console) - ::FreeConsole(); -#endif - } - int get_type(){return LOGGER_CONSOLE;} - - - - virtual bool out_buffer( const char* buffer, int buffer_len , int log_level, int color, const char* plog_name = NULL) - { - if(plog_name) - return true; //skip alternative logs from console - - set_console_color(color, log_level < 1); - -#ifdef _MSC_VER - const char* ptarget_buf = NULL; - char* pallocated_buf = NULL; - - // - int i = 0; - for(; i < buffer_len; i++) - if(buffer[i] == '\a') break; - if(i == buffer_len) - ptarget_buf = buffer; - else - { - pallocated_buf = new char[buffer_len]; - ptarget_buf = pallocated_buf; - for(i = 0; i < buffer_len; i++) - { - if(buffer[i] == '\a') - pallocated_buf[i] = '^'; - else - pallocated_buf[i] = buffer[i]; - } - } - - //uint32_t b = 0; - //::WriteConsoleA(::GetStdHandle(STD_OUTPUT_HANDLE), ptarget_buf, buffer_len, (DWORD*)&b, 0); - std::cout << ptarget_buf; - if(pallocated_buf) delete [] pallocated_buf; -#else - std::string buf(buffer, buffer_len); - for(size_t i = 0; i!= buf.size(); i++) - { - if(buf[i] == 7 || (buf[i]&0xff) == 0x95) - buf[i] = '^'; - } - - std::cout << buf; - std::cout << std::flush; -#endif - reset_console_color(); - return true; - } - - - }; - - inline bool rotate_log_file(const char* pfile_path) - { -#ifdef _MSC_VER - if(!pfile_path) - return false; - - std::string file_path = pfile_path; - std::string::size_type a = file_path .rfind('.'); - if ( a != std::string::npos ) - file_path .erase( a, file_path .size()); - - ::DeleteFileA( (file_path + ".0").c_str() ); - ::MoveFileA( (file_path + ".log").c_str(), (file_path + ".0").c_str() ); -#else - return false;//not implemented yet -#endif - return true; - } - - - - - //--------------------------------------------------------------------------// - class file_output_stream : public ibase_log_stream - { - public: - typedef std::map<std::string, std::ofstream*> named_log_streams; - - file_output_stream( std::string default_log_file_name, std::string log_path ) - { - m_default_log_filename = default_log_file_name; - m_max_logfile_size = 0; - m_default_log_path = log_path; - m_pdefault_file_stream = add_new_stream_and_open(default_log_file_name.c_str()); - } - - ~file_output_stream() - { - for(named_log_streams::iterator it = m_log_file_names.begin(); it!=m_log_file_names.end(); it++) - { - if ( it->second->is_open() ) - { - it->second->flush(); - it->second->close(); - } - delete it->second; - } - } - private: - named_log_streams m_log_file_names; - std::string m_default_log_path; - std::ofstream* m_pdefault_file_stream; - std::string m_log_rotate_cmd; - std::string m_default_log_filename; - uint64_t m_max_logfile_size; - - - std::ofstream* add_new_stream_and_open(const char* pstream_name) - { - //log_space::rotate_log_file((m_default_log_path + "\\" + pstream_name).c_str()); - - std::ofstream* pstream = (m_log_file_names[pstream_name] = new std::ofstream); - std::string target_path = m_default_log_path + "/" + pstream_name; - pstream->open( target_path.c_str(), std::ios_base::out | std::ios::app /*ios_base::trunc */); - if(pstream->fail()) - return NULL; - return pstream; - } - - bool set_max_logfile_size(uint64_t max_size) - { - m_max_logfile_size = max_size; - return true; - } - - bool set_log_rotate_cmd(const std::string& cmd) - { - m_log_rotate_cmd = cmd; - return true; - } - - - - virtual bool out_buffer( const char* buffer, int buffer_len, int log_level, int color, const char* plog_name = NULL ) - { - std::ofstream* m_target_file_stream = m_pdefault_file_stream; - if(plog_name) - { //find named stream - named_log_streams::iterator it = m_log_file_names.find(plog_name); - if(it == m_log_file_names.end()) - m_target_file_stream = add_new_stream_and_open(plog_name); - else - m_target_file_stream = it->second; - } - if(!m_target_file_stream || !m_target_file_stream->is_open()) - return false;//TODO: add assert here - - m_target_file_stream->write(buffer, buffer_len ); - m_target_file_stream->flush(); - - if(m_max_logfile_size) - { - std::ofstream::pos_type pt = m_target_file_stream->tellp(); - uint64_t current_sz = pt; - if(current_sz > m_max_logfile_size) - { - std::cout << "current_sz= " << current_sz << " m_max_logfile_size= " << m_max_logfile_size << std::endl; - std::string log_file_name; - if(!plog_name) - log_file_name = m_default_log_filename; - else - log_file_name = plog_name; - - m_target_file_stream->close(); - std::string new_log_file_name = log_file_name; - - time_t tm = 0; - time(&tm); - - int err_count = 0; - boost::system::error_code ec; - do - { - new_log_file_name = string_tools::cut_off_extension(log_file_name); - if(err_count) - new_log_file_name += misc_utils::get_time_str_v2(tm) + "(" + boost::lexical_cast<std::string>(err_count) + ")" + ".log"; - else - new_log_file_name += misc_utils::get_time_str_v2(tm) + ".log"; - - err_count++; - }while(boost::filesystem::exists(m_default_log_path + "/" + new_log_file_name, ec)); - - std::string new_log_file_path = m_default_log_path + "/" + new_log_file_name; - boost::filesystem::rename(m_default_log_path + "/" + log_file_name, new_log_file_path, ec); - if(ec) - { - std::cout << "Filed to rename, ec = " << ec.message() << std::endl; - } - - if(m_log_rotate_cmd.size()) - { - - std::string m_log_rotate_cmd_local_copy = m_log_rotate_cmd; - //boost::replace_all(m_log_rotate_cmd, "[*SOURCE*]", new_log_file_path); - boost::replace_all(m_log_rotate_cmd_local_copy, "[*TARGET*]", new_log_file_path); - - misc_utils::call_sys_cmd(m_log_rotate_cmd_local_copy); - } - - m_target_file_stream->open( (m_default_log_path + "/" + log_file_name).c_str(), std::ios_base::out | std::ios::app /*ios_base::trunc */); - if(m_target_file_stream->fail()) - return false; - } - } - - return true; - } - int get_type(){return LOGGER_FILE;} - }; - /************************************************************************/ - /* */ - /************************************************************************/ - class log_stream_splitter - { - public: - typedef std::list<std::pair<ibase_log_stream*, int> > streams_container; - - log_stream_splitter(){} - ~log_stream_splitter() - { - //free pointers - std::for_each(m_log_streams.begin(), m_log_streams.end(), delete_ptr()); - } - - bool set_max_logfile_size(uint64_t max_size) - { - for(streams_container::iterator it = m_log_streams.begin(); it!=m_log_streams.end();it++) - it->first->set_max_logfile_size(max_size); - return true; - } - - bool set_log_rotate_cmd(const std::string& cmd) - { - for(streams_container::iterator it = m_log_streams.begin(); it!=m_log_streams.end();it++) - it->first->set_log_rotate_cmd(cmd); - return true; - } - - bool do_log_message(const std::string& rlog_mes, int log_level, int color, const char* plog_name = NULL) - { - std::string str_mess = rlog_mes; - size_t str_len = str_mess.size(); - const char* pstr = str_mess.c_str(); - for(streams_container::iterator it = m_log_streams.begin(); it!=m_log_streams.end();it++) - if(it->second >= log_level) - it->first->out_buffer(pstr, (int)str_len, log_level, color, plog_name); - return true; - } - - bool add_logger( int type, const char* pdefault_file_name, const char* pdefault_log_folder, int log_level_limit = LOG_LEVEL_4 ) - { - ibase_log_stream* ls = NULL; - - switch( type ) - { - case LOGGER_FILE: - ls = new file_output_stream( pdefault_file_name, pdefault_log_folder ); - break; - - case LOGGER_DEBUGGER: -#ifdef _MSC_VER - ls = new debug_output_stream( ); -#else - return false;//not implemented yet -#endif - break; - case LOGGER_CONSOLE: - ls = new console_output_stream( ); - break; - } - - if ( ls ) { - m_log_streams.push_back(streams_container::value_type(ls, log_level_limit)); - return true; - } - return ls ? true:false; - } - bool add_logger( ibase_log_stream* pstream, int log_level_limit = LOG_LEVEL_4 ) - { - m_log_streams.push_back(streams_container::value_type(pstream, log_level_limit) ); - return true; - } - - bool remove_logger(int type) - { - streams_container::iterator it = m_log_streams.begin(); - for(;it!=m_log_streams.end(); it++) - { - if(it->first->get_type() == type) - { - delete it->first; - m_log_streams.erase(it); - return true; - } - } - return false; - - } - - protected: - private: - - streams_container m_log_streams; - }; - - /************************************************************************/ - /* */ - /************************************************************************/ - inline int get_set_log_detalisation_level(bool is_need_set = false, int log_level_to_set = LOG_LEVEL_1); - inline int get_set_time_level(bool is_need_set = false, int time_log_level = LOG_LEVEL_0); - inline bool get_set_need_thread_id(bool is_need_set = false, bool is_need_val = false); - inline bool get_set_need_proc_name(bool is_need_set = false, bool is_need_val = false); - - - inline std::string get_daytime_string2() - { - boost::posix_time::ptime p = boost::posix_time::microsec_clock::local_time(); - return misc_utils::get_time_str_v3(p); - } - inline std::string get_day_time_string() - { - return get_daytime_string2(); - //time_t tm = 0; - //time(&tm); - //return misc_utils::get_time_str(tm); - } - - inline std::string get_time_string() - { - return get_daytime_string2(); - - } -#ifdef _MSC_VER - inline std::string get_time_string_adv(SYSTEMTIME* pst = NULL) - { - SYSTEMTIME st = {0}; - if(!pst) - { - pst = &st; - GetSystemTime(&st); - } - std::stringstream str_str; - str_str.fill('0'); - str_str << std::setw(2) << pst->wHour << "_" - << std::setw(2) << pst->wMinute << "_" - << std::setw(2) << pst->wSecond << "_" - << std::setw(3) << pst->wMilliseconds; - return str_str.str(); - } -#endif - - - - - - class logger - { - public: - friend class log_singletone; - - logger() - { - CRITICAL_REGION_BEGIN(m_critical_sec); - init(); - CRITICAL_REGION_END(); - } - ~logger() - { - } - - bool set_max_logfile_size(uint64_t max_size) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - m_log_target.set_max_logfile_size(max_size); - CRITICAL_REGION_END(); - return true; - } - - bool set_log_rotate_cmd(const std::string& cmd) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - m_log_target.set_log_rotate_cmd(cmd); - CRITICAL_REGION_END(); - return true; - } - - bool take_away_journal(std::list<std::string>& journal) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - m_journal.swap(journal); - CRITICAL_REGION_END(); - return true; - } - - bool do_log_message(const std::string& rlog_mes, int log_level, int color, bool add_to_journal = false, const char* plog_name = NULL) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - m_log_target.do_log_message(rlog_mes, log_level, color, plog_name); - if(add_to_journal) - m_journal.push_back(rlog_mes); - - return true; - CRITICAL_REGION_END(); - } - - bool add_logger( int type, const char* pdefault_file_name, const char* pdefault_log_folder , int log_level_limit = LOG_LEVEL_4) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - return m_log_target.add_logger( type, pdefault_file_name, pdefault_log_folder, log_level_limit); - CRITICAL_REGION_END(); - } - bool add_logger( ibase_log_stream* pstream, int log_level_limit = LOG_LEVEL_4) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - return m_log_target.add_logger(pstream, log_level_limit); - CRITICAL_REGION_END(); - } - - bool remove_logger(int type) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - return m_log_target.remove_logger(type); - CRITICAL_REGION_END(); - } - - - bool set_thread_prefix(const std::string& prefix) - { - CRITICAL_REGION_BEGIN(m_critical_sec); - m_thr_prefix_strings[misc_utils::get_thread_string_id()] = prefix; - CRITICAL_REGION_END(); - return true; - } - - - std::string get_default_log_file() - { - return m_default_log_file; - } - - std::string get_default_log_folder() - { - return m_default_log_folder; - } - - protected: - private: - bool init() - { - // - - m_process_name = string_tools::get_current_module_name(); - - init_log_path_by_default(); - - //init default set of loggers - init_default_loggers(); - - std::stringstream ss; - ss << get_time_string() << " Init logging. Level=" << get_set_log_detalisation_level() - << " Log path=" << m_default_log_folder << std::endl; - this->do_log_message(ss.str(), console_color_white, LOG_LEVEL_0); - return true; - } - bool init_default_loggers() - { - //TODO: - return true; - } - - bool init_log_path_by_default() - { - //load process name - m_default_log_folder = string_tools::get_current_module_folder(); - - m_default_log_file = m_process_name; - std::string::size_type a = m_default_log_file.rfind('.'); - if ( a != std::string::npos ) - m_default_log_file.erase( a, m_default_log_file.size()); - if ( ! m_default_log_file.empty() ) - m_default_log_file += ".log"; - - return true; - } - - log_stream_splitter m_log_target; - - std::string m_default_log_folder; - std::string m_default_log_file; - std::string m_process_name; - std::map<std::string, std::string> m_thr_prefix_strings; - std::list<std::string> m_journal; - critical_section m_critical_sec; - }; - /************************************************************************/ - /* */ - /************************************************************************/ - class log_singletone - { - public: - friend class initializer<log_singletone>; - friend class logger; - static int get_log_detalisation_level() - { - get_or_create_instance();//to initialize logger, if it not initialized - return get_set_log_detalisation_level(); - } - - static bool is_filter_error(int error_code) - { - return false; - } - - - static bool do_log_message(const std::string& rlog_mes, int log_level, int color, bool keep_in_journal, const char* plog_name = NULL) - { - logger* plogger = get_or_create_instance(); - bool res = false; - if(plogger) - res = plogger->do_log_message(rlog_mes, log_level, color, keep_in_journal, plog_name); - else - { //globally uninitialized, create new logger for each call of do_log_message() and then delete it - plogger = new logger(); - //TODO: some extra initialization - res = plogger->do_log_message(rlog_mes, log_level, color, keep_in_journal, plog_name); - delete plogger; - plogger = NULL; - } - return res; - } - - static bool take_away_journal(std::list<std::string>& journal) - { - logger* plogger = get_or_create_instance(); - bool res = false; - if(plogger) - res = plogger->take_away_journal(journal); - - return res; - } - - static bool set_max_logfile_size(uint64_t file_size) - { - logger* plogger = get_or_create_instance(); - if(!plogger) return false; - return plogger->set_max_logfile_size(file_size); - } - - - static bool set_log_rotate_cmd(const std::string& cmd) - { - logger* plogger = get_or_create_instance(); - if(!plogger) return false; - return plogger->set_log_rotate_cmd(cmd); - } - - - static bool add_logger( int type, const char* pdefault_file_name, const char* pdefault_log_folder, int log_level_limit = LOG_LEVEL_4) - { - logger* plogger = get_or_create_instance(); - if(!plogger) return false; - return plogger->add_logger(type, pdefault_file_name, pdefault_log_folder, log_level_limit); - } - - static std::string get_default_log_file() - { - logger* plogger = get_or_create_instance(); - if(plogger) - return plogger->get_default_log_file(); - - return ""; - } - - static std::string get_default_log_folder() - { - logger* plogger = get_or_create_instance(); - if(plogger) - return plogger->get_default_log_folder(); - - return ""; - } - - static bool add_logger( ibase_log_stream* pstream, int log_level_limit = LOG_LEVEL_4 ) - { - logger* plogger = get_or_create_instance(); - if(!plogger) return false; - return plogger->add_logger(pstream, log_level_limit); - } - - - static bool remove_logger( int type ) - { - logger* plogger = get_or_create_instance(); - if(!plogger) return false; - return plogger->remove_logger(type); - } -PUSH_WARNINGS -DISABLE_GCC_WARNING(maybe-uninitialized) - static int get_set_log_detalisation_level(bool is_need_set = false, int log_level_to_set = LOG_LEVEL_1) - { - static int log_detalisation_level = LOG_LEVEL_1; - if(is_need_set) - log_detalisation_level = log_level_to_set; - return log_detalisation_level; - } -POP_WARNINGS - static int get_set_time_level(bool is_need_set = false, int time_log_level = LOG_LEVEL_0) - { - static int val_time_log_level = LOG_LEVEL_0; - if(is_need_set) - val_time_log_level = time_log_level; - - return val_time_log_level; - } - - static int get_set_process_level(bool is_need_set = false, int process_log_level = LOG_LEVEL_0) - { - static int val_process_log_level = LOG_LEVEL_0; - if(is_need_set) - val_process_log_level = process_log_level; - - return val_process_log_level; - } - - /*static int get_set_tid_level(bool is_need_set = false, int tid_log_level = LOG_LEVEL_0) - { - static int val_tid_log_level = LOG_LEVEL_0; - if(is_need_set) - val_tid_log_level = tid_log_level; - - return val_tid_log_level; - }*/ - - static bool get_set_need_thread_id(bool is_need_set = false, bool is_need_val = false) - { - static bool is_need = false; - if(is_need_set) - is_need = is_need_val; - - return is_need; - } - - static bool get_set_need_proc_name(bool is_need_set = false, bool is_need_val = false) - { - static bool is_need = true; - if(is_need_set) - is_need = is_need_val; - - return is_need; - } - static uint64_t get_set_err_count(bool is_need_set = false, uint64_t err_val = false) - { - static uint64_t err_count = 0; - if(is_need_set) - err_count = err_val; - - return err_count; - } - - -#ifdef _MSC_VER - - - static void SetThreadName( DWORD dwThreadID, const char* threadName) - { -#define MS_VC_EXCEPTION 0x406D1388 - -#pragma pack(push,8) - typedef struct tagTHREADNAME_INFO - { - DWORD dwType; // Must be 0x1000. - LPCSTR szName; // Pointer to name (in user addr space). - DWORD dwThreadID; // Thread ID (-1=caller thread). - DWORD dwFlags; // Reserved for future use, must be zero. - } THREADNAME_INFO; -#pragma pack(pop) - - - - Sleep(10); - THREADNAME_INFO info; - info.dwType = 0x1000; - info.szName = (char*)threadName; - info.dwThreadID = dwThreadID; - info.dwFlags = 0; - - __try - { - RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info ); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - } - } -#endif - - static bool set_thread_log_prefix(const std::string& prefix) - { -#ifdef _MSC_VER - SetThreadName(-1, prefix.c_str()); -#endif - - - logger* plogger = get_or_create_instance(); - if(!plogger) return false; - return plogger->set_thread_prefix(prefix); - } - - - static std::string get_prefix_entry() - { - std::stringstream str_prefix; - //write time entry - if ( get_set_time_level() <= get_set_log_detalisation_level() ) - str_prefix << get_day_time_string() << " "; - - //write process info - logger* plogger = get_or_create_instance(); - //bool res = false; - if(!plogger) - { //globally uninitialized, create new logger for each call of get_prefix_entry() and then delete it - plogger = new logger(); - } - - //if ( get_set_need_proc_name() && get_set_process_level() <= get_set_log_detalisation_level() ) - // str_prefix << "[" << plogger->m_process_name << " (id=" << GetCurrentProcessId() << ")] "; -//#ifdef _MSC_VER_EX - if ( get_set_need_thread_id() /*&& get_set_tid_level() <= get_set_log_detalisation_level()*/ ) - str_prefix << "tid:" << misc_utils::get_thread_string_id() << " "; -//#endif - - if(plogger->m_thr_prefix_strings.size()) - { - CRITICAL_REGION_LOCAL(plogger->m_critical_sec); - std::string thr_str = misc_utils::get_thread_string_id(); - std::map<std::string, std::string>::iterator it = plogger->m_thr_prefix_strings.find(thr_str); - if(it!=plogger->m_thr_prefix_strings.end()) - { - str_prefix << it->second; - } - } - - - if(get_set_is_uninitialized()) - delete plogger; - - return str_prefix.str(); - } - - private: - log_singletone(){}//restric to create an instance - //static initializer<log_singletone> m_log_initializer;//must be in one .cpp file (for example main.cpp) via DEFINE_LOGGING macro - - static bool init() - { - return true;/*do nothing here*/ - } - static bool un_init() - { - //delete object - logger* plogger = get_set_instance_internal(); - if(plogger) delete plogger; - //set uninitialized - get_set_is_uninitialized(true, true); - get_set_instance_internal(true, NULL); - return true; - } - - static logger* get_or_create_instance() - { - logger* plogger = get_set_instance_internal(); - if(!plogger) - if(!get_set_is_uninitialized()) - get_set_instance_internal(true, plogger = new logger); - - return plogger; - } - - static logger* get_set_instance_internal(bool is_need_set = false, logger* pnew_logger_val = NULL) - { - static logger* val_plogger = NULL; - - if(is_need_set) - val_plogger = pnew_logger_val; - - return val_plogger; - } - - static bool get_set_is_uninitialized(bool is_need_set = false, bool is_uninitialized = false) - { - static bool val_is_uninitialized = false; - - if(is_need_set) - val_is_uninitialized = is_uninitialized; - - return val_is_uninitialized; - } - //static int get_set_error_filter(bool is_need_set = false) - }; - - const static initializer<log_singletone> log_initializer; - /************************************************************************/ - /* */ -// /************************************************************************/ -// class log_array_value -// { -// int num; -// log_message& m_ref_log_mes; -// -// public: -// -// log_array_value( log_message& log_mes ) : num(0), m_ref_log_mes(log_mes) {} -// -// void operator ( )( ibase_log_value *val ) { -// m_ref_log_mes << "\n[" << num++ << "] "/* << val*/; } -// -// -// template<class T> -// void operator ()(T &value ) -// { -// m_ref_log_mes << "\n[" << num++ << "] " << value; -// } -// }; - - class log_frame - { - std::string m_name; - int m_level; - const char* m_plog_name; - public: - - log_frame(const std::string& name, int dlevel = LOG_LEVEL_2 , const char* plog_name = NULL) - { -#ifdef _MSC_VER - int lasterr=::GetLastError(); -#endif - m_plog_name = plog_name; - if ( dlevel <= log_singletone::get_log_detalisation_level() ) - { - m_name = name; - std::stringstream ss; - ss << log_space::log_singletone::get_prefix_entry() << "-->>" << m_name << std::endl; - log_singletone::do_log_message(ss.str(), dlevel, console_color_default, false, m_plog_name); - } - m_level = dlevel; -#ifdef _MSC_VER - ::SetLastError(lasterr); -#endif - } - ~log_frame() - { -#ifdef _MSC_VER - int lasterr=::GetLastError(); -#endif - - if (m_level <= log_singletone::get_log_detalisation_level() ) - { - std::stringstream ss; - ss << log_space::log_singletone::get_prefix_entry() << "<<--" << m_name << std::endl; - log_singletone::do_log_message(ss.str(), m_level, console_color_default, false,m_plog_name); - } -#ifdef _MSC_VER - ::SetLastError(lasterr); -#endif - } - }; - - inline int get_set_time_level(bool is_need_set, int time_log_level) - { - return log_singletone::get_set_time_level(is_need_set, time_log_level); - } - inline int get_set_log_detalisation_level(bool is_need_set, int log_level_to_set) - { - return log_singletone::get_set_log_detalisation_level(is_need_set, log_level_to_set); - } - inline std::string get_prefix_entry() - { - return log_singletone::get_prefix_entry(); - } - inline bool get_set_need_thread_id(bool is_need_set, bool is_need_val) - { - return log_singletone::get_set_need_thread_id(is_need_set, is_need_val); - } - inline bool get_set_need_proc_name(bool is_need_set, bool is_need_val ) - { - return log_singletone::get_set_need_proc_name(is_need_set, is_need_val); - } - - inline std::string get_win32_err_descr(int err_no) - { -#ifdef _MSC_VER - LPVOID lpMsgBuf; - - FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - err_no, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (char*) &lpMsgBuf, - 0, NULL ); - - std::string fix_sys_message = "(null)"; - if(lpMsgBuf) fix_sys_message = (char*)lpMsgBuf; - std::string::size_type a; - if ( (a = fix_sys_message.rfind( '\n' )) != std::string::npos ) - fix_sys_message.erase(a); - if ( (a = fix_sys_message.rfind( '\r' )) != std::string::npos ) - fix_sys_message.erase(a); - - LocalFree(lpMsgBuf); - return fix_sys_message; -#else - return "Not implemented yet"; -#endif - } - - inline bool getwin32_err_text(std::stringstream& ref_message, int error_no) - { - ref_message << "win32 error:" << get_win32_err_descr(error_no); - return true; - } -} -#if defined(_DEBUG) || defined(__GNUC__) - #define ENABLE_LOGGING_INTERNAL -#endif -#if defined(ENABLE_RELEASE_LOGGING) - #define ENABLE_LOGGING_INTERNAL -#endif - - -#if defined(ENABLE_LOGGING_INTERNAL) - -#define LOG_PRINT_NO_PREFIX2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\ - {std::stringstream ss________; ss________ << x << std::endl; epee::log_space::log_singletone::do_log_message(ss________.str() , y, epee::log_space::console_color_default, false, log_name);}} while(0) - -#define LOG_PRINT_NO_PREFIX_NO_POSTFIX2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\ - {std::stringstream ss________; ss________ << x; epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, false, log_name);}} while(0) - - -#define LOG_PRINT_NO_POSTFIX2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\ - {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x; epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, false, log_name);}} while(0) - - -#define LOG_PRINT2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\ - {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x << std::endl;epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, false, log_name);}} while(0) - -#define LOG_PRINT_COLOR2(log_name, x, y, color) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\ - {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x << std::endl;epee::log_space::log_singletone::do_log_message(ss________.str(), y, color, false, log_name);}} while(0) - - -#define LOG_PRINT2_JORNAL(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\ - {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x << std::endl;epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, true, log_name);}} while(0) - - -#define LOG_ERROR2(log_name, x) do { \ - std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << "ERROR " << __FILE__ << ":" << __LINE__ << " " << x << std::endl; epee::log_space::log_singletone::do_log_message(ss________.str(), LOG_LEVEL_0, epee::log_space::console_color_red, true, log_name);LOCAL_ASSERT(0); epee::log_space::log_singletone::get_set_err_count(true, epee::log_space::log_singletone::get_set_err_count()+1);} while(0) - -#define LOG_FRAME2(log_name, x, y) epee::log_space::log_frame frame(x, y, log_name) - -#else - - -#define LOG_PRINT_NO_PREFIX2(log_name, x, y) ((void)0) - -#define LOG_PRINT_NO_PREFIX_NO_POSTFIX2(log_name, x, y) ((void)0) - -#define LOG_PRINT_NO_POSTFIX2(log_name, x, y) ((void)0) -#define LOG_PRINT_COLOR2(log_name, x, y, color) ((void)0) - -#define LOG_PRINT2_JORNAL(log_name, x, y) ((void)0) - -#define LOG_PRINT2(log_name, x, y) ((void)0) - -#define LOG_ERROR2(log_name, x) ((void)0) - - -#define LOG_FRAME2(log_name, x, y) ((void)0) - - -#endif - - -#ifndef LOG_DEFAULT_TARGET - #define LOG_DEFAULT_TARGET NULL -#endif - - -#define LOG_PRINT_NO_POSTFIX(mess, level) LOG_PRINT_NO_POSTFIX2(LOG_DEFAULT_TARGET, mess, level) -#define LOG_PRINT_NO_PREFIX(mess, level) LOG_PRINT_NO_PREFIX2(LOG_DEFAULT_TARGET, mess, level) -#define LOG_PRINT_NO_PREFIX_NO_POSTFIX(mess, level) LOG_PRINT_NO_PREFIX_NO_POSTFIX2(LOG_DEFAULT_TARGET, mess, level) -#define LOG_PRINT(mess, level) LOG_PRINT2(LOG_DEFAULT_TARGET, mess, level) - -#define LOG_PRINT_COLOR(mess, level, color) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, color) -#define LOG_PRINT_RED(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_red) -#define LOG_PRINT_GREEN(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_green) -#define LOG_PRINT_BLUE(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_blue) -#define LOG_PRINT_YELLOW(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_yellow) -#define LOG_PRINT_CYAN(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_cyan) -#define LOG_PRINT_MAGENTA(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_magenta) - -#define LOG_PRINT_RED_L0(mess) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, LOG_LEVEL_0, epee::log_space::console_color_red) -#define LOG_PRINT_RED_L1(mess) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, LOG_LEVEL_1, epee::log_space::console_color_red) - -#define LOG_PRINT_L0(mess) LOG_PRINT(mess, LOG_LEVEL_0) -#define LOG_PRINT_L1(mess) LOG_PRINT(mess, LOG_LEVEL_1) -#define LOG_PRINT_L2(mess) LOG_PRINT(mess, LOG_LEVEL_2) -#define LOG_PRINT_L3(mess) LOG_PRINT(mess, LOG_LEVEL_3) -#define LOG_PRINT_L4(mess) LOG_PRINT(mess, LOG_LEVEL_4) -#define LOG_PRINT_J(mess, level) LOG_PRINT2_JORNAL(LOG_DEFAULT_TARGET, mess, level) - -#define LOG_ERROR(mess) LOG_ERROR2(LOG_DEFAULT_TARGET, mess) -#define LOG_FRAME(mess, level) LOG_FRAME2(LOG_DEFAULT_TARGET, mess, level) -#define LOG_VALUE(mess, level) LOG_VALUE2(LOG_DEFAULT_TARGET, mess, level) -#define LOG_ARRAY(mess, level) LOG_ARRAY2(LOG_DEFAULT_TARGET, mess, level) -//#define LOGWIN_PLATFORM_ERROR(err_no) LOGWINDWOS_PLATFORM_ERROR2(LOG_DEFAULT_TARGET, err_no) -#define LOG_SOCKET_ERROR(err_no) LOG_SOCKET_ERROR2(LOG_DEFAULT_TARGET, err_no) -//#define LOGWIN_PLATFORM_ERROR_UNCRITICAL(mess) LOGWINDWOS_PLATFORM_ERROR_UNCRITICAL2(LOG_DEFAULT_TARGET, mess) #define ENDL std::endl @@ -1435,8 +178,6 @@ POP_WARNINGS #define CHECK_AND_ASSERT(expr, fail_ret_val) do{if(!(expr)){LOCAL_ASSERT(expr); return fail_ret_val;};}while(0) #endif -#define NOTHING - #ifndef CHECK_AND_ASSERT_MES #define CHECK_AND_ASSERT_MES(expr, fail_ret_val, message) do{if(!(expr)) {LOG_ERROR(message); return fail_ret_val;};}while(0) #endif @@ -1463,5 +204,21 @@ POP_WARNINGS #define CHECK_AND_ASSERT_MES2(expr, message) do{if(!(expr)) {LOG_ERROR(message); };}while(0) #endif +enum console_colors +{ + console_color_default, + console_color_white, + console_color_red, + console_color_green, + console_color_blue, + console_color_cyan, + console_color_magenta, + console_color_yellow +}; + +bool is_stdout_a_tty(); +void set_console_color(int color, bool bright); +void reset_console_color(); + } #endif //_MISC_LOG_EX_H_ diff --git a/contrib/epee/include/net/abstract_tcp_server.h b/contrib/epee/include/net/abstract_tcp_server.h index c74444c8e..1efd5091c 100644 --- a/contrib/epee/include/net/abstract_tcp_server.h +++ b/contrib/epee/include/net/abstract_tcp_server.h @@ -38,6 +38,9 @@ #pragma comment(lib, "Ws2_32.lib") +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/abstract_tcp_server2.h b/contrib/epee/include/net/abstract_tcp_server2.h index f0a1ddd7c..506949dbd 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.h +++ b/contrib/epee/include/net/abstract_tcp_server2.h @@ -55,9 +55,11 @@ #include "net_utils_base.h" #include "syncobj.h" #include "../../../../src/p2p/connection_basic.hpp" -#include "../../../../contrib/otshell_utils/utils.hpp" #include "../../../../src/p2p/network_throttle-detail.hpp" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + #define ABSTRACT_SERVER_SEND_QUE_MAX_COUNT 1000 namespace epee diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl index 834b5a7a6..75a9c5be9 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.inl +++ b/contrib/epee/include/net/abstract_tcp_server2.inl @@ -51,9 +51,8 @@ #include "../../../../src/cryptonote_core/cryptonote_core.h" // e.g. for the send_stop_signal() -#include "../../../../contrib/otshell_utils/utils.hpp" -#include "../../../../src/p2p/data_logger.hpp" -using namespace nOT::nUtils; // TODO +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" #define CONNECTION_CLEANUP_TIME 30 // seconds @@ -83,7 +82,7 @@ PRAGMA_WARNING_DISABLE_VS(4355) m_throttle_speed_in("speed_in", "throttle_speed_in"), m_throttle_speed_out("speed_out", "throttle_speed_out") { - _info_c("net/sleepRPC", "test, connection constructor set m_connection_type="<<m_connection_type); + MINFO("test, connection constructor set m_connection_type="<<m_connection_type); } PRAGMA_WARNING_DISABLE_VS(4355) //--------------------------------------------------------------------------------- @@ -229,7 +228,7 @@ PRAGMA_WARNING_DISABLE_VS(4355) { TRY_ENTRY(); boost::shared_ptr<connection<t_protocol_handler> > back_connection_copy; - LOG_PRINT_L4("[sock " << socket_.native_handle() << "] release"); + LOG_TRACE_CC(context, "[sock " << socket_.native_handle() << "] release"); CRITICAL_REGION_BEGIN(m_self_refs_lock); CHECK_AND_ASSERT_MES(m_self_refs.size(), false, "[sock " << socket_.native_handle() << "] m_self_refs empty at connection<t_protocol_handler>::release() call"); //erasing from container without additional copy can cause start deleting object, including m_self_refs @@ -266,8 +265,7 @@ PRAGMA_WARNING_DISABLE_VS(4355) address = endpoint.address().to_string(); port = boost::lexical_cast<std::string>(endpoint.port()); } - _mark_c("net/kind" , - " connection type " << to_string( m_connection_type ) << " " + MINFO(" connection type " << to_string( m_connection_type ) << " " << socket_.local_endpoint().address().to_string() << ":" << socket_.local_endpoint().port() << " <--> " << address << ":" << port); } @@ -306,7 +304,6 @@ PRAGMA_WARNING_DISABLE_VS(4355) delay *= 0.5; if (delay > 0) { long int ms = (long int)(delay * 100); - epee::net_utils::data_logger::get_instance().add_data("sleep_down", ms); boost::this_thread::sleep_for(boost::chrono::milliseconds(ms)); } } while(delay > 0); @@ -397,14 +394,14 @@ PRAGMA_WARNING_DISABLE_VS(4355) const t_safe chunksize_max = chunksize_good * 2 ; const bool allow_split = (m_connection_type == e_connection_type_RPC) ? false : true; // do not split RPC data - ASRT(! (chunksize_max<0) ); // make sure it is unsigned before removin sign with cast: + CHECK_AND_ASSERT_MES(! (chunksize_max<0), false, "Negative chunksize_max" ); // make sure it is unsigned before removin sign with cast: long long unsigned int chunksize_max_unsigned = static_cast<long long unsigned int>( chunksize_max ) ; if (allow_split && (cb > chunksize_max_unsigned)) { { // LOCK: chunking epee::critical_region_t<decltype(m_chunking_lock)> send_guard(m_chunking_lock); // *** critical *** - _dbg3_c("net/out/size", "do_send() will SPLIT into small chunks, from packet="<<cb<<" B for ptr="<<ptr); + MDEBUG("do_send() will SPLIT into small chunks, from packet="<<cb<<" B for ptr="<<ptr); t_safe all = cb; // all bytes to send t_safe pos = 0; // current sending position // 01234567890 @@ -419,39 +416,39 @@ PRAGMA_WARNING_DISABLE_VS(4355) while (pos < all) { t_safe lenall = all-pos; // length from here to end t_safe len = std::min( chunksize_good , lenall); // take a smaller part - ASRT(len<=chunksize_good); + CHECK_AND_ASSERT_MES(len<=chunksize_good, false, "len too large"); // pos=8; len=4; all=10; len=3; - ASRT(! (len<0) ); // check before we cast away sign: + CHECK_AND_ASSERT_MES(! (len<0), false, "negative len"); // check before we cast away sign: unsigned long long int len_unsigned = static_cast<long long int>( len ); - ASRT(len>0); // (redundand) - ASRT(len_unsigned < std::numeric_limits<size_t>::max()); // yeap we want strong < then max size, to be sure + CHECK_AND_ASSERT_MES(len>0, false, "len not strictly positive"); // (redundant) + CHECK_AND_ASSERT_MES(len_unsigned < std::numeric_limits<size_t>::max(), false, "Invalid len_unsigned"); // yeap we want strong < then max size, to be sure void *chunk_start = ((char*)ptr) + pos; - _fact_c("net/out/size","chunk_start="<<chunk_start<<" ptr="<<ptr<<" pos="<<pos); - ASRT(chunk_start >= ptr); // not wrapped around address? + MDEBUG("chunk_start="<<chunk_start<<" ptr="<<ptr<<" pos="<<pos); + CHECK_AND_ASSERT_MES(chunk_start >= ptr, false, "Pointer wraparound"); // not wrapped around address? //std::memcpy( (void*)buf, chunk_start, len); - _dbg3_c("net/out/size", "part of " << lenall << ": pos="<<pos << " len="<<len); + MDEBUG("part of " << lenall << ": pos="<<pos << " len="<<len); bool ok = do_send_chunk(chunk_start, len); // <====== *** all_ok = all_ok && ok; if (!all_ok) { - _dbg1_c("net/out/size", "do_send() DONE ***FAILED*** from packet="<<cb<<" B for ptr="<<ptr); - _dbg1("do_send() SEND was aborted in middle of big package - this is mostly harmless " + MDEBUG("do_send() DONE ***FAILED*** from packet="<<cb<<" B for ptr="<<ptr); + MDEBUG("do_send() SEND was aborted in middle of big package - this is mostly harmless " << " (e.g. peer closed connection) but if it causes trouble tell us at #monero-dev. " << cb); return false; // partial failure in sending } - pos = pos+len; ASRT(pos >0); + pos = pos+len; + CHECK_AND_ASSERT_MES(pos >0, false, "pos <= 0"); // (in catch block, or uniq pointer) delete buf; } // each chunk - _dbg3_c("net/out/size", "do_send() DONE SPLIT from packet="<<cb<<" B for ptr="<<ptr); - _dbg3 ( "do_send() DONE SPLIT from packet="<<cb<<" B for ptr="<<ptr); + MDEBUG("do_send() DONE SPLIT from packet="<<cb<<" B for ptr="<<ptr); - _info_c("net/sleepRPC", "do_send() m_connection_type = " << m_connection_type); + MDEBUG("do_send() m_connection_type = " << m_connection_type); return all_ok; // done - e.g. queued - all the chunks of current do_send call } // LOCK: chunking @@ -505,15 +502,14 @@ PRAGMA_WARNING_DISABLE_VS(4355) }*/ long int ms = 250 + (rand()%50); - _info_c("net/sleep", "Sleeping because QUEUE is FULL, in " << __FUNCTION__ << " for " << ms << " ms before packet_size="<<cb); // XXX debug sleep + MDEBUG("Sleeping because QUEUE is FULL, in " << __FUNCTION__ << " for " << ms << " ms before packet_size="<<cb); // XXX debug sleep m_send_que_lock.unlock(); boost::this_thread::sleep(boost::posix_time::milliseconds( ms ) ); m_send_que_lock.lock(); _dbg1("sleep for queue: " << ms); if (retry > retry_limit) { - _erro("send que size is more than ABSTRACT_SERVER_SEND_QUE_MAX_COUNT(" << ABSTRACT_SERVER_SEND_QUE_MAX_COUNT << "), shutting down connection"); - // _dbg1_c("net/sleep", "send que size is more than ABSTRACT_SERVER_SEND_QUE_MAX_COUNT(" << ABSTRACT_SERVER_SEND_QUE_MAX_COUNT << "), shutting down connection"); + MWARNING("send que size is more than ABSTRACT_SERVER_SEND_QUE_MAX_COUNT(" << ABSTRACT_SERVER_SEND_QUE_MAX_COUNT << "), shutting down connection"); shutdown(); return false; } @@ -525,10 +521,10 @@ PRAGMA_WARNING_DISABLE_VS(4355) if(m_send_que.size() > 1) { // active operation should be in progress, nothing to do, just wait last operation callback auto size_now = cb; - _info_c("net/out/size", "do_send() NOW just queues: packet="<<size_now<<" B, is added to queue-size="<<m_send_que.size()); + MDEBUG("do_send() NOW just queues: packet="<<size_now<<" B, is added to queue-size="<<m_send_que.size()); //do_send_handler_delayed( ptr , size_now ); // (((H))) // empty function - LOG_PRINT_L4("[sock " << socket_.native_handle() << "] Async send requested " << m_send_que.front().size()); + LOG_TRACE_CC(context, "[sock " << socket_.native_handle() << "] Async send requested " << m_send_que.front().size()); } else { // no active operation @@ -540,11 +536,11 @@ PRAGMA_WARNING_DISABLE_VS(4355) } auto size_now = m_send_que.front().size(); - _dbg1_c("net/out/size", "do_send() NOW SENSD: packet="<<size_now<<" B"); + MDEBUG("do_send() NOW SENSD: packet="<<size_now<<" B"); if (speed_limit_is_enabled()) do_send_handler_write( ptr , size_now ); // (((H))) - ASRT( size_now == m_send_que.front().size() ); + CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), false, "Unexpected queue size"); boost::asio::async_write(socket_, boost::asio::buffer(m_send_que.front().data(), size_now ) , //strand_.wrap( boost::bind(&connection<t_protocol_handler>::handle_write, self, _1, _2) @@ -602,7 +598,7 @@ PRAGMA_WARNING_DISABLE_VS(4355) void connection<t_protocol_handler>::handle_write(const boost::system::error_code& e, size_t cb) { TRY_ENTRY(); - LOG_PRINT_L4("[sock " << socket_.native_handle() << "] Async send calledback " << cb); + LOG_TRACE_CC(context, "[sock " << socket_.native_handle() << "] Async send calledback " << cb); if (e) { @@ -635,10 +631,10 @@ PRAGMA_WARNING_DISABLE_VS(4355) { //have more data to send auto size_now = m_send_que.front().size(); - _dbg1_c("net/out/size", "handle_write() NOW SENDS: packet="<<size_now<<" B" <<", from queue size="<<m_send_que.size()); + MDEBUG("handle_write() NOW SENDS: packet="<<size_now<<" B" <<", from queue size="<<m_send_que.size()); if (speed_limit_is_enabled()) do_send_handler_write_from_queue(e, m_send_que.front().size() , m_send_que.size()); // (((H))) - ASRT( size_now == m_send_que.front().size() ); + CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), void(), "Unexpected queue size"); boost::asio::async_write(socket_, boost::asio::buffer(m_send_que.front().data(), size_now) , // strand_.wrap( boost::bind(&connection<t_protocol_handler>::handle_write, connection<t_protocol_handler>::shared_from_this(), _1, _2) @@ -660,8 +656,7 @@ PRAGMA_WARNING_DISABLE_VS(4355) void connection<t_protocol_handler>::setRpcStation() { m_connection_type = e_connection_type_RPC; - _fact_c("net/sleepRPC", "set m_connection_type = RPC "); - _info_c("net/kind", "set m_connection_type = RPC "); + MDEBUG("set m_connection_type = RPC "); } @@ -735,7 +730,7 @@ PRAGMA_WARNING_DISABLE_VS(4355) acceptor_.listen(); boost::asio::ip::tcp::endpoint binded_endpoint = acceptor_.local_endpoint(); m_port = binded_endpoint.port(); - _fact_c("net/RPClog", "start accept"); + MDEBUG("start accept"); new_connection_.reset(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type)); acceptor_.async_accept(new_connection_->socket(), boost::bind(&boosted_tcp_server<t_protocol_handler>::handle_accept, this, @@ -753,7 +748,7 @@ DISABLE_GCC_WARNING(maybe-uninitialized) uint32_t p = 0; if (port.size() && !string_tools::get_xtype_from_string(p, port)) { - LOG_ERROR("Failed to convert port no = " << port); + MERROR("Failed to convert port no = " << port); return false; } return this->init_server(p, address); @@ -767,7 +762,7 @@ POP_WARNINGS uint32_t local_thr_index = boost::interprocess::ipcdetail::atomic_inc32(&m_thread_index); std::string thread_name = std::string("[") + m_thread_name_prefix; thread_name += boost::to_string(local_thr_index) + "]"; - log_space::log_singletone::set_thread_log_prefix(thread_name); + MLOG_SET_THREAD_NAME(thread_name); // _fact("Thread name: " << m_thread_name_prefix); while(!m_stop_signal_sent) { @@ -796,8 +791,7 @@ POP_WARNINGS auto it = server_type_map.find(m_thread_name_prefix); if (it==server_type_map.end()) throw std::runtime_error("Unknown prefix/server type:" + std::string(prefix_name)); auto connection_type = it->second; // the value of type - _info_c("net/RPClog", "Set server type to: " << connection_type << " from name: " << m_thread_name_prefix); - _info_c("net/RPClog", "prefix_name = " << prefix_name); + MINFO("Set server type to: " << connection_type << " from name: " << m_thread_name_prefix << ", prefix_name = " << prefix_name); } //--------------------------------------------------------------------------------- template<class t_protocol_handler> @@ -812,7 +806,7 @@ POP_WARNINGS TRY_ENTRY(); m_threads_count = threads_count; m_main_thread_id = boost::this_thread::get_id(); - log_space::log_singletone::set_thread_log_prefix("[SRV_MAIN]"); + MLOG_SET_THREAD_NAME("[SRV_MAIN]"); add_idle_handler(boost::bind(&boosted_tcp_server::cleanup_connections, this), 5000); while(!m_stop_signal_sent) { @@ -933,13 +927,12 @@ POP_WARNINGS template<class t_protocol_handler> void boosted_tcp_server<t_protocol_handler>::handle_accept(const boost::system::error_code& e) { - _fact_c("net/RPClog", "handle_accept"); + MDEBUG("handle_accept"); TRY_ENTRY(); if (!e) { if (m_connection_type == e_connection_type_RPC) { - _note_c("net/rpc", "New server for RPC connections"); - _fact_c("net/RPClog", "New server for RPC connections"); + MDEBUG("New server for RPC connections"); new_connection_->setRpcStation(); // hopefully this is not needed actually } connection_ptr conn(std::move(new_connection_)); @@ -965,7 +958,7 @@ POP_WARNINGS connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) ); connections_mutex.lock(); connections_.push_back(std::make_pair(boost::get_system_time(), new_connection_l)); - LOG_PRINT_L2("connections_ size now " << connections_.size()); + MDEBUG("connections_ size now " << connections_.size()); connections_mutex.unlock(); boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket(); @@ -1069,7 +1062,7 @@ POP_WARNINGS connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) ); connections_mutex.lock(); connections_.push_back(std::make_pair(boost::get_system_time(), new_connection_l)); - LOG_PRINT_L2("connections_ size now " << connections_.size()); + MDEBUG("connections_ size now " << connections_.size()); connections_mutex.unlock(); boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket(); diff --git a/contrib/epee/include/net/abstract_tcp_server_cp.h b/contrib/epee/include/net/abstract_tcp_server_cp.h index b6410e120..f10f4203f 100644 --- a/contrib/epee/include/net/abstract_tcp_server_cp.h +++ b/contrib/epee/include/net/abstract_tcp_server_cp.h @@ -42,6 +42,9 @@ #include "net_utils_base.h" #include "pragma_comp_defs.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + #define LEVIN_DEFAULT_DATA_BUFF_SIZE 2000 namespace epee diff --git a/contrib/epee/include/net/abstract_tcp_server_cp.inl b/contrib/epee/include/net/abstract_tcp_server_cp.inl index a582c660a..ba201e3bf 100644 --- a/contrib/epee/include/net/abstract_tcp_server_cp.inl +++ b/contrib/epee/include/net/abstract_tcp_server_cp.inl @@ -27,6 +27,9 @@ #pragma comment(lib, "Ws2_32.lib") +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_auth.h b/contrib/epee/include/net/http_auth.h index bdbfa7524..f43a19457 100644 --- a/contrib/epee/include/net/http_auth.h +++ b/contrib/epee/include/net/http_auth.h @@ -36,6 +36,9 @@ #include "http_base.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_base.h b/contrib/epee/include/net/http_base.h index 4ff74fe27..d8e31521f 100644 --- a/contrib/epee/include/net/http_base.h +++ b/contrib/epee/include/net/http_base.h @@ -31,6 +31,10 @@ #include <boost/regex.hpp> #include "string_tools.h" + +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_client.h b/contrib/epee/include/net/http_client.h index 336153384..a54318ebb 100644 --- a/contrib/epee/include/net/http_client.h +++ b/contrib/epee/include/net/http_client.h @@ -52,6 +52,9 @@ //#pragma comment(lib, "shlwapi.lib") +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + extern epee::critical_section gregexp_lock; @@ -325,10 +328,10 @@ using namespace std; CRITICAL_REGION_LOCAL(m_lock); if(!is_connected()) { - LOG_PRINT("Reconnecting...", LOG_LEVEL_3); + MDEBUG("Reconnecting..."); if(!connect(m_host_buff, m_port, m_timeout)) { - LOG_PRINT("Failed to connect to " << m_host_buff << ":" << m_port, LOG_LEVEL_3); + MDEBUG("Failed to connect to " << m_host_buff << ":" << m_port); return false; } } @@ -376,7 +379,7 @@ using namespace std; { if(!m_net_client.recv(recv_buffer)) { - LOG_PRINT("Unexpected reciec fail", LOG_LEVEL_3); + MERROR("Unexpected recv fail"); m_state = reciev_machine_state_error; } if(!recv_buffer.size()) @@ -464,7 +467,7 @@ using namespace std; CRITICAL_REGION_LOCAL(m_lock); if(!recv_buff.size()) { - LOG_PRINT("Warning: Content-Len mode, but connection unexpectedly closed", LOG_LEVEL_3); + MERROR("Warning: Content-Len mode, but connection unexpectedly closed"); m_state = reciev_machine_state_done; return true; } @@ -578,7 +581,7 @@ using namespace std; CRITICAL_REGION_LOCAL(m_lock); if(!recv_buff.size()) { - LOG_PRINT("Warning: CHUNKED mode, but connection unexpectedly closed", LOG_LEVEL_3); + MERROR("Warning: CHUNKED mode, but connection unexpectedly closed"); m_state = reciev_machine_state_done; return true; } @@ -665,7 +668,7 @@ using namespace std; inline bool parse_header(http_header_info& body_info, const std::string& m_cache_to_process) { - LOG_FRAME("http_stream_filter::parse_cached_header(*)", LOG_LEVEL_4); + MTRACE("http_stream_filter::parse_cached_header(*)"); STATIC_REGEXP_EXPR_1(rexp_mach_field, "\n?((Connection)|(Referer)|(Content-Length)|(Content-Type)|(Transfer-Encoding)|(Content-Encoding)|(Host)|(Cookie)|(User-Agent)" @@ -833,7 +836,7 @@ using namespace std; }else { //Apparently there are no signs of the form of transfer, will receive data until the connection is closed m_state = reciev_machine_state_error; - LOG_PRINT("Undefinded transfer type, consider http_body_transfer_connection_close method. header: " << m_header_cache, LOG_LEVEL_2); + MERROR("Undefinded transfer type, consider http_body_transfer_connection_close method. header: " << m_header_cache); return false; } return false; diff --git a/contrib/epee/include/net/http_client_abstract_invoke.h b/contrib/epee/include/net/http_client_abstract_invoke.h index 425a355ee..9b6ab4db8 100644 --- a/contrib/epee/include/net/http_client_abstract_invoke.h +++ b/contrib/epee/include/net/http_client_abstract_invoke.h @@ -28,6 +28,9 @@ #pragma once #include "storages/serializeble_struct_helper.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_client_base.h b/contrib/epee/include/net/http_client_base.h index 450d44823..f5fb57d03 100644 --- a/contrib/epee/include/net/http_client_base.h +++ b/contrib/epee/include/net/http_client_base.h @@ -26,6 +26,9 @@ #pragma once +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_client_via_api_helper.h b/contrib/epee/include/net/http_client_via_api_helper.h index 391c44964..3242e4162 100644 --- a/contrib/epee/include/net/http_client_via_api_helper.h +++ b/contrib/epee/include/net/http_client_via_api_helper.h @@ -32,6 +32,9 @@ #include <atlutil.h> #pragma comment(lib, "Wininet.lib") +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_protocol_handler.h b/contrib/epee/include/net/http_protocol_handler.h index 69ea04fbe..c2e44c536 100644 --- a/contrib/epee/include/net/http_protocol_handler.h +++ b/contrib/epee/include/net/http_protocol_handler.h @@ -37,6 +37,9 @@ #include "http_auth.h" #include "http_base.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_protocol_handler.inl b/contrib/epee/include/net/http_protocol_handler.inl index 6beff0109..5bfaf4767 100644 --- a/contrib/epee/include/net/http_protocol_handler.inl +++ b/contrib/epee/include/net/http_protocol_handler.inl @@ -33,6 +33,9 @@ #include "file_io_utils.h" #include "net_parse_helpers.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + #define HTTP_MAX_URI_LEN 9000 #define HTTP_MAX_HEADER_LEN 100000 @@ -133,7 +136,7 @@ namespace net_utils std::string boundary; if(!match_boundary(content_type, boundary)) { - LOG_PRINT("Failed to match boundary in content type: " << content_type, LOG_LEVEL_0); + MERROR("Failed to match boundary in content type: " << content_type); return false; } @@ -155,7 +158,7 @@ namespace net_utils pos = body.find(boundary, std::distance(body.begin(), it_begin)); if(std::string::npos == pos) { - LOG_PRINT("Error: Filed to match closing multipart tag", LOG_LEVEL_0); + MERROR("Error: Filed to match closing multipart tag"); it_end = body.end(); }else { @@ -177,7 +180,7 @@ namespace net_utils out_values.push_back(multipart_entry()); if(!handle_part_of_multipart(it_begin, it_end, out_values.back())) { - LOG_PRINT("Failed to handle_part_of_multipart", LOG_LEVEL_0); + MERROR("Failed to handle_part_of_multipart"); return false; } @@ -331,8 +334,6 @@ namespace net_utils template<class t_connection_context> bool simple_http_connection_handler<t_connection_context>::handle_invoke_query_line() { - LOG_FRAME("simple_http_connection_handler<t_connection_context>::handle_recognize_protocol_out(*)", LOG_LEVEL_3); - STATIC_REGEXP_EXPR_1(rexp_match_command_line, "^(((OPTIONS)|(GET)|(HEAD)|(POST)|(PUT)|(DELETE)|(TRACE)) (\\S+) HTTP/(\\d+).(\\d+))\r?\n", boost::regex::icase | boost::regex::normal); // 123 4 5 6 7 8 9 10 11 12 //size_t match_len = 0; @@ -379,8 +380,6 @@ namespace net_utils { //LOG_PRINT_L4("HTTP HEAD:\r\n" << m_cache.substr(0, pos)); - LOG_FRAME("simple_http_connection_handler<t_connection_context>::analize_cached_request_header_and_invoke_state(*)", LOG_LEVEL_3); - m_query_info.m_full_request_buf_size = pos; m_query_info.m_request_head.assign(m_cache.begin(), m_cache.begin()+pos); @@ -479,8 +478,6 @@ namespace net_utils template<class t_connection_context> bool simple_http_connection_handler<t_connection_context>::parse_cached_header(http_header_info& body_info, const std::string& m_cache_to_process, size_t pos) { - LOG_FRAME("http_stream_filter::parse_cached_header(*)", LOG_LEVEL_3); - STATIC_REGEXP_EXPR_1(rexp_mach_field, "\n?((Connection)|(Referer)|(Content-Length)|(Content-Type)|(Transfer-Encoding)|(Content-Encoding)|(Host)|(Cookie)|(User-Agent)" // 12 3 4 5 6 7 8 9 10 @@ -576,7 +573,7 @@ namespace net_utils m_config.m_lock.unlock(); if(!file_io_utils::load_file_to_string(destination_file_path.c_str(), response.m_body)) { - LOG_PRINT("URI \""<< query_info.m_full_request_str.substr(0, query_info.m_full_request_str.size()-2) << "\" [" << destination_file_path << "] Not Found (404 )" , LOG_LEVEL_1); + MWARNING("URI \""<< query_info.m_full_request_str.substr(0, query_info.m_full_request_str.size()-2) << "\" [" << destination_file_path << "] Not Found (404 )"); response.m_body = get_not_found_response_body(query_info.m_URI); response.m_response_code = 404; response.m_response_comment = "Not found"; @@ -584,7 +581,7 @@ namespace net_utils return true; } - LOG_PRINT(" -->> " << query_info.m_full_request_str << "\r\n<<--OK" , LOG_LEVEL_3); + MDEBUG(" -->> " << query_info.m_full_request_str << "\r\n<<--OK"); response.m_response_code = 200; response.m_response_comment = "OK"; response.m_mime_tipe = get_file_mime_tipe(uri_to_path); diff --git a/contrib/epee/include/net/http_server_cp.h b/contrib/epee/include/net/http_server_cp.h index bbb167f9f..1ac2223c7 100644 --- a/contrib/epee/include/net/http_server_cp.h +++ b/contrib/epee/include/net/http_server_cp.h @@ -32,6 +32,10 @@ #include "abstract_tcp_server_cp.h" #include "http_server.h" + +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_server_cp2.h b/contrib/epee/include/net/http_server_cp2.h index 1a503a4de..8dfd43a16 100644 --- a/contrib/epee/include/net/http_server_cp2.h +++ b/contrib/epee/include/net/http_server_cp2.h @@ -32,6 +32,10 @@ #include "abstract_tcp_server2.h" #include "http_protocol_handler.h" + +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { namespace net_utils diff --git a/contrib/epee/include/net/http_server_handlers_map2.h b/contrib/epee/include/net/http_server_handlers_map2.h index 3a7d5333b..8e39b4104 100644 --- a/contrib/epee/include/net/http_server_handlers_map2.h +++ b/contrib/epee/include/net/http_server_handlers_map2.h @@ -31,6 +31,9 @@ #include "storages/portable_storage.h" #include "storages/portable_storage_template_helper.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + #define CHAIN_HTTP_TO_MAP2(context_type) bool handle_http_request(const epee::net_utils::http::http_request_info& query_info, \ epee::net_utils::http::http_response_info& response, \ @@ -77,7 +80,7 @@ uint64_t ticks3 = epee::misc_utils::get_tick_count(); \ response_info.m_mime_tipe = "application/json"; \ response_info.m_header_info.m_content_type = " application/json"; \ - LOG_PRINT( s_pattern << " processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms", LOG_LEVEL_2); \ + MDEBUG( s_pattern << " processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms"); \ } #define MAP_URI_AUTO_JON2(s_pattern, callback_f, command_type) MAP_URI_AUTO_JON2_IF(s_pattern, callback_f, command_type, true) @@ -104,7 +107,7 @@ uint64_t ticks3 = epee::misc_utils::get_tick_count(); \ response_info.m_mime_tipe = " application/octet-stream"; \ response_info.m_header_info.m_content_type = " application/octet-stream"; \ - LOG_PRINT( s_pattern << "() processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms", LOG_LEVEL_2); \ + MDEBUG( s_pattern << "() processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms"); \ } #define CHAIN_URI_MAP2(callback) else {callback(query_info, response_info, m_conn_context);handled = true;} @@ -166,7 +169,7 @@ uint64_t ticks3 = epee::misc_utils::get_tick_count(); \ response_info.m_mime_tipe = "application/json"; \ response_info.m_header_info.m_content_type = " application/json"; \ - LOG_PRINT( query_info.m_URI << "[" << method_name << "] processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms", LOG_LEVEL_2); + MDEBUG( query_info.m_URI << "[" << method_name << "] processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms"); #define MAP_JON_RPC_WE_IF(method_name, callback_f, command_type, cond) \ else if((callback_name == method_name) && (cond)) \ diff --git a/contrib/epee/include/net/http_server_impl_base.h b/contrib/epee/include/net/http_server_impl_base.h index a5cc1a917..f2a580167 100644 --- a/contrib/epee/include/net/http_server_impl_base.h +++ b/contrib/epee/include/net/http_server_impl_base.h @@ -36,6 +36,9 @@ #include "net/http_server_cp2.h" #include "net/http_server_handlers_map2.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net.http" + namespace epee { @@ -79,15 +82,14 @@ namespace epee bool run(size_t threads_count, bool wait = true) { //go to loop - LOG_PRINT("Run net_service loop( " << threads_count << " threads)...", LOG_LEVEL_0); - _fact_c("net/RPClog", "Run net_service loop( " << threads_count << " threads)..."); + MINFO("Run net_service loop( " << threads_count << " threads)..."); if(!m_net_server.run_server(threads_count, wait)) { LOG_ERROR("Failed to run net tcp server!"); } if(wait) - LOG_PRINT("net_service loop stopped.", LOG_LEVEL_0); + MINFO("net_service loop stopped."); return true; } diff --git a/contrib/epee/include/net/levin_client.inl b/contrib/epee/include/net/levin_client.inl index a802d55fa..50a01aaa5 100644 --- a/contrib/epee/include/net/levin_client.inl +++ b/contrib/epee/include/net/levin_client.inl @@ -30,6 +30,10 @@ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ #include "string_tools.h" + +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { namespace levin diff --git a/contrib/epee/include/net/levin_client_async.h b/contrib/epee/include/net/levin_client_async.h index be5847c74..2cbdb4587 100644 --- a/contrib/epee/include/net/levin_client_async.h +++ b/contrib/epee/include/net/levin_client_async.h @@ -31,6 +31,9 @@ #include "net_helper.h" #include "levin_base.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { diff --git a/contrib/epee/include/net/levin_helper.h b/contrib/epee/include/net/levin_helper.h index 53b19c9fa..c51d7244b 100644 --- a/contrib/epee/include/net/levin_helper.h +++ b/contrib/epee/include/net/levin_helper.h @@ -31,6 +31,9 @@ #include "levin_base.h" #include "serializeble_struct_helper.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { namespace levin diff --git a/contrib/epee/include/net/levin_protocol_handler.h b/contrib/epee/include/net/levin_protocol_handler.h index 512ba1c3c..3e1b8493a 100644 --- a/contrib/epee/include/net/levin_protocol_handler.h +++ b/contrib/epee/include/net/levin_protocol_handler.h @@ -32,6 +32,9 @@ #include <boost/uuid/uuid_generators.hpp> #include "levin_base.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { namespace levin @@ -85,7 +88,7 @@ namespace levin { if(!m_config.m_pcommands_handler) { - LOG_ERROR("Command handler not set!"); + LOG_ERROR_CC(m_conn_context, "Command handler not set!"); return false; } m_cach_in_buffer.append((const char*)ptr, cb); @@ -100,7 +103,7 @@ namespace levin { if(m_cach_in_buffer.size() >= sizeof(uint64_t) && *((uint64_t*)m_cach_in_buffer.data()) != LEVIN_SIGNATURE) { - LOG_ERROR("Signature missmatch on accepted connection"); + LOG_ERROR_CC(m_conn_context, "Signature missmatch on accepted connection"); return false; } is_continue = false; @@ -110,7 +113,7 @@ namespace levin bucket_head* phead = (bucket_head*)m_cach_in_buffer.data(); if(LEVIN_SIGNATURE != phead->m_signature) { - LOG_ERROR("Signature missmatch on accepted connection"); + LOG_ERROR_CC(m_conn_context, "Signature missmatch on accepted connection"); return false; } m_current_head = *phead; @@ -154,7 +157,7 @@ namespace levin m_state = conn_state_reading_head; break; default: - LOG_ERROR("Undefined state in levin_server_impl::connection_handler, m_state=" << m_state); + LOG_ERROR_CC(m_conn_context, "Undefined state in levin_server_impl::connection_handler, m_state=" << m_state); return false; } } diff --git a/contrib/epee/include/net/levin_protocol_handler_async.h b/contrib/epee/include/net/levin_protocol_handler_async.h index 67daceaf5..cc6987e8f 100644 --- a/contrib/epee/include/net/levin_protocol_handler_async.h +++ b/contrib/epee/include/net/levin_protocol_handler_async.h @@ -38,6 +38,8 @@ #include <random> #include <chrono> +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" namespace epee { @@ -151,7 +153,7 @@ public: { if(ec == boost::asio::error::operation_aborted) return; - LOG_PRINT_CC(con.get_context_ref(), "Timeout on invoke operation happened, command: " << command, LOG_LEVEL_2); + MINFO(con.get_context_ref() << "Timeout on invoke operation happened, command: " << command); std::string fake; cb(LEVIN_ERROR_CONNECTION_TIMEDOUT, fake, con.get_context_ref()); con.close(); @@ -244,15 +246,15 @@ public: } CHECK_AND_ASSERT_MES_NO_RET(0 == boost::interprocess::ipcdetail::atomic_read32(&m_wait_count), "Failed to wait for operation completion. m_wait_count = " << m_wait_count); - LOG_PRINT_CC(m_connection_context, "~async_protocol_handler()", LOG_LEVEL_4); + MTRACE(m_connection_context << "~async_protocol_handler()"); } bool start_outer_call() { - LOG_PRINT_CC_L4(m_connection_context, "[levin_protocol] -->> start_outer_call"); + MTRACE(m_connection_context << "[levin_protocol] -->> start_outer_call"); if(!m_pservice_endpoint->add_ref()) { - LOG_PRINT_CC_RED(m_connection_context, "[levin_protocol] -->> start_outer_call failed", LOG_LEVEL_4); + MERROR(m_connection_context << "[levin_protocol] -->> start_outer_call failed"); return false; } boost::interprocess::ipcdetail::atomic_inc32(&m_wait_count); @@ -260,7 +262,7 @@ public: } bool finish_outer_call() { - LOG_PRINT_CC_L4(m_connection_context, "[levin_protocol] <<-- finish_outer_call"); + MTRACE(m_connection_context << "[levin_protocol] <<-- finish_outer_call"); boost::interprocess::ipcdetail::atomic_dec32(&m_wait_count); m_pservice_endpoint->release(); return true; @@ -316,13 +318,13 @@ public: if(!m_config.m_pcommands_handler) { - LOG_ERROR_CC(m_connection_context, "Commands handler not set!"); + MERROR(m_connection_context << "Commands handler not set!"); return false; } if(m_cache_in_buffer.size() + cb > m_config.m_max_packet_size) { - LOG_ERROR_CC(m_connection_context, "Maximum packet size exceed!, m_max_packet_size = " << m_config.m_max_packet_size + MWARNING(m_connection_context << "Maximum packet size exceed!, m_max_packet_size = " << m_config.m_max_packet_size << ", packet received " << m_cache_in_buffer.size() + cb << ", connection will be closed."); return false; @@ -353,7 +355,7 @@ public: bool is_response = (m_oponent_protocol_ver == LEVIN_PROTOCOL_VER_1 && m_current_head.m_flags&LEVIN_PACKET_RESPONSE); - LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_RECIEVED. [len=" << m_current_head.m_cb + MDEBUG(m_connection_context << "LEVIN_PACKET_RECIEVED. [len=" << m_current_head.m_cb << ", flags" << m_current_head.m_flags << ", r?=" << m_current_head.m_have_to_return_data <<", cmd = " << m_current_head.m_command @@ -381,7 +383,7 @@ public: //use sync call scenario if(!boost::interprocess::ipcdetail::atomic_read32(&m_wait_count) && !boost::interprocess::ipcdetail::atomic_read32(&m_close_called)) { - LOG_ERROR_CC(m_connection_context, "no active invoke when response came, wtf?"); + MERROR(m_connection_context << "no active invoke when response came, wtf?"); return false; }else { @@ -413,7 +415,7 @@ public: if(!m_pservice_endpoint->do_send(send_buff.data(), send_buff.size())) return false; CRITICAL_REGION_END(); - LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_SENT. [len=" << m_current_head.m_cb + MDEBUG(m_connection_context << "LEVIN_PACKET_SENT. [len=" << m_current_head.m_cb << ", flags" << m_current_head.m_flags << ", r?=" << m_current_head.m_have_to_return_data <<", cmd = " << m_current_head.m_command @@ -431,7 +433,7 @@ public: { if(m_cache_in_buffer.size() >= sizeof(uint64_t) && *((uint64_t*)m_cache_in_buffer.data()) != LEVIN_SIGNATURE) { - LOG_ERROR_CC(m_connection_context, "Signature mismatch, connection will be closed"); + MWARNING(m_connection_context << "Signature mismatch, connection will be closed"); return false; } is_continue = false; @@ -585,7 +587,7 @@ public: } CRITICAL_REGION_END(); - LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_SENT. [len=" << head.m_cb + MDEBUG(m_connection_context << "LEVIN_PACKET_SENT. [len=" << head.m_cb << ", f=" << head.m_flags << ", r?=" << head.m_have_to_return_data << ", cmd = " << head.m_command @@ -597,7 +599,7 @@ public: { if(misc_utils::get_tick_count() - ticks_start > m_config.m_invoke_timeout) { - LOG_PRINT_CC_L2(m_connection_context, "invoke timeout (" << m_config.m_invoke_timeout << "), closing connection "); + MWARNING(m_connection_context << "invoke timeout (" << m_config.m_invoke_timeout << "), closing connection "); close(); return LEVIN_ERROR_CONNECTION_TIMEDOUT; } @@ -650,7 +652,7 @@ public: return -1; } CRITICAL_REGION_END(); - LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_SENT. [len=" << head.m_cb << + LOG_DEBUG_CC(m_connection_context, "LEVIN_PACKET_SENT. [len=" << head.m_cb << ", f=" << head.m_flags << ", r?=" << head.m_have_to_return_data << ", cmd = " << head.m_command << diff --git a/contrib/epee/include/net/net_helper.h b/contrib/epee/include/net/net_helper.h index a0ade10a3..22cea122f 100644 --- a/contrib/epee/include/net/net_helper.h +++ b/contrib/epee/include/net/net_helper.h @@ -46,6 +46,9 @@ //#include "profile_tools.h" #include "../string_tools.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + #ifndef MAKE_IP #define MAKE_IP( a1, a2, a3, a4 ) (a1|(a2<<8)|(a3<<16)|(a4<<24)) #endif @@ -180,19 +183,19 @@ namespace net_utils return true; }else { - LOG_PRINT("Some problems at connect, message: " << ec.message(), LOG_LEVEL_3); + MWARNING("Some problems at connect, message: " << ec.message()); return false; } } catch(const boost::system::system_error& er) { - LOG_PRINT("Some problems at connect, message: " << er.what(), LOG_LEVEL_4); + MDEBUG("Some problems at connect, message: " << er.what()); return false; } catch(...) { - LOG_PRINT("Some fatal problems.", LOG_LEVEL_4); + MDEBUG("Some fatal problems."); return false; } @@ -387,20 +390,20 @@ namespace net_utils if (ec) { - LOG_PRINT_L4("READ ENDS: Connection err_code " << ec.value()); + MTRACE("READ ENDS: Connection err_code " << ec.value()); if(ec == boost::asio::error::eof) { - LOG_PRINT_L4("Connection err_code eof."); + MTRACE("Connection err_code eof."); //connection closed there, empty return true; } - LOG_PRINT_L3("Problems at read: " << ec.message()); + MDEBUG("Problems at read: " << ec.message()); m_connected = false; return false; }else { - LOG_PRINT_L4("READ ENDS: Success. bytes_tr: " << bytes_transfered); + MTRACE("READ ENDS: Success. bytes_tr: " << bytes_transfered); m_deadline.expires_at(boost::posix_time::pos_infin); } diff --git a/contrib/epee/include/net/net_parse_helpers.h b/contrib/epee/include/net/net_parse_helpers.h index ce6ca60dc..08d2a2000 100644 --- a/contrib/epee/include/net/net_parse_helpers.h +++ b/contrib/epee/include/net/net_parse_helpers.h @@ -31,6 +31,8 @@ #include "http_base.h" #include "reg_exp_definer.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" namespace epee { diff --git a/contrib/epee/include/net/net_utils_base.h b/contrib/epee/include/net/net_utils_base.h index 78e555fac..cfa51e10d 100644 --- a/contrib/epee/include/net/net_utils_base.h +++ b/contrib/epee/include/net/net_utils_base.h @@ -31,6 +31,10 @@ #include <boost/uuid/uuid.hpp> #include "string_tools.h" +#include "misc_log_ex.h" + +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" #ifndef MAKE_IP #define MAKE_IP( a1, a2, a3, a4 ) (a1|(a2<<8)|(a3<<16)|(a4<<24)) @@ -142,20 +146,24 @@ namespace net_utils return ss.str(); } -#define LOG_PRINT_CC(ct, message, log_level) LOG_PRINT("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_PRINT_CC_GREEN(ct, message, log_level) LOG_PRINT_GREEN("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_PRINT_CC_RED(ct, message, log_level) LOG_PRINT_RED("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_PRINT_CC_BLUE(ct, message, log_level) LOG_PRINT_BLUE("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_PRINT_CC_YELLOW(ct, message, log_level) LOG_PRINT_YELLOW("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_PRINT_CC_CYAN(ct, message, log_level) LOG_PRINT_CYAN("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_PRINT_CC_MAGENTA(ct, message, log_level) LOG_PRINT_MAGENTA("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) -#define LOG_ERROR_CC(ct, message) LOG_PRINT_RED("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, LOG_LEVEL_2) - -#define LOG_PRINT_CC_L0(ct, message) LOG_PRINT_L0("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) -#define LOG_PRINT_CC_L1(ct, message) LOG_PRINT_L1("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) -#define LOG_PRINT_CC_L2(ct, message) LOG_PRINT_L2("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) -#define LOG_PRINT_CC_L3(ct, message) LOG_PRINT_L3("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) -#define LOG_PRINT_CC_L4(ct, message) LOG_PRINT_L4("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) +inline MAKE_LOGGABLE(connection_context_base, ct, os) +{ + os << "[" << epee::net_utils::print_connection_context_short(ct) << "] "; + return os; +} + +#define LOG_ERROR_CC(ct, message) MERROR(ct << message) +#define LOG_WARNING_CC(ct, message) MWARNING(ct << message) +#define LOG_INFO_CC(ct, message) MINFO(ct << message) +#define LOG_DEBUG_CC(ct, message) MDEBUG(ct << message) +#define LOG_TRACE_CC(ct, message) MTRACE(ct << message) +#define LOG_CC(level, ct, message) MLOG(level, ct << message) + +#define LOG_PRINT_CC_L0(ct, message) LOG_PRINT_L0(epee::net_utils::print_connection_context_short(ct) << message) +#define LOG_PRINT_CC_L1(ct, message) LOG_PRINT_L1(epee::net_utils::print_connection_context_short(ct) << message) +#define LOG_PRINT_CC_L2(ct, message) LOG_PRINT_L2(epee::net_utils::print_connection_context_short(ct) << message) +#define LOG_PRINT_CC_L3(ct, message) LOG_PRINT_L3(epee::net_utils::print_connection_context_short(ct) << message) +#define LOG_PRINT_CC_L4(ct, message) LOG_PRINT_L4(epee::net_utils::print_connection_context_short(ct) << message) #define LOG_PRINT_CCONTEXT_L0(message) LOG_PRINT_CC_L0(context, message) #define LOG_PRINT_CCONTEXT_L1(message) LOG_PRINT_CC_L1(context, message) @@ -163,13 +171,6 @@ namespace net_utils #define LOG_PRINT_CCONTEXT_L3(message) LOG_PRINT_CC_L3(context, message) #define LOG_ERROR_CCONTEXT(message) LOG_ERROR_CC(context, message) -#define LOG_PRINT_CCONTEXT_GREEN(message, log_level) LOG_PRINT_CC_GREEN(context, message, log_level) -#define LOG_PRINT_CCONTEXT_RED(message, log_level) LOG_PRINT_CC_RED(context, message, log_level) -#define LOG_PRINT_CCONTEXT_BLUE(message, log_level) LOG_PRINT_CC_BLUE(context, message, log_level) -#define LOG_PRINT_CCONTEXT_YELLOW(message, log_level) LOG_PRINT_CC_YELLOW(context, message, log_level) -#define LOG_PRINT_CCONTEXT_CYAN(message, log_level) LOG_PRINT_CC_CYAN(context, message, log_level) -#define LOG_PRINT_CCONTEXT_MAGENTA(message, log_level) LOG_PRINT_CC_MAGENTA(context, message, log_level) - #define CHECK_AND_ASSERT_MES_CC(condition, return_val, err_message) CHECK_AND_ASSERT_MES(condition, return_val, "[" << epee::net_utils::print_connection_context_short(context) << "]" << err_message) } diff --git a/contrib/epee/include/profile_tools.h b/contrib/epee/include/profile_tools.h index 0e1646f60..d3b1e4db4 100644 --- a/contrib/epee/include/profile_tools.h +++ b/contrib/epee/include/profile_tools.h @@ -52,8 +52,8 @@ namespace epee #endif #define START_WAY_POINTS() uint64_t _____way_point_time = epee::misc_utils::get_tick_count(); -#define WAY_POINT(name) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; LOG_PRINT("Way point " << name << ": " << delta, LOG_LEVEL_2);_____way_point_time = misc_utils::get_tick_count();} -#define WAY_POINT2(name, avrg_obj) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; avrg_obj.push(delta); LOG_PRINT("Way point " << name << ": " << delta, LOG_LEVEL_2);_____way_point_time = misc_utils::get_tick_count();} +#define WAY_POINT(name) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; MDEBUG("Way point " << name << ": " << delta);_____way_point_time = misc_utils::get_tick_count();} +#define WAY_POINT2(name, avrg_obj) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; avrg_obj.push(delta); MDEBUG("Way point " << name << ": " << delta);_____way_point_time = misc_utils::get_tick_count();} #define TIME_MEASURE_START(var_name) uint64_t var_name = epee::misc_utils::get_tick_count(); @@ -67,7 +67,7 @@ namespace profile_tools {} ~local_call_account() { - LOG_PRINT2("profile_details.log", "PROFILE "<<m_pname<<":av_time:\t" << (m_count_of_call ? (m_summary_time_used/m_count_of_call):0) <<" sum_time:\t"<<m_summary_time_used<<" call_count:\t" << m_count_of_call, LOG_LEVEL_0); + MINFO("PROFILE "<<m_pname<<":av_time:\t" << (m_count_of_call ? (m_summary_time_used/m_count_of_call):0) <<" sum_time:\t"<<m_summary_time_used<<" call_count:\t" << m_count_of_call); } size_t m_count_of_call; diff --git a/contrib/epee/include/storages/levin_abstract_invoke2.h b/contrib/epee/include/storages/levin_abstract_invoke2.h index 8c4fb9ccd..14e7d402a 100644 --- a/contrib/epee/include/storages/levin_abstract_invoke2.h +++ b/contrib/epee/include/storages/levin_abstract_invoke2.h @@ -30,6 +30,9 @@ #include <boost/utility/value_init.hpp> #include "net/levin_base.h" +#undef MONERO_DEFAULT_LOG_CATEGORY +#define MONERO_DEFAULT_LOG_CATEGORY "net" + namespace epee { namespace net_utils @@ -48,7 +51,7 @@ namespace epee int res = transport.invoke(command, buff_to_send, buff_to_recv); if( res <=0 ) { - LOG_PRINT_RED("Failed to invoke command " << command << " return code " << res, LOG_LEVEL_1); + MERROR("Failed to invoke command " << command << " return code " << res); return false; } serialization::portable_storage stg_ret; @@ -154,7 +157,7 @@ namespace epee int res = transport.notify(command, buff_to_send, conn_id); if(res <=0 ) { - LOG_PRINT_RED_L0("Failed to notify command " << command << " return code " << res); + MERROR("Failed to notify command " << command << " return code " << res); return false; } return true; diff --git a/contrib/epee/include/storages/portable_storage_from_json.h b/contrib/epee/include/storages/portable_storage_from_json.h index 41f270627..04b57376c 100644 --- a/contrib/epee/include/storages/portable_storage_from_json.h +++ b/contrib/epee/include/storages/portable_storage_from_json.h @@ -365,12 +365,12 @@ namespace epee } catch(const std::exception& ex) { - LOG_PRINT_RED_L0("Failed to parse json, what: " << ex.what()); + MERROR("Failed to parse json, what: " << ex.what()); return false; } catch(...) { - LOG_PRINT_RED_L0("Failed to parse json"); + MERROR("Failed to parse json"); return false; } } diff --git a/contrib/epee/src/CMakeLists.txt b/contrib/epee/src/CMakeLists.txt index 8426cd45d..8bc512893 100644 --- a/contrib/epee/src/CMakeLists.txt +++ b/contrib/epee/src/CMakeLists.txt @@ -26,4 +26,4 @@ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -add_library(epee STATIC http_auth.cpp) +add_library(epee STATIC http_auth.cpp mlog.cpp) diff --git a/contrib/epee/src/mlog.cpp b/contrib/epee/src/mlog.cpp new file mode 100644 index 000000000..37a15bbd5 --- /dev/null +++ b/contrib/epee/src/mlog.cpp @@ -0,0 +1,319 @@ +// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the Andrey N. Sabelnikov nor the +// names of its contributors may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + + +#ifndef _MLOG_H_ +#define _MLOG_H_ + +#include <atomic> +#include "misc_log_ex.h" + +INITIALIZE_EASYLOGGINGPP + +//#define MLOG_BASE_FORMAT "%datetime{%Y-%M-%d %H:%m:%s.%g}\t%thread\t%level\t%logger\t%fbase:%line\t%msg" +#define MLOG_BASE_FORMAT "%datetime{%Y-%M-%d %H:%m:%s.%g}\t%thread\t%level\t%logger\t%loc\t%msg" + +using namespace epee; + +static std::string generate_log_filename(const char *base) +{ + std::string filename(base); + char tmp[200]; + struct tm tm; + time_t now = time(NULL); + if (!gmtime_r(&now, &tm)) + strcpy(tmp, "unknown"); + else + strftime(tmp, sizeof(tmp), "%Y-%m-%d-%H-%M-%S", &tm); + filename += "-"; + filename += tmp; + return filename; +} + +std::string mlog_get_default_log_path(const char *default_filename) +{ + std::string process_name = epee::string_tools::get_current_module_name(); + std::string default_log_folder = epee::string_tools::get_current_module_folder(); + std::string default_log_file = process_name; + std::string::size_type a = default_log_file.rfind('.'); + if ( a != std::string::npos ) + default_log_file.erase( a, default_log_file.size()); + if ( ! default_log_file.empty() ) + default_log_file += ".log"; + else + default_log_file = default_filename; + + return (boost::filesystem::path(default_log_folder) / boost::filesystem::path(default_log_file)).string(); +} + +static void mlog_set_common_prefix() +{ + static const char * const expected_filename = "contrib/epee/src/mlog.cpp"; + const char *path = __FILE__, *expected_ptr = strstr(path, expected_filename); + if (!expected_ptr) + return; + el::Loggers::setFilenameCommonPrefix(std::string(path, expected_ptr - path)); +} + +void mlog_configure(const std::string &filename_base, bool console) +{ + el::Configurations c; + c.setGlobally(el::ConfigurationType::Filename, filename_base); + c.setGlobally(el::ConfigurationType::ToFile, "true"); + c.setGlobally(el::ConfigurationType::Format, MLOG_BASE_FORMAT); + c.setGlobally(el::ConfigurationType::ToStandardOutput, console ? "true" : "false"); + c.setGlobally(el::ConfigurationType::MaxLogFileSize, "104850000"); // 100 MB - 7600 bytes + el::Loggers::setDefaultConfigurations(c, true); + + el::Loggers::addFlag(el::LoggingFlag::HierarchicalLogging); + el::Loggers::addFlag(el::LoggingFlag::CreateLoggerAutomatically); + el::Loggers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog); + el::Loggers::addFlag(el::LoggingFlag::ColoredTerminalOutput); + el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck); + el::Helpers::installPreRollOutCallback([&filename_base](const char *name, size_t){ + std::string rname = generate_log_filename(filename_base.c_str()); + rename(name, rname.c_str()); + }); + mlog_set_common_prefix(); + const char *monero_log = getenv("MONERO_LOGS"); + if (!monero_log) + { + monero_log = "*:WARNING,net*:FATAL,global:INFO,verify:FATAL"; + } + mlog_set_categories(monero_log); +} + +void mlog_set_categories(const char *categories) +{ + el::Loggers::setCategories(categories); + MINFO("Mew log categories: " << categories); +} + +// maps epee style log level to new logging system +void mlog_set_log_level(int level) +{ + const char *settings = NULL; + switch (level) + { + case 0: + settings = "*:FATAL,net*:FATAL,global:INFO,verify:FATAL"; + break; + case 1: + settings = "*:WARNING,global:INFO"; + break; + case 2: + settings = "*:INFO"; + break; + case 3: + settings = "*:DEBUG"; + break; + case 4: + settings = "*:TRACE"; + break; + default: + return; + } + + el::Loggers::setCategories(settings); + MINFO("Mew log categories: " << settings); +} + +void mlog_set_log(const char *log) +{ + long level; + char *ptr = NULL; + + level = strtoll(log, &ptr, 10); + if (ptr && *ptr) + { + mlog_set_categories(log); + } + else if (level >= 0 && level <= 4) + { + mlog_set_log_level(level); + } + else + { + MERROR("Invalid numerical log level: " << log); + } +} + +namespace epee +{ + +bool is_stdout_a_tty() +{ + static std::atomic<bool> initialized(false); + static std::atomic<bool> is_a_tty(false); + + if (!initialized.load(std::memory_order_acquire)) + { +#if defined(WIN32) + is_a_tty.store(0 != _isatty(_fileno(stdout)), std::memory_order_relaxed); +#else + is_a_tty.store(0 != isatty(fileno(stdout)), std::memory_order_relaxed); +#endif + initialized.store(true, std::memory_order_release); + } + + return is_a_tty.load(std::memory_order_relaxed); +} + +void set_console_color(int color, bool bright) +{ + if (!is_stdout_a_tty()) + return; + + switch(color) + { + case console_color_default: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE| (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;37m"; + else + std::cout << "\033[0m"; +#endif + } + break; + case console_color_white: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;37m"; + else + std::cout << "\033[0;37m"; +#endif + } + break; + case console_color_red: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;31m"; + else + std::cout << "\033[0;31m"; +#endif + } + break; + case console_color_green: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;32m"; + else + std::cout << "\033[0;32m"; +#endif + } + break; + + case console_color_blue: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);//(bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;34m"; + else + std::cout << "\033[0;34m"; +#endif + } + break; + + case console_color_cyan: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;36m"; + else + std::cout << "\033[0;36m"; +#endif + } + break; + + case console_color_magenta: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;35m"; + else + std::cout << "\033[0;35m"; +#endif + } + break; + + case console_color_yellow: + { +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0)); +#else + if(bright) + std::cout << "\033[1;33m"; + else + std::cout << "\033[0;33m"; +#endif + } + break; + + } +} + +void reset_console_color() { + if (!is_stdout_a_tty()) + return; + +#ifdef WIN32 + HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); +#else + std::cout << "\033[0m"; + std::cout.flush(); +#endif +} + +} + +#endif //_MLOG_H_ diff --git a/contrib/otshell_utils/CMakeLists.txt b/contrib/otshell_utils/CMakeLists.txt deleted file mode 100644 index 263f07c85..000000000 --- a/contrib/otshell_utils/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -cmake_minimum_required (VERSION 2.6) -project (otshell CXX) - -# Add executable - -if(APPLE AND POLICY CMP0042) - cmake_policy(SET CMP0042 NEW) -endif() - -file(GLOB otshell_utils_sources # All files in directory: - "*.h" - "*.hpp" - "*.cpp" -) - -add_library (otshell_utils ${otshell_utils_sources}) -set_target_properties (otshell_utils PROPERTIES OUTPUT_NAME "otshell_utils") -#target_link_libraries (upnpc-static ${LDLIBS}) # to add used libs diff --git a/contrib/otshell_utils/LICENCE.txt b/contrib/otshell_utils/LICENCE.txt deleted file mode 100644 index f351acf10..000000000 --- a/contrib/otshell_utils/LICENCE.txt +++ /dev/null @@ -1,21 +0,0 @@ - -This are some files also from OpenTransactions / otshell project, -developed thanks to the awesome OpenTransaction project, organization and developers :) - -Parts of code here was also developed thanks to the excellent Monero project, -thanks to Monero project, organization and developers :) - -[Some] files/code here (in external/otshell_utils) are under licence defined in -src/doc/LICENCE-otshell.txt ; -Others are from monero, with licence in src/doc/LICENCE-monero.txt ; - -For me (rfree) the licence seem compatbile so no problem, personally (as author of many parts of the code, -possibly not all) I do not worry who uses it how; I'am not a lawyer. - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Please share :-) This licence can be used e.g. for parts of code that are usable in both open-source FOSS project -Monero and Open Transactions, to share and develop both faster. -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - diff --git a/contrib/otshell_utils/ccolor.cpp b/contrib/otshell_utils/ccolor.cpp deleted file mode 100644 index cd93e0de7..000000000 --- a/contrib/otshell_utils/ccolor.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "ccolor.hpp" -#include <cstdarg> - -// from http://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal -// from http://wiznet.gr/src/ccolor.zip -// edited by rfree - as part of https://github.com/rfree/Open-Transactions/ - -using namespace std; - -#ifdef _MSC_VER - -#define snprintf c99_snprintf - -inline int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap) { - int count = -1; - if (size != 0) - count = _vsnprintf_s(str, size, _TRUNCATE, format, ap); - if (count == -1) - count = _vscprintf(format, ap); - return count; -} - -inline int c99_snprintf(char* str, size_t size, const char* format, ...) { - int count; - va_list ap; - va_start(ap, format); - count = c99_vsnprintf(str, size, format, ap); - va_end(ap); - return count; -} -#endif // _MSC_VER - -#define CC_CONSOLE_COLOR_DEFAULT "\033[0m" -#define CC_FORECOLOR(C) "\033[" #C "m" -#define CC_BACKCOLOR(C) "\033[" #C "m" -#define CC_ATTR(A) "\033[" #A "m" - -namespace zkr -{ - enum Color - { - Black, - Red, - Green, - Yellow, - Blue, - Magenta, - Cyan, - White, - Default = 9 - }; - - enum Attributes - { - Reset, - Bright, - Dim, - Underline, - Blink, - Reverse, - Hidden - }; - - char * cc::color(int attr, int fg, int bg) - { - static const int size = 20; - static char command[size]; - - /* Command is the control command to the terminal */ - snprintf(command, size, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40); - return command; - } - - - const char *cc::console = CC_CONSOLE_COLOR_DEFAULT; - const char *cc::underline = CC_ATTR(4); - const char *cc::bold = CC_ATTR(1); - - const char *cc::fore::black = CC_FORECOLOR(30); - const char *cc::fore::blue = CC_FORECOLOR(34); - const char *cc::fore::red = CC_FORECOLOR(31); - const char *cc::fore::magenta = CC_FORECOLOR(35); - const char *cc::fore::green = CC_FORECOLOR(92); - const char *cc::fore::cyan = CC_FORECOLOR(36); - const char *cc::fore::yellow = CC_FORECOLOR(33); - const char *cc::fore::white = CC_FORECOLOR(37); - const char *cc::fore::console = CC_FORECOLOR(39); - - const char *cc::fore::lightblack = CC_FORECOLOR(90); - const char *cc::fore::lightblue = CC_FORECOLOR(94); - const char *cc::fore::lightred = CC_FORECOLOR(91); - const char *cc::fore::lightmagenta = CC_FORECOLOR(95); - const char *cc::fore::lightgreen = CC_FORECOLOR(92); - const char *cc::fore::lightcyan = CC_FORECOLOR(96); - const char *cc::fore::lightyellow = CC_FORECOLOR(93); - const char *cc::fore::lightwhite = CC_FORECOLOR(97); - - const char *cc::back::black = CC_BACKCOLOR(40); - const char *cc::back::blue = CC_BACKCOLOR(44); - const char *cc::back::red = CC_BACKCOLOR(41); - const char *cc::back::magenta = CC_BACKCOLOR(45); - const char *cc::back::green = CC_BACKCOLOR(42); - const char *cc::back::cyan = CC_BACKCOLOR(46); - const char *cc::back::yellow = CC_BACKCOLOR(43); - const char *cc::back::white = CC_BACKCOLOR(47); - const char *cc::back::console = CC_BACKCOLOR(49); - - const char *cc::back::lightblack = CC_BACKCOLOR(100); - const char *cc::back::lightblue = CC_BACKCOLOR(104); - const char *cc::back::lightred = CC_BACKCOLOR(101); - const char *cc::back::lightmagenta = CC_BACKCOLOR(105); - const char *cc::back::lightgreen = CC_BACKCOLOR(102); - const char *cc::back::lightcyan = CC_BACKCOLOR(106); - const char *cc::back::lightyellow = CC_BACKCOLOR(103); - const char *cc::back::lightwhite = CC_BACKCOLOR(107); -} diff --git a/contrib/otshell_utils/ccolor.hpp b/contrib/otshell_utils/ccolor.hpp deleted file mode 100644 index bf5a601a2..000000000 --- a/contrib/otshell_utils/ccolor.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// ccolor.hpp - -// from http://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal -// from http://wiznet.gr/src/ccolor.zip -// edited by rfree - as part of https://github.com/rfree/Open-Transactions/ - -#ifndef INCLUDE_OT_ccolor -#define INCLUDE_OT_ccolor - -#include <iostream> -#include <stdio.h> - -namespace zkr -{ - class cc - { - public: - - class fore - { - public: - static const char *black; - static const char *blue; - static const char *red; - static const char *magenta; - static const char *green; - static const char *cyan; - static const char *yellow; - static const char *white; - static const char *console; - - static const char *lightblack; - static const char *lightblue; - static const char *lightred; - static const char *lightmagenta; - static const char *lightgreen; - static const char *lightcyan; - static const char *lightyellow; - static const char *lightwhite; - }; - - class back - { - public: - static const char *black; - static const char *blue; - static const char *red; - static const char *magenta; - static const char *green; - static const char *cyan; - static const char *yellow; - static const char *white; - static const char *console; - - static const char *lightblack; - static const char *lightblue; - static const char *lightred; - static const char *lightmagenta; - static const char *lightgreen; - static const char *lightcyan; - static const char *lightyellow; - static const char *lightwhite; - }; - - static char *color(int attr, int fg, int bg); - static const char *console; - static const char *underline; - static const char *bold; - }; -} - -#endif - diff --git a/contrib/otshell_utils/lib_common1.hpp b/contrib/otshell_utils/lib_common1.hpp deleted file mode 100644 index 2cb466beb..000000000 --- a/contrib/otshell_utils/lib_common1.hpp +++ /dev/null @@ -1,53 +0,0 @@ -/* See other files here for the LICENCE that applies here. */ - - -#ifndef INCLUDE_OT_NEWCLI_COMMON1 -#define INCLUDE_OT_NEWCLI_COMMON1 - -#include <string> -#include <cstring> -#include <vector> -#include <map> -#include <list> -#include <algorithm> -#include <iostream> -#include <fstream> -#include <sstream> -#include <set> -#include <iterator> -#include <stdexcept> - -#include <functional> -#include <memory> -#include <atomic> -#include <boost/thread.hpp> -#include <boost/thread/mutex.hpp> -#include <boost/thread/recursive_mutex.hpp> -#include <boost/thread/lock_guard.hpp> - - -// list of thigs from libraries that we pull into namespace nOT::nNewcli -// we might still need to copy/paste it in few places to make IDEs pick it up correctly -#define INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 \ - using std::string; \ - using std::vector; \ - using std::vector; \ - using std::list; \ - using std::set; \ - using std::map; \ - using std::ostream; \ - using std::istream; \ - using std::cin; \ - using std::cerr; \ - using std::cout; \ - using std::cerr; \ - using std::endl; \ - using std::function; \ - using std::unique_ptr; \ - using std::shared_ptr; \ - using std::weak_ptr; \ - using std::enable_shared_from_this; \ - using boost::lock_guard; \ - -#endif - diff --git a/contrib/otshell_utils/runoptions.cpp b/contrib/otshell_utils/runoptions.cpp deleted file mode 100644 index ffd37eae4..000000000 --- a/contrib/otshell_utils/runoptions.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* See other files here for the LICENCE that applies here. */ -/* See header file .hpp for info */ - -#include "runoptions.hpp" - -#include "lib_common1.hpp" - -namespace nOT { - -INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces - -// (no debug - this is the default) -// +nodebug (no debug) -// +debug ...... --asdf -// +debug +debugcerr .... --asfs -// +debug +debugfile .... --asfs - -cRunOptions::cRunOptions() - : mRunMode(eRunModeCurrent), mDebug(false), mDebugSendToFile(false), mDebugSendToCerr(false) - ,mDoRunDebugshow(false) -{ } - -vector<string> cRunOptions::ExecuteRunoptionsAndRemoveThem(const vector<string> & args) { - vector<string> arg_clear; // will store only the arguments that are not removed - - for (auto arg : args) { - bool thisIsRunoption=false; - - if (arg.size()>0) { - if (arg.at(0) == '+') thisIsRunoption=true; - } - - if (thisIsRunoption) Exec(arg); // *** - if (! thisIsRunoption) arg_clear.push_back(arg); - } - - Normalize(); - - return arg_clear; -} - -void cRunOptions::Exec(const string & runoption) { // eg: Exec("+debug"); - if (runoption == "+nodebug") { mDebug=false; } - else if (runoption == "+debug") { mDebug=true; } - else if (runoption == "+debugcerr") { mDebug=true; mDebugSendToCerr=true; } - else if (runoption == "+debugfile") { mDebug=true; mDebugSendToFile=true; } - else if (runoption == "+demo") { mRunMode=eRunModeDemo; } - else if (runoption == "+normal") { mRunMode=eRunModeNormal; } - else if (runoption == "+current") { mRunMode=eRunModeCurrent; } - else if (runoption == "+debugshow") { mDebug=true; mDebugSendToCerr=true; mDoRunDebugshow=true; } - else { - cerr << "Unknown runoption in Exec: '" << runoption << "'" << endl; - throw std::runtime_error("Unknown runoption"); - } - // cerr<<"debug="<<mDebug<<endl; -} - -void cRunOptions::Normalize() { - if (mDebug) { - if (!( mDebugSendToFile || mDebugSendToCerr )) mDebugSendToCerr=true; // if debug is on then send to something, e.g. to cerr - } -} - - -cRunOptions gRunOptions; // (extern) - -} // namespace OT - - diff --git a/contrib/otshell_utils/runoptions.hpp b/contrib/otshell_utils/runoptions.hpp deleted file mode 100644 index 219d3b509..000000000 --- a/contrib/otshell_utils/runoptions.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/* See other files here for the LICENCE that applies here. */ -/* -Template for new files, replace word "template" and later delete this line here. -*/ - -#ifndef INCLUDE_OT_NEWCLI_runoptions_hpp -#define INCLUDE_OT_NEWCLI_runoptions_hpp - -#include "lib_common1.hpp" - -namespace nOT { - -INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces - -/** Global options to run this program main() Eg used for developer's special options like +setdemo +setdebug. -This is NOT for all the other options that are parsed and executed by program. */ -class cRunOptions { - public: - enum tRunMode { ///< Type of run mode - is this normal, or demonstration etc. - eRunModeCurrent=1, ///< currently developed version - eRunModeDemo, ///< best currently available Demo of something nice - eRunModeNormal, ///< do the normal things that the program should do - }; - - private: - tRunMode mRunMode; ///< selected run mode - - bool mDebug; // turn debug on, Eg: +debug without it probably nothing will be written to debug (maybe just error etc) - bool mDebugSendToFile; // send to file, Eg: for +debugfile ; also turns on debug - bool mDebugSendToCerr; // send to cerr, Eg: for +debugcerr ; also turns on debug - // if debug is set but not any other DebugSend* then we will default to sending to debugcerr - - bool mDoRunDebugshow; - - public: - tRunMode getTRunMode() const { return mRunMode; } - bool getDebug() const { return mDebug; } - bool getDebugSendToFile() const { return mDebugSendToFile; } - bool getDebugSendToCerr() const { return mDebugSendToCerr; } - bool getDoRunDebugshow() const { return mDoRunDebugshow; } - - cRunOptions(); - - vector<string> ExecuteRunoptionsAndRemoveThem(const vector<string> & args); - void Exec(const string & runoption); // eg: Exec("+debug"); - - void Normalize(); -}; - -extern cRunOptions gRunOptions; - - -} // namespace nOT - - - -#endif - diff --git a/contrib/otshell_utils/utils.cpp b/contrib/otshell_utils/utils.cpp deleted file mode 100644 index ef9b37f03..000000000 --- a/contrib/otshell_utils/utils.cpp +++ /dev/null @@ -1,806 +0,0 @@ -/// @file -/// @author rfree (current maintainer in monero.cc project) -/// @brief various general utils taken from (and relate to) otshell project, including loggiang/debug - -/* See other files here for the LICENCE that applies here. */ -/* See header file .hpp for info */ - -#include <algorithm> -#include <functional> -#include <cctype> -#include <locale> -#include <fstream> -#include <iostream> -#include <iomanip> -#include <chrono> - -#include "utils.hpp" - -#include "ccolor.hpp" - -#include "lib_common1.hpp" - -#include "runoptions.hpp" - -#if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined (WIN64) - #define OS_TYPE_WINDOWS -#elif defined(__unix__) || defined(__posix) || defined(__linux) || defined(__darwin) || defined(__APPLE__) || defined(__clang__) - #define OS_TYPE_POSIX -#else - #warning "Compiler/OS platform is not recognized. Just assuming it will work as POSIX then" - #define OS_TYPE_POSIX -#endif - -#if defined(OS_TYPE_WINDOWS) - #include <windows.h> - #include <process.h> -#elif defined(OS_TYPE_POSIX) - #include <sys/types.h> - #include <sys/stat.h> - #include <unistd.h> -#else - #error "Compiler/OS platform detection failed - not supported" -#endif - - -namespace nOT { -namespace nUtils { - -INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces - -// ==================================================================== - -// Numerical values of the debug levels - see hpp -const int _debug_level_nr_dbg3=20; -const int _debug_level_nr_dbg2=30; -const int _debug_level_nr_dbg1=40; -const int _debug_level_nr_info=50; -const int _debug_level_nr_note=60; -const int _debug_level_nr_fact=75; -const int _debug_level_nr_mark=80; -const int _debug_level_nr_warn=90; -const int _debug_level_nr_erro=100; - -// ==================================================================== - -myexception::myexception(const char * what) - : std::runtime_error(what) -{ } - -myexception::myexception(const std::string &what) - : std::runtime_error(what) -{ } - -void myexception::Report() const { - _erro("Error: " << what()); -} - -//myexception::~myexception() { } - -// ==================================================================== - -// text trimming -// http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring -std::string & ltrim(std::string &s) { - s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace)))); - return s; -} - -std::string & rtrim(std::string &s) { - s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end()); - return s; -} - -std::string & trim(std::string &s) { - return ltrim(rtrim(s)); -} - -std::string get_current_time() { - std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); - time_t time_now = std::chrono::system_clock::to_time_t(now); - std::chrono::high_resolution_clock::duration duration = now.time_since_epoch(); - int64_t micro = std::chrono::duration_cast<std::chrono::microseconds>(duration).count(); - - // std::localtime() - This function may not be thread-safe. - #ifdef OS_TYPE_WINDOWS - struct tm * tm_pointer = std::localtime( &time_now ); // thread-safe on mingw-w64 (thread local variable) and on MSVC btw - // http://stackoverflow.com/questions/18551409/localtime-r-support-on-mingw - // tm_pointer points to thread-local data, memory is owned/managed by the system/library - #else - // linux, freebsd, have this - struct tm tm_object; // automatic storage duration http://en.cppreference.com/w/cpp/language/storage_duration - struct tm * tm_pointer = & tm_object; // just point to our data - auto x = localtime_r( &time_now , tm_pointer ); // modifies our own (this thread) data in tm_object, this is safe http://linux.die.net/man/3/localtime_r - if (x != tm_pointer) return "(internal error in get_current_time)"; // redundant check in case of broken implementation of localtime_r - #endif - // tm_pointer now points to proper time data, and that memory is automatically managed - if (!tm_pointer) return "(internal error in get_current_time - NULL)"; // redundant check in case of broken implementation of used library methods - - std::stringstream stream; - stream << std::setfill('0') - << std::setw(2) << tm_pointer->tm_year+1900 - << '-' << std::setw(2) << tm_pointer->tm_mon+1 - << '-' << std::setw(2) << tm_pointer->tm_mday - << ' ' << std::setw(2) << tm_pointer->tm_hour - << ':' << std::setw(2) << tm_pointer->tm_min - << ':' << std::setw(2) << tm_pointer->tm_sec - << '.' << std::setw(6) << (micro%1000000); // 6 because microseconds - return stream.str(); -} - -cNullstream g_nullstream; // extern a stream that does nothing (eats/discards data) - -boost::recursive_mutex gLoggerGuard; // extern -std::atomic<int> gLoggerGuardDepth; // extern - -std::atomic<int> & gLoggerGuardDepth_Get() { - // TODO std::once would be nicer here - - static bool once=0; - - if (!once) { // initialize it once - once=1; - gLoggerGuardDepth=0; - } - - return gLoggerGuardDepth; // global, atomic counter -} - - -// ==================================================================== - -namespace nDetail { - -const char* DbgShortenCodeFileName(const char *s) { - const char *p = s; - const char *a = s; - - bool inc=1; - while (*p) { - ++p; - if (inc && ('\0' != * p)) { a=p; inc=false; } // point to the current character (if valid) becasue previous one was slash - if ((*p)=='/') { a=p; inc=true; } // point at current slash (but set inc to try to point to next character) - } - return a; -} - -} - -// a workaround for MSVC compiler; e.g. see https://bugs.webkit.org/show_bug.cgi?format=multiple&id=125795 -#ifndef _MSC_VER -template<typename T, typename ...Args> -std::unique_ptr<T> make_unique( Args&& ...args ) -{ - return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) ); -} -#else - using std::make_unique; -#endif -// ==================================================================== - -char cFilesystemUtils::GetDirSeparatorSys() { - // TODO nicer os detection? - #if defined(OS_TYPE_POSIX) - return '/'; - #elif defined(OS_TYPE_WINDOWS) - return '\\'; - #else - #error "Do not know how to compile this for your platform." - #endif -} - -char cFilesystemUtils::GetDirSeparatorInter() { - return '/'; -} - -string cFilesystemUtils::FileInternalToSystem(const std::string &name) { - string ret; - ret.resize(name.size()); - std::replace_copy(name.begin(), name.end(), ret.begin(), - GetDirSeparatorInter() , GetDirSeparatorSys()); - return ret; -} - -string cFilesystemUtils::FileSystemToInternal(const std::string &name) { - string ret; - ret.reserve(name.size()); - std::replace_copy(name.begin(), name.end(), ret.begin(), - GetDirSeparatorSys() , GetDirSeparatorInter()); - return ret; -} - -bool cFilesystemUtils::CreateDirTree(const std::string & dir, bool only_below) { - const bool dbg=false; - //struct stat st; - const char dirchS = cFilesystemUtils::GetDirSeparatorSys(); - const char dirchI = cFilesystemUtils::GetDirSeparatorInter(); - std::istringstream iss(dir); - string partI; // current par is in internal format (though it should not matter since it doesn't contain any slashes). eg "bar" - string sofarS=""; // sofarS - the so far created dir part is in SYSTEM format. eg "foo/bar" - if (dir.size()<1) return false; // illegal name - // dir[0] is valid from here - if ( only_below && ((dir[0]==dirchS) || (dir[0]==dirchI))) return false; // no jumping to top (on any os) - - while (getline(iss,partI,dirchI)) { // get new component eg "bar" into part - if (dbg) cout << '['<<partI<<']' << endl; - sofarS += partI; - if (partI.size()<1) return false; // bad format? - if ((only_below) && (partI=="..")) return false; // trying to go up - - if (dbg) cout << "test ["<<sofarS<<"]"<<endl; - // TODO nicer os detection? - #if defined(OS_TYPE_POSIX) - struct stat st; - bool exists = stat(sofarS.c_str() ,&st) == 0; // * - if (exists) { - if (! S_ISDIR(st.st_mode)) { - // std::cerr << "This exists, but as a file: [" << sofar << "]" << (size_t)st.st_ino << endl; - return false; // exists but is a file nor dir - } - } - #elif defined(OS_TYPE_WINDOWS) - DWORD dwAttrib = GetFileAttributesA(sofarS.c_str()); - bool exists = (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); - #else - #error "Do not know how to compile this for your platform." - #endif - - if (!exists) { - if (dbg) cout << "mkdir ["<<sofarS<<"]"<<endl; - #if defined(OS_TYPE_POSIX) - bool ok = 0== mkdir(sofarS.c_str(), 0700); // *** - #elif defined(OS_TYPE_WINDOWS) - bool ok = (bool) CreateDirectoryA(sofarS.c_str(), NULL); // TODO use -W() after conversion to unicode UTF16 - #else - #error "Do not know how to compile this for your platform." - #endif - if (!ok) return false; - } - sofarS += dirchS; - } - return true; -} -// ==================================================================== - -namespace nDetail { - -struct channel_use_info { ///< feedback information about using (e.g. opening) given debug channel - used internally by logging system -/// TODO not yet used in code -/// e.g. used to write into channel net/in/all that given message was a first logged message from never-before-logged thread or PID etc - bool m_was_interesting; ///< anything interesting happened when using the channel? - std::vector<std::string> m_extra_msg; ///< any additional messages about this channel use -}; - -cDebugScopeGuard::cDebugScopeGuard() : mLevel(-1) { -} - -cDebugScopeGuard::~cDebugScopeGuard() { - if (mLevel != -1) { - gCurrentLogger.write_stream(mLevel,mChan) << mMsg << " ... end" << gCurrentLogger.endline() << std::flush; - } -} - -void cDebugScopeGuard::Assign(const string &chan, const int level, const string &msg) { - mChan=chan; - mLevel=level; - mMsg=msg; -} - -} // namespace nDetail - -// ==================================================================== - -cLogger::cLogger() : -mStream(NULL), -mStreamBrokenDebug(NULL), -mIsBroken(true), // before constructor finishes -mLevel(_debug_level_nr_warn), -mThread2Number_Biggest(0), // the CURRENT biggest value (no thread yet in map) -mPid2Number_Biggest(0) -{ - mStream = & std::cout; - mStreamBrokenDebug = & std::cerr; // the backup stream - *mStreamBrokenDebug << "Creating the logger system" << endl; - mIsBroken=false; // ok, constr. succeeded, so string is not broken now - - // this is here, because it could be using logging itself to log creation of first thread/PID etc - Thread2Number( boost::this_thread::get_id() ); // convert current id to short number, useful to reserve a number so that main thread is usually called 1 - Pid2Number( getpid() ); // add this proces ID as first one -} - -cLogger::~cLogger() { - for (auto pair : mChannels) { - std::ofstream *ptr = pair.second; - delete ptr; - pair.second=NULL; - } -} - -void cLogger::SetStreamBroken() { - SetStreamBroken("(no additional details about this problem)"); -} - -void cLogger::SetStreamBroken(const std::string &msg) { - _dbg_dbg("Stream is broken (msg: " << msg << ")"); - if (!mIsBroken) { // if not already marked as broken - _dbg_dbg("(It was not broken before)"); - std::cerr << OT_CODE_STAMP << "WARNING: due to a problem in the debug/logging system itself ("<<msg<<") - we are switching back to fallback stream (e.g. cerr)" << std::endl; - if (mStreamBrokenDebug == nullptr) { - std::cerr << OT_CODE_STAMP << " ERROR: in addition, while reporting this problem, mStreamBrokenDebug stream is NULL: " << mStreamBrokenDebug << std::endl; - } else { - (*mStreamBrokenDebug) << OT_CODE_STAMP << "WARNING: due to debug stream problem ("<<msg<<") - switching back to fallback stream (e.g. cerr)" << std::endl; - } - mIsBroken = true; - } -} - -std::ostream & cLogger::write_stream(int level) { - return write_stream(level,""); -} - -std::ostream & cLogger::write_stream(int level, const std::string & channel ) { - _dbg_dbg("level="<<level<<" channel="<<channel); - if (level >= mLevel) { - if (mStream) { // TODO now disabling mStream also disables writting to any channel - _dbg_dbg("Selecting output..."); - ostream & output = SelectOutput(level,channel); - _dbg_dbg("Selecting output... done, output=" << (void*)(&output)); - #if defined(OS_TYPE_WINDOWS) - output << windows_stream(level); - #endif - output << icon(level) << ' '; - boost::thread::id this_id = boost::this_thread::get_id(); - output << "{" << Thread2Number(this_id) << "}"; - auto nicePid = Pid2Number(getpid()); - if (nicePid>0) output << " {p" << nicePid << "}"; - output << ' '; - return output; // <--- return - } else _dbg_dbg("Not writting: No mStream"); - } else _dbg_dbg("Not writting: Too low level level="<<level<<" not >= mLevel="<<mLevel); - return g_nullstream; -} - -std::string cLogger::GetLogBaseDir() const { - return "log"; -} - -void cLogger::OpenNewChannel(const std::string & channel) noexcept { - try { - _dbg_dbg("Openning channel for channel="<<channel); - OpenNewChannel_(channel); - } - catch (const std::exception &except) { - SetStreamBroken(OT_CODE_STAMP + " Got exception when opening debug channel: " + ToStr(except.what())); - } - catch (...) { - SetStreamBroken(OT_CODE_STAMP + " Got not-standard exception when opening debug channel."); - } -} - -void cLogger::OpenNewChannel_(const std::string & channel) { // channel=="net/sleep" - _dbg_dbg("Openning channel for channel="<<channel); - size_t last_split = channel.find_last_of(cFilesystemUtils::GetDirSeparatorInter()); - - string fname_system; // the full file name in system format - - if (last_split==string::npos) { // The channel name has no directory, eg channel=="test" - string dir = GetLogBaseDir(); - string basefile = channel + ".log"; - string fname = dir + cFilesystemUtils::GetDirSeparatorInter() + basefile; - fname_system = cFilesystemUtils::FileInternalToSystem(fname); // <- - } - else { // there is a directory eg channel=="net/sleep" - // net/sleep - // ^----- last_split - string dir = GetLogBaseDir() + cFilesystemUtils::GetDirSeparatorInter() + channel.substr(0, last_split); - string basefile = channel.substr(last_split+1) + ".log"; - string fname = dir + cFilesystemUtils::GetDirSeparatorInter() + basefile; - fname_system = cFilesystemUtils::FileInternalToSystem(fname); // <- - bool dirok = cFilesystemUtils::CreateDirTree(dir); - if (!dirok) { string err = "In logger failed to open directory (" + dir +") for channel (" + channel +")"; throw std::runtime_error(err); } - } - - _dbg_dbg("Openning fname_system="<<fname_system); - std::ofstream * thefile = new std::ofstream( fname_system.c_str() ); // file system - *thefile << "====== Log opened: " << fname_system << " (in " << ((void*)thefile) << ") ======" << endl; -// cerr << "====== Log opened: " << fname_system << " (in " << ((void*)thefile) << ") ======" << endl; - _dbg_dbg( "====== Log opened: " << fname_system << " (in " << ((void*)thefile) << ") ======" ); - mChannels.insert( std::pair<string,std::ofstream*>(channel , thefile ) ); // <- created the channel mapping -} - -std::ostream & cLogger::SelectOutput(int level, const std::string & channel) noexcept { - try { - if (mIsBroken) { - _dbg_dbg("The stream is broken mIsBroken="<<mIsBroken<<" so will return backup stream"); - return *mStreamBrokenDebug; - } - if (channel=="") { - _dbg_dbg("No channel given (channel="<<channel<<") so will return main stream"); - return *mStream; - } - - auto obj = mChannels.find(channel); - if (obj == mChannels.end()) { // not found - need to make new channel - _dbg_dbg("No stream openened for channel="<<channel<<" so will create it now"); - OpenNewChannel(channel); // <- create channel - obj = mChannels.find(channel); // find again - if (obj == mChannels.end()) { // still not found! something is wrong - SetStreamBroken( OT_CODE_STAMP + " WARNING: can not get stream for channel="+ToStr(channel)+" level="+ToStr(channel) ); - return *mStreamBrokenDebug; - } - } - auto the_stream_ptr = obj->second; - _dbg_dbg("Found the stream file for channel="<<channel<<" as the_stream_ptr="<<the_stream_ptr); - ASRT(the_stream_ptr); - return *the_stream_ptr; // <--- RETURN - } - catch (std::exception &except) { - SetStreamBroken( OT_CODE_STAMP + " Got exception: " + ToStr(except.what()) ); - _dbg_dbg("Exception! Returning broken stream"); - return *mStreamBrokenDebug; - } - catch (...) { - SetStreamBroken( OT_CODE_STAMP + " Got not-standard exception."); - _dbg_dbg("Exception! Returning broken stream"); - return *mStreamBrokenDebug; - } - - // dead code -} - -void cLogger::setOutStreamFile(const string &fname) { // switch to using this file - _mark("WILL SWITCH DEBUG NOW to file: " << fname); - mOutfile = make_unique<std::ofstream>(fname); - mStream = & (*mOutfile); - _mark("Started new debug, to file: " << fname); -} - -void cLogger::setOutStreamFromGlobalOptions() { - if ( gRunOptions.getDebug() ) { - if ( gRunOptions.getDebugSendToFile() ) { - mOutfile = make_unique<std::ofstream> ("debuglog.txt"); - mStream = & (*mOutfile); - } - else if ( gRunOptions.getDebugSendToCerr() ) { - mStream = & std::cerr; - } - else { - mStream = & g_nullstream; - } - } - else { - mStream = & g_nullstream; - } -} - -void cLogger::setDebugLevel(int level) { - bool note_before = (mLevel > level); // report the level change before or after the change? (on higher level) - if (note_before) _note("Setting debug level to "<<level); - mLevel = level; - if (!note_before) _note("Setting debug level to "<<level); -} - -std::string cLogger::icon(int level) const { - // TODO replan to avoid needles converting back and forth char*, string etc - - using namespace zkr; - #if defined(OS_TYPE_POSIX) - if (level >= 100) return cc::back::lightred + ToStr(cc::fore::lightyellow) + ToStr("ERROR ") + ToStr(cc::fore::lightyellow) + " " ; - if (level >= 90) return cc::back::lightyellow + ToStr(cc::fore::black) + ToStr("Warn ") + ToStr(cc::fore::red)+ " " ; - if (level >= 80) return cc::back::lightmagenta + ToStr(cc::fore::black) + ToStr("MARK "); //+ zkr::cc::console + ToStr(cc::fore::lightmagenta)+ " "; - if (level >= 75) return cc::back::lightyellow + ToStr(cc::fore::black) + ToStr("FACT ") + zkr::cc::console + ToStr(cc::fore::lightyellow)+ " "; - if (level >= 70) return cc::fore::green + ToStr("Note "); - if (level >= 50) return cc::fore::cyan + ToStr("info "); - if (level >= 40) return cc::fore::lightwhite + ToStr("dbg "); - if (level >= 30) return cc::fore::lightblue + ToStr("dbg "); - if (level >= 20) return cc::fore::blue + ToStr("dbg "); - - #elif defined(OS_TYPE_WINDOWS) - if (level >= 100) return ToStr("ERROR "); - if (level >= 90) return ToStr("Warn "); - if (level >= 80) return ToStr("MARK "); - if (level >= 75) return ToStr("FACT "); - if (level >= 70) return ToStr("Note "); - if (level >= 50) return ToStr("info "); - if (level >= 40) return ToStr("dbg "); - if (level >= 30) return ToStr("dbg "); - if (level >= 20) return ToStr("dbg "); - #endif - - return " "; -} - -std::string cLogger::endline() const { - #if defined(OS_TYPE_POSIX) - return ToStr("") + zkr::cc::console + ToStr("\n"); // TODO replan to avoid needles converting back and forth char*, string etc - #elif defined(OS_TYPE_WINDOWS) - return ToStr("\n"); - #endif -} - -int cLogger::Thread2Number(const boost::thread::id id) { - auto found = mThread2Number.find( id ); - if (found == mThread2Number.end()) { // new one - mThread2Number_Biggest++; - mThread2Number[id] = mThread2Number_Biggest; - _info_c("dbg/main", "This is a new thread (used in debug), thread id="<<id); // can cause some recursion - return mThread2Number_Biggest; - } else { - return mThread2Number[id]; - } -} - -int cLogger::Pid2Number(const t_anypid id) { - auto found = mPid2Number.find( id ); - if (found == mPid2Number.end()) { // new one - mPid2Number_Biggest++; - mPid2Number[id] = mPid2Number_Biggest; - _info_c("dbg/main", "This is a new process (used in debug), process pid="<<id); // can cause some recursion - return mPid2Number_Biggest; - } else { - return mPid2Number[id]; - } -} - -// ==================================================================== -// object gCurrentLogger is defined later - in global namespace below - - -// ==================================================================== -// vector debug - -void DisplayStringEndl(std::ostream & out, const std::string text) { - out << text; - out << std::endl; -} - -std::string SpaceFromEscape(const std::string &s) { - std::ostringstream newStr; - for(size_t i = 0; i < s.length();i++) { - if(s[i] == '\\' && s[i+1] ==32) - newStr<<""; - else - newStr<<s[i]; - } - return newStr.str(); -} - -std::string EscapeFromSpace(const std::string &s) { - std::ostringstream newStr; - for(size_t i = 0; i < s.length();i++) { - if(s[i] == 32) - newStr << "\\" << " "; - else - newStr << s[i]; - } - return newStr.str(); -} - - -std::string EscapeString(const std::string &s) { - std::ostringstream newStr; - for(size_t i = 0; i < s.length();i++) { - if(s[i] >=32 && s[i] <= 126) - newStr<<s[i]; - else - newStr<<"\\"<< (int) s[i]; - } - - return newStr.str(); -} - - -bool CheckIfBegins(const std::string & beggining, const std::string & all) { - if (all.compare(0, beggining.length(), beggining) == 0) { - return 1; - } - else { - return 0; - } -} - -bool CheckIfEnds (std::string const & ending, std::string const & all){ - if (all.length() >= ending.length()) { - return (0 == all.compare (all.length() - ending.length(), ending.length(), ending)); - } else { - return false; - } -} - - -vector<string> WordsThatMatch(const std::string & sofar, const vector<string> & possib) { - vector<string> ret; - for ( auto rec : possib) { // check of possibilities - if (CheckIfBegins(sofar,rec)) { - rec = EscapeFromSpace(rec); - ret.push_back(rec); // this record matches - } - } - return ret; -} - -char GetLastChar(const std::string & str) { // TODO unicode? - auto s = str.length(); - if (s==0) throw std::runtime_error("Getting last character of empty string (" + ToStr(s) + ")" + OT_CODE_STAMP); - return str.at( s - 1); -} - -std::string GetLastCharIf(const std::string & str) { // TODO unicode? - auto s = str.length(); - if (s==0) return ""; // empty string signalizes ther is nothing to be returned - return std::string( 1 , str.at( s - 1) ); -} - -// ==================================================================== - -// ASRT - assert. Name like ASSERT() was too long, and ASS() was just... no. -// Use it like this: ASRT( x>y ); with the semicolon at end, a clever trick forces this syntax :) - -void Assert(bool result, const std::string &stamp, const std::string &condition) { - if (!result) { - _erro("Assert failed at "+stamp+": ASSERT( " << condition << ")"); - throw std::runtime_error("Assert failed at "+stamp+": ASSERT( " + condition + ")"); - } -} - -// ==================================================================== -// advanced string - -const std::string GetMultiline(string endLine) { - std::string result(""); // Taken from OT_CLI_ReadUntilEOF - while (true) { - std::string input_line(""); - if (std::getline(std::cin, input_line, '\n')) - { - input_line += "\n"; - if (input_line[0] == '~') - break; - result += input_line; - } - if (std::cin.eof() ) - { - std::cin.clear(); - break; - } - if (std::cin.fail() ) - { - std::cin.clear(); - break; - } - if (std::cin.bad()) - { - std::cin.clear(); - break; - } - } - return result; -} - -vector<string> SplitString(const string & str){ - std::istringstream iss(str); - vector<string> vec { std::istream_iterator<string>{iss}, std::istream_iterator<string>{} }; - return vec; -} - -bool checkPrefix(const string & str, char prefix) { - if (str.at(0) == prefix) - return true; - return false; -} - -// ==================================================================== -// operation on files - - -#ifdef __unix - -void cEnvUtils::GetTmpTextFile() { - // TODO make this name configurable (depending on project) - char filename[] = "/tmp/otshellutils_text.XXXXXX"; - fd = mkstemp(filename); - if (fd == -1) { - _erro("Can't create the file: " << filename); - return; - } - mFilename = filename; -} - -void cEnvUtils::CloseFile() { - close(fd); - unlink( mFilename.c_str() ); -} - -void cEnvUtils::OpenEditor() { - char* editor = std::getenv("OT_EDITOR"); //TODO Read editor from configuration file - if (editor == NULL) - editor = std::getenv("VISUAL"); - if (editor == NULL) - editor = std::getenv("EDITOR"); - - string command; - if (editor != NULL) - command = ToStr(editor) + " " + mFilename; - else - command = "/usr/bin/editor " + mFilename; - _dbg3("Opening editor with command: " << command); - if ( system( command.c_str() ) == -1 ) - _erro("Cannot execute system command: " << command); -} - -const string cEnvUtils::ReadFromTmpFile() { - std::ifstream ifs(mFilename); - string msg((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); - return msg; -} - -const string cEnvUtils::Compose() { - GetTmpTextFile(); - OpenEditor(); - string input = ReadFromTmpFile(); - CloseFile(); - return input; -} - -#endif - -const string cEnvUtils::ReadFromFile(const string path) { - std::ifstream ifs(path); - string msg((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); - return msg; -} - -void hintingToTxt(std::fstream & file, string command, vector<string> &commands) { - if(file.good()) { - file<<command<<"~"<<endl; - for (auto a: commands) { - file <<a<< " "; - file.flush(); - } - file<<endl; - } -} - -string stringToColor(const string &hash) { - // Generete vector with all possible light colors - vector <string> lightColors; - using namespace zkr; - lightColors.push_back(cc::fore::lightblue); - lightColors.push_back(cc::fore::lightred); - lightColors.push_back(cc::fore::lightmagenta); - lightColors.push_back(cc::fore::lightgreen); - lightColors.push_back(cc::fore::lightcyan); - lightColors.push_back(cc::fore::lightyellow); - lightColors.push_back(cc::fore::lightwhite); - - int sum=0; - - for (auto ch : hash) sum+=ch; - auto color = sum%(lightColors.size()-1); - - return lightColors.at( color ); -} - - -// ==================================================================== -// algorthms - - -} // namespace nUtil - - -} // namespace OT - -// global namespace - -const extern int _dbg_ignore = 0; // see description in .hpp - -std::string GetObjectName() { - //static std::string * name=nullptr; - //if (!name) name = new std::string("(global)"); - return ""; -} - -// ==================================================================== - -nOT::nUtils::cLogger gCurrentLogger; - diff --git a/contrib/otshell_utils/utils.hpp b/contrib/otshell_utils/utils.hpp deleted file mode 100644 index 98508b565..000000000 --- a/contrib/otshell_utils/utils.hpp +++ /dev/null @@ -1,532 +0,0 @@ -/// @file -/// @author rfree (current maintainer in monero.cc project) -/// @brief various general utils taken from (and relate to) otshell project, including loggiang/debug - -/* See other files here for the LICENCE that applies here. */ - -#include "ccolor.hpp" -#ifndef INCLUDE_OT_NEWCLI_UTILS -#define INCLUDE_OT_NEWCLI_UTILS - -#include "lib_common1.hpp" -#ifdef __unix - #include <unistd.h> -#endif - -#if defined(_WIN32) - #include"windows_stream.h" -#endif - -#ifndef CFG_WITH_TERMCOLORS - //#error "You requested to turn off terminal colors (CFG_WITH_TERMCOLORS), however currently they are hardcoded (this option to turn them off is not yet implemented)." -#endif - -///Macros related to automatic deduction of class name etc; -#define MAKE_CLASS_NAME(NAME) private: static std::string GetObjectName() { return #NAME; } -#define MAKE_STRUCT_NAME(NAME) private: static std::string GetObjectName() { return #NAME; } public: - -// define this to debug the debug system itself: -// #define opt_debug_debug - -#ifdef opt_debug_debug - #define _dbg_dbg(X) do { std::cerr<<"_dbg_dbg: " << OT_CODE_STAMP << " {thread=" << boost::this_thread::get_id()<<"} " \ - << " {pid="<<getpid()<<"} " << ": " << X << std::endl; } while(0) -#else - #define _dbg_dbg(X) do { } while(0) -#endif - -namespace nOT { - -namespace nUtils { - -/// @brief general based for my runtime errors -class myexception : public std::runtime_error { - public: - myexception(const char * what); - myexception(const std::string &what); - //virtual ~myexception(); - virtual void Report() const; -}; - -/// @macro Use this macro INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 as a shortcut for various using std::string etc. -INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces - -// ====================================================================================== -/// text trimming functions (they do mutate the passes string); they trim based on std::isspace. also return it's reference again -/// http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring -std::string & trim(std::string &s); ///< trim text http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring -std::string & ltrim(std::string &s); ///< left trim -std::string & rtrim(std::string &s); ///< right trim - -// ====================================================================================== - -std::string get_current_time(); - -// string conversions -template <class T> -std::string ToStr(const T & obj) { - std::ostringstream oss; - oss << obj; - return oss.str(); -} - -struct cNullstream : std::ostream { - cNullstream() : std::ios(0), std::ostream(0) {} -}; -extern cNullstream g_nullstream; // a stream that does nothing (eats/discards data) -// ========== debug ========== -// _dbg_ignore is moved to global namespace (on purpose) - -// TODO make _dbg_ignore thread-safe everywhere - -extern boost::recursive_mutex gLoggerGuard; // the mutex guarding logging/debugging code e.g. protecting streams, files, etc - -std::atomic<int> & gLoggerGuardDepth_Get(); // getter for the global singleton of counter (it guarantees initializing it to 0). This counter shows the current recursion (re-entrant) level of debug macros. - -// TODO more debug of the debug system: -// detect lock() error e.g. recursive limit -// detect stream e.g. operator<< error - -#define _debug_level(LEVEL,VAR) do { if (_dbg_ignore< LEVEL) { \ - _dbg_dbg("WRITE DEBUG: LEVEL="<<LEVEL<<" VAR: " << VAR ); \ - auto level=LEVEL; short int part=0; \ - try { \ - boost::lock_guard<boost::recursive_mutex> mutex_guard( nOT::nUtils::gLoggerGuard ); \ - part=1; \ - try { \ - ++nOT::nUtils::gLoggerGuardDepth_Get(); \ -/* int counter = nOT::nUtils::gLoggerGuardDepth_Get(); if (counter!=1) gCurrentLogger.write_stream(100,"")<<"DEBUG-ERROR: recursion, counter="<<counter<<gCurrentLogger.endline(); */ \ - gCurrentLogger.write_stream(LEVEL,"") << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << VAR << gCurrentLogger.endline() << std::flush; \ - part=9; \ - } catch(...) { \ - gCurrentLogger.write_stream(std::max(level,90),"") << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << "(ERROR IN DEBUG)" << gCurrentLogger.endline(); \ - --nOT::nUtils::gLoggerGuardDepth_Get(); throw ; \ - } \ - --nOT::nUtils::gLoggerGuardDepth_Get(); \ - } catch(...) { if (part<8) gCurrentLogger.write_stream(100,"")<<"DEBUG-ERROR: problem in debug mechanism e.g. in locking." <<gCurrentLogger.endline(); throw ; } \ - } } while(0) - -// info for code below: oss object is normal stack variable, using it does not need lock protection -#define _debug_level_c(CHANNEL,LEVEL,VAR) do { if (_dbg_ignore< LEVEL) { \ - _dbg_dbg("WRITE DEBUG: LEVEL="<<LEVEL<<" CHANNEL="<<CHANNEL<<" VAR: " << VAR ); \ - auto level=LEVEL; short int part=0; \ - try { \ - boost::lock_guard<boost::recursive_mutex> mutex_guard( nOT::nUtils::gLoggerGuard ); \ - part=1; \ - try { \ - ++nOT::nUtils::gLoggerGuardDepth_Get(); \ - std::ostringstream oss; \ - oss << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << VAR << gCurrentLogger.endline() << std::flush; \ - std::string as_string = oss.str(); \ - _dbg_dbg("START will write to log LEVEL="<<LEVEL<<" to CHANNEL="<<CHANNEL<<" as_string="<<as_string); \ -/* int counter = nOT::nUtils::gLoggerGuardDepth_Get(); if (counter!=1) gCurrentLogger.write_stream(100,"")<<"DEBUG-ERROR: recursion, counter="<<counter<<gCurrentLogger.endline(); */ \ - gCurrentLogger.write_stream(LEVEL,"" ) << as_string << gCurrentLogger.endline() << std::flush; \ - gCurrentLogger.write_stream(LEVEL,CHANNEL) << as_string << gCurrentLogger.endline() << std::flush; \ - _dbg_dbg("DONE will write to log LEVEL="<<LEVEL<<" to CHANNEL="<<CHANNEL<<" as_string="<<as_string); \ - part=9; \ - } catch(...) { \ - gCurrentLogger.write_stream(std::max(level,90),CHANNEL) << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << "(ERROR IN DEBUG)" << gCurrentLogger.endline(); \ - --nOT::nUtils::gLoggerGuardDepth_Get(); throw ; \ - } \ - --nOT::nUtils::gLoggerGuardDepth_Get(); \ - } catch(...) { if (part<8) gCurrentLogger.write_stream(100,CHANNEL)<<"DEBUG-ERROR: problem in debug mechanism e.g. in locking." <<gCurrentLogger.endline(); throw ; } \ - } } while(0) - -// Numerical values of the debug levels - are defined here as const ints. Full name (with namespace) given for clarity. -extern const int _debug_level_nr_dbg3; -extern const int _debug_level_nr_dbg2; -extern const int _debug_level_nr_dbg1; -extern const int _debug_level_nr_info; -extern const int _debug_level_nr_note; -extern const int _debug_level_nr_fact; -extern const int _debug_level_nr_mark; -extern const int _debug_level_nr_warn; -extern const int _debug_level_nr_erro; - -#define _dbg3(VAR) _debug_level( nOT::nUtils::_debug_level_nr_dbg3,VAR) // details - most detailed -#define _dbg2(VAR) _debug_level( nOT::nUtils::_debug_level_nr_dbg2,VAR) // details - a bit more important -#define _dbg1(VAR) _debug_level( nOT::nUtils::_debug_level_nr_dbg1,VAR) // details - more important -#define _info(VAR) _debug_level( nOT::nUtils::_debug_level_nr_info,VAR) // information -#define _note(VAR) _debug_level( nOT::nUtils::_debug_level_nr_note,VAR) // more interesting information -#define _fact(VAR) _debug_level( nOT::nUtils::_debug_level_nr_fact,VAR) // interesting events that could be interesting even for user, for logical/business things -#define _mark(VAR) _debug_level( nOT::nUtils::_debug_level_nr_mark,VAR) // marked actions -#define _warn(VAR) _debug_level( nOT::nUtils::_debug_level_nr_warn,VAR) // some problems -#define _erro(VAR) _debug_level( nOT::nUtils::_debug_level_nr_erro,VAR) // errors - -#define _dbg3_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_dbg3, VAR) // details - most detailed -#define _dbg2_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_dbg2, VAR) // details - a bit more important -#define _dbg1_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_dbg1, VAR) // details - more important -#define _info_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_info, VAR) // information -#define _note_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_note, VAR) // more interesting information -#define _fact_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_fact, VAR) // interesting events that could be interesting even for user, for logical/business things -#define _mark_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_mark, VAR) // marked actions -#define _warn_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_warn, VAR) // some problems -#define _erro_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_erro, VAR) // errors - -// lock // because of VAR -#define _scope_debug_level_c(CHANNEL,LEVEL,VAR) \ - std::ostringstream debug_detail_oss; \ - nOT::nUtils::gLoggerGuard.lock(); \ - debug_detail_oss << OT_CODE_STAMP << ' ' << VAR ; \ - nOT::nUtils::nDetail::cDebugScopeGuard debugScopeGuard; \ - if (_dbg_ignore<LEVEL) debugScopeGuard.Assign(CHANNEL,LEVEL, debug_detail_oss.str()); \ - if (_dbg_ignore<LEVEL) _debug_level_c(CHANNEL,LEVEL,debug_detail_oss.str() + " ... begin"); \ - nOT::nUtils::gLoggerGuard.unlock(); -#define _scope_debug_level(LEVEL,VAR) _scope_debug_level_c("",LEVEL,VAR) - -#define _scope_dbg1(VAR) _scope_debug_level( _debug_level_nr_dbg3, VAR) -#define _scope_dbg2(VAR) _scope_debug_level( _debug_level_nr_dbg2, VAR) -#define _scope_dbg3(VAR) _scope_debug_level( _debug_level_nr_dbg1, VAR) -#define _scope_info(VAR) _scope_debug_level( _debug_level_nr_info, VAR) -#define _scope_note(VAR) _scope_debug_level( _debug_level_nr_note, VAR) -#define _scope_fact(VAR) _scope_debug_level( _debug_level_nr_fact, VAR) -#define _scope_mark(VAR) _scope_debug_level( _debug_level_nr_mark, VAR) -#define _scope_warn(VAR) _scope_debug_level( _debug_level_nr_warn, VAR) -#define _scope_erro(VAR) _scope_debug_level( _debug_level_nr_erro, VAR) - -/*** -@brief do not use this namespace directly, it is implementation detail. -*/ -namespace nDetail { - -/*** -@brief a Debug scope-guard, to log a debug message when current scope is left. Do NOT use this directly, -only use it via the macros like _scope_dbg1 etc. -*/ -class cDebugScopeGuard { - protected: - string mMsg; - int mLevel; - string mChan; - public: - cDebugScopeGuard(); - ~cDebugScopeGuard(); - void Assign(const string &chan, const int level, const string &msg); -}; - -const char* DbgShortenCodeFileName(const char *s); ///< Returns a pointer to some part of the string that was given, skipping directory names, for log/debug - -} // namespace nDetail - -// ========== logger ========== - -namespace nDetail { - struct channel_use_info; -} // namespace nDetail - -/*** -@brief Class to write debug into. Used it by calling the debug macros _dbg1(...) _info(...) _erro(...) etc, NOT directly! -@author rfree (maintainer) -@thread this class is NOT thread safe and must used only by one thread at once (use it via ot_debug_macros like _info macro they do proper locking) -*/ -class cLogger { - public: - cLogger(); - ~cLogger(); - std::ostream & write_stream(int level); ///< starts a new message on given level (e.g. writes out the icon/tag) and returns stream to output to - std::ostream & write_stream(int level, const std::string & channel); ///< the same but with name of the debug channel - - void setOutStreamFromGlobalOptions(); // set debug level, file etc - according to global Options - void setOutStreamFile(const std::string &fname); // switch to using this file - void setDebugLevel(int level); // change the debug level e.g. to mute debug from now - - std::string icon(int level) const; ///< returns "icon" for given debug level. It is text, might include color controll characters - std::string endline() const; ///< returns string to be written at end of message - - protected: - typedef long int t_anypid; // a portable representation of PID. long int should cover all platforms - - void SetStreamBroken(); ///< call in case of internal error in logger (e.g. can not open a file) - void SetStreamBroken(const std::string &msg); ///< same but with error message - - unique_ptr<std::ofstream> mOutfile; - std::ostream * mStream; ///< pointing only! can point to our own mOutfile, or maye to global null stream - std::ostream * mStreamBrokenDebug; ///< pointing only! this is a pointer to some stream that should be used when normal debugging is broken eg std::cerr - bool mIsBroken; ///< is the debugging system broken (this should be set when internal problems occur and should cause fallback to std::cerr) - - std::map< std::string , std::ofstream * > mChannels; // the ofstream objects are owned by this class - - int mLevel; ///< current debug level - - std::ostream & SelectOutput(int level, const std::string & channel) noexcept; ///< returns a proper stream for this level and channel (always usable string) - void OpenNewChannel(const std::string & channel) noexcept; ///< tries to prepare this channel. does NOT guarantee to created mChannels[] entry! - void OpenNewChannel_(const std::string & channel); ///< internal function, will throw in case of problems - std::string GetLogBaseDir() const; - - std::map< boost::thread::id , int > mThread2Number; ///< change long thread IDs into a short nice number to show - int mThread2Number_Biggest; ///< current biggest value held there (biggest key) - works as growing-only counter basically - int Thread2Number(const boost::thread::id id); ///< convert the system's thread id into a nice short our id; make one if new thread - - std::map< t_anypid , int > mPid2Number; ///< change long proces PID into a short nice number to show - int mPid2Number_Biggest; ///< current biggest value held there (biggest key) - works as growing-only counter basically - int Pid2Number(const t_anypid id); ///< convert the system's PID id into a nice short our id; make one if new thread -}; - - - -// ==================================================================== -// vector debug - -template <class T> -std::string vectorToStr(const T & v) { - std::ostringstream oss; - for(auto rec: v) { - oss << rec <<","; - } - return oss.str(); -} - -template <class T> -void DisplayVector(std::ostream & out, const std::vector<T> &v, const std::string &delim=" ") { - std::copy( v.begin(), v.end(), std::ostream_iterator<T>(out, delim.c_str()) ); -} - -template <class T> -void EndlDisplayVector(std::ostream & out, const std::vector<T> &v, const std::string &delim=" ") { - out << std::endl; - DisplayVector(out,v,delim); -} - -template <class T> -void DisplayVectorEndl(std::ostream & out, const std::vector<T> &v, const std::string &delim=" ") { - DisplayVector(out,v,delim); - out << std::endl; -} - -template <class T> -void DbgDisplayVector(const std::vector<T> &v, const std::string &delim=" ") { - std::cerr << "["; - std::copy( v.begin(), v.end(), std::ostream_iterator<T>(std::cerr, delim.c_str()) ); - std::cerr << "]"; -} - -string stringToColor(const string &hash); -template <class T, class T2> -void DisplayMap(std::ostream & out, const std::map<T, T2> &m, const std::string &delim=" ") { - auto *no_color = zkr::cc::fore::console; - for(auto var : m) { - out << stringToColor(var.first) << var.first << delim << var.second << no_color << endl; - } - -} - -template <class T, class T2> -void EndlDisplayMap(std::ostream & out, const std::map<T, T2> &m, const std::string &delim=" ") { - out << endl; - for(auto var : m) { - out << var.first << delim << var.second << endl; - } -} - -template <class T, class T2> -void DbgDisplayMap(const std::map<T, T2> &m, const std::string &delim=" ") { - for(auto var : m) { - std::cerr << var.first << delim << var.second << endl; - } -} - - -template <class T> -void DbgDisplayVectorEndl(const std::vector<T> &v, const std::string &delim=" ") { - DbgDisplayVector(v,delim); - std::cerr << std::endl; -} - -void DisplayStringEndl(std::ostream & out, const std::string text); - -bool CheckIfBegins(const std::string & beggining, const std::string & all); -bool CheckIfEnds (std::string const & ending, std::string const & all); -std::string SpaceFromEscape(const std::string &s); -std::string EscapeFromSpace(const std::string &s); -vector<string> WordsThatMatch(const std::string & sofar, const vector<string> & possib); -char GetLastChar(const std::string & str); -std::string GetLastCharIf(const std::string & str); // TODO unicode? -std::string EscapeString(const std::string &s); - - -template <class T> -std::string DbgVector(const std::vector<T> &v, const std::string &delim="|") { - std::ostringstream oss; - oss << "["; - bool first=true; - for(auto vElement : v) { if (!first) oss<<delim; first=false; oss <<vElement ; } - oss << "]"; - //std::copy( v.begin(), v.end(), std::ostream_iterator<T>(oss, delim.c_str()) ); - return oss.str(); -} - -template <class T> -std::ostream & operator<<(std::ostream & os, const map< T, vector<T> > & obj){ - os << "["; - for(auto const & elem : obj) { - os << " [" << elem.first << "=" << DbgVector(elem.second) << "] "; - } - os << "]"; - return os; -} - -template <class T, class T2> -std::string DbgMap(const map<T, T2> & map) { - std::ostringstream oss; - oss << map; - return oss.str(); -} - -// ==================================================================== -// assert - -// ASRT - assert. Name like ASSERT() was too long, and ASS() was just... no. -// Use it like this: ASRT( x>y ); with the semicolon at end, a clever trick forces this syntax :) -#define ASRT(x) do { if (!(x)) nOT::nUtils::Assert(false, OT_CODE_STAMP, #x); } while(0) - -void Assert(bool result, const std::string &stamp, const std::string &condition); - -// ==================================================================== -// advanced string - -const std::string GetMultiline(string endLine = "~"); -vector<string> SplitString(const string & str); - -bool checkPrefix(const string & str, char prefix = '^'); - -// ==================================================================== -// nUse utils - -enum class eSubjectType {Account, Asset, User, Server, Unknown}; - -string SubjectType2String(const eSubjectType & type); -eSubjectType String2SubjectType(const string & type); - -// ==================================================================== -// operation on files - -/// @brief tools related to filesystem -/// @author rfree (maintainer) -class cFilesystemUtils { // if we do not want to use boost in given project (or we could optionally write boost here later) - public: - static bool CreateDirTree(const std::string & dir, bool only_below=false); - static char GetDirSeparatorSys(); /// < eg '/' or '\' - static char GetDirSeparatorInter(); /// < internal is '/' - static string FileInternalToSystem(const std::string &name); ///< converts from internal file name string to system file name string - static string FileSystemToInternal(const std::string &name); ///< converts from system file name string to internal file name string -}; - - -/// @brief utils to e.g. edit a file from console -/// @author rfree (maintainer) -class cEnvUtils { - int fd; - string mFilename; - - void GetTmpTextFile(); - void CloseFile(); - void OpenEditor(); - const string ReadFromTmpFile(); -public: - const string Compose(); - const string ReadFromFile(const string path); -}; -void hintingToTxt(std::fstream & file, string command, vector<string> &commands); -void generateQuestions (std::fstream & file, string command); -void generateAnswers (std::fstream & file, string command, vector<string> &completions); - -// ==================================================================== - -namespace nOper { // nOT::nUtils::nOper -// cool shortcut operators, like vector + vecotr operator working same as string (appending) -// isolated to namespace because it's unorthodox ide to implement this - -using namespace std; - -// TODO use && and move? -template <class T> -vector<T> operator+(const vector<T> &a, const vector<T> &b) { - vector<T> ret = a; - ret.insert( ret.end() , b.begin(), b.end() ); - return ret; -} - -template <class T> -vector<T> operator+(const T &a, const vector<T> &b) { - vector<T> ret(1,a); - ret.insert( ret.end() , b.begin(), b.end() ); - return ret; -} - -template <class T> -vector<T> operator+(const vector<T> &a, const T &b) { - vector<T> b_vector(1,a); - return a + b_vector; -} - -template <class T> -vector<T>& operator+=(vector<T> &a, const vector<T> &b) { - a.insert( a.end() , b.begin(), b.end() ); - return a; -} - -// map -template <class TK,class TV> -map<TK,TV> operator+(const map<TK,TV> &a, const map<TK,TV> &b) { - map<TK,TV> ret = a; - for (const auto & elem : b) { - ret.insert(elem); - } - return ret; -} - - -} // nOT::nUtils::nOper - -// ==================================================================== - -// ==================================================================== - -// Algorithms - -// ==================================================================== -// ==================================================================== - - -/** -@brief Special type that on creation will be initialized to have value INIT given as template argument. -Might be usefull e.g. to express in the declaration of class what will be the default value of member variable -See also http://www.boost.org/doc/libs/1_56_0/libs/utility/value_init.htm -Probably not needed when using boost in your project. -*/ -template <class T, T INIT> -class value_init { - private: - T data; - public: - value_init(); - - T& operator=(const T& v) { data=v; return *this; } - operator T const &() const { return data; } - operator T&() { return data; } -}; - -template <class T, T INIT> -value_init<T, INIT>::value_init() : data(INIT) { } - -} // namespace nUtils - -} // namespace nOT - - -// global namespace -extern nOT::nUtils::cLogger gCurrentLogger; ///< The current main logger. Usually do not use it directly, instead use macros like _dbg1 etc - -std::string GetObjectName(); ///< Method to return name of current object; To use in debug; Can be shadowed in your classes. (Might be not used currently) - -const extern int _dbg_ignore; ///< the global _dbg_ignore, but local code (blocks, classes etc) you could shadow it in your code blocks, -// to override debug compile-time setting for given block/class, e.g. to disable debug in one of your methods or increase it there. -// Or to make it runtime by providing a class normal member and editing it in runtime - -#define OT_CODE_STAMP ( nOT::nUtils::ToStr("[") + nOT::nUtils::nDetail::DbgShortenCodeFileName(__FILE__) + nOT::nUtils::ToStr("+") + nOT::nUtils::ToStr(__LINE__) + nOT::nUtils::ToStr(" ") + (GetObjectName()) + nOT::nUtils::ToStr("::") + nOT::nUtils::ToStr(__FUNCTION__) + nOT::nUtils::ToStr("]")) - - - - -#endif - diff --git a/contrib/otshell_utils/windows_stream.cpp b/contrib/otshell_utils/windows_stream.cpp deleted file mode 100644 index 59d8b12a3..000000000 --- a/contrib/otshell_utils/windows_stream.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#if defined(_WIN32)
-#include "windows_stream.h"
-#include <windows.h>
-
-windows_stream::windows_stream(unsigned int pLevel)
- :
- mLevel(pLevel)
-{
-}
-
-std::ostream& operator << (std::ostream &stream, windows_stream const& object)
-{
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
-
- if (object.mLevel >= 100)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 90)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 80)
- {
- SetConsoleTextAttribute(h_stdout, BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 75)
- {
- SetConsoleTextAttribute(h_stdout, BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 70)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 50)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 40)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 30)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 20)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE);
- return stream;
- }
-
- return stream;
-}
-
-#endif
diff --git a/contrib/otshell_utils/windows_stream.h b/contrib/otshell_utils/windows_stream.h deleted file mode 100644 index 859e7ee50..000000000 --- a/contrib/otshell_utils/windows_stream.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef WINDOWS_STREAM_H
-#define WINDOWS_STREAM_H
-
-#if defined(_WIN32)
-
-#include <string>
-#include <iostream>
-
-class windows_stream
-{
-public:
- windows_stream(unsigned int pLevel);
- friend std::ostream& operator<<(std::ostream &stream, windows_stream const& object);
-private:
- unsigned int mLevel = 0;
-};
-
-#endif // _WIN32
-
-#endif // WINDOWS_STREAM_H
|