Site Logo

IzzySoft


Das Inoffizielle Android-HandbuchAndroid kennenlernen, Tipps & TricksDas Inoffizielle Android-Handbuch
Android kennenlernen, Tipps & Tricks
Für EUR 2,00 bei Amazon kaufen
Das Inoffizielle Android SystemhandbuchTiefer ins System einsteigenDas Inoffizielle Android Systemhandbuch
Tiefer ins System einsteigen
Für EUR 7,00 bei Amazon kaufen
Die besten Android-AppsDen Androiden austattenDie besten Android-Apps
Den Androiden austatten
Für EUR 5,00 bei Amazon kaufen
 
Software Liste Dokumentationen Demos Artikel

Trac mit SVN

Nun haben wir SVN am Laufen: Unsere Anwender können Code auschecken, unsere Entwickler auch noch einchecken, die Repositories können per Web eingesehen werden – was wollen wir mehr? Klar doch, ein nettes Projekt-Management! Mit Trac gibt es da etwas feines, was wir uns näher ansehen sollten.

Interessiert? Dann schauen wir mal, dass wir das auch noch installiert und angepasst bekommen. Ein paar PlugIns packen wir auch gleich noch drauf – wenn schon, denn schon. Und natürlich bringen wir auch unsere Projekte wieder automatisiert auf Trab – wie wir das bereits bei SVN gemacht haben. Folgendes steht uns dann schließlich für jedes Projekt u. a. zur Verfügung:

Das soll nur eine grobe Übersicht geben. Alles im Einzelnen zu erklären, würde dieses Dokument sprengen …

Inhalt

Software installieren

War ja wieder einmal klar: Software muss zunächst installiert werden. Wie üblich, gibt es die aktuelle Trac-Version natürlich auch nicht als fertiges Paket - aber auch damit werden wir locker fertig. Die Abhängigkeiten lassen sich nun aber leichter erfüllen als seinerzeit mit der Vorgängerversion.

Voraussetzungen

Installation

Als Webserver setzen wir wieder auf den Apachen, verwenden aber aus Performance-Gründen statt mod_python lieber mod_wsgi. Dies findet sich u. a. im Repository von IzzySoft (für Hardy Heron; mittlerweile aber sicher auch in den offiziellen Repos), eine Installation ist daher einfach mit apt-get install apache2-mod-wsgi möglich.

Ubuntu und Apache wird hier als bereits installiert und konfiguriert vorausgesetzt, ModWSGI haben wir im vorigen Absatz abgehandelt – kümmern wir uns also um die anderen Abhängigkeiten:

#!/bin/bash
# Trac Installation. Adapt this to your needs before running

# Install dependencies
sudo apt-get install python2.5 python-support python-clearsilver python-pysqlite2 python-subversion python-imaging
sudo easy_install Genshi
# this one needs the Repo of IzzySoft (http://apt.izzysoft.de/)
sudo apt-get install apache2-mod-wsgi
# some directory to place sources in - you may chose any
cd /usr/local/src
# checkout the latest stable Trac from SVN
svn co http://svn.edgewall.org/repos/trac/branches/0.11-stable trac11-stable
cd trac11-stable
# obtain and apply a patch for better table-header formatting ( ||= HeaderCol1 =||= HeaderCol2 =|| )
wget http://trac.edgewall.org/raw-attachment/ticket/3347/3347_TableHeaders_NicerFormat.diff
patch -p0 -i 3347_TableHeaders_NicerFormat.diff
# and finally install Trac
sudo easy_install .

Apache konfigurieren

Als nächstes konfigurieren wir den Apachen. Hier brauchen wir einen zusätzlichen Block für unsere Trac Installation. Dieser kann entweder in die globale Konfiguration oder aber in einen virtuellen Server eingefügt werden - je nach Bedarf – und eine detaillierte Beschreibung findet sich here. Wir gehen nun davon aus, dass wir mehrere Trac-Instanzen (je eine pro Projekt) nutzen wollen (für die andere Varianten bitte an erwähnter Stelle nachlesen).

