Improved signal handling, removing result ISO if xorriso exits with error, redirected a few messages from stdout to stderr

This commit is contained in:
Thomas Schmitt 2022-06-18 17:14:11 +02:00
parent 34981b1278
commit 5897c706a4
2 changed files with 103 additions and 37 deletions

View File

@ -32,6 +32,8 @@ usage() {
echo "Exported non-empty variable MERGE_FOR_DIST enforces the use of a" >&2 echo "Exported non-empty variable MERGE_FOR_DIST enforces the use of a" >&2
echo "particular directory in /dists of iso1. Normally only one" >&2 echo "particular directory in /dists of iso1. Normally only one" >&2
echo "such directory is found and thus no need to set MERGE_FOR_DIST." >&2 echo "such directory is found and thus no need to set MERGE_FOR_DIST." >&2
echo "Exported non-empty variable MERGE_KEEP_ISO prevents the removal" >&2
echo "of result_iso after xorriso indicated failure of production." >&2
echo "Exported non-empty variable XORRISO overrides command xorriso." >&2 echo "Exported non-empty variable XORRISO overrides command xorriso." >&2
echo "This may be needed if installed xorriso is older than 1.4.2." >&2 echo "This may be needed if installed xorriso is older than 1.4.2." >&2
echo 'If XORRISO is set to "dummy" then no new ISO will emerge.' >&2 echo 'If XORRISO is set to "dummy" then no new ISO will emerge.' >&2
@ -82,39 +84,34 @@ check_single_word() {
MOUNT_LIST= MOUNT_LIST=
UMOUNT_LIST= UMOUNT_LIST=
RMDIR_LIST= RMDIR_LIST=
TEMPFILE_LIST="merged_dists merged_md5sum.txt merged_README.txt temp_file" TEMPFILE_LIST=
EMERGING_ISO=
finish_cleanup() { # Cleanup temporary files, mount points and made directories
if test -n "$1"
cleanup_ignore_counter=0
cleanup_ignore_handler() {
cleanup_ignore_counter=$(expr "$cleanup_ignore_counter" + 1)
if test "$cleanup_ignore_counter" -ge 4
then then
echo >&2 # Reset traps to default
if test "$1" -gt 0 trap - INT TERM QUIT
then echo "--- Ignored several INT, TERM, or QUIT signals during cleanup." >&2
echo "--- Merge run aborted !" >&2 echo "--- Will give in to next signal." >&2
else return 0
echo "Merge run ended with success indication." >&2
fi
exit "$1"
fi fi
echo "--- Ignored INT, TERM, or QUIT signal during cleanup." >&2
return 0 return 0
} }
# Cleanup temporary files, mount points and made directories cleanup() {
cleanup_ran=0
cleanup_and_end() { # Make sure to be in cleanup state of traps
# Remove trap trap cleanup_ignore_handler INT TERM QUIT
trap - INT TERM QUIT EXIT
if test "$cleanup_ran" = 1
then
finish_cleanup "$1"
return 0
fi
cleanup_ran=1
echo >&2 echo >&2
echo "Cleaning up temporary files and mount points ..." 2>&1 echo "Cleaning up temporary files and mount points ..." >&2
ret=0 ret=0
@ -153,6 +150,28 @@ cleanup_and_end() {
ret=1 ret=1
fi fi
done done
if test -n "$EMERGING_ISO" && test -e "$EMERGING_ISO"
then
if test -n "$MERGE_KEEP_ISO"
then
echo "Removal of incomplete result ISO suppressed by MERGE_KEEP_ISO." >&2
echo "Remaining: $EMERGING_ISO" >&2
else
echo "Removing incomplete result ISO." >&2
echo \
" (This can be suppressed by exporting non-empty variable MERGE_KEEP_ISO.)" \
>&2
if rm "$EMERGING_ISO"
then
dummy=dummy
else
echo "--- Note: Cannot remove incomplete result: $EMERGING_ISO" >&2
ret=1
fi
fi
fi
if test "$ret" = 0 if test "$ret" = 0
then then
echo "Cleanup completed." >&2 echo "Cleanup completed." >&2
@ -160,14 +179,49 @@ cleanup_and_end() {
echo "--- Cleanup could not be fully completed." >&2 echo "--- Cleanup could not be fully completed." >&2
fi fi
# Might exit # Do not come back via trap again
finish_cleanup "$1" trap - INT TERM QUIT
return $ret return $ret
} }
# Handler for INT TERM QUIT events if "$1" is empty
# Procedural program exit if "$1" is not empty
cleanup_and_end() {
# +++ No cleanup_and_end before TEMPFILE_LIST is verified to be missing +++ # Early assume cleanup state of traps
trap cleanup_ignore_handler INT TERM QUIT
trap - EXIT
if test -z "$1"
then
exit_value=6
echo >&2
echo "--- Encountered INT, TERM, or QUIT signal." >&2
else
exit_value="$1"
fi
cleanup
echo >&2
if test "$exit_value" -gt 0
then
echo "--- Merge run aborted !" >&2
else
echo "Merge run ended with success indication." >&2
fi
exit "$exit_value"
}
# Handler for rogue EXIT
cleanup_for_exit() {
# Early assume cleanup state of traps
trap cleanup_ignore_handler INT TERM QUIT
trap - EXIT
cleanup
echo >&2
echo "--- Merge run ended by unexpected EXIT event !" >&2
}
## Check arguments and dependencies ## Check arguments and dependencies
@ -191,7 +245,7 @@ do
then then
dummy=dummy dummy=dummy
else else
echo "--- Missing a helper program: $i" 2>&1 echo "--- Missing a helper program: $i" >&2
missing=1 missing=1
fi fi
done done
@ -210,16 +264,16 @@ then
dummy=dummy dummy=dummy
else else
echo '--- Help text of xorriso program '"$XORRISO"' lacks word "replay".' \ echo '--- Help text of xorriso program '"$XORRISO"' lacks word "replay".' \
2>&1 >&2
echo "--- It will fail when trying to make the new ISO bootable." 2>&1 echo "--- It will fail when trying to make the new ISO bootable." >&2
echo " Consider to get and compile GNU xorriso from" 2>&1 echo " Consider to get and compile GNU xorriso from" >&2
echo " https://www.gnu.org/software/xorriso" 2>&1 echo " https://www.gnu.org/software/xorriso" >&2
echo " and to export variable XORRISO with the binary's path." 2>&1 echo " and to export variable XORRISO with the binary's path." >&2
echo >&2 echo >&2
missing=1 missing=1
fi fi
else else
echo "--- Test run of xorriso program failed: $XORRISO -no_rc -version" 2>&1 echo "--- Test run of xorriso program failed: $XORRISO -no_rc -version" >&2
missing=1 missing=1
fi fi
if test "$missing" = 1 if test "$missing" = 1
@ -229,11 +283,13 @@ then
fi fi
existing_tempfiles= existing_tempfiles=
for i in $TEMPFILE_LIST for i in merged_dists merged_md5sum.txt merged_README.txt temp_file
do do
if test -e "$i" if test -e "$i"
then then
existing_tempfiles="$existing_tempfiles $i" existing_tempfiles="$existing_tempfiles $i"
else
TEMPFILE_LIST="$TEMPFILE_LIST $i"
fi fi
done done
if test -n "$existing_tempfiles" if test -n "$existing_tempfiles"
@ -245,8 +301,12 @@ then
exit 1 exit 1
fi fi
# +++ From here on: Always call cleanup_and_end to perform exit +++ # +++ From here on: Always call cleanup_and_end to perform exit +++
trap cleanup_and_end INT TERM QUIT EXIT
trap cleanup_and_end INT TERM QUIT
trap cleanup_for_exit EXIT
RESULT_ISO="$1" RESULT_ISO="$1"
check_single_word "$2" "result_iso" || cleanup_and_end 1 check_single_word "$2" "result_iso" || cleanup_and_end 1
@ -683,6 +743,9 @@ else
fi fi
echo >&2 echo >&2
# Mark the result path for possible removal by cleanup
EMERGING_ISO="$RESULT_ISO"
if "$XORRISO" \ if "$XORRISO" \
-no_rc \ -no_rc \
-indev "$iso_1" \ -indev "$iso_1" \
@ -700,6 +763,9 @@ if "$XORRISO" \
-padding included \ -padding included \
-compliance no_emul_toc -compliance no_emul_toc
then then
# Revoke mark for possible removal by cleanup
EMERGING_ISO=
test "$XORRISO" = echo || \ test "$XORRISO" = echo || \
echo "Run of xorriso program ended without error indication." >&2 echo "Run of xorriso program ended without error indication." >&2
else else

Binary file not shown.