Changeset 8988f9e in nscp


Ignore:
Timestamp:
08/01/10 13:55:49 (3 years ago)
Author:
Michael Medin <michael@…>
Branches:
master, 0.4.0, 0.4.1, 0.4.2
Children:
294b37b
Parents:
fe9cc46
Message:

Added in performance e data for NRPE and NSCA as well as added in debug build for the protocol buffer library lookup thingy

Files:
11 edited

Legend:

Unmodified
Added
Removed
  • CMakeLists.txt

    r5cd6bcf r8988f9e  
    3838IF(WIN32 AND MSVC) 
    3939  SET(PROTOBUF_INCLUDE_DIR "${PROTOBUF_DIR}/src" "Path to google protocol buffer source") 
    40   SET(PROTOBUF_LIBRARYDIR "${PROTOBUF_DIR}/vsprojects/x64/Release") 
     40  SET(PROTOBUF_LIBRARYDIR_RELEASE "${PROTOBUF_DIR}/vsprojects/x64/Release") 
     41  SET(PROTOBUF_LIBRARYDIR_DEBUG "${PROTOBUF_DIR}/vsprojects/x64/Debug") 
    4142  SET(PROTOBUF_BINARYDIR "${PROTOBUF_DIR}/vsprojects/debug") 
    4243ELSE(WIN32 AND MSVC) 
  • cmake/NSCPPBuffer.cmake

    racf0660 r8988f9e  
    3333  ) 
    3434 
    35   FIND_LIBRARY(PROTOBUF_LIBRARY NAMES protobuf libprotobuf 
     35  FIND_LIBRARY(PROTOBUF_LIBRARY_RELEASE  
     36  NAMES protobuf libprotobuf 
    3637    PATHS 
    3738    ${GNUWIN32_DIR}/lib 
     39  ${PROTOBUF_LIBRARYDIR_RELEASE} 
    3840  ${PROTOBUF_LIBRARYDIR} 
    3941  ) 
    40  
     42  FIND_LIBRARY(PROTOBUF_LIBRARY_DEBUG  
     43  NAMES protobuf libprotobuf 
     44    PATHS 
     45    ${GNUWIN32_DIR}/lib 
     46  ${PROTOBUF_LIBRARYDIR_DEBUG} 
     47  ${PROTOBUF_LIBRARYDIR} 
     48  ) 
     49  SET(PROTOBUF_LIBRARY 
     50    debug ${PROTOBUF_LIBRARY_DEBUG} 
     51    optimized ${PROTOBUF_LIBRARY_RELEASE} 
     52  ) 
     53   
     54   
    4155  FIND_PROGRAM(PROTOBUF_PROTOC_EXECUTABLE protoc) 
    4256  IF(NOT PROTOBUF_PROTOC_EXECUTABLE) 
  • include/nscapi/nscapi_core_wrapper.cpp

    racf0660 r8988f9e  
    2424 
    2525#include <nscapi/nscapi_core_wrapper.hpp> 
     26#include <nscapi/nscapi_plugin_wrapper.hpp> 
    2627#include <settings/macros.h> 
    2728#include <arrayBuffer.h> 
     
    134135      return NSCAPI::returnUNKNOWN; 
    135136    } 
    136     msg = to_wstring(rsp_msg.payload(0).message()); 
     137    ::PluginCommand::Response payload = rsp_msg.payload(0); 
     138    msg = to_wstring(payload.message()); 
     139    CORE_LOG_ERROR_STD(_T("Attempting to parse perf data")); 
     140    perf = to_wstring(::nscapi::functions::build_performance_data(payload)); 
     141    CORE_LOG_ERROR_STD(_T("Attempting to parse perf data: '") + perf + _T("'")); 
    137142  } 
    138143  return ret; 
  • include/nscapi/nscapi_plugin_wrapper.hpp

    rfe9cc46 r8988f9e  
    9494  extern helper_singleton* plugin_singleton; 
    9595 
     96  class functions { 
     97  public: 
     98    static PluginCommand::Response_Code nagios_to_gpb(int ret) { 
     99      if (ret == NSCAPI::returnOK) 
     100        return PluginCommand::Response_Code_OK; 
     101      if (ret == NSCAPI::returnWARN) 
     102        return PluginCommand::Response_Code_WARNING; 
     103      if (ret == NSCAPI::returnCRIT) 
     104        return PluginCommand::Response_Code_CRITCAL; 
     105      return PluginCommand::Response_Code_UNKNOWN; 
     106    } 
     107 
     108    static double trim_to_double(std::wstring s) { 
     109      std::wstring::size_type pend = s.find_first_not_of(_T("0123456789,.")); 
     110      if (pend != std::wstring::npos) 
     111        s = s.substr(0,pend); 
     112      strEx::replace(s, _T(","), _T(".")); 
     113      return strEx::stod(s); 
     114    } 
     115 
     116    static void parse_performance_data(PluginCommand::Response *resp, std::wstring &perf) { 
     117      strEx::splitList items = strEx::splitEx(perf, _T(" ")); 
     118      for (strEx::splitList::const_iterator cit = items.begin(); cit != items.end(); ++cit) { 
     119        strEx::splitVector items = strEx::splitV(*cit, _T(";")); 
     120        if (items.size() < 3) 
     121          break; 
     122 
     123        ::PluginCommand::PerformanceData* perfData = resp->add_perf(); 
     124        perfData->set_type(PluginCommand::PerformanceData_Type_FLOAT); 
     125        std::pair<std::wstring,std::wstring> fitem = strEx::split(items[0], _T("=")); 
     126        perfData->set_alias(to_string(fitem.first)); 
     127        ::PluginCommand::PerformanceData_FloatValue* floatPerfData = perfData->mutable_float_value(); 
     128 
     129        std::wstring::size_type pend = fitem.second.find_first_not_of(_T("0123456789,.")); 
     130        if (pend == std::wstring::npos) { 
     131          floatPerfData->set_value(trim_to_double(fitem.second.c_str())); 
     132        } else { 
     133          floatPerfData->set_value(trim_to_double(fitem.second.substr(0,pend).c_str())); 
     134          floatPerfData->set_unit(to_string(fitem.second.substr(pend))); 
     135        } 
     136        floatPerfData->set_warning(trim_to_double(items[1])); 
     137        floatPerfData->set_critical(trim_to_double(items[2])); 
     138        if (items.size() >= 5) { 
     139          floatPerfData->set_minimum(trim_to_double(items[3])); 
     140          floatPerfData->set_maximum(trim_to_double(items[4])); 
     141        } 
     142      } 
     143    } 
     144    static std::string build_performance_data(::PluginCommand::Response &payload) { 
     145      std::string ret; 
     146      for (int i=0;i<payload.perf_size();i++) { 
     147        ::PluginCommand::PerformanceData perfData = payload.perf(i); 
     148        if (!ret.empty()) 
     149          ret += " "; 
     150        ret += perfData.alias() + "="; 
     151        if (perfData.has_float_value()) { 
     152          ::PluginCommand::PerformanceData_FloatValue fval = perfData.float_value(); 
     153          ret += to_string(fval.value()); 
     154          if (fval.has_unit()) 
     155            ret += fval.unit(); 
     156          if (!fval.has_warning())  continue; 
     157          ret += ";" + to_string(fval.warning()); 
     158          if (!fval.has_critical()) continue; 
     159          ret += ";" + to_string(fval.critical()); 
     160          if (!fval.has_minimum())  continue; 
     161          ret += ";" + to_string(fval.minimum()); 
     162          if (!fval.has_maximum())  continue; 
     163          ret += ";" + to_string(fval.maximum()); 
     164        } 
     165      } 
     166      return ret; 
     167    } 
     168  }; 
     169 
    96170  namespace impl { 
    97171 
     
    108182 
    109183          ::PluginCommand::Response payload = message.payload().Get(0); 
     184           
    110185          std::list<std::wstring> args; 
    111186          for (int i=0;i<payload.arguments_size();i++) { 
    112187            args.push_back(to_wstring(payload.arguments(i))); 
    113188          } 
    114           std::wstring msg = to_wstring(payload.message()), perf; 
     189          std::wstring msg = to_wstring(payload.message()); 
     190          std::wstring perf = to_wstring(::nscapi::functions::build_performance_data(payload)); 
    115191          NSCAPI::nagiosReturn ret = handleSimpleNotification(channel, command, code, msg, perf); 
    116192        } catch (std::exception &e) { 
     
    155231        resp->set_command(to_string(command)); 
    156232        resp->set_message(to_string(msg)); 
     233        ::nscapi::functions::parse_performance_data(resp, perf); 
     234 
    157235        resp->set_version(PluginCommand::Response_Version_VERSION_1); 
    158         if (ret == NSCAPI::returnOK) 
    159           resp->set_result(PluginCommand::Response_Code_OK); 
    160         else if (ret == NSCAPI::returnWARN) 
    161           resp->set_result(PluginCommand::Response_Code_WARNING); 
    162         else if (ret == NSCAPI::returnCRIT) 
    163           resp->set_result(PluginCommand::Response_Code_CRITCAL); 
    164         else  
    165           resp->set_result(PluginCommand::Response_Code_UNKNOWN); 
    166  
     236        resp->set_result(nscapi::functions::nagios_to_gpb(ret)); 
    167237        response_message.SerializeToString(&response); 
    168238        return ret; 
  • include/strEx.h

    r5735dda r8988f9e  
    552552 
    553553  typedef std::list<std::wstring> splitList; 
    554   inline splitList splitEx(std::wstring str, std::wstring key) { 
     554  inline splitList splitEx(const std::wstring str, const std::wstring key) { 
    555555    splitList ret; 
     556    std::wstring::size_type pos = 0, lpos = 0; 
     557    while ((pos = str.find(key, pos)) !=  std::wstring::npos) { 
     558      ret.push_back(str.substr(lpos, pos-lpos)); 
     559      lpos = ++pos; 
     560    } 
     561    if (lpos < str.size()) 
     562      ret.push_back(str.substr(lpos)); 
     563    return ret; 
     564  } 
     565  typedef std::vector<std::wstring> splitVector; 
     566  inline splitVector splitV(const std::wstring str, const std::wstring key) { 
     567    splitVector ret; 
    556568    std::wstring::size_type pos = 0, lpos = 0; 
    557569    while ((pos = str.find(key, pos)) !=  std::wstring::npos) { 
  • libs/protobuf/plugin.proto

    r40970de r8988f9e  
    3737  message IntValue { 
    3838    required int64 value = 1; 
    39     required int64 maximum = 2; 
    40     required int64 minimum = 3; 
    41     required string unit = 4; 
     39    optional string unit = 2; 
     40    optional int64 warning = 3; 
     41    optional int64 critical = 4; 
     42    optional int64 minimum = 6; 
     43    optional int64 maximum = 7; 
    4244  } 
    4345  message StringValue { 
     
    4547  } 
    4648  message FloatValue { 
    47     required float value = 1; 
    48     required float maximum = 2; 
    49     required float minimum = 3; 
    50     required string unit = 4; 
     49    required double value = 1; 
     50    optional string unit = 2; 
     51    optional double warning = 3; 
     52    optional double critical = 4; 
     53    optional double minimum = 6; 
     54    optional double maximum = 7; 
    5155  } 
    5256  required string alias = 1; 
  • modules/NRPEServer/NRPEServer.h

    rcad08fb r8988f9e  
    5454  std::wstring getModuleName() { 
    5555#ifdef USE_SSL 
    56     return _T("NRPE server (w/ SSL)"); 
     56    return _T("NRPE server"); 
    5757#else 
    58     return _T("NRPE server"); 
     58    return _T("NRPE server (no SSL)"); 
    5959#endif 
    6060  } 
  • modules/NRPEServer/nrpe_handler.cpp

    rcad08fb r8988f9e  
    3333      NSCAPI::nagiosReturn ret = -3; 
    3434      try { 
     35        NSC_DEBUG_MSG_STD(_T("Running command: ") + cmd.first); 
    3536        ret = nscapi::plugin_singleton->get_core()->InjectSplitAndCommand(cmd.first, cmd.second, '!', msg, perf); 
     37        NSC_DEBUG_MSG_STD(_T("Running command: ") + cmd.first + _T(" = ") + msg); 
    3638      } catch (...) { 
    3739        return nrpe::packet::create_response(NSCAPI::returnUNKNOWN, _T("UNKNOWN: Internal exception"), p.get_payload_length()); 
     
    5052        return nrpe::packet::create_response(NSCAPI::returnUNKNOWN, _T("UNKNOWN: Internal error."), p.get_payload_length()); 
    5153      } 
    52       if (msg.length() >= p.get_payload_length()-1) { 
     54      std::wstring data = msg; 
     55      if (!perf.empty()&&!noPerfData_) { 
     56        data += _T("|") + perf; 
     57      } 
     58      if (data.length() >= p.get_payload_length()-1) { 
    5359        NSC_LOG_ERROR(_T("Truncating returndata as it is bigger then NRPE allowes :(")); 
    54         msg = msg.substr(0,p.get_payload_length()-2); 
     60        data = data.substr(0,p.get_payload_length()-2); 
    5561      } 
    56       if (perf.empty()||noPerfData_) { 
    57         return nrpe::packet::create_response(ret, msg, p.get_payload_length()); 
    58       } else { 
    59         return nrpe::packet::create_response(ret, msg + _T("|") + perf, p.get_payload_length()); 
    60       } 
     62      return nrpe::packet::create_response(ret, data, p.get_payload_length()); 
    6163    } 
    6264  } 
  • modules/NRPEServer/nrpe_handler.hpp

    r40970de r8988f9e  
    1111    public: 
    1212      handler(unsigned int payload_length)  
    13         : payload_length_(payload_length) 
     13        : payload_length_(payload_length), noPerfData_(false) 
    1414      {} 
    1515      handler(const handler &other) { 
  • modules/NRPEServer/nrpe_server.cpp

    rf6fbf6f r8988f9e  
    77#include <vector> 
    88 
     9 
    910namespace nrpe { 
    1011  namespace server { 
     12 
     13    namespace ip = boost::asio::ip; 
     14 
    1115    server::server(const std::string& address, const std::string& port, 
    1216      const std::string& doc_root, std::size_t thread_pool_size) 
     
    1822    { 
    1923      // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). 
    20       boost::asio::ip::tcp::resolver resolver(io_service_); 
    21       boost::asio::ip::tcp::resolver::query query(address, port); 
    22       boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
    23       boost::asio::ip::tcp::resolver::iterator end; 
     24      ip::tcp::resolver resolver(io_service_); 
     25      ip::tcp::resolver::iterator endpoint_iterator; 
     26      if (address.empty()) { 
     27        endpoint_iterator = resolver.resolve(ip::tcp::resolver::query(port)); 
     28      } else { 
     29        endpoint_iterator = resolver.resolve(ip::tcp::resolver::query(address, port)); 
     30      } 
     31      ip::tcp::resolver::iterator end; 
    2432      if (endpoint_iterator == end) { 
    2533        std::cout << "Failed to lookup: " << address << ":" << port << std::endl; 
    2634      } 
    27       boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator; 
     35      ip::tcp::endpoint endpoint = *endpoint_iterator; 
    2836      std::cout << "Binding to: " << address << ":" << port << std::endl; 
    2937      acceptor_.open(endpoint.protocol()); 
    30       acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); 
     38      acceptor_.set_option(ip::tcp::acceptor::reuse_address(true)); 
    3139      acceptor_.bind(endpoint); 
    3240      acceptor_.listen(); 
     
    6371      std::cout << "accept: " << e.message() << std::endl; 
    6472      if (!e) { 
     73        std::string s = new_connection_->socket().remote_endpoint().address().to_string(); 
     74        std::cout << "Connecting from: " << s <<std::endl; 
     75 
    6576        new_connection_->start(); 
    6677        new_connection_.reset(new connection(io_service_, request_handler_)); 
  • modules/NSCAAgent/NSCAAgent.cpp

    rcad08fb r8988f9e  
    116116    boost::asio::io_service io_service; 
    117117    NSC_DEBUG_MSG_STD(_T("* * *NSCA * * * message: ") + msg); 
     118    NSC_DEBUG_MSG_STD(_T("* * *NSCA * * * påerformance: ") + perf); 
    118119    nsca::socket socket(io_service); 
    119120    socket.connect(nscahost_, nscaport_); 
     
    121122    packet.code = code; 
    122123    packet.host = "hello"; 
    123     packet.result = to_string(msg); 
     124    packet.result = to_string(msg) + "|" + to_string(perf); 
    124125    socket.recv_iv(password_, encryption_method_, boost::posix_time::seconds(timeout_)); 
    125126    socket.send_nsca(packet, boost::posix_time::seconds(timeout_)); 
Note: See TracChangeset for help on using the changeset viewer.