#!/usr/bin/env sh assert_tools () { err=0 while test $# -gt 0; do which $1 >/dev/null 2>/dev/null || { >&2 echo "tool missing: "$1 err=$(( $err + 1 )) } shift done test $err -eq 0 || exit $err } test $# -eq 0 && { 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 exit 0 } test "$1" = "sort" && { dependencies="xsltproc" assert_tools ${dependencies} xsltproc --encoding utf-8 -o sorted.xml sort.xsl data.xml mv -i sorted.xml data.xml } 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 test -e $f || continue for e in $(cat ${f}|sed 's/&2 echo ${e}" – "${status}" OK" || >&2 echo ${e}" – "${status}" FAILED" done done } mirror_website () { dependencies="wget" assert_tools ${dependencies} local url=$@ local domain=`expr "$url" : '^http[s]*://\([^/?]*\)'` wget \ --recursive \ --no-clobber \ --page-requisites \ --html-extension \ --convert-links \ --restrict-file-names=windows \ --domains $domain \ --no-parent \ $url } newdataentry () { dependencies="cat grep head cut date printf" assert_tools ${dependencies} err=0 customdir=$(pwd) fl="" test $# -eq 0 && { >&2 echo "determining entry 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. } echo "" 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) } echo "\t"${datetime}" UT" # custom format universal time fn="ds"$(printf "%03d" $newentry) for d in $(echo "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}"." ;; esac #~ echo $ffn test -e ${customdir}"/"${ffn} && { test "$d" = "covers" && { echo "\t"${cover}"" } || { fs=$(stat -c %s ${customdir}"/"${ffn}) echo "\t"${ffn}"" } } || { mfl=${mfl}" "${ffn}"\n" #~ echo "file "${ffn}" not found." err=3 } done #~ echo "\t" # not used on server yet test $# -eq 0 && { teaser="" ; } || { teaser=$@ ; echo "\t"${teaser}"" } 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}; } } 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 $@ } #gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -q -o ds100-smaller.pdf ds100.pdf