Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#!/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 >>/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 >>/srv/fscons.open
killfossil

# install permanent fossil configuration
fossil/conf -w $fosspart $fossconf