From 1da960f423e82a974b734bf9ad759aa329bdc5bc Mon Sep 17 00:00:00 2001 From: vv01f Date: Wed, 15 Apr 2020 02:52:28 +0200 Subject: [PATCH] enhance for parameters and future ISO date --- gen.sh | 273 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 166 insertions(+), 107 deletions(-) diff --git a/gen.sh b/gen.sh index 06bae6b..04cdbae 100755 --- a/gen.sh +++ b/gen.sh @@ -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/&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 "&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 "&2 printf "custom base directory for files such as jpg, pdf, epub: "${customdir}".\n\n" } - echo "" - 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"${datetime}" UT" # 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${datetime}${tz}\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"${cover}"" + printf "\t"${cover}"\n" } || { fs=$(stat -c %s ${customdir}"/"${ffn}) - echo "\t"${ffn}"" + printf "\t"${ffn}"\n" } } || { mfl=${mfl}" "${ffn}"\n" - #~ echo "file "${ffn}" not found." + #~ printf "file "${ffn}" not found.\n" err=3 } done - #~ echo "\t" # not used on server yet + #~ printf "\t\n" # not used on server yet test $# -eq 0 && { teaser="" ; } || { - teaser=$@ ; - echo "\t"${teaser}"" + teaser="$@"; + printf "\t"${teaser}"\n" } - echo "" - 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 "\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