00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "Aria.h"
00027 #include "ArExport.h"
00028 #include "ArServerBase.h"
00029 #include "ArServerSimpleOpener.h"
00030
00031
00035 AREXPORT ArServerSimpleOpener::ArServerSimpleOpener(
00036 ArArgumentParser *parser, const char *prefix) :
00037 myParseArgsCB(this, &ArServerSimpleOpener::parseArgs),
00038 myLogOptionsCB(this, &ArServerSimpleOpener::logOptions),
00039 myFileServerKeyCB(this, &ArServerSimpleOpener::fileServerKeyCallback)
00040 {
00041 myParser = parser;
00042 myOwnParser = false;
00043 if (prefix != NULL)
00044 myPrefix = prefix;
00045 else
00046 myPrefix = "";
00047
00048 myUserFile = NULL;
00049 myServerPort = 7272;
00050 myLogUserInfo = false;
00051 myLogCommandGroups = false;
00052 myServer = NULL;
00053 myOpenOnIP = NULL;
00054
00055 std::string functorName;
00056 functorName = prefix;
00057 functorName += "ArServerSimpleOpener";
00058 myParseArgsCB.setName(functorName.c_str());
00059 Aria::addParseArgsCB(&myParseArgsCB, 60);
00060 myLogOptionsCB.setName(functorName.c_str());
00061 Aria::addLogOptionsCB(&myLogOptionsCB, 60);
00062
00063 myFileServerKeyCB.setName("ArServerSimpleOpener::serverKey");
00064 myFileParser.addHandler("serverKey", &myFileServerKeyCB);
00065 }
00066
00067 AREXPORT ArServerSimpleOpener::~ArServerSimpleOpener(void)
00068 {
00069
00070 }
00071
00072 AREXPORT bool ArServerSimpleOpener::parseArgs(void)
00073 {
00074 return parseArgs(myParser);
00075 }
00076
00077 AREXPORT bool ArServerSimpleOpener::parseArgs(ArArgumentParser *parser)
00078 {
00079 if (myPrefix.size() > 0)
00080 return parseArgsWithPrefix(parser);
00081 else
00082 return parseArgsWithOutPrefix(parser);
00083
00084 }
00085
00086 AREXPORT bool ArServerSimpleOpener::parseArgsWithOutPrefix(ArArgumentParser *parser)
00087 {
00088 if (parser->checkArgument("-logUserInfo") ||
00089 parser->checkArgument("-lui"))
00090 {
00091 myLogUserInfo = true;
00092 }
00093
00094 if (parser->checkArgument("-logCommandGroups") ||
00095 parser->checkArgument("-lcg"))
00096 {
00097 myLogCommandGroups = true;
00098 }
00099
00100 if (!parser->checkParameterArgumentString("-userInfo",
00101 &myUserFile) ||
00102 !parser->checkParameterArgumentString("-ui",
00103 &myUserFile) ||
00104 !parser->checkParameterArgumentInteger("-serverPort",
00105 &myServerPort) ||
00106 !parser->checkParameterArgumentInteger("-sp",
00107 &myServerPort) ||
00108 !parser->checkParameterArgumentString("-serverIP",
00109 &myOpenOnIP) ||
00110 !parser->checkParameterArgumentString("-sip",
00111 &myOpenOnIP))
00112
00113
00114
00115
00116
00117 {
00118 return false;
00119 }
00120
00121 bool wasReallySet;
00122 const char *serverInfoFile = NULL;
00123 while (myParser->checkParameterArgumentString(
00124 "-serverInfoFile", &serverInfoFile,
00125 &wasReallySet, true) &&
00126 wasReallySet)
00127 {
00128 if (serverInfoFile != NULL && !parseFile(serverInfoFile))
00129 return false;
00130 }
00131
00132 return true;
00133 }
00134
00135 AREXPORT bool ArServerSimpleOpener::parseArgsWithPrefix(
00136 ArArgumentParser *parser)
00137 {
00138 if (parser->checkArgumentVar("-%sLogUserInfo", myPrefix.c_str()))
00139 {
00140 myLogUserInfo = true;
00141 }
00142
00143 if (parser->checkArgumentVar("-%sLogCommandGroups", myPrefix.c_str()))
00144 {
00145 myLogCommandGroups = true;
00146 }
00147
00148 if (!parser->checkParameterArgumentStringVar(
00149 NULL, &myUserFile, "-%sUserInfo", myPrefix.c_str()) ||
00150 !parser->checkParameterArgumentStringVar(
00151 NULL, &myOpenOnIP, "-%sServerIP", myPrefix.c_str()) ||
00152 !parser->checkParameterArgumentIntegerVar(
00153 NULL, &myServerPort, "-%sServerPort", myPrefix.c_str()))
00154
00155
00156
00157 {
00158 return false;
00159 }
00160
00161 bool wasReallySet;
00162 const char *serverInfoFile = NULL;
00163 if (myParser->checkParameterArgumentStringVar(
00164 &wasReallySet, &serverInfoFile, "-%sServerInfoFile",
00165 myPrefix.c_str()) &&
00166 wasReallySet)
00167 {
00168 if (serverInfoFile != NULL && !parseFile(serverInfoFile))
00169 return false;
00170 }
00171
00172 return true;
00173 }
00174
00175 AREXPORT void ArServerSimpleOpener::logOptions(void) const
00176 {
00177 if (myPrefix.size() > 0)
00178 logOptionsWithPrefix();
00179 else
00180 logOptionsWithOutPrefix();
00181 }
00182
00183 AREXPORT void ArServerSimpleOpener::logOptionsWithOutPrefix(void) const
00184 {
00185 ArLog::log(ArLog::Terse, "");
00186 ArLog::log(ArLog::Terse, "Options for ArServerSimpleOpener:");
00187 ArLog::log(ArLog::Terse, "-serverPort <serverPortNumber>");
00188 ArLog::log(ArLog::Terse, "-sp <serverPortNumber>");
00189 ArLog::log(ArLog::Terse, "-serverIP <serverIPToOpenOn>");
00190 ArLog::log(ArLog::Terse, "-sip <serverIPToOpenOn>");
00191 ArLog::log(ArLog::Terse, "-userInfo <userInfoFileName>");
00192 ArLog::log(ArLog::Terse, "-ui <userInfoFileName>");
00193 ArLog::log(ArLog::Terse, "-logUserInfo");
00194 ArLog::log(ArLog::Terse, "-lui");
00195 ArLog::log(ArLog::Terse, "-logCommandGroups");
00196 ArLog::log(ArLog::Terse, "-lcg");
00197
00198
00199
00200
00201 ArLog::log(ArLog::Terse, "-serverInfoFile <file>");
00202 ArLog::log(ArLog::Terse, "");
00203 }
00204
00205 AREXPORT void ArServerSimpleOpener::logOptionsWithPrefix(void) const
00206 {
00207 ArLog::log(ArLog::Terse, "");
00208 ArLog::log(ArLog::Terse, "Options for ArServerSimpleOpener:");
00209 ArLog::log(ArLog::Terse, "-%sServerPort <serverPortNumber>",
00210 myPrefix.c_str());
00211 ArLog::log(ArLog::Terse, "-%sServerIP <serverIPToOpenOn>",
00212 myPrefix.c_str());
00213 ArLog::log(ArLog::Terse, "-%sUserInfo <userInfoFileName>",
00214 myPrefix.c_str());
00215 ArLog::log(ArLog::Terse, "-%sLogUserInfo", myPrefix.c_str());
00216 ArLog::log(ArLog::Terse, "-%sLogCommandGroups", myPrefix.c_str());
00217
00218
00219
00220 ArLog::log(ArLog::Terse, "-%sServerInfoFile <file>",
00221 myPrefix.c_str());
00222 ArLog::log(ArLog::Terse, "");
00223 }
00224
00234 AREXPORT bool ArServerSimpleOpener::open(ArServerBase *server,
00235 const char *baseDirectory,
00236 int secondsToTryFor)
00237 {
00238 ArTime startedServer;
00239 bool serverOpened;
00240 startedServer.setToNow();
00241 myBadUserFile = false;
00242 myOpenFailed = false;
00243
00244 if (secondsToTryFor < 0)
00245 secondsToTryFor = 0;
00246
00247 server->setServerKey(myServerKey.c_str());
00248
00249 if (myUserFile != NULL && myUserFile[0] != '\0' &&
00250 !server->loadUserInfo(myUserFile, baseDirectory))
00251 {
00252 ArLog::log(ArLog::Normal, "ArServerSimpleOpener: Bad user file");
00253 myBadUserFile = true;
00254 return false;
00255 }
00256
00257 while (Aria::getRunning() &&
00258 (serverOpened = server->open(myServerPort, myOpenOnIP)) == false)
00259 {
00260 if (secondsToTryFor == 0)
00261 {
00262 ArLog::log(ArLog::Normal, "Could not open server on port %d", myServerPort);
00263 myOpenFailed = true;
00264 return false;
00265 }
00266 if (startedServer.secSince() > secondsToTryFor)
00267 {
00268 ArLog::log(ArLog::Normal, "Could not open server on port %d even after %d seconds",
00269 myServerPort, secondsToTryFor);
00270 myOpenFailed = true;
00271 return false;
00272 }
00273 ArLog::log(ArLog::Normal, "Can't open server on port %d yet, waiting", myServerPort);
00274 ArUtil::sleep(1000);
00275 }
00276
00277 if (serverOpened)
00278 myServer = server;
00279
00280 return serverOpened;
00281 }
00282
00283 AREXPORT bool ArServerSimpleOpener::checkAndLog(void) const
00284 {
00285 if (myServer != NULL && myLogCommandGroups)
00286 myServer->logCommandGroups();
00287
00288 if (myServer != NULL && myLogUserInfo)
00289 myServer->logUserInfo();
00290
00291
00292 return true;
00293 }
00294
00295 bool ArServerSimpleOpener::fileServerKeyCallback(ArArgumentBuilder *arg)
00296 {
00297 if (arg->getArgc() > 1)
00298 {
00299 ArLog::log(ArLog::Normal, "Bad serverKey line: %s %s",
00300 arg->getExtraString(), arg->getFullString());
00301 return false;
00302 }
00303 if (arg->getArgc() == 0)
00304 myServerKey = "";
00305 else
00306 myServerKey = arg->getArg(0);
00307 return true;
00308 }
00309
00310 AREXPORT bool ArServerSimpleOpener::parseFile(const char *fileName)
00311 {
00312 ArLog::log(ArLog::Normal, "Loading server key from %s",
00313 fileName);
00314 if (!myFileParser.parseFile(fileName))
00315 {
00316 ArLog::log(ArLog::Normal, "Failed parsing server key file %s",
00317 fileName);
00318 return false;
00319 }
00320 return true;
00321 }