VirtualBox

Ignore:
Timestamp:
Mar 19, 2019 10:00:28 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
129442
Message:

bugref:9312. The command 'VBoxManage cloudprofile' was implemented. It uses new style of help and documentation.

Location:
trunk/src/VBox/Frontends/VBoxManage
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp

    r77595 r77777  
    159159    { "convertfromraw",     USAGE_CONVERTFROMRAW,   VBMG_CMD_TODO, handleConvertFromRaw,       VBMG_CMD_F_NO_COM },
    160160    { "convertdd",          USAGE_CONVERTFROMRAW,   VBMG_CMD_TODO, handleConvertFromRaw,       VBMG_CMD_F_NO_COM },
    161     { "usbdevsource",       USAGE_USBDEVSOURCE,     VBMG_CMD_TODO, handleUSBDevSource,         0 }
     161    { "usbdevsource",       USAGE_USBDEVSOURCE,     VBMG_CMD_TODO, handleUSBDevSource,         0 },
     162    { "cloudprofile",       USAGE_S_NEWCMD,      HELP_CMD_CLOUDPROFILE, handleCloudProfile,         0 }
    162163};
    163164
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h

    r77595 r77777  
    112112    USAGE_MEDIUMENCCHKPWD,
    113113    USAGE_USBDEVSOURCE,
     114    USAGE_CLOUDPROFILE,
    114115    /* Insert new entries before this line, but only if it is not an option
    115116     * to go for the new style command and help handling (see e.g. extpack,
     
    147148#endif
    148149
    149 
    150150/** command handler argument */
    151151struct HandlerArg
     
    290290RTEXITCODE handleUnattended(HandlerArg *a);
    291291RTEXITCODE handleMoveVM(HandlerArg *a);
     292RTEXITCODE handleCloudProfile(HandlerArg *a);
    292293
    293294/* VBoxManageDisk.cpp */
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp

    r77595 r77777  
    19401940    return errorUnknownSubcommand(a->argv[0]);
    19411941}
     1942
     1943/*********************************************************************************************************************************
     1944*   Cloud profile functions                                                                                                      *
     1945*********************************************************************************************************************************/
     1946
     1947/**
     1948 * Common Cloud profile options.
     1949 */
     1950typedef struct
     1951{
     1952    const char     *pszProviderName;
     1953    const char     *pszProfileName;
     1954} CLOUDPROFILECOMMONOPT;
     1955typedef CLOUDPROFILECOMMONOPT *PCLOUDPROFILECOMMONOPT;
     1956
     1957/**
     1958 * Sets the properties of cloud profile
     1959 *
     1960 * @returns 0 on success, 1 on failure
     1961 */
     1962
     1963static RTEXITCODE setCloudProfileProperties(HandlerArg *a, int iFirst, PCLOUDPROFILECOMMONOPT pCommonOpts)
     1964{
     1965
     1966    HRESULT hrc = S_OK;
     1967
     1968    Bstr bstrProvider(pCommonOpts->pszProviderName);
     1969    Bstr bstrProfile(pCommonOpts->pszProfileName);
     1970
     1971    /*
     1972     * Parse options.
     1973     */
     1974    static const RTGETOPTDEF s_aOptions[] =
     1975    {
     1976        { "--clouduser",    'u', RTGETOPT_REQ_STRING },
     1977        { "--fingerprint",  'p', RTGETOPT_REQ_STRING },
     1978        { "--keyfile",      'k', RTGETOPT_REQ_STRING },
     1979        { "--passphrase",   'P', RTGETOPT_REQ_STRING },
     1980        { "--tenancy",      't', RTGETOPT_REQ_STRING },
     1981        { "--compartment",  'c', RTGETOPT_REQ_STRING },
     1982        { "--region",       'r', RTGETOPT_REQ_STRING }
     1983    };
     1984
     1985    RTGETOPTSTATE GetState;
     1986    int vrc = RTGetOptInit(&GetState, a->argc, a->argv, s_aOptions, RT_ELEMENTS(s_aOptions), iFirst, 0);
     1987    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     1988
     1989    com::SafeArray<BSTR> names;
     1990    com::SafeArray<BSTR> values;
     1991
     1992    int c;
     1993    RTGETOPTUNION ValueUnion;
     1994    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
     1995    {
     1996        switch (c)
     1997        {
     1998            case 'u':   // --clouduser
     1999                Bstr("user").detachTo(names.appendedRaw());
     2000                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2001                break;
     2002            case 'p':   // --fingerprint
     2003                Bstr("fingerprint").detachTo(names.appendedRaw());
     2004                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2005                break;
     2006            case 'k':   // --keyfile
     2007                Bstr("key_file").detachTo(names.appendedRaw());
     2008                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2009                break;
     2010            case 'P':   // --passphrase
     2011                Bstr("pass_phrase").detachTo(names.appendedRaw());
     2012                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2013                break;
     2014            case 't':   // --tenancy
     2015                Bstr("tenancy").detachTo(names.appendedRaw());
     2016                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2017                break;
     2018            case 'c':   // --compartment
     2019                Bstr("compartment").detachTo(names.appendedRaw());
     2020                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2021                break;
     2022            case 'r':   // --region
     2023                Bstr("region").detachTo(names.appendedRaw());
     2024                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2025                break;
     2026            default:
     2027                return errorGetOpt(USAGE_CLOUDPROFILE, c, &ValueUnion);
     2028        }
     2029    }
     2030
     2031    /* check for required options */
     2032    if (bstrProvider.isEmpty())
     2033        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --provider is required");
     2034    if (bstrProfile.isEmpty())
     2035        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --profile is required");
     2036
     2037    ComPtr<IVirtualBox> pVirtualBox = a->virtualBox;
     2038
     2039    ComPtr<ICloudProviderManager> pCloudProviderManager;
     2040    CHECK_ERROR2_RET(hrc, pVirtualBox,
     2041                     COMGETTER(CloudProviderManager)(pCloudProviderManager.asOutParam()),
     2042                     RTEXITCODE_FAILURE);
     2043
     2044    ComPtr<ICloudProvider> pCloudProvider;
     2045
     2046    CHECK_ERROR2_RET(hrc, pCloudProviderManager,
     2047                     GetProviderByShortName(bstrProvider.raw(), pCloudProvider.asOutParam()),
     2048                     RTEXITCODE_FAILURE);
     2049
     2050    ComPtr<ICloudProfile> pCloudProfile;
     2051
     2052    if (pCloudProvider)
     2053    {
     2054        CHECK_ERROR2_RET(hrc, pCloudProvider,
     2055                         GetProfileByName(bstrProfile.raw(), pCloudProfile.asOutParam()),
     2056                         RTEXITCODE_FAILURE);
     2057        CHECK_ERROR2_RET(hrc, pCloudProfile,
     2058                         SetProperties(ComSafeArrayAsInParam(names), ComSafeArrayAsInParam(values)),
     2059                         RTEXITCODE_FAILURE);
     2060    }
     2061
     2062    CHECK_ERROR2(hrc, pCloudProvider, SaveProfiles());
     2063
     2064    RTPrintf("Provider %ls: profile '%ls' was updated.\n",bstrProvider.raw(), bstrProfile.raw());
     2065
     2066    return SUCCEEDED(hrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
     2067}
     2068
     2069/**
     2070 * Gets the properties of cloud profile
     2071 *
     2072 * @returns 0 on success, 1 on failure
     2073 */
     2074static RTEXITCODE showCloudProfileProperties(HandlerArg *a, PCLOUDPROFILECOMMONOPT pCommonOpts)
     2075{
     2076    HRESULT hrc = S_OK;
     2077
     2078    Bstr bstrProvider(pCommonOpts->pszProviderName);
     2079    Bstr bstrProfile(pCommonOpts->pszProfileName);
     2080
     2081    /* check for required options */
     2082    if (bstrProvider.isEmpty())
     2083        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --provider is required");
     2084    if (bstrProfile.isEmpty())
     2085        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --profile is required");
     2086
     2087    ComPtr<IVirtualBox> pVirtualBox = a->virtualBox;
     2088    ComPtr<ICloudProviderManager> pCloudProviderManager;
     2089    CHECK_ERROR2_RET(hrc, pVirtualBox,
     2090                     COMGETTER(CloudProviderManager)(pCloudProviderManager.asOutParam()),
     2091                     RTEXITCODE_FAILURE);
     2092    ComPtr<ICloudProvider> pCloudProvider;
     2093    CHECK_ERROR2_RET(hrc, pCloudProviderManager,
     2094                     GetProviderByShortName(bstrProvider.raw(), pCloudProvider.asOutParam()),
     2095                     RTEXITCODE_FAILURE);
     2096
     2097    ComPtr<ICloudProfile> pCloudProfile;
     2098    if (pCloudProvider)
     2099    {
     2100        CHECK_ERROR2_RET(hrc, pCloudProvider,
     2101                         GetProfileByName(bstrProfile.raw(), pCloudProfile.asOutParam()),
     2102                         RTEXITCODE_FAILURE);
     2103
     2104        Bstr bstrProviderID;
     2105        pCloudProfile->COMGETTER(ProviderId)(bstrProviderID.asOutParam());
     2106        RTPrintf("Provider GUID: %ls\n", bstrProviderID.raw());
     2107
     2108        com::SafeArray<BSTR> names;
     2109        com::SafeArray<BSTR> values;
     2110        CHECK_ERROR2_RET(hrc, pCloudProfile,
     2111                         GetProperties(Bstr().raw(), ComSafeArrayAsOutParam(names), ComSafeArrayAsOutParam(values)),
     2112                         RTEXITCODE_FAILURE);
     2113        size_t cNames = names.size();
     2114        size_t cValues = values.size();
     2115        bool fFirst = true;
     2116        for (size_t k = 0; k < cNames; k++)
     2117        {
     2118            Bstr value;
     2119            if (k < cValues)
     2120                value = values[k];
     2121            RTPrintf("%s%ls=%ls\n",
     2122                     fFirst ? "Property:      " : "               ",
     2123                     names[k], value.raw());
     2124            fFirst = false;
     2125        }
     2126
     2127        RTPrintf("\n");
     2128    }
     2129
     2130    return SUCCEEDED(hrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
     2131}
     2132
     2133static RTEXITCODE addCloudProfile(HandlerArg *a, int iFirst, PCLOUDPROFILECOMMONOPT pCommonOpts)
     2134{
     2135    HRESULT hrc = S_OK;
     2136
     2137    Bstr bstrProvider(pCommonOpts->pszProviderName);
     2138    Bstr bstrProfile(pCommonOpts->pszProfileName);
     2139
     2140
     2141    /* check for required options */
     2142    if (bstrProvider.isEmpty())
     2143        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --provider is required");
     2144    if (bstrProfile.isEmpty())
     2145        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --profile is required");
     2146
     2147    /*
     2148     * Parse options.
     2149     */
     2150    static const RTGETOPTDEF s_aOptions[] =
     2151    {
     2152        { "--clouduser",    'u', RTGETOPT_REQ_STRING },
     2153        { "--fingerprint",  'p', RTGETOPT_REQ_STRING },
     2154        { "--keyfile",      'k', RTGETOPT_REQ_STRING },
     2155        { "--passphrase",   'P', RTGETOPT_REQ_STRING },
     2156        { "--tenancy",      't', RTGETOPT_REQ_STRING },
     2157        { "--compartment",  'c', RTGETOPT_REQ_STRING },
     2158        { "--region",       'r', RTGETOPT_REQ_STRING }
     2159    };
     2160
     2161    RTGETOPTSTATE GetState;
     2162    int vrc = RTGetOptInit(&GetState, a->argc, a->argv, s_aOptions, RT_ELEMENTS(s_aOptions), iFirst, 0);
     2163    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     2164
     2165    com::SafeArray<BSTR> names;
     2166    com::SafeArray<BSTR> values;
     2167
     2168    int c;
     2169    RTGETOPTUNION ValueUnion;
     2170    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
     2171    {
     2172        switch (c)
     2173        {
     2174            case 'u':   // --clouduser
     2175                Bstr("user").detachTo(names.appendedRaw());
     2176                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2177                break;
     2178            case 'p':   // --fingerprint
     2179                Bstr("fingerprint").detachTo(names.appendedRaw());
     2180                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2181                break;
     2182            case 'k':   // --keyfile
     2183                Bstr("key_file").detachTo(names.appendedRaw());
     2184                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2185                break;
     2186            case 'P':   // --passphrase
     2187                Bstr("pass_phrase").detachTo(names.appendedRaw());
     2188                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2189                break;
     2190            case 't':   // --tenancy
     2191                Bstr("tenancy").detachTo(names.appendedRaw());
     2192                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2193                break;
     2194            case 'c':   // --compartment
     2195                Bstr("compartment").detachTo(names.appendedRaw());
     2196                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2197                break;
     2198            case 'r':   // --region
     2199                Bstr("region").detachTo(names.appendedRaw());
     2200                Bstr(ValueUnion.psz).detachTo(values.appendedRaw());
     2201                break;
     2202            default:
     2203                return errorGetOpt(USAGE_CLOUDPROFILE, c, &ValueUnion);
     2204        }
     2205    }
     2206
     2207    ComPtr<IVirtualBox> pVirtualBox = a->virtualBox;
     2208
     2209    ComPtr<ICloudProviderManager> pCloudProviderManager;
     2210    CHECK_ERROR2_RET(hrc, pVirtualBox,
     2211                     COMGETTER(CloudProviderManager)(pCloudProviderManager.asOutParam()),
     2212                     RTEXITCODE_FAILURE);
     2213
     2214    ComPtr<ICloudProvider> pCloudProvider;
     2215    CHECK_ERROR2_RET(hrc, pCloudProviderManager,
     2216                     GetProviderByShortName(bstrProvider.raw(), pCloudProvider.asOutParam()),
     2217                     RTEXITCODE_FAILURE);
     2218
     2219    CHECK_ERROR2_RET(hrc, pCloudProvider,
     2220                     CreateProfile(bstrProfile.raw(),
     2221                                   ComSafeArrayAsInParam(names),
     2222                                   ComSafeArrayAsInParam(values)),
     2223                     RTEXITCODE_FAILURE);
     2224
     2225    CHECK_ERROR2(hrc, pCloudProvider, SaveProfiles());
     2226
     2227    RTPrintf("Provider %ls: profile '%ls' was added.\n",bstrProvider.raw(), bstrProfile.raw());
     2228
     2229    return SUCCEEDED(hrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
     2230}
     2231
     2232static RTEXITCODE deleteCloudProfile(HandlerArg *a, PCLOUDPROFILECOMMONOPT pCommonOpts)
     2233{
     2234    HRESULT hrc = S_OK;
     2235
     2236    Bstr bstrProvider(pCommonOpts->pszProviderName);
     2237    Bstr bstrProfile(pCommonOpts->pszProfileName);
     2238
     2239    /* check for required options */
     2240    if (bstrProvider.isEmpty())
     2241        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --provider is required");
     2242    if (bstrProfile.isEmpty())
     2243        return errorSyntax(USAGE_CLOUDPROFILE, "Parameter --profile is required");
     2244
     2245    ComPtr<IVirtualBox> pVirtualBox = a->virtualBox;
     2246    ComPtr<ICloudProviderManager> pCloudProviderManager;
     2247    CHECK_ERROR2_RET(hrc, pVirtualBox,
     2248                     COMGETTER(CloudProviderManager)(pCloudProviderManager.asOutParam()),
     2249                     RTEXITCODE_FAILURE);
     2250    ComPtr<ICloudProvider> pCloudProvider;
     2251    CHECK_ERROR2_RET(hrc, pCloudProviderManager,
     2252                     GetProviderByShortName(bstrProvider.raw(), pCloudProvider.asOutParam()),
     2253                     RTEXITCODE_FAILURE);
     2254
     2255    ComPtr<ICloudProfile> pCloudProfile;
     2256    if (pCloudProvider)
     2257    {
     2258        CHECK_ERROR2_RET(hrc, pCloudProvider,
     2259                         GetProfileByName(bstrProfile.raw(), pCloudProfile.asOutParam()),
     2260                         RTEXITCODE_FAILURE);
     2261
     2262        CHECK_ERROR2_RET(hrc, pCloudProfile,
     2263                         Remove(),
     2264                         RTEXITCODE_FAILURE);
     2265
     2266        CHECK_ERROR2_RET(hrc, pCloudProvider,
     2267                         SaveProfiles(),
     2268                         RTEXITCODE_FAILURE);
     2269
     2270        RTPrintf("Provider %ls: profile '%ls' was deleted.\n",bstrProvider.raw(), bstrProfile.raw());
     2271    }
     2272
     2273    return SUCCEEDED(hrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
     2274}
     2275
     2276RTEXITCODE handleCloudProfile(HandlerArg *a)
     2277{
     2278    if (a->argc < 1)
     2279        return errorNoSubcommand();
     2280
     2281    static const RTGETOPTDEF s_aOptions[] =
     2282    {
     2283        /* common options */
     2284        { "--provider",     'v', RTGETOPT_REQ_STRING },
     2285        { "--profile",      'f', RTGETOPT_REQ_STRING },
     2286        /* subcommands */
     2287        { "add",            1000, RTGETOPT_REQ_NOTHING },
     2288        { "show",           1001, RTGETOPT_REQ_NOTHING },
     2289        { "update",         1002, RTGETOPT_REQ_NOTHING },
     2290        { "delete",         1003, RTGETOPT_REQ_NOTHING },
     2291    };
     2292
     2293    RTGETOPTSTATE GetState;
     2294    int vrc = RTGetOptInit(&GetState, a->argc, a->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 0, 0);
     2295    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     2296
     2297    CLOUDPROFILECOMMONOPT   CommonOpts = { NULL, NULL };
     2298    int c;
     2299    RTGETOPTUNION ValueUnion;
     2300    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
     2301    {
     2302        switch (c)
     2303        {
     2304            case 'v':   // --provider
     2305                CommonOpts.pszProviderName = ValueUnion.psz;
     2306                break;
     2307            case 'f':   // --profile
     2308                CommonOpts.pszProfileName = ValueUnion.psz;
     2309                break;
     2310            /* Sub-commands: */
     2311            case 1000:
     2312                setCurrentSubcommand(HELP_SCOPE_CLOUDPROFILE_ADD);
     2313                return addCloudProfile(a, GetState.iNext, &CommonOpts);
     2314            case 1001:
     2315                setCurrentSubcommand(HELP_SCOPE_CLOUDPROFILE_SHOW);
     2316                return showCloudProfileProperties(a, &CommonOpts);
     2317            case 1002:
     2318                setCurrentSubcommand(HELP_SCOPE_CLOUDPROFILE_UPDATE);
     2319                return setCloudProfileProperties(a, GetState.iNext, &CommonOpts);
     2320            case 1003:
     2321                setCurrentSubcommand(HELP_SCOPE_CLOUDPROFILE_DELETE);
     2322                return deleteCloudProfile(a, &CommonOpts);
     2323            case VINF_GETOPT_NOT_OPTION:
     2324                return errorUnknownSubcommand(ValueUnion.psz);
     2325
     2326            default:
     2327                return errorGetOpt(c, &ValueUnion);
     2328        }
     2329    }
     2330
     2331    return errorNoSubcommand();
     2332}
     2333
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette