[vbox-dev] [PATCH] vbox-unattended in C++ ! was: [proposal: Unattended Guest OS Installs for VirtualBox ?]
Alexey Eromenko
al4321 at gmail.com
Tue Jan 10 05:50:14 GMT 2012
Reviewable version of my patch:
diff -uNr 2//vbox/doc/manual/user_ChangeLogImpl.xml
1//vbox/doc/manual/user_ChangeLogImpl.xml
--- 2//vbox/doc/manual/user_ChangeLogImpl.xml 2012-01-10
07:05:38.000000000 +0200
+++ 1//vbox/doc/manual/user_ChangeLogImpl.xml 2012-01-10
01:30:31.000000000 +0200
@@ -14,7 +14,11 @@
<listitem>
<para>Support for up to 36 network cards, in combination with an
- ICH9 chipset configuration (bug #8805).</para>
+ ICH9 chipset configuration (wish #8805).</para>
+ </listitem>
+
+ <listitem>
+ <para>Automated virtual machine install (Linux hosts only;
wish #5810).</para>
</listitem>
</itemizedlist>
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/Makefile.kmk
1//vbox/src/VBox/Frontends/VirtualBox/Makefile.kmk
--- 2//vbox/src/VBox/Frontends/VirtualBox/Makefile.kmk 2012-01-10
07:05:17.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/Makefile.kmk 2012-01-10
02:54:16.000000000 +0200
@@ -355,7 +355,8 @@
src/wizards/firstrun/UIFirstRunWzd.h \
src/wizards/importappliance/UIImportApplianceWzd.h \
src/wizards/newhd/UINewHDWizard.h \
- src/wizards/newvm/UINewVMWzd.h
+ src/wizards/newvm/UINewVMWzd.h \
+ src/wizards/newvm/libunattended.h
VirtualBox_QT_MOCHDRS.darwin += \
src/platform/darwin/UIWindowMenuManager.h
@@ -532,7 +533,8 @@
src/wizards/firstrun/UIFirstRunWzd.cpp \
src/wizards/importappliance/UIImportApplianceWzd.cpp \
src/wizards/newhd/UINewHDWizard.cpp \
- src/wizards/newvm/UINewVMWzd.cpp
+ src/wizards/newvm/UINewVMWzd.cpp \
+ src/wizards/newvm/libunattended.cpp
VirtualBox_SOURCES.win += \
src/runtime/UIFrameBufferDirectDraw.cpp
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.cpp
1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.cpp
--- 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.cpp 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.cpp 2012-01-10
07:00:02.000000000 +0200
@@ -0,0 +1,214 @@
+/*
+This is the core logic of unattended script generators.
+
+Copyright 2011-2012 (C) Alexey Eromenko "Technologov". All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
modification, are
+permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
notice, this list of
+ conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
copyright notice, this list
+ of conditions and the following disclaimer in the documentation
and/or other materials
+ provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY Alexey Eromenko "Technologov" ''AS IS''
AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
<COPYRIGHT HOLDER> OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation
are those of the
+authors and should not be interpreted as representing official
policies, either expressed
+or implied, of Alexey Eromenko "Technologov".
+*/
+
+#include <iostream>
+#include <fstream>
+#include <string>
+using namespace std;
+#include <stdlib.h>
+
+#include "libunattended.h"
+
+// Generic Logic
+LibUnattended::LibUnattended()
+{
+ system("mkdir -p /tmp/bootiso/");
+}
+
+void LibUnattended::cretaeIsoLinuxFolder(string strMachineFolder)
+{
+ string format_command = strMachineFolder;
+ format_command += "/isolinux";
+ system((char*)format_command.c_str());
+}
+
+string& LibUnattended::replaceAll(string& context, const string&
from, const string& to)
+{
+ size_t first = 0;
+ size_t last = string::npos;
+ // This is similar to python's string.replace()
+ // Technologov: I'm sorry but the C++ strings library is sooo *ulgy*.
+ // taken from:
+ // http://www.cppbook.com/index.php?title=String_replace
+ size_t currentPos = first;
+ size_t found;
+ if( from.empty() )
+ return context;
+ while( (found = context.find(from, currentPos)) != string::npos )
+ {
+ if( found >= last )
+ break;
+ context.replace(found, from.size(), to);
+ currentPos = found + to.size();
+ }
+ return context;
+}
+
+ifstream::pos_type size;
+
+string LibUnattended::readFileToString(string strReadfilepath)
+{
+ // input: strReadfilepath -- path to file
+ // return: string with file contents
+ ifstream file ((char*)strReadfilepath.c_str(),
+ ios::in|ios::ate|ios::binary);
+
+ if (file.is_open())
+ {
+ size = file.tellg();
+ char * memblock;
+ memblock = new char [size];
+ file.seekg (0, ios::beg);
+ file.read (memblock, size);
+ file.close();
+ //cout << "the complete file content is in memory\n";
+ string filereadstr=memblock;
+ delete[] memblock;
+ return filereadstr;
+ }
+ else
+ {
+ cout << "Unable to open file\n";
+ return "";
+ }
+}
+
+void LibUnattended::writeStringToFile(string strWritefilepath, string strData)
+{
+ ofstream myfile;
+ myfile.open ((char*)strWritefilepath.c_str(), ios::out|ios::binary);
+ myfile << strData;
+ myfile.close();
+}
+
+void LibUnattended::prepareFormattedFloppy(string strFloppyImagePath)
+{
+ // this function creates 1.44 MB floppy image + formats it in FAT12 format.
+ string dd_command = "dd if=/dev/zero of=$floppy count=1440 bs=1024";
+ dd_command = replaceAll(dd_command, "$floppy", strFloppyImagePath);
+ system((char*)dd_command.c_str());
+ string format_command = "/sbin/mkfs.msdos $floppy";
+ format_command = replaceAll(format_command, "$floppy", strFloppyImagePath);
+ system((char*)format_command.c_str());
+}
+
+void LibUnattended::copyFilesToFloppy(string strFloppyImagePath,
string file1, string file2)
+{
+ // This function copies up to 2 files to the floppy image (usually
NT5+NT6 scripts)
+ string format_command = "mcopy -i $floppy $file1 $file2 ::";
+ format_command = replaceAll(format_command, "$floppy", strFloppyImagePath);
+ format_command = replaceAll(format_command, "$file1", file1);
+ format_command = replaceAll(format_command, "$file2", file2);
+ system((char*)format_command.c_str());
+}
+
+void LibUnattended::prepareGenericScript(string strTemplateFilePath,
string strTargetFilePath,
+ string user, string password, string ProductKey, string arch)
+{
+ string final_script = readFileToString(strTemplateFilePath);
+ final_script = replaceAll(final_script, "$user", user);
+ final_script = replaceAll(final_script, "$password", password);
+ final_script = replaceAll(final_script, "$ProductKey", ProductKey);
+ final_script = replaceAll(final_script, "$arch", arch);
+ writeStringToFile(strTargetFilePath, final_script);
+}
+
+void LibUnattended::extractLinuxAdditionsFromISO(string target_path,
string VBoxGuestAdditionsISO)
+{
+ string format_command = "cd $target_path && 7z e
$VBoxGuestAdditionsISO VBoxLinuxAdditions.run";
+ format_command = replaceAll(format_command, "$target_path", target_path);
+ format_command = replaceAll(format_command,
"$VBoxGuestAdditionsISO", VBoxGuestAdditionsISO);
+ system((char*)format_command.c_str());
+}
+
+void LibUnattended::prepareUnattendedLinuxCD(string isopath, string
sourcepath, string isolinuxpath)
+{
+ string format_command = "cd $sourcepath && genisoimage -o $isopath -r -b \
+ $isolinuxpathisolinux.bin -c $isolinuxpathboot.cat -no-emul-boot \
+ -boot-load-size 4 -boot-info-table -R -J -v -T .";
+ format_command = replaceAll(format_command, "$sourcepath", sourcepath);
+ format_command = replaceAll(format_command, "$isopath", isopath);
+ format_command = replaceAll(format_command, "$isolinuxpath", isolinuxpath);
+ system((char*)format_command.c_str());
+}
+// End of Generic Logic
+
+// Red Hat Logic
+
+void LibUnattended::extractFromRedHatISO(string isopath, string
target_path, string VBoxGuestAdditionsISO)
+{
+ string format_command = "cd $target_path && rm -Rvf * && 7z e
$isopath isolinux/ && rm -Rvf isolinux/";
+ format_command = replaceAll(format_command, "$target_path", target_path);
+ format_command = replaceAll(format_command, "$isopath", isopath);
+ system((char*)format_command.c_str());
+ extractLinuxAdditionsFromISO(target_path, VBoxGuestAdditionsISO);
+}
+// End of Red Hat Logic
+// Debian Logic
+
+void LibUnattended::extractFromDebianISO(string isopath, string
target_path, string VBoxGuestAdditionsISO)
+{
+ string format_command = "cd $target_path && rm -Rvf * && 7z x
$isopath install.386/ install.amd/ isolinux/";
+ format_command = replaceAll(format_command, "$target_path", target_path);
+ format_command = replaceAll(format_command, "$isopath", isopath);
+ system((char*)format_command.c_str());
+ extractLinuxAdditionsFromISO(target_path, VBoxGuestAdditionsISO);
+}
+// End of Debian Logic
+// SUSE Logic
+void LibUnattended::extractFromSuseISO(string isopath, string target_path,
+ string VBoxGuestAdditionsISO, string arch)
+{
+ string format_command = "cd $target_path && rm -Rvf * && 7z e $isopath \
+ boot/$arch/loader/initrd \
+ boot/$arch/loader/linux \
+ boot/$arch/loader/isolinux.bin";
+ format_command = replaceAll(format_command, "$target_path", target_path);
+ format_command = replaceAll(format_command, "$isopath", isopath);
+ format_command = replaceAll(format_command, "$arch", arch);
+ system((char*)format_command.c_str());
+ extractLinuxAdditionsFromISO(target_path, VBoxGuestAdditionsISO);
+}
+// End of SUSE Logic
+
+
+/*
+int main ()
+{
+ // main() function lets me test libunattended separately, without
recompiling whole VBox.
+ // It must be commented out, if I'm using it as part of VBox.
+ LibUnattended libu;
+ libu.prepareGenericScript("/tmp/win_nt6_template_autounattend.xml",
"/tmp/autounattend.xml",
+ "myuser", "123456q", "my-key", "x86");
+ libu.prepareFormattedFloppy("/tmp/winfloppy.img");
+ libu.copyFilesToFloppy("/tmp/winfloppy.img", "/tmp/winnt5.sif",
"/tmp/autounattend.xml");
+ return 0;
+}
+//*/
\ No newline at end of file
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.h
1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.h
--- 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.h 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/libunattended.h 2012-01-10
05:43:44.000000000 +0200
@@ -0,0 +1,27 @@
+#ifndef __libunattended_h__
+#define __libunattended_h__
+
+#include <string>
+using namespace std;
+
+class LibUnattended
+{
+ public:
+ LibUnattended();
+ void cretaeIsoLinuxFolder(string strMachineFolder);
+ string& replaceAll(string& context, const string& from, const string& to);
+ string readFileToString(string strReadfilepath);
+ void writeStringToFile(string strWritefilepath, string strData);
+ void prepareGenericScript(string strTemplateFilePath, string
strTargetFilePath,
+ string user, string password, string ProductKey, string arch);
+ void prepareFormattedFloppy(string strFloppyImagePath);
+ void copyFilesToFloppy(string strFloppyImagePath, string file1,
string file2);
+ void extractLinuxAdditionsFromISO(string target_path, string
VBoxGuestAdditionsISO);
+ void prepareUnattendedLinuxCD(string isopath, string sourcepath,
string isolinuxpath);
+
+ void extractFromRedHatISO(string isopath, string target_path,
string VBoxGuestAdditionsISO);
+ void extractFromDebianISO(string isopath, string target_path,
string VBoxGuestAdditionsISO);
+ void extractFromSuseISO(string isopath, string target_path,
string VBoxGuestAdditionsISO, string arch);
+};
+
+#endif // __libunattended_h__
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.cpp
1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.cpp
--- 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.cpp 2012-01-10
07:05:17.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.cpp 2012-01-10
06:01:35.000000000 +0200
@@ -28,10 +28,22 @@
#include "UIMessageCenter.h"
#include "UIMachineSettingsStorage.h"
#include "VBoxDefs.h"
+#include "libunattended.h"
/* Using declarations: */
using namespace VBoxGlobalDefs;
+bool g_bUnattendedEnabled = false;
+QString g_strPathCDROM1="abc.iso";
+QString g_strPathCDROM2="abc.iso";
+QString g_strISOpath;
+QString g_strUser;
+QString g_strPassword;
+QString g_strProductKey;
+QString g_strMachineFolder;
+;
+#include <QMessageBox>
+
/* Globals */
struct osTypePattern
{
@@ -143,9 +155,12 @@
/* Create & add pages */
addPage(new UINewVMWzdPage1);
addPage(new UINewVMWzdPage2);
+ addPage(new UINewVMWzdPageU);
addPage(new UINewVMWzdPage3);
addPage(new UINewVMWzdPage4);
addPage(new UINewVMWzdPage5);
+
+ g_bUnattendedEnabled = false;
/* Initial translate */
retranslateUi();
@@ -218,11 +233,32 @@
this, SLOT(sltNameChanged(const QString&)));
connect(m_pTypeSelector, SIGNAL(osTypeChanged()),
this, SLOT(sltOsTypeChanged()));
+ connect(m_pUnattendedCheckBox, SIGNAL(clicked()),
+ this, SLOT(sltUnattendedChanged()));
/* Setup contents */
m_pTypeSelector->activateLayout();
}
+void UINewVMWzdPage2::testUnattendedAvailability()
+{
+ /*This function tests if current guest OS supports unattended installs*/
+ QString type = field("type").value<CGuestOSType>().GetId();
+
+ if (type.contains("Windows200") || // 2000 / 2003 / 2008
+ type.contains("WindowsXP") || type.contains("WindowsVista") ||
+ type.contains("Windows7") || type.contains("RedHat") ||
+ type.contains("SUSE") || type.contains("Debian"))
+ {
+ m_pUnattendedCheckBox->setEnabled(true);
+ }
+ else // Default:
+ {
+ g_bUnattendedEnabled=false;
+ m_pUnattendedCheckBox->setEnabled(false);
+ m_pUnattendedCheckBox->setChecked(false);
+ }
+}
void UINewVMWzdPage2::sltNameChanged(const QString &strNewText)
{
/* Search for a matching OS type based on the string the user typed
@@ -235,6 +271,8 @@
m_pTypeSelector->blockSignals(false);
break;
}
+
+ testUnattendedAvailability();
}
void UINewVMWzdPage2::sltOsTypeChanged()
@@ -243,6 +281,13 @@
* type guessing anymore. So simply disconnect the text edit signal. */
disconnect(m_pNameEditor, SIGNAL(textChanged(const QString&)),
this, SLOT(sltNameChanged(const QString&)));
+
+ testUnattendedAvailability();
+}
+
+void UINewVMWzdPage2::sltUnattendedChanged()
+{
+ g_bUnattendedEnabled = m_pUnattendedCheckBox->checkState();
}
void UINewVMWzdPage2::retranslateUi()
@@ -259,8 +304,9 @@
/* Fill and translate */
retranslateUi();
- /* 'Name' field should have focus initially */
+ /* 'Name' field should have focus initially */
m_pNameEditor->setFocus();
+
}
void UINewVMWzdPage2::cleanupPage()
@@ -303,6 +349,7 @@
/* Initialize machine dir value: */
m_strMachineFolder = strMachineFolder;
+ g_strMachineFolder = strMachineFolder;
return true;
}
@@ -328,6 +375,7 @@
void UINewVMWzdPage2::setMachineFolder(const QString &strMachineFolder)
{
m_strMachineFolder = strMachineFolder;
+ g_strMachineFolder = strMachineFolder;
}
UINewVMWzdPage3::UINewVMWzdPage3()
@@ -776,9 +824,9 @@
usbController.SetEnabledEhci(true);
}
- /* Create a floppy controller if recommended */
+ /* Create a floppy controller if recommended, or if required by
Unattended Install */
QString ctrFloppyName = getNextControllerName(KStorageBus_Floppy);
- if (type.GetRecommendedFloppy()) {
+ if (type.GetRecommendedFloppy() || unattendedRequiresFloppy(type)) {
m_Machine.AddStorageController(ctrFloppyName, KStorageBus_Floppy);
CStorageController flpCtr =
m_Machine.GetStorageControllerByName(ctrFloppyName);
flpCtr.SetControllerType(KStorageControllerType_I82078);
@@ -882,14 +930,19 @@
StorageSlot(ctrHdBus, 0, 0), this);
}
- /* Attach empty CD/DVD ROM Device */
- m.AttachDevice(ctrDvdName, 1, 0, KDeviceType_DVD, CMedium());
- if (!m.isOk())
- msgCenter().cannotAttachDevice(m,
VBoxDefs::MediumType_DVD, QString(), StorageSlot(ctrDvdBus, 1, 0),
this);
+ /* Attach a CD/DVD ROM Device */
+ if (g_bUnattendedEnabled)
+ {
+ constructUnattendedMachine(m, type, ctrDvdName, ctrFloppyName);
+ }
+ else
+ m.AttachDevice(ctrDvdName, 1, 0, KDeviceType_DVD, CMedium());
+ if (!m.isOk())
+ msgCenter().cannotAttachDevice(m,
VBoxDefs::MediumType_DVD, QString(), StorageSlot(ctrDvdBus, 1, 0),
this);
- /* Attach an empty floppy drive if recommended */
- if (type.GetRecommendedFloppy()) {
+ /* Attach an empty floppy drive if recommended, when not
in unattended install mode */
+ if (type.GetRecommendedFloppy() && (!g_bUnattendedEnabled)) {
m.AttachDevice(ctrFloppyName, 0, 0,
KDeviceType_Floppy, CMedium());
if (!m.isOk())
msgCenter().cannotAttachDevice(m,
VBoxDefs::MediumType_Floppy, QString(),
@@ -987,3 +1040,268 @@
{
m_Machine = machine;
}
+
+bool UINewVMWzdPage5::unattendedRequiresFloppy(CGuestOSType &type)
+{
+ if (!g_bUnattendedEnabled) return false;
+ QString ostype = field("type").value<CGuestOSType>().GetId();
+ if (ostype.contains("Windows") || ostype.contains("Debian"))
+ return true;
+ else
+ return false;
+}
+
+void UINewVMWzdPage5::constructUnattendedMachine(CMachine &machine,
+ CGuestOSType &type, QString &ctrDvdName, QString &ctrFloppyName)
+{
+ /*This function prepares the VM for unattended install,
+ by generating custom CD ISO and floppy images, and attaching
+ them to VM.*/
+ CMachine m = machine;
+ // boot order: HDD->CD-ROM->Floppy (first number = boot priority)
+ // second number = device. devices: 1 = floppy, 2 = CD, 3 = HDD,
4 = Network (PXE)
+ m.SetBootOrder(1, KDeviceType_HardDisk);
+ m.SetBootOrder(2, KDeviceType_DVD);
+ m.SetBootOrder(3, KDeviceType_Floppy);
+
+ //////////////////////////////////////////////////////////////////////////
+ // Here we will generate the necessary ISO and Floppy Images //
+ //////////////////////////////////////////////////////////////////////////
+ QString ostype = field("type").value<CGuestOSType>().GetId();
+ QString pathFloppy = g_strMachineFolder+"/floppy_script.img";
+ QString pathCDcustom = "";
+ QString VBoxGuestAdditionsISO = "/tmp/VBoxGuestAdditions.iso";
+ QMessageBox msgBox;
+ msgBox.setText(pathFloppy);
+ msgBox.exec();
+
+ QString arch = "x86";
+ if (ostype.contains(64)) arch = "x64";
+ //*
+ LibUnattended libunattended;
+ libunattended.cretaeIsoLinuxFolder(g_strMachineFolder.toStdString());
+
+ if (ostype.contains("Windows"))
+ {
+ QString winNT5_Target_File = g_strMachineFolder+"/winnt.sif";
+ QString winNT6_Target_File = g_strMachineFolder+"/autounattend.xml";
+ libunattended.prepareFormattedFloppy(pathFloppy.toStdString());
+ // NT5
+ libunattended.prepareGenericScript("/tmp/win_nt5_template_winnt.sif",
+ winNT5_Target_File.toStdString(),
+ g_strUser.toStdString(),
+ g_strPassword.toStdString(),
+ g_strProductKey.toStdString(),
+ "");
+ // NT6
+ libunattended.prepareGenericScript("/tmp/win_nt6_template_autounattend.xml",
+ winNT6_Target_File.toStdString(),
+ g_strUser.toStdString(),
+ g_strPassword.toStdString(),
+ g_strProductKey.toStdString(),
+ arch.toStdString());
+
+ libunattended.copyFilesToFloppy(pathFloppy.toStdString(),
+ winNT5_Target_File.toStdString(),
+ winNT6_Target_File.toStdString());
+ }
+ else if (ostype.contains("Debian"))
+ {
+ QString debarch="386";
+ if (ostype.contains(64)) debarch = "amd";
+ pathCDcustom = g_strMachineFolder+"/debian_boot.iso";
+
+ libunattended.prepareFormattedFloppy(pathFloppy.toStdString());
+ libunattended.extractFromDebianISO(g_strISOpath.toStdString(),
+ "/tmp/bootiso/",
+
VBoxGuestAdditionsISO.toStdString());
+ // prepares Debian preseed script
+ libunattended.prepareGenericScript("/tmp/linux_debian_template_preseed.cfg",
+ "/tmp/bootiso/preseed.cfg",
+ g_strUser.toStdString(),
+ g_strPassword.toStdString(),
+ g_strProductKey.toStdString(),
+ "");
+
+ // prepares Debian isolinux script
+ libunattended.prepareGenericScript("/tmp/linux_debian_template_isolinux.cfg",
+
"/tmp/bootiso/isolinux/isolinux.cfg",
+ "",
+ "",
+ "",
+ debarch.toStdString());
+ libunattended.prepareUnattendedLinuxCD(pathCDcustom.toStdString(),
"/tmp/bootiso/", "isolinux/");
+ libunattended.copyFilesToFloppy(pathFloppy.toStdString(),
"/tmp/bootiso/preseed.cfg", "");
+ }
+ else if (ostype.contains("RedHat"))
+ {
+ pathFloppy = ""; // disable floppy
+ pathCDcustom = g_strMachineFolder+"/redhat_boot.iso";
+ }
+ else if (ostype.contains("SUSE"))
+ {
+ pathFloppy = ""; // disable floppy
+ pathCDcustom = g_strMachineFolder+"/suse_boot.iso";
+ QString susearch="i386";
+ if (ostype.contains(64)) susearch = "amd64";
+ libunattended.extractFromSuseISO(g_strISOpath.toStdString(),
+ "/tmp/bootiso/",
+ VBoxGuestAdditionsISO.toStdString(),
+ susearch.toStdString());
+
+ // prepares SUSE autoyast script
+ libunattended.prepareGenericScript("/tmp/linux_suse_template_autoinst.xml",
+ "/tmp/bootiso/autoinst.xml",
+ g_strUser.toStdString(),
+ g_strPassword.toStdString(),
+ "",
+ "");
+
+ // prepares SUSE isolinux script
+ libunattended.prepareGenericScript("/tmp/linux_suse_template_isolinux.cfg",
+ "/tmp/bootiso/isolinux.cfg",
+ "",
+ "",
+ "",
+ susearch.toStdString());
+ libunattended.prepareUnattendedLinuxCD(pathCDcustom.toStdString(),
"/tmp/bootiso/", "");
+ }
+ else
+ {
+ // Unsupported guest OS
+ pathFloppy = ""; // disable floppy
+ }
+ //*/
+ if (pathFloppy != "")
+ {
+ // Attach unattended Floppy image to controller
+ QString myQfloppy =
vboxGlobal().openMedium(VBoxDefs::MediumType_Floppy, pathFloppy);
+ CMedium myCfloppy = vboxGlobal().findMedium(myQfloppy).medium();
+ m.AttachDevice(ctrFloppyName, 0, 0, KDeviceType_Floppy, myCfloppy);
+ if (!m.isOk())
+ msgCenter().cannotAttachDevice(m,
VBoxDefs::MediumType_Floppy, QString(),
+
StorageSlot(KStorageBus_Floppy, 0, 0), this);
+ }
+ // debug
+ //QMessageBox msgBox;
+ //msgBox.setText(ostype);
+ //msgBox.exec();
+
+ QString tempCD1, tempCD2;
+ QString myQmediumCD1, myQmediumCD2;
+ CMedium myCmediumCD1, myCmediumCD2;
+ // Windows boots from original CD, Linux must boot from custom-made CD:
+ // So for Linux guests we swap CD1 and CD2.
+ if (ostype.contains("SUSE") || ostype.contains("Debian") ||
ostype.contains("RedHat"))
+ {
+ tempCD1 = pathCDcustom;
+ tempCD2 = g_strISOpath;
+ }
+ else // Windows
+ {
+ tempCD1 = g_strISOpath;
+ tempCD2 = VBoxGuestAdditionsISO;
+ }
+ KStorageBus ctrDvdBus = type.GetRecommendedDvdStorageBus();
+
+ myQmediumCD1 = vboxGlobal().openMedium(VBoxDefs::MediumType_DVD, tempCD1);
+ myCmediumCD1 = vboxGlobal().findMedium(myQmediumCD1).medium();
+ m.AttachDevice(ctrDvdName, 1, 0, KDeviceType_DVD, myCmediumCD1);
+ if (!m.isOk())
+ msgCenter().cannotAttachDevice(m, VBoxDefs::MediumType_DVD,
QString(), StorageSlot(ctrDvdBus, 1, 0), this);
+
+ myQmediumCD2 = vboxGlobal().openMedium(VBoxDefs::MediumType_DVD, tempCD2);
+ myCmediumCD2 = vboxGlobal().findMedium(myQmediumCD2).medium();
+ m.AttachDevice(ctrDvdName, 1, 1, KDeviceType_DVD, myCmediumCD2);
+ if (!m.isOk())
+ msgCenter().cannotAttachDevice(m, VBoxDefs::MediumType_DVD,
QString(), StorageSlot(ctrDvdBus, 1, 1), this);
+
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+UINewVMWzdPageU::UINewVMWzdPageU()
+{
+ Ui::UINewVMWzdPageU::setupUi(this);
+
+ connect(m_pISOpathEditor, SIGNAL(textChanged(const QString&)),
+ this, SLOT(sltISOpathChanged(const QString&)));
+ connect(m_pUserEditor, SIGNAL(textChanged(const QString&)),
+ this, SLOT(sltUserChanged(const QString&)));
+ connect(m_pPasswordEditor, SIGNAL(textChanged(const QString&)),
+ this, SLOT(sltPasswordChanged(const QString&)));
+ connect(m_pProductKeyEditor, SIGNAL(textChanged(const QString&)),
+ this, SLOT(sltProductKeyChanged(const QString&)));
+}
+
+void UINewVMWzdPageU::sltISOpathChanged(const QString &strText)
+{
+ g_strISOpath = strText;
+}
+
+void UINewVMWzdPageU::sltUserChanged(const QString &strText)
+{
+ g_strUser = strText;
+}
+
+void UINewVMWzdPageU::sltPasswordChanged(const QString &strText)
+{
+ g_strPassword = strText;
+}
+
+void UINewVMWzdPageU::sltProductKeyChanged(const QString &strText)
+{
+ g_strProductKey = strText;
+}
+
+void UINewVMWzdPageU::retranslateUi()
+{
+ //Ui::UINewVMWzdPageU::retranslateUi(this);
+ setTitle(tr("Automated Installer!"));
+}
+
+void UINewVMWzdPageU::initializePage()
+{
+ /*This function passes parameters from the GUI dialog
+ to the variables. */
+ //retranslateUi();
+ //g_strPathCDROM1 = m_pISOpathEditor;
+ //g_strPathCDROM2 = "/opt/VirtualBox/additions/VBoxGuestAdditions.iso";
+ QString type = field("type").value<CGuestOSType>().GetId();
+ // Debug:
+ QMessageBox msgBox;
+ msgBox.setText(type);
+ msgBox.exec();
+
+ m_pISOpathEditor->setEnabled(true);
+ m_pUserEditor->setEnabled(true);
+ m_pPasswordEditor->setEnabled(true);
+ m_pProductKeyEditor->setEnabled(true);
+ if (g_bUnattendedEnabled && (type.contains("Windows200") || //
2000 / 2003 / 2008
+ type.contains("WindowsXP") || type.contains("WindowsVista") ||
+ type.contains("Windows7")))
+ {
+ true;
+ }
+ else if (g_bUnattendedEnabled && (type.contains("RedHat") ||
+ type.contains("SUSE") || type.contains("Debian")))
+ {
+ m_pProductKeyEditor->setEnabled(false);
+ }
+ else // Default:
+ {
+ m_pISOpathEditor->setEnabled(false);
+ m_pUserEditor->setEnabled(false);
+ m_pPasswordEditor->setEnabled(false);
+ m_pProductKeyEditor->setEnabled(false);
+ }
+}
+
+bool UINewVMWzdPageU::isComplete() const
+{
+ return true;
+}
+
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.h
1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.h
--- 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.h 2012-01-10
07:05:17.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzd.h 2012-01-10
03:49:17.000000000 +0200
@@ -28,6 +28,7 @@
/* Generated includes */
#include "UINewVMWzdPage1.gen.h"
#include "UINewVMWzdPage2.gen.h"
+#include "UINewVMWzdPageU.gen.h"
#include "UINewVMWzdPage3.gen.h"
#include "UINewVMWzdPage4.gen.h"
#include "UINewVMWzdPage5.gen.h"
@@ -75,6 +76,7 @@
void sltNameChanged(const QString &strNewText);
void sltOsTypeChanged();
+ void sltUnattendedChanged();
protected:
@@ -82,6 +84,7 @@
void initializePage();
void cleanupPage();
+ void testUnattendedAvailability();
bool validatePage();
@@ -186,6 +189,10 @@
private:
bool constructMachine();
+ void constructUnattendedMachine(CMachine &machine, CGuestOSType &type,
+ QString &ctrDvdName,
+ QString &ctrFloppyName);
+ bool unattendedRequiresFloppy(CGuestOSType &type);
CMachine machine() const;
void setMachine(const CMachine &machine);
@@ -199,5 +206,25 @@
int m_iSASCount;
};
+class UINewVMWzdPageU : public QIWizardPage, public Ui::UINewVMWzdPageU
+{
+ Q_OBJECT;
+
+public:
+ UINewVMWzdPageU();
+
+protected:
+ void retranslateUi();
+ void initializePage();
+ bool isComplete() const;
+
+protected slots:
+ void sltISOpathChanged(const QString &strText);
+ void sltUserChanged(const QString &strText);
+ void sltPasswordChanged(const QString &strText);
+ void sltProductKeyChanged(const QString &strText);
+
+};
+
#endif // __UINewVMWzd_h__
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPage2.ui
1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPage2.ui
--- 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPage2.ui 2012-01-10
07:05:17.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPage2.ui 2012-01-10
01:25:12.000000000 +0200
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<comment>
- VBox frontends: Qt4 GUI ("VirtualBox"):
+ VBox frontends: Qt4 GUI ("VirtualBox"):
Copyright (C) 2009 Oracle Corporation
@@ -9,18 +9,12 @@
available from http://www.virtualbox.org. This file is free software;
you can redistribute it and/or modify it under the terms of the GNU
General Public License (GPL) as published by the Free Software
- Foundation, in version 2 as it comes in the "COPYING" file of the
+ Foundation, in version 2 as it comes in the "COPYING"
file of the
VirtualBox OSE distribution. VirtualBox OSE is distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
</comment>
<class>UINewVMWzdPage2</class>
<widget class="QWidget" name="UINewVMWzdPage2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
<property name="geometry">
<rect>
<x>0</x>
@@ -36,7 +30,7 @@
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="m_pLayout1">
- <property name="bottomMargin" >
+ <property name="bottomMargin">
<number>0</number>
</property>
<item>
@@ -74,7 +68,17 @@
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="m_pUnattendedCheckBox">
+ <property name="text">
+ <string>Auto&mated Install</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<spacer name="m_pSpacer1">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPageU.ui
1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPageU.ui
--- 2//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPageU.ui 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UINewVMWzdPageU.ui 2012-01-08
16:20:19.000000000 +0200
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <comment>
+ Copyright (C) 2012 by Alexey Eromenko "Technologov"
+ </comment>
+ <class>UINewVMWzdPageU</class>
+ <widget class="QWidget" name="UINewVMWzdPageU">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>General Virtual Machine settings:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Path to ISO / DVD</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="m_pISOpathEditor"/>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolButton">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Enter specific unattended virtual machine install
settings:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>user</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLineEdit" name="m_pUserEditor"/>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>password [1]</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLineEdit" name="m_pPasswordEditor"/>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>product key [2]</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLineEdit" name="m_pProductKeyEditor"/>
+ </item>
+ <item row="7" column="0" colspan="2">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>[1] password is both for 'user' and for
'root'/Administrator</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" colspan="2">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>[2] is required for Windows guests only; else ignored.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff -uNr 2//vbox/src/VBox/Frontends/VirtualBox/VBoxUI.pro
1//vbox/src/VBox/Frontends/VirtualBox/VBoxUI.pro
--- 2//vbox/src/VBox/Frontends/VirtualBox/VBoxUI.pro 2012-01-10
07:05:17.000000000 +0200
+++ 1//vbox/src/VBox/Frontends/VirtualBox/VBoxUI.pro 2012-01-08
16:20:45.000000000 +0200
@@ -52,9 +52,11 @@
src/wizards/clonevm/UICloneVMWizardPage3.ui \
src/wizards/newvm/UINewVMWzdPage1.ui \
src/wizards/newvm/UINewVMWzdPage2.ui \
+ src/wizards/newvm/UINewVMWzdPageU.ui \
src/wizards/newvm/UINewVMWzdPage3.ui \
src/wizards/newvm/UINewVMWzdPage4.ui \
src/wizards/newvm/UINewVMWzdPage5.ui \
+ src/wizards/newvm/UINewVMWzdPage6.ui \
src/wizards/newhd/UINewHDWizardPageWelcome.ui \
src/wizards/newhd/UINewHDWizardPageFormat.ui \
src/wizards/newhd/UINewHDWizardPageVariant.ui \
diff -uNr 2//vbox/vbox-unattended/linux_debian_template_isolinux.cfg
1//vbox/vbox-unattended/linux_debian_template_isolinux.cfg
--- 2//vbox/vbox-unattended/linux_debian_template_isolinux.cfg 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/linux_debian_template_isolinux.cfg 2012-01-03
20:32:26.000000000 +0200
@@ -0,0 +1,8 @@
+default debian
+prompt 0
+timeout 1
+
+label debian
+ kernel /install.$arch/vmlinuz
+ append initrd=/install.$arch/initrd.gz
debian-installer/locale=en_US console-setup/layoutcode=us
netcfg/choose_interface=auto priority=critical
preseed/file=/floppy/preseed.cfg --
+ #append video=vesa:ywrap,mtrr vga=788
initrd=/install.$arch/gtk/initrd.gz auto-install/enabled=true
netcfg/choose_interface=auto priority=critical
preseed/file=/floppy/preseed.cfg --
diff -uNr 2//vbox/vbox-unattended/linux_debian_template_preseed.cfg
1//vbox/vbox-unattended/linux_debian_template_preseed.cfg
--- 2//vbox/vbox-unattended/linux_debian_template_preseed.cfg 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/linux_debian_template_preseed.cfg 2012-01-02
15:00:52.000000000 +0200
@@ -0,0 +1,63 @@
+d-i debian-installer/locale string en_US
+d-i console-keymaps-at/keymap select us
+
+# network config
+d-i netcfg/choose_interface select auto
+d-i netcfg/get_hostname string localhost
+d-i netcfg/get_domain string localdomain
+d-i netcfg/disable_dhcp boolean false
+
+# time & clock
+d-i clock-setup/ntp boolean false
+d-i clock-setup/utc boolean true
+d-i time/zone select US/Eastern
+
+# HDD partitioning + format
+d-i partman-auto/method string regular
+d-i partman-auto/choose_recipe select atomic
+d-i partman/confirm_write_new_label boolean true
+d-i partman/choose_partition select finish
+d-i partman/confirm boolean true
+d-i partman/confirm_nooverwrite boolean true
+
+# users
+d-i passwd/root-login boolean true
+d-i passwd/root-password password $password
+d-i passwd/root-password-again password $password
+d-i passwd/user-fullname string $user
+d-i passwd/username string $user
+d-i passwd/user-password password $password
+d-i passwd/user-password-again password $password
+
+# packages
+tasksel tasksel/first multiselect standard, desktop
+tasksel tasksel/desktop multiselect kde
+d-i pkgsel/include string openssh-server build-essential autoconf dkms synaptic
+d-i pkgsel/upgrade select none
+popularity-contest popularity-contest/participate boolean true
+
+# silence extra repositories, grub and reboot
+d-i apt-setup/security_host string
+d-i apt-setup/volatile_host string
+d-i apt-setup/services-select multiselect
+d-i grub-installer/only_debian boolean true
+d-i finish-install/reboot_in_progress note
+
+# custom scripts; Step is done in d-i after installed all packages,
but before guest OS reboot:
+# It is generating "rc.local" file, which will act as first-boot
script, after reboot:
+d-i preseed/late_command string \
+mv /target/etc/rc.local /target/etc/rc.local.backup; \
+echo false > /target/etc/X11/default-display-manager; \
+echo '#!/bin/bash' > /target/etc/rc.local;\
+echo 'mkdir /mnt/cdrom' >> /target/etc/rc.local;\
+echo 'echo' >> /target/etc/rc.local;\
+echo 'echo "Installing VirtualBox Guest Additions..."' >>
/target/etc/rc.local;\
+echo 'mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom' >> /target/etc/rc.local;\
+echo 'bash /mnt/cdrom/VBoxLinuxAdditions.run' >> /target/etc/rc.local;\
+echo 'eject /dev/cdrom' >> /target/etc/rc.local;\
+echo 'usermod -a -G vboxsf $user' >> /target/etc/rc.local;\
+echo 'echo "/usr/bin/kdm" >/etc/X11/default-display-manager' >>
/target/etc/rc.local;\
+echo 'mv /etc/rc.local.backup /etc/rc.local' >> /target/etc/rc.local;\
+echo '/etc/init.d/kdm start &' >> /target/etc/rc.local;\
+echo 'exit 0' >> /target/etc/rc.local;\
+chmod a+rx /target/etc/rc.local
\ No newline at end of file
diff -uNr 2//vbox/vbox-unattended/linux_rhel_template_isolinux.cfg
1//vbox/vbox-unattended/linux_rhel_template_isolinux.cfg
--- 2//vbox/vbox-unattended/linux_rhel_template_isolinux.cfg 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/linux_rhel_template_isolinux.cfg 2011-12-31
20:51:20.000000000 +0200
@@ -0,0 +1,7 @@
+default redhat
+prompt 0
+timeout 1
+
+label redhat
+ kernel vmlinuz
+ append initrd=initrd.img ks=cdrom:/ks.cfg
diff -uNr 2//vbox/vbox-unattended/linux_rhel_template_ks.cfg
1//vbox/vbox-unattended/linux_rhel_template_ks.cfg
--- 2//vbox/vbox-unattended/linux_rhel_template_ks.cfg 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/linux_rhel_template_ks.cfg 2012-01-01
18:30:31.000000000 +0200
@@ -0,0 +1,46 @@
+lang en_US
+langsupport --default en_US
+network --bootproto dhcp
+cdrom
+keyboard us
+zerombr yes
+clearpart --all
+part / --size 3000 --grow
+part swap --recommended
+install
+mouse generic3ps/2
+firewall --enabled
+timezone --utc Europe/London
+xconfig --resolution=800x600
+rootpw $password
+reboot
+auth --useshadow --enablemd5
+bootloader --location=mbr
+key --skip
+%packages --resolvedeps
+kernel-source
+@ X Window System
+@ GNOME Desktop Environment
+@ Graphical Internet
+@ Development Tools
+
+# "post" step is done in Anaconda right after all packages are
installed, but before reboot.
+%post --log=/root/ks-post.log
+/usr/sbin/adduser $user
+/usr/sbin/usermod -p $userpassword_encrypted $user
+mkdir -p /mnt/cdrom
+sed -i 's/GRAPHICAL=yes/GRAPHICAL=no/' /etc/sysconfig/init
+cp /etc/rc.d/rc.local /etc/rc.local.backup
+
+# Generating "rc.local" file, which will act as first-boot script,
after reboot:
+cat >>/etc/rc.d/rc.local <<EOF
+echo
+echo "Installing VirtualBox Guest Additions..."
+mount -t iso9660 -o ro /dev/hdc /mnt/cdrom
+bash /mnt/cdrom/VBoxLinuxAdditions.run
+eject /dev/hdc
+usermod -a -G vboxsf $user
+sed -i 's/GRAPHICAL=no/GRAPHICAL=yes/' /etc/sysconfig/init
+mv /etc/rc.local.backup /etc/rc.d/rc.local
+init 5
+EOF
\ No newline at end of file
diff -uNr 2//vbox/vbox-unattended/linux_suse_template_autoinst.xml
1//vbox/vbox-unattended/linux_suse_template_autoinst.xml
--- 2//vbox/vbox-unattended/linux_suse_template_autoinst.xml 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/linux_suse_template_autoinst.xml 2012-01-10
06:18:06.000000000 +0200
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE profile>
+<profile xmlns="http://www.suse.com/1.0/yast2ns"
xmlns:config="http://www.suse.com/1.0/configns">
+ <general>
+ <mode>
+ <confirm config:type="boolean">false</confirm>
+ </mode>
+ </general>
+
+ <partitioning config:type="list">
+ <drive>
+ <use>all</use>
+ </drive>
+ </partitioning>
+
+ <software>
+ <!-- Those are necessray for Guest Additions -->
+ <packages config:type="list">
+ <package>gcc</package>
+ <package>automake</package>
+ <package>kernel-source</package>
+ <!-- 'smpppd' is required on openSUSE 11.4 -->
+ <package>smpppd</package>
+ </packages>
+
+ <patterns config:type="list">
+ <pattern>apparmor</pattern>
+ <pattern>apparmor_opt</pattern>
+ <pattern>base</pattern>
+ <pattern>kde</pattern>
+ <!--pattern>Basis-Devel</pattern-->
+ <!--pattern>devel_kernel</pattern-->
+ <pattern>default</pattern>
+ <pattern>sw_management</pattern>
+ <pattern>sw_management_kde4</pattern>
+ <pattern>yast2_install_wf</pattern>
+ </patterns>
+ </software>
+
+ <configure>
+ <x11>
+ <display_manager>kdm</display_manager>
+ </x11>
+
+ <networking>
+ <interfaces config:type="list">
+ <interface>
+ <bootproto>dhcp</bootproto>
+ <device>eth0</device>
+ <startmode>auto</startmode>
+ <usercontrol>yes</usercontrol>
+ </interface>
+ </interfaces>
+ </networking>
+
+ <users config:type="list">
+ <user>
+ <fullname>root</fullname>
+ <username>root</username>
+ <encrypted config:type="boolean">false</encrypted>
+ <user_password>$password</user_password>
+ </user>
+ <user>
+ <groups>video,dialout,vboxsf</groups>
+ <fullname>$user</fullname>
+ <username>$user</username>
+ <encrypted config:type="boolean">false</encrypted>
+ <user_password>$password</user_password>
+ </user>
+ </users>
+ </configure>
+</profile>
\ No newline at end of file
diff -uNr 2//vbox/vbox-unattended/linux_suse_template_isolinux.cfg
1//vbox/vbox-unattended/linux_suse_template_isolinux.cfg
--- 2//vbox/vbox-unattended/linux_suse_template_isolinux.cfg 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/linux_suse_template_isolinux.cfg 2012-01-10
06:22:01.000000000 +0200
@@ -0,0 +1,7 @@
+default suse
+prompt 0
+timeout 1
+
+label suse
+ kernel linux
+ append initrd=initrd splash=silent instmode=cd
autoyast=device://cdrom1/autoinst.xml
diff -uNr 2//vbox/vbox-unattended/win_nt5_template_winnt.sif
1//vbox/vbox-unattended/win_nt5_template_winnt.sif
--- 2//vbox/vbox-unattended/win_nt5_template_winnt.sif 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/win_nt5_template_winnt.sif 2012-01-10
04:10:20.000000000 +0200
@@ -0,0 +1,44 @@
+[Data]
+AutoPartition = 1
+MsDosInitiated = 0
+UnattendedInstall = Yes
+
+[Unattended]
+UnattendMode = FullUnattended
+OemSkipEula = Yes
+OemPreinstall = No
+TargetPath = \WINDOWS
+Repartition = Yes
+UnattendSwitch = Yes
+DriverSigningPolicy = Ignore
+WaitForReboot = No
+
+[GuiUnattended]
+AdminPassword = "$password"
+AutoLogon = Yes
+AutoLogonCount = 1
+OEMSkipRegional = 1
+OemSkipWelcome = 1
+TimeZone = 85
+ServerWelcome = No
+
+[UserData]
+ProductKey = "$ProductKey"
+FullName = "$user"
+OrgName = ""
+ComputerName = *
+
+[Identification]
+JoinWorkgroup = WORKGROUP
+
+[Networking]
+InstallDefaultComponents = Yes
+
+[Display]
+XResolution = 800
+YResolution = 600
+BitsPerPel = 32
+
+[GuiRunOnce]
+Command0="E:\VBoxWindowsAdditions.exe /S /xres=800 /yres=600 /depth=32"
+Command1="shutdown -r -t 0"
diff -uNr 2//vbox/vbox-unattended/win_nt6_template_autounattend.xml
1//vbox/vbox-unattended/win_nt6_template_autounattend.xml
--- 2//vbox/vbox-unattended/win_nt6_template_autounattend.xml 1970-01-01
02:00:00.000000000 +0200
+++ 1//vbox/vbox-unattended/win_nt6_template_autounattend.xml 2012-01-10
04:04:09.000000000 +0200
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<unattend xmlns="urn:schemas-microsoft-com:unattend"
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
+
+ <settings pass="windowsPE">
+ <component name="Microsoft-Windows-International-Core-WinPE"
processorArchitecture="$arch" publicKeyToken="31bf3856ad364e35"
language="neutral" versionScope="nonSxS">
+ <InputLocale>en-US</InputLocale>
+ <SystemLocale>en-US</SystemLocale>
+ <UILanguage>en-US</UILanguage>
+ <UserLocale>en-US</UserLocale>
+ </component>
+
+ <component name="Microsoft-Windows-Setup"
processorArchitecture="$arch" publicKeyToken="31bf3856ad364e35"
language="neutral" versionScope="nonSxS">
+
+ <DiskConfiguration>
+ <WillShowUI>OnError</WillShowUI>
+ <Disk>
+ <DiskID>0</DiskID>
+ <WillWipeDisk>true</WillWipeDisk>
+ <CreatePartitions>
+ <CreatePartition>
+ <Order>1</Order>
+ <Type>Primary</Type>
+ <Extend>true</Extend>
+ </CreatePartition>
+ </CreatePartitions>
+ </Disk>
+ </DiskConfiguration>
+
+ <UserData>
+ <ProductKey>
+ <Key>$ProductKey</Key>
+ <WillShowUI>OnError</WillShowUI>
+ </ProductKey>
+ <AcceptEula>true</AcceptEula>
+ </UserData>
+
+ <ImageInstall>
+ <OSImage>
+ <InstallTo>
+ <DiskID>0</DiskID>
+ <PartitionID>1</PartitionID>
+ </InstallTo>
+ <WillShowUI>OnError</WillShowUI>
+ <InstallToAvailablePartition>false</InstallToAvailablePartition>
+ </OSImage>
+ </ImageInstall>
+
+ <ComplianceCheck>
+ <DisplayReport>OnError</DisplayReport>
+ </ComplianceCheck>
+ </component>
+ </settings>
+
+ <settings pass="oobeSystem">
+ <component name="Microsoft-Windows-Shell-Setup"
processorArchitecture="$arch" publicKeyToken="31bf3856ad364e35"
language="neutral" versionScope="nonSxS">
+ <AutoLogon>
+ <Password>
+ <Value>$password</Value>
+ <PlainText>true</PlainText>
+ </Password>
+ <Enabled>true</Enabled>
+ <Username>$user</Username>
+ </AutoLogon>
+
+ <UserAccounts>
+ <LocalAccounts>
+ <LocalAccount wcm:action="add">
+ <Name>$user</Name>
+ <Group>administrators;users</Group>
+ <Password>
+ <Value>$password</Value>
+ <PlainText>true</PlainText>
+ </Password>
+ </LocalAccount>
+ </LocalAccounts>
+ </UserAccounts>
+
+ <VisualEffects>
+ <FontSmoothing>ClearType</FontSmoothing>
+ </VisualEffects>
+
+ <OOBE>
+ <ProtectYourPC>3</ProtectYourPC>
+ <HideEULAPage>true</HideEULAPage>
+ <SkipUserOOBE>true</SkipUserOOBE>
+ <SkipMachineOOBE>true</SkipMachineOOBE>
+ <NetworkLocation>Home</NetworkLocation>
+ </OOBE>
+
+ <FirstLogonCommands>
+ <SynchronousCommand wcm:action="add">
+ <Order>1</Order>
+ <Description>Turn Off Network Selection pop-up</Description>
+ <CommandLine>cmd /c reg add
"HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff"</CommandLine>
+ </SynchronousCommand>
+ <SynchronousCommand wcm:action="add">
+ <Order>2</Order>
+ <Description>Install VirtualBox Guest Additions</Description>
+ <CommandLine>E:\VBoxWindowsAdditions.exe</CommandLine>
+ </SynchronousCommand>
+ </FirstLogonCommands>
+
+ <TimeZone>GMT Standard Time</TimeZone>
+ </component>
+
+ </settings>
+
+</unattend>
--
-Alexey Eromenko "Technologov"
More information about the vbox-dev
mailing list