#! /bin/sh #set -x # TOOLS NEEDED # SED # CURL # TEMPFILE # TOUCH # RM # GREP # CAT # MKDIR # LS # TAIL URL="http://www.xkcd.com" CONFDIR="${CONFIG:="$HOME/.xkcd/test"}" CONF="details" FIRST_RUN="0" LINK="/tmp/xkcd_image" KEEP="30" RM=$(which rm) || { echo 1>&2 "we require the rm utility, exiting ..."; exit 1; } CURL=$(which curl) || { echo 1>&2 "we require the curl utility, exiting ..."; exit 1; } SED=$(which sed) || { echo 1>&2 "we require the sed utility, exiting ..."; exit 1; } TCH=$(which touch) || { echo 1>&2 "we require the touch utility, exiting ..."; exit 1; } GREP=$(which grep) || { echo 1>&2 "we require the grep utility, exiting ..."; exit 1; } LN=$(which ln) || { echo 1>&2 "we require the ln utility, exiting ..."; exit 1; } CAT=$(which cat) || { echo 1>&2 "we require the cat utility, exiting ..."; exit 1; } MKDIR=$(which mkdir) || { echo 1>&2 "we require the mkdir utility, exiting ..."; exit 1; } LS=$(which ls) || { echo 1>&2 "we require the ls utility, exiting ..."; exit 1; } TAIL=$(which tail) || { echo 1>&2 "we require the tail utility, exiting ..."; exit 1; } getOldest(){ if [ $# -ne 1 ]; then return 1 fi case "$1" in [0-9]|[0-9][0-9]*) : ;; *) return 2 ;; esac if [ $($LS -t *.png *.PNG 2>/dev/null| wc -l) -gt "$1" ]; then # yes there is TTCTTO race here $LS -t *.png *.PNG 2>/dev/null| $TAIL +"$(($1+1))" || return 1 else return 1 fi } which tempfile &>/dev/null || { tempfile(){ # this should suffice since we only need one tempfile local tmp=/tmp/"$(basename "$0")".$$ $TCH "$tmp" || return 1 echo "$tmp" } } getOptFromConfig() { local answer [ $# -ne 1 ] && return 2 $GREP -q "$1" "$CONFDIR"/"$CONF" 2>/dev/null && { answer="$($GREP "$1" "$CONFDIR"/"$CONF" | $SED -e 's/^[^=][^=]*=\(.*\)$/\1/g' -e 's/\ \ *$//g')" if [ ! -n "$answer" -o x"$answer" = x"" ]; then return 1 else echo "$answer" fi } || return 1 } TMPF="$(tempfile)" trap "$RM -f "$TMPF"" KILL QUIT EXIT ABRT HUP INT STOP if [ ! -f "$TMPF" ]; then echo 1>&2 "tempfile: $TMPF is not a regular file" exit 1 fi if [ ! -d "$CONFDIR" ]; then $MKDIR "$CONFDIR" || { echo 1>&2 "configdir: $CONFDIR is not a directory or not writeable" exit 1 } fi if [ ! -f "$CONFDIR"/"$CONF" ]; then $TCH "$CONFDIR"/"$CNF" FIRST_RUN=1 fi if [ "$FIRST_RUN" -ne 1 ]; then FIRST_RUN=0 ID=$(getOptFromConfig "ID") || FIRST_RUN=1 FILE=$(getOptFromConfig "FILE") || FIRST_RUN=1 fi if [ x"$ID" = x"" ]; then ID=0; fi if [ x"$FILE" = x"" ]; then FILE="null"; fi # DUMP PAGE $CURL -s -o "$TMPF" "$URL" || { echo 1>&2 "something went wrong while dumping the file"; exit 1; } NEW_ID="$($GREP '

Permanent\ link\ to\ this\ comic:' < "$TMPF" | $SED -e 's/[^:]*:\ \(.*\)$/\1/' -e 's/^\ \ *//' -e 's/\ \ *$//' -e 's/<\/*h3>//g' -e 's/\/$//' -e 's/^/\//' -e 's/[.:]//g')" NEW_ID="$(basename "$NEW_ID")" FILE_URL="$($GREP '

Image\ URL' < "$TMPF" | $SED -e 's/[^:]*:\ \(.*\)$/\1/' -e 's/^\ \ *//' -e 's/\ \ *$//' -e 's/<\/*h3>//g' -e 's/\/$//' )" NEW_FILE="$(echo "$FILE_URL" | $SED -e 's/^/\//' -e 's/://g' -e 's/\/$//')" NEW_FILE=$(basename "$NEW_FILE") ## HERE WE NEED TO DETERMINE IF FILE IS NEW ## CHECK FOR EITHER NEW_ID OR FILE if [ "$NEW_ID" -le "$ID" -o x"$NEW_FILE" = x"$FILE" ]; then exit 0 fi cd "$CONFDIR" && $CURL -s -o "$NEW_FILE" "$FILE_URL" if [ -h "$LINK" ]; then $RM -f "$LINK" fi $LN -s "$CONFDIR"/"$NEW_FILE" "$LINK" $CAT > "$CONFDIR"/"$CONF" << EOF ID=$NEW_ID FILE=$NEW_FILE EOF # REMOVE THE OLDEST MINUS KEEP (AMOUNT WE WANT TO KEEP) getOldest "$KEEP" | while read f; do if [ x"$f" != x"" -a -f "$f" ]; then $RM -f "$f" fi done #set +x