231 lines
6.5 KiB
Bash
231 lines
6.5 KiB
Bash
#!/bin/sh
|
|
#
|
|
# This script starts and stops the monotone server.
|
|
#
|
|
# chkconfig: - 90 10
|
|
# description: Monotone netsync protocol server
|
|
# processname: monotone-server
|
|
# pidfile: /var/run/monotone/monotone-server.pid
|
|
# config: /etc/sysconfig/monotone
|
|
# config: /etc/monotone/monotonerc
|
|
#
|
|
### BEGIN INIT INFO
|
|
# Provides: monotone
|
|
# Required-Start: $local_fs $network $named $time
|
|
# Required-Stop: $local_fs $network
|
|
# Short-Description: start and stop Monotone netsync protocol server
|
|
# Description: Monotone is a free, distributed version control system.
|
|
# It provides fully disconnected operation, manages complete
|
|
# tree versions, keeps its state in a local transactional
|
|
# database, supports overlapping branches and extensible
|
|
# metadata, exchanges work over plain network protocols,
|
|
# performs history-sensitive merging, and delegates trust
|
|
# functions to client-side RSA certificates.
|
|
### END INIT INFO
|
|
|
|
# Source function library.
|
|
. /etc/rc.d/init.d/functions
|
|
|
|
# Source networking configuration.
|
|
. /etc/sysconfig/network
|
|
|
|
# Check that networking is up.
|
|
[ ${NETWORKING} = "no" ] && exit 0
|
|
|
|
# Get configuration settings.
|
|
[ -f /etc/sysconfig/monotone ] && . /etc/sysconfig/monotone
|
|
|
|
# By default it's all good
|
|
RETVAL=0
|
|
|
|
MT=/usr/bin/mtn
|
|
MTSERVER=/usr/sbin/monotone-server
|
|
MONOTONE_PIDFILE=/var/run/monotone/monotone-server.pid
|
|
MONOTONE_LOGFILE=${MONOTONE_LOGFILE:-/var/log/monotone.log}
|
|
MONOTONE_OLDDB=/var/db/monotone/server.db
|
|
MONOTONE_OLDDBFILE=/var/db/monotone/server.mtn
|
|
MONOTONE_OLDPPFILE=/var/db/monotone/passphrase.lua
|
|
|
|
random_passphrase()
|
|
{
|
|
# As of 0.22, 32 chars is the maximum pass phrase length.
|
|
dd if=/dev/urandom bs=32 count=1 2> /dev/null | md5sum |
|
|
{ read sum rest; echo $sum; }
|
|
}
|
|
|
|
umask 077
|
|
|
|
check_db_version()
|
|
{
|
|
db_version=`runuser -s /bin/bash - ${MONOTONE_USER:-monotone} \
|
|
-c "LC_ALL=C \
|
|
$MT $MONOTONE_RCOPTS $MONOTONE_DBOPTS \
|
|
db version"` || exit 2
|
|
set -- $db_version
|
|
[ "$5" == "(usable)" ]
|
|
return $?
|
|
}
|
|
|
|
# See how we were called.
|
|
case "$1" in
|
|
start)
|
|
if [ -e $MONOTONE_OLDDBFILE -a ! -e $MONOTONE_DBFILE ]; then
|
|
echo -n $"Moving" "$MONOTONE_OLDDBFILE" $"to" "$MONOTONE_DBFILE"
|
|
if mv "$MONOTONE_OLDDBFILE" "$MONOTONE_DBFILE"; then
|
|
failure
|
|
echo
|
|
exit
|
|
else
|
|
success
|
|
echo
|
|
fi
|
|
rmdir 2> /dev/null /var/db/monotone
|
|
fi
|
|
if [ -e $MONOTONE_DBFILE ]; then
|
|
check_db_version || $0 migrate
|
|
elif [ -e $MONOTONE_OLDDB ]; then
|
|
echo -n $"Pre-0.26 monotone database must be migrated by hand: "
|
|
failure
|
|
echo
|
|
false
|
|
else
|
|
$0 init
|
|
fi
|
|
RETVAL=$?
|
|
if [ $RETVAL = 0 ] && [ "x`ls $MONOTONE_KEYDIR`" = x ]; then
|
|
$0 genkey
|
|
RETVAL=$?
|
|
fi
|
|
if [ $RETVAL = 0 ]; then
|
|
# Start daemon.
|
|
echo -n $"Starting monotone server: "
|
|
{
|
|
exec 3>> $MONOTONE_LOGFILE &&
|
|
echo >&3 "Server restart at `date`" &&
|
|
daemon --user=${MONOTONE_USER:-monotone} \
|
|
--pidfile $MONOTONE_PIDFILE \
|
|
$MTSERVER \
|
|
$MONOTONE_RCOPTS $MONOTONE_DBOPTS $MONOTONE_PPOPTS \
|
|
serve --pid-file=$MONOTONE_PIDFILE \
|
|
"$MONOTONE_SERVE_OPTS" ">&3 2>&3 &"
|
|
} && success || failure
|
|
RETVAL=$?
|
|
echo
|
|
fi
|
|
[ $RETVAL = 0 ] && touch /var/lock/subsys/monotone
|
|
;;
|
|
stop)
|
|
# Stop daemons.
|
|
echo -n $"Stopping monotone server: "
|
|
killproc -p $MONOTONE_PIDFILE $MTSERVER
|
|
RETVAL=$?
|
|
rm -f $MONOTONE_PIDFILE
|
|
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/monotone
|
|
echo
|
|
;;
|
|
restart|force-reload)
|
|
$0 stop
|
|
$0 start
|
|
;;
|
|
condrestart|try-restart)
|
|
[ -e /var/lock/subsys/monotone ] && $0 restart
|
|
;;
|
|
status)
|
|
status -p $MONOTONE_PIDFILE monotone-server
|
|
RETVAL=$?
|
|
;;
|
|
init)
|
|
echo -n $"Initializing database" "${MONOTONE_DBFILE}: "
|
|
{ [ -d /var/lib/monotone ] ||
|
|
/usr/bin/install -o ${MONOTONE_USER:-monotone} \
|
|
-g ${MONOTONE_GROUP:-monotone} \
|
|
-m 0770 -d /var/lib/monotone; } &&
|
|
runuser -s /bin/bash - ${MONOTONE_USER:-monotone} -c "umask 007; \
|
|
$MT $MONOTONE_RCOPTS $MONOTONE_DBOPTS db init" &&
|
|
success $"database initialization" ||
|
|
failure $"database initialization"
|
|
RETVAL=$?
|
|
echo
|
|
;;
|
|
genkey)
|
|
MONOTONE_KEYID=${2:-${MONOTONE_KEYID:-monotone@`/bin/hostname -f`}}
|
|
MONOTONE_PPFILE=${MONOTONE_PPFILE:-/etc/monotone/passphrase.lua}
|
|
if [ -s "$MONOTONE_PPFILE" -a -s "$MONOTONE_KEYDIR/$MONOTONE_KEYID" ]
|
|
then
|
|
echo >&2 "$0:" $"Server key already installed"
|
|
echo >&2 "$0:" $"To lose old key remove file" "$MONOTONE_PPFILE"
|
|
exit 1
|
|
fi
|
|
echo -n $"Generating RSA key for server $MONOTONE_KEYID"
|
|
tmp=/tmp/mtserver$$
|
|
if
|
|
passphrase=`random_passphrase` &&
|
|
{ echo $passphrase; echo $passphrase; } |
|
|
(umask 027; $MT $MONOTONE_RCOPTS $MONOTONE_DBOPTS \
|
|
genkey $MONOTONE_KEYID > /dev/null 2>&1) &&
|
|
/bin/chgrp ${MONOTONE_GROUP:-monotone} \
|
|
"$MONOTONE_KEYDIR/$MONOTONE_KEYID" &&
|
|
/bin/chmod 0640 "$MONOTONE_KEYDIR/$MONOTONE_KEYID" &&
|
|
cat > $tmp <<EOF &&
|
|
function get_passphrase(keyid)
|
|
return "$passphrase"
|
|
end
|
|
EOF
|
|
/usr/bin/install -o root -g ${MONOTONE_GROUP:-monotone} \
|
|
-m 0440 $tmp ${MONOTONE_PPFILE}
|
|
then
|
|
success $"key generation"
|
|
else
|
|
failure $"key generation"
|
|
fi
|
|
RETVAL=$?
|
|
rm -f $tmp
|
|
echo
|
|
;;
|
|
migrate)
|
|
RETVAL=0
|
|
if [ ! -e $MONOTONE_PPFILE ] && [ -e $MONOTONE_OLDPPFILE ]; then
|
|
echo -n $"Moving old server passphrase file to new location: "
|
|
/usr/bin/install -o root -g ${MONOTONE_GROUP:-monotone} \
|
|
-m 0440 \
|
|
$MONOTONE_OLDPPFILE ${MONOTONE_PPFILE} &&
|
|
success $"move passphrase file" ||
|
|
failure $"move passphrase file"
|
|
RETVAL=$?
|
|
echo
|
|
fi
|
|
[ $RETVAL -eq 0 ] || exit $RETVAL
|
|
# Note this must run as root in case migration is writing
|
|
# into /etc/monotone/private-keys.
|
|
echo $"Checking database format in" "${MONOTONE_DBFILE}:"
|
|
(umask 027
|
|
$MT $MONOTONE_RCOPTS $MONOTONE_DBOPTS $MONOTONE_PPOPTS db migrate &&
|
|
$MT $MONOTONE_RCOPTS $MONOTONE_DBOPTS $MONOTONE_PPOPTS db regenerate_caches &&
|
|
/bin/chgrp -R ${MONOTONE_GROUP:-monotone} $MONOTONE_KEYDIR)
|
|
success $"database check" ||
|
|
failure $"database check"
|
|
RETVAL=$?
|
|
echo
|
|
;;
|
|
# Use "monotone pubkey me@my.com | service monotone import"
|
|
# to import the first keys to enable in /etc/monotone/write-permission.
|
|
# Thereafter, those with write permission can add other keys via
|
|
# netsync with "monotone push --key-to-push=IDENT" and then IDENT
|
|
# can be used in the read-permission and write-permission files.
|
|
import)
|
|
echo -n $"Importing packets to monotone database: "
|
|
runuser -s /bin/bash - ${MONOTONE_USER:-monotone} -c "umask 007; \
|
|
$MT $MONOTONE_RCOPTS $MONOTONE_DBOPTS read" &&
|
|
success $"packet import" ||
|
|
failure $"packet import"
|
|
RETVAL=$?
|
|
echo
|
|
;;
|
|
*)
|
|
echo "\
|
|
Usage: $0 {start|stop|restart|status|condrestart|init|import|genkey [IDENT]}"
|
|
RETVAL=1
|
|
;;
|
|
esac
|
|
|
|
exit $RETVAL
|