initial version

This commit is contained in:
Patrick Cao Huu Thien 2024-10-17 00:31:57 +02:00
commit 481b4f6058
Signed by untrusted user who does not match committer: pcao
GPG Key ID: B57DBE40C72FBCF4
2 changed files with 88 additions and 0 deletions

14
README Normal file
View File

@ -0,0 +1,14 @@
*shasumscript* is a tool to generate a self-checksum-script.
Usage
shasumscript script.sh
License
MIT
From an idea of LSC https://github.com/dealfonso/lsc

74
shasumscript Executable file
View File

@ -0,0 +1,74 @@
#!/bin/sh
# Script to add a SHA256 checksum to a file
# Usage: shasumscript <file>
# Output: <file>_sha256
# Requires: shasum
# License: MIT
# Author: Patrick Cao Huu Thien
set -e
error() { printf "Error: \e[31m%s\e[0m\n" "$*" >&2; }
err() { error "$*"; exit 1; }
usage() { echo "Usage: $(basename "$0") [-V | -h] <file>";echo " -V: Show version"; echo " -h: Show this help"; }
err_usage() { error "$*"; usage; exit 1; }
step () { err="$?"; c=32; t=OK; test "$err" = 0 || { c=31; t=FAILED; }; printf "* %s \e[%dm%s\e[0m\n" "$*" "$c" "$t"; }
VERSION="0.0.1"
if test "$1" = '-V'; then echo "shasumscript v$VERSION"; exit; fi
if test "$1" = '-h'; then usage; exit; fi
file="$1"
test -n "$file" || err_usage "Missing file argument"
test -e "$file" || err "File not found: $file"
sha="$(shasum -a 256 "$file" | cut -d' ' -f1)" || err "Failed to calculate SHA256 checksum"
step "Checksum"
newfile="${file}_sha256"
cat <<EOT > "$newfile"
#!/bin/sh
# script generated by shasumscript at $(date)
#
# This script self-checkssum it's content and exit on error
# The real script can be found after the separator:
# $sha
#
# License: MIT
# Author: Patrick Cao Huu Thien
tmpexe="\$(mktemp)"
trap 'rm -f "\$tmpexe"' EXIT
cat "\$0" | sed -n '/^${sha}/,\$p' | tail -n +2 > "\$tmpexe"
test "\$(shasum -a 256 "\$tmpexe" | cut -d' ' -f1)" = "$sha" || {
echo "Checksum mismatch!" >&2
exit 1
}
printf "Checksum OK"; sleep 1; printf "\r \r"
sh "\$tmpexe" "\$@"
exit
$sha
EOT
step "pre-script"
cat "$file" >> "$newfile"
step "post-script"
chmod +x "$newfile"
step "make it executable"
echo
cat <<EOT
File created: $newfile
You can distribute it.
To run it:
./$newfile
EOT