WSGIScriptAlias /trac /usr/local/trac-apache/trac.wsgi

<Directory /usr/local/trac>
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
#  <Location "/trac/*/login">
#    AuthType Basic
#    AuthName "Trac Repositories"
#    AuthUserFile /etc/apache2/.trac
#    Require valid-user
#  </Location>

Ein Teil der Konfiguration ist absichtlich auskommentiert: Die Authentifizierung erledigen wir wieder über das AccountManager PlugIn, weshalb wir das hier eigentlich gar nicht brauchen. Kann aber nicht schaden, es für den Fall des Falles parat zu haben, und einfach aktivieren zu können.

Nun brauchen wir noch das als WSGIScriptAlias angegebene Skript an der ebenfalls angegebenen Stelle:

import sys
sys.stdout = sys.stderr

import os
os.environ['TRAC_ENV_PARENT_DIR'] = '/usr/local/trac'
os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/.egg-cache'

import trac.web.main

application = trac.web.main.dispatch_request

PlugIns installieren

Wir können den Hals halt nicht voll genug kriegen – also erweitern wir unsere Installation schon, bevor wir sie überhaupt angeschaut haben … Bei den PlugIns ist hier darauf zu achten, dass sie zur installierten Trac Version passen müssen. Wir haben hier eine v0.11.x – also wählen wir auch die passenden PlugIns aus. Dank "Easy Install" geht die Installation auch recht flott über die Bühne. Wer das eine oder andere PlugIn nicht mag: Einfach auskommentieren bzw. überspringen. Auf jeden Fall installiert werden sollten jedoch: AccountManager und WebAdmin. Letzterer ist zwar bereits in Trac 0.11 integriert, wird aber von einigen Plugins nach wie vor als Abhängigkeit gefordert.

#!/bin/bash
# Install some useful Trac plugins (simply comment out those you don't want)
#
# The WebAdmin (is already integrated in 0.11+ - but some plugins need it)
easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin/
# The AccountManager
easy_install http://trac-hacks.org/svn/accountmanagerplugin/trunk/
# Not good enough? Make it nicer?
easy_install http://trac-hacks.org/svn/usermanagerplugin/0.11/
# IniAdmin
easy_install http://trac-hacks.org/svn/iniadminplugin/0.11/
# And we HATE SPAMMERS!
easy_install http://svn.edgewall.com/repos/trac/sandbox/spam-filter/
# MediaWikiPluginMacro - turn your wiki to support MediaWiki syntax
easy_install http://trac-hacks.org/svn/mediawikipluginmacro/
# TOC PlugIn (auto-generate table of contents)
easy_install http://trac-hacks.org/svn/tocmacro/0.11/
# Acronyms support for the Wiki
easy_install http://trac-hacks.org/svn/acronymsplugin/0.11/
# If you want to include external pages into your Wiki [Include(http://www.domain.com/page)]
easy_install http://trac-hacks.org/svn/includemacro/0.11/
# MultiLang support - and nicer indexes (yes, it is 0.10 - but works on 0.11)
easy_install http://trac-hacks.org/svn/tracwikinegotiatorplugin/0.10/
# TicketDelete PlugIn (get rid of spam tickets)
easy_install http://trac-hacks.org/svn/ticketdeleteplugin/0.11/
# TracWysiwygPlugin - for better Wiki editing
easy_install http://trac-hacks.org/svn/tracwysiwygplugin/0.11/
# Graphical Statistics Plugin
easy_install http://trac-hacks.org/svn/stractisticsplugin/0.10/tags/0.4.2/
# Tags PlugIn (needed for ScreenshotsPlugin - and either useful itself)
easy_install http://trac-hacks.org/svn/tagsplugin/trunk/
# ScreenshotsPlugin - Maintain and use screenshots
easy_install http://trac-hacks.org/svn/screenshotsplugin/0.11/
# TracDownloaderPlugin to manage Downloads
easy_install http://trac-hacks.org/svn/tracdownloaderplugin/0.11/
# Now, having quite a bunch of PlugIns installed, you may need to cleanup your navbar:
easy_install http://trac-hacks.org/svn/navcontrolplugin/0.11/

Damit wäre das globale Setup beendet, und nur mal so zum Spaß lassen wir es krachen, indem wir dem Apachen einen Schuss verpassen (ja, das muss sein):

/etc/init.d/apache2 restart

Einige PlugIns erfordern nach ihrer Installation (bzw. Aktivierung für ein Projekt) ein Upgrade der betreffenden Projekte - siehe unten.

Mehr PlugIns gefällig? Die längsten Listings finden sich hier:

Spamschutz

Spam in der Mailbox ist mittlerweile alltäglich. Aber die "bösen Jungs" haben längst auch Foren u.ä. im Visier – also kann es früher oder später auch unsere Trac-Installation erwischen. Dagegen können wir uns zum einen mit dem SpamFilter Plugin (siehe PlugIns) schützen. Der muss dann aber auch für jedes Projekt explizit konfiguriert werden. Etwas einfacher geht es, sofern Apache mit mod_security installiert ist. In diesem Fall kann uns bereits einiges an Arbeit abgenommen werden – indem bereits der Webserver einiges ausfiltert. Eine Beispiel-Konfiguration findet sich unter Skripte. Hier muss auf jeden Fall noch die URI in jeder Regel angepasst werden – sofern sie von /trac/<Projektname>/ abweicht.

Leider reicht diese Lösung heutzutage nicht mehr – daher sei das Spam-Filter Plugin wärmstens empfohlen. Auch wenn es zunächst einiger Konfiguration bedarf: Spätestens wenn die ersten Spammer die neue Trac-Installation entdeckt haben, bedauert man diesen Aufwand keinesfalls mehr!

Projekte initialisieren

Trac personalisieren

Wer neben vielen anderen Plugins auch das NavControl PlugIn installiert hat, kann die überladene Haupt-Navigation damit ein wenig aufräumen, und "überflüssige" bzw. "unpassende" Elemente entweder verbergen, oder in die Kontext-Navigation verschieben.

Projekt Defaults definieren

Jetzt wollen wir das Skript vorbereiten, mit dem wir schließlich unsere Projekte in Trac anlegen. Also selbiges bitte herunterladen, und mit dem Lieblings-Editor öffnen. Der wichtigste Teil für uns findet sich am Anfang der Datei, im Abschnitt "Configuration". Die meisten Einstellungen (Pfade etc.) sollten bereits korrekt sein, sofern die bisherige Installation gemäß diesem kleinen Tutorial durchgeführt wurde - es sind also nur noch "Kleinigkeiten" anzupassen:

Die HomePage sollte natürlich die eigene Website sein - und muss ohne Protokoll (also kein "http://" am Anfang) angegeben werden. Da diese Variable in einem regulären Ausdruck verwendet wird, müssen einige Zeichen "escaped" werden. Für http://server.example.com/my/projects sähe das dann z.B. so aus: HomePage="server.example.com\/my\/projects".

admin bezeichnet den Web-User mit vollem Zugriff auf die Projekte. Es muss kein gleichnamiger Account im Betriebssystem vorhanden sein - aber der User muss in der oben definierten htpassword Datei vorhanden sein. Nebenbei ist dies der Ort, an dem (projektübergreifend) alle User und ihre Passworte abgelegt/verwaltet werden - während ihre Zugriffsrechte projektgebunden über das WebAdmin Web-Interface gepflegt werden.

projects ist eine mit Leerzeichen getrennte Auflistung der Projekte, die in Trac eingerichtet werden sollen – jedes Projekt ein Wort (d. h. Projektnamen dürfen z.B. hier keine Leerzeichen enthalten - was aber später per WebAdmin jederzeit angepasst werden kann). Groß- und Kleinbuchstaben können gEMiSchT werden (für die Anzeige) – für Verzeichnisnamen etc. wird alles automatisch in Kleinbuchstaben umgewandelt. Die SVN Repositories werden im Verzeichnis RepoParentPath/project (Projektname in Kleinbuchstaben) erwartet, und die zugehörigen Trac Repositories in TracEnvParentDir/project (Projektname wiederum in Kleinbuchstaben) angelegt.

WikiReplace und ForumCreate sollten hier deaktiviert werden (zumindest ersteres) – die Manipulation der Wiki-Seiten und Templates können wir uns Dank des TracWikiNegotiatorPlugins sparen.

Im Grunde genommen war's das dann auch. Wer möchte, kann das Skript natürlich noch beliebig Anpassen bzw. Verfeinern - z.B. was die Zugriffsrechte (function set_perms) oder die per Default aktivierten PlugIns (function conf_activate) betrifft.

Das Skript starten

Nachdem die Vorbereitungen alle (hoffentlich erfolgreich) abgeschlossen wurden, kann das Skript nunmehr gestartet werden. Parameter erwartet es keine – wichtig ist nur, dass auch die zugehörigen Dateien im richtigen (i. d. R. also im gleichen) Verzeichnis liegen.

Abschließende Projekt-Konfiguration

Nachdem das Skript erfolgreich durchgelaufen ist, können die Projekte nunmehr abschließend konfiguriert werden. Dazu nehmen wir uns einen Web-Browser, gehen auf die Projektseite, melden uns als Administrator an, und wählen den "Admin" Tab aus. Zuerst konzentrieren wir uns auf die Abschnitte "General::Basic Settings" und "trac.ini::notification" (SMTP Einstellungen) – also die Sachen, wo auf jeden Fall noch Anpassungen nötig sind.

Noch ein paar weitere Einstellungen, die sicher angepasst werden sollen, finden sich in der Sektion "Ticket System": "Components" (Komponenten – also z.B. die Benutzer-Schnittstelle, Konfiguration, einzelne Module der Software), "Milestones" (Meilensteine – z.B. geplante wichtige Releases) und "Versions" (Versionen) wären da zu nennen (wobei man letztere sicher zugunsten der Milestones gleich ganz abschaltet) – die anderen drei Elemente sollten in den meisten Fällen passen. Dann will man vielleicht auch noch das Logging (zu finden unter "General::Logging") aktivieren: Einfach als "Type" File auswählen, und den "Log Level" nicht unbedingt auf "DEBUG" belassen.

Dann schauen wir uns noch ein wenig um, was noch alles konfiguriert werden kann – vielleicht noch ein paar PlugIns aktivieren? Abschließend zur Sicherheit noch einmal den WebServer neu starten – zumindest bei Änderungen am Logging ist dies leider erforderlich.

Wenn wir schon einmal hier sind, sollten wir auch gleich auf den "Settings" Link (oberhalb der "Navigation Bar") klicken, und Namen sowie EMail Adresse eintragen - damit wir auch Benachrichtigungen empfangen können.

Troubleshooting

Internal Server Error

Das passiert ab und an – kein Grund zur Panik. Und ja nicht behaupten, man hätte doch gar nix gemacht – hat man mit Sicherheit! Also, was tun? Zuerst schauen wir ins ErrorLog des Web-Servers. Höchstwahrscheinlich finden wir hier am Ende einen Eintrag wie

PythonHandler trac.web.modpython_frontend: TracError: The Trac Environment needs to be upgraded. Run trac-admin /usr/local/trac/project upgrade", referer: http://server.example.com/trac/project/

Der Grund ist in den meisten Fällen, dass man ein neues PlugIn installiert bzw. im entsprechenden Projekt aktiviert hat. Was zu tun ist, hat die Fehlermeldung uns ja netterweise bereits verraten: trac-admin /usr/local/trac/project upgrade.

Der Eintrag im ErrorLog könnte natürlich auch anders aussehen – vielleicht so:

PythonHandler trac.web.modpython_frontend: IOError: zipimport: can not open file /usr/lib/python2.4/site-packages/TracProjectMenu-1.0-py2.4.egg, referer: http://server.example.com/trac/project/settings

Tja, das ist gaaanz was anderes – nämlich das genaue Gegenteil: Ein global installiertes PlugIn wurde einfach mal eben entfernt. Wer macht denn sowas?!? Nungut, was ist zu tun? Zunächst einmal gilt es, die trac.ini aller Projekte zu inspizieren, ob das PlugIn dort noch aktiviert ist. Ist dem so, muss die entsprechende Zeile aus der [components] Sektion entfernt werden. Anschließend ist der Webserver neu zu starten: /etc/init.d/apache restart. Was übrigens auch dann eine gute Idee ist, wenn man keinen anderen Fehler finden kann. Echt.

[text] Einen haben wir noch:

PythonHandler trac.web.modpython_frontend: IOError: [Errno 13] Permission denied: u'/usr/local/trac/project/log/trac.log'

Das passiert z.B. dann, wenn man (als root) trac-admin <Pfad> permission add … zu einem Zeitpunkt laufen lässt, zu dem für das betreffende Projekt noch kein Logfile existiert. Das wird dann u. U. angelegt (nämlich dann, wenn man gerade zuvor das Logging für das Projekt aktiviert hat) – und zwar im Kontext des aufrufenden Benutzers. Das wäre in diesem Fall root. Der User, unter dem Trac eigentlich läuft (i. d. R. www-data), kann dann nicht mehr schreibend darauf zugreifen.

Beheben lässt sich das ganz einfach: chmod -R www-data:www-data /usr/share/trac. Wer weiß, wo noch was liegt – und schließlich sollte alles unterhalb von /usr/share/trac dem Trac gehören. Wer will, kann daher auch gleich einen Cron-Job dafür einrichten, damit sich dieses Problem täglich von selbst löst … Achja: Diesmal ist ausnahmsweise einmal kein Neustart des Apachen nötig.

Globale PlugIns entfernen

Das globale Installieren eines PlugIns ist dank easy_install ja wirklich einfach. Nur leider hat der Hersteller hier wohl ein easy_uninstall vergessen. Wie ist das also nun zu bewerkstelligen? Jaja, schongut:

Um keinen internal server error zu provozieren, stellen wir zunächst sicher, dass das betreffende PlugIn auch in keinem Projekt mehr aktiv ist. Solange wir ihn noch nicht entfernt haben, können wir dies mit Hilfe des WebAdmin PlugIns bewerkstelligen. Andernfalls bzw. alternativ bleibt uns noch die oben beschriebene Methode über die trac.ini.

Alles klar soweit? Dann wenden wir uns dem Verzeichnis /usr/lib/python2.4/site-packages zu – natürlich wieder einmal als root. Hier suchen wir nach einer Datei namens easy-install.pth. In selbige schauen wir zunächst hinein, um den Dateinamen unseres Oster-Eis (*.egg) – hoppla, PlugIns, zu finden. Diese Datei wird gelöscht, und ihr Eintrag in der easy-install.pth ebenso.

Ebenfalls nachschauen sollte man noch im Cache von Python. Dieser ist entweder im Home-Verzeichnis des Users zu finden, unter dem der Apache läuft - oder aber dort, wo er in der Apache Konfiguration mit SetEnv PYTHON_EGG_CACHE <directory> festgelegt wurde. Findet sich dort ein zum fraglichen Plugin gehörendes Verzeichnis, so kann es einfach gelöscht werden. Achja, und nicht vergessen, den Web-Server neu zu starten - sonst gibt's u.U. gleich wieder einen internal server error

Benutzte Skripte

Initialisieren der Trac Umgebung

#!/bin/bash
###############################################################################
# Setting up Trac projects                        (c) 2007 by Izzy and IzzySoft
#------------------------------------------------------------------------------
# This script will help you to setup your trac projects without having to type
# too much (or to fiddle around with the commands and their syntax). Check the
# [ Configuration ] section first and adapt it to your settings and needs. You
# may (or may not) want to change the permissions (found in function set_perms)
# and/or the default configuration (in function conf_activate). Moreover, you
# for sure want to check the default wiki pages in the tracwiki.tgz (in case
# you don't want to stay with the default wikis shipped with trac). If you
# don't want to have all the help wikis in each project, you can take this
# replacement: Instead of installing them all everywhere, it replaces the links
# in the templates to point to the trac project wiki directly.
###############################################################################

#==========================================================[ Configuration ]===
# Where the trac shared files are
TracShared=/usr/share/trac
# Base directory for your Trac repositories
TracEnvParentDir=/usr/local/trac
# Where to link the logos to. Remember to escape slashes ("/" must be "\/")
HomePage="www.example.com"
# Who will be the admin (full access permissions) for the projects?
admin=john
# Space separated list of projects to establish. For path names etc., these will
# be converted to lowercase. For display, they will be used as-is. Each project
# name must be a single word
projects="MyProject OtherProject"
# DB to use for Trac
DBFile="db/trac.db"
TracDB="sqlite:$DBFile"
# Repository Type
RepoType=svn
# Base Repository for your SVN repositories. Project name (lowercase) will be
# added here, and the result should be the projects SVN Repo Path
RepoParentPath=/usr/local/svn/public
# Default Template path
TracTemplatePath=$TracShared/templates
# Replace default wiki pages by those from tracwiki.tgz ?
WikiReplace=1
# Create default forums ("Help" and "Common Discussion")? You can change the
# forums/descriptions in "function forum" below.
ForumCreate=1

#-----------------------------------------------------------------[ Colors ]---
red='\e[0;31m'
blue='\e[0;34m'
NC='\e[0m'              # No Color

#==============================================================[ Functions ]===
#-------------------------------------------------------=[ Progress Output ]=--
function say {
  echo -e "${blue}$1${NC}"
}

function alert {
  echo -e "${red}$1${NC}"
}

#--------------------------------------------=[ Replace default Wiki pages ]=--
function wiki_default {
  if [ -e $TracShared/wiki-default.ori ]; then
    say "Looks like the default wiki pages already have been replaced - skipping this step."
  else
    say "Replacing default wiki pages..."
    mv $TracShared/wiki-default $TracShared/wiki-default.ori
    cp $TracShared/templates $TracShared/templates.ori
    mkdir $TracShared/wiki-default
    tar xzf tracwiki.tgz -C "$TracShared"
  fi
}

#-------------------------------------------------=[ Activate some PlugIns ]=--
function conf_activate {
  local project="$1"
  say "Updating trac.ini ..."
  local conffile=${TracEnvParentDir}/$project/conf/trac.ini
  cp $conffile ${conffile}.$$
  cat ${conffile}.$$|sed "s/example\.org/$HomePage/g">${conffile}
  cat <<EndConf >>$conffile
[components]
acct_mgr.admin.accountmanageradminpage = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.registrationmodule = enabled
iniadmin.iniadmin.iniadminplugin = enabled
trac.web.auth.loginmodule = disabled
tracdiscussion.admin.discussionwebadmin = enabled
tracdiscussion.core.discussioncore = enabled
tracdiscussion.init.discussioninit = enabled
tracdiscussion.search.discussionsearch = enabled
tracdiscussion.wiki.discussionwiki = enabled
tracemoticons.emoticonssupport = enabled
webadmin.* = enabled

[account-manager]
password_file = /etc/httpd/.trac
password_format = htpasswd
EndConf

}

#-----------------------------------------------------=[ SetUp Permissions ]=--
function set_perms {
  local project="$1"
  say "Setting permissions ..."

  # The big boss aka admin
  trac-admin ${TracEnvParentDir}/${project} permission add ${admin} TRAC_ADMIN

  # SVN Repo
  trac-admin ${TracEnvParentDir}/${project} permission add visitor BROWSER_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor LOG_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor FILE_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor CHANGESET_VIEW

  # Tickets, MileStones, etc.:
  trac-admin ${TracEnvParentDir}/${project} permission add visitor TICKET_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor MILESTONE_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor ROADMAP_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor WIKI_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor TIMELINE_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor SEARCH_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add visitor REPORT_VIEW

  # Users who registered with our site get additional permissions:
  trac-admin ${TracEnvParentDir}/${project} permission add authenticated TICKET_CREATE
  trac-admin ${TracEnvParentDir}/${project} permission add authenticated TICKET_APPEND

  # Next comes a group for our testers, who inherit all from the r/o group:
  trac-admin ${TracEnvParentDir}/${project} permission add tester visitor
  trac-admin ${TracEnvParentDir}/${project} permission add tester WIKI_CREATE
  trac-admin ${TracEnvParentDir}/${project} permission add tester WIKI_MODIFY

  # Now for our developers (inheriting all from testers)
  trac-admin ${TracEnvParentDir}/${project} permission add developer tester
  trac-admin ${TracEnvParentDir}/${project} permission add developer TICKET_MODIFY

  # Forum
  trac-admin ${TracEnvParentDir}/${project} permission add visitor DISCUSSION_VIEW
  trac-admin ${TracEnvParentDir}/${project} permission add authenticated DISCUSSION_APPEND
  trac-admin ${TracEnvParentDir}/${project} permission add tester DISCUSSION_APPEND

  # Rewrite permissions for anonymous (not-logged-in) users
  trac-admin ${TracEnvParentDir}/${project} permission remove anonymous '*'
  trac-admin ${TracEnvParentDir}/${project} permission add anonymous visitor
}

#---------------------------------------------------------[ Forum creation ]---
function forum {
  local db=$1/$DBFile
  local project=$2
  local now=`date +%s`
  say "Creating forums for $project in database $db..."
  # forum(id,name,create_timestamp,forum_group,author,moderators,subject,description)
  # Since no forum_group exists, leave that column to 0.
  sqlite3 $db <<EndSQL
INSERT INTO forum VALUES(1,'Help',$now,0,'$admin','$admin','Help with $project','If you have problems with $project and need help, this is the right place to ask for');
INSERT INTO forum VALUES(2,'Common Discussion',$now,0,'$admin','$admin','All about $project','Feature requests, recent development...');
EndSQL
}

#====================================================[ Initialize projects ]===
[ $WikiReplace -eq 1 ] && wiki_default
for pname in $projects; do
  say "Initializing Environment for $pname ..."
  proj=`echo $pname|tr [:upper:] [:lower:]`
  trac-admin $TracEnvParentDir/$proj initenv $pname $TracDB $RepoType $RepoParentPath/$proj $TracTemplatePath
  chown -R www-data:www-data $TracEnvParentDir/$proj
  conf_activate $proj
  set_perms $proj
  say "Upgrading environment..."
  trac-admin ${TracEnvParentDir}/$proj upgrade
  [ $ForumCreate -eq 1 ] && forum $TracEnvParentDir/$proj $pname
done

Spamschutz mit mod_security

###############################################################################
# Protect TRAC against spammers
# Track rules have id:7701xx
# idea taken from http://madwifi.org/wiki/FightingTracSpam (where some comments
# also refer to - e.g. "spam type x")
###############################################################################

#==================================================================[ Rules ]===
#--------------------------------------------------------------[ Whitelist ]---
# allow all POST requests that are not directed to one of the handlers we take
# into account below
SecFilterSelective REQUEST_URI "!(/trac/.+/(wiki|newticket|ticket).*$)" "nolog,allow,id:770100"

#---------------------------------------------[ Spam Type 1: #preview spam ]---
# block POSTs to /ticket/<number>#preview and /newticket#preview 
SecFilterSelective REQUEST_URI "^/trac/.+/(newticket|ticket/[0-9]+).*\#preview" "id:770101"

