diff options
Diffstat (limited to 'TAO/orbsvcs')
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.cpp | 19 | ||||
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/ImplRepo_i.h | 3 | ||||
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/Options.cpp | 18 | ||||
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/Options.h | 8 | ||||
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/tao_imr_i.cpp | 74 | ||||
-rwxr-xr-x | TAO/orbsvcs/tests/ImplRepo/NameService/run_test.pl | 12 | ||||
-rwxr-xr-x | TAO/orbsvcs/tests/ImplRepo/locked/run_test.pl | 172 |
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; |