/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ /* * 2003-nov-05 PB makeLogFileName: use constants, use /tmp if RMANHOME env var not defined * 2005-sep-05 PB parseCommandLine(): exit -2 on help * 2006-apr-21 PB added debug output */ using namespace std; #include #include #include #include #include #include #include "debug.hh" // ENTER, LEAVE, TALK #include "globals.hh" // DEFAULT_PORT, LOGDIR, ALT_LOGDIR, LOG_SUFFIX #include "rasserver_config.hh" #include "storagemgr/sstoragelayout.hh" #include "servercomm/httpserver.hh" Configuration configuration; Configuration::Configuration() { logToStdOut = true; logFileName = 0; } bool Configuration::parseCommandLine(int argc, char** argv) { CommandLineParser &cmlInter = CommandLineParser::getInstance(); initParameters(); try { myExecutable = argv[0]; cmlInter.processCommandLine(argc, argv); if(cmlHelp->isPresent()) { printHelp(); exit( -2 ); // Unix code for 'help' -- PB 2005-sep-18 } checkParameters(); } catch(CmlException &ex) { cout<<"Error: " << ex.what()< rasserver instance name"); cmlPort = &cmlInter.addStringParameter(NSN, "lport", " rasserver listen port (RPC or HTTP)"); cmlMgr = &cmlInter.addStringParameter(NSN, "mgr", " name of RasMGR host", DEFAULT_HOSTNAME); cmlMgrPort = &cmlInter.addLongParameter(NSN, "mgrport", " port of RasMGR", DEFAULT_PORT ); cmlMgrSync = &cmlInter.addStringParameter(NSN, "sync", NULL); // deprecated cmlTransBuffer = &cmlInter.addLongParameter(NSN, "transbuffer", " maximal size of the transfer buffer in bytes", MAX_BUFFER_SIZE); cmlTimeOut = &cmlInter.addLongParameter(NSN, "timeout", " client time out in seconds.\n\t\tif it is set to 0 server doesn't check for client timeouts", CLIENT_TIMEOUT); cmlMgmntInt = &cmlInter.addStringParameter(NSN, "mgmntint", NULL); // deprecated cmlHttp = &cmlInter.addFlagParameter(NSN, "http", "start HTTP version of rasserver"); cmlRnp = &cmlInter.addFlagParameter(NSN, "rnp", "start RNP version of rasserver"); cmlOptLevel = &cmlInter.addLongParameter(NSN, "opt", " optimization level(0-4)\n\t\t 0 = no / 4 = maximal optimization", 4L); cmlConnectStr = &cmlInter.addStringParameter(NSN, "connect", " connect string for underlying database(e.g. test/test@julep)", "/"); cmlLog = &cmlInter.addStringParameter('l', "log", " log is printed to \n\t\tif is stdout , log output is printed to standard out", "$RMANHOME/log/..log"); #ifdef RMANDEBUG cmlTileSize = &cmlInter.addLongParameter(NSN, "tilesize", " specifies maximal size of tiles in bytes\n\t\t-regular tiles with equal edge lengthes", 2097152); cmlPctMin = &cmlInter.addLongParameter(NSN, "pctmin", " specifies minimal size of blobtiles in bytes", 2048); cmlPctMax = &cmlInter.addLongParameter(NSN, "pctmax", " specifies maximal size of inlinetiles in bytes", 4096); cmlUseTC = &cmlInter.addFlagParameter(NSN, "usetc", "use TileContainerIndex"); cmlTileConf = &cmlInter.addStringParameter(NSN, "tileconf", " default tile configuration (e.g. [0:1,0:2])", "[0:511,0:511]"); string tilingDesc = string(" retiling strategy, specified as:") + CommandLineParameter::descLineSep + " " + tiling_name_notiling + "," + CommandLineParameter::descLineSep + " " + tiling_name_regulartiling; cmlTiling = &cmlInter.addStringParameter(NSN, "tiling", tilingDesc.c_str(), tiling_name_notiling); string indexDesc = string(" index for created objects, specified as:") + CommandLineParameter::descLineSep + " " + index_name_auto + "," + CommandLineParameter::descLineSep + " " + index_name_directory + "," + CommandLineParameter::descLineSep + " " + index_name_regdirectory + "," + CommandLineParameter::descLineSep + " " + index_name_rplustree + "," + CommandLineParameter::descLineSep + " " + index_name_regrplustree + "," + CommandLineParameter::descLineSep + " " + index_name_tilecontainer + "," + CommandLineParameter::descLineSep + " " + index_name_regcomputed; cmlIndex = &cmlInter.addStringParameter(NSN, "index", indexDesc.c_str(), index_name_rplustree); // for systemtest use e.g.3 together with tileSize 12 string indexsizeDesc = string(" make the index use n nodes"); cmlIndexSize = &cmlInter.addLongParameter(NSN, "indexsize", indexsizeDesc.c_str(),0L); cmlDbg = &cmlInter.addStringParameter('d', "debug", " debug output is printed to ; if is stdout, debug output is printed to standard out",".log"); cmlDbgLevel = &cmlInter.addLongParameter(NSN, "dl", " debug level (0-4; 0 = no / 4 = maximal debug information)", 0L); #endif // RMANDEBUG } #undef NSN void Configuration::checkParameters() { ENTER( "Configuration::checkParameters()" ); serverName = cmlRsn->getValueAsString(); initLogFiles(); listenPort = cmlPort->getValueAsLong(); rasmgrHost = cmlMgr->getValueAsString(); rasmgrPort = cmlMgrPort->getValueAsLong(); TALK( "rasmgrHost = " << rasmgrHost << ", rasmgrPort = " << rasmgrPort ); deprecated(cmlMgrSync); maxTransferBufferSize = cmlTransBuffer->getValueAsLong(); timeout = cmlTimeOut->getValueAsLong(); deprecated(cmlMgmntInt); httpServ = cmlHttp->isPresent(); rnpServ = cmlRnp->isPresent(); optLevel = cmlOptLevel->getValueAsLong(); dbConnection = cmlConnectStr->getValueAsString(); #ifdef RMANDEBUG tileSize = cmlTileSize->getValueAsLong(); pctMin = cmlPctMin->getValueAsLong(); pctMax = cmlPctMax->getValueAsLong(); useTC = cmlUseTC->isPresent(); tileConf = cmlTileConf->getValueAsString();//(r_Minterval..) tilingName = cmlTiling->getValueAsString(); indexType = cmlIndex->getValueAsString(); indexSize = cmlIndexSize->getValueAsLong(); deprecated(cmlDbg); dbgLevel = cmlDbgLevel->getValueAsLong(); #endif LEAVE( "Configuration::checkParameters()" ); } void Configuration::printHelp() { CommandLineParser &cmlInter = CommandLineParser::getInstance(); cout << "Usage: rasserver [options]" << endl; cout << "Options:" << endl; cmlInter.printHelp(); cout << endl; } void Configuration::initLogFiles() { if( cmlLog->isPresent()) { if( strcasecmp(cmlLog->getValueAsString(), "stdout") != 0) { logFileName = cmlLog->getValueAsString(); logToStdOut = false; } else { logFileName = "stdout"; logToStdOut = true; } } else { // default logFileName = makeLogFileName( serverName, LOG_SUFFIX ); logToStdOut = false; } if( logToStdOut == true) { RMInit::logOut.rdbuf(cout.rdbuf()); RMInit::dbgOut.rdbuf(cout.rdbuf()); RMInit::bmOut.rdbuf(cout.rdbuf()); } else { if (RMInit::logFileOut.is_open()) RMInit::logFileOut.close(); RMInit::logFileOut.open(logFileName, ios::out | ios::ate); RMInit::logOut.rdbuf(RMInit::logFileOut.rdbuf()); RMInit::dbgOut.rdbuf(RMInit::logFileOut.rdbuf()); RMInit::bmOut.rdbuf(RMInit::logFileOut.rdbuf()); } cout<<"This server's log file is: " << logFileName << endl; } const char * Configuration::makeLogFileName(const char *srvName,const char *desExt) { static char buffer[ FILENAME_MAX ]; int pid =getpid(); char *dir = getenv( RMANHOME_VAR ); if (dir == NULL) { cout << "Error: environment variable " << RMANHOME_VAR << " not set. Using " << ALT_LOGDIR << " for the moment being." << endl; strcpy( buffer, ALT_LOGDIR ); } else { strcpy( buffer, dir ); strcat( buffer, LOGDIR ); } mkdir(buffer,S_IRWXU + S_IRGRP+S_IXGRP + S_IROTH+S_IXOTH); // create if not exist, rwxr-xr-x sprintf(buffer+strlen(buffer),"/%s.%06d.%s",srvName,pid,desExt); return buffer; } void Configuration::deprecated(CommandLineParameter *cml) { if(cml->isPresent()) { cout<<"WARNING: parameter '"<calledName()<<"' is deprecated, will be removed in next version!"<