On Mon, Nov 03, 2014 at 09:19:44PM +0100, Pino Toscano wrote:
If a script does not finish, hangs, etc, it would be executed again
at
the next boot, since the injected firstboot.sh helper removes it only
after it finished.
Before executing a script, move it to another internal subdirectory
(scripts-done) and execute it from there, so it is not run again by
firstboot.sh. The downside is that now scripts are executed only once
at all, so if a script fails it will not be attempted at the next boot.
Also, remove all the files found in scripts-done, as they have been run
(or at least attempted) in a previous boot.
This fixes RHBZ#1159651.
---
customize/firstboot.ml | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/customize/firstboot.ml b/customize/firstboot.ml
index 67b9479..89821f3 100644
--- a/customize/firstboot.ml
+++ b/customize/firstboot.ml
@@ -47,6 +47,7 @@ module Linux = struct
### END INIT INFO
d=%s/scripts
+d_done=%s/scripts-done
logfile=~root/virt-sysprep-firstboot.log
echo \"$0\" \"$@\" 2>&1 | tee $logfile
@@ -54,16 +55,20 @@ echo \"Scripts dir: $d\" 2>&1 | tee $logfile
if test \"$1\" = \"start\"
then
+ mkdir -p $d_done
for f in $d/* ; do
if test -x \"$f\"
then
+ # move the script to the 'scripts-done' directory, so it is not
+ # executed again at the next boot
+ mv $f $d_done
echo '=== Running' $f '===' 2>&1 | tee $logfile
- $f 2>&1 | tee $logfile
- rm -f $f
+ $d_done/$(basename $f) 2>&1 | tee $logfile
fi
done
+ rm -f $d_done/*
fi
-" firstboot_dir
+" firstboot_dir firstboot_dir
let firstboot_service = sprintf "\
[Unit]
--
1.9.3
This looks like a better approach to me, so ACK.
Thanks,
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v