Last active
January 9, 2022 00:53
-
-
Save td-shi/965bdc451c3bcf00c34d0dfc950c86f8 to your computer and use it in GitHub Desktop.
This script is the self-extracting archive template. The MD5 of archive data is a69fb4d0185baa34f1a809de747a22f7.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash --posix | |
# -*- coding:utf-8 -*- | |
# === Coding shell scripting Memo ============================================== | |
# === Initialize shell environment ============================================= | |
#set -u # Just stop undefined values. | |
#set -e # Just stop error. | |
#set -x # Debug running command. | |
umask 0022 | |
export LC_ALL=C | |
export LANG=C | |
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin:${PATH+:}${PATH-}" | |
type command >/dev/null 2>&1 && type getconf >/dev/null 2>&1 && | |
PATH="$(command -p getconf PATH):${PATH}" | |
export PATH | |
export UNIX_STD=2003 # to make HP-UX conform to POSIX | |
# === Define the functions for printing usage and error message ================ | |
usage_and_exit(){ | |
cat <<-"USAGE" 1>&2 | |
# About | |
This script is the self-extracting archive. Archives are extracted the <script> | |
directory. If the autrun.sh is contained archive, this script ask to run it. | |
This script require the tar( and gzip, gunzip) and openssl( or md5sum) command. | |
Archives in this script are the self template and the autrun shell script. | |
If you want to exchange the archive data, replace the end data block of this file. | |
The data block should be base64 encoded (`tar zcvf <target> | base64`). | |
# Usage | |
## Command | |
<script name> options | |
## Options | |
- -h |--help |--version | |
+ This help. | |
- -x | |
+ Permitting to extract. If the option -x is omitted, the program exits with abnormality 1. | |
- -c <sum> | |
+ Checking self-sum and <sum> and Skiping to confirm. | |
- -l | |
+ Show file list in archive. | |
# Version | |
2022-01-06 0.01 | |
# LICENSE | |
[CC0(Public domain)](https://creativecommons.org/publicdomain/zero/1.0/legalcode) | |
# Author | |
2022 td-shi | |
USAGE | |
exit 1 | |
} | |
error_exit() { | |
${2+:} false && echo "${0##*/}: $2" 1>&2 | |
exit "$1" | |
} | |
# === Initialize parameters ==================================================== | |
SELF_DIR="$(cd "$(dirname "${0}")" && pwd)" | |
SELF_NAME="$(printf "%s" "${0##*/}" | sed "s/\.sh//")" | |
SELF_FULL="${SELF_DIR}/${0##*/}" | |
SUM_DGST="md5" | |
PERMIT_EXTRACT="0" | |
CHECK_SUM="" | |
CORRECT_SUM="0" | |
ONLY_LIST="0" | |
# === Confirm that the required commands exist ================================= | |
if type tar >/dev/null 2>&1; then | |
: | |
else | |
error_exit 1 'Require the tar command.' | |
fi | |
if type openssl >/dev/null 2>&1; then | |
ckdgst() { | |
cat - |\ | |
openssl dgst -"${SUM_DGST}" |\ | |
sed "s/(.*)=[[:blank:]]*\([0-9a-fA-F]*\)/\1/" | |
} | |
elif type md5sum >/dev/null 2>&1; then | |
SUM_DGST="md5" | |
ckdgst() { | |
cat - |\ | |
md5sum |\ | |
cut -d " " -f 1 | |
} | |
else | |
error_exit 1 'Require the openssl command.' | |
fi | |
# === Print usage and exit if one of the help options is set =================== | |
case "$# ${1:-}" in | |
'1 -h'|'1 --help'|'1 --version') usage_and_exit;; | |
esac | |
# === Read options ============================================================= | |
while :; do | |
case "${1:-}" in | |
-x) | |
PERMIT_EXTRACT="1" | |
shift | |
;; | |
-c) | |
CHECK_SUM=$(printf '%s' "${2:-}" | tr -d '\n') | |
shift 2 | |
;; | |
-l) | |
ONLY_LIST="1" | |
shift | |
;; | |
--archive-template) | |
sed '/^cat <<-\"==END\"/ ,$d' "${0}" |\ | |
sed '$acat <<-\"==END\"' |\ | |
sed '$a==END' | |
exit 0 | |
;; | |
--|-) | |
break | |
;; | |
--*|-*) | |
error_exit 1 'Invalid option' | |
;; | |
*) | |
break | |
;; | |
esac | |
done | |
# === Require parameters check ================================================= | |
# === Last parameter =========================================================== | |
# === Define funcitons ========================================================= | |
confirm() { | |
while true; do | |
printf "%s [y/N]\n" "${1:-Do you wish to continue?}" 1>&2 | |
read -r yn | |
case "${yn}" in | |
[yY]| [yY]es) | |
return 0 | |
;; | |
*) | |
return 1 | |
;; | |
esac | |
done | |
} | |
decord() { | |
SED_LF=$(printf '\\\n_') | |
SED_LF=${SED_LF%_} | |
cat - |\ | |
tr -d "=" |\ | |
sed "s/[[:blank:]]//g" |\ | |
tr "01" "<>" |\ | |
sed "s/./&${SED_LF}/g" |\ | |
sed "/^$/d" |\ | |
paste -d "" - - - - |\ | |
sed "s:/:111111:g" |\ | |
sed "s:+:111110:g" |\ | |
sed "s:9:111101:g" |\ | |
sed "s:8:111100:g" |\ | |
sed "s:7:111011:g" |\ | |
sed "s:6:111010:g" |\ | |
sed "s:5:111001:g" |\ | |
sed "s:4:111000:g" |\ | |
sed "s:3:110111:g" |\ | |
sed "s:2:110110:g" |\ | |
sed "s:>:110101:g" |\ | |
sed "s:<:110100:g" |\ | |
sed "s:z:110011:g" |\ | |
sed "s:y:110010:g" |\ | |
sed "s:x:110001:g" |\ | |
sed "s:w:110000:g" |\ | |
sed "s:v:101111:g" |\ | |
sed "s:u:101110:g" |\ | |
sed "s:t:101101:g" |\ | |
sed "s:s:101100:g" |\ | |
sed "s:r:101011:g" |\ | |
sed "s:q:101010:g" |\ | |
sed "s:p:101001:g" |\ | |
sed "s:o:101000:g" |\ | |
sed "s:n:100111:g" |\ | |
sed "s:m:100110:g" |\ | |
sed "s:l:100101:g" |\ | |
sed "s:k:100100:g" |\ | |
sed "s:j:100011:g" |\ | |
sed "s:i:100010:g" |\ | |
sed "s:h:100001:g" |\ | |
sed "s:g:100000:g" |\ | |
sed "s:f:011111:g" |\ | |
sed "s:e:011110:g" |\ | |
sed "s:d:011101:g" |\ | |
sed "s:c:011100:g" |\ | |
sed "s:b:011011:g" |\ | |
sed "s:a:011010:g" |\ | |
sed "s:Z:011001:g" |\ | |
sed "s:Y:011000:g" |\ | |
sed "s:X:010111:g" |\ | |
sed "s:W:010110:g" |\ | |
sed "s:V:010101:g" |\ | |
sed "s:U:010100:g" |\ | |
sed "s:T:010011:g" |\ | |
sed "s:S:010010:g" |\ | |
sed "s:R:010001:g" |\ | |
sed "s:Q:010000:g" |\ | |
sed "s:P:001111:g" |\ | |
sed "s:O:001110:g" |\ | |
sed "s:N:001101:g" |\ | |
sed "s:M:001100:g" |\ | |
sed "s:L:001011:g" |\ | |
sed "s:K:001010:g" |\ | |
sed "s:J:001001:g" |\ | |
sed "s:I:001000:g" |\ | |
sed "s:H:000111:g" |\ | |
sed "s:G:000110:g" |\ | |
sed "s:F:000101:g" |\ | |
sed "s:E:000100:g" |\ | |
sed "s:D:000011:g" |\ | |
sed "s:C:000010:g" |\ | |
sed "s:B:000001:g" |\ | |
sed "s:A:000000:g" |\ | |
sed "s/[01][01][01][01][01][01][01][01]/& /g" |\ | |
sed "s/ [01][01]$//" |\ | |
sed "s/ [01][01][01][01]$//" |\ | |
sed "s/^[01][01][01][01][01][01]$//" |\ | |
sed "s/\([01][01]\)\([01][01][01]\)\([01][01][01]\)/0\1 \2 \3 /g" |\ | |
sed "s/111/7/g" |\ | |
sed "s/110/6/g" |\ | |
sed "s/101/5/g" |\ | |
sed "s/100/4/g" |\ | |
sed "s/011/3/g" |\ | |
sed "s/010/2/g" |\ | |
sed "s/001/1/g" |\ | |
sed "s/000/0/g" |\ | |
tr -d " " |\ | |
paste -d "" - - - - - - - - |\ | |
sed 's/.../\\\\&/g' |\ | |
xargs -n 1 printf | |
} | |
slice() { | |
sed "1,/^exit/d" "${1}" |\ | |
sed "/^cat/d" |\ | |
sed "/^==END/d" | |
} | |
# === Main routine ============================================================= | |
if [ "_1" == "_${ONLY_LIST}" ]; then | |
slice "${SELF_FULL}" |\ | |
decord |\ | |
tar ztf - | |
exit 0 | |
fi | |
SUM=$(slice "${SELF_FULL}" | ckdgst) | |
if [ "_" != "_${CHECK_SUM}" ] && [ "_${SUM}" == "_${CHECK_SUM}" ]; then | |
CORRECT_SUM="1" | |
elif [ "_" == "_${CHECK_SUM}" ] && confirm "Is the value of ${SUM_DGST} ${SUM} correct?"; then | |
CORRECT_SUM="1" | |
else | |
CORRECT_SUM="0" | |
fi | |
if [ "_1" != "_${CORRECT_SUM}" ]; then | |
error_exit 1 "No correct checksum." | |
elif [ "_1" != "_${PERMIT_EXTRACT}" ]; then | |
error_exit 1 "Does not exist -x option (to permit extracting). More info is gave -h option." | |
else | |
: | |
fi | |
mkdir -p "${SELF_DIR}/${SELF_NAME}" | |
( | |
cd "${SELF_DIR}/${SELF_NAME}" || exit 1 | |
slice "${SELF_FULL}" |\ | |
decord |\ | |
tar xzvf - | |
if [ -e "autorun.sh" ] && confirm "Do you want to run the autorun.sh script?" ; then | |
chmod +x "autorun.sh" | |
./autorun.sh | |
fi | |
) | |
# === End shell script ========================================================= | |
exit 0 | |
cat <<-"==END" 1>&2 | |
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 | |
AQUUUEABfxL+A8fv1jIAUAAA | |
==END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment