Parcourir la source

add the possibility to run a dedicated Monotone server for a central database

Ralf S. Engelschall il y a 19 ans
Parent
commit
dac5af0d5e
3 fichiers modifiés avec 220 ajouts et 2 suppressions
  1. 88 0
      monotone/monotone-setup.sh
  2. 61 2
      monotone/monotone.spec
  3. 71 0
      monotone/rc.monotone

+ 88 - 0
monotone/monotone-setup.sh

@@ -0,0 +1,88 @@
+#!/bin/sh
+##
+##  monotone-setup.sh -- Monotone server setup
+##
+
+#   minimum command line argument handling
+if [ $# -eq 0 ]; then
+    echo "Usage: $0 install [<server-mail-address> [<server-password>]]"
+    echo "Usage: $0 uninstall"
+    exit 1
+fi
+cmd="$1"
+shift
+
+#   dispatch command
+case "$cmd" in
+    install )
+        #   determine server address
+        server_address="$1"
+        if [ ".$server_address" = . ]; then
+           server_address=`@l_shtool@ echo -e "monotone-server@%h%d"`
+        fi
+        echo "++ server address: \"$server_address\""
+
+        #   determine server key password
+        server_password="$2"
+        if [ ".$server_password" = . ]; then
+            server_password="`@l_prefix@/bin/apg -Mncl -a1 -m12 -n1`"
+        fi
+        echo "++ server password: \"$server_password\""
+
+        #   generate database
+        echo "++ generating database \"@l_prefix@/var/monotone/monotone.db\""
+        @l_prefix@/bin/mtn \
+            db init --db="@l_prefix@/var/monotone/monotone.db"
+        chown @l_rusr@:@l_rgrp@ @l_prefix@/var/monotone/monotone.db
+        chmod 664 @l_prefix@/var/monotone/monotone.db
+
+        #   generate server key
+        echo "++ generating server key \"@l_prefix@/etc/monotone/keys/$server_address\""
+        mkdir @l_prefix@/etc/monotone/keys 2>&1 || true
+        chown @l_rusr@:@l_rgrp@ @l_prefix@/etc/monotone/keys
+        chmod 775 @l_prefix@/etc/monotone/keys
+        ( echo "$server_password"
+          echo "$server_password"
+        ) | @l_prefix@/bin/mtn \
+            --keydir="@l_prefix@/etc/monotone/keys/" \
+            genkey "$server_address" >/dev/null 2>&1
+        chown @l_rusr@:@l_rgrp@ "@l_prefix@/etc/monotone/keys/$server_address"
+        chmod 664 "@l_prefix@/etc/monotone/keys/$server_address"
+
+        #   setting up ACLs
+        echo "++ setting up server ACLs \"@l_prefix@/etc/monotone/{read,write}-permissions\""
+        ( echo "comment \"provide read access to anonymous/nil and others\""
+          echo "pattern \"*\""
+          echo "allow \"nil\""
+          echo "allow \"*\""
+        ) >@l_prefix@/etc/monotone/read-permissions
+        ( echo "comment \"provide write access everyone except anonymous/nil\""
+          echo "deny \"nil\""
+          echo "allow \"*\""
+        ) >@l_prefix@/etc/monotone/write-permissions
+        chown @l_rusr@:@l_rgrp@ @l_prefix@/etc/monotone/read-permissions
+        chown @l_rusr@:@l_rgrp@ @l_prefix@/etc/monotone/write-permissions
+        chmod 600 @l_prefix@/etc/monotone/read-permissions
+        chmod 600 @l_prefix@/etc/monotone/write-permissions
+
+        #   setting up configuration script
+        echo "++ setting up server configuration script \"@l_prefix@/etc/monotone/monotonerc\""
+        ( echo "function get_passphrase(keypair_id)"
+          echo "    return \"$server_password\""
+          echo "end"
+        ) >@l_prefix@/etc/monotone/monotonerc
+        chown @l_rusr@:@l_rgrp@ @l_prefix@/etc/monotone/monotonerc
+        chmod 600 @l_prefix@/etc/monotone/monotonerc
+        ;;
+
+    uninstall )
+        #   remove server and database related files
+        echo "++ removing server and database related files"
+        rm -f @l_prefix@/etc/monotone/monotonerc 2>&1 || true
+        rm -f @l_prefix@/etc/monotone/read-permissions 2>&1 || true
+        rm -f @l_prefix@/etc/monotone/write-permissions 2>&1 || true
+        rm -rf @l_prefix@/etc/monotone/keys 2>&1 || true
+        rm -f @l_prefix@/var/monotone/monotone.db 2>&1 || true
+        ;;
+esac
+

+ 61 - 2
monotone/monotone.spec

@@ -37,12 +37,14 @@ Release:      20070127
 
 #   list of sources
 Source0:      http://venge.net/monotone/downloads/monotone-%{version}.tar.gz
+Source1:      rc.monotone
+Source3:      monotone-setup.sh
 
 #   build information
 Prefix:       %{l_prefix}
 BuildRoot:    %{l_buildroot}
 BuildPreReq:  OpenPKG, openpkg >= 20040130, gcc, gcc::with_cxx = yes
-PreReq:       OpenPKG, openpkg >= 20040130
+PreReq:       OpenPKG, openpkg >= 20040130, apg
 BuildPreReq:  boost, zlib
 PreReq:       boost, zlib
 AutoReq:      no
@@ -68,6 +70,7 @@ AutoReqProv:  no
     %setup -q
 
 %build
+    #   configure program
     CC="%{l_cc}" \
     CXX="%{l_cxx}" \
     CFLAGS="%{l_cflags -O}" \
@@ -80,23 +83,79 @@ AutoReqProv:  no
         --mandir=%{l_prefix}/man \
         --enable-static-boost=%{l_prefix} \
         --disable-nls
+
+    #   build program
     %{l_make} %{l_mflags -O}
 
 %install
+    #   install program
     rm -rf $RPM_BUILD_ROOT
     %{l_make} %{l_mflags} install AM_MAKEFLAGS="DESTDIR=$RPM_BUILD_ROOT"
