Feature__33.patch
| nel/include/nel/misc/common.h (working copy) | ||
|---|---|---|
| 322 | 322 |
uint32 humanReadableToBytes (const std::string &str); |
| 323 | 323 |
|
| 324 | 324 |
/// Convert a time into a string that is easily readable by an human, for example 3600 -> "1h" |
| 325 |
std::string secondsToHumanReadable (uint32 time);
|
|
| 325 |
std::string secondsToHumanReadable (time_t time);
|
|
| 326 | 326 |
|
| 327 | 327 |
|
| 328 | 328 |
/// Get a bytes or time in string format and convert it in seconds or bytes |
| 329 |
uint32 fromHumanReadable (const std::string &str);
|
|
| 329 |
time_t fromHumanReadable (const std::string &str);
|
|
| 330 | 330 |
|
| 331 | 331 |
|
| 332 | 332 |
/// This function executes a program in the background and returns instantly (used for example to launch services in AES). |
| nel/include/nel/misc/time_nl.h (working copy) | ||
|---|---|---|
| 62 | 62 |
* daylight saving if applicable. |
| 63 | 63 |
* This values is the same on all computer if computers are synchronized (with NTP for example). |
| 64 | 64 |
*/ |
| 65 |
static uint32 getSecondsSince1970 ();
|
|
| 65 |
static time_t getSecondsSince1970 ();
|
|
| 66 | 66 |
|
| 67 | 67 |
/** Return the number of second since midnight (00:00:00), January 1, 1970, |
| 68 | 68 |
* coordinated universal time, according to the system clock. |
| nel/include/nel/net/admin.h (working copy) | ||
|---|---|---|
| 58 | 58 |
std::string Name; // variable name |
| 59 | 59 |
int Update; // delta time in second when we have to check variable |
| 60 | 60 |
|
| 61 |
uint32 LastUpdate; // in second
|
|
| 61 |
time_t LastUpdate; // in second
|
|
| 62 | 62 |
}; |
| 63 | 63 |
|
| 64 | 64 |
typedef void (*TRemoteClientCallback) (uint32 rid, const std::string &cmd, const std::string &entityNames); |
| nel/include/nel/net/service.h (working copy) | ||
|---|---|---|
| 237 | 237 |
sint getExitStatus () const { return _ExitStatus; }
|
| 238 | 238 |
|
| 239 | 239 |
/// Returns the date of launch of the service. Unit: see CTime::getSecondsSince1970() |
| 240 |
uint32 getLaunchingDate () const;
|
|
| 240 |
time_t getLaunchingDate () const;
|
|
| 241 | 241 |
|
| 242 | 242 |
/// Return true if this service don't use the NS (naming service) |
| 243 | 243 |
bool getDontUseNS() const { return _DontUseNS; };
|
| nel/src/misc/common.cpp (working copy) | ||
|---|---|---|
| 395 | 395 |
} |
| 396 | 396 |
|
| 397 | 397 |
|
| 398 |
string secondsToHumanReadable (uint32 time)
|
|
| 398 |
string secondsToHumanReadable (time_t time)
|
|
| 399 | 399 |
{
|
| 400 | 400 |
static const char *divTable[] = { "s", "mn", "h", "d" };
|
| 401 | 401 |
static uint divCoef[] = { 60, 60, 24 };
|
| 402 | 402 |
uint div = 0; |
| 403 |
uint32 res = time;
|
|
| 404 |
uint32 newres = res;
|
|
| 403 |
time_t res = time;
|
|
| 404 |
time_t newres = res;
|
|
| 405 | 405 |
for(;;) |
| 406 | 406 |
{
|
| 407 | 407 |
if(div > 2) |
| ... | ... | |
| 418 | 418 |
return toString ("%u%s", res, divTable[div]);
|
| 419 | 419 |
} |
| 420 | 420 |
|
| 421 |
uint32 fromHumanReadable (const std::string &str)
|
|
| 421 |
time_t fromHumanReadable (const std::string &str)
|
|
| 422 | 422 |
{
|
| 423 | 423 |
if (str.size() == 0) |
| 424 | 424 |
return 0; |
| 425 | 425 |
|
| 426 |
uint32 val;
|
|
| 426 |
time_t val;
|
|
| 427 | 427 |
fromString(str, val); |
| 428 | 428 |
|
| 429 | 429 |
switch (str[str.size()-1]) |
| ... | ... | |
| 451 | 451 |
if (args.size() != 1) |
| 452 | 452 |
return false; |
| 453 | 453 |
|
| 454 |
uint32 seconds;
|
|
| 454 |
time_t seconds;
|
|
| 455 | 455 |
fromString(args[0], seconds); |
| 456 | 456 |
log.displayNL("%s -> %s", args[0].c_str(), secondsToHumanReadable(seconds).c_str());
|
| 457 | 457 |
|
| nel/src/misc/time_nl.cpp (working copy) | ||
|---|---|---|
| 48 | 48 |
* coordinated universal time, according to the system clock. |
| 49 | 49 |
* This values is the same on all computer if computers are synchronized (with NTP for example). |
| 50 | 50 |
*/ |
| 51 |
uint32 CTime::getSecondsSince1970 ()
|
|
| 51 |
time_t CTime::getSecondsSince1970 ()
|
|
| 52 | 52 |
{
|
| 53 |
return uint32(time(NULL));
|
|
| 53 |
return time_t(time(NULL));
|
|
| 54 | 54 |
} |
| 55 | 55 |
|
| 56 | 56 |
/** Return the number of second since midnight (00:00:00), January 1, 1970, |
| nel/src/net/admin.cpp (working copy) | ||
|---|---|---|
| 68 | 68 |
uint NbWaiting; |
| 69 | 69 |
uint32 NbReceived; |
| 70 | 70 |
TServiceId SId; |
| 71 |
uint32 Time; // when the request was ask
|
|
| 71 |
time_t Time; // when the request was ask
|
|
| 72 | 72 |
|
| 73 | 73 |
TAdminViewResult Answers; |
| 74 | 74 |
}; |
| ... | ... | |
| 304 | 304 |
|
| 305 | 305 |
static void cleanRequest () |
| 306 | 306 |
{
|
| 307 |
uint32 currentTime = CTime::getSecondsSince1970 ();
|
|
| 307 |
time_t currentTime = CTime::getSecondsSince1970 ();
|
|
| 308 | 308 |
|
| 309 | 309 |
for (uint i = 0 ; i < Requests.size ();) |
| 310 | 310 |
{
|
| ... | ... | |
| 634 | 634 |
|
| 635 | 635 |
void updateAdmin() |
| 636 | 636 |
{
|
| 637 |
uint32 CurrentTime = CTime::getSecondsSince1970();
|
|
| 637 |
time_t CurrentTime = CTime::getSecondsSince1970();
|
|
| 638 | 638 |
|
| 639 | 639 |
|
| 640 | 640 |
// |
| ... | ... | |
| 648 | 648 |
// Check graph updates |
| 649 | 649 |
// |
| 650 | 650 |
|
| 651 |
static uint32 lastGraphUpdateCheck = 0;
|
|
| 651 |
static time_t lastGraphUpdateCheck = 0;
|
|
| 652 | 652 |
|
| 653 | 653 |
if (CurrentTime >= lastGraphUpdateCheck+1) |
| 654 | 654 |
{
|
| ... | ... | |
| 714 | 714 |
// Check alarms |
| 715 | 715 |
// |
| 716 | 716 |
|
| 717 |
static uint32 lastAlarmsCheck = 0;
|
|
| 717 |
static time_t lastAlarmsCheck = 0;
|
|
| 718 | 718 |
|
| 719 | 719 |
if (CurrentTime >= lastAlarmsCheck+AlarmCheckDelay) |
| 720 | 720 |
{
|
| nel/src/net/login_server.cpp (working copy) | ||
|---|---|---|
| 51 | 51 |
string UserExtended; // extended data (for free use) |
| 52 | 52 |
uint32 InstanceId; // the world instance in witch the user is awaited |
| 53 | 53 |
uint32 CharSlot; // the expected character slot, any other will be denied |
| 54 |
uint32 Time; // when the cookie is inserted in pending list
|
|
| 54 |
time_t Time; // when the cookie is inserted in pending list
|
|
| 55 | 55 |
}; |
| 56 | 56 |
|
| 57 | 57 |
static list<CPendingUser> PendingUsers; |
| ... | ... | |
| 96 | 96 |
// delete too old cookie |
| 97 | 97 |
|
| 98 | 98 |
list<CPendingUser>::iterator it = PendingUsers.begin(); |
| 99 |
uint32 Time = CTime::getSecondsSince1970();
|
|
| 99 |
time_t Time = CTime::getSecondsSince1970();
|
|
| 100 | 100 |
while (it != PendingUsers.end ()) |
| 101 | 101 |
{
|
| 102 | 102 |
if ((*it).Time < Time - TimeBeforeEraseCookie) |
| nel/src/net/module_gateway_transport.cpp (working copy) | ||
|---|---|---|
| 56 | 56 |
TSockId SockId; |
| 57 | 57 |
|
| 58 | 58 |
/// Time stamp of last message received/emitted |
| 59 |
mutable uint32 LastCommTime;
|
|
| 59 |
mutable time_t LastCommTime;
|
|
| 60 | 60 |
|
| 61 | 61 |
|
| 62 | 62 |
CL3ServerRoute(IGatewayTransport *transport) |
| ... | ... | |
| 115 | 115 |
if (_CallbackServer.get() != NULL) |
| 116 | 116 |
_CallbackServer->update2(100, 0); |
| 117 | 117 |
|
| 118 |
uint32 now = CTime::getSecondsSince1970();
|
|
| 118 |
time_t now = CTime::getSecondsSince1970();
|
|
| 119 | 119 |
// check each connected client for keep alive |
| 120 | 120 |
TRouteMap::iterator first(_Routes.begin()), last(_Routes.end()); |
| 121 | 121 |
for (; first != last; ++first) |
| ... | ... | |
| 402 | 402 |
/// The Client callback |
| 403 | 403 |
mutable CCallbackClient CallbackClient; |
| 404 | 404 |
/// Time stamp of last message received/emitted |
| 405 |
mutable uint32 LastCommTime;
|
|
| 405 |
mutable time_t LastCommTime;
|
|
| 406 | 406 |
|
| 407 | 407 |
/// The last time we try to reconnect (in case of disconnection) |
| 408 |
uint32 LastConnectionRetry;
|
|
| 408 |
time_t LastConnectionRetry;
|
|
| 409 | 409 |
|
| 410 | 410 |
// conn id |
| 411 | 411 |
uint32 ConnId; |
| ... | ... | |
| 521 | 521 |
// delete any route pending |
| 522 | 522 |
deletePendingRoute(); |
| 523 | 523 |
|
| 524 |
uint32 now = CTime::getSecondsSince1970();
|
|
| 524 |
time_t now = CTime::getSecondsSince1970();
|
|
| 525 | 525 |
// update the client connection |
| 526 | 526 |
TClientRoutes::iterator first(_Routes.begin()), last(_Routes.end()); |
| 527 | 527 |
for (; first != last; ++first) |
| nel/src/net/service.cpp (working copy) | ||
|---|---|---|
| 140 | 140 |
//static CLog commandLog; |
| 141 | 141 |
|
| 142 | 142 |
static string CompilationDate; |
| 143 |
static uint32 LaunchingDate;
|
|
| 143 |
static time_t LaunchingDate;
|
|
| 144 | 144 |
|
| 145 | 145 |
static uint32 NbUserUpdate = 0; |
| 146 | 146 |
|
| ... | ... | |
| 1705 | 1705 |
/* |
| 1706 | 1706 |
* Returns the date of launch of the service. Unit: see CTime::getSecondsSince1970() |
| 1707 | 1707 |
*/ |
| 1708 |
uint32 IService::getLaunchingDate () const
|
|
| 1708 |
time_t IService::getLaunchingDate () const
|
|
| 1709 | 1709 |
{
|
| 1710 | 1710 |
return LaunchingDate; |
| 1711 | 1711 |
} |
| nelns/admin_executor_service/admin_executor_service.cpp (working copy) | ||
|---|---|---|
| 78 | 78 |
// |
| 79 | 79 |
// Namespaces |
| 80 | 80 |
// |
| 81 |
|
|
| 81 |
|
|
| 82 | 82 |
using namespace std; |
| 83 | 83 |
using namespace NLMISC; |
| 84 | 84 |
using namespace NLNET; |
| ... | ... | |
| 100 | 100 |
uint NbWaiting; |
| 101 | 101 |
uint32 NbReceived; |
| 102 | 102 |
TServiceId SId; |
| 103 |
uint32 Time; // when the request was ask
|
|
| 103 |
time_t Time; // when the request was ask
|
|
| 104 | 104 |
|
| 105 | 105 |
TAdminViewResult Answers; |
| 106 | 106 |
}; |
| ... | ... | |
| 122 | 122 |
uint32 PId; /// process Id used to kill the application |
| 123 | 123 |
bool Relaunch; /// if true, it means that the admin want to close and relaunch the service |
| 124 | 124 |
|
| 125 |
uint32 LastPing; /// time in seconds of the last ping sent. If 0, means that the service already pong
|
|
| 125 |
time_t LastPing; /// time in seconds of the last ping sent. If 0, means that the service already pong
|
|
| 126 | 126 |
|
| 127 | 127 |
vector<uint32> WaitingRequestId; /// contains all request that the server hasn't reply yet |
| 128 | 128 |
|
| ... | ... | |
| 197 | 197 |
|
| 198 | 198 |
vector<string> RegisteredServices; |
| 199 | 199 |
|
| 200 |
vector<pair<uint32, string> > WaitingToLaunchServices; // date and alias name
|
|
| 200 |
vector<pair<time_t, string> > WaitingToLaunchServices; // date and alias name
|
|
| 201 | 201 |
|
| 202 | 202 |
vector<string> AllAdminAlarms; // contains *all* alarms |
| 203 | 203 |
|
| ... | ... | |
| 208 | 208 |
// Global Variables (scalars) |
| 209 | 209 |
// |
| 210 | 210 |
|
| 211 |
uint32 LastPing = 0; // contains the date of the last ping sent to the services
|
|
| 211 |
time_t LastPing = 0; // contains the date of the last ping sent to the services
|
|
| 212 | 212 |
|
| 213 | 213 |
|
| 214 | 214 |
// |
| ... | ... | |
| 238 | 238 |
{
|
| 239 | 239 |
char *text; |
| 240 | 240 |
NLMISC_CONVERT_VARGS(text, format, 4096); |
| 241 |
|
|
| 241 |
|
|
| 242 | 242 |
CMessage msgout("ADMIN_EMAIL");
|
| 243 | 243 |
string str = text; |
| 244 | 244 |
msgout.serial(str); |
| ... | ... | |
| 420 | 420 |
// make sure the alias, command, etc were setup ok |
| 421 | 421 |
if (!ok) return false; |
| 422 | 422 |
nlinfo("Starting the service alias '%s'", alias.c_str());
|
| 423 |
|
|
| 423 |
|
|
| 424 | 424 |
bool dontLaunchServicesDirectly= IService::getInstance()->ConfigFile.exists("DontLaunchServicesDirectly")? IService::getInstance()->ConfigFile.getVar("DontLaunchServicesDirectly").asBool(): false;
|
| 425 | 425 |
if (!dontLaunchServicesDirectly) |
| 426 |
{
|
|
| 426 |
{
|
|
| 427 | 427 |
// give the service alias to the service to forward it back when it will connected to the aes. |
| 428 | 428 |
arg += " -N"; |
| 429 | 429 |
arg += alias; |
| ... | ... | |
| 431 | 431 |
// set the path for running |
| 432 | 432 |
arg += " -A"; |
| 433 | 433 |
arg += path; |
| 434 |
|
|
| 434 |
|
|
| 435 | 435 |
// suppress output to stdout |
| 436 | 436 |
#ifdef NL_OS_WINDOWS |
| 437 | 437 |
arg += " >NUL:"; |
| ... | ... | |
| 441 | 441 |
|
| 442 | 442 |
// launch the service |
| 443 | 443 |
bool res = launchProgram(command, arg); |
| 444 |
|
|
| 444 |
|
|
| 445 | 445 |
// if launching ok, leave 1 second to the new launching service before lauching next one |
| 446 | 446 |
if (res) |
| 447 | 447 |
nlSleep(1000); |
| 448 |
|
|
| 448 |
|
|
| 449 | 449 |
return res; |
| 450 | 450 |
} |
| 451 | 451 |
else |
| ... | ... | |
| 502 | 502 |
|
| 503 | 503 |
void checkWaitingServices() |
| 504 | 504 |
{
|
| 505 |
uint32 d = CTime::getSecondsSince1970();
|
|
| 505 |
time_t d = CTime::getSecondsSince1970();
|
|
| 506 | 506 |
|
| 507 | 507 |
for(uint i = 0; i < WaitingToLaunchServices.size(); ) |
| 508 | 508 |
{
|
| ... | ... | |
| 520 | 520 |
|
| 521 | 521 |
static void checkPingPong() |
| 522 | 522 |
{
|
| 523 |
uint32 d = CTime::getSecondsSince1970();
|
|
| 523 |
time_t d = CTime::getSecondsSince1970();
|
|
| 524 | 524 |
|
| 525 | 525 |
bool allPonged = true; |
| 526 | 526 |
bool haveService = false; |
| 527 |
|
|
| 527 |
|
|
| 528 | 528 |
for(uint i = 0; i < Services.size(); i++) |
| 529 | 529 |
{
|
| 530 | 530 |
if(Services[i].Ready) |
| ... | ... | |
| 682 | 682 |
|
| 683 | 683 |
Requests[i].NbReceived++; |
| 684 | 684 |
nldebug("REQUEST: ++ i %d rid %d NbWaiting %d NbReceived+ %d", i, Requests[i].Id, Requests[i].NbWaiting, Requests[i].NbReceived);
|
| 685 |
|
|
| 685 |
|
|
| 686 | 686 |
return; |
| 687 | 687 |
} |
| 688 | 688 |
} |
| ... | ... | |
| 692 | 692 |
|
| 693 | 693 |
void cleanRequests() |
| 694 | 694 |
{
|
| 695 |
uint32 currentTime = CTime::getSecondsSince1970();
|
|
| 695 |
time_t currentTime = CTime::getSecondsSince1970();
|
|
| 696 | 696 |
|
| 697 | 697 |
// just a debug check |
| 698 | 698 |
for (uint t = 0 ; t < Requests.size(); t++) |
| ... | ... | |
| 715 | 715 |
} |
| 716 | 716 |
} |
| 717 | 717 |
nlinfo("REQUEST: Waiting request %d: NbRef %d NbWaiting %d NbReceived %d", Requests[t].Id, NbRef, NbWaiting, NbReceived);
|
| 718 |
|
|
| 718 |
|
|
| 719 | 719 |
if (NbRef != NbWaiting - NbReceived) |
| 720 | 720 |
{
|
| 721 | 721 |
nlwarning("REQUEST: **** i %d rid %d -> NbRef(%d) != NbWaiting(%d) - NbReceived(%d) ", t, Requests[t].Id, NbRef, NbWaiting, NbReceived);
|
| ... | ... | |
| 731 | 731 |
|
| 732 | 732 |
TAdminViewVarNames varNames; |
| 733 | 733 |
TAdminViewValues values; |
| 734 |
|
|
| 734 |
|
|
| 735 | 735 |
varNames.push_back("service");
|
| 736 | 736 |
for (uint j = 0; j < Services.size(); j++) |
| 737 | 737 |
{
|
| ... | ... | |
| 748 | 748 |
else |
| 749 | 749 |
s = Services[j].AliasName; |
| 750 | 750 |
s += "-"+toString(Services[j].ServiceId); |
| 751 |
s += "((TIMEOUT))";
|
|
| 751 |
s += "((TIMEOUT))"; |
|
| 752 | 752 |
values.clear(); |
| 753 | 753 |
values.push_back(s); |
| 754 | 754 |
aesAddRequestAnswer(Requests[i].Id, varNames, values); |
| ... | ... | |
| 798 | 798 |
} |
| 799 | 799 |
InfoLog->displayRawNL("");
|
| 800 | 800 |
InfoLog->displayRawNL("----------------------------------------------");
|
| 801 |
}
|
|
| 801 |
} |
|
| 802 | 802 |
} |
| 803 | 803 |
else |
| 804 | 804 |
CUnifiedNetwork::getInstance()->send(Requests[i].SId, msgout); |
| ... | ... | |
| 847 | 847 |
// not found in alias, try with short name |
| 848 | 848 |
for (sit = Services.begin(); sit != Services.end(); sit++) |
| 849 | 849 |
{
|
| 850 |
if ((*sit).ShortName == shortName)
|
|
| 850 |
if ((*sit).ShortName == shortName) |
|
| 851 | 851 |
{
|
| 852 | 852 |
services.push_back(sit); |
| 853 | 853 |
} |
| ... | ... | |
| 944 | 944 |
serviceGetView(rid, viewStr, answer); |
| 945 | 945 |
aesAddRequestAnswer(rid, answer); |
| 946 | 946 |
nlinfo("REQUEST: Treated view myself directly: '%s'", viewStr.c_str());
|
| 947 |
}
|
|
| 947 |
} |
|
| 948 | 948 |
|
| 949 | 949 |
void treatRequestForOfflineService(uint32 rid, const string& serviceName, const string& viewStr) |
| 950 | 950 |
{
|
| ... | ... | |
| 954 | 954 |
|
| 955 | 955 |
TAdminViewVarNames varNames; |
| 956 | 956 |
TAdminViewValues values; |
| 957 |
|
|
| 957 |
|
|
| 958 | 958 |
// add default row |
| 959 | 959 |
varNames.push_back("service");
|
| 960 | 960 |
values.push_back(serviceName); |
| 961 |
|
|
| 961 |
|
|
| 962 | 962 |
for (uint k = 0; k < subvarpath.Destination.size(); k++) |
| 963 | 963 |
{
|
| 964 | 964 |
size_t pos = subvarpath.Destination[k].first.find("=");
|
| ... | ... | |
| 1004 | 1004 |
aesAddRequestAnswer(rid, varNames, values); |
| 1005 | 1005 |
nlinfo("REQUEST: Sent and received view '%s' to offline service '%s'", viewStr.c_str(), serviceName.c_str());
|
| 1006 | 1006 |
} |
| 1007 |
|
|
| 1007 |
|
|
| 1008 | 1008 |
void addRequestForOnlineServices(uint32 rid, const string& viewStr) |
| 1009 | 1009 |
{
|
| 1010 | 1010 |
// add services that I manage |
| ... | ... | |
| 1018 | 1018 |
|
| 1019 | 1019 |
// add myself |
| 1020 | 1020 |
treatRequestOneself(rid,viewStr); |
| 1021 |
}
|
|
| 1021 |
} |
|
| 1022 | 1022 |
|
| 1023 | 1023 |
void addRequestForAllServices(uint32 rid, const string& viewStr) |
| 1024 | 1024 |
{
|
| ... | ... | |
| 1039 | 1039 |
|
| 1040 | 1040 |
// add all running services (and for oneself) |
| 1041 | 1041 |
addRequestForOnlineServices(rid,viewStr); |
| 1042 |
}
|
|
| 1042 |
} |
|
| 1043 | 1043 |
|
| 1044 | 1044 |
void addRequestForNamedService(uint32 rid, const string& service, const string& viewStr) |
| 1045 | 1045 |
{
|
| ... | ... | |
| 1074 | 1074 |
} |
| 1075 | 1075 |
} |
| 1076 | 1076 |
} |
| 1077 |
}
|
|
| 1077 |
} |
|
| 1078 | 1078 |
|
| 1079 | 1079 |
void addRequest(uint32 rid, const string &rawvarpath, TServiceId sid) |
| 1080 | 1080 |
{
|
| ... | ... | |
| 1097 | 1097 |
for (uint t = 0; t < vp.Destination.size(); t++) |
| 1098 | 1098 |
{
|
| 1099 | 1099 |
string service = vp.Destination[t].first; |
| 1100 |
|
|
| 1100 |
|
|
| 1101 | 1101 |
if (service == "*") |
| 1102 | 1102 |
{
|
| 1103 | 1103 |
addRequestForOnlineServices(rid,varpath.Destination[i].second); |
| ... | ... | |
| 1196 | 1196 |
// |
| 1197 | 1197 |
msgin.serialCont(AllAdminAlarms); |
| 1198 | 1198 |
msgin.serialCont(AllGraphUpdates); |
| 1199 |
|
|
| 1199 |
|
|
| 1200 | 1200 |
// set our own alarms for this service |
| 1201 | 1201 |
setInformations(AllAdminAlarms, AllGraphUpdates); |
| 1202 | 1202 |
|
| ... | ... | |
| 1245 | 1245 |
{
|
| 1246 | 1246 |
// receive an view answer from the service |
| 1247 | 1247 |
TServices::iterator sit = findService(sid); |
| 1248 |
|
|
| 1248 |
|
|
| 1249 | 1249 |
uint32 rid; |
| 1250 | 1250 |
msgin.serial(rid); |
| 1251 | 1251 |
|
| ... | ... | |
| 1257 | 1257 |
{
|
| 1258 | 1258 |
varNames.clear(); |
| 1259 | 1259 |
values.clear(); |
| 1260 |
|
|
| 1260 |
|
|
| 1261 | 1261 |
// adding default row |
| 1262 |
|
|
| 1262 |
|
|
| 1263 | 1263 |
uint32 i, nb; |
| 1264 | 1264 |
string var, val; |
| 1265 |
|
|
| 1265 |
|
|
| 1266 | 1266 |
msgin.serial(nb); |
| 1267 | 1267 |
for (i = 0; i < nb; i++) |
| 1268 | 1268 |
{
|
| 1269 | 1269 |
msgin.serial(var); |
| 1270 | 1270 |
varNames.push_back(var); |
| 1271 | 1271 |
} |
| 1272 |
|
|
| 1272 |
|
|
| 1273 | 1273 |
msgin.serial(nb); |
| 1274 | 1274 |
for (i = 0; i < nb; i++) |
| 1275 | 1275 |
{
|
| ... | ... | |
| 1279 | 1279 |
answer.push_back(SAdminViewRow(varNames,values)); |
| 1280 | 1280 |
} |
| 1281 | 1281 |
aesAddRequestAnswer(rid, answer); |
| 1282 |
|
|
| 1282 |
|
|
| 1283 | 1283 |
// remove the waiting request |
| 1284 | 1284 |
for (uint i = 0; i < (*sit).WaitingRequestId.size();) |
| 1285 | 1285 |
{
|
| ... | ... | |
| 1497 | 1497 |
if (i != 0) cmd += " "; |
| 1498 | 1498 |
cmd += args[i]; |
| 1499 | 1499 |
} |
| 1500 |
|
|
| 1500 |
|
|
| 1501 | 1501 |
static uint32 requestId=0; |
| 1502 | 1502 |
addRequest(requestId++, cmd, TServiceId(0)); |
| 1503 | 1503 |
|
| ... | ... | |
| 1539 | 1539 |
{
|
| 1540 | 1540 |
if(args.size() <= 0) |
| 1541 | 1541 |
return false; |
| 1542 |
|
|
| 1542 |
|
|
| 1543 | 1543 |
string text; |
| 1544 | 1544 |
for (uint i =0; i < args.size(); i++) |
| 1545 | 1545 |
{
|
| 1546 | 1546 |
text += args[i]+" "; |
| 1547 | 1547 |
} |
| 1548 | 1548 |
sendAdminEmail(text.c_str()); |
| 1549 |
|
|
| 1549 |
|
|
| 1550 | 1550 |
return true; |
| 1551 | 1551 |
} |
| 1552 | 1552 |
|
| ... | ... | |
| 1623 | 1623 |
{
|
| 1624 | 1624 |
if(args.size() <= 0) |
| 1625 | 1625 |
return false; |
| 1626 |
|
|
| 1626 |
|
|
| 1627 | 1627 |
string cmd; |
| 1628 | 1628 |
for (uint i =0; i < args.size(); i++) |
| 1629 | 1629 |
{
|
| 1630 | 1630 |
cmd += args[i]+" "; |
| 1631 | 1631 |
} |
| 1632 |
|
|
| 1632 |
|
|
| 1633 | 1633 |
string path; |
| 1634 | 1634 |
#ifdef NL_OS_UNIX |
| 1635 | 1635 |
path = "/tmp/"; |
| ... | ... | |
| 1637 | 1637 |
|
| 1638 | 1638 |
string fn = path+CFile::findNewFile("aessys.tmp");
|
| 1639 | 1639 |
string fne = path+CFile::findNewFile("aessyse.tmp");
|
| 1640 |
|
|
| 1640 |
|
|
| 1641 | 1641 |
cmd += " >" + fn + " 2>" + fne; |
| 1642 |
|
|
| 1642 |
|
|
| 1643 | 1643 |
log.displayNL("Executing: '%s' in directory '%s'", cmd.c_str(), CPath::getCurrentPath().c_str());
|
| 1644 | 1644 |
|
| 1645 | 1645 |
system(cmd.c_str()); |
| 1646 |
|
|
| 1646 |
|
|
| 1647 | 1647 |
char str[1024]; |
| 1648 | 1648 |
|
| 1649 | 1649 |
FILE *fp = fopen(fn.c_str(), "rt"); |
| ... | ... | |
| 1656 | 1656 |
break; |
| 1657 | 1657 |
log.displayRaw(res); |
| 1658 | 1658 |
} |
| 1659 |
|
|
| 1659 |
|
|
| 1660 | 1660 |
fclose(fp); |
| 1661 | 1661 |
} |
| 1662 | 1662 |
else |
| 1663 | 1663 |
{
|
| 1664 | 1664 |
log.displayNL("No stdout");
|
| 1665 | 1665 |
} |
| 1666 |
|
|
| 1666 |
|
|
| 1667 | 1667 |
fp = fopen(fne.c_str(), "rt"); |
| 1668 | 1668 |
if (fp != NULL) |
| 1669 | 1669 |
{
|
| ... | ... | |
| 1674 | 1674 |
break; |
| 1675 | 1675 |
log.displayRaw(res); |
| 1676 | 1676 |
} |
| 1677 |
|
|
| 1677 |
|
|
| 1678 | 1678 |
fclose(fp); |
| 1679 | 1679 |
} |
| 1680 | 1680 |
else |
| ... | ... | |
| 1731 | 1731 |
} |
| 1732 | 1732 |
else |
| 1733 | 1733 |
log.displayNL( "Task is not running" ); |
| 1734 |
}
|
|
| 1734 |
} |
|
| 1735 | 1735 |
|
| 1736 | 1736 |
return true; |
| 1737 | 1737 |
} |
| nelns/admin_service/admin_service.cpp (working copy) | ||
|---|---|---|
| 103 | 103 |
uint NbWaiting; |
| 104 | 104 |
uint32 NbReceived; |
| 105 | 105 |
TSockId From; |
| 106 |
uint32 Time; // when the request was ask
|
|
| 107 |
|
|
| 106 |
time_t Time; // when the request was ask
|
|
| 107 |
|
|
| 108 | 108 |
uint32 NbRow; |
| 109 | 109 |
uint32 NbLines; |
| 110 | 110 |
|
| ... | ... | |
| 203 | 203 |
for (aesit = AdminExecutorServices.begin(); aesit != AdminExecutorServices.end(); aesit++) |
| 204 | 204 |
if ((*aesit).SId == sid) |
| 205 | 205 |
break; |
| 206 |
|
|
| 206 |
|
|
| 207 | 207 |
if (asrt) |
| 208 | 208 |
nlassert (aesit != AdminExecutorServices.end()); |
| 209 | 209 |
return aesit; |
| ... | ... | |
| 215 | 215 |
for (aesit = AdminExecutorServices.begin(); aesit != AdminExecutorServices.end(); aesit++) |
| 216 | 216 |
if ((*aesit).Name == name) |
| 217 | 217 |
break; |
| 218 |
|
|
| 218 |
|
|
| 219 | 219 |
if (asrt) |
| 220 | 220 |
nlassert (aesit != AdminExecutorServices.end()); |
| 221 |
|
|
| 221 |
|
|
| 222 | 222 |
return aesit; |
| 223 | 223 |
} |
| 224 | 224 |
|
| ... | ... | |
| 236 | 236 |
|
| 237 | 237 |
char *query; |
| 238 | 238 |
NLMISC_CONVERT_VARGS (query, format, 1024); |
| 239 |
|
|
| 239 |
|
|
| 240 | 240 |
if (DatabaseConnection == 0) |
| 241 | 241 |
{
|
| 242 | 242 |
nlwarning ("MYSQL: mysql_query (%s) failed: DatabaseConnection is 0", query);
|
| 243 | 243 |
return NULL; |
| 244 | 244 |
} |
| 245 |
|
|
| 245 |
|
|
| 246 | 246 |
int ret = mysql_query (DatabaseConnection, query); |
| 247 | 247 |
if (ret != 0) |
| 248 | 248 |
{
|
| 249 | 249 |
nlwarning ("MYSQL: mysql_query () failed for query '%s': %s", query, mysql_error(DatabaseConnection));
|
| 250 | 250 |
return 0; |
| 251 | 251 |
} |
| 252 |
|
|
| 252 |
|
|
| 253 | 253 |
sqlCurrentQueryResult = mysql_store_result(DatabaseConnection); |
| 254 | 254 |
if (sqlCurrentQueryResult == 0) |
| 255 | 255 |
{
|
| 256 | 256 |
nlwarning ("MYSQL: mysql_store_result () failed for query '%s': %s", query, mysql_error(DatabaseConnection));
|
| 257 | 257 |
return 0; |
| 258 | 258 |
} |
| 259 |
|
|
| 259 |
|
|
| 260 | 260 |
MYSQL_ROW row = mysql_fetch_row(sqlCurrentQueryResult); |
| 261 | 261 |
if (row == 0) |
| 262 | 262 |
{
|
| 263 | 263 |
nlwarning ("MYSQL: mysql_fetch_row () failed for query '%s': %s", query, mysql_error(DatabaseConnection));
|
| 264 | 264 |
} |
| 265 |
|
|
| 265 |
|
|
| 266 | 266 |
nldebug ("MYSQL: sqlQuery(%s) returns %d rows", query, mysql_num_rows(sqlCurrentQueryResult));
|
| 267 |
|
|
| 268 |
return row;
|
|
| 267 |
|
|
| 268 |
return row; |
|
| 269 | 269 |
} |
| 270 | 270 |
|
| 271 | 271 |
MYSQL_ROW sqlNextRow () |
| ... | ... | |
| 275 | 275 |
|
| 276 | 276 |
if (sqlCurrentQueryResult == 0) |
| 277 | 277 |
return 0; |
| 278 |
|
|
| 278 |
|
|
| 279 | 279 |
return mysql_fetch_row(sqlCurrentQueryResult); |
| 280 | 280 |
} |
| 281 | 281 |
|
| ... | ... | |
| 297 | 297 |
// |
| 298 | 298 |
|
| 299 | 299 |
string Email; |
| 300 |
uint32 FirstEmailTime = 0;
|
|
| 300 |
time_t FirstEmailTime = 0;
|
|
| 301 | 301 |
|
| 302 | 302 |
void sendAdminAlert (const char *format, ...) |
| 303 | 303 |
{
|
| ... | ... | |
| 360 | 360 |
{
|
| 361 | 361 |
subject = "Multiple problems"; |
| 362 | 362 |
} |
| 363 |
|
|
| 363 |
|
|
| 364 | 364 |
std::string from; |
| 365 | 365 |
if(IService::getInstance()->ConfigFile.exists("AdminEmailFrom"))
|
| 366 | 366 |
from = IService::getInstance()->ConfigFile.getVar("AdminEmailFrom").asString();
|
| ... | ... | |
| 404 | 404 |
msgin.serial (service, var, val); |
| 405 | 405 |
|
| 406 | 406 |
AESIT aesit = findAES (sid); |
| 407 |
|
|
| 407 |
|
|
| 408 | 408 |
string shard, server; |
| 409 | 409 |
shard = (*aesit).Shard; |
| 410 | 410 |
server = (*aesit).Name; |
| 411 |
|
|
| 411 |
|
|
| 412 | 412 |
if (!shard.empty() && !server.empty() && !service.empty() && !var.empty()) |
| 413 | 413 |
{
|
| 414 | 414 |
string path = CPath::standardizePath (IService::getInstance()->ConfigFile.getVar("RRDVarPath").asString());
|
| 415 | 415 |
string rrdfilename = path + shard+"."+server+"."+service+"."+var+".rrd"; |
| 416 | 416 |
|
| 417 | 417 |
string arg; |
| 418 |
|
|
| 418 |
|
|
| 419 | 419 |
if (!NLMISC::CFile::fileExists(rrdfilename)) |
| 420 | 420 |
{
|
| 421 | 421 |
MYSQL_ROW row = sqlQuery ("select graph_update from variable where path like '%%%s' and graph_update!=0", var.c_str());
|
| ... | ... | |
| 541 | 541 |
|
| 542 | 542 |
void cleanRequest () |
| 543 | 543 |
{
|
| 544 |
uint32 currentTime = CTime::getSecondsSince1970 ();
|
|
| 544 |
time_t currentTime = CTime::getSecondsSince1970 ();
|
|
| 545 | 545 |
|
| 546 | 546 |
bool timeout; |
| 547 | 547 |
|
| ... | ... | |
| 560 | 560 |
{
|
| 561 | 561 |
nlwarning ("REQUEST: Request %d timeouted, only %d on %d services have replied", Requests[i].Id, Requests[i].NbReceived, Requests[i].NbWaiting);
|
| 562 | 562 |
} |
| 563 |
|
|
| 563 |
|
|
| 564 | 564 |
if (Requests[i].Log.empty()) |
| 565 | 565 |
{
|
| 566 | 566 |
if (Requests[i].NbRow == 0 && timeout) |
| ... | ... | |
| 682 | 682 |
vector<string> informations; |
| 683 | 683 |
|
| 684 | 684 |
CMessage msgout("AES_INFO");
|
| 685 |
|
|
| 685 |
|
|
| 686 | 686 |
// |
| 687 | 687 |
// send services that should be running on this AES |
| 688 | 688 |
// |
| ... | ... | |
| 713 | 713 |
} |
| 714 | 714 |
sqlFlushResult(); |
| 715 | 715 |
msgout.serialCont (informations); |
| 716 |
|
|
| 716 |
|
|
| 717 | 717 |
// |
| 718 | 718 |
// send graph update for services that should running on this AES |
| 719 | 719 |
// |
| ... | ... | |
| 746 | 746 |
} |
| 747 | 747 |
sqlFlushResult(); |
| 748 | 748 |
msgout.serialCont (informations); |
| 749 |
|
|
| 749 |
|
|
| 750 | 750 |
nlinfo ("Sending all informations about %s AES-%hu (hostedservices, alarms,grapupdate)", (*aesit).Name.c_str(), (*aesit).SId.get());
|
| 751 | 751 |
CUnifiedNetwork::getInstance ()->send (sid, msgout); |
| 752 | 752 |
} |
| ... | ... | |
| 802 | 802 |
} |
| 803 | 803 |
string shard = row[0]; |
| 804 | 804 |
sqlFlushResult(); |
| 805 |
|
|
| 805 |
|
|
| 806 | 806 |
AdminExecutorServices.push_back (CAdminExecutorService(shard, server, sid)); |
| 807 | 807 |
|
| 808 | 808 |
nlinfo ("%s-%hu, server name %s, for shard %s connected and added in the list", serviceName.c_str(), sid.get(), server.c_str(), shard.c_str());
|
| 809 |
|
|
| 809 |
|
|
| 810 | 810 |
// send him services that should run on this server |
| 811 | 811 |
sendAESInformations (sid); |
| 812 | 812 |
} |
| ... | ... | |
| 863 | 863 |
AdminExecutorServices.push_back (CAdminExecutorService(shard, server, sid)); |
| 864 | 864 |
|
| 865 | 865 |
nlinfo ("%s-%hu, server name %s, for shard %s connected and added in the list", serviceName.c_str(), sid.get(), server.c_str(), shard.c_str());
|
| 866 |
|
|
| 866 |
|
|
| 867 | 867 |
// send him services that should run on this server |
| 868 | 868 |
sendAESInformations (sid); |
| 869 | 869 |
} |
| ... | ... | |
| 1022 | 1022 |
else if (shard == "*" && server == "#") |
| 1023 | 1023 |
{
|
| 1024 | 1024 |
// Select all shard all server including offline one |
| 1025 |
|
|
| 1025 |
|
|
| 1026 | 1026 |
MYSQL_ROW row = sqlQuery ("select distinct server, shard from service");
|
| 1027 |
|
|
| 1027 |
|
|
| 1028 | 1028 |
while (row != NULL) |
| 1029 | 1029 |
{
|
| 1030 | 1030 |
AESIT aesit = findAES (row[0], false); |
| 1031 |
|
|
| 1031 |
|
|
| 1032 | 1032 |
if (aesit != AdminExecutorServices.end()) |
| 1033 | 1033 |
{
|
| 1034 | 1034 |
addRequestWaitingNb (rid); |
| 1035 | 1035 |
(*aesit).WaitingRequestId.push_back (rid); |
| 1036 |
|
|
| 1036 |
|
|
| 1037 | 1037 |
CMessage msgout("AES_GET_VIEW");
|
| 1038 | 1038 |
msgout.serial (rid); |
| 1039 | 1039 |
msgout.serial (subvarpath.Destination[j].second); |
| 1040 | 1040 |
CUnifiedNetwork::getInstance ()->send ((*aesit).SId, msgout); |
| 1041 | 1041 |
nlinfo ("REQUEST: Sent view '%s' to shard name %s 'AES-%hu'", subvarpath.Destination[j].second.c_str(), (*aesit).Name.c_str(), (*aesit).SId.get());
|
| 1042 |
|
|
| 1042 |
|
|
| 1043 | 1043 |
} |
| 1044 | 1044 |
else if (server == "#") |
| 1045 | 1045 |
{
|
| 1046 | 1046 |
vector<string> vara, vala; |
| 1047 |
|
|
| 1047 |
|
|
| 1048 | 1048 |
// adding default row |
| 1049 | 1049 |
vara.push_back ("shard");
|
| 1050 | 1050 |
vala.push_back (row[1]); |
| ... | ... | |
| 1054 | 1054 |
|
| 1055 | 1055 |
vara.push_back ("service");
|
| 1056 | 1056 |
vala.push_back ("AES");
|
| 1057 |
|
|
| 1057 |
|
|
| 1058 | 1058 |
vara.push_back ("State");
|
| 1059 | 1059 |
vala.push_back ("Offline");
|
| 1060 |
|
|
| 1060 |
|
|
| 1061 | 1061 |
addRequestAnswer (rid, vara, vala); |
| 1062 | 1062 |
} |
| 1063 | 1063 |
row = sqlNextRow (); |
| ... | ... | |
| 1089 | 1089 |
else if (server == "#") |
| 1090 | 1090 |
{
|
| 1091 | 1091 |
vector<string> vara, vala; |
| 1092 |
|
|
| 1092 |
|
|
| 1093 | 1093 |
// adding default row |
| 1094 | 1094 |
vara.push_back ("shard");
|
| 1095 | 1095 |
vala.push_back (shard); |
| 1096 | 1096 |
|
| 1097 | 1097 |
vara.push_back ("server");
|
| 1098 | 1098 |
vala.push_back (row[0]); |
| 1099 |
|
|
| 1099 |
|
|
| 1100 | 1100 |
vara.push_back ("service");
|
| 1101 | 1101 |
vala.push_back ("AES");
|
| 1102 |
|
|
| 1102 |
|
|
| 1103 | 1103 |
vara.push_back ("State");
|
| 1104 | 1104 |
vala.push_back ("Offline");
|
| 1105 | 1105 |
|
| ... | ... | |
| 1178 | 1178 |
|
| 1179 | 1179 |
varRequestTimeout (ConfigFile.getVar ("RequestTimeout"));
|
| 1180 | 1180 |
ConfigFile.setCallback("RequestTimeout", &varRequestTimeout);
|
| 1181 |
|
|
| 1181 |
|
|
| 1182 | 1182 |
varAdminAlertAccumlationTime (ConfigFile.getVar ("AdminAlertAccumlationTime"));
|
| 1183 | 1183 |
ConfigFile.setCallback("AdmimAlertAccumlationTime", &varAdminAlertAccumlationTime);
|
| 1184 |
|
|
| 1184 |
|
|
| 1185 | 1185 |
} |
| 1186 | 1186 |
|
| 1187 | 1187 |
bool update () |
| 1188 | 1188 |
{
|
| 1189 | 1189 |
cleanRequest (); |
| 1190 | 1190 |
connectionWebUpdate (); |
| 1191 |
|
|
| 1191 |
|
|
| 1192 | 1192 |
updateSendAdminAlert (); |
| 1193 | 1193 |
return true; |
| 1194 | 1194 |
} |
| ... | ... | |
| 1251 | 1251 |
NLMISC_COMMAND (generateAlert, "generate an alert", "<text>") |
| 1252 | 1252 |
{
|
| 1253 | 1253 |
if(args.size() != 1) return false; |
| 1254 |
|
|
| 1254 |
|
|
| 1255 | 1255 |
sendAdminAlert (args[0].c_str()); |
| 1256 | 1256 |
|
| 1257 | 1257 |
return true; |