00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "XrdMon/XrdMonArgParser.hh"
00014 #include "XrdMon/XrdMonArgParserConvert.hh"
00015 #include "XrdMon/XrdMonCommon.hh"
00016 #include "XrdMon/XrdMonTypes.hh"
00017 #include "XrdMon/XrdMonUtils.hh"
00018 #include "XrdMon/XrdMonCtrArchiver.hh"
00019 #include "XrdMon/XrdMonCtrDebug.hh"
00020 #include "XrdMon/XrdMonCtrCollector.hh"
00021 #include "XProtocol/XPtypes.hh"
00022 #include "XrdSys/XrdSysHeaders.hh"
00023
00024 #include <iomanip>
00025 using std::cerr;
00026 using std::cout;
00027 using std::endl;
00028 using std::setfill;
00029 using std::setw;
00030 using namespace XrdMonArgParserConvert;
00031
00032 const bool defaultOnlineDecOn = true;
00033 const bool defaultRTOn = true;
00034 const char* defaultCtrLogDir = "./logs/collector";
00035 const char* defaultDecLogDir = "./logs/decoder";
00036 const char* defaultRTLogDir = "./logs/rt";
00037 const int defaultDecHDFlushDelay = 600;
00038 const int defaultDecRTFlushDelay = 5;
00039 const kXR_int64 defaultMaxCtrLogSize = 1024*1024*1024;
00040 const kXR_int32 defaultCtrBufSize = 64*1024;
00041 const int defaultRTBufSize = 128*1024;
00042
00043 void
00044 printHelp()
00045 {
00046 cout << "\nxrdmonCollector\n"
00047 << " [-onlineDec <on|off>]\n"
00048 << " [-rt <on|off>]\n"
00049 << " [-ctrLogDir <path>]\n"
00050 << " [-decLogDir <path>]\n"
00051 << " [-rtLogDir <path>]\n"
00052 << " [-decHDFlushDelay <value>]\n"
00053 << " [-maxCtrLogSize <value>]\n"
00054 << " [-ctrBufSize <value>]\n"
00055 << " [-rtBufSize <value>]\n"
00056 << " [-port <portNr>]\n"
00057 << " [-ver]\n"
00058 << " [-help]\n"
00059 << "\n"
00060 << "-onlineDec <on|off> Turns on/off online decoding.\n"
00061 << " Default value is \"" << (defaultOnlineDecOn?"on":"off") << "\".\n"
00062 << "-rt <on|off> Turns on/off real time monitoring. Online decoding has to be\n"
00063 << " Default value is \"" << (defaultRTOn?"on":"off") << "\".\n"
00064 << "-ctrLogDir <path> Directory where collector's log file are stored.\n"
00065 << " Default value is \"" << defaultCtrLogDir << "\".\n"
00066 << "-decLogDir <path> Directory where decoder's log file are stored.\n"
00067 << " Default value is \"" << defaultDecLogDir << "\".\n"
00068 << "-rtLogDir <path> Directory where real time log file are stored.\n"
00069 << " Default value is \"" << defaultRTLogDir << "\".\n"
00070 << "-decHDFlushDelay <delay> Value in sec specifying how often history data is\n"
00071 << " flushed to collector's log files. History data means\n"
00072 << " the data corresponding to *closed* sessions and files.\n"
00073 << " Default value is \"" << defaultDecHDFlushDelay << "\".\n"
00074 << "-decRTFlushDelay <delay> Value in sec specifying how often real time data is\n"
00075 << " flushed to log file.\n"
00076 << " Default value is \"" << defaultDecRTFlushDelay << "\".\n"
00077 << "-maxCtrLogSize <size> Max size of collector's log file.\n"
00078 << " Default value is \"" << defaultMaxCtrLogSize << "\".\n"
00079 << "-ctrBufSize <size> Size of transient buffer of collected packets. It has to be\n"
00080 << " larger than or equal to max page size (64K).\n"
00081 << " Default value is \"" << defaultCtrBufSize << "\".\n"
00082 << "-rtBufSize <size> Size of transient buffer of collected real time data.\n"
00083 << " Default value is \"" << defaultRTBufSize << "\".\n"
00084 << "-port <portNr> Port number to be used.\n"
00085 << " Default valus is \"" << DEFAULT_PORT << "\".\n"
00086 << "-ver Reports version and exits. Don't specify any other\n"
00087 << " option with this one.\n"
00088 << endl;
00089 }
00090
00091 int main(int argc, char* argv[])
00092 {
00093 XrdMonCtrDebug::initialize();
00094
00095 if ( argc == 2 && !strcmp(argv[1], "-ver") ) {
00096 cout << "v\t" << setw(3) << setfill('0') << XRDMON_VERSION << endl;
00097 return 0;
00098 }
00099
00100 XrdMonArgParser::ArgImpl<bool, ConvertOnOff>
00101 arg_onlineDecOn("-onlineDec", defaultOnlineDecOn);
00102 XrdMonArgParser::ArgImpl<bool, ConvertOnOff>
00103 arg_rtOn ("-rt", defaultRTOn);
00104 XrdMonArgParser::ArgImpl<const char*, Convert2String>
00105 arg_ctrLogDir ("-ctrLogDir", defaultCtrLogDir);
00106 XrdMonArgParser::ArgImpl<const char*, Convert2String>
00107 arg_decLogDir ("-decLogDir", defaultDecLogDir);
00108 XrdMonArgParser::ArgImpl<const char*, Convert2String>
00109 arg_rtLogDir ("-rtLogDir", defaultRTLogDir);
00110 XrdMonArgParser::ArgImpl<int, Convert2Int>
00111 arg_decRTFlushDel("-decRTFlushDelay", defaultDecRTFlushDelay);
00112 XrdMonArgParser::ArgImpl<int, Convert2Int>
00113 arg_decHDFlushDel("-decHDFlushDelay", defaultDecHDFlushDelay);
00114 XrdMonArgParser::ArgImpl<kXR_int64, Convert2LL>
00115 arg_maxFSize ("-maxCtrLogSize", defaultMaxCtrLogSize);
00116 XrdMonArgParser::ArgImpl<int, Convert2Int>
00117 arg_ctrBufSize("-ctrBufSize", defaultCtrBufSize);
00118 XrdMonArgParser::ArgImpl<int, Convert2Int>
00119 arg_port("-port", DEFAULT_PORT);
00120 XrdMonArgParser::ArgImpl<int, Convert2Int>
00121 arg_rtBufSize ("-maxCtrLogSize", defaultRTBufSize);
00122
00123 try {
00124 XrdMonArgParser argParser;
00125 argParser.registerExpectedArg(&arg_onlineDecOn);
00126 argParser.registerExpectedArg(&arg_rtOn);
00127 argParser.registerExpectedArg(&arg_ctrLogDir);
00128 argParser.registerExpectedArg(&arg_decLogDir);
00129 argParser.registerExpectedArg(&arg_rtLogDir);
00130 argParser.registerExpectedArg(&arg_decRTFlushDel);
00131 argParser.registerExpectedArg(&arg_decHDFlushDel);
00132 argParser.registerExpectedArg(&arg_maxFSize);
00133 argParser.registerExpectedArg(&arg_ctrBufSize);
00134 argParser.registerExpectedArg(&arg_port);
00135 argParser.registerExpectedArg(&arg_rtBufSize);
00136 argParser.parseArguments(argc, argv);
00137 } catch (XrdMonException& e) {
00138 e.printIt();
00139 printHelp();
00140 return 1;
00141 }
00142 if ( arg_onlineDecOn.myVal() == false && arg_rtOn.myVal() ) {
00143 cerr << "\nError: you can not turn on rt monitoring if"
00144 << " online decoding is off." << endl;
00145 printHelp();
00146 return 1;
00147 }
00148 if ( arg_ctrBufSize.myVal() < 64*1024 ) {
00149 cerr << "\nError: collector's buffer size too small" << endl;
00150 printHelp();
00151 return 2;
00152 }
00153 if ( arg_port.myVal() < 1 ) {
00154 cerr << "\nError: invalid port number" << endl;
00155 printHelp();
00156 return 3;
00157 }
00158
00159 cout << "online decoding is " << (arg_onlineDecOn.myVal()?"on":"off") <<'\n'
00160 << "rt monitoring is " << (arg_rtOn.myVal()?"on":"off") << '\n'
00161 << "ctrLogDir is " << arg_ctrLogDir.myVal() << '\n'
00162 << "decLogDir is " << arg_decLogDir.myVal() << '\n'
00163 << "rtLogDir is " << arg_rtLogDir.myVal() << '\n'
00164 << "decRTFlushDelay is " << arg_decRTFlushDel.myVal() << '\n'
00165 << "decHDFlushDelay is " << arg_decHDFlushDel.myVal() << '\n'
00166 << "maxCtrLogSize is " << arg_maxFSize.myVal() << '\n'
00167 << "ctrBufSize is " << arg_ctrBufSize.myVal() << '\n'
00168 << "rtBufSize is " << arg_rtBufSize.myVal() << '\n'
00169 << "port is " << arg_port.myVal()
00170 << endl;
00171
00172 try {
00173 mkdirIfNecessary(arg_ctrLogDir.myVal());
00174 XrdMonCtrArchiver::_decHDFlushDelay= arg_decHDFlushDel.myVal();
00175 if ( arg_onlineDecOn.myVal() ) {
00176 mkdirIfNecessary(arg_decLogDir.myVal());
00177 if ( arg_rtOn.myVal() ) {
00178 mkdirIfNecessary(arg_rtLogDir.myVal());
00179 XrdMonCtrArchiver::_decRTFlushDelay= arg_decRTFlushDel.myVal();
00180 }
00181 }
00182 } catch (XrdMonException& e) {
00183 e.printIt();
00184 return 2;
00185 }
00186 XrdMonCtrCollector::port = arg_port.myVal();
00187
00188
00189 pthread_t recThread;
00190 if ( 0 != pthread_create(&recThread,
00191 0,
00192 receivePackets,
00193 0) ) {
00194 cerr << "Failed to create a collector thread" << endl;
00195 return 1;
00196 }
00197
00198 try {
00199
00200 XrdMonCtrArchiver archiver(arg_ctrLogDir.myVal(),
00201 arg_decLogDir.myVal(),
00202 arg_rtLogDir.myVal(),
00203 arg_maxFSize.myVal(),
00204 arg_ctrBufSize.myVal(),
00205 arg_rtBufSize.myVal(),
00206 arg_onlineDecOn.myVal(),
00207 arg_rtOn.myVal());
00208 archiver();
00209 } catch (XrdMonException& e) {
00210 e.printIt();
00211 return 2;
00212 }
00213
00214 return 0;
00215 }
00216
00217