From 883418f9a3e98eefaba4e9958f1b446270c034cf Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Mon, 22 Jul 2013 13:28:28 +0100 Subject: [PATCH] sysprep: Add new fs-uuids operation. This creates new random UUIDs for all filesystems in a guest. Cherry picked from commit 8965368eb89532ac1613fffb0a3a661f005bae81 and modified for virt-sysprep in libguestfs 1.22. --- po/POTFILES-ml | 1 + resize/common_utils.ml | 23 ++++++++++++++ sysprep/Makefile.am | 1 + sysprep/sysprep_operation_fs_uuids.ml | 56 +++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 sysprep/sysprep_operation_fs_uuids.ml diff --git a/po/POTFILES-ml b/po/POTFILES-ml index ba64fa3..6ea4ee2 100644 --- a/po/POTFILES-ml +++ b/po/POTFILES-ml @@ -20,6 +20,7 @@ sysprep/sysprep_operation_dhcp_server_state.ml sysprep/sysprep_operation_dovecot_data.ml sysprep/sysprep_operation_firstboot.ml sysprep/sysprep_operation_flag_reconfiguration.ml +sysprep/sysprep_operation_fs_uuids.ml sysprep/sysprep_operation_hostname.ml sysprep/sysprep_operation_kerberos_data.ml sysprep/sysprep_operation_logfiles.ml diff --git a/resize/common_utils.ml b/resize/common_utils.ml index 0f71810..37da8df 100644 --- a/resize/common_utils.ml +++ b/resize/common_utils.ml @@ -252,3 +252,26 @@ let display_long_options () = printf "%s\n" arg ) !long_options; exit 0 + +let uuidgen () = + let cmd = "uuidgen -r" in + let chan = Unix.open_process_in cmd in + let uuid = input_line chan in + let stat = Unix.close_process_in chan in + (match stat with + | Unix.WEXITED 0 -> () + | Unix.WEXITED i -> + error (f_"external command '%s' exited with error %d") cmd i + | Unix.WSIGNALED i -> + error (f_"external command '%s' killed by signal %d") cmd i + | Unix.WSTOPPED i -> + error (f_"external command '%s' stopped by signal %d") cmd i + ); + let len = String.length uuid in + let uuid, len = + if len > 0 && uuid.[len-1] = '\n' then + String.sub uuid 0 (len-1), len-1 + else + uuid, len in + if len < 10 then assert false; (* sanity check on uuidgen *) + uuid diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am index 6bc5873..3060587 100644 --- a/sysprep/Makefile.am +++ b/sysprep/Makefile.am @@ -41,6 +41,7 @@ operations = \ dovecot_data \ flag_reconfiguration \ firstboot \ + fs_uuids \ hostname \ kerberos_data \ lvm_uuids \ diff --git a/sysprep/sysprep_operation_fs_uuids.ml b/sysprep/sysprep_operation_fs_uuids.ml new file mode 100644 index 0000000..3c319f0 --- /dev/null +++ b/sysprep/sysprep_operation_fs_uuids.ml @@ -0,0 +1,56 @@ +(* virt-sysprep + * Copyright (C) 2013 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + +open Printf + +open Sysprep_operation +open Common_gettext.Gettext + +module G = Guestfs + +let rec fs_uuids_perform g root = + let fses = g#list_filesystems () in + List.iter (function + | _, "unknown" -> () + | _, "swap" -> + (* XXX Not implemented *) () + | dev, typ -> + let new_uuid = Common_utils.uuidgen () in + try + g#set_uuid dev new_uuid + with + G.Error msg -> + eprintf (f_"warning: cannot set random UUID on filesystem %s type %s: %s\n") + dev typ msg + ) fses; + [] + +let fs_uuids_op = { + name = "fs-uuids"; + enabled_by_default = true; + heading = s_"Change filesystem UUIDs"; + pod_description = Some (s_"\ +On guests and filesystem types where this is supported, +new random UUIDs are generated and assigned to filesystems."); + pod_notes = None; + extra_args = []; + perform_on_filesystems = None; + perform_on_devices = Some fs_uuids_perform; +} + +let () = register_operation fs_uuids_op -- 1.8.3.1