Changeset c09c225 in nscp for modules/CheckDisk
- Timestamp:
- 09/25/08 19:58:20 (5 years ago)
- Branches:
- master, 0.4.0, 0.4.1, 0.4.2, stable
- Children:
- 7531979
- Parents:
- bb8b6d1
- Location:
- modules/CheckDisk
- Files:
-
- 2 edited
-
CheckDisk.cpp (modified) (5 diffs)
-
CheckDisk.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
modules/CheckDisk/CheckDisk.cpp
rbc97cd8 rc09c225 365 365 366 366 struct 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; 371 371 static const __int64 MSECS_TO_100NS = 10000; 372 372 373 373 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(); 376 376 } 377 377 bool matchFilter(const file_info &value) const { 378 if (( fileSize.hasFilter())&&(fileSize.matchFilter(value.ullSize)))378 if ((size.hasFilter())&&(size.matchFilter(value.ullSize))) 379 379 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))) 381 381 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))) 383 383 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))) 385 385 return true; 386 386 return false; 387 387 } 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 388 401 }; 389 402 … … 480 493 }; 481 494 495 496 497 struct 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 482 576 NSCAPI::nagiosReturn CheckDisk::getFileAge(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf) { 483 577 NSCAPI::nagiosReturn returnCode = NSCAPI::returnOK; … … 544 638 MAP_OPTIONS_BOOL_EX(_T("filter"), finder.bFilterIn, _T("in"), _T("out")) 545 639 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) 550 644 MAP_OPTIONS_MISSING(message, _T("Unknown argument: ")) 551 645 MAP_OPTIONS_END() … … 585 679 } 586 680 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 684 NSCAPI::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 587 771 NSCAPI::nagiosReturn CheckDisk::handleCommand(const strEx::blindstr command, const unsigned int argLen, TCHAR **char_args, std::wstring &msg, std::wstring &perf) { 588 772 if (command == _T("CheckFileSize")) { … … 592 776 } else if (command == _T("CheckFile")) { 593 777 return CheckFile(argLen, char_args, msg, perf); 778 } else if (command == _T("CheckFile2")) { 779 return CheckFile2(argLen, char_args, msg, perf); 594 780 } else if (command == _T("getFileAge")) { 595 781 return getFileAge(argLen, char_args, msg, perf); -
modules/CheckDisk/CheckDisk.h
re380ffe rc09c225 55 55 NSCAPI::nagiosReturn CheckDriveSize(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf); 56 56 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); 57 58 NSCAPI::nagiosReturn getFileAge(const unsigned int argLen, TCHAR **char_args, std::wstring &message, std::wstring &perf); 58 59
Note: See TracChangeset
for help on using the changeset viewer.








