Changeset 77777 in vbox for trunk/src/VBox/Frontends/VBoxManage
- Timestamp:
- Mar 19, 2019 10:00:28 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 129442
- Location:
- trunk/src/VBox/Frontends/VBoxManage
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
r77595 r77777 159 159 { "convertfromraw", USAGE_CONVERTFROMRAW, VBMG_CMD_TODO, handleConvertFromRaw, VBMG_CMD_F_NO_COM }, 160 160 { "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 } 162 163 }; 163 164 -
trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h
r77595 r77777 112 112 USAGE_MEDIUMENCCHKPWD, 113 113 USAGE_USBDEVSOURCE, 114 USAGE_CLOUDPROFILE, 114 115 /* Insert new entries before this line, but only if it is not an option 115 116 * to go for the new style command and help handling (see e.g. extpack, … … 147 148 #endif 148 149 149 150 150 /** command handler argument */ 151 151 struct HandlerArg … … 290 290 RTEXITCODE handleUnattended(HandlerArg *a); 291 291 RTEXITCODE handleMoveVM(HandlerArg *a); 292 RTEXITCODE handleCloudProfile(HandlerArg *a); 292 293 293 294 /* VBoxManageDisk.cpp */ -
trunk/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp
r77595 r77777 1940 1940 return errorUnknownSubcommand(a->argv[0]); 1941 1941 } 1942 1943 /********************************************************************************************************************************* 1944 * Cloud profile functions * 1945 *********************************************************************************************************************************/ 1946 1947 /** 1948 * Common Cloud profile options. 1949 */ 1950 typedef struct 1951 { 1952 const char *pszProviderName; 1953 const char *pszProfileName; 1954 } CLOUDPROFILECOMMONOPT; 1955 typedef CLOUDPROFILECOMMONOPT *PCLOUDPROFILECOMMONOPT; 1956 1957 /** 1958 * Sets the properties of cloud profile 1959 * 1960 * @returns 0 on success, 1 on failure 1961 */ 1962 1963 static 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 */ 2074 static 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 2133 static 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 2232 static 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 2276 RTEXITCODE 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.