X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fsp.git;a=blobdiff_plain;f=shibsp%2Fhandler%2Fimpl%2FStatusHandler.cpp;h=3ef824e7e58b0661a4c655c4d29d4fa3e4b43e74;hp=f2cbd7f274ac7bec7b6e8379e99b22c36f4cf342;hb=a0af8ed86ab481af4605daf5cf837fdaa4544bdd;hpb=ef5033b9317ef36b5e3b99679cf789e93d8b6654 diff --git a/shibsp/handler/impl/StatusHandler.cpp b/shibsp/handler/impl/StatusHandler.cpp index f2cbd7f..3ef824e 100644 --- a/shibsp/handler/impl/StatusHandler.cpp +++ b/shibsp/handler/impl/StatusHandler.cpp @@ -29,6 +29,13 @@ #include "handler/RemotedHandler.h" #include "util/CGIParser.h" +#include +#include + +#ifdef HAVE_SYS_UTSNAME_H +# include +#endif + using namespace shibsp; #ifndef SHIBSP_LITE # include "SessionCache.h" @@ -77,6 +84,7 @@ namespace shibsp { private: pair processMessage(const Application& application, const HTTPRequest& httpRequest, HTTPResponse& httpResponse) const; + ostream& systemInfo(ostream& os) const; set m_acl; }; @@ -293,16 +301,20 @@ pair StatusHandler::run(SPRequest& request, bool isHandler) const map props; settings.first->getAll(props); + DateTime now(time(nullptr)); + now.parseDateTime(); + auto_ptr_char timestamp(now.getFormattedString()); request.setContentType("text/xml"); stringstream msg; - msg << ""; + msg << ""; msg << ""; - msg << "::const_iterator p = props.begin(); p != props.end(); ++p) msg << ' ' << p->first << "='" << p->second << "'"; msg << '>' << target << ""; @@ -326,31 +338,39 @@ pair StatusHandler::run(SPRequest& request, bool isHandler) const } catch (XMLToolingException& ex) { m_log.error("error while processing request: %s", ex.what()); + DateTime now(time(nullptr)); + now.parseDateTime(); + auto_ptr_char timestamp(now.getFormattedString()); request.setContentType("text/xml"); stringstream msg; - msg << ""; + msg << ""; msg << ""; - msg << "" << ex.what() << ""; + systemInfo(msg) << "" << ex.what() << ""; msg << ""; return make_pair(true,request.sendResponse(msg, HTTPResponse::XMLTOOLING_HTTP_STATUS_ERROR)); } catch (exception& ex) { m_log.error("error while processing request: %s", ex.what()); + DateTime now(time(nullptr)); + now.parseDateTime(); + auto_ptr_char timestamp(now.getFormattedString()); request.setContentType("text/xml"); stringstream msg; - msg << ""; + msg << ""; msg << ""; - msg << "" << ex.what() << ""; + systemInfo(msg) << "" << ex.what() << ""; msg << ""; return make_pair(true,request.sendResponse(msg, HTTPResponse::XMLTOOLING_HTTP_STATUS_ERROR)); } @@ -387,15 +407,22 @@ pair StatusHandler::processMessage( #ifndef SHIBSP_LITE m_log.debug("processing status request"); + DateTime now(time(nullptr)); + now.parseDateTime(); + auto_ptr_char timestamp(now.getFormattedString()); + stringstream s; - s << ""; + s << ""; const char* status = ""; s << ""; + systemInfo(s); + const char* param = nullptr; if (param) { } @@ -488,3 +515,78 @@ pair StatusHandler::processMessage( return make_pair(false,0L); #endif } + +#ifdef WIN32 +typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); +#endif + +ostream& StatusHandler::systemInfo(ostream& os) const +{ +#if defined(HAVE_SYS_UTSNAME_H) + struct utsname sysinfo; + if (uname(&sysinfo) == 0) { + os << ""; + } +#elif defined(WIN32) + OSVERSIONINFOEX osvi; + memset(&osvi, 0, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + if(GetVersionEx((OSVERSIONINFO*)&osvi)) { + os << " 0) + os << " servicepack='" << osvi.wServicePackMajor << "." << osvi.wServicePackMinor << "'"; + switch (osvi.wProductType) { + case VER_NT_WORKSTATION: + os << " producttype='Workstation'"; + break; + case VER_NT_SERVER: + case VER_NT_DOMAIN_CONTROLLER: + os << " producttype='Server'"; + break; + } + + SYSTEM_INFO si; + memset(&si, 0, sizeof(SYSTEM_INFO)); + PGNSI pGNSI = (PGNSI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); + if(pGNSI) + pGNSI(&si); + else + GetSystemInfo(&si); + switch (si.dwProcessorType) { + case PROCESSOR_ARCHITECTURE_INTEL: + os << " arch='i386'"; + break; + case PROCESSOR_ARCHITECTURE_AMD64: + os << " arch='x86_64'"; + break; + case PROCESSOR_ARCHITECTURE_IA64: + os << " arch='IA64'"; + break; + } + os << " cpucount='" << si.dwNumberOfProcessors << "'"; + + MEMORYSTATUSEX ms; + memset(&ms, 0, sizeof(MEMORYSTATUSEX)); + ms.dwLength = sizeof(MEMORYSTATUSEX); + if (GlobalMemoryStatusEx(&ms)) { + os << " memory='" << (ms.ullTotalPhys / (1024 * 1024)) << "M'"; + } + + os << "/>"; + } +#endif + return os; +}