diff --git a/xroot_clients/CTACmd.cpp b/xroot_clients/CTACmd.cpp index d1aeebc62af6590061d20dec80d3b2607749d1a0..7d9611cb5f8fd3684ab44673acecc9c31a60c974 100644 --- a/xroot_clients/CTACmd.cpp +++ b/xroot_clients/CTACmd.cpp @@ -20,12 +20,13 @@ void CTACmd::usage(std::ostream &os) const throw() { os << "Usage:\n" "\t" << m_programName << " archive <source_file1> [<source_file2> [<source_file3> [...]]] <destination_path>\n" - "\t" << m_programName << " create-storage-class <storage_class_name> <number_of_tape_copies>\n" - "\t" << m_programName << " change-storage-class <directory_name> <storage_class_name>\n" - "\t" << m_programName << " delete-storage-class <storage_class_name>\n" - "\t" << m_programName << " list-storage-class\n" + "\t" << m_programName << " mkclass <storage_class_name> <number_of_tape_copies>\n" + "\t" << m_programName << " chclass <directory_name> <storage_class_name>\n" + "\t" << m_programName << " rmclass <storage_class_name>\n" + "\t" << m_programName << " lsclass\n" "\t" << m_programName << " mkdir <directory_name>\n" - "\t" << m_programName << " rmdir <directory_name>\n"; + "\t" << m_programName << " rmdir <directory_name>\n" + "\t" << m_programName << " ls <directory_name>\n"; } //------------------------------------------------------------------------------ diff --git a/xroot_plugins/XrdProFilesystem.cpp b/xroot_plugins/XrdProFilesystem.cpp index b87a3a73a59cfab62db50482da29c9f7294b6a6e..c183236aefb0649104dfba4c60fbced15518ea6c 100644 --- a/xroot_plugins/XrdProFilesystem.cpp +++ b/xroot_plugins/XrdProFilesystem.cpp @@ -141,7 +141,7 @@ int XrdProFilesystem::executeArchiveCommand(ParsedRequest &req, XrdOucErrInfo &e //------------------------------------------------------------------------------ // executeCreateStorageClassCommand //------------------------------------------------------------------------------ -int XrdProFilesystem::executeCreateStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { +int XrdProFilesystem::executeMkclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { if(req.args.size() != 2) { std::string response = "[ERROR] Wrong number of arguments provided"; eInfo.setErrInfo(response.length(), response.c_str()); @@ -180,7 +180,7 @@ int XrdProFilesystem::executeCreateStorageClassCommand(ParsedRequest &req, XrdOu //------------------------------------------------------------------------------ // executeCreateStorageClassCommand //------------------------------------------------------------------------------ -int XrdProFilesystem::executeChangeStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { +int XrdProFilesystem::executeChclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { if(req.args.size() != 2) { std::string response = "[ERROR] Wrong number of arguments provided"; eInfo.setErrInfo(response.length(), response.c_str()); @@ -213,7 +213,7 @@ int XrdProFilesystem::executeChangeStorageClassCommand(ParsedRequest &req, XrdOu //------------------------------------------------------------------------------ // executeDeleteStorageClassCommand //------------------------------------------------------------------------------ -int XrdProFilesystem::executeDeleteStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { +int XrdProFilesystem::executeRmclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { if(req.args.size() != 1) { std::string response = "[ERROR] Wrong number of arguments provided"; eInfo.setErrInfo(response.length(), response.c_str()); @@ -247,7 +247,7 @@ int XrdProFilesystem::executeDeleteStorageClassCommand(ParsedRequest &req, XrdOu //------------------------------------------------------------------------------ // executeListStorageClassCommand //------------------------------------------------------------------------------ -int XrdProFilesystem::executeListStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { +int XrdProFilesystem::executeLsclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { if(req.args.size() != 0) { std::string response = "[ERROR] Wrong number of arguments provided"; eInfo.setErrInfo(response.length(), response.c_str()); @@ -292,6 +292,8 @@ int XrdProFilesystem::executeMkdirCommand(ParsedRequest &req, XrdOucErrInfo &eIn return SFS_DATA; } try { + cta::UserIdentity requester; + m_clientAPI->createDirectory(requester, req.args.at(0)); std::string response = "[OK] Directory "; response += req.args.at(0); response += " created"; @@ -346,6 +348,63 @@ int XrdProFilesystem::executeRmdirCommand(ParsedRequest &req, XrdOucErrInfo &eIn } } +//------------------------------------------------------------------------------ +// executeLsCommand +//------------------------------------------------------------------------------ +int XrdProFilesystem::executeLsCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) { + if(req.args.size() != 1) { + std::string response = "[ERROR] Wrong number of arguments provided"; + eInfo.setErrInfo(response.length(), response.c_str()); + return SFS_DATA; + } + try { + cta::UserIdentity requester; + std::string response; + cta::DirectoryIterator itor = m_clientAPI->getDirectoryContents(requester, req.args.at(0)); + while(itor.hasMore()) { + const cta::DirectoryEntry &entry = itor.next(); + response += "\n"; + switch(entry.entryType) { + case cta::DirectoryEntry::FILE_ENTRY: + response += "-"; + break; + case cta::DirectoryEntry::DIRECTORY_ENTRY: + response += "d"; + break; + case cta::DirectoryEntry::NONE: + default: + response += "n"; + break; + } + response += entry.ownerPerms; + response += entry.groupPerms; + response += entry.otherPerms; + response += " "; + response += entry.ownerId; + response += " "; + response += entry.groupId; + response += " "; + response += entry.name; + } + eInfo.setErrInfo(response.length(), response.c_str()); + return SFS_DATA; + } catch (cta::Exception &ex) { + std::string response = "[ERROR] CTA exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length(), response.c_str()); + return SFS_DATA; + } catch (std::exception &ex) { + std::string response = "[ERROR] Exception caught: "; + response += ex.what(); + eInfo.setErrInfo(response.length(), response.c_str()); + return SFS_DATA; + } catch (...) { + std::string response = "[ERROR] Unknown exception caught!"; + eInfo.setErrInfo(response.length(), response.c_str()); + return SFS_DATA; + } +} + //------------------------------------------------------------------------------ // dispatchRequest //------------------------------------------------------------------------------ @@ -359,21 +418,21 @@ int XrdProFilesystem::dispatchRequest(XrdSfsFSctl &args, XrdOucErrInfo &eInfo) { { return executeArchiveCommand(req, eInfo); } - else if(strcmp(req.cmd.c_str(), "/create-storage-class") == 0) + else if(strcmp(req.cmd.c_str(), "/mkclass") == 0) { - return executeCreateStorageClassCommand(req, eInfo); + return executeMkclassCommand(req, eInfo); } - else if(strcmp(req.cmd.c_str(), "/change-storage-class") == 0) + else if(strcmp(req.cmd.c_str(), "/chclass") == 0) { - return executeChangeStorageClassCommand(req, eInfo); + return executeChclassCommand(req, eInfo); } - else if(strcmp(req.cmd.c_str(), "/delete-storage-class") == 0) + else if(strcmp(req.cmd.c_str(), "/rmclass") == 0) { - return executeDeleteStorageClassCommand(req, eInfo); + return executeRmclassCommand(req, eInfo); } - else if(strcmp(req.cmd.c_str(), "/list-storage-class") == 0) + else if(strcmp(req.cmd.c_str(), "/lsclass") == 0) { - return executeListStorageClassCommand(req, eInfo); + return executeLsclassCommand(req, eInfo); } else if(strcmp(req.cmd.c_str(), "/mkdir") == 0) { @@ -382,6 +441,10 @@ int XrdProFilesystem::dispatchRequest(XrdSfsFSctl &args, XrdOucErrInfo &eInfo) { else if(strcmp(req.cmd.c_str(), "/rmdir") == 0) { return executeRmdirCommand(req, eInfo); + } + else if(strcmp(req.cmd.c_str(), "/ls") == 0) + { + return executeLsCommand(req, eInfo); } else { diff --git a/xroot_plugins/XrdProFilesystem.hpp b/xroot_plugins/XrdProFilesystem.hpp index 94c96ddd73b66176713dd9831e585aa75387c7b2..b45287319aebbf8563da6ffe9890762ca018604d 100644 --- a/xroot_plugins/XrdProFilesystem.hpp +++ b/xroot_plugins/XrdProFilesystem.hpp @@ -71,7 +71,7 @@ protected: * @param eInfo Error information * @return SFS_DATA */ - int executeCreateStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); + int executeMkclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); /** * Executes the command contained within the request structure @@ -80,7 +80,7 @@ protected: * @param eInfo Error information * @return SFS_DATA */ - int executeChangeStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); + int executeChclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); /** * Executes the command contained within the request structure @@ -89,7 +89,7 @@ protected: * @param eInfo Error information * @return SFS_DATA */ - int executeDeleteStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); + int executeRmclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); /** * Executes the command contained within the request structure @@ -98,7 +98,7 @@ protected: * @param eInfo Error information * @return SFS_DATA */ - int executeListStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); + int executeLsclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); /** * Executes the command contained within the request structure @@ -118,6 +118,15 @@ protected: */ int executeRmdirCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); + /** + * Executes the command contained within the request structure + * + * @param req parsed request + * @param eInfo Error information + * @return SFS_DATA + */ + int executeLsCommand(ParsedRequest &req, XrdOucErrInfo &eInfo); + /** * Dispatches the request based on the query *