#! /bin/sh -e indir=$1 if ! [ -n "$indir" -a -d $indir ]; then echo "Usage: $0 PUZZLEDIR" exit 1 fi shift die () { echo "$@" 1>&2 exit 1 } escape () { sed 's/&/\&/g;s//\>/g' } template () { cat="$1"; shift points="$1"; shift author=$(echo $1 | escape); shift cat < $cat $points

$cat for $points points

EOF echo "
" cat echo "
" if [ $# -gt 0 ]; then echo "
" echo "

Associated files:

" echo "" echo "
" fi cat <
Team hash:
Answer:
Puzzle by $author
Los Alamos National Laboratory US Department Of Energy Sandia National Laboratories
EOF } cat=$(basename $indir) outdir=$(dirname $(dirname $0))/packages/$cat outdir=$(cd $outdir; /bin/pwd) uanswers=$outdir/answers.unsorted usummary=$outdir/summary.unsorted umap=$outdir/map.unsorted mkdir -p $outdir if ! [ -r $outdir/salt ]; then dd if=/dev/urandom bs=1 count=16 2>/dev/null | md5sum | cut -c1-16 > $outdir/salt fi read salt < $outdir/salt > $uanswers rm -f $usummary for dn in $indir/[0-9]*; do [ -d $dn ] || continue points=$(basename $dn) echo $dn odn=$(printf "%s/%s/%s" "$salt" "$cat" "$points" | md5sum | sed 's/\(....\)/\1./g' | cut -b 1-19) tgt=$outdir/puzzles/$odn mkdir -p $tgt #touch $tgt/index.html if [ -f $dn/Makefile ]; then # If there's a Makefile, run make make DESTDIR=$tgt -C $dn || exit 1 files=$(ls -1 $tgt | grep -v index.html || true) elif [ -f $dn/00manifest.txt ]; then # If there's a manifest, use that files= while read fn; do cp $dn/$fn $tgt/ case $fn in ,*) ;; *) files="$files $fn" ;; esac done < $dn/00manifest.txt else # Otherwise, look for special files and copy the rest files= for fn in $dn/*; do case $(basename $fn) in 00*) # Handle meta-information later ;; *~|"#"*) # Don't copy temporary or backup files ;; ,*) # Copy but don't list cp $fn $tgt/ ;; *) #ext=$(echo $fn | sed -ne 's/.*\././p') cfn=$(md5sum $fn | cut -b -8)$ext cp $fn $tgt/$cfn files="$files $cfn" ;; esac done fi # Append answers if [ -f $dn/00answer.txt ]; then awk -v P=$points '/./ { printf("%d %s\n", P, $0); }' < $dn/00answer.txt >> $uanswers else die "$dn/00answer.txt: No such file or directory" fi # Append summary if [ -f $dn/00summary.txt ]; then awk -v P=$points '/./ { printf("%d %s\n", P, $0); }' < $dn/00summary.txt >> $usummary fi # Read author if [ -f $dn/00author.txt ]; then author=$(cat $dn/00author.txt) else die "$dn/00author.txt does not exist." fi # Generate index now that we have a list of files if [ -f $dn/00index.mdwn ]; then markdown --html4tags $dn/00index.mdwn fi | template $cat $points "$author" $files > $tgt/index.html # Write to map printf "%d %s\n" $points $odn >> $umap done echo "Generating URL map" sort -n $umap > $outdir/map.txt echo "Generating answers list" sort -n $uanswers > $outdir/answers.txt echo "Generating summary" [ -f $usummary ] && sort -ns $usummary > $outdir/summary.txt echo "Linking into web space" ln -sf ../packages/$cat/puzzles $outdir/../../www/$cat echo "Cleaning up" rm -f $uanswers $usummary $umap