[Libguestfs] [PATCH v2 1/2] firstboot: rename systemd and sysvinit
Richard W.M. Jones
rjones at redhat.com
Thu Aug 4 13:06:26 UTC 2016
On Thu, Aug 04, 2016 at 01:56:09PM +0200, Pino Toscano wrote:
> Currently we install a systemd service named firstboot.service and a
> SysV service named virt-sysprep-firstboot. On systems where systemd is
> the init system and runs with the SysV compatibility, the different
> names make systemd handle them as different services, and thus trying to
> run the firstboot script runner twice.
>
> Rename both the systemd service and the SysV one to guestfs-firstboot:
> the new name is less generic, and allows the systemd service to be
> shadowed by the SysV service (and thus running just once).
>
> Also cleanup the old services: the old SysV service can be removed
> directly, since its former name had "virt-sysprep" in it, and so there
> could not be much room for confusion and conflict. Regarding the old
> systemd service: to avoid leaving it behind, a simple cleanup strategy
> is in place, checking the content of the old firstboot.service to really
> ensure we are removing one of our versions of this file.
> ---
> customize/firstboot.ml | 74 ++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 54 insertions(+), 20 deletions(-)
>
> diff --git a/customize/firstboot.ml b/customize/firstboot.ml
> index f1e5807..52dfbbe 100644
> --- a/customize/firstboot.ml
> +++ b/customize/firstboot.ml
> @@ -82,7 +82,7 @@ fi
>
> let firstboot_service = sprintf "\
> [Unit]
> -Description=virt-sysprep firstboot service
> +Description=libguestfs firstboot service
> After=network.target
> Before=prefdm.service
>
> @@ -122,10 +122,27 @@ WantedBy=default.target
> *)
> let unitdir = "/usr/lib/systemd/system" in
> g#mkdir_p unitdir;
> - let unitfile = sprintf "%s/firstboot.service" unitdir in
> + let unitfile = sprintf "%s/guestfs-firstboot.service" unitdir in
> g#write unitfile firstboot_service;
> g#mkdir_p "/etc/systemd/system/default.target.wants";
> - g#ln_sf unitfile "/etc/systemd/system/default.target.wants"
> + g#ln_sf unitfile "/etc/systemd/system/default.target.wants";
> +
> + (* Try to remove the old firstboot.service files. *)
> + let oldunitfile = sprintf "%s/firstboot.service" unitdir in
> + if g#is_file oldunitfile then (
> + g#rm_f "/etc/systemd/system/default.target.wants/firstboot.service";
> + (* Remove the old firstboot.service only if it is one of our
> + * versions. *)
> + match g#checksum "md5" oldunitfile with
> + | "6923781f7a1851b40b32b4960eb9a0fc" (* < 1.23.24 *)
> + | "56fafd8c990fc9d24e5b8497f3582e8d" (* < 1.23.32 *)
> + | "a83767e01cf398e2fd7c8f59d65d320a" (* < 1.25.2 *)
> + | "39aeb10df29104797e3a9aca4db37a6e" ->
> + g#rm oldunitfile
> + | csum ->
> + warning (f_"firstboot: unknown version for old firstboot.service file %s (md5=%s), it will not be removed")
> + oldunitfile csum
> + )
>
> and install_sysvinit_service g = function
> | "fedora"|"rhel"|"centos"|"scientificlinux"|"redhat-based" ->
> @@ -142,11 +159,16 @@ WantedBy=default.target
> g#mkdir_p "/etc/rc.d/rc3.d";
> g#mkdir_p "/etc/rc.d/rc5.d";
> g#ln_sf (sprintf "%s/firstboot.sh" firstboot_dir)
> - "/etc/rc.d/rc2.d/S99virt-sysprep-firstboot";
> + "/etc/rc.d/rc2.d/S99guestfs-firstboot";
> g#ln_sf (sprintf "%s/firstboot.sh" firstboot_dir)
> - "/etc/rc.d/rc3.d/S99virt-sysprep-firstboot";
> + "/etc/rc.d/rc3.d/S99guestfs-firstboot";
> g#ln_sf (sprintf "%s/firstboot.sh" firstboot_dir)
> - "/etc/rc.d/rc5.d/S99virt-sysprep-firstboot"
> + "/etc/rc.d/rc5.d/S99guestfs-firstboot";
> +
> + (* Try to remove the files of the old service. *)
> + g#rm_f "/etc/rc.d/rc2.d/S99virt-sysprep-firstboot";
> + g#rm_f "/etc/rc.d/rc3.d/S99virt-sysprep-firstboot";
> + g#rm_f "/etc/rc.d/rc5.d/S99virt-sysprep-firstboot"
>
> (* Make firstboot.sh look like a runlevel script to avoid insserv warnings. *)
> and install_sysvinit_suse g =
> @@ -154,13 +176,19 @@ WantedBy=default.target
> g#mkdir_p "/etc/init.d/rc3.d";
> g#mkdir_p "/etc/init.d/rc5.d";
> g#ln_sf (sprintf "%s/firstboot.sh" firstboot_dir)
> - "/etc/init.d/virt-sysprep-firstboot";
> - g#ln_sf "../virt-sysprep-firstboot"
> - "/etc/init.d/rc2.d/S99virt-sysprep-firstboot";
> - g#ln_sf "../virt-sysprep-firstboot"
> - "/etc/init.d/rc3.d/S99virt-sysprep-firstboot";
> - g#ln_sf "../virt-sysprep-firstboot"
> - "/etc/init.d/rc5.d/S99virt-sysprep-firstboot"
> + "/etc/init.d/guestfs-firstboot";
> + g#ln_sf "../guestfs-firstboot"
> + "/etc/init.d/rc2.d/S99guestfs-firstboot";
> + g#ln_sf "../guestfs-firstboot"
> + "/etc/init.d/rc3.d/S99guestfs-firstboot";
> + g#ln_sf "../guestfs-firstboot"
> + "/etc/init.d/rc5.d/S99guestfs-firstboot";
> +
> + (* Try to remove the files of the old service. *)
> + g#rm_f "/etc/init.d/virt-sysprep-firstboot";
> + g#rm_f "/etc/init.d/rc2.d/S99virt-sysprep-firstboot";
> + g#rm_f "/etc/init.d/rc3.d/S99virt-sysprep-firstboot";
> + g#rm_f "/etc/init.d/rc5.d/S99virt-sysprep-firstboot"
>
> and install_sysvinit_debian g =
> g#mkdir_p "/etc/init.d";
> @@ -168,13 +196,19 @@ WantedBy=default.target
> g#mkdir_p "/etc/rc3.d";
> g#mkdir_p "/etc/rc5.d";
> g#ln_sf (sprintf "%s/firstboot.sh" firstboot_dir)
> - "/etc/init.d/virt-sysprep-firstboot";
> - g#ln_sf "/etc/init.d/virt-sysprep-firstboot"
> - "/etc/rc2.d/S99virt-sysprep-firstboot";
> - g#ln_sf "/etc/init.d/virt-sysprep-firstboot"
> - "/etc/rc3.d/S99virt-sysprep-firstboot";
> - g#ln_sf "/etc/init.d/virt-sysprep-firstboot"
> - "/etc/rc5.d/S99virt-sysprep-firstboot"
> + "/etc/init.d/guestfs-firstboot";
> + g#ln_sf "/etc/init.d/guestfs-firstboot"
> + "/etc/rc2.d/S99guestfs-firstboot";
> + g#ln_sf "/etc/init.d/guestfs-firstboot"
> + "/etc/rc3.d/S99guestfs-firstboot";
> + g#ln_sf "/etc/init.d/guestfs-firstboot"
> + "/etc/rc5.d/S99guestfs-firstboot";
> +
> + (* Try to remove the files of the old service. *)
> + g#rm_f "/etc/init.d/virt-sysprep-firstboot";
> + g#rm_f "/etc/rc2.d/S99virt-sysprep-firstboot";
> + g#rm_f "/etc/rc3.d/S99virt-sysprep-firstboot";
> + g#rm_f "/etc/rc5.d/S99virt-sysprep-firstboot"
> end
ACK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
More information about the Libguestfs
mailing list