summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs')
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.cpp19
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.h3
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Options.cpp18
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Options.h8
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/tao_imr_i.cpp74
-rwxr-xr-xTAO/orbsvcs/tests/ImplRepo/NameService/run_test.pl12
-rwxr-xr-xTAO/orbsvcs/tests/ImplRepo/locked/run_test.pl172
7 files changed, 270 insertions, 36 deletions
diff --git a/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.cpp b/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.cpp
index 7537b9245f2..6f622d99735 100644
--- a/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.cpp
@@ -501,7 +501,12 @@ ImplRepo_i::register_server (const char *server,
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::Administration::AlreadyRegistered))
{
- if (OPTIONS::instance()->debug () >= 2)
+ if (OPTIONS::instance ()->readonly ())
+ {
+ ACE_THROW (CORBA::NO_PERMISSION ());
+ }
+
+ if (OPTIONS::instance ()->debug () >= 2)
{
ACE_DEBUG ((LM_DEBUG, "Server: %s\n"
"Command Line: %s\n"
@@ -564,9 +569,14 @@ ImplRepo_i::register_server (const char *server,
void
ImplRepo_i::reregister_server (const char *server,
const ImplementationRepository::StartupOptions &options,
- CORBA::Environment &)
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+ if (OPTIONS::instance ()->readonly ())
+ {
+ ACE_THROW (CORBA::NO_PERMISSION ());
+ }
+
// Get current starting up value
int starting_up = this->repository_.starting_up (server);
@@ -615,6 +625,11 @@ ImplRepo_i::remove_server (const char *server,
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::Administration::NotFound))
{
+ if (OPTIONS::instance ()->readonly ())
+ {
+ ACE_THROW (CORBA::NO_PERMISSION ());
+ }
+
if (this->repository_.remove (server) == 0)
{
if (OPTIONS::instance()->debug () >= 1)
diff --git a/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.h b/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.h
index 306ef0e3cd3..fbab774fe28 100644
--- a/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.h
+++ b/TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.h
@@ -80,8 +80,7 @@ public:
) ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::Administration::NotFound));
- /// Attempts to gracefully shut down the server, if that fails, will try
- /// to do it ungracefully.
+ /// Attempts to gracefully shut down the server,
virtual void shutdown_server (
const char *server,
CORBA::Environment &ACE_TRY_ENV = TAO_default_environment ()
diff --git a/TAO/orbsvcs/ImplRepo_Service/Options.cpp b/TAO/orbsvcs/ImplRepo_Service/Options.cpp
index 2282711119b..b0bf3badf9d 100644
--- a/TAO/orbsvcs/ImplRepo_Service/Options.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/Options.cpp
@@ -33,6 +33,7 @@ Options::Options ()
, ping_interval_ (0, 200)
, service_ (0)
, startup_timeout_ (5)
+ , readonly_ (0)
{
}
@@ -94,6 +95,12 @@ Options::parse_args (int &argc, ACE_TCHAR *argv[])
this->debug_ = ACE_OS::atoi (shifter.get_current ());
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
+ ACE_TEXT ("-l")) == 0)
+ {
+ // Lock the database
+ this->readonly_ = 1;
+ }
+ else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-m")) == 0)
{
// multicast?
@@ -290,6 +297,7 @@ Options::print_usage (void) const
"\n"
" -c command Runs service commands ('install' or 'remove')\n"
" -d level Sets the debug level\n"
+ " -l Lock the database\n"
" -m [0/1] Turn on(1)/off(0) multicast (default: 1)\n"
" -o file Outputs the ImR's IOR to a file\n"
" -p file Use file for storing/loading settings\n"
@@ -659,7 +667,15 @@ Options::multicast (void) const
return this->multicast_;
}
-
+/**
+ * @retval 0 Normal operation.
+ * @retval 1 Do not let server info be modified.
+ */
+int
+Options::readonly (void) const
+{
+ return this->readonly_;
+}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Singleton <Options, ACE_Null_Mutex>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
diff --git a/TAO/orbsvcs/ImplRepo_Service/Options.h b/TAO/orbsvcs/ImplRepo_Service/Options.h
index 93d3ea0a31d..01dcec2d7c6 100644
--- a/TAO/orbsvcs/ImplRepo_Service/Options.h
+++ b/TAO/orbsvcs/ImplRepo_Service/Options.h
@@ -63,7 +63,10 @@ public:
CORBA::ORB_ptr orb (void) const;
/// Will we listen for multicast location requests?
- int multicast (void) const;
+ int multicast (void) const;
+
+ /// Do we allow modifications to the servers?
+ int readonly (void) const;
private:
/// Parses and pulls out arguments for the ImR
@@ -110,6 +113,9 @@ private:
/// The amount of time to wait for a server to response after starting it.
ACE_Time_Value startup_timeout_;
+
+ /// Can the server_repository be modified?
+ int readonly_;
};
typedef ACE_Singleton <Options, ACE_Null_Mutex> OPTIONS;
diff --git a/TAO/orbsvcs/ImplRepo_Service/tao_imr_i.cpp b/TAO/orbsvcs/ImplRepo_Service/tao_imr_i.cpp
index bd92d945272..887d2921ba2 100644
--- a/TAO/orbsvcs/ImplRepo_Service/tao_imr_i.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/tao_imr_i.cpp
@@ -10,6 +10,14 @@
// How many servers should we get at once?
const size_t IR_LIST_CHUNK = 10;
+// exception return codes
+const int NORMAL = 0;
+const int UNKNOWN = 1;
+const int NO_PERMISSION = 2;
+const int ALREADY_REGISTERED = 3;
+const int CANNOT_ACTIVATE = 4;
+const int NOT_FOUND = 5;
+
// Constructor
TAO_IMR_i::TAO_IMR_i (void)
@@ -33,7 +41,7 @@ TAO_IMR_i::run ()
if (this->op_ == 0)
{
ACE_ERROR ((LM_ERROR, "Unknown operation"));
- return -1;
+ return UNKNOWN;
}
return this->op_->run ();
@@ -619,22 +627,22 @@ TAO_IMR_Op_Activate::run (void)
ACE_ERROR ((LM_ERROR, "Cannot activate server <%s>, reason: <%s>\n",
this->server_name_.c_str (),
ex.reason.in ()));
- return -1;
+ return CANNOT_ACTIVATE;
}
ACE_CATCH (ImplementationRepository::Administration::NotFound, ex)
{
ACE_ERROR ((LM_ERROR, "Could not find server <%s>!\n", this->server_name_.c_str ()));
- return -1;
+ return NOT_FOUND;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Activating Server");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
// Success
- return 0;
+ return NORMAL;
}
int
@@ -658,17 +666,22 @@ TAO_IMR_Op_Add::run (void)
ACE_CATCH (ImplementationRepository::Administration::AlreadyRegistered, ex)
{
ACE_ERROR ((LM_ERROR, "Server <%s> already registered!\n", this->server_name_.c_str ()));
- return -1;
+ return ALREADY_REGISTERED;
+ }
+ ACE_CATCH (CORBA::NO_PERMISSION, ex)
+ {
+ ACE_ERROR ((LM_ERROR, "No Permission: ImplRepo is in Locked mode\n"));
+ return NO_PERMISSION;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Adding server");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
// Success
- return 0;
+ return NORMAL;
}
int
@@ -720,10 +733,11 @@ TAO_IMR_Op_Autostart::run (void)
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "autostart");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
- return 0;
+
+ return NORMAL;
}
int
@@ -798,10 +812,11 @@ TAO_IMR_Op_IOR::run (void)
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Ior");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
- return 0;
+
+ return NORMAL;
}
int
@@ -857,15 +872,16 @@ TAO_IMR_Op_List::run (void)
ACE_CATCH (ImplementationRepository::Administration::NotFound, ex)
{
ACE_ERROR ((LM_ERROR, "Could not find server <%s>!\n", this->server_name_.c_str ()));
- return -1;
+ return NOT_FOUND;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "List");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
- return 0;
+
+ return NORMAL;
}
int
@@ -882,17 +898,22 @@ TAO_IMR_Op_Remove::run (void)
ACE_CATCH (ImplementationRepository::Administration::NotFound, ex)
{
ACE_ERROR ((LM_ERROR, "Could not find server <%s>!\n", this->server_name_.c_str ()));
- return -1;
+ return NOT_FOUND;
+ }
+ ACE_CATCH (CORBA::NO_PERMISSION, ex)
+ {
+ ACE_ERROR ((LM_ERROR, "No Permission: ImplRepo is in Locked mode\n"));
+ return NO_PERMISSION;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Removing Server");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
// Success
- return 0;
+ return NORMAL;
}
int
@@ -909,17 +930,17 @@ TAO_IMR_Op_Shutdown::run (void)
ACE_CATCH (ImplementationRepository::Administration::NotFound, ex)
{
ACE_ERROR ((LM_ERROR, "Could not find server <%s>!\n", this->server_name_.c_str ()));
- return -1;
+ return NOT_FOUND;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Shutting Down Server");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
// Success
- return 0;
+ return NORMAL;
}
int
@@ -957,17 +978,22 @@ TAO_IMR_Op_Update::run (void)
ACE_CATCH (ImplementationRepository::Administration::NotFound, ex)
{
ACE_ERROR ((LM_ERROR, "Could not find server <%s>\n", this->server_name_.c_str ()));
- return -1;
+ return NOT_FOUND;
+ }
+ ACE_CATCH (CORBA::NO_PERMISSION, ex)
+ {
+ ACE_ERROR ((LM_ERROR, "No Permission: ImplRepo is in Locked mode\n"));
+ return NO_PERMISSION;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Updating server");
- return -1;
+ return UNKNOWN;
}
ACE_ENDTRY;
// Success
- return 0;
+ return NORMAL;
}
diff --git a/TAO/orbsvcs/tests/ImplRepo/NameService/run_test.pl b/TAO/orbsvcs/tests/ImplRepo/NameService/run_test.pl
index c7ae582978f..159e8ad8b72 100755
--- a/TAO/orbsvcs/tests/ImplRepo/NameService/run_test.pl
+++ b/TAO/orbsvcs/tests/ImplRepo/NameService/run_test.pl
@@ -56,8 +56,8 @@ $TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
$taoimr = $TAO_IMR->SpawnWaitKill (60);
-if ($tao_imr != 0) {
- print STDERR "ERROR: tao_imr (add) returned $tao_imr\n";
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (add) returned $taoimr\n";
++$errors;
}
@@ -70,8 +70,8 @@ $TAO_IMR->Arguments ("-ORBInitRef ImplRepoService=file://$imr_ior"
$taoimr = $TAO_IMR->SpawnWaitKill (60);
-if ($tao_imr != 0) {
- print STDERR "ERROR: tao_imr (ior) returned $tao_imr\n";
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (ior) returned $taoimr\n";
++$errors;
}
@@ -96,8 +96,8 @@ $TAO_IMR->Arguments ("-ORBInitRef ImplRepoService=file://$imr_ior shutdown "
$taoimr = $TAO_IMR->SpawnWaitKill (60);
-if ($tao_imr != 0) {
- print STDERR "ERROR: tao_imr (shutdown) returned $tao_imr\n";
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (shutdown) returned $taoimr\n";
++$errors;
}
diff --git a/TAO/orbsvcs/tests/ImplRepo/locked/run_test.pl b/TAO/orbsvcs/tests/ImplRepo/locked/run_test.pl
new file mode 100755
index 00000000000..7d086ade1cb
--- /dev/null
+++ b/TAO/orbsvcs/tests/ImplRepo/locked/run_test.pl
@@ -0,0 +1,172 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
+ & eval 'exec perl -S $0 $argv:q'
+ if 0;
+
+# $Id$
+# -*- perl -*-
+
+use lib "../../../../../bin";
+use PerlACE::Run_Test;
+
+################################################################################
+# Program locations
+
+$imr_ior = PerlACE::LocalFile ("imr.ior");
+$pfile = PerlACE::LocalFile ("persistence.dat");
+
+$IMR = new PerlACE::Process ("../../../ImplRepo_Service/ImplRepo_Service");
+
+if ($^O eq "MSWin32") {
+ $TAO_IMR = new PerlACE::Process ("../../../../../bin/tao_imr");
+}
+else {
+ $TAO_IMR = new PerlACE::Process ("../../../ImplRepo_Service/tao_imr");
+}
+
+################################################################################
+
+$errors = 0;
+
+unlink $imr_ior;
+unlink $pfile;
+
+################################################################################
+## Start the implementation Repository
+
+$IMR->Arguments ("-o $imr_ior -d 0 -p $pfile");
+$IMR->Spawn ();
+
+if (PerlACE::waitforfile_timed ($imr_ior, 5) == -1) {
+ print STDERR "ERROR: waiting for $imr_ior\n";
+ $IMR->Kill ();
+ exit 1;
+}
+
+################################################################################
+## Test out commands on the IMR
+
+print "===== Adding a server\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " add Foo -c foobarbaz");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (add) returned $taoimr\n";
+ ++$errors;
+}
+
+print "===== Updating a server\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " update Foo -w foodir");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (update) returned $taoimr\n";
+ ++$errors;
+}
+
+print "===== Removing a server\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " remove Foo");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (remove) returned $taoimr\n";
+ ++$errors;
+}
+
+print "===== Readding a server\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " add Foo -c foobarbaz");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 0) {
+ print STDERR "ERROR: tao_imr (add) returned $taoimr\n";
+ ++$errors;
+}
+
+################################################################################
+## Kill the IMR
+
+$iserver = $IMR->TerminateWaitKill (5);
+
+if ($iserver != 0) {
+ print STDERR "ERROR: IMR returned $iserver\n";
+ ++$errors;
+}
+
+unlink $imr_ior;
+
+################################################################################
+## Restart the Implementation Repository in locked mode.
+
+$IMR->Arguments ("-o $imr_ior -d 0 -l -p $pfile");
+$IMR->Spawn ();
+
+if (PerlACE::waitforfile_timed ($imr_ior, 5) == -1) {
+ print STDERR "ERROR: waiting for $imr_ior\n";
+ $IMR->Kill ();
+ exit 1;
+}
+
+################################################################################
+## Test out commands on the IMR
+
+print "===== Adding a server (should fail)\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " add Foo2 -c foobarbaz");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 2) {
+ print STDERR "ERROR: tao_imr (add) returned $taoimr\n";
+ ++$errors;
+}
+
+print "===== Updating a server (should fail)\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " update Foo -w foodir");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 2) {
+ print STDERR "ERROR: tao_imr (update) returned $taoimr\n";
+ ++$errors;
+}
+
+print "===== Removing a server (should fail)\n";
+
+$TAO_IMR->Arguments("-ORBInitRef ImplRepoService=file://$imr_ior"
+ . " remove Foo");
+
+$taoimr = $TAO_IMR->SpawnWaitKill (60);
+
+if ($taoimr != 2) {
+ print STDERR "ERROR: tao_imr (remove) returned $taoimr\n";
+ ++$errors;
+}
+
+################################################################################
+## Kill the IMR
+
+$iserver = $IMR->TerminateWaitKill (5);
+
+if ($iserver != 0) {
+ print STDERR "ERROR: IMR returned $iserver\n";
+ ++$errors;
+}
+
+unlink $imr_ior;
+unlink $pfile;
+
+exit $errors;