Changeset c09c225 in nscp for modules/CheckDisk


Ignore:
Timestamp:
09/25/08 19:58:20 (5 years ago)
Author:
Michael Medin <michael@…>
Branches:
master, 0.4.0, 0.4.1, 0.4.2, stable
Children:
7531979
Parents:
bb8b6d1
Message:

2008-09-24 MickeM - 0.3.5

  • Fixed issue with CheckServiceState and CheckAll? (it now works) + Added new check: CheckFile2 which has the same syntax as the event log filtering.

Usage: CheckFile2 file=c:\test\*.txt filter=in filter+creation=<24h "syntax=%filename% was created %creation%" MinWarn=0 MinCrit=0

Location:
modules/CheckDisk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • modules/CheckDisk/CheckDisk.cpp

    rbc97cd8 rc09c225  
    365365 
    366366struct file_filter { 
    367   filters::filter_all_numeric<unsigned long long, checkHolders::disk_size_handler<checkHolders::disk_size_type> > fileSize; 
    368   filters::filter_all_times fileCreation; 
    369   filters::filter_all_times fileAccessed; 
    370   filters::filter_all_times fileWritten; 
     367  filters::filter_all_numeric<unsigned long long, checkHolders::disk_size_handler<checkHolders::disk_size_type> > size; 
     368  filters::filter_all_times creation; 
     369  filters::filter_all_times accessed; 
     370  filters::filter_all_times written; 
    371371  static const __int64 MSECS_TO_100NS = 10000; 
    372372 
    373373  inline bool hasFilter() { 
    374     return fileSize.hasFilter() || fileCreation.hasFilter() ||  
    375       fileAccessed.hasFilter() || fileWritten.hasFilter(); 
     374    return size.hasFilter() || creation.hasFilter() ||  
     375      accessed.hasFilter() || written.hasFilter(); 
    376376  } 
    377377  bool matchFilter(const file_info &value) const { 
    378     if ((fileSize.hasFilter())&&(fileSize.matchFilter(value.ullSize))) 
     378    if ((size.hasFilter())&&(size.matchFilter(value.ullSize))) 
    379379      return true; 
    380     else if ((fileCreation.hasFilter())&&(fileCreation.matchFilter((value.ullNow-value.ullCreationTime)/MSECS_TO_100NS))) 
     380    else if ((creation.hasFilter())&&(creation.matchFilter((value.ullNow-value.ullCreationTime)/MSECS_TO_100NS))) 
    381381      return true; 
    382     else if ((fileAccessed.hasFilter())&&(fileAccessed.matchFilter((value.ullNow-value.ullLastAccessTime)/MSECS_TO_100NS))) 
     382    else if ((accessed.hasFilter())&&(accessed.matchFilter((value.ullNow-value.ullLastAccessTime)/MSECS_TO_100NS))) 
    383383      return true; 
    384     else if ((fileWritten.hasFilter())&&(fileWritten.matchFilter((value.ullNow-value.ullLastWriteTime)/MSECS_TO_100NS))) 
     384    else if ((written.hasFilter())&&(written.matchFilter((value.ullNow-value.ullLastWriteTime)/MSECS_TO_100NS))) 
    385385      return true; 
    386386    return false; 
    387387  } 
     388 
     389  std::wstring getValue() const { 
     390    if (size.hasFilter()) 
     391      return _T("size: ") + size.getValue(); 
     392    if (creation.hasFilter()) 
     393      return _T("creation: ") + creation.getValue(); 
     394    if (accessed.hasFilter()) 
     395      return _T("accessed: ") + accessed.getValue(); 
     396    if (written.hasFilter()) 
     397      return _T("written: ") + written.getValue(); 
     398    return _T("UNknown..."); 
     399  } 
     400 
    388401}; 
    389402 
     
    480493}; 
    481494 
     495 
     496 
     497struct file_filter_function_ex : public baseFinderFunction 
     498{ 
     499  static const int filter_plus = 1; 
     500  static const int filter_minus = 2; 
     501  static const int filter_normal = 3; 
     502 
     503  typedef std::pair<int,file_filter> filteritem_type; 
     504  typedef std::list<filteritem_type > filterlist_type; 
     505  filterlist_type filter_chain; 
     506  bool bFilterAll; 
     507  bool bFilterIn; 
     508  bool error; 
     509  bool debug_; 
     510  std::wstring message; 
     511  std::wstring syntax; 
     512  std::wstring alias; 
     513  unsigned long long now; 
     514  unsigned int hit_count; 
     515 
     516  file_filter_function_ex() : hit_count(0), error(false), debug_(false), bFilterIn(true), bFilterAll(true) {} 
     517  result_type operator()(argument_type ffd) { 
     518    if ((ffd.wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) 
     519      return true; 
     520    BY_HANDLE_FILE_INFORMATION _info; 
     521 
     522    HANDLE hFile = CreateFile((ffd.path + _T("\\") + ffd.wfd.cFileName).c_str(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
     523      0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); 
     524    if (hFile == INVALID_HANDLE_VALUE) { 
     525      setError(_T("Could not open file: ") + ffd.path + _T("\\") + ffd.wfd.cFileName + _T(": ") + error::lookup::last_error()); 
     526    } 
     527    GetFileInformationByHandle(hFile, &_info); 
     528    CloseHandle(hFile); 
     529    file_info info(_info, ffd.wfd.cFileName); 
     530    info.ullNow = now; 
     531 
     532    bool bMatch = !bFilterIn; 
     533    for (filterlist_type::const_iterator cit3 = filter_chain.begin(); cit3 != filter_chain.end(); ++cit3 ) { 
     534      bool bTmpMatched = (*cit3).second.matchFilter(info); 
     535      int mode = (*cit3).first; 
     536 
     537      if ((mode == filter_minus)&&(bTmpMatched)) { 
     538        // a -<filter> hit so thrash item and bail out! 
     539        //if (debug_) 
     540          NSC_DEBUG_MSG_STD(_T("Matched: - ") + (*cit3).second.getValue() + _T(" for: ") + info.render(syntax)); 
     541        bMatch = false; 
     542        break; 
     543      } else if ((mode == filter_plus)&&(!bTmpMatched)) { 
     544        // a +<filter> missed hit so thrash item and bail out! 
     545        //if (debug_) 
     546          NSC_DEBUG_MSG_STD(_T("Matched (missed): + ") + (*cit3).second.getValue() + _T(" for: ") + info.render(syntax)); 
     547        bMatch = false; 
     548        break; 
     549      } else if (bTmpMatched) { 
     550        if (debug_) 
     551          NSC_DEBUG_MSG_STD(_T("Matched: . (contiunue): ") + (*cit3).second.getValue() + _T(" for: ") + info.render(syntax)); 
     552        bMatch = true; 
     553      } 
     554    } 
     555 
     556    NSC_DEBUG_MSG_STD(_T("result: ") + strEx::itos(bFilterIn) + _T(" -- ") + strEx::itos(bMatch)); 
     557    if ((bFilterIn&&bMatch)||(!bFilterIn&&!bMatch)) { 
     558      strEx::append_list(message, info.render(syntax)); 
     559      if (alias.length() < 16) 
     560        strEx::append_list(alias, info.filename); 
     561      else 
     562        strEx::append_list(alias, std::wstring(_T("..."))); 
     563      hit_count++; 
     564    } 
     565    return true; 
     566  } 
     567  inline const bool hasError() const { 
     568    return error; 
     569  } 
     570  inline void setError(std::wstring) { 
     571    error = true; 
     572  } 
     573}; 
     574 
     575 
    482576NSCAPI::nagiosReturn CheckDisk::getFileAge(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf) { 
    483577  NSCAPI::nagiosReturn returnCode = NSCAPI::returnOK; 
     
    544638      MAP_OPTIONS_BOOL_EX(_T("filter"), finder.bFilterIn, _T("in"), _T("out")) 
    545639      MAP_OPTIONS_BOOL_EX(_T("filter"), finder.bFilterAll, _T("all"), _T("any")) 
    546       MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-size"), fileSize, finder.filter_chain) 
    547       MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-creation"), fileCreation, finder.filter_chain) 
    548       MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-written"), fileWritten, finder.filter_chain) 
    549       MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-accessed"), fileAccessed, finder.filter_chain) 
     640      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-size"), size, finder.filter_chain) 
     641      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-creation"), creation, finder.filter_chain) 
     642      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-written"), written, finder.filter_chain) 
     643      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-accessed"), accessed, finder.filter_chain) 
    550644      MAP_OPTIONS_MISSING(message, _T("Unknown argument: ")) 
    551645      MAP_OPTIONS_END() 
     
    585679} 
    586680 
     681#define MAP_FILTER(value, obj, filtermode) \ 
     682      else if (p__.first == value) { file_filter filter; filter.obj = p__.second; finder.filter_chain.push_back(filteritem_type(file_filter_function_ex::filtermode, filter)); } 
     683 
     684NSCAPI::nagiosReturn CheckDisk::CheckFile2(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf) { 
     685  NSCAPI::nagiosReturn returnCode = NSCAPI::returnOK; 
     686  std::list<std::wstring> stl_args = arrayBuffer::arrayBuffer2list(argLen, char_args); 
     687  typedef checkHolders::CheckContainer<checkHolders::MaxMinBoundsUInteger> CheckFileContainer; 
     688  typedef std::pair<int,file_filter> filteritem_type; 
     689  typedef std::list<filteritem_type > filterlist_type; 
     690  if (stl_args.empty()) { 
     691    message = _T("Missing argument(s)."); 
     692    return NSCAPI::returnUNKNOWN; 
     693  } 
     694  file_filter_function_ex finder; 
     695  PathContainer tmpObject; 
     696  std::list<std::wstring> paths; 
     697  unsigned int truncate = 0; 
     698  CheckFileContainer query; 
     699  std::wstring syntax = _T("%filename%"); 
     700  std::wstring alias; 
     701  bool bPerfData = true; 
     702 
     703  try { 
     704    MAP_OPTIONS_BEGIN(stl_args) 
     705      MAP_OPTIONS_NUMERIC_ALL(query, _T("")) 
     706      MAP_OPTIONS_STR2INT(_T("truncate"), truncate) 
     707      MAP_OPTIONS_BOOL_FALSE(IGNORE_PERFDATA, bPerfData) 
     708      MAP_OPTIONS_STR(_T("syntax"), syntax) 
     709      MAP_OPTIONS_PUSH(_T("path"), paths) 
     710      MAP_OPTIONS_STR(_T("alias"), alias) 
     711      MAP_OPTIONS_PUSH(_T("file"), paths) 
     712      MAP_OPTIONS_BOOL_EX(_T("filter"), finder.bFilterIn, _T("in"), _T("out")) 
     713      MAP_OPTIONS_BOOL_EX(_T("filter"), finder.bFilterAll, _T("all"), _T("any")) 
     714      /* 
     715      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-size"), fileSize, finder.filter_chain) 
     716      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-creation"), fileCreation, finder.filter_chain) 
     717      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-written"), fileWritten, finder.filter_chain) 
     718      MAP_OPTIONS_PUSH_WTYPE(file_filter, _T("filter-accessed"), fileAccessed, finder.filter_chain) 
     719      */ 
     720 
     721      MAP_FILTER(_T("filter+size"), size, filter_plus) 
     722      MAP_FILTER(_T("filter+creation"), creation, filter_plus) 
     723      MAP_FILTER(_T("filter+written"), written, filter_plus) 
     724      MAP_FILTER(_T("filter+accessed"), accessed, filter_plus) 
     725 
     726      MAP_FILTER(_T("filter.size"), size, filter_normal) 
     727      MAP_FILTER(_T("filter.creation"), creation, filter_normal) 
     728      MAP_FILTER(_T("filter.written"), written, filter_normal) 
     729      MAP_FILTER(_T("filter.accessed"), accessed, filter_normal) 
     730 
     731      MAP_FILTER(_T("filter-size"), size, filter_minus) 
     732      MAP_FILTER(_T("filter-creation"), creation, filter_minus) 
     733      MAP_FILTER(_T("filter-written"), written, filter_minus) 
     734      MAP_FILTER(_T("filter-accessed"), accessed, filter_minus) 
     735 
     736      MAP_OPTIONS_MISSING(message, _T("Unknown argument: ")) 
     737      MAP_OPTIONS_END() 
     738  } catch (filters::parse_exception e) { 
     739    message = e.getMessage(); 
     740    return NSCAPI::returnUNKNOWN; 
     741  } catch (filters::filter_exception e) { 
     742    message = e.getMessage(); 
     743    return NSCAPI::returnUNKNOWN; 
     744    } 
     745    FILETIME now; 
     746    GetSystemTimeAsFileTime(&now); 
     747    finder.now = ((now.dwHighDateTime * ((unsigned long long)MAXDWORD+1)) + (unsigned long long)now.dwLowDateTime); 
     748    finder.syntax = syntax; 
     749    for (std::list<std::wstring>::const_iterator pit = paths.begin(); pit != paths.end(); ++pit) { 
     750      recursive_scan<file_filter_function_ex>((*pit), finder); 
     751      if (finder.hasError()) { 
     752        message = _T("Error when scanning: ") + (*pit); 
     753        return NSCAPI::returnUNKNOWN; 
     754      } 
     755    } 
     756    message = finder.message; 
     757    if (!alias.empty()) 
     758      query.alias = alias; 
     759    else 
     760      query.alias = finder.alias; 
     761    if (query.alias.empty()) 
     762      query.alias = _T("no files found"); 
     763    query.runCheck(finder.hit_count, returnCode, message, perf); 
     764    if ((truncate > 0) && (message.length() > (truncate-4))) 
     765      message = message.substr(0, truncate-4) + _T("..."); 
     766    if (message.empty()) 
     767      message = _T("CheckFile ok"); 
     768    return returnCode; 
     769} 
     770 
    587771NSCAPI::nagiosReturn CheckDisk::handleCommand(const strEx::blindstr command, const unsigned int argLen, TCHAR **char_args, std::wstring &msg, std::wstring &perf) { 
    588772  if (command == _T("CheckFileSize")) { 
     
    592776  } else if (command == _T("CheckFile")) { 
    593777    return CheckFile(argLen, char_args, msg, perf); 
     778  } else if (command == _T("CheckFile2")) { 
     779    return CheckFile2(argLen, char_args, msg, perf); 
    594780  } else if (command == _T("getFileAge")) { 
    595781    return getFileAge(argLen, char_args, msg, perf); 
  • modules/CheckDisk/CheckDisk.h

    re380ffe rc09c225  
    5555  NSCAPI::nagiosReturn CheckDriveSize(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf); 
    5656  NSCAPI::nagiosReturn CheckFile(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf); 
     57  NSCAPI::nagiosReturn CheckFile2(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf); 
    5758  NSCAPI::nagiosReturn getFileAge(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf); 
    5859 
Note: See TracChangeset for help on using the changeset viewer.