summaryrefslogtreecommitdiff
path: root/modules/CIAO/DAnCE/RepositoryManager/repository_manager_admin_exec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/DAnCE/RepositoryManager/repository_manager_admin_exec.cpp')
-rw-r--r--modules/CIAO/DAnCE/RepositoryManager/repository_manager_admin_exec.cpp466
1 files changed, 466 insertions, 0 deletions
diff --git a/modules/CIAO/DAnCE/RepositoryManager/repository_manager_admin_exec.cpp b/modules/CIAO/DAnCE/RepositoryManager/repository_manager_admin_exec.cpp
new file mode 100644
index 00000000000..f348ade098e
--- /dev/null
+++ b/modules/CIAO/DAnCE/RepositoryManager/repository_manager_admin_exec.cpp
@@ -0,0 +1,466 @@
+// $Id$
+
+/**
+ * @file repository_manager_admin_exec.cpp
+ * @author William R. Otte <wotte@dre.vanderbilt.edu>
+ *
+ * Simple administration program for the Repository Manager.
+ */
+
+#include "ace/Auto_Ptr.h"
+#include "ace/Get_Opt.h"
+#include "ace/Unbounded_Set.h"
+#include "ace/String_Base.h"
+#include "DAnCE/Logger/Log_Macros.h"
+#include "DAnCE/Logger/Logger_Service.h"
+#include "Deployment/Deployment_RepositoryManagerC.h"
+
+#include "repository_manager_admin.h"
+
+struct Options
+{
+ Options (void)
+ : rm_ior_ (""),
+ domain_nc_ (""),
+ list_ (false),
+ shutdown_ (false)
+ {
+ }
+
+ struct Installation
+ {
+ Installation (void)
+ {
+ }
+
+ bool init (const ACE_TCHAR *inst)
+ {
+ ACE_CString tmp (inst);
+
+ size_t begin = 0;
+ size_t pos = tmp.find (',', begin);
+
+ if (pos != ACE_CString::npos)
+ path_ = tmp.substring (begin, pos - begin);
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Installation::init - "
+ "Installation directive missing name and replace parameters, "
+ "must have form path,name,replace\n"));
+ return false;
+ }
+
+
+ begin = pos + 1;
+ pos = tmp.find (',', begin);
+
+ if (pos != ACE_CString::npos)
+ name_ = tmp.substring (begin, pos - begin);
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Installation::init - "
+ "Installation directive mssing replace parameter, "
+ "must have form path,name,replace\n"));
+ return false;
+ }
+
+ begin = pos + 1;
+
+ if (tmp[begin] == '0') replace_ = false;
+ else if (tmp[begin] == '1') replace_ = true;
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Installation::init - "
+ "Replace directive muse be 1 or 0.\n"));
+ return false;
+ }
+
+ return true;
+ }
+
+ bool operator== (const Installation &rhs) const
+ {
+ return (replace_ == rhs.replace_) &&
+ (path_ == rhs.path_) &&
+ (name_ == rhs.name_);
+ }
+
+ ACE_CString path_, name_;
+ bool replace_;
+ };
+
+ struct Creation
+ {
+ Creation (void)
+ {
+ }
+
+ bool init (const ACE_TCHAR *inst)
+ {
+ ACE_CString tmp (inst);
+
+ size_t begin = 0;
+ size_t pos = tmp.find (',', begin);
+
+ if (pos != ACE_CString::npos)
+ path_ = tmp.substring (begin, pos - begin);
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Creation::init - "
+ "Creation directive missing name, base location, and replace parameters, "
+ "must have form path,name,base,replace\n"));
+ return false;
+ }
+
+
+ begin = pos + 1;
+ pos = tmp.find (',', begin);
+
+ if (pos != ACE_CString::npos)
+ name_ = tmp.substring (begin, pos - begin);
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Creation::init - "
+ "Creation directive mssing base location and replace parameter, "
+ "must have form path,name,base,replace\n"));
+ return false;
+ }
+
+ begin = pos + 1;
+ pos = tmp.find (',', begin);
+
+ if (pos != ACE_CString::npos)
+ base_location_ = tmp.substring (begin, pos - begin);
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Creation::init - "
+ "Creation directive mssing replace parameter, "
+ "must have form path,name,base,replace\n"));
+ return false;
+ }
+
+ begin = pos + 1;
+
+ if (tmp[begin] == '0') replace_ = false;
+ else if (tmp[begin] == '1') replace_ = true;
+ else
+ {
+ ACE_ERROR ((LM_ERROR, DLINFO "Options::Creation::init - "
+ "Replace directive muse be 1 or 0.\n"));
+ return false;
+ }
+
+ return true;
+ }
+
+ bool operator== (const Creation &rhs) const
+ {
+ return (replace_ == rhs.replace_) &&
+ (path_ == rhs.path_) &&
+ (name_ == rhs.name_);
+ }
+
+ ACE_CString path_, name_, base_location_;
+ bool replace_;
+ };
+
+ const ACE_TCHAR *rm_ior_;
+ const ACE_TCHAR *domain_nc_;
+ ACE_Unbounded_Set< Installation > install_;
+ ACE_Unbounded_Set< Creation > create_;
+ ACE_Unbounded_Set< ACE_CString > uninstall_;
+ bool list_;
+ bool shutdown_;
+
+ void usage (void)
+ {
+ ACE_ERROR ((LM_EMERGENCY, "usage:\n"
+ "\t-h,--help\t\t\tThis message.\n"
+ "\t-r,--rm-ior <ior>\t\tIOR where the RM instance may be found\n"
+ "\t-i,--install <path>,<name>,<1|0>\tInstall package found at <path> into the RM, with <name>,\n"
+ "\t\t\t<1> replacing or <0> not replacing an existing package. *\n"
+ "\t-c,--create <path>,<name>,<base location>,<1|0>\tInstall package found at <path> into the RM, with <name>,\n"
+ "\t\t\t<base location>, <1> replacing or <0> not replacing an existing package. *\n"
+ "\t-u,--uninstall <uuid>\t\tUninstall package identified by UUID. *\n"
+ "\t-l,--list\t\t\tList all packages installed in the RM\n"
+ "\t-s,--shutdown\t\t\tShutdown the RM.\n"
+ "\t-d,--domain-nc <ior>\t\tProvide a reference to the domain naming context\n"
+
+ "\n\n\tArguments with a * may be specified multiple times.\n"));
+ }
+
+
+ int parse_args (int argc, ACE_TCHAR *argv[])
+ {
+ ACE_Get_Opt get_opt (argc, argv,
+ ACE_TEXT ("hr:i:c:u:lsd:"),
+ 0, 0,
+ ACE_Get_Opt::RETURN_IN_ORDER,
+ 1);
+
+ get_opt.long_option (ACE_TEXT("help"), 'h', ACE_Get_Opt::NO_ARG);
+ get_opt.long_option (ACE_TEXT("rm-ior"), 'r', ACE_Get_Opt::ARG_REQUIRED);
+ get_opt.long_option (ACE_TEXT("install"), 'i', ACE_Get_Opt::ARG_REQUIRED);
+ get_opt.long_option (ACE_TEXT("create"), 'c', ACE_Get_Opt::ARG_REQUIRED);
+ get_opt.long_option (ACE_TEXT("uninstall"), 'u', ACE_Get_Opt::ARG_REQUIRED);
+ get_opt.long_option (ACE_TEXT("list"), 'l', ACE_Get_Opt::NO_ARG);
+ get_opt.long_option (ACE_TEXT("shutdown"), 's', ACE_Get_Opt::NO_ARG);
+ get_opt.long_option (ACE_TEXT("domain-nc"), 'd', ACE_Get_Opt::ARG_REQUIRED);
+
+ char c;
+ Installation inst;
+ Creation create;
+
+ while ((c = get_opt ()) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ this->usage ();
+ return 1;
+ break;
+
+ case 'r':
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Using provided RM IOR: %C\n",
+ get_opt.opt_arg ()));
+ rm_ior_ = get_opt.opt_arg ();
+ break;
+
+ case 'i':
+ if (!inst.init (get_opt.opt_arg ()))
+ {
+ this->usage ();
+ return -1;
+ }
+
+ if (inst.replace_)
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Replacing installed package from path %C with name %C.\n", inst.path_.c_str (),
+ inst.name_.c_str ()));
+ else
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Installing package from path %C with name %C.\n", inst.path_.c_str (),
+ inst.name_.c_str ()));
+
+ this->install_.insert (inst);
+ break;
+
+ case 'c':
+ if (!create.init (get_opt.opt_arg ()))
+ {
+ this->usage ();
+ return -1;
+ }
+
+ if (create.replace_)
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Replacing installed package from path %C with name %C and base location %C.\n",
+ create.path_.c_str (),
+ create.name_.c_str (),
+ create.base_location_.c_str ()));
+ else
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Installing new package from path %C with name %C and base location %C.\n",
+ create.path_.c_str (),
+ create.name_.c_str (),
+ create.base_location_.c_str ()));
+
+ this->create_.insert (create);
+ break;
+
+ case 'u':
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Removing package with UUID %C\n", get_opt.opt_arg ()));
+ this->uninstall_.insert (get_opt.opt_arg ());
+ break;
+
+ case 'l':
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Listing all packages.\n"));
+ this->list_ = true;
+ break;
+
+ case 's':
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Shutting down the RM instance.\n"));
+ this->shutdown_ = true;
+ break;
+
+ case 'd':
+ DANCE_DEBUG ((LM_DEBUG, DLINFO "Options::parse_args - "
+ "Using provided Domain NC: %C\n",
+ get_opt.opt_arg ()));
+ domain_nc_ = get_opt.opt_arg ();
+
+ case 0:
+ if (ACE_OS::strcmp (get_opt.long_option (), ACE_TEXT ("domain-nc")) == 0)
+ {
+ }
+ else
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "Options::parse_args - "
+ "Unknown long option: %C\n",
+ get_opt.long_option ()));
+ this->usage ();
+ return -1;
+ }
+ }
+ }
+ return 0;
+ }
+};
+
+int ACE_TMAIN (int argc, ACE_TCHAR **argv)
+{
+ DANCE_DISABLE_TRACE ();
+
+ auto_ptr<DAnCE::Logger_Service> logger;
+
+ int retval (0);
+
+ try
+ {
+ DAnCE::Logger_Service
+ * dlf = ACE_Dynamic_Service<DAnCE::Logger_Service>::instance ("DAnCE_Logger_Backend_Factory");
+
+ if (!dlf)
+ {
+ dlf = new DAnCE::Logger_Service;
+ logger.reset (dlf);
+ }
+
+ dlf->init (argc, argv);
+
+ DANCE_DEBUG ((LM_TRACE, DLINFO
+ "Module_main.h - initializing ORB\n"));
+
+ CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+
+ ACE_Log_Msg_Backend * backend = dlf->get_logger_backend(orb);
+
+ if (backend != 0)
+ {
+ backend->open(0);
+ ACE_Log_Msg::msg_backend (backend);
+ ACE_Log_Msg * ace = ACE_Log_Msg::instance();
+ ace->clr_flags(ace->flags());
+ ace->set_flags(ACE_Log_Msg::CUSTOM);
+ }
+
+ Options options;
+ int error = options.parse_args (argc, argv);
+ if (error == -1)
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "repository_manager_admin_exec::main - "
+ "Failed to parse command line arguments.\n"));
+ }
+ else if (error == 1)
+ { //help was issued -> quit
+ return 0;
+ }
+
+ if (options.rm_ior_ == 0)
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "repository_manager_admin_exec::main - "
+ "No RepositoryManager IOR provided\n"));
+ return -1;
+ }
+
+ // Resolve the RepositoryManager reference
+ CORBA::Object_var obj = orb->string_to_object (options.rm_ior_);
+
+ Deployment::RepositoryManager_var rm =
+ Deployment::RepositoryManager::_narrow (obj);
+
+ if (CORBA::is_nil (obj))
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "repository_manager_admin_exec::main - "
+ "Provided IOR was invalid or could not be narrowed: %s\n",
+ options.rm_ior_));
+ return -1;
+ }
+
+ DAnCE::RepositoryManager::Admin admin (rm.in ());
+
+ ACE_Unbounded_Set_Iterator<Options::Installation> inst_it =
+ options.install_.begin ();
+ Options::Installation *inst (0);
+
+ while (inst_it.next (inst) == 1)
+ {
+ if (!admin.install_package (inst->path_.c_str (),
+ inst->name_.c_str (),
+ inst->replace_))
+ retval = -1;
+ inst_it.advance ();
+ }
+
+ ACE_Unbounded_Set_Iterator<Options::Creation> creat_it (options.create_);
+ Options::Creation *creat (0);
+
+ while (creat_it.next (creat) == 1)
+ {
+ if (!admin.create_package (creat->path_.c_str (),
+ creat->name_.c_str (),
+ creat->base_location_.c_str (),
+ creat->replace_))
+ retval = -1;
+ creat_it.advance ();
+ }
+
+ ACE_Unbounded_Set_Iterator<ACE_CString> uninst_it (options.uninstall_);
+ ACE_CString *uninst = 0;
+
+ while (uninst_it.next (uninst) == 1)
+ {
+ if (!admin.uninstall_package (uninst->c_str ()))
+ retval = -1;
+ uninst_it.advance ();
+ }
+
+ if (options.list_)
+ {
+ ::CORBA::StringSeq * packages = admin.list_packages ();
+ if (packages == 0)
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "repository_manager_admin_exec::main - "
+ "No packages returned from list_packages\n"));
+ retval = -1;
+ }
+
+ DANCE_DEBUG ((LM_EMERGENCY, "Listing %u packages installed on server:\n"));
+
+ for (CORBA::ULong i = 0; i < packages->length (); ++i)
+ {
+ DANCE_DEBUG ((LM_EMERGENCY, "\t%s\n",
+ (*packages)[i].in ()));
+ }
+
+ delete packages;
+ }
+
+ if (options.shutdown_)
+ {
+ DANCE_DEBUG ((LM_EMERGENCY, "Shutting down the Repository Manager\n"));
+ if (!admin.shutdown ())
+ retval = -1;
+ }
+ }
+ catch (CORBA::Exception &ex)
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "repository_manager_admin_exec::main - "
+ "Caught unexpected CORBA Exception: %s\n",
+ ex._info ().c_str ()));
+ return -1;
+ }
+ catch (...)
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO "repository_manager_admin_exec::main - "
+ "Caught unexpected C++ exception.\n"));
+ return -1;
+ }
+
+ return 0;
+}
+