#!/bin/rc # loadfossil - populate a fossil partition or file # # due to name clashes in /srv, will only work on a machine # without a fossil named `fossil' already running. rfork en fn killfossil { sleep 1 unmount /n/f & sleep 1 rm -f /srv/^(fossil fossil.open fscons fscons.open) kill fossil | rc sleep 1 } fn sendexpect { # send expect timeout echo $1 if(! dial/expect -qt $3 $2) echo -n 'no '^$"1^'...' > /dev/cons } fn usage { echo usage: $argv0 partition root proto fossil.conf >[1=2] exit usage } fn sigexit { rm -f /tmp/fossil-no-list.conf exit } fn sigint sighup sigterm { rm -f /tmp/fossil-no-list.conf killfossil exit note } # process arguments if (! ~ $#* 4) usage argv0=$0 fosspart=$1 srcroot=$2 proto=$3 fossconf=$4 if (test -e /srv/fossil -o -e /srv/fossil.open) { echo $0: /srv/fossil* exists, not safe to start a new fossil >[1=2] exit fossil-already-running } # initialise fossil fossil/flfmt -y $fosspart # install listen-less config for fossil creation { grep -v '^listen ' $fossconf echo create /active/adm adm sys d775 echo create /active/adm/users adm sys 664 } >/tmp/fossil-no-list.conf fossil/conf -w $fosspart /tmp/fossil-no-list.conf # start fossil fossil/fossil -f $fosspart mount -cC /srv/fossil.open /n/f # set up /adm/users cp /adm/users /n/f/adm { echo dial/drain & sleep 2 sendexpect 'users -r /active/adm/users' ': ' 5 } >/srv/fscons.open # remount with new users unmount /n/f mount -cC /srv/fossil.open /n/f # populate fossil @ { # logs are boring, make them all appear empty chmod +arw /tmp/empty-log >/tmp/empty-log cd $srcroot/sys/log && { for (f in [0-9a-z]* */*) if (! ~ $f httpd mkfile smtpdb timesync.d vac year) bind /tmp/empty-log $f } cd /tmp disk/mkfs -u $srcroot/adm/users -U -d /n/f -s $srcroot $proto } # stop fossil gracefully { echo dial/drain & sleep 2 sendexpect 'fsys all sync' ': ' 120 sendexpect 'fsys all halt' ': ' 5 } >/srv/fscons.open killfossil # install permanent fossil configuration fossil/conf -w $fosspart $fossconf