enhance for parameters and future ISO date

This commit is contained in:
vv01f 2020-04-15 02:52:28 +02:00
parent f552bc36ad
commit 1da960f423
Signed by untrusted user who does not match committer: vv01f
GPG Key ID: 02625A16AC1D1FF6
1 changed files with 166 additions and 107 deletions

273
gen.sh
View File

@ -1,24 +1,44 @@
#!/usr/bin/env sh
#~ set -x
assert_tools () {
err=0
while test $# -gt 0; do
which $1 >/dev/null 2>/dev/null || {
>&2 echo "tool missing: "$1
>&2 printf "tool missing: $1\n"
err=$(( $err + 1 ))
}
shift
done
test $err -eq 0 || exit $err
}
test $# -eq 0 && {
assert_source () {
dependencies="test printf"
assert_tools ${dependencies}
test $# -gt 0 && {
datafn="$1";
} || {
>&2 printf "option for data source missing.\n";
datafn="data.xml";
>&2 printf "assuming fallback '${datafn}'.\n";
}
test -f "$datafn" && { >&2 printf "from ${datafn} …\n"; exit 0; } || { >&2 printf "failed.\nfile '${datafn}' does not exist.\n"; exit 1; }
printf "$datafn"
}
build () {
datafn="$1"
dependencies="xsltproc"
assert_tools ${dependencies}
xsltproc --encoding utf-8 -o ds-feed.xml rss.xsl data.xml
xsltproc --encoding iso-8859-1 -o download.html download.xsl data.xml
xsltproc --encoding utf-8 -o index.html index.xsl data.xml
>&2 printf "building ds-feed.xml … "
xsltproc --encoding utf-8 -o ds-feed.xml rss.xsl $datafn && { >&2 printf "done.\n"; } || { >&2 printf "failed on rss.xsl.\n"; exit 1; }
>&2 printf "building download.html … "
xsltproc --encoding iso-8859-1 -o download.html download.xsl $datafn && { >&2 printf "done.\n"; } || { >&2 printf "failed on download.xsl.\n"; exit 1; }
>&2 printf "building index.html … "
xsltproc --encoding utf-8 -o index.html index.xsl $datafn && { >&2 printf "done.\n"; } || { >&2 printf "failed on index.xsl.\n"; exit 1; }
exit 0
}
test "$1" = "sort" && {
sortxml () {
#~ test "$1" = "sortxml" && {
dependencies="xsltproc"
assert_tools ${dependencies}
xsltproc --encoding utf-8 -o sorted.xml sort.xsl data.xml
@ -27,12 +47,12 @@ test "$1" = "sort" && {
linkcheck () {
dependencies="curl uuid"
assert_tools ${dependencies}
tmpfile="/tmp/"$(uuid); curl https://ds.ccc.de/download.html > $tmpfile
for f in $(echo "download.html "$tmpfile); do
tmpfile="/tmp/"$(uuid); curl -k https://ds.ccc.de/download.html > $tmpfile
for f in download.html ${tmpfile} ; do
test -e $f || continue
for e in $(cat ${f}|sed 's/<a /\n<a /g'|grep -i " href="|cut -d"=" -f2|cut -d'"' -f2); do
status=$(curl --max-time 1 --head --silent --output /dev/null --write-out "%{http_code}" $e )
test $status -eq 200 && >&2 echo ${e}" "${status}" OK" || >&2 echo ${e}" "${status}" FAILED"
status=$(curl -k --max-time 1 --head --silent --output /dev/null --write-out "%{http_code}" $e )
test $status -eq 200 && >&2 printf ${e}" "${status}" OK\n" || >&2 printf ${e}" "${status}" FAILED\n"
done
done
}
@ -42,6 +62,7 @@ mirror_website () {
local url=$@
local domain=`expr "$url" : '^http[s]*://\([^/?]*\)'`
wget \
--no-check-certificate \
--recursive \
--no-clobber \
--page-requisites \
@ -53,128 +74,166 @@ mirror_website () {
$url
}
newdataentry () {
dependencies="cat grep head cut date printf"
dependencies="cat grep head cut rev date printf"
assert_tools ${dependencies}
#~ datafn=$(assert_source $1) && { shift; } || { >&2 printf "file '${datafn}' not found."; err=1; exit 1; }
datafn="data.xml"
err=0
customdir=$(pwd)
fl=""
test $# -eq 0 && {
>&2 echo "determining issue number based on data.xml.\n"
lastentry=$(cat data.xml |grep -i "<schleuder id="|head -1|cut -d'"' -f2)
newentry=$(( $lastentry + 1 ))
} || {
# todo: switches
#~ for o in "$@"; do
#~ on=$(echo $o|cut -d"=" -f1)
#~ ov=$(echo $o|cut -d"=" -f2-)
#~ case $on in
# custom data directory for availability test and filesize, default pwd
#~ c)
#~ customdir) ;;
# custom issue, default next after top entry in data.xml
#~ i)
#~ issue) ;;
# custom timestamp, default: current time
#~ d)
#~ datetime) ;;
# custom teaser xml-text, default: none
#~ t)
#~ teaser) ;;
# custom fs for files
#~ p)
#~ pdffs) ;;
#~ e)
#~ epubfs) ;;
# help text
#~ h)
#~ help)
#~ *) ;;
#~ esac
#~ done
test -d $1 && {
customdir=$1; shift
>&2 echo "custom base directory for files such as jpg, pdf, epub: "${customdir}".\n"
}
test "$1" = "help" && {
echo "prints a new data entry for a release of datenschleuder\n"
echo "release [options]\n"
echo "option\tdescription\n"
echo "directory\tcustom data directory for availability test and filesize, default pwd"
echo "number\tprint entry for release with custom number, default is the increment of the top entry in data.xml\n"
echo "date\tuse a unix timestamp for a custom date\n"
echo "teaser\tinclude teaser xml-message as last argument(s)\n"
echo "full example: `./gen.sh release 99 1568505600 Die Ausgabe 99 ist fertig.`"
exit 1
}
test $(( $1 * 1 )) -eq $1 && {
>&2 echo "custom entry for data.xml.\n"
newentry=$1; shift;
} || { echo "argument not a number."; exit 1; }
test $(( $1 * 1 )) -eq $1 && {
>&2 echo "custom datetime.\n"
datetime=$1; shift;
} || { datetime=0; } # remaining arguments should be teaser xml-message.
>&2 printf "determining issue number based on '${datafn}'.\n"
lastentry=$(grep -i "<schleuder id=" ${datafn} | head -1 | cut -d'"' -f2)
#~ lastentry=$(grep "<schleuder id=" ${datafn} | cut -d'"' -f2 | sort | tail -1)
newentry=$(( $lastentry + 1 ))
# todo: switches
#~ for o in "$@"; do
#~ on=$(printf $o|cut -d"=" -f1)
#~ ov=$(printf $o|cut -d"=" -f2-)
#~ case $on in
# custom data directory for availability test and filesize, default pwd
#~ c)
#~ customdir) ;;
# custom issue, default next after top entry in ${datafn}
#~ i)
#~ issue) ;;
# custom timestamp, default: current time
#~ d)
#~ datetime) ;;
# custom teaser xml-text, default: none
#~ t)
#~ teaser) ;;
# custom fs for files
#~ p)
#~ pdffs) ;;
#~ e)
#~ epubfs) ;;
# help text
#~ h)
#~ help)
#~ *) ;;
#~ esac
#~ done
test -d $1 && {
customdir=$1; shift
>&2 printf "custom base directory for files such as jpg, pdf, epub: "${customdir}".\n\n"
}
echo "<schleuder id=\"$newentry\">"
test "${datetime}" = "" || test $datetime -eq 0 && {
#~ datetime=$(LANG=en_US.utf8 date -u +"%a %d %b %Y %H:%M") # manual copy of known entries
datetime=$(LANG=en_US.utf8 date -u -R |rev|cut -d":" -f2-|rev) # RFC-5322-Format without seconds and TZ
} || {
datetime=$(LANG=en_US.utf8 date -d @${datetime} -u -R|rev|cut -d":" -f2-|rev)
test "$1" = "help" && {
printf "prints a new data entry for a release of datenschleuder\n\n"
printf "release [options]\n\n"
printf "option\tdescription\n\n"
printf "directory\tcustom data directory for availability test and filesize, default pwd\n\n"
printf "number\tprint entry for release with custom number, default is the increment of the top entry in ${datafn}\n\n"
printf "date\tuse a unix timestamp for a custom date\n\n"
printf "teaser\tinclude teaser xml-message as last argument(s)\n\n"
printf "full example: './gen.sh release 99 1568505600 Die Ausgabe 99 ist fertig.'\n"
exit 1
}
echo "\t<date>"${datetime}" UT</date>" # custom format universal time
2>/dev/null test $(( $1 * 1 )) -eq $1 && {
newentry=$1; shift;
>&2 printf "custom issue number '${newentry}' for '${datafn}'.\n"
} || {
printf "next argument not a number. assuming issue based on top entry.\n"
}
2>/dev/null test $(( $1 * 1 )) -eq $1 && {
>&2 printf "custom datetime.\n\n"
datetime="$1"; shift;
} || { printf "next argument not a number. using actual system time.\n"; datetime=0; } # remaining arguments should be teaser xml-message.
printf "\nschleuder id=\"$newentry\">\n"
# todo: switch for dtg, integrate custom datetime input early
# or simply implement xslt for handling ISO and nothing else for input
# RFC-5322-Format without seconds and TZ
dtg="TZ=:UTC LANG=en_US.utf8 date -u -R |rev|cut -d\":\" -f2-|rev"; tz=" UT"
# ISO dtg as issues may provide datetime-data on months but mostly not on days …
#~ dtg="TZ=:UTC LANG=en_US.utf8 date +%Y-%m-%d %H:%M %Z"; tz=""
test $datetime -eq 0 && {
datetime=$(TZ=:UTC LANG=en_US.utf8 date -u -R |rev|cut -d":" -f2-|rev) #
} || {
#~ dtg="TZ=:UTC LANG=en_US.utf8 date -d @${datetime} +\"%Y-%m-%d %H:%M %Z\""; tz=""
dtg="TZ=:UTC LANG=en_US.utf8 date -d @${datetime} -u -R |rev|cut -d\":\" -f2-|rev"; tz=" UT"
#~ datetime="$(TZ=:UTC LANG=en_US.utf8 date -d @${datetime} -u -R|rev|cut -d":" -f2-|rev)"
# TZ=:UTC LANG=en_US.utf8 date -d @${datetime} +"%Y-%m-%d %H:%M %Z"
}
datetime="$(sh -c "${dtg}")"
printf "\t<date>${datetime}${tz}</date>\n" # custom format universal time
fn="ds"$(printf "%03d" $newentry)
for d in $(echo "covers pdfs epubs"); do
for d in covers pdfs epubs ; do
case "$d" in
covers) ffn=${d}"/"${fn}".jpg"; cover=$ffn ;;
pdfs) ffn=${d}"/"${fn}".pdf" ;;
epubs) ffn=${d}"/"${fn}".epub" ;;
#~ *) echo "file "${ffn}" not found, in "${d}"." ;;
#~ *) printf "file "${ffn}" not found, in "${d}".\n" ;;
esac
#~ echo $ffn
#~ printf "$ffn\n"
test -e ${customdir}"/"${ffn} && {
test "$d" = "covers" && {
echo "\t<image>"${cover}"</image>"
printf "\t<image>"${cover}"</image>\n"
} || {
fs=$(stat -c %s ${customdir}"/"${ffn})
echo "\t<link filesize=\""${fs}"\">"${ffn}"</link>"
printf "\t<link filesize=\""${fs}"\">"${ffn}"</link>\n"
}
} || {
mfl=${mfl}" "${ffn}"\n"
#~ echo "file "${ffn}" not found."
#~ printf "file "${ffn}" not found.\n"
err=3
}
done
#~ echo "\t<preface></preface>" # not used on server yet
#~ printf "\t<preface></preface>\n" # not used on server yet
test $# -eq 0 && { teaser="" ; } || {
teaser=$@ ;
echo "\t<teaser>"${teaser}"</teaser>"
teaser="$@";
printf "\t<teaser>"${teaser}"</teaser>\n"
}
echo "</schleuder>"
test "$teaser" = "" && { >&2 echo "\nmissing teaser message."; }
test -e ${customdir}"/"$cover || { >&2 echo "\nmissing cover file: "${cover}; }
test $err -gt 0 && { >&2 echo "\nmissing files:\n"${mfl}; }
printf "</schleuder>\n"
test "$teaser" = "" && { >&2 printf "\nmissing teaser message.\n"; }
test -e ${customdir}"/"$cover || { >&2 printf "\nmissing cover file: "${cover}"\n"; }
test $err -gt 0 && { >&2 printf "\nmissing files:\n"${mfl}"\n"; }
}
newinfoentry () {
echo "not implemented yet.\n\nwill be similar to `release`."
}
# a mirror is useful for local testing with files
test "$1" = "mirror" && {
shift
>&2 echo "downloading the website may take quite some time."
mirror_website http://ds.ccc.de/
}
test "$1" = "linkcheck" && {
shift
linkcheck http://ds.ccc.de/
}
test "$1" = "release" && {
shift
newdataentry $@
}
test "$1" = "info" && {
shift
newinfoentry $@
>&2 printf "not implemented yet.\n\nwill be similar to 'release'.\n"
}
#~ echo $# $@
if test $# -lt 1 ; then
printf "missing parameter.\n"
exit 1
else
# a mirror is useful for local testing with files
case "$1" in
build)
shift
f=$(assert_source $@) && { shift; } || { exit 1; }
build "${f}"
;;
sortxml)
shift
f=$(assert_source $@) && { shift; } || { exit 1; }
sortxml "${f}"
;;
mirror)
>&2 printf "downloading the website may take quite some time.\n"
mirror_website http://ds.ccc.de/
;;
linkcheck)
linkcheck http://ds.ccc.de/
;;
release)
shift
newdataentry $@
;;
info)
shift
newinfoentry $@
;;
*)
printf "this is not implemented yet.\n"
;;
esac
fi
# generate small size version of pdf, might help e.g. for email attachments
#gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -q -o ds100-smaller.pdf ds100.pdf