diff --git a/sysprep/main.ml b/sysprep/main.ml index 4c3f9700a..fbe0dbc47 100644 --- a/sysprep/main.ml +++ b/sysprep/main.ml @@ -207,9 +207,10 @@ let () = with Guestfs.Error msg -> eprintf (f_"%s (ignored)\n") msg ) mps; - (* Perform the operations. *) + (* Perform the filesystem operations. *) let flags = - Sysprep_operation.perform_operations ?operations ~quiet g root in + Sysprep_operation.perform_operations_on_filesystems + ?operations ~quiet g root in (* Parse flags. *) let relabel = ref false in @@ -234,7 +235,15 @@ let () = ); (* Unmount everything in this guest. *) - g#umount_all () + g#umount_all (); + + (* Perform the block device operations. *) + let flags = + Sysprep_operation.perform_operations_on_devices + ?operations ~quiet g root in + + (* At present we don't support any flags from perform_on_devices. *) + assert (flags = []) ) roots (* Finished. *) diff --git a/sysprep/sysprep_operation.ml b/sysprep/sysprep_operation.ml index e22d3a2be..24b868c55 100644 --- a/sysprep/sysprep_operation.ml +++ b/sysprep/sysprep_operation.ml @@ -24,13 +24,16 @@ open Sysprep_gettext.Gettext type flag = [ `Created_files ] +type callback = Guestfs.guestfs -> string -> flag list + type operation = { name : string; enabled_by_default : bool; heading : string; pod_description : string option; extra_args : ((Arg.key * Arg.spec * Arg.doc) * string) list; - perform : Guestfs.guestfs -> string -> flag list; + perform_on_filesystems : callback option; + perform_on_devices : callback option; } let all_operations = ref [] @@ -189,7 +192,7 @@ let list_operations () = op.heading ) !all_operations -let perform_operations ?operations ?(quiet = false) g root = +let perform_operations_on_filesystems ?operations ?(quiet = false) g root = assert !baked; let ops = @@ -200,10 +203,33 @@ let perform_operations ?operations ?(quiet = false) g root = let flags = List.map ( - fun op -> + function + | { name = name; perform_on_filesystems = Some fn } -> if not quiet then - printf "Performing %S ...\n%!" op.name; - op.perform g root + printf "Performing %S ...\n%!" name; + fn g root + | { perform_on_filesystems = None } -> [] + ) ops in + + List.flatten flags + +let perform_operations_on_devices ?operations ?(quiet = false) g root = + assert !baked; + + let ops = + match operations with + | None -> !enabled_by_default_operations + | Some opset -> (* just the operation names listed *) + OperationSet.elements opset in + + let flags = + List.map ( + function + | { name = name; perform_on_devices = Some fn } -> + if not quiet then + printf "Performing %S ...\n%!" name; + fn g root + | { perform_on_devices = None } -> [] ) ops in List.flatten flags diff --git a/sysprep/sysprep_operation.mli b/sysprep/sysprep_operation.mli index ab7da9339..87a0b9a82 100644 --- a/sysprep/sysprep_operation.mli +++ b/sysprep/sysprep_operation.mli @@ -20,6 +20,8 @@ type flag = [ `Created_files ] +type callback = Guestfs.guestfs -> string -> flag list + type operation = { name : string; (** Operation name, also used to enable the operation on the command @@ -46,7 +48,7 @@ type operation = { You can decide the types of the arguments, whether they are mandatory etc. *) - perform : Guestfs.guestfs -> string -> flag list; + perform_on_filesystems : callback option; (** The function which is called to perform this operation, when enabled. @@ -66,6 +68,11 @@ type operation = { On error the function should raise an exception. The function also needs to be careful to {i suppress} exceptions for things which are not errors, eg. deleting non-existent files. *) + + perform_on_devices : callback option; + (** This is the same as {!perform_on_filesystems} except that + the guest filesystem(s) are {i not} mounted. This allows the + operation to work directly on block devices, LVs etc. *) } val register_operation : operation -> unit @@ -102,5 +109,8 @@ val add_to_set : string -> set -> set Note that this will raise [Not_found] if [name] is not a valid operation name. *) -val perform_operations : ?operations:set -> ?quiet:bool -> Guestfs.guestfs -> string -> flag list +val perform_operations_on_filesystems : ?operations:set -> ?quiet:bool -> Guestfs.guestfs -> string -> flag list +(** Perform all operations, or the subset listed in the [operations] set. *) + +val perform_operations_on_devices : ?operations:set -> ?quiet:bool -> Guestfs.guestfs -> string -> flag list (** Perform all operations, or the subset listed in the [operations] set. *) diff --git a/sysprep/sysprep_operation_abrt_data.ml b/sysprep/sysprep_operation_abrt_data.ml index 7511ff6d0..46a8ef671 100644 --- a/sysprep/sysprep_operation_abrt_data.ml +++ b/sysprep/sysprep_operation_abrt_data.ml @@ -40,7 +40,8 @@ let abrt_data_op = { Remove the automatically generated ABRT crash data in C."); extra_args = []; - perform = abrt_data_perform; + perform_on_filesystems = Some abrt_data_perform; + perform_on_devices = None; } let () = register_operation abrt_data_op diff --git a/sysprep/sysprep_operation_bash_history.ml b/sysprep/sysprep_operation_bash_history.ml index 56fd9f3ba..fd452bc70 100644 --- a/sysprep/sysprep_operation_bash_history.ml +++ b/sysprep/sysprep_operation_bash_history.ml @@ -41,7 +41,8 @@ let bash_history_op = { Remove the bash history of user \"root\" and any other users who have a C<.bash_history> file in their home directory."); extra_args = []; - perform = bash_history_perform; + perform_on_filesystems = Some bash_history_perform; + perform_on_devices = None; } let () = register_operation bash_history_op diff --git a/sysprep/sysprep_operation_blkid_tab.ml b/sysprep/sysprep_operation_blkid_tab.ml index 30bd9a74e..02d693387 100644 --- a/sysprep/sysprep_operation_blkid_tab.ml +++ b/sysprep/sysprep_operation_blkid_tab.ml @@ -49,7 +49,8 @@ let blkid_tab_op = { heading = s_"Remove blkid tab in the guest"; pod_description = None; extra_args = []; - perform = blkid_tab_perform; + perform_on_filesystems = Some blkid_tab_perform; + perform_on_devices = None; } let () = register_operation blkid_tab_op diff --git a/sysprep/sysprep_operation_ca_certificates.ml b/sysprep/sysprep_operation_ca_certificates.ml index f603a1fe5..8bad76a8f 100644 --- a/sysprep/sysprep_operation_ca_certificates.ml +++ b/sysprep/sysprep_operation_ca_certificates.ml @@ -53,7 +53,8 @@ let ca_certificates_op = { heading = s_"Remove CA certificates in the guest"; pod_description = None; extra_args = []; - perform = ca_certificates_perform; + perform_on_filesystems = Some ca_certificates_perform; + perform_on_devices = None; } let () = register_operation ca_certificates_op diff --git a/sysprep/sysprep_operation_cron_spool.ml b/sysprep/sysprep_operation_cron_spool.ml index 20f1b2054..5284660af 100644 --- a/sysprep/sysprep_operation_cron_spool.ml +++ b/sysprep/sysprep_operation_cron_spool.ml @@ -31,7 +31,8 @@ let cron_spool_op = { heading = s_"Remove user at-jobs and cron-jobs"; pod_description = None; extra_args = []; - perform = cron_spool_perform; + perform_on_filesystems = Some cron_spool_perform; + perform_on_devices = None; } let () = register_operation cron_spool_op diff --git a/sysprep/sysprep_operation_dhcp_client_state.ml b/sysprep/sysprep_operation_dhcp_client_state.ml index 585424cdd..5a385ef0e 100644 --- a/sysprep/sysprep_operation_dhcp_client_state.ml +++ b/sysprep/sysprep_operation_dhcp_client_state.ml @@ -36,7 +36,8 @@ let dhcp_client_state_op = { heading = s_"Remove DHCP client leases"; pod_description = None; extra_args = []; - perform = dhcp_client_state_perform; + perform_on_filesystems = Some dhcp_client_state_perform; + perform_on_devices = None; } let () = register_operation dhcp_client_state_op diff --git a/sysprep/sysprep_operation_dhcp_server_state.ml b/sysprep/sysprep_operation_dhcp_server_state.ml index 7629dee37..cfc9ac121 100644 --- a/sysprep/sysprep_operation_dhcp_server_state.ml +++ b/sysprep/sysprep_operation_dhcp_server_state.ml @@ -31,7 +31,8 @@ let dhcp_server_state_op = { heading = s_"Remove DHCP server leases"; pod_description = None; extra_args = []; - perform = dhcp_server_state_perform; + perform_on_filesystems = Some dhcp_server_state_perform; + perform_on_devices = None; } let () = register_operation dhcp_server_state_op diff --git a/sysprep/sysprep_operation_dovecot_data.ml b/sysprep/sysprep_operation_dovecot_data.ml index 14cbe8d90..951e51f88 100644 --- a/sysprep/sysprep_operation_dovecot_data.ml +++ b/sysprep/sysprep_operation_dovecot_data.ml @@ -38,7 +38,8 @@ let dovecot_data_op = { heading = s_"Remove Dovecot (mail server) data"; pod_description = None; extra_args = []; - perform = dovecot_data_perform; + perform_on_filesystems = Some dovecot_data_perform; + perform_on_devices = None; } let () = register_operation dovecot_data_op diff --git a/sysprep/sysprep_operation_flag_reconfiguration.ml b/sysprep/sysprep_operation_flag_reconfiguration.ml index 0efee02ed..80dd4ae1e 100644 --- a/sysprep/sysprep_operation_flag_reconfiguration.ml +++ b/sysprep/sysprep_operation_flag_reconfiguration.ml @@ -37,7 +37,8 @@ let flag_reconfiguration_op = { Note that this may require user intervention when the guest is booted."); extra_args = []; - perform = flag_reconfiguration; + perform_on_filesystems = Some flag_reconfiguration; + perform_on_devices = None; } let () = register_operation flag_reconfiguration_op; diff --git a/sysprep/sysprep_operation_hostname.ml b/sysprep/sysprep_operation_hostname.ml index f832a18a6..3fc8800b3 100644 --- a/sysprep/sysprep_operation_hostname.ml +++ b/sysprep/sysprep_operation_hostname.ml @@ -66,7 +66,8 @@ to C."); s_"\ Change the hostname. If not given, defaults to C." ]; - perform = hostname_perform; + perform_on_filesystems = Some hostname_perform; + perform_on_devices = None; } let () = register_operation hostname_op diff --git a/sysprep/sysprep_operation_kerberos_data.ml b/sysprep/sysprep_operation_kerberos_data.ml index 911b9e9ab..b21b3e901 100644 --- a/sysprep/sysprep_operation_kerberos_data.ml +++ b/sysprep/sysprep_operation_kerberos_data.ml @@ -46,7 +46,8 @@ let kerberos_data_op = { heading = s_"Remove Kerberos data in the guest"; pod_description = None; extra_args = []; - perform = kerberos_data_perform; + perform_on_filesystems = Some kerberos_data_perform; + perform_on_devices = None; } let () = register_operation kerberos_data_op diff --git a/sysprep/sysprep_operation_logfiles.ml b/sysprep/sysprep_operation_logfiles.ml index aa3c986c4..333c317e9 100644 --- a/sysprep/sysprep_operation_logfiles.ml +++ b/sysprep/sysprep_operation_logfiles.ml @@ -89,7 +89,8 @@ On Linux the following files are removed: %s") globs_as_pod); extra_args = []; - perform = logfiles_perform; + perform_on_filesystems = Some logfiles_perform; + perform_on_devices = None; } let () = register_operation logfiles_op diff --git a/sysprep/sysprep_operation_machine_id.ml b/sysprep/sysprep_operation_machine_id.ml index 7e998cf58..599c4835b 100644 --- a/sysprep/sysprep_operation_machine_id.ml +++ b/sysprep/sysprep_operation_machine_id.ml @@ -41,7 +41,8 @@ installation and stays constant for all subsequent boots. Optionally, for stateless systems it is generated during runtime at boot if it is found to be empty."); extra_args = []; - perform = machine_id_perform; + perform_on_filesystems = Some machine_id_perform; + perform_on_devices = None; } let () = register_operation machine_id_op diff --git a/sysprep/sysprep_operation_mail_spool.ml b/sysprep/sysprep_operation_mail_spool.ml index 11dd292c2..831059441 100644 --- a/sysprep/sysprep_operation_mail_spool.ml +++ b/sysprep/sysprep_operation_mail_spool.ml @@ -36,7 +36,8 @@ let mail_spool_op = { heading = s_"Remove email from the local mail spool directory"; pod_description = None; extra_args = []; - perform = mail_spool_perform; + perform_on_filesystems = Some mail_spool_perform; + perform_on_devices = None; } let () = register_operation mail_spool_op diff --git a/sysprep/sysprep_operation_net_hwaddr.ml b/sysprep/sysprep_operation_net_hwaddr.ml index 527701746..8d6ec5552 100644 --- a/sysprep/sysprep_operation_net_hwaddr.ml +++ b/sysprep/sysprep_operation_net_hwaddr.ml @@ -51,7 +51,8 @@ let net_hwaddr_op = { For Fedora and Red Hat Enterprise Linux, this is removed from C files."); extra_args = []; - perform = net_hwaddr_perform; + perform_on_filesystems = Some net_hwaddr_perform; + perform_on_devices = None; } let () = register_operation net_hwaddr_op diff --git a/sysprep/sysprep_operation_package_manager_cache.ml b/sysprep/sysprep_operation_package_manager_cache.ml index 957b10d27..f529769c5 100644 --- a/sysprep/sysprep_operation_package_manager_cache.ml +++ b/sysprep/sysprep_operation_package_manager_cache.ml @@ -40,7 +40,8 @@ let package_manager_cache_op = { heading = s_"Remove package manager cache"; pod_description = None; extra_args = []; - perform = package_manager_cache_perform; + perform_on_filesystems = Some package_manager_cache_perform; + perform_on_devices = None; } let () = register_operation package_manager_cache_op diff --git a/sysprep/sysprep_operation_pam_data.ml b/sysprep/sysprep_operation_pam_data.ml index dfcaf2db9..540568e9e 100644 --- a/sysprep/sysprep_operation_pam_data.ml +++ b/sysprep/sysprep_operation_pam_data.ml @@ -46,7 +46,8 @@ let pam_data_op = { heading = s_"Remove the PAM data in the guest"; pod_description = None; extra_args = []; - perform = pam_data_perform; + perform_on_filesystems = Some pam_data_perform; + perform_on_devices = None; } let () = register_operation pam_data_op diff --git a/sysprep/sysprep_operation_puppet_data_log.ml b/sysprep/sysprep_operation_puppet_data_log.ml index 8340a6d05..37b3e14c0 100644 --- a/sysprep/sysprep_operation_puppet_data_log.ml +++ b/sysprep/sysprep_operation_puppet_data_log.ml @@ -46,7 +46,8 @@ let puppet_data_log_op = { heading = s_"Remove the data and log files of puppet"; pod_description = None; extra_args = []; - perform = puppet_data_log_perform; + perform_on_filesystems = Some puppet_data_log_perform; + perform_on_devices = None; } let () = register_operation puppet_data_log_op diff --git a/sysprep/sysprep_operation_random_seed.ml b/sysprep/sysprep_operation_random_seed.ml index 5fbe9a414..f124c02b1 100644 --- a/sysprep/sysprep_operation_random_seed.ml +++ b/sysprep/sysprep_operation_random_seed.ml @@ -54,7 +54,8 @@ guest. See L below."); extra_args = []; - perform = random_seed_perform; + perform_on_filesystems = Some random_seed_perform; + perform_on_devices = None; } let () = register_operation random_seed_op diff --git a/sysprep/sysprep_operation_rhn_systemid.ml b/sysprep/sysprep_operation_rhn_systemid.ml index c86de7a30..f5dca2ae7 100644 --- a/sysprep/sysprep_operation_rhn_systemid.ml +++ b/sysprep/sysprep_operation_rhn_systemid.ml @@ -37,7 +37,8 @@ let rhn_systemid_op = { heading = s_"Remove the RHN system ID"; pod_description = None; extra_args = []; - perform = rhn_systemid_perform; + perform_on_filesystems = Some rhn_systemid_perform; + perform_on_devices = None; } let () = register_operation rhn_systemid_op diff --git a/sysprep/sysprep_operation_samba_db_log.ml b/sysprep/sysprep_operation_samba_db_log.ml index 6bd67998d..23b9d24ca 100644 --- a/sysprep/sysprep_operation_samba_db_log.ml +++ b/sysprep/sysprep_operation_samba_db_log.ml @@ -47,7 +47,8 @@ let samba_db_log_op = { heading = s_"Remove the database and log files of Samba"; pod_description = None; extra_args = []; - perform = samba_db_log_perform; + perform_on_filesystems = Some samba_db_log_perform; + perform_on_devices = None; } let () = register_operation samba_db_log_op diff --git a/sysprep/sysprep_operation_script.ml b/sysprep/sysprep_operation_script.ml index 1f33c053a..9337701ff 100644 --- a/sysprep/sysprep_operation_script.ml +++ b/sysprep/sysprep_operation_script.ml @@ -155,7 +155,8 @@ current directory will be the guest's root directory. B If the script is not on the $PATH, then you must give the full absolute path to the script."; ]; - perform = script_perform; + perform_on_filesystems = Some script_perform; + perform_on_devices = None; } let () = register_operation script_op diff --git a/sysprep/sysprep_operation_smolt_uuid.ml b/sysprep/sysprep_operation_smolt_uuid.ml index 25f737252..52cef5cf7 100644 --- a/sysprep/sysprep_operation_smolt_uuid.ml +++ b/sysprep/sysprep_operation_smolt_uuid.ml @@ -41,7 +41,8 @@ let smolt_uuid_op = { heading = s_"Remove the Smolt hardware UUID"; pod_description = None; extra_args = []; - perform = smolt_uuid_perform; + perform_on_filesystems = Some smolt_uuid_perform; + perform_on_devices = None; } let () = register_operation smolt_uuid_op diff --git a/sysprep/sysprep_operation_ssh_hostkeys.ml b/sysprep/sysprep_operation_ssh_hostkeys.ml index 62ea32e9a..5e8fd9871 100644 --- a/sysprep/sysprep_operation_ssh_hostkeys.ml +++ b/sysprep/sysprep_operation_ssh_hostkeys.ml @@ -46,7 +46,8 @@ you a stark warning about the host key changing: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!"); extra_args = []; - perform = ssh_hostkeys_perform; + perform_on_filesystems = Some ssh_hostkeys_perform; + perform_on_devices = None; } let () = register_operation ssh_hostkeys_op diff --git a/sysprep/sysprep_operation_ssh_userdir.ml b/sysprep/sysprep_operation_ssh_userdir.ml index 3141c9e27..930b3a0c1 100644 --- a/sysprep/sysprep_operation_ssh_userdir.ml +++ b/sysprep/sysprep_operation_ssh_userdir.ml @@ -41,7 +41,8 @@ let ssh_userdir_op = { Remove the C<.ssh> directory of user \"root\" and any other users who have a C<.ssh> directory in their home directory."); extra_args = []; - perform = ssh_userdir_perform; + perform_on_filesystems = Some ssh_userdir_perform; + perform_on_devices = None; } let () = register_operation ssh_userdir_op diff --git a/sysprep/sysprep_operation_sssd_db_log.ml b/sysprep/sysprep_operation_sssd_db_log.ml index 8b1923a79..b6bf1a1dc 100644 --- a/sysprep/sysprep_operation_sssd_db_log.ml +++ b/sysprep/sysprep_operation_sssd_db_log.ml @@ -45,7 +45,8 @@ let sssd_db_log_op = { heading = s_"Remove the database and log files of sssd"; pod_description = None; extra_args = []; - perform = sssd_db_log_perform; + perform_on_filesystems = Some sssd_db_log_perform; + perform_on_devices = None; } let () = register_operation sssd_db_log_op diff --git a/sysprep/sysprep_operation_udev_persistent_net.ml b/sysprep/sysprep_operation_udev_persistent_net.ml index 6de2589e4..6fd7d9e30 100644 --- a/sysprep/sysprep_operation_udev_persistent_net.ml +++ b/sysprep/sysprep_operation_udev_persistent_net.ml @@ -43,7 +43,8 @@ old MAC address occupies the old name (eg. eth0), this means the fresh MAC address is assigned to a new name (eg. eth1) and this is usually undesirable. Erasing the udev persistent net rules avoids this."); extra_args = []; - perform = udev_persistent_net_perform; + perform_on_filesystems = Some udev_persistent_net_perform; + perform_on_devices = None; } let () = register_operation udev_persistent_net_op diff --git a/sysprep/sysprep_operation_user_account.ml b/sysprep/sysprep_operation_user_account.ml index 02201eb32..370f58f43 100644 --- a/sysprep/sysprep_operation_user_account.ml +++ b/sysprep/sysprep_operation_user_account.ml @@ -66,7 +66,8 @@ let user_account_op = { Remove all the user accounts and their home directories. The \"root\" account is not removed."); extra_args = []; - perform = user_account_perform; + perform_on_filesystems = Some user_account_perform; + perform_on_devices = None; } let () = register_operation user_account_op diff --git a/sysprep/sysprep_operation_utmp.ml b/sysprep/sysprep_operation_utmp.ml index c4a548d53..8dfcafc25 100644 --- a/sysprep/sysprep_operation_utmp.ml +++ b/sysprep/sysprep_operation_utmp.ml @@ -38,7 +38,8 @@ This file records who is currently logged in on a machine. In modern Linux distros it is stored in a ramdisk and hence not part of the virtual machine's disk, but it was stored on disk in older distros."); extra_args = []; - perform = utmp_perform; + perform_on_filesystems = Some utmp_perform; + perform_on_devices = None; } let () = register_operation utmp_op diff --git a/sysprep/sysprep_operation_yum_uuid.ml b/sysprep/sysprep_operation_yum_uuid.ml index ec69ca50d..df94f151b 100644 --- a/sysprep/sysprep_operation_yum_uuid.ml +++ b/sysprep/sysprep_operation_yum_uuid.ml @@ -37,7 +37,8 @@ let yum_uuid_op = { Yum creates a fresh UUID the next time it runs when it notices that the original UUID has been erased."); extra_args = []; - perform = yum_uuid_perform; + perform_on_filesystems = Some yum_uuid_perform; + perform_on_devices = None; } let () = register_operation yum_uuid_op