On 08/12/2011 05:08 PM, Gerardo Exequiel Pozzi wrote:
v2: Fixed paths inside checksums.md5 (thanks Pierre). Also fix find arguments,
and make a separate function in archiso hook for md5sum.

NOTE 1: Needs md5sum, not added here (Waiting for rebuild of mkinitcpio-busybox)
NOTE 2: This is a draft without testing, but should works(tm).

Signed-off-by: Gerardo Exequiel Pozzi<[email protected]>
---
  README                    |    4 ++++
  archiso/hooks/archiso     |   25 +++++++++++++++++++++++++
  archiso/mkarchiso         |   17 +++++++++++++++++
  configs/baseline/build.sh |    1 +
  configs/releng/build.sh   |    2 ++
  5 files changed, 49 insertions(+), 0 deletions(-)

diff --git a/README b/README
index 4eaf904..852f3bd 100644
--- a/README
+++ b/README
@@ -31,6 +31,10 @@ INDEX
  * copytoram=        If set to "y" or just "copytoram" without arguments,
                      all SquashFS are copied to "RAM".
                      Default: (unset)
+* checksum=         If set to "y" or just "checksum" without arguments,
+                    performs a self-test of all files inside ${install_dir},
+                    and continue booting if ok.
+                    Default: (unset)
  * cowspace_size=    Set the size of tmpfs /cowspace. This space is used for
                      Copy-On-Write files of dm-snapshot.
                      (directory not visible outside initramfs)
diff --git a/archiso/hooks/archiso b/archiso/hooks/archiso
index 66dbafd..0495195 100644
--- a/archiso/hooks/archiso
+++ b/archiso/hooks/archiso
@@ -77,6 +77,16 @@ _mnt_sfs() {
      fi
  }

+_verify_checksum() {
+    local _status
+    cd "/bootmnt/${archisobasedir}"
+    md5sum -c checksum.md5>  /checksum.log 2>&1
+    _status=$?
+    cd "${OLDPWD}"
+    return ${_status}
+}
+
+
  run_hook() {
      [[ -z "${arch}" ]]&&  arch="$(uname -m)"
      [[ -z "${cowspace_size}" ]]&&  cowspace_size="75%"
@@ -135,6 +145,21 @@ archiso_mount_handler() {
          launch_interactive_shell
      fi

+    if [[ "${checksum}" == "y" ]]; then
+        if [[ -f "/bootmnt/${archisobasedir}/checksum.md5" ]]; then
+            echo ":: Self-test requested, please wait..."
+            if _verify_checksum; then
+                echo "done. Checksum is OK, continue booting."
+            else
+                echo "ERROR: one or more files are corrupted, see /checksum.log for 
details"
+                launch_interactive_shell
+            fi
+        else
+            echo "ERROR: checksum=y option specified but checksum.md5 not 
found"
+            launch_interactive_shell
+        fi
+    fi
+
      if [[ "${copytoram}" == "y" ]]; then
          msg -n ":: Mounting /copytoram (tmpfs) filesystem, 
size=${copytoram_size}..."
          mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram 
/copytoram
diff --git a/archiso/mkarchiso b/archiso/mkarchiso
index 12d8936..6826441 100755
--- a/archiso/mkarchiso
+++ b/archiso/mkarchiso
@@ -112,6 +112,8 @@ _usage ()
      echo "      includes all specified packages"
      echo "   prepare<dir>"
      echo "      build all images"
+    echo "   checksum<dir>"
+    echo "      make a checksum.md5 for self-test"
      echo "   iso<dir>  <image name>"
      echo "      build an iso image from the working dir"
      exit ${1}
@@ -134,6 +136,8 @@ _show_config () {
              ;;
          prepare)
              ;;
+        checksum)
+            ;;
          iso)
              _msg_info "               Image name:   ${img_name}"
              _msg_info "               Disk label:   ${iso_label}"
@@ -286,6 +290,16 @@ _mkfs () {
      _umount_fs "${work_dir}/mnt/${_src}"
  }

+command_checksum () {
+    _show_config checksum
+
+    _msg_info "Creating checksum file for self-test"
+    cd "${work_dir}/iso/${install_dir}"
+    find -type f ! -name checksum.md5 -print0 | xargs -0 md5sum>  checksum.md5
+    cd ${OLDPWD}
+    _msg_info "Done!"
+}
+
  # Create an ISO9660 filesystem from "iso" directory.
  command_iso () {
      if [[ ! -f "${work_dir}/iso/isolinux/isolinux.bin" ]]; then
@@ -428,6 +442,9 @@ case "${command_name}" in
      prepare)
          command_prepare
          ;;
+    checksum)
+        command_checksum
+        ;;
      iso)
          if [[ $# -lt 3 ]]; then
              _msg_error "No image specified" 0
diff --git a/configs/baseline/build.sh b/configs/baseline/build.sh
index a07599c..eabe21f 100755
--- a/configs/baseline/build.sh
+++ b/configs/baseline/build.sh
@@ -86,6 +86,7 @@ make_prepare() {

  # Build ISO
  make_iso() {
+    mkarchiso ${verbose} checksum "${work_dir}"
      mkarchiso ${verbose} -D "${install_dir}" -L "${iso_label}" iso "${work_dir}" 
"${name}-${version}-${arch}.iso"
  }

diff --git a/configs/releng/build.sh b/configs/releng/build.sh
index d078ee2..44e41f6 100755
--- a/configs/releng/build.sh
+++ b/configs/releng/build.sh
@@ -163,6 +163,7 @@ make_prepare() {
  # args: $1 (core | netinstall)
  make_iso() {
      local _iso_type=${1}
+    mkarchiso ${verbose} checksum "${work_dir}"
      mkarchiso ${verbose} -D "${install_dir}" -L "${iso_label}" iso "${work_dir}" 
"${name}-${version}-${_iso_type}-${arch}.iso"
  }

@@ -206,6 +207,7 @@ make_dual() {
              sed "s|%ARCHISO_LABEL%|${iso_label}|g;
                   s|%INSTALL_DIR%|${install_dir}|g" ${_cfg}>  
${work_dir}/dual/iso/${install_dir}/boot/syslinux/${_cfg##*/}
          done
+        mkarchiso ${verbose} checksum "${work_dir}/dual"
          mkarchiso ${verbose} -D "${install_dir}" -L "${iso_label}" iso 
"${work_dir}/dual" "${name}-${version}-${_iso_type}-dual.iso"
          :>  ${work_dir}/dual/build.${FUNCNAME}_${_iso_type}
      fi
I will merge this in 24 hours. (An improved version, only changed how messages are displayed). It's safe even if newer mkinitcpio-busybox does not hit [core], since is not enabled by default.



--
Gerardo Exequiel Pozzi
\cos^2\alpha + \sin^2\alpha = 1

Reply via email to