source: MediaSPIP/scripts/trunk/mediaspip_install.sh @ 7857

Last change on this file since 7857 was 7857, checked in by severo, 5 years ago

Gérer le cas où $DISABLE_MUNIN est vide

File size: 16.8 KB
Line 
1#!/bin/bash
2#
3# mediaspip_install.sh
4# © 2011-2013 - kent1 (kent1@arscenic.info)
5# Version 0.8.0
6#
7# Ce script installe toutes les dépendances logicielles nécessaires au bon fonctionnement de mediaSPIP :
8# - Apache2
9# - Mysql
10# - php5-gd2;
11# - php5-curl;
12# - php5-imagick;
13# - libx264;
14# - lame;
15# - libopencore-amr;
16# - libtheora;
17# - rtmpdump;
18# - flvtool++;
19# - mediainfo;
20# - ffmpeg;
21#
22# Ce script installe également SPIP et l'ensemble des extensions et plugins nécessaires à MediaSPIP
23# Il installe également :
24# - le nécessaire pour réaliser une mutualisation (ferme) de SPIP;
25# - l'écran de sécurité de SPIP;
26# - des thÚmes Zpip compatibles avec MediaSPIP;
27#
28# Mises à jour :
29# Version 0.3.2 - Meilleure détection des distribs avec lsb_release
30# Version 0.3.3 - On fait marcher le script avec dash
31# Version 0.3.4 - Installation de l'écran de sécurité dans mediaspip_spip_installation.sh
32# Version 0.3.5 - Mise à jour de libvpx en 0.9.7-p1 "Cayuga"
33# Version 0.3.6 - Mise à jour de MediaInfo en
34# Version 0.3.7 - Installation de flvtool++ en version 1.2.1
35# Version 0.3.8 - Mise à jour de ffmpeg2theora en version 0.28
36# Version 0.3.9 - On force la branche 0.7 de FFmpeg en version de développement pour faire fonctionner ffmpeg2theora
37# Version 0.3.91 - On change la source du plugin zen-garden
38# Version 0.3.92 - On change la source du plugin gis
39# Version 0.4.0 :
40# -* Passage de FFmpeg en stable en version 0.7.4
41# -* Passage de MediaInfo en version 0.7.49
42# -* On rÚgle un soucis de changement de dépot SVN sur les installations de SPIP et plugins
43# -* Ajout de certains paquets dans les logiciels automatiquement installés (poppler-utils et catdoc)
44# Version 0.4.1 - Passage de FFmpeg en stable en version 0.7.5
45# Version 0.4.2 - Passage de FFmpeg en stable en version 0.7.6 et ajout de --disable-doc à sa configuration
46# Version 0.4.3 :
47# -* Passage de MediaInfo en version 0.7.50
48# -* Ajout d'un sleep sur la vérification de la connexion internet
49# Version 0.4.4 :
50# -* Passage de MediaInfo en version 0.7.51
51# -* Passage de FFMpeg en version 0.7.8
52# -* Installation de yasm en Debian Squeeze en version 1.2.0 car < 1.0.0 empêche x264 de se compiler
53# -* changement d'environnement de lang en "en" et plus "C" pour tester les dépots de SPIP
54# Version 0.4.5 : changement de l'URL de flvtool++ sur les scripts
55# Version 0.4.6 :
56# -* Passage de MediaInfo en version 0.7.52
57# Version 0.4.7 :
58# -* Passage de FFmpeg en version 0.7.11
59# -* Passage de MediaInfo en version 0.7.53
60# Version 0.4.8 : suppression de ffmpeg-php
61# Version 0.4.9 :
62# -* Passage de FFmpeg en version 0.7.12
63# -* Passage de MediaInfo en version 0.7.57
64# -* Passage de libvpx en version 1.1.0
65# Version 0.5.0 :
66# -* Passage de FFmpeg en version 0.7.12
67# -* Passage de MediaInfo en version 0.7.58
68# -* Téléchargement des libs de mediaSPIP
69# Version 0.6.0 :
70# -* On n'utilise plus ffmpeg2theora
71# -* Suppression des scripts dev
72# Version 0.7.0 :
73# -* Installation de ffmpeg en 1.0
74# -* Suppression de fonctions inutilisées
75# -* Plus de support pour Debian Lenny
76# -* Prise en compte de ubuntu precise 12.04 LTS
77# -* Prise en compte de ubuntu quantal 12.04 LTS
78# Version 0.7.1 :
79# -* Installation de ffmpeg en 1.2.0
80# -* Installation de MediaInfo en 0.7.62
81# -* Suppression du support pour centos
82# -* Ajout des dépendances logicielles pour le plugin smush
83# Version 0.7.2 :
84# -* Installation de mediaspip_munin si possible et intéressant :
85# cf https://github.com/kent1D/mediaspip_munin/
86
87# On pose une variable sur le répertoire courant permettant de savoir
88# d'où le script est lancé
89CURRENT=$(pwd)
90
91LOG=/dev/null
92
93export TEXTDOMAINDIR=$CURRENT/locale
94export TEXTDOMAIN=mediaspip
95
96I18NLIB=$(which gettext.sh)
97
98# source in I18N library - shown above
99if [ -f "$I18NLIB" ]; then
100        . "$I18NLIB"
101else
102        printf "ERROR - $I18NLIB NOT FOUND"
103        printf "Please install the gettext package via the command:"
104        printf "apt-get -y install gettext gettext-base"
105        exit 1
106fi
107
108VERSION_INSTALL="0.8.0"
109
110LOGO="
111######################################################################################
112
113
114.___  ___.  _______  _______   __       ___           _______..______    __  .______   
115|   \/   | |   ____||       \ |  |     /   \         /       ||   _  \  |  | |   _  \ 
116|  \  /  | |  |__   |  .--.  ||  |    /  ^  \       |   (----\`|  |_)  | |  | |  |_)  |
117|  |\/|  | |   __|  |  |  |  ||  |   /  /_\  \       \   \    |   ___/  |  | |   ___/ 
118|  |  |  | |  |____ |  '--'  ||  |  /  _____  \  .----)   |   |  |      |  | |  |     
119|__|  |__| |_______||_______/ |__| /__/     \__\ |_______/    | _|      |__| | _|     
120
121VERSION ${VERSION_INSTALL}
122
123######################################################################################
124"
125
126# Inclusion d'un logo aléatoire ;)
127if [ -d "fun" ];then
128        DIR="./fun/*.sh"
129        RANDOMFILE=$(ls $DIR | shuf -n1)
130        . $RANDOMFILE
131fi
132
133# On affiche le logo ... en vert
134tput setaf 2;
135printf "$LOGO"
136tput sgr0;
137
138# On inclut le fichier de fonctions
139FICHIER='mediaspip_functions.sh'
140. ./mediaspip_functions.sh || (tput setaf 1;printf "$(eval_gettext 'Erreur fichier $FICHIER')";tput sgr0;kill "$$";exit 1)
141
142# On inclut le fichier d'installation de SPIP et de MediaSPIP
143FICHIER='mediaspip_spip_installation.sh'
144. ./mediaspip_spip_installation.sh || error "$(eval_gettext 'Erreur fichier $FICHIER')"
145
146#########################################
147# Vérifications de base :
148# - doit être lancé par root
149# - doit être sur une distribution que l'on connait
150#
151
152if [ "$(id -u)" != "0" ]; then
153        echo_erreur "$(eval_gettext 'Erreur script root')" 1>&2
154        exit 1
155fi
156
157LSB_RELEASE=$(which lsb_release)
158
159if [ "$LSB_RELEASE" ] && [ -x $LSB_RELEASE ]; then
160        DISTRIB=$($LSB_RELEASE -si | tr [:upper:] [:lower:])
161        DISTRO=$($LSB_RELEASE -sc | tr [:upper:] [:lower:])
162# Cas d'Ubuntu
163elif [ -r /etc/lsb-release ];then
164        DISTRIB=$(cat /etc/lsb-release | grep ID | cut -c 12- | tr '[A-Z]' '[a-z]')
165        DISTRO=$(cat /etc/lsb-release | grep CODE | cut -c 18- | tr '[A-Z]' '[a-z]')
166# Cas de debian
167elif [ -r /etc/debian_version ]; then
168        DISTRIB="debian"
169        DISTRIB_VERSION=$(cat /etc/debian_version)
170        NUMBER=$(cat /etc/debian_version | cut -c 1)
171        if [ "$NUMBER" = '6' ]; then
172                DISTRO="squeeze"
173        elif [ "$NUMBER" = '7' ]; then
174                DISTRO="wheezy"
175        elif [ "$DISTRIB_VERSION" = 'wheezy/sid' ]; then
176                DISTRO="wheezy"
177        else
178                echo_erreur "$(eval_gettext 'Erreur script distro inconnue')"
179                exit 1
180        fi
181# Cas de redhat (?) et centos
182elif [ -r /etc/redhat-release ]; then
183        DISTRIB=$(cat /etc/redhat-release |awk  '{ print $1 }' | tr '[A-Z]' '[a-z]' | tr '[:punct:]' '_')
184        DISTRO=$(cat /etc/redhat-release |awk  '{ print $3 }' | tr '[A-Z]' '[a-z]' | tr '[:punct:]' '_')
185else
186        echo_erreur "$(eval_gettext 'Erreur script distro inconnue')"
187        exit 1
188fi
189
190OKDISTRO='squeeze wheezy lucid precise quantal raring';
191case "$OKDISTRO" in
192        *$DISTRO*);;
193        *)
194                die "$(eval_gettext 'Erreur script distro non suportee $DISTRIB $DISTRO')"
195                shift
196                ;;
197esac
198
199# On vérifie que l'on a bien accÚs au programme pkg-config
200# Il permet de connaitre les versions des librairies sur le systÚme
201PKG_CONFIG=$(which pkg-config)
202
203if [ ! -x $PKG_CONFIG ]; then
204        echo_erreur "$(eval_gettext 'Erreur script pkg-config')" 1>&2
205        exit 1
206fi
207
208#########################################
209# Variables éditables pour l'utilisateur
210#
211
212# Où sont téléchargées les sources
213SRC_INSTALL="/usr/local/src"
214
215# location of log file
216LOG="/var/log/mediaspip_install.log"
217
218# On récupÚre le nombre de cores de la machine pour les utiliser lors des compilations
219NO_OF_CPUCORES=`grep -c ^processor /proc/cpuinfo 2>/dev/null`
220if [ ! "$?" = "0" ]
221then
222        NO_OF_CPUCORES=2
223fi
224
225# Le upload_max_filesize de php
226PHP_UPLOAD_SIZE="150M"
227
228# Emplacement final de SPIP et MediaSPIP
229SPIP="/var/www/mediaspip"
230
231# Version de SPIP (svn ou stable)
232SPIP_VERSION="svn"
233SPIP_TYPE="ferme_full"
234SPIP_SVN="svn://trac.rezo.net/spip/branches/spip-3.0"
235
236#if [ "$DISTRIB" = "centos" ];then
237#       SPIP_USER="apache"
238#       SPIP_GROUP="apache"
239#else
240        SPIP_USER="www-data"
241        SPIP_GROUP="www-data"
242#fi
243
244# Forcer ffmpeg à se réinstaller, cas où modif libvpx et x264
245FFMPEG_FORCE_INSTALL="non"
246
247# On insÚre un fichier de modification de ces variables si présent
248if [ -r /etc/default/mediaspip ]; then
249        . /etc/default/mediaspip
250fi
251
252while [ $# -gt 0 ]; do
253        case $1 in
254                --help|-h) HELP=$(eval_gettext "Help message")
255                VERSION_AFFICHER=$(eval_gettext 'Info mediaspip installation $VERSION_INSTALL')
256                echo "$VERSION_AFFICHER"
257                echo "$HELP"
258                exit 0;;
259                --version|-v) VERSION_AFFICHER=$(eval_gettext 'Info mediaspip installation $VERSION_INSTALL')
260                echo "$VERSION_AFFICHER" 
261                exit 0;;
262                --lang|-lang) 
263                        case "${2}" in
264                                en) export LC_MESSAGES=en_US.UTF-8
265                                shift 2;;
266                                fr) export LC_MESSAGES=fr_FR.UTF-8
267                                shift 2;;
268                                "") echo_erreur "$(eval_gettext 'Erreur langue non set')"
269                                ERROR=oui
270                                shift 2;;
271                                *) echo_erreur "$(eval_gettext 'Erreur langue inexistante')"
272                                ERROR=oui
273                                shift;;
274                        esac
275                ;;
276                --allways-yes|-y) NO_QUESTION="yes"
277                echo $(eval_gettext 'Info options no_question')
278                shift;;
279                --src_install|-src) SRC_INSTALL="${2}"
280                shift 2;;
281                --log|-l) LOG="${2}"
282                shift 2;;
283                --cpus|-c)
284                        if [ ! -z "${2}" ];then
285                                if(isNumeric "${2}");then
286                                        if ((${2} > $NO_OF_CPUCORES));then
287                                                CPU_NB=${2}
288                                                echo_erreur "$(eval_gettext 'Erreur option cpus trop $CPU_NB')"
289                                                ERROR=oui
290                                        else 
291                                                NO_OF_CPUCORES="${2}"
292                                        fi
293                                else
294                                        echo_erreur "$(eval_gettext 'Erreur option cpus numerique')"
295                                        ERROR="oui"
296                                fi
297                        else
298                                echo_erreur "$(eval_gettext 'Erreur option cpus numerique')"
299                                ERROR="oui"
300                        fi
301                shift 2;;
302                --disable-alternc) DISABLE_ALTERNC="yes"
303                echo $(eval_gettext 'Info options disable_alternc')
304                shift;;
305                --disable-apache) DISABLE_APACHE="yes"
306                echo $(eval_gettext 'Info options disable_apache')
307                shift;;
308                --disable-ffmpeg) DISABLE_FFMPEG="yes"
309                echo $(eval_gettext 'Info options disable_ffmpeg')
310                shift;;
311                --disable-mediaspip) 
312                DISABLE_MEDIASPIP="yes"
313                SPIP_TYPE="none"
314                echo $(eval_gettext 'Info options disable_mediaspip')
315                shift;;
316                --disable-munin) DISABLE_MUNIN="yes"
317                echo $(eval_gettext 'Info options disable_munin')
318                shift;;
319                --spip|-s) SPIP="${2}"
320                shift 2;;
321                --spip_version|-s_v) SPIP_VERSION="${2}"
322                shift 2;;
323                --spip_svn|-s_svn) SPIP_SVN="${2}"
324                shift 2;;
325                --spip_user) SPIP_USER="${2}"
326                shift 2;;
327                --spip_group) SPIP_GROUP="${2}"
328                shift 2;;
329                --spip_type)
330                        case "${2}" in
331                                ferme_full|ferme|minimal|full|none) SPIP_TYPE=${2}
332                                shift 2;;
333                                *)
334                                TYPEDEMANDE=${2}
335                                echo_erreur "$(eval_gettext 'Erreur mediaspip type disponible $TYPEDEMANDE')"
336                                ERROR=oui
337                                shift;;
338                        esac
339                shift 2;;
340        esac
341done
342
343# Si LC_MESSAGES n'est pas en en ni fr, on le force en en
344LANGUES_COMPAT='en fr'
345if [ -n "${LC_MESSAGES}" ]; then
346        LANGUE=`expr substr $LC_MESSAGES 1 2`
347elif [ -n "${LANG}" ]; then
348        LANGUE=`expr substr $LANG 1 2`
349        export LC_MESSAGES=$LANG
350else
351        LANGUE=''
352fi
353case $LANGUE in
354        en|fr) ;;
355        *)
356                export LC_MESSAGES=en_US.UTF-8
357                ;;
358esac 
359
360verif_internet_connexion || error "$(eval_gettext 'Erreur internet connexion')"
361
362if [ "$ERROR" = "oui" ]; then
363        exit 1
364fi
365
366FFMPEG_VERSION="1.2.4"
367FFMPEG_URL="http://ffmpeg.org/releases/ffmpeg-1.2.4.tar.bz2"
368FFMPEG_FICHIER="ffmpeg-1.2.4.tar.bz2"
369FFMPEG_PATH="ffmpeg-1.2.4"
370
371MEDIAINFO_VERSION="0.7.64"
372MEDIAINFO_URL="http://downloads.sourceforge.net/mediainfo/MediaInfo_CLI_0.7.64_GNU_FromSource.tar.bz2"
373MEDIAINFO_FICHIER="MediaInfo_CLI_0.7.64_GNU_FromSource.tar.bz2"
374MEDIAINFO_PATH="MediaInfo_CLI_GNU_FromSource"
375
376FLVTOOLPLUS_VERSION="1.2.1"
377FLVTOOLPLUS_URL="http://files.mediaspip.net/binaires/flvtool++-1.2.1.tar.gz"
378FLVTOOLPLUS_FICHIER="flvtool++-1.2.1.tar.gz"
379FLVTOOLPLUS_PATH="flvtool++-1.2.1"
380
381LIBOPUS_VERSION="1.0.3"
382LIBOPUS_URL="http://downloads.xiph.org/releases/opus/opus-1.0.3.tar.gz"
383LIBOPUS_FICHIER="opus-1.0.3.tar.gz"
384LIBOPUS_PATH="opus-1.0.3"
385
386XMPPHP_VERSION="2.0"
387XMPPHP_URL="http://downloads.sourceforge.net/project/xmpphptoolkit/xmp_php_toolkit-2.0-rev14.rar"
388XMPPHP_FICHIER="xmp_php_toolkit-2.0-rev14.rar"
389XMPPHP_PATH="xmp_toolkit"
390
391FICHIER="distribs/$DISTRIB_$DISTRO.sh"
392. ./distribs/"$DISTRIB"_"$DISTRO".sh 2>> $LOG >> $LOG || error "$(eval_gettext 'Erreur fichier $FICHIER')"
393
394###############################
395# Suite des fonctions du script
396###############################
397
398QUESTION_VALID=$(eval_gettext "Question valider")
399
400echo $(eval_gettext 'Info distro version $DISTRIB $DISTRO') 1>&2
401echo
402
403# Quelques questions préalables.
404# Il est possible de les passer en ajoutant "-y" ou "--allways-yes" en option au script
405if [ "$NO_QUESTION" != "yes" ]; then
406        # Demande de valider l'emplacement des fichiers source des binaires
407        # Trois reponses valides possibles :
408        # - y
409        # - o
410        # - return (vide)
411        eval_gettext "Info source installation"
412        echo " $SRC_INSTALL"
413        echo -n "$QUESTION_VALID"
414        read REPLY
415        [ "$REPLY" = "y" ] || [ "$REPLY" = "o" ] || [ -z "$REPLY" ] || die $(eval_gettext "Erreur valide SRC_INSTALL")
416        echo
417       
418        # Demande de valider l'emplacement des fichiers de log
419        # Trois reponses valides possibles :
420        # - y
421        # - o
422        # - return (vide)
423        eval_gettext "Info log installation"
424        #echo ""
425        echo " $LOG"
426        echo -n "$QUESTION_VALID"
427        read REPLY
428        [ "$REPLY" = "y" ] || [ "$REPLY" = "o" ] || [ -z "$REPLY" ] || die $(eval_gettext "Erreur valide LOG")
429        echo
430       
431        # Demande de valider l'emplacement des fichiers de SPIP et MediaSPIP
432        # Trois reponses valides possibles :
433        # - y
434        # - o
435        # - return (vide)
436        if [ "$SPIP_TYPE" != "none" ];then
437                eval_gettext "Info SPIP installation"
438                echo " $SPIP"
439                echo -n "$QUESTION_VALID"
440                read REPLY
441                [ "$REPLY" = "y" ] || [ "$REPLY" = "o" ] || [ -z "$REPLY" ] || die $(eval_gettext "Erreur valide SPIP")
442                echo
443        else
444                eval_gettext "Info MediaSPIP non installe"
445        fi
446       
447        # ok, already, last check before proceeding
448        echo "OK, nous sommes prêts à y aller ?"
449        echo -n "$QUESTION_VALID"
450        read REPLY
451        [ "$REPLY" = "y" ] || [ "$REPLY" = "o" ] || [ -z "$REPLY" ] || die "exiting. Bye, did I come on too strong?."
452        echo
453fi
454
455echo "Le script démarre" >> $LOG
456echo "Installation des dépendances logicielles" 2>> $LOG >> $LOG
457
458
459# Installation de plusieurs dependances
460# (librairies et binaires)
461eval_gettext "Titre dependances logicielles"
462echo
463echo
464
465"$DISTRIB"_"$DISTRO"_dep_install || error "$(eval_gettext 'Erreur installation regarde log $LOG')"
466
467echo_reussite "$(eval_gettext 'End dependances')"
468echo
469
470# Préconfiguration basique d'Apache
471# (différents modules)
472
473# Si on demande en option de ne pas configurer Apache, on ne le fait pas
474if [ "$DISABLE_APACHE" != "yes" ];then
475        eval_gettext "Titre apache"
476        echo
477        echo
478
479        "$DISTRIB"_"$DISTRO"_apache_install || error "$(eval_gettext 'Erreur installation regarde log $LOG')"
480       
481        echo_reussite "$(eval_gettext 'End apache')"
482        echo
483fi
484
485# Si on demande à ne pas installer FFMpeg, plusieurs autres logiciels ne seront pas installés :
486# - FFMpeg lui-même
487
488if [ "$DISABLE_FFMPEG" != "yes" ];then
489        # Installation de x264
490        # librairie h.264 pour creer des videos compatibles html5 (Safari + iphone & co)
491        eval_gettext "Titre x264"
492        echo
493        echo
494       
495        "$DISTRIB"_"$DISTRO"_x264_install || error "$(eval_gettext 'Erreur installation regarde log $LOG')"
496        SOFT="libx264"
497        echo
498        echo_reussite "$(eval_gettext 'End $SOFT')"
499        echo
500
501        # Installation de ffmpeg
502        # binaire pour encoder videos et sons
503        eval_gettext "Titre ffmpeg"
504        echo
505        echo
506       
507        # On a besoin de ce répertoire et checkinstall ne sait le créer
508        if [ ! -d "/usr/local/share/" ];then
509                mkdir -p /usr/local/share/
510        fi
511        "$DISTRIB"_"$DISTRO"_ffmpeg_install || error "$(eval_gettext 'Erreur installation regarde log $LOG')"
512        SOFT="ffmpeg"
513        echo
514        echo_reussite "$(eval_gettext 'End $SOFT')"
515        echo
516
517fi
518
519# On vérifie si alternc est sur le systÚme
520# Si oui on demande s'il est utilisé pour MediaSPIP
521# Si oui, on cree des liens symboliques vers le répertoire du safe_mode
522if [ -d /var/alternc/exec.usr ] && [ "$DISABLE_ALTERNC" != "yes" ]; then
523        echo
524        echo $(eval_gettext "Question alternc")
525        echo -n "$QUESTION_VALID"
526        read REPLY
527        if([ "$REPLY" = "y" ] || [ "$REPLY" = "o" ] || [ -z "$REPLY" ]);then
528                cd /var/alternc/exec.usr
529                if [ ! -h vorbiscomment ];then
530                        ln -s /usr/bin/vorbiscomment 2>> $LOG >> $LOG 
531                fi
532                if [ ! -h metaflac ];then
533                        ln -s /usr/bin/metaflac 2>> $LOG >> $LOG
534                fi
535                if [ ! -h qt-faststart ];then
536                        ln -s /usr/local/bin/qt-faststart 2>> $LOG >> $LOG
537                fi
538                if [ ! -h flvtool2 ];then
539                        ln -s /usr/bin/flvtool2 2>> $LOG >> $LOG
540                fi
541                if [ ! -h mediainfo ];then
542                        ln -s /usr/local/bin/mediainfo 2>> $LOG >> $LOG
543                fi
544                if [ ! -h ps ];then
545                        ln -s /bin/ps 2>> $LOG >> $LOG
546                fi
547
548                cd $CURRENT
549
550                cp configs/spipmotion/spipmotion.sh /var/alternc/exec.usr/ 2>> $LOG >> $LOG
551                chmod +x /var/alternc/exec.usr/spipmotion.sh
552
553                echo
554                echo_reussite "$(eval_gettext 'End alternc')"
555        fi
556fi
557
558if [ "$DISABLE_MEDIASPIP" != "yes" ];then
559        echo
560        eval_gettext "Titre spip mediaspip"
561        echo
562        echo
563       
564        mediaspip_install || error "$(eval_gettext 'Erreur installation regarde log $LOG')"
565fi
566
567# Munin est présent
568# On installe mediaspip_munin
569# cf : mediaspip_functions.sh
570if [ -n "$DISABLE_MUNIN" ] && [ "$DISABLE_MUNIN" != "yes" -a -x $(which munin-node) ];then
571        mediaspip_munin_install || error "$(eval_gettext 'Erreur installation regarde log $LOG')"
572fi
573
574echo
575echo_reussite "$(eval_gettext 'End installation generale')"
576echo
577exit 
Note: See TracBrowser for help on using the repository browser.