+
+    #   strip down installation
     strip $RPM_BUILD_ROOT%{l_prefix}/bin/* >/dev/null 2>&1 || true
     mv $RPM_BUILD_ROOT%{l_prefix}/share/doc/monotone \
        $RPM_BUILD_ROOT%{l_prefix}/share/monotone
     rm -f $RPM_BUILD_ROOT%{l_prefix}/info/dir
     rm -rf $RPM_BUILD_ROOT%{l_prefix}/share/locale
     rm -rf $RPM_BUILD_ROOT%{l_prefix}/share/doc
+
+    #   install setup script
+    %{l_shtool} mkdir -f -p -m 755 \
+        $RPM_BUILD_ROOT%{l_prefix}/sbin
+    %{l_shtool} install -c -m 755 %{l_value -s -a} \
+        -e 's;@l_shtool@;%{l_shtool};g' \
+        %{SOURCE monotone-setup.sh} \
+        $RPM_BUILD_ROOT%{l_prefix}/sbin/monotone-setup
+
+    #   install run-command script
+    %{l_shtool} mkdir -f -p -m 755 \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d
+    %{l_shtool} install -c -m 755 %{l_value -s -a} \
+        %{SOURCE rc.monotone} \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/
+
+    #   create additional directories for server operation
+    %{l_shtool} mkdir -f -p -m 755 \
+        $RPM_BUILD_ROOT%{l_prefix}/etc/monotone \
+        $RPM_BUILD_ROOT%{l_prefix}/var/monotone
+
+    #   determine installation files
     %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT \
         %{l_files_std} \
-        '%doc %{l_prefix}/share/monotone/*'
+        '%config %{l_prefix}/etc/monotone/*' \
+        '%doc %{l_prefix}/share/monotone/*' \
+        '%attr(-,%{l_rusr},%{l_rgrp}) %{l_prefix}/var/monotone'
 
 %files -f files
 
 %clean
     rm -rf $RPM_BUILD_ROOT
 
+%post
+    if [ $1 -eq 1 ]; then
+        #   display initial hint
+        ( echo "If you want to use the Monotone daemon for serving"
+          echo "a central permanently available database, run:"
+          echo "    $RPM_INSTALL_PREFIX/sbin/monotone-setup install \\ "
+          echo "        [<server-mail-address> [<server-password>]]"
+          echo "and put into your $RPM_INSTALL_PREFIX/etc/rc.conf at least:"
+          echo "    monotone_daemon=\"yes\""
+          echo "    monotone_daemon_host=\"<server-ip-address>\""
+        ) | %{l_rpmtool} msg -b -t notice
+    elif [ $1 -eq 2 ]; then
+        #   after upgrade, restart service
+        eval `%{l_rc} monotone status 2>/dev/null`
+        [ ".$monotone_active" = .yes ] && %{l_rc} monotone restart
+    fi
+    exit 0
+
+%preun
+    if [ $1 -eq 0 ]; then
+        #   before erase, stop service and remove log files
+        %{l_rc} monotone stop 2>/dev/null
+        $RPM_INSTALL_PREFIX/sbin/monotone-setup uninstall    >/dev/null 2>&1 || true
+        rm -f $RPM_INSTALL_PREFIX/var/monotone/monotone.log* >/dev/null 2>&1 || true
+    fi
+    exit 0
+

+ 71 - 0
monotone/rc.monotone

@@ -0,0 +1,71 @@
+#!@l_prefix@/bin/openpkg rc
+##
+##  rc.monotone -- Run-Commands
+##
+
+%config
+    monotone_enable="$openpkg_rc_def"
+    monotone_daemon="no"
+    monotone_daemon_host="127.0.0.1"
+    monotone_daemon_port="4691"
+    monotone_daemon_dbfile="@l_prefix@/var/monotone/monotone.db"
+    monotone_log_prolog="true"
+    monotone_log_epilog="true"
+    monotone_log_numfiles="10"
+    monotone_log_minsize="1M"
+    monotone_log_complevel="9"
+
+%common
+    monotone_daemon_etcdir="@l_prefix@/etc/monotone"
+    monotone_daemon_pidfile="@l_prefix@/var/monotone/monotone.pid"
+    monotone_daemon_logfile="@l_prefix@/var/monotone/monotone.log"
+    monotone_signal () {
+        [ -f $monotone_daemon_pidfile ] && kill -$1 `cat $monotone_daemon_pidfile`
+    }
+
+%status -u @l_rusr@ -o
+    monotone_usable="unknown"
+    monotone_active="no"
+    rcService monotone enable yes && \
+        monotone_signal 0 && monotone_active="yes"
+    echo "monotone_enable=\"$monotone_enable\""
+    echo "monotone_usable=\"$monotone_usable\""
+    echo "monotone_active=\"$monotone_active\""
+
+%start -u @l_rusr@
+    rcService monotone enable yes || exit 0
+    rcService monotone active yes && exit 0
+    if rcVarIsYes monotone_daemon; then
+        ( nohup @l_prefix@/bin/mtn serve \
+            --bind="$monotone_daemon_host:$monotone_daemon_port" \
+            --confdir="$monotone_daemon_etcdir" \
+            --keydir="$monotone_daemon_etcdir/keys" \
+            --log="$monotone_daemon_logfile" \
+            --db="$monotone_daemon_dbfile" \
+            --pid-file="$monotone_daemon_pidfile" &
+        ) >/dev/null 2>&1
+    fi
+
+%stop -u @l_rusr@
+    rcService monotone enable yes || exit 0
+    rcService monotone active no  && exit 0
+    if rcVarIsYes monotone_daemon; then
+        monotone_signal TERM
+        sleep 2
+        rm -f $monotone_daemon_pidfile 2>/dev/null || true
+    fi
+
+%restart -u @l_rusr@
+    rcService monotone enable yes || exit 0
+    rcService monotone active no  && exit 0
+    rc monotone stop start
+
+%daily -u @l_rusr@
+    rcService monotone enable yes || exit 0
+    shtool rotate -f \
+        -n $monotone_log_numfiles -s $monotone_log_minsize -d \
+        -z $monotone_log_complevel -m 664 -o @l_rusr@ -g @l_rgrp@ \
+        -P "$monotone_log_prolog" \
+        -E "$monotone_log_epilog" \
+        $monotone_daemon_logfile
+