⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cimrepositoryarchivecommand.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include <Pegasus/Common/Config.h>#include <Pegasus/Common/Constants.h>#include <Pegasus/Common/Exception.h>#include <Pegasus/Common/FileSystem.h>#include <Pegasus/Common/System.h>#include <Pegasus/Common/AutoPtr.h>#include <Pegasus/Common/PegasusVersion.h>#include <Clients/cliutils/Command.h>#include <Clients/cliutils/CommandException.h>#include <Pegasus/getoopt/getoopt.h>#include <iostream>#ifdef PEGASUS_OS_TYPE_UNIX# include <fcntl.h># include <errno.h># include <sys/types.h># include <sys/wait.h>#endifPEGASUS_USING_STD;PEGASUS_NAMESPACE_BEGIN/**    The CLI message resource name */static const char MSG_PATH[] = "pegasus/pegasusCLI";/**    The command name.*/static const char COMMAND_NAME[] = "cimreparchive";/**    The usage string for this command.  This string is displayed    when an error occurs in parsing or validating the command line.*/static const char USAGE[] = "Usage: ";/**    This constant represents the getoopt argument designator*/static const char GETOPT_ARGUMENT_DESIGNATOR = ':';/*    These constants represent the operation modes supported by the CLI.    Any new operation should be added here.*//**    This constant signifies that an operation option has not been recorded*/static const Uint32 OPERATION_TYPE_UNINITIALIZED  = 0;/**    This constant represents an archive operation*/static const Uint32 OPERATION_TYPE_ARCHIVE        = 1;/**    This constant represents a help operation*/static const Uint32 OPERATION_TYPE_HELP           = 2;/**    This constant represents a version display operation*/static const Uint32 OPERATION_TYPE_VERSION        = 3;//// cimreparchive exit status values//static const Uint32 EXIT_STATUS_SUCCESS             = 0;static const Uint32 EXIT_STATUS_GENERAL_ERROR       = 1;static const Uint32 EXIT_STATUS_SYSTEM_CALL_FAILED  = 2;static const Uint32 EXIT_STATUS_ARCHIVE_FAILED      = 3;static const char LONG_HELP[] = "help";static const char LONG_VERSION[] = "version";/**    This command is used to archive a copy of the CIM Server's repository.*/class CIMRepositoryArchiveCommand : public Command{public:    /**        Constructs a CIMRepositoryArchiveCommand.    */    CIMRepositoryArchiveCommand();    /**        Parses the command line, validates the options, and sets member        variables based on the option arguments.        @param  argc       An integer number of arguments.        @param  argv       A string array of command line arguments        @exception CommandFormatException If an error is encountered in parsing            the command line.    */    void setCommand(Uint32 argc, char* argv[]);    /**        Executes the command and writes the results to the output streams.        @param ostream The stream to which command output is written.        @param ostream The stream to which command errors are written.        @return 0 if the command is successful,                1 if an error occurs in executing the command.    */    Uint32 execute(        ostream& outPrintWriter,        ostream& errPrintWriter);private:    /**        The destination file for the repository archive.    */    String _archiveFileName;    /**        The type of operation specified on the command line.    */    Uint32 _operationType;    String _usage;};/**    Constructs a CIMRepositoryArchiveCommand and initializes instance variables.*/CIMRepositoryArchiveCommand::CIMRepositoryArchiveCommand(){    //     // Build the command usage string.    //    _usage.reserveCapacity(250);    _usage.append(USAGE);    _usage.append(COMMAND_NAME);    _usage.append(" archive_file\n");    _usage.append("       cimreparchive --").append(LONG_HELP).append("\n");    _usage.append("       cimreparchive --").append(LONG_VERSION).append("\n");    _usage.append("Options:\n");    _usage.append("    --help     - Display this help message\n");    _usage.append("    --version  - Display CIM Server version number\n");#ifdef PEGASUS_HAS_ICU    MessageLoaderParms menuparms(        "Clients.cimreparchive.CIMRepositoryArchiveCommand.MENU.STANDARD",        _usage);    menuparms.msg_src_path = MSG_PATH;    _usage = MessageLoader::getMessage(menuparms);#endif    setUsage(_usage);}/**    Parses the command line, validates the options, and sets instance    variables based on the option arguments.*/void CIMRepositoryArchiveCommand::setCommand(    Uint32 argc,    char* argv[]){    //    //  Initialize and parse options    //    getoopt options("");    options.addFlagspec("");    // No (short) options are defined    options.addLongFlagspec(LONG_HELP,getoopt::NOARG);    options.addLongFlagspec(LONG_VERSION,getoopt::NOARG);    options.parse(argc, argv);    if (options.hasErrors())    {        throw CommandFormatException(options.getErrorStrings()[0]);    }    _operationType = OPERATION_TYPE_UNINITIALIZED;    //    //  Get options and arguments from the command line    //    for (Uint32 i = options.first(); i < options.last(); i++)    {        if (options[i].getType() == Optarg::LONGFLAG)        {            if (options[i].getopt() == LONG_HELP)            {                if (_operationType != OPERATION_TYPE_UNINITIALIZED)                {                    String param = String(options[i].getopt());                    //                    // More than one operation option was found                    //                    throw UnexpectedOptionException(param);                }               _operationType = OPERATION_TYPE_HELP;            }            else if (options[i].getopt() == LONG_VERSION)            {                if (_operationType != OPERATION_TYPE_UNINITIALIZED)                {                    String param = String(options[i].getopt());                    //                    // More than one operation option was found                    //                    throw UnexpectedOptionException(param);                }               _operationType = OPERATION_TYPE_VERSION;            }            else            {                throw UnexpectedOptionException(String(options[i].getopt()));            }        }        else if (options[i].getType() == Optarg::REGULAR)        {            if (_operationType != OPERATION_TYPE_UNINITIALIZED)            {                throw UnexpectedArgumentException(options[i].Value());            }            _archiveFileName = options[i].Value();            _operationType = OPERATION_TYPE_ARCHIVE;        }        // No short form options are defined for this command.        PEGASUS_ASSERT(options[i].getType() != Optarg::FLAG);    }    //    // Some more validations    //    if (_operationType == OPERATION_TYPE_UNINITIALIZED)    {        throw CommandFormatException(localizeMessage(            MSG_PATH,            "Clients.cimreparchive.CIMRepositoryArchiveCommand."                "REQUIRED_ARGS_MISSING",            "Required arguments missing."));    }}/**    Executes the command and writes the results to the PrintWriters.*/Uint32 CIMRepositoryArchiveCommand::execute(    ostream& outPrintWriter,    ostream& errPrintWriter){    if (_operationType == OPERATION_TYPE_HELP)    {        errPrintWriter << _usage << endl;        return EXIT_STATUS_SUCCESS;    }    if (_operationType == OPERATION_TYPE_VERSION)    {        errPrintWriter << "Version " << PEGASUS_PRODUCT_VERSION << endl;        return EXIT_STATUS_SUCCESS;    }    //    // Perform the requested archive operation    //    PEGASUS_ASSERT(_operationType == OPERATION_TYPE_ARCHIVE);    //    // Get environment variables    //    const char* env = getenv("PEGASUS_HOME");    String repositoryDir = FileSystem::getAbsolutePath(        env, PEGASUS_REPOSITORY_DIR);    String lockFile = FileSystem::getAbsolutePath(        env, PEGASUS_REPOSITORY_LOCK_FILE);    String repositoryDirPath = FileSystem::extractFilePath(repositoryDir);    String repositoryDirName = FileSystem::extractFileName(repositoryDir);    AutoFileLock repositoryLock(lockFile.getCString());    // Define the "tar" command location based on the platform#if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_AIX)    const char TAR_COMMAND[] = "/usr/bin/tar";#elif defined(PEGASUS_OS_LINUX)    const char TAR_COMMAND[] = "/bin/tar";#elif defined(PEGASUS_OS_ZOS)    const char TAR_COMMAND[] = "/bin/pax";#else    const char TAR_COMMAND[] = "tar";#endif    // Define the "archive" command based on the platfrom#if defined(PEGASUS_OS_ZOS)    String sysCommand =        String(TAR_COMMAND) + " -o saveext -ppx -wzf "            + _archiveFileName + " " + repositoryDir;#else    String sysCommand =        String(TAR_COMMAND) + " cf " + _archiveFileName +            " -C " + repositoryDirPath + " " + repositoryDirName;#endif#if defined(PEGASUS_OS_TYPE_UNIX)    int rc = system(sysCommand.getCString());    if (rc == -1)    {        MessageLoaderParms errorMessage(            "Clients.cimreparchive.CIMRepositoryArchiveCommand.SYSCALL_FAILED",            "Failed to initiate archive operation: $0",            strerror(errno));        errPrintWriter << MessageLoader::getMessage(errorMessage) << endl;        return EXIT_STATUS_SYSTEM_CALL_FAILED;    }    else if (WIFEXITED(rc) && (WEXITSTATUS(rc) != 0))    {        // Archive operation failed.  Write an error and remove        // the partial archive file.        MessageLoaderParms errorMessage(            "Clients.cimreparchive.CIMRepositoryArchiveCommand.ARCHIVE_FAILED",            "Archive operation failed with status $0.  Removing file \"$1\".",            WEXITSTATUS(rc), _archiveFileName);        errPrintWriter << MessageLoader::getMessage(errorMessage) << endl;        FileSystem::removeFile(_archiveFileName);        return EXIT_STATUS_ARCHIVE_FAILED;    }    MessageLoaderParms errorMessage(        "Clients.cimreparchive.CIMRepositoryArchiveCommand.ARCHIVE_CREATED",        "File \"$0\" now contains an archive of directory \"$1\".",        _archiveFileName, repositoryDir);    outPrintWriter << MessageLoader::getMessage(errorMessage) << endl;    return EXIT_STATUS_SUCCESS;#else    errPrintWriter << "Archive operation is not available." << endl;    return EXIT_STATUS_ARCHIVE_FAILED;#endif}PEGASUS_NAMESPACE_END//// exclude main from the Pegasus Namespace//PEGASUS_USING_PEGASUS;////////////////////////////////////////////////////////////////////////////////**    Parses the command line, and execute the command.    @param argc An integer count of the command line arguments    @param argv A string array containing the command line arguments*////////////////////////////////////////////////////////////////////////////////int main (int argc, char* argv[]){    AutoPtr<CIMRepositoryArchiveCommand> command;    Uint32 retCode;    MessageLoader::_useProcessLocale = true;    MessageLoader::setPegasusMsgHomeRelative(argv[0]);    command.reset(new CIMRepositoryArchiveCommand());    try    {        command->setCommand(argc, argv);    }    catch (CommandFormatException& cfe)    {        String msg(cfe.getMessage());        cerr << COMMAND_NAME << ": " << msg <<  endl;        if (msg.find(String("Unknown flag")) != PEG_NOT_FOUND)        {            MessageLoaderParms parms(                "Clients.cimreparchive.CIMRepositoryArchiveCommand."                    "ERR_OPTION_NOT_SUPPORTED",                "Invalid option. Use '--help' to obtain command syntax.");            parms.msg_src_path = MSG_PATH;            cerr << COMMAND_NAME <<                ": " << MessageLoader::getMessage(parms) << endl;        }        else        {            MessageLoaderParms parms(                "Clients.cimreparchive.CIMRepositoryArchiveCommand.ERR_USAGE",                "Incorrect usage. Use '--help' to obtain command syntax.");            parms.msg_src_path = MSG_PATH;            cerr << COMMAND_NAME <<                ": " << MessageLoader::getMessage(parms) << endl;        }        return EXIT_STATUS_GENERAL_ERROR;    }    retCode = command->execute(cout, cerr);    return retCode;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -