Savannah BackEnd Setup

This page describes the configuration needed for savannah's new backend server and perl/python code (e.g. the scripts that run on vcs0 which create new repositories for the projects based on database updates from the frontend).

Further reading about savannah's server:

General information

Long ago, savannah's used a single server. This lead to the frontend code (php) and backend scripts (perl/python) to reside in the same repository, and rely on similar configuration files.

Despite using the same repository, the frontend code does not use the Perl/python backend scripts, and the backend side (e.g. vcs0) does not use the frontend's php code. See FrontEndSetup for complimentary details about the frontend.

vcs0 needs to run sv_groups to create new repositories for new projects (or existing projects which enabled new repositories using the "Select Features" menu option on the savannah web site). download0 needs to run sv_groups to create the 'download/releases' directory for projects. internal0 needs to run sv_mailman, sv_reminder,sv_cleaner as cronjobs. See SavannahInternals For more details about the scripts and cronjobs (although they describe the setup on the current/old VMs, we aim to replicate a similar setup on the new VMs).

The following installation has been executed on all servers: vcs0,frontend0, download0,internal0 - using the scripts should work identically, regardless of which server they are run on.

Install prerequisites:

apt-get install -y imagemagick gettext
cpan -i Mail::Send

As root, create the required directories. /etc/savane is temporarily created with write-access (for the 'make install' step as non-root user), and will be made read-only after the installation is complete.

mkdir -p /opt/savannah /etc/savane
chgrp staff /opt/savannah /etc/savane
chmod g+ws /opt/savannah /etc/savane

As non-root (e.g. agn), clone the savage repository. The nextgen branch holds the latest updates for the code on the new machines:

cd /opt/savannah
git clone -b nextgen git://
cd savane/
./configure --prefix=/opt/savannah/ --sysconfdir=/etc
make install

The resulting files:

$ ls -l /opt/savannah/
total 8
drwxrwsr-x 2 agn staff 4096 Oct 19 21:23 bin
drwxrwsr-x 3 agn staff 4096 Oct 19 21:09 lib
drwxrwsr-x 3 agn staff 4096 Oct 19 21:09 savane
drwxrwsr-x 3 agn staff 4096 Oct 19 21:09 share

Savannah's common backend scripts:

$ ls /opt/savannah/bin

Savannah's perl modules:

$ cd /opt/savannah/
$ find ./lib/ -type f

$ find ./share/ -type f

UGLY HACK: Symlink the Savane perl module to the server's sitelib. This alleviate the need to set custom PERL5LIB, while keep all of savannah's custom code under /opt/savannah. Improving this is a desired TODO item (by either doing away with or changing the perl script to self-locate the required modules. See SavannahHackingIdeas).

ln -sf /opt/savannah/share/perl/5.18.2/Savane /usr/local/share/perl/5.18.2
ln -sf /opt/savannah/share/perl/5.18.2/ /usr/local/share/perl/5.18.2

Manually prepare configuration files (passwords copied from frontend0). The .pl file is used by perl scripts (e.g. sv_groups). The .ini file is used by python scripts (e.g. sv_tmpgpg). NOTE: On internal0, set the HOST to localhost instead of

$ cd /etc/savane
$ scp frontend0:/etc/savane/savane.{pass,ini,} .

$ cat /etc/savane/savane.pass

$ cat /etc/savane/savane.ini

$ cat /etc/savane/
our $sys_dbhost="";
our $sys_dbname="savane";
our $sys_dbuser="savannahscripts";
open(IN, '<'.dirname(__FILE__).'/savane.pass');
our $sys_dbpasswd = <IN>;

On vcs0,download0,internal0 - lock permissions on the configuration/passwords files.

NOTE: DO NOT run these commands on frontend0. Frontend0's files require special permissions to ensure apache can access these files. See FrontEndSetup for detail.

cd /etc/savane/
chown root:staff savane.*
chmod 0640 savane.*

# remove 'content' - it's only used by the frontend's php
# DO NOT REMOVE IT ON frontend0...
rm -r content

# ls -l /etc/savane/
total 16
-rw-r----- 1 root staff 8563 Oct 19 21:29
-rw-r----- 1 root staff   82 Oct 19 22:36 savane.ini
-rw-r----- 1 root staff    9 Oct 19 21:29 savane.pass

# and lock the directory
chmod g-w /etc/savane

Test the scripts, ensuring the perl modules and DB are working:

### This is equivalent to what OpenSSH is using to find the
### users' keys when they log with SSH to .
### The users' keys are stored in savane's database.

$ cd /opt/savannah/bin
$ export PERL5LIB=/opt/savannah/share/perl/5.18.2
$ ./sv_get_authorized_keys agn | cut -b1-40
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvsw+

The script sv_groups writes log messages to hard-coded path, created it with 'staff' permissions:

touch /var/log/sv_database2system.log
chown root:adm /var/log/sv_database2system.log

FIXME: sv_groups also uses a lock file named groups-users.lock - not sure where it is stored.

Initial testing of 'sv_groups': As NON-ROOT user (e.g. agn), run:

cd /opt/savannah/usr/bin
./sv_groups --only-git --debug

This will show demonstrate how 'sv_groups' scans the groups (=projects) in the savane database, and for each one, checks if the repositories directories exist.

FIXME: Check with new project or modified repositories type (e.g. git,hg/svn).

FIXME: The log file /var/log/sv_database2system.log emits the following message, is this relevant / should we create this user on vcs0?

[sv_groups] Wed Oct 19 21:54:40 2016 ---- groupadd -g 77955 anoncvs (required by the savane backend)