#--------------------------------------------[ Spam Type 2: no cookie spam ]---
# block POSTs to /wiki, /ticket and /newticket from users who don't have a trac
# cookie
# 
# CAUTION: these rules likely cause false positives, as some users tend to turn
# off cookie support in their browser. Don't activate them unless you're sure
# that this won't offend your visitors, or at least warn visitors.
#SecFilterSelective REQUEST_URI "^/trac/.+/(wiki/|newticket|ticket/).*$" "chain,id:770102"
#SecFilterSelective HTTP_COOKIE "!(trac_auth|trac_session)"

#---------------------------------------[ Spam Type 3: html processor spam ]---
# don't accept usage of HTML processor in tickets / ticket comments
SecFilterSelective REQUEST_URI "^/trac/.+/(newticket|ticket/).*$" "chain,id:770103"
SecFilterSelective "ARG_description|ARG_comment" "#!html"

#-----------------------------------------------[ Spam Type 4: markup spam ]---
# block new ticket and ticket comment POSTs if they contain more than one URL 
SecFilterSelective "REQUEST_URI" "^/trac/.+/(newticket|ticket/).*$" "chain,id:770104"
SecFilterSelective "ARGS" "http\:/.*http\:/"

#--------------------------------------------------[ Spam Type 5: LED spam ]---
# block LED spammer; his spam is not blocked by the previous rule, since he only
# includes only one URL to the spamvertised website last but not least
SecFilterSelective REQUEST_URI "^/trac/.+/(newticket|ticket/).*$" "chain,id:770105"
SecFilterSelective "ARG_description|ARG_comment" "www.tideled.com"

#-------------------------------[ Spam Type 6: attachment description spam ]---
# block tickets or comments with an http://-URL in it, if user is not properly
# authenticated; throw a 403 that allows to present users with a custom error
# page which explains what is going on (see below)
# this rule is used on tickets as well as attachment descriptions and therefore
# also catches spam type 6
# Since this prevents all not-logged-in users from refering to any URL (even
# if it is pointing to something needed in the context), you may want to
# disable this rule
#SecFilterSelective "REQUEST_URI" "/trac/.+/(newticket|ticket/|attachment/).*$" "chain,id:770106"
#SecFilterSelective HTTP_COOKIE "!trac_auth" chain
#SecFilterSelective HTTP_Authorization "!Basic" chain
#SecFilterSelective "ARGS" "(http|https):/" "deny,log,status:403"

#==============================================[ Customized Error Messages ]===
# See the article on http://madwifi.org/wiki/FightingTracSpam for more details
#----------------------------------[ Error 402: "You have to pay for ads!" ]---
# Apache allows to present users with customized error pages, and we can make
# use of that feature to let spammers know what we think of 'em. Tell Apache
# what file to use as error page for 402, and let it know that requests to this
# file should not be handled by Trac.
# 
# Uncomment the following lines if you want to make use of this
# feature (see also step 3 of the recipe):
#ErrorDocument   402     /error402.html
#<Location /error402.html>
#    SetHandler  None
#</Location>
#
#--------------------------[ Error 403: "URLs are not allowed in tickets!" ]---
# Another use for customized error pages is, as mentioned above, to let users
# know why they are not allowed to give URLs in their tickets and what they
# can do to circumvent this limitation.
#ErrorDocument   403     /error403.html
#<Location /error403.html>
#    XBitHack On
#    SetHandler  None
#</Location>

Nützliche Trac Ressourcen

Handbücher, Tutorials und HowTos

URL Beschreibung
Trac Home The official Trac homepage
Linux Subversion Server and Trac Server YoLinux tutorial on configuration of a Linux Subversion Server and Trac server.
Trac on Ubuntu Other how-tos to get Trac on your Ubuntu machine (for multiple versions)
Egg Cooking Tutorial How to cook python eggs (e.g. to develop your own Trac plugin)
Egg Cooking Tutorial for Trac 0.11+ How to cook python eggs (e.g. to develop your own Trac plugin)

PlugIns

URL Beschreibung
Trac Hacks Macros, patches, plugins … Track Hacks ist das größte mir bekannte Repository. Von dort geht es direkt zum HackIndex.
Trac PluginList Eine Plugin-Liste auf der Hauptseite
2018-12-16