diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier/GlacierStarter.cpp | 6 | ||||
-rw-r--r-- | cpp/src/Glacier2/Glacier2Router.cpp | 193 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.cpp | 23 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 33 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.h | 3 |
6 files changed, 188 insertions, 72 deletions
diff --git a/cpp/src/Glacier/GlacierStarter.cpp b/cpp/src/Glacier/GlacierStarter.cpp index 08c4790163a..aa55e48182c 100644 --- a/cpp/src/Glacier/GlacierStarter.cpp +++ b/cpp/src/Glacier/GlacierStarter.cpp @@ -114,8 +114,8 @@ Glacier::StarterService::start(int argc, char* argv[]) Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Glacier.Starter"); // - // Get the permissions verifier, or create one if no verifier is - // specified. + // Get the permissions verifier, or create a default one if no + // verifier is specified. // string verifierProperty = properties->getProperty("Glacier.Starter.PermissionsVerifier"); PermissionsVerifierPrx verifier; @@ -187,7 +187,7 @@ Glacier::StarterService::stop() // // Destroy the starter. // - assert(_starter); + assert(_starterv); _starter->destroy(); return true; diff --git a/cpp/src/Glacier2/Glacier2Router.cpp b/cpp/src/Glacier2/Glacier2Router.cpp index 3da96a95248..b744af190dd 100644 --- a/cpp/src/Glacier2/Glacier2Router.cpp +++ b/cpp/src/Glacier2/Glacier2Router.cpp @@ -7,8 +7,10 @@ // // ********************************************************************** -#include <Ice/Application.h> +#include <IceUtil/UUID.h> +#include <Ice/Service.h> #include <Glacier2/SessionRouterI.h> +#include <Glacier2/CryptPermissionsVerifierI.h> using namespace std; using namespace Ice; @@ -17,35 +19,39 @@ using namespace Glacier2; namespace Glacier2 { -class RouterApp : public Application +class RouterService : public Service { public: - void usage(); - virtual int run(int, char*[]); + RouterService(); + +protected: + + virtual bool start(int, char*[]); + virtual bool stop(); + virtual CommunicatorPtr initializeCommunicator(int&, char*[]); + +private: + + void usage(const std::string&); + + SessionRouterIPtr _sessionRouter; }; }; -void -Glacier2::RouterApp::usage() +Glacier2::RouterService::RouterService() { - cerr << "Usage: " << appName() << " [options]\n"; - cerr << - "Options:\n" - "-h, --help Show this message.\n" - "-v, --version Display the Ice version.\n" - ; } -int -Glacier2::RouterApp::run(int argc, char* argv[]) +bool +Glacier2::RouterService::start(int argc, char* argv[]) { for(int i = 1; i < argc; ++i) { if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { - usage(); + usage(argv[0]); return EXIT_SUCCESS; } else if(strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) @@ -55,8 +61,8 @@ Glacier2::RouterApp::run(int argc, char* argv[]) } else { - cerr << appName() << ": unknown option `" << argv[i] << "'" << endl; - usage(); + cerr << argv[0] << ": unknown option `" << argv[i] << "'" << endl; + usage(argv[0]); return EXIT_FAILURE; } } @@ -64,43 +70,119 @@ Glacier2::RouterApp::run(int argc, char* argv[]) PropertiesPtr properties = communicator()->getProperties(); // - // Initialize the client object adapter and servant locator. + // Initialize the client object adapter. // const char* clientEndpointsProperty = "Glacier2.Client.Endpoints"; if(properties->getProperty(clientEndpointsProperty).empty()) { - cerr << appName() << ": property `" << clientEndpointsProperty << "' is not set" << endl; + cerr << argv[0] << ": property `" << clientEndpointsProperty << "' is not set" << endl; return EXIT_FAILURE; } ObjectAdapterPtr clientAdapter = communicator()->createObjectAdapter("Glacier2.Client"); // + // Initialize the server object adapter only if server endpoints + // are defined. + // + const char* serverEndpointsProperty = "Glacier2.Server.Endpoints"; + ObjectAdapterPtr serverAdapter; + if(!properties->getProperty(serverEndpointsProperty).empty()) + { + serverAdapter = communicator()->createObjectAdapter("Glacier2.Server"); + } + + // + // Get the permissions verifier, or create a default one if no + // verifier is specified. + // + string verifierProperty = properties->getProperty("Glacier2.PermissionsVerifier"); + PermissionsVerifierPrx verifier; + if(!verifierProperty.empty()) + { + verifier = PermissionsVerifierPrx::checkedCast(communicator()->stringToProxy(verifierProperty)); + if(!verifier) + { + error("permissions verifier `" + verifierProperty + "' is invalid"); + return false; + } + } + else + { + string passwordsProperty = properties->getPropertyWithDefault("Glacier2.CryptPasswords", "passwords"); + + ifstream passwordFile(passwordsProperty.c_str()); + if(!passwordFile) + { + string err = strerror(errno); + error("cannot open `" + passwordsProperty + "' for reading: " + err); + return false; + } + + map<string, string> passwords; + + while(true) + { + string userId; + passwordFile >> userId; + if(!passwordFile) + { + break; + } + + string password; + passwordFile >> password; + if(!passwordFile) + { + break; + } + + assert(!userId.empty()); + assert(!password.empty()); + passwords.insert(make_pair(userId, password)); + } + + PermissionsVerifierPtr verifierImpl = new CryptPermissionsVerifierI(passwords); + + // + // We need a separate object adapter for any collocated + // permissions verifier. We can't use the client adapter. + // + ObjectAdapterPtr verifierAdapter = + communicator()->createObjectAdapterWithEndpoints(IceUtil::generateUUID(), ""); + verifier = PermissionsVerifierPrx::uncheckedCast(verifierAdapter->addWithUUID(verifierImpl)); + } + + // // Create a router implementation that can handle sessions, and // add it to the client object adapter. // - SessionRouterIPtr sessionRouter = new SessionRouterI(clientAdapter); + _sessionRouter = new SessionRouterI(clientAdapter, serverAdapter); const char* routerIdProperty = "Glacier2.RouterIdentity"; Identity routerId = stringToIdentity(properties->getPropertyWithDefault(routerIdProperty, "Glacier2/router")); - clientAdapter->add(sessionRouter, routerId); + clientAdapter->add(_sessionRouter, routerId); // // Everything ok, let's go. // - shutdownOnInterrupt(); clientAdapter->activate(); - communicator()->waitForShutdown(); - ignoreInterrupt(); + return true; +} + +bool +Glacier2::RouterService::stop() +{ // - // Destroy the session router, which destroys everything else. + // Destroy the session router. // - sessionRouter->destroy(); + assert(_sessionRouter); + _sessionRouter->destroy(); - return EXIT_SUCCESS; + return true; } -int -main(int argc, char* argv[]) +CommunicatorPtr +Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[]) { try { @@ -142,6 +224,55 @@ main(int argc, char* argv[]) exit(EXIT_FAILURE); } - RouterApp app; - return app.main(argc, argv); + return Service::initializeCommunicator(argc, argv); +} + +void +Glacier2::RouterService::usage(const string& appName) +{ + string options = + "Options:\n" + "-h, --help Show this message.\n" + "-v, --version Display the Ice version."; +#ifdef _WIN32 + if(checkSystem()) + { + options.append( + "\n" + "\n" + "--service NAME Run as the Windows service NAME.\n" + "\n" + "--install NAME [--display DISP] [--executable EXEC] [args]\n" + " Install as Windows service NAME. If DISP is\n" + " provided, use it as the display name,\n" + " otherwise NAME is used. If EXEC is provided,\n" + " use it as the service executable, otherwise\n" + " this executable is used. Any additional\n" + " arguments are passed unchanged to the\n" + " service at startup.\n" + "--uninstall NAME Uninstall Windows service NAME.\n" + "--start NAME [args] Start Windows service NAME. Any additional\n" + " arguments are passed unchanged to the\n" + " service.\n" + "--stop NAME Stop Windows service NAME." + ); + } +#else + options.append( + "\n" + "\n" + "--daemon Run as a daemon.\n" + "--noclose Do not close open file descriptors.\n" + "--nochdir Do not change the current working directory." + ); +#endif + cerr << "Usage: " << appName << " [options]" << endl; + cerr << options << endl; +} + +int +main(int argc, char* argv[]) +{ + Glacier2::RouterService svc; + return svc.main(argc, argv); } diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp index 164fe4d0b61..c6d16731175 100644 --- a/cpp/src/Glacier2/RouterI.cpp +++ b/cpp/src/Glacier2/RouterI.cpp @@ -45,20 +45,28 @@ private: }; Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, - const ObjectAdapterPtr& serverAdapter, - const TransportInfoPtr& transport) : + const ObjectAdapterPtr& serverAdapter, + const TransportInfoPtr& transport) : _communicator(clientAdapter->getCommunicator()), _routingTable(new IceInternal::RoutingTable), _routingTableTraceLevel(_communicator->getProperties()->getPropertyAsInt("Glacier2.Trace.RoutingTable")), _clientProxy(clientAdapter->createProxy(stringToIdentity("dummy"))), - _serverProxy(serverAdapter ? serverAdapter->createProxy(stringToIdentity("dummy")) : ObjectPrx()), - _clientBlobject(new ClientBlobject(_communicator, _routingTable, "")), - _serverBlobject(serverAdapter ? new ServerBlobject(_communicator, transport) : 0) + _clientBlobject(new ClientBlobject(_communicator, _routingTable, "")) { if(serverAdapter) { - assert(_serverBlobject); - serverAdapter->addServantLocator(new RouterLocator(_serverBlobject), ""); + ObjectPrx& serverProxy = const_cast<ObjectPrx&>(_serverProxy); + Identity ident; + ident.category.resize(20); + for(string::iterator p = ident.category.begin(); p != ident.category.end(); ++p) + { + *p = static_cast<char>(33 + rand() % (127-33)); // We use ASCII 33-126 (from ! to ~, w/o space). + } + serverProxy = serverAdapter->createProxy(ident); + + ServerBlobjectPtr& serverBlobject = const_cast<ServerBlobjectPtr&>(_serverBlobject); + serverBlobject = new ServerBlobject(_communicator, transport); + serverAdapter->addServantLocator(new RouterLocator(serverBlobject), ident.category); serverAdapter->activate(); } } @@ -93,7 +101,6 @@ Glacier2::RouterI::getServerProxy(const Current&) const void Glacier2::RouterI::addProxy(const ObjectPrx& proxy, const Current&) { - if(_routingTableTraceLevel) { Trace out(_communicator->getLogger(), "Glacier2"); diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp index 43144e8f75e..5545971151c 100644 --- a/cpp/src/Glacier2/ServerBlobject.cpp +++ b/cpp/src/Glacier2/ServerBlobject.cpp @@ -35,7 +35,7 @@ Glacier2::ServerBlobject::destroy() void Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB, const vector<Byte>& inParams, - const Current& current) + const Current& current) { assert(_transport); // Destroyed? diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 86374159d72..06fba1468cb 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -45,12 +45,13 @@ private: const SessionRouterIPtr _sessionRouter; }; -Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter) : +Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter, + const ObjectAdapterPtr& serverAdapter) : _logger(clientAdapter->getCommunicator()->getLogger()), _clientAdapter(clientAdapter), + _serverAdapter(serverAdapter), _traceLevel(clientAdapter->getCommunicator()->getProperties()->getPropertyAsInt("Glacier2.Trace.Session")), _sessionThread(new SessionThread(this)), - _serverAdapterCount(0), _routersHint(_routers.end()), _destroy(false) { @@ -110,25 +111,9 @@ Glacier2::SessionRouterI::createSession(const std::string& userId, const std::st assert(!_destroy); // - // Create a server object adapter only if server endpoints are - // defined. + // Add a new per-client router. // - CommunicatorPtr communicator = _clientAdapter->getCommunicator(); - PropertiesPtr properties = communicator->getProperties(); - string endpoints = properties->getProperty("Glacier2.Server.Endpoints"); - - ObjectAdapterPtr serverAdapter; - if(!endpoints.empty()) - { - ostringstream name; - name << "Glacier2.Server." << _serverAdapterCount++; - serverAdapter = communicator->createObjectAdapterWithEndpoints(name.str(), endpoints); - } - - // - // Add a new client router. - // - RouterIPtr router = new RouterI(_clientAdapter, serverAdapter, current.transport); + RouterIPtr router = new RouterI(_clientAdapter, _serverAdapter, current.transport); _routersHint = _routers.insert(_routersHint, pair<const TransportInfoPtr, RouterIPtr>(current.transport, router)); if(_traceLevel >= 1) @@ -136,14 +121,6 @@ Glacier2::SessionRouterI::createSession(const std::string& userId, const std::st Trace out(_logger, "Glacier2"); out << "added session for:\n"; out << current.transport->toString(); - if(serverAdapter) - { - Identity ident; - ident.name = "dummy"; - string endpts = _clientAdapter->getCommunicator()->proxyToString(serverAdapter->createProxy(ident)); - endpts.erase(0, endpts.find(':') + 1); - out << "\nserver adapter endpoints: " << endpts; - } } } diff --git a/cpp/src/Glacier2/SessionRouterI.h b/cpp/src/Glacier2/SessionRouterI.h index a614774cb1f..310cac974ea 100644 --- a/cpp/src/Glacier2/SessionRouterI.h +++ b/cpp/src/Glacier2/SessionRouterI.h @@ -28,7 +28,7 @@ class SessionRouterI : public Router, public IceUtil::Monitor<IceUtil::Mutex> { public: - SessionRouterI(const Ice::ObjectAdapterPtr&); + SessionRouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&); virtual ~SessionRouterI(); void destroy(); @@ -45,6 +45,7 @@ private: const Ice::LoggerPtr _logger; const Ice::ObjectAdapterPtr _clientAdapter; + const Ice::ObjectAdapterPtr _serverAdapter; const int _traceLevel; // |