VirtualBox

Changeset 50447 in vbox


Ignore:
Timestamp:
Feb 13, 2014 1:42:17 PM (11 years ago)
Author:
vboxsync
Message:

Main/Appliance: new options for suppressing MAC addresses on export
Frontends/VBoxManage: add support for the new options
doc/manual: document the new feature

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/doc/manual/en_US/user_VBoxManage.xml

    r50352 r50447  
    13671367    OVF standard 1.0 you can enable a OVF 0.9 legacy mode with the
    13681368    <computeroutput>--legacy09</computeroutput> option.</para>
     1369
     1370    <para>To specify options controlling the exact content of the appliance
     1371    file, you can use <computeroutput>--option</computeroutput> to request the
     1372    creation of a manifest file (encouraged, allows detection of corrupted
     1373    appliances on import), the additional export of DVD images, and the
     1374    exclusion of MAC addresses. You can specify a list of options, e.g.
     1375    <computeroutput>--option manifest,nomacs</computeroutput>. For details,
     1376    check the help output of <computeroutput>VBoxManage export</computeroutput>.</para>
    13691377  </sect1>
    13701378
  • trunk/doc/manual/user_ChangeLogImpl.xml

    r50402 r50447  
    1818
    1919    <itemizedlist>
     20
     21      <listitem>
     22        <para>VBoxManage: when exporting an appliance, support the suppression
     23           of MAC addresses, which means they will be always recreated on
     24           import, avoiding duplicate MAC addresses for VMs which are imported
     25           several times</para>
     26      </listitem>
    2027
    2128      <listitem>
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp

    r50323 r50447  
    55
    66/*
    7  * Copyright (C) 2009-2013 Oracle Corporation
     7 * Copyright (C) 2009-2014 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    788788}
    789789
    790 static const RTGETOPTDEF g_aExportOptions[]
    791     = {
    792         { "--output",             'o', RTGETOPT_REQ_STRING },
    793         { "--legacy09",           'l', RTGETOPT_REQ_NOTHING },
    794         { "--ovf09",              'l', RTGETOPT_REQ_NOTHING },
    795         { "--ovf10",              '1', RTGETOPT_REQ_NOTHING },
    796         { "--ovf20",              '2', RTGETOPT_REQ_NOTHING },
    797         { "--manifest",           'm', RTGETOPT_REQ_NOTHING },
    798         { "--iso",                'I', RTGETOPT_REQ_NOTHING },
    799         { "--vsys",               's', RTGETOPT_REQ_UINT32 },
    800         { "--product",            'p', RTGETOPT_REQ_STRING },
    801         { "--producturl",         'P', RTGETOPT_REQ_STRING },
    802         { "--vendor",             'n', RTGETOPT_REQ_STRING },
    803         { "--vendorurl",          'N', RTGETOPT_REQ_STRING },
    804         { "--version",            'v', RTGETOPT_REQ_STRING },
    805         { "--description",        'd', RTGETOPT_REQ_STRING },
    806         { "--eula",               'e', RTGETOPT_REQ_STRING },
    807         { "--eulafile",           'E', RTGETOPT_REQ_STRING },
    808       };
     790static int parseExportOptions(const char *psz, com::SafeArray<ExportOptions_T> *options)
     791{
     792    int rc = VINF_SUCCESS;
     793    while (psz && *psz && RT_SUCCESS(rc))
     794    {
     795        size_t len;
     796        const char *pszComma = strchr(psz, ',');
     797        if (pszComma)
     798            len = pszComma - psz;
     799        else
     800            len = strlen(psz);
     801        if (len > 0)
     802        {
     803            if (!RTStrNICmp(psz, "CreateManifest", len))
     804                options->push_back(ExportOptions_CreateManifest);
     805            else if (!RTStrNICmp(psz, "manifest", len))
     806                options->push_back(ExportOptions_CreateManifest);
     807            else if (!RTStrNICmp(psz, "ExportDVDImages", len))
     808                options->push_back(ExportOptions_ExportDVDImages);
     809            else if (!RTStrNICmp(psz, "iso", len))
     810                options->push_back(ExportOptions_ExportDVDImages);
     811            else if (!RTStrNICmp(psz, "StripAllMACs", len))
     812                options->push_back(ExportOptions_StripAllMACs);
     813            else if (!RTStrNICmp(psz, "nomacs", len))
     814                options->push_back(ExportOptions_StripAllMACs);
     815            else if (!RTStrNICmp(psz, "StripAllNonNATMACs", len))
     816                options->push_back(ExportOptions_StripAllNonNATMACs);
     817            else if (!RTStrNICmp(psz, "nomacsbutnat", len))
     818                options->push_back(ExportOptions_StripAllNonNATMACs);
     819            else
     820                rc = VERR_PARSE_ERROR;
     821        }
     822        if (pszComma)
     823            psz += len + 1;
     824        else
     825            psz += len;
     826    }
     827
     828    return rc;
     829}
     830
     831static const RTGETOPTDEF g_aExportOptions[] =
     832{
     833    { "--output",               'o', RTGETOPT_REQ_STRING },
     834    { "--legacy09",             'l', RTGETOPT_REQ_NOTHING },
     835    { "--ovf09",                'l', RTGETOPT_REQ_NOTHING },
     836    { "--ovf10",                '1', RTGETOPT_REQ_NOTHING },
     837    { "--ovf20",                '2', RTGETOPT_REQ_NOTHING },
     838    { "--manifest",             'm', RTGETOPT_REQ_NOTHING },    // obsoleted by --options
     839    { "--iso",                  'I', RTGETOPT_REQ_NOTHING },    // obsoleted by --options
     840    { "--vsys",                 's', RTGETOPT_REQ_UINT32 },
     841    { "--product",              'p', RTGETOPT_REQ_STRING },
     842    { "--producturl",           'P', RTGETOPT_REQ_STRING },
     843    { "--vendor",               'n', RTGETOPT_REQ_STRING },
     844    { "--vendorurl",            'N', RTGETOPT_REQ_STRING },
     845    { "--version",              'v', RTGETOPT_REQ_STRING },
     846    { "--description",          'd', RTGETOPT_REQ_STRING },
     847    { "--eula",                 'e', RTGETOPT_REQ_STRING },
     848    { "--eulafile",             'E', RTGETOPT_REQ_STRING },
     849    { "--options",              'O', RTGETOPT_REQ_STRING },
     850};
    809851
    810852int handleExportAppliance(HandlerArg *a)
     
    816858    bool fManifest = false; // the default
    817859    bool fExportISOImages = false; // the default
     860    com::SafeArray<ExportOptions_T> options;
    818861    std::list< ComPtr<IMachine> > llMachines;
    819862
     
    844887
    845888                case 'l':   // --legacy09/--ovf09
    846                      strOvfFormat = "ovf-0.9";
    847                      break;
     889                    strOvfFormat = "ovf-0.9";
     890                    break;
    848891
    849892                case '1':   // --ovf10
    850                      strOvfFormat = "ovf-1.0";
    851                      break;
     893                    strOvfFormat = "ovf-1.0";
     894                    break;
    852895
    853896                case '2':   // --ovf20
    854                      strOvfFormat = "ovf-2.0";
    855                      break;
     897                    strOvfFormat = "ovf-2.0";
     898                    break;
    856899
    857900                case 'I':   // --iso
    858                      fExportISOImages = true;
    859                      break;
     901                    fExportISOImages = true;
     902                    break;
    860903
    861904                case 'm':   // --manifest
    862                      fManifest = true;
    863                      break;
     905                    fManifest = true;
     906                    break;
    864907
    865908                case 's':   // --vsys
    866                      ulCurVsys = ValueUnion.u32;
    867                      break;
     909                    ulCurVsys = ValueUnion.u32;
     910                    break;
    868911
    869912                case 'p':   // --product
    870                      if (ulCurVsys == (uint32_t)-1)
    871                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    872                      mapArgsMapsPerVsys[ulCurVsys]["product"] = ValueUnion.psz;
    873                      break;
     913                    if (ulCurVsys == (uint32_t)-1)
     914                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     915                    mapArgsMapsPerVsys[ulCurVsys]["product"] = ValueUnion.psz;
     916                    break;
    874917
    875918                case 'P':   // --producturl
    876                      if (ulCurVsys == (uint32_t)-1)
    877                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    878                      mapArgsMapsPerVsys[ulCurVsys]["producturl"] = ValueUnion.psz;
    879                      break;
     919                    if (ulCurVsys == (uint32_t)-1)
     920                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     921                    mapArgsMapsPerVsys[ulCurVsys]["producturl"] = ValueUnion.psz;
     922                    break;
    880923
    881924                case 'n':   // --vendor
    882                      if (ulCurVsys == (uint32_t)-1)
    883                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    884                      mapArgsMapsPerVsys[ulCurVsys]["vendor"] = ValueUnion.psz;
    885                      break;
     925                    if (ulCurVsys == (uint32_t)-1)
     926                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     927                    mapArgsMapsPerVsys[ulCurVsys]["vendor"] = ValueUnion.psz;
     928                    break;
    886929
    887930                case 'N':   // --vendorurl
    888                      if (ulCurVsys == (uint32_t)-1)
    889                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    890                      mapArgsMapsPerVsys[ulCurVsys]["vendorurl"] = ValueUnion.psz;
    891                      break;
     931                    if (ulCurVsys == (uint32_t)-1)
     932                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     933                    mapArgsMapsPerVsys[ulCurVsys]["vendorurl"] = ValueUnion.psz;
     934                    break;
    892935
    893936                case 'v':   // --version
    894                      if (ulCurVsys == (uint32_t)-1)
    895                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    896                      mapArgsMapsPerVsys[ulCurVsys]["version"] = ValueUnion.psz;
    897                      break;
     937                    if (ulCurVsys == (uint32_t)-1)
     938                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     939                    mapArgsMapsPerVsys[ulCurVsys]["version"] = ValueUnion.psz;
     940                    break;
    898941
    899942                case 'd':   // --description
    900                      if (ulCurVsys == (uint32_t)-1)
    901                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    902                      mapArgsMapsPerVsys[ulCurVsys]["description"] = ValueUnion.psz;
    903                      break;
     943                    if (ulCurVsys == (uint32_t)-1)
     944                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     945                    mapArgsMapsPerVsys[ulCurVsys]["description"] = ValueUnion.psz;
     946                    break;
    904947
    905948                case 'e':   // --eula
    906                      if (ulCurVsys == (uint32_t)-1)
    907                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    908                      mapArgsMapsPerVsys[ulCurVsys]["eula"] = ValueUnion.psz;
    909                      break;
     949                    if (ulCurVsys == (uint32_t)-1)
     950                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     951                    mapArgsMapsPerVsys[ulCurVsys]["eula"] = ValueUnion.psz;
     952                    break;
    910953
    911954                case 'E':   // --eulafile
    912                      if (ulCurVsys == (uint32_t)-1)
    913                          return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    914                      mapArgsMapsPerVsys[ulCurVsys]["eulafile"] = ValueUnion.psz;
    915                      break;
     955                    if (ulCurVsys == (uint32_t)-1)
     956                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     957                    mapArgsMapsPerVsys[ulCurVsys]["eulafile"] = ValueUnion.psz;
     958                    break;
     959
     960                case 'O':   // --options
     961                    if (RT_FAILURE(parseExportOptions(ValueUnion.psz, &options)))
     962                        return errorArgument("Invalid export options '%s'\n", ValueUnion.psz);
     963                    break;
    916964
    917965                case VINF_GETOPT_NOT_OPTION:
     
    10571105            break;
    10581106
    1059         com::SafeArray<ExportOptions_T> options;
    10601107        if (fManifest)
    10611108            options.push_back(ExportOptions_CreateManifest);
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r50307 r50447  
    415415                     "                            [--manifest]\n"
    416416                     "                            [--iso]\n"
     417                     "                            [--options manifest|iso|nomacs|nomacsbutnat]\n"
    417418                     "                            [--vsys <number of virtual system>]\n"
    418419                     "                                    [--product <product name>]\n"
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r50380 r50447  
    33<!--
    44
    5     Copyright (C) 2006-2013 Oracle Corporation
     5    Copyright (C) 2006-2014 Oracle Corporation
    66
    77    This file is part of VirtualBox Open Source Edition (OSE), as
     
    28262826      needed for typical VMs.</desc>
    28272827    </const>
     2828    <const name="StripAllMACs"      value="3">
     2829      <desc>Do not export any MAC address information. Default is to keep them
     2830      to avoid losing information which can cause trouble after import, at the
     2831      price of risking duplicate MAC addresses, if the import options are used
     2832      to keep them.</desc>
     2833    </const>
     2834    <const name="StripAllNonNATMACs" value="4">
     2835      <desc>Do not export any MAC address information, except for adapters
     2836      using NAT. Default is to keep them to avoid losing information which can
     2837      cause trouble after import, at the price of risking duplicate MAC
     2838      addresses, if the import options are used to keep them.</desc>
     2839    </const>
    28282840
    28292841  </enum>
  • trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp

    r50444 r50447  
    55
    66/*
    7  * Copyright (C) 2008-2013 Oracle Corporation
     7 * Copyright (C) 2008-2014 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    18351835        // fill the machine config
    18361836        vsdescThis->m->pMachine->copyMachineDataToSettings(*pConfig);
     1837
     1838        // Apply export tweaks to machine settings
     1839        bool fStripAllMACs = m->optListExport.contains(ExportOptions_StripAllMACs);
     1840        bool fStripAllNonNATMACs = m->optListExport.contains(ExportOptions_StripAllNonNATMACs);
     1841        if (fStripAllMACs || fStripAllNonNATMACs)
     1842        {
     1843            for (settings::NetworkAdaptersList::iterator it = pConfig->hardwareMachine.llNetworkAdapters.begin();
     1844                 it != pConfig->hardwareMachine.llNetworkAdapters.end();
     1845                 ++it)
     1846            {
     1847                settings::NetworkAdapter &nic = *it;
     1848                if (fStripAllMACs || (fStripAllNonNATMACs && nic.mode != NetworkAttachmentType_NAT))
     1849                    nic.strMACAddress.setNull();
     1850            }
     1851        }
    18371852
    18381853        // write the machine config to the vbox:Machine element
Note: See TracChangeset for help on using the changeset viewer.

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