summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier/GlacierStarter.cpp6
-rw-r--r--cpp/src/Glacier2/Glacier2Router.cpp193
-rw-r--r--cpp/src/Glacier2/RouterI.cpp23
-rw-r--r--cpp/src/Glacier2/ServerBlobject.cpp2
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp33
-rw-r--r--cpp/src/Glacier2/SessionRouterI.h3
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;
//