/** * Log out from SCARF. In practice, it trashes the cookie (if we were * successfully logged in). * * As the authentication method is specific to SCARF, this logout * method has been placed here as specific to SCARF too. Most likely * it is general to other LSF systems without any/much changes. * * @param username Username to use (should have authenticated * before). Leave it empty to log out the last (maybe only) user that * logged in with authenticate(). */ void SCARFLSFJobManager::logout(const std::string &username) { if (g_tokenStash.empty()) { throw std::runtime_error("Logout failed. No one is currenlty logged in."); } std::map<std::string, Token>::iterator it; if (!username.empty()) { it = g_tokenStash.find(username); if (g_tokenStash.end() == it) { throw std::invalid_argument( "Logout failed. The username given is not logged in: " + username); } } // only support for single-user Token tok = g_tokenStash.begin()->second; // logout query, needs headers = {'Content-Type': 'text/plain', 'Cookie': // token, // 'Accept': 'text/plain,application/xml,text/xml'} const std::string token = tok.m_token_str; const Poco::URI fullURL = makeFullURI(tok.m_url, g_logoutPath); const StringToStringMap headers = makeHeaders(std::string("text/plain"), token, g_acceptType); int code = 0; std::stringstream ss; try { code = doSendRequestGetResponse(fullURL, ss, headers); } catch (Kernel::Exception::InternetError &ie) { throw std::runtime_error("Error while sending HTTP request to log out: " + std::string(ie.what())); } if (Mantid::Kernel::InternetHelper::HTTP_OK == code) { g_log.notice() << "Logged out." << std::endl; g_log.debug() << "Response from server: " << ss.str() << std::endl; } else { throw std::runtime_error("Failed to logout from the web service at: " + fullURL.toString() + ". Please check your username."); } // successfully logged out, forget the token if (username.empty()) { // delete first one g_tokenStash.erase(g_tokenStash.begin()); } else { // delete requested one if (g_tokenStash.end() != it) g_tokenStash.erase(it); } }
/** * Ping the server to see if the web service is active/available. * Note that this method does not need the user to be logged in. * * For now this ping method sits here as specific to SCARF. It is not * clear at the moment if it is general to LSF. It could well be * possible to pull this into LSFJobManager. * * @return true if the web service responds. */ bool SCARFLSFJobManager::ping() { // Job ping, needs these headers: // headers = {'Content-Type': 'application/xml', 'Accept': ACCEPT_TYPE} const Poco::URI fullURL = makeFullURI(Poco::URI(g_pingBaseURL), g_pingPath); const StringToStringMap headers = makeHeaders(std::string("text/plain"), "", g_acceptType); int code = 0; std::stringstream ss; try { code = doSendRequestGetResponse(fullURL, ss, headers); } catch (Kernel::Exception::InternetError &ie) { throw std::runtime_error("Error while sending HTTP request to ping the " "server " + std::string(ie.what())); } bool ok = false; if (Mantid::Kernel::InternetHelper::HTTP_OK == code) { std::string resp = ss.str(); if (std::string::npos != resp.find("Web Services are ready")) { g_log.notice() << "Pinged compute resource with apparently good response: " << resp << '\n'; ok = true; } else { g_log.warning() << "Pinged compute resource but got what looks like an " "error message: " << resp << '\n'; } } else { throw std::runtime_error( "Failed to ping the web service at: " + fullURL.toString() + ". Please check your parameters, software version, " "etc."); } return ok; }