#! /bin/sh if [ -n "$1" ]; then cd $1 else cd $(dirname $0)/.. fi basedir=$(pwd) log () { echo "moth: $@" 1>&2 } # Do nothing if `disabled` is present if [ -f state/disabled ]; then log "Instance disabled; doing nothing" exit fi # Are we stopping at a certain time? if [ -f state/until ]; then read -r until < state/until when=$(date -d "$until" +%s) now=$(date +%s) if [ $now -ge $when ]; then log "End time reached; doing nothing" exit fi fi # Reset to initial state? if [ ! -f state/initialized ]; then log "Resetting contest state" rm -rf state/teams state/points.new state/points.tmp mkdir -p state/teams state/points.new state/points.tmp chown www:www state/teams state/points.new state/points.tmp # Needs root. Use Docker. : > state/points.log echo 'Remove this file to obliterate teams and points' > state/initialized fi # Create some team names if needed if [ ! -f state/assigned.txt ]; then log "Generating team names" hd state/assigned.txt fi # Install new categories for pkg in puzzles/*; do cat=$(basename $pkg .zip) if [ ! -f packages/$cat/installed ] || [ $pkg -nt packages/$cat/installed ]; then log "Installing $pkg" bin/install-category $pkg : >packages/$cat/installed fi done # Helpful error message if [ $(ls packages | wc -l) -eq 0 ]; then log "error: No packages installed" exit fi # Create a list of currently-active categories : > state/categories.txt.new for dn in packages/*; do cat=${dn##packages/} echo "$cat" >> state/categories.txt.new done mv state/categories.txt.new state/categories.txt # Collect new points find state/points.new -type f | while read fn; do # Skip files opened by another process lsof $fn | grep -q $fn && continue # Skip partially written files [ $(wc -l < $fn) -gt 0 ] || continue # filter the file for unique awards sort -k 4 $fn | uniq -f 1 | sort -n >> state/points.log # Now kill the file rm -f $fn done # Generate new puzzles.json if bin/puzzles $basedir > state/puzzles.json.new; then mv state/puzzles.json.new state/puzzles.json fi # Generate new points.json if bin/points $basedir > state/points.json.new; then mv state/points.json.new state/points.json fi