diff --git a/cmdline/CtaAdminCmd.cpp b/cmdline/CtaAdminCmd.cpp index 229e01d5ff78fd4aa397fa7d9611f52d06c1221f..adeadb88e4a60ca06fe4952fb299e21a50ea7a69 100644 --- a/cmdline/CtaAdminCmd.cpp +++ b/cmdline/CtaAdminCmd.cpp @@ -23,7 +23,7 @@ #include "CtaAdminCmdParse.hpp" #include "CtaAdminCmd.hpp" -#include "XrdSsiPbException.hpp" +#include "XrdSsiPbDebug.hpp" @@ -33,6 +33,8 @@ namespace admin { CtaAdminCmd::CtaAdminCmd(int argc, const char *const *const argv) : m_execname(argv[0]) { + auto &admincmd = *(m_request.mutable_admincmd()); + // Strip path from execname size_t p = m_execname.find_last_of('/'); @@ -57,6 +59,22 @@ CtaAdminCmd::CtaAdminCmd(int argc, const char *const *const argv) : } } + admincmd.set_cmd(cmd_it->second.cmd); + + // Parse the subcommand + + int nextarg = 2; + + if(cmd_it->second.sub_cmd.size() > 0) + { + if(argc < 3) throwUsage(); + + auto sub_it = cmd_it->second.sub_cmd.find(argv[nextarg++]); + + if(sub_it == cmd_it->second.sub_cmd.end()) throwUsage(); + + admincmd.set_subcmd(subCmd.at(*sub_it)); + } #if 0 // Tokenize the command @@ -95,6 +113,13 @@ void CtaAdminCmd::throwUsage() throw std::runtime_error(help.str()); } + + +void CtaAdminCmd::send() +{ + XrdSsiPb::OutputJsonString(std::cout, &m_request.admincmd()); +} + }} // namespace cta::admin @@ -112,8 +137,11 @@ int main(int argc, const char **argv) try { // Tokenize and parse the command line arguments - CtaAdminCmd cmd(argc, argv); + + // Send the protocol buffer + cmd.send(); + return 0; } catch (XrdSsiPb::PbException &ex) { std::cerr << "Error in Google Protocol Buffers: " << ex.what() << std::endl; diff --git a/cmdline/CtaAdminCmd.hpp b/cmdline/CtaAdminCmd.hpp index 4f645a75e4b5d8ee01cfb5cdca9870c11326d374..04669a77740d4f2b8e1953f9f055336ce005376d 100644 --- a/cmdline/CtaAdminCmd.hpp +++ b/cmdline/CtaAdminCmd.hpp @@ -29,9 +29,14 @@ class CtaAdminCmd public: CtaAdminCmd(int argc, const char *const *const argv); + /*! + * Send the protocol buffer across the XRootD SSI transport + */ + void send(); + private: /*! - * Throw an exception with generic usage help + * Throw an exception with usage help */ void throwUsage(); @@ -40,6 +45,7 @@ private: */ std::string m_execname; //!< Executable name of this program std::vector<std::string> m_requestTokens; //!< The command line parameters represented as a vector of strings + cta::xrd::Request m_request; //!< Protocol Buffer for the command and parameters }; }} // namespace cta::admin diff --git a/cmdline/CtaAdminCmdParse.hpp b/cmdline/CtaAdminCmdParse.hpp index 36032c62d813e0767e67e7df787262f9e5d2f9aa..5184a54152359b398e8fb720fb8bd29e97d5a690 100644 --- a/cmdline/CtaAdminCmdParse.hpp +++ b/cmdline/CtaAdminCmdParse.hpp @@ -76,5 +76,18 @@ const std::map<std::string, SubCommand> shortCmd = { { "ve", { AdminCmd::CMD_VERIFY, { "add", "rm", "ls", "err" }} } }; -}} // namespace cta::admin +const std::map<std::string, AdminCmd::SubCmd> subCmd = { + { "add", AdminCmd::SUBCMD_ADD }, + { "ch", AdminCmd::SUBCMD_CH }, + { "err", AdminCmd::SUBCMD_ERR }, + { "label", AdminCmd::SUBCMD_LABEL }, + { "ls", AdminCmd::SUBCMD_LS }, + { "reclaim", AdminCmd::SUBCMD_RECLAIM }, + { "rm", AdminCmd::SUBCMD_RM }, + { "up", AdminCmd::SUBCMD_UP }, + { "down", AdminCmd::SUBCMD_DOWN }, + { "read", AdminCmd::SUBCMD_READ }, + { "write", AdminCmd::SUBCMD_WRITE } +}; +}} // namespace cta::admin diff --git a/xroot_plugins/messages/cta_admin.proto b/xroot_plugins/messages/cta_admin.proto index 064f368667cdb3c262f3d20be4e9d92044173735..d7fc846711028446b11b164c602fc2ffeaa70bd5 100644 --- a/xroot_plugins/messages/cta_admin.proto +++ b/xroot_plugins/messages/cta_admin.proto @@ -93,39 +93,40 @@ message OptionString { message AdminCmd { enum Cmd { - CMD_ADMIN = 0; - CMD_ADMINHOST = 1; - CMD_ARCHIVEFILE = 2; - CMD_ARCHIVEROUTE = 3; - CMD_DRIVE = 4; - CMD_GROUPMOUNTRULE = 5; - CMD_LISTPENDINGARCHIVES = 6; - CMD_LISTPENDINGRETRIEVES = 7; - CMD_LOGICALLIBRARY = 8; - CMD_MOUNTPOLICY = 9; - CMD_REPACK = 10; - CMD_REQUESTERMOUNTRULE = 11; - CMD_SHOWQUEUES = 12; - CMD_SHRINK = 13; - CMD_STORAGECLASS = 14; - CMD_TAPE = 15; - CMD_TAPEPOOL = 16; - CMD_TEST = 17; - CMD_VERIFY = 18; + CMD_NONE = 0; + CMD_ADMIN = 1; + CMD_ADMINHOST = 2; + CMD_ARCHIVEFILE = 3; + CMD_ARCHIVEROUTE = 4; + CMD_DRIVE = 5; + CMD_GROUPMOUNTRULE = 6; + CMD_LISTPENDINGARCHIVES = 7; + CMD_LISTPENDINGRETRIEVES = 8; + CMD_LOGICALLIBRARY = 9; + CMD_MOUNTPOLICY = 10; + CMD_REPACK = 11; + CMD_REQUESTERMOUNTRULE = 12; + CMD_SHOWQUEUES = 13; + CMD_SHRINK = 14; + CMD_STORAGECLASS = 15; + CMD_TAPE = 16; + CMD_TAPEPOOL = 17; + CMD_TEST = 18; + CMD_VERIFY = 19; } enum SubCmd { - CMD_NONE = 0; - CMD_ADD = 1; - CMD_CH = 2; - CMD_ERR = 3; - CMD_LABEL = 4; - CMD_LS = 5; - CMD_RECLAIM = 6; - CMD_RM = 7; - CMD_UP = 8; - CMD_DOWN = 9; - CMD_READ = 10; - CMD_WRITE = 11; + SUBCMD_NONE = 0; + SUBCMD_ADD = 1; + SUBCMD_CH = 2; + SUBCMD_ERR = 3; + SUBCMD_LABEL = 4; + SUBCMD_LS = 5; + SUBCMD_RECLAIM = 6; + SUBCMD_RM = 7; + SUBCMD_UP = 8; + SUBCMD_DOWN = 9; + SUBCMD_READ = 10; + SUBCMD_WRITE = 11; } Cmd cmd = 1; //< The primary command