Based on boxes install script for windows. As older windows have more than one script for installation (http://bugzilla-attachments.gnome.org/attachment.cgi?id=214681) I'm changing, too, osinfo-install-script tool to generate multiple files when needed. So, in older windows installations (2k3r2 and older), the output files are: windows.sif, windows.reg and windows.cmd. Just to remember. Don't allow the user to choose the output file is a decision to simplify our live, because we need to know the name of .cmd (used in .sif) and the .reg (used in .cmd) to generate them correctly. --- data/install-scripts/Makefile.am | 2 ++ data/install-scripts/windows-cmd.xml | 22 ++++++++++++ data/install-scripts/windows-reg.xml | 23 ++++++++++++ data/install-scripts/windows-sif.xml | 66 +++++++++++++++++++++++++++++++++- data/oses/windows.xml | 20 ++++++++--- tools/osinfo-install-script.c | 57 ++++++++++++++++++----------- 6 files changed, 164 insertions(+), 26 deletions(-) create mode 100644 data/install-scripts/windows-cmd.xml create mode 100644 data/install-scripts/windows-reg.xml diff --git a/data/install-scripts/Makefile.am b/data/install-scripts/Makefile.am index 002a884..cb24e09 100644 --- a/data/install-scripts/Makefile.am +++ b/data/install-scripts/Makefile.am @@ -3,6 +3,8 @@ databasedir = $(pkgdatadir)/db/install-scripts/ database_DATA = \ fedora.xml \ windows-sif.xml \ + windows-cmd.xml \ + windows-reg.xml \ windows-unattend.xml \ $(NULL) diff --git a/data/install-scripts/windows-cmd.xml b/data/install-scripts/windows-cmd.xml new file mode 100644 index 0000000..ec09ca4 --- /dev/null +++ b/data/install-scripts/windows-cmd.xml @@ -0,0 +1,22 @@ +<libosinfo version="0.0.1"> + <install-script id='http://microsoft.com/windows/cmd/desktop'> + <profile>desktop</profile> + <template> + <xsl:stylesheet + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:template match="/install-script-config"> +Windows Registry Editor Version 5.00 + +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] +"DefaultUserName"="<xsl:value-of select="config/user-realname"/>" +"DefaultPassword"="<xsl:value-of select="config/admin-password"/>" +"AutoAdminLogon"="1" + </xsl:template> + </xsl:stylesheet> + </template> + </install-script> +</libosinfo> diff --git a/data/install-scripts/windows-reg.xml b/data/install-scripts/windows-reg.xml new file mode 100644 index 0000000..93375ce --- /dev/null +++ b/data/install-scripts/windows-reg.xml @@ -0,0 +1,23 @@ +<libosinfo version="0.0.1"> + <install-script id='http://microsoft.com/windows/reg/desktop'> + <profile>desktop</profile> + <template> + <xsl:stylesheet + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:template match="/install-script-config"> +sc config TlntSvr start= auto +net user <xsl:value-of select="config/user-realname"/> <xsl:value-of select="config/admin-password"/> /add /passwordreq:no +net localgroup administrators <xsl:value-of select="config/user-realname"/> /add +net accounts /maxpwage:unlimited +copy a:\<xsl:value-of select="config/user-realname"/>.bmp "c:\Documents and Settings\All Users\Application Data\Microsoft\User Account Pictures" +REGEDIT /S a:\windows.reg +EXIT + </xsl:template> + </xsl:stylesheet> + </template> + </install-script> +</libosinfo> diff --git a/data/install-scripts/windows-sif.xml b/data/install-scripts/windows-sif.xml index 29a0eae..152f8f6 100644 --- a/data/install-scripts/windows-sif.xml +++ b/data/install-scripts/windows-sif.xml @@ -1,5 +1,6 @@ <libosinfo version="0.0.1"> - <install-script id='http://microsoft.com/windows/sif'> + <!-- JEOS POROFILE --> + <install-script id='http://microsoft.com/windows/sif/jeos'> <profile>jeos</profile> <template> <xsl:stylesheet @@ -56,4 +57,67 @@ </xsl:stylesheet> </template> </install-script> + <!-- DESKTOP POROFILE --> + <install-script id='http://microsoft.com/windows/sif/desktop'> + <profile>desktop</profile> + <template> + <xsl:stylesheet + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:template match="/install-script-config"> +;SetupMgrTag +[Data] + AutoPartition=1 + MsDosInitiated=No + UnattendedInstall=Yes + +[Unattended] + UnattendMode=FullUnattended + OemSkipEula=Yes + OemPreinstall=No + TargetPath=\WINDOWS + Repartition=Yes + WaitForReboot=No + UnattendSwitch=Yes + +[GuiUnattended] + AdminPassword=<xsl:value-of select="config/admin-password"/> + EncryptedAdminPassword=NO + OEMSkipRegional=1 + TimeZone=35 + OemSkipWelcome=1 + +[UserData] + ProductKey=<xsl:value-of select="config/reg-productkey"/> + FullName="<xsl:value-of select="config/user-realname"/>" + OrgName="" + ComputerName=<xsl:value-of select="config/hostname"/> + +[LicenseFilePrintData] + AutoMode=PerServer + AutoUsers=5 + +[Identification] + JoinWorkgroup=WORKGROUP + +[Networking] + InstallDefaultComponents=Yes + +[SetupParams] + UserExecute = "a:\windows.cmd" + +[WindowsFirewall] + Profiles = WindowsFirewall.TurnOffFirewall + +[WindowsFirewall.TurnOffFirewall] + Mode = 0 + + </xsl:template> + </xsl:stylesheet> + </template> + </install-script> + </libosinfo> diff --git a/data/oses/windows.xml b/data/oses/windows.xml index 8769511..2fb18be 100644 --- a/data/oses/windows.xml +++ b/data/oses/windows.xml @@ -308,7 +308,10 @@ </resources> <installer> - <script id='http://microsoft.com/windows/sif'/> + <script id='http://microsoft.com/windows/sif/jeos'/> + <script id='http://microsoft.com/windows/sif/desktop'/> + <script id='http://microsoft.com/windows/reg/desktop'/> + <script id='http://microsoft.com/windows/cmd/desktop'/> </installer> </os> @@ -365,7 +368,10 @@ </resources> <installer> - <script id='http://microsoft.com/windows/sif'/> + <script id='http://microsoft.com/windows/sif/jeos'/> + <script id='http://microsoft.com/windows/sif/desktop'/> + <script id='http://microsoft.com/windows/reg/desktop'/> + <script id='http://microsoft.com/windows/cmd/desktop'/> </installer> </os> @@ -430,7 +436,10 @@ </resources> <installer> - <script id='http://microsoft.com/windows/sif'/> + <script id='http://microsoft.com/windows/sif/jeos'/> + <script id='http://microsoft.com/windows/sif/desktop'/> + <script id='http://microsoft.com/windows/reg/desktop'/> + <script id='http://microsoft.com/windows/cmd/desktop'/> </installer> </os> @@ -489,7 +498,10 @@ </resources> <installer> - <script id='http://microsoft.com/windows/sif'/> + <script id='http://microsoft.com/windows/sif/jeos'/> + <script id='http://microsoft.com/windows/sif/desktop'/> + <script id='http://microsoft.com/windows/reg/desktop'/> + <script id='http://microsoft.com/windows/cmd/desktop'/> </installer> </os> diff --git a/tools/osinfo-install-script.c b/tools/osinfo-install-script.c index 85151b8..c6ada2c 100644 --- a/tools/osinfo-install-script.c +++ b/tools/osinfo-install-script.c @@ -27,7 +27,7 @@ #include <string.h> static gchar *profile; -static gchar *output; +static GSList *outputScripts; static OsinfoInstallConfig *config; @@ -103,15 +103,18 @@ static void script_file_name_get(char *distro) { if (!(strcmp(distro, "win2k")) || !(strcmp(distro, "winxp")) || !(strcmp(distro, "win2k3")) || !(strcmp(distro, "win2k3r3"))) { - output = g_strdup("windows.sif"); + outputScripts = g_slist_append(outputScripts, g_strdup("windows.sif")); + outputScripts = g_slist_append(outputScripts, g_strdup("windows.reg")); + outputScripts = g_slist_append(outputScripts, g_strdup("windows.cmd")); } else if (!(strcmp(distro, "win2k8")) || !(strcmp(distro, "win2k8r2")) || !(strcmp(distro, "vista")) || !(strcmp(distro, "win7")) || !(strcmp(distro, "win8"))) { - output = g_strdup("windows.xml"); + outputScripts = g_slist_append(outputScripts, g_strdup("windows.xml")); } else { gsize len = sizeof(distro) + sizeof(".ks"); - output = g_malloc(len); + gchar *output = g_malloc(len); g_snprintf(output, len, "%s.ks", distro); + outputScripts = g_slist_append(outputScripts, output); } } @@ -120,9 +123,9 @@ static gboolean generate_script(OsinfoOs *os) OsinfoInstallScriptList *scripts = osinfo_os_get_install_script_list(os); OsinfoInstallScriptList *profileScripts; OsinfoFilter *filter; - OsinfoInstallScript *script; GError *error = NULL; gboolean ret = FALSE; + gint i; filter = osinfo_filter_new(); osinfo_filter_add_constraint(filter, @@ -132,29 +135,41 @@ static gboolean generate_script(OsinfoOs *os) profileScripts = osinfo_install_scriptlist_new_filtered(scripts, filter); - if (osinfo_list_get_length(OSINFO_LIST(profileScripts)) != 1) { + if (osinfo_list_get_length(OSINFO_LIST(profileScripts)) == 0) { g_printerr("Cannot find any install script for profile '%s'\n", profile ? profile : OSINFO_INSTALL_SCRIPT_PROFILE_JEOS); goto cleanup; } - script = OSINFO_INSTALL_SCRIPT( - osinfo_list_get_nth(OSINFO_LIST(profileScripts), 0)); - - if (!osinfo_install_script_generate(script, - os, - config, - output, - NULL, - &error)) { - g_printerr("Unable to generate install script: %s\n", - error ? error->message : "unknown"); - goto cleanup; + for (i = 0; i < osinfo_list_get_length(OSINFO_LIST(profileScripts)); i++) { + OsinfoInstallScript *script = OSINFO_INSTALL_SCRIPT( + osinfo_list_get_nth(OSINFO_LIST(profileScripts), i)); + gchar *filename = g_slist_nth_data(outputScripts, i); + + if (!osinfo_install_script_generate(script, + os, + config, + filename, + NULL, + &error)) { + g_printerr("Unable to generate install script: %s\n", + error ? error->message : "unknown"); + goto cleanup; + } } ret = TRUE; - g_print("Install script was generated successfully as: %s\n", output); + + if (g_slist_length(outputScripts) == 1) + g_print("Install script was generated successfully!\n" + "The generated file is:\n"); + else + g_print("Install scripts were generated successfully!\n" + "The generated files are:\n"); + + for (i = 0; i < g_slist_length(outputScripts); i++) + g_print("%s\n", (gchar *)g_slist_nth_data(outputScripts, i)); cleanup: g_object_unref(scripts); @@ -221,8 +236,8 @@ gint main(gint argc, gchar **argv) EXIT: if (config) g_object_unref(config); - if (output) - g_free(output); + if (outputScripts) + g_slist_free_full(outputScripts, g_free); g_clear_error(&error); g_clear_object(&loader); g_option_context_free(context); -- 1.7.10.2