Et si on effaçait tout ?

Un mois que j’ai loué 2 VPS chez OVH, J’ai installé pleins de belles choses dessus et cela m’a permis de découvrir le monde des serveurs ainsi que de vous faire profiter de mon inexpérience. Et maintenant que faire ?

Après avoir découvert les joies de la console noire avec ses lignes de commandes à n’en plus finir, je dois dire que cette expérience est une réussite, je suis allé au terme de toutes les installations que j’ai entrepris. Et ça me donne envie de continuer. Bien entendu je suis loin de pouvoir gérer un vrai serveur en production, je n’y connais rien en sécurité mais pourquoi ne pas faire tourner une petite installation pour moi-même, des copains et peut-être une association ou 2 ? Je vais donc commencer par effacer tout ce que je viens d’installer et recréer deux serveurs, un en production et l’autre pour faire des test (de plugins Dotclear?), avec au début seulement moi dessus, cela m’évitera de me faire engueuler si je casse tout ou si ma machine se fait hacker. Au passage je ne sais pas si ça fait longtemps que vous mes suivez mais si tel est le cas vous aurez surement remarqué que je suis un spécialiste du j’efface tout et tan pis si je laisse des trous dans la toile.
J’espère que ma série d’article sur l’installation d’un serveur Debian Squeeze 64 sur VPS OVH vous aura servi. Pour ma part, elle va continuer de faire office de pense-bête et je l’enrichirai du trucs et astuces à mesure que mon niveau de connaissances augmentera.

Il y a un manque d’argent credit rapide?

Bien à vous,
JC

Installer un réducteur d’URL

Petit moment de détente dans notre installation de serveur avec la mise en place d’un réducteur d’URL.

Le plus connu d’entre eux est celui de Twitter t.co, on ne peut pas faire plus court comme URL de base ! Je tiens à faire une petite mise en garde quand même, si le site qui gère les liens court s’arrête, plus personne ne pourra accéder à vos raccourcie, cela est déjà arrivé par le passé, de même si vous arrêtez/plantez votre réducteur d’URL personnel ce qui m’est déjà arrivé, il faut donc ne pas se baser dessus pour notre visibilité sur internet mais juste pour faciliter l’échange de lien…

Installation

On choisi le réducteur d’URL YOURLS qu’on installe sur le sous-domaine m.scribox.org. Sous-domaine qu’on a créé chez notre registre un faisant pointer un champ de type CNAME de m.scribox.org vers scribox.org
On a besoin d’une base de donnée, donc sur notre VPS_SQL on va créer un table pour YOURLS ainsi que son utilisateur. Une fois connecté en SSH à notre serveur VPS_SQL on lance l’invite de commande MySQL :

mysql -u root -p

CREATE DATABASE `yours` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER ‘yourls’@’IP_DU_VPS_WEB’ IDENTIFIED BY ‘MOT_DE_PASSE’;
GRANT ALL PRIVILEGES ON yourls.* TO ‘yourls’@’IP_DU_VPS_WEB’ WITH GRANT OPTION;

On a déjà fait une manipulation similaire lors de l’installation de Dotclear.
Puis on retourne sur notre VPS_WEB.
On télécharge l’archive de YOURLS, on la décompresse et on la déplace dans le répertoire qui accueille le sous-domaine :

wget https://github.com/YOURLS/YOURLS/archive/master.zip
unzip master.zip
mv YOURLS-master /var/www/m.scribox.org

On copie la configuration par défaut et on la modifie :

cp /var/www/m.scribox.org/user/config-sample.php /var/www/m.scribox.org/user/config.php
nano /var/www/m.scribox.org/user/config.php

<?php
define( ‘YOURLS_DB_USER’, ‘yourls’ );
define( ‘YOURLS_DB_PASS’, ‘MOT_DE_PASSE_DE_L_UTILISTEUR_SQL_YOURLS’ );
define( ‘YOURLS_DB_NAME’, ‘yourls’ );
define( ‘YOURLS_DB_HOST’, ‘IP_DU_VPS_SQL:PORT_SQL_DU_VPS_SQL’ );
define( ‘YOURLS_DB_PREFIX’, ‘yourls_’ );
define( ‘YOURLS_SITE’, ‘http://m.scribox.org’ );
define( ‘YOURLS_HOURS_OFFSET’, 1 );
define( ‘YOURLS_LANG’, ‘fr_FR’ );
define( ‘YOURLS_UNIQUE_URLS’, true );
define( ‘YOURLS_PRIVATE’, true );
# A créer avec http://yourls.org/cookie
define( ‘YOURLS_COOKIEKEY’, ‘xxxxxxxxxxxxxxxxxxxxxxxxxxx’ );
$yourls_user_passwords = array(
# Un login et un mot de passe à faire depuis http://yourls.org/md5.php
‘JcDenis’ => ‘md5:xxxxxxxxxxxxxxx’
);
define( ‘YOURLS_URL_CONVERT’, 36 );
$yourls_reserved_URL = array(
‘porn’, ‘faggot’, ‘sex’, ‘nigger’, ‘fuck’, ‘cunt’, ‘dick’, ‘gay’, ‘loan’
);
define(‘YOURLS_PRIVATE_INFOS’, false);

On vérifie le .htaccess du site pour qu’il lise bien correctement les URLs :

nano /var/www/m.scribox.org/.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /yourls-loader.php [L]

On créer l’Hôte Virtuel dans Apache et on le prend en compte :

nano /etc/apache2/sites-available/m.scribox.org

<VirtualHost *:80>
ServerAdmin ma.vari@addresse.mel
ServerName m.scribox.org
DocumentRoot /var/www/m.scribox.org
<Directory /var/www/m.scribox.org>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

a2ensite m.scribox.org
service apache2 reload

Il ne reste plus qu’à se rendre dans l’interface d’administration web à l’addresse http://m.scribox.org/admin .

Au suivant

Comment ça y en a plus ? Bon bein on efface tout et on recommence alors.

Gestion de listes de diffusion

Un petit test de plus sur mon installation de serveur en attendant qu’OVH répare les VPS, on va ajouter un gestionnaire de mailinglist.

Préambule

Comme à mon habitude je choisi arbitrairement mailman. Et je ne sais même pas si il y en a d’autres qui existent !
On utilise un répertoire de notre sous domaine de gestion créé dans l’article précédent pour gérer les listes de diffusions.
A noter que ce sous domaine est en SSL donc certains paramètres changent.

Mailman

On installe la paquetage en choisissant les langues qu’on souhaite proposer et celle par défaut :

apt-get install mailman

On modifie la configuration de mailman pour s’accorder avec notrestructure de serveur et notre configuration du serveur mail :

nano /etc/mailman/mm_cfg.py

from Defaults import *
MAILMAN_SITE_LIST = ‘mailman’
DEFAULT_URL_PATTERN = ‘https://%s/mailman/’
PRIVATE_ARCHIVE_URL = ‘/mailman/private’
IMAGE_LOGOS = ‘/images/mailman/’
DEFAULT_EMAIL_HOST = ‘scribox.org’
DEFAULT_URL_HOST = ‘manager.scribox.org’
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
DEFAULT_SERVER_LANGUAGE = ‘en’
USE_ENVELOPE_SENDER = 0
DEFAULT_SEND_REMINDERS = 0
MTA=None

On initialise le programme en ajoutant la première liste mailman et on répond aux quelques questions à propos de la liste :

newlist mailman

On ajoute en fin de fichier les alias mails pour la gestion des listes et on prend en compte ces changements :

nano /etc/aliases


# Mailman aliases
mailman: “|/var/lib/mailman/mail/mailman post mailman”
mailman-admin: “|/var/lib/mailman/mail/mailman admin mailman”
mailman-bounces: “|/var/lib/mailman/mail/mailman bounces mailman”
mailman-confirm: “|/var/lib/mailman/mail/mailman confirm mailman”
mailman-join: “|/var/lib/mailman/mail/mailman join mailman”
mailman-leave: “|/var/lib/mailman/mail/mailman leave mailman”
mailman-owner: “|/var/lib/mailman/mail/mailman owner mailman”
mailman-request: “|/var/lib/mailman/mail/mailman request mailman”
mailman-subscribe: “|/var/lib/mailman/mail/mailman subscribe mailman”
mailman-unsubscribe: “|/var/lib/mailman/mail/mailman unsubscribe mailman”

newaliases

Et on redémarre le service :

/etc/init.d/mailman restart

Exim

Maintenant on va créer la configuration d’Exim pour Mailman.
En premier les options générales :

nano /etc/exim4/conf.d/main/04_mailman_options

# Mailman macro definitions
MM_HOME=/var/lib/mailman
MM_UID=list
MM_GID=list
domainlist mm_domains=manager.scribox.org
MM_WRAP=MM_HOME/mail/mailman
MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck

On continue avec les alias :

/etc/exim4/conf.d/router/450_mailman_aliases

mailman_router:
driver = accept
domains = +mm_domains
require_files = MM_LISTCHK
local_part_suffix_optional
local_part_suffix = -admin : \
-bounces : -bounces+* : \
-confirm : -confirm+* : \
-join : -leave : \
-owner : -request : \
-subscribe : -unsubscribe
transport = mailman_transport

Enfin les transports :

/etc/exim4/conf.d/transport/40_mailman_pipe

mailman_transport:
driver = pipe
command = MM_WRAP \
‘${if def:local_part_suffix \
{${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
{post}}’ \
$local_part
current_directory = MM_HOME
home_directory = MM_HOME
user = MM_UID
group = MM_GID

On fait prendre en compte les modifications par Exim puis on le redémarre :

update-exim4.conf
/etc/init.d/exim4 restart

Apache

Comme dit plus haut on utilise un sous-domaine créé précédemment pour accueillir nos listes de diffusions, de plus Mailman utilise CGI donc la configuration sera un peu différente de ce qu’on a déjà fait dans les articles précédents.
On ajoute les Alias :

nano /etc/apache2/conf.d/mailman

Alias /pipermail /var/lib/mailman/archives/public
Alias /images/mailman /usr/share/images/mailman
<directory /var/lib/mailman/archives/public>
DirectoryIndex index.html
</directory>

On modifie la configuration existante de l’hôte virtuel de notre sous domaine :

a2dissite manager.scribox.org
nano /etc/apache2/sites-available/manager.scribox.org

Voici à quoi ressemble notre fichier en complet avec les modifications du jour :

<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
ServerAdmin ma.vrai@.mail
ServerName manager.scribox.org
ServerAlias www.manager.scribox.org
DocumentRoot /var/www/manager.scribox.org
<Directory /var/www/manager.scribox.org/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
# On ajoute la redirection vers les listes
RedirectMatch ^/mailman$ /mailman/listinfo
</Directory>

# On ajoute le repertoire de gestions de listes
ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
<directory “/usr/lib/cgi-bin/mailman”>
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</directory>
</VirtualHost>

Et on remet tout en route :

a2ensite manager.scribox.org
service apache2 reload

Vérification

On peut vérifier si tout fonctionne bien dans notre navigateur web https://manager.scribox.org/mailman :
mailman_web.png
PS: Si on change la configuration de mailman comme par exemple l’URL d’accès, les listes déjà créées ne prendront pas en compte ces changements !

Au suivant

On a déjà installé pas mal de trucs ! Alors pendant qu’on est chaud on va s’installer un réducteur d’URLs perso.

Sources

Gestion de mail

Que serait notre installation de serveur sans passer par celle d’un serveur mail et également d’un client.

Autant vous le dire tout de suite, je n’avais pas envie de faire cette partie pour plusieurs raisons:

  • Je n’ai jamais eu de problème de quota, spam ou autre en passant par mon hébergeur,
  • Je n’ai pas spécialement besoin de mails sur mon serveur, à part envoyer des mail de service,
  • L’installation correct d’un serveur avec antispam et compagnie est très compliqué.

Mais il faut savoir repousser ses limites 😉

On installe donc Exim4, Dovecot, Roundcube, le tout utilisant IMAP en SSL.

Je rappel que tout ne vous servira pas forcément dans cette article, car il suit les différentes étapes de l’installation de notre serveur qui comprend par exemple le moteur de blog Dotclear ou encore un serveur MySQL distant…

Préambule

Je l’avais annoncé, l’installation de notre serveur/client mail ne s’est pas déroulé sans accroc ! En partie à cause de ma bêtise mais également parce que ça ne se passe jamais comme annoncé… Pour la petite histoire, je voulais installer postfix puisque le plus grand nombre de tutoriels portait sur ce programme, malheureusement la plupart n’était que des copier/coller les uns des autres et se compliquait la vie pour pas grand chose finalement. Le pire est que j’ai eu énormément de mal à retourner en arrière pour remettre mon serveur à sa configuration d’origine, car postfix n’aime pas se désinstaller, le système voulant réinstaller dans la foulé exim4, ce qui ne fonctionnait pas ! Bref le chien qui se mord la queue…
C’est pourquoi à force de chercher de l’aide sur le net je suis tombé sur un début de réponse tout simple utilisant exim4, je me suis donc essayer à l’installer… avec succès.

Prérequis

Notre serveur va avoir besoin de quelques modifications pour devenir un serveur/client mail. Il faut ajouter des panneaux chez notre registrar pour indiquer le chemin vers notre serveur, il faut déverrouiller certaines portes de notre serveur, et il faut modifier le détecteur de métal de Apache qui ne sait en faire fonctionner qu’un seul pour tout l’immeuble. C’est parti !

Modification d’Apache
Les versions installées sur notre machine d’Apache et d’OpenSSL ne permettent pas (du moins pas simplement) de faire fonctionner plusieurs Vituals Hosts en SSL, il va falloir modifier notre structure de dossier. Notre zone d’administration des blogs Dotclear et notre client mail ont besoin de SSL, il faut donc les regrouper sur le même Virtual Host, (on choisi manager.scribox.org) et on utilisera les URLsmanager.scribox.org/dotclear et manager.scribox.org/roundcube.
Commençons par créer un sous-domaine chez notre registrar qui sera réservé au SSL. Pour cela on créer un champs de Type CNAME pour notre sous-domaine manager.scribox.org pointant vers le domaine principalescribox.org.
On crée le Virtual Host SSL dans Apache :

nano /etc/apache2/sites-available/manager.scribox.org

<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
ServerAdmin ma.vrai@.mail
ServerName manager.scribox.org
ServerAlias www.manager.scribox.org
DocumentRoot /var/www/manager.scribox.org
<Directory /var/www/manager.scribox.org/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

On créé le répertoire web et on y met un fichier index quelconque :

mkidr /var/www/manager.scribox.org/
echo '<html><head><title>manager</title></head><body><h1>manager</h1></body></html>' > /var/www/manager.scribox.org/index.html

On créé un lien symbolique dans ce sous domaine pour pointer vers notre administration de Dotclear :

ln -s /var/dotclear/admin/ /var/www/manager.scribox.org/dotclear

Et on modifie la configuration de Dotclear :

nano /var/dotclear/inc/config.php


define(‘DC_ADMIN_URL’,’https://manager.scribox.org/dotclear/’);

On désactive l’ancien Host, on active le nouvel Host, et on relance Apache :

a2dissite admin.scribox.org
a2ensite manager.scribox.org
service apache2 reload

On peut supprimer l’ancienne configuration histoire de ne pas trop laisser trainer de chose inutile sur le serveur :

rm /etc/apache2/sites-available/admin.scribox.org

Modification Zone DNS
Il faut configurer les Zone DNS chez notre Registrar, comme je suis chez OVH on va prendre cette exemple. Dans notre manager OVH (v3) on sélectionne le domaine qu’on a déjà choisi pour la partie web de notre serveur, puis le menu Accueil > Domaines & DNS > Zone DNS (Mode avancé)
Il faut supprimer tous les enregistrements en rapport aux mails, créer un alias manager.scribox.org de type CNAME pointant sur le domaine principal de notre serveur scribox.org puis créer un champs de type MX 1 pointant également vers le domaine principale de notre serveurscribox.org. chez OVH il faut cocher la case Forcer l’opération
mx_form_zonedns.png
Voici à quoi ressemble notre Zone DNS depuis le début de la configuration de notre serveur :
mx_zonedns.png
J’ai également supprimer le sous-domaine utilisé par l’administration de Dotclear, et créer un sous-domaine imap.scribox.org qui servira (pour faire joli) un peu plus bas.
Il faut que les informations concordent entre notre Registrar et notre serveur c’est pourquoi sur notre serveur on commence par vérifier les fichiers hosts et hostname qu’on a déjà modifié auparavant pour queexim4 soit moins grincheux :

echo 'scribox.org' > /etc/hostname
nano /etc/hosts


127.0.0.1 localhost.localdomain localhost
# Auto-generated hostname. Please do not remove this comment.
123.456.654.321 scribox.org vps12345.ovh.net

Dans ces deux fichiers on a remplacé notre joli nom de machine par son nom de domaine principal.
On prend en compte les modifications :

hostname --file /etc/hostname
hostname scribox.org

Modification du firewall
Lorsque nous avons mis en place notre firewall on ne pensait pas installer un serveur mail, du coup il faut retourner le modifier. Pour cela on ajoute les règles spécifiques au passage des mails dans la configuration du pare feu et on la prend en compte, ici on utilise uniquement le protocole IMAP sécurisé :

nano /etc/init.d/firewall


# Mail IMAPS
iptables -t filter -A INPUT -p tcp –dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp –dport 993 -j ACCEPT

nano /etc/init.d/firewall

Nota: On laisse quand même la règle de sortie de SMTP sur le port 25.

Installation du MTA (Mail Transfer Agent) Exim4

Pour rappel et pour faire simple, le MTA permet de faire la laison entre tout le monde pour la gestion des mails.
Afin d’éviter des problèmes lors de l’installation, on arrête sendmail:

service sendmail stop

On installe Exim4 :

apt-get install exim4-daemon-heavy

J’espère que vous n’avez pas postfix d’installé sinon vous allez galérer ! En cherchant sur le web, j’ai trouvé des commandes pour faire le ménage et pourvoir installer Exim4 après un passage depostfix, je vous laisse galérer un peu si c’est le cas…
Bref, ensuite on configure le paquet :

dpkg-reconfigure exim4-config
  1. On choisi une installation Site internet‘,
  2. on lui donne le nom de domaine principal en nom de courriel,
  3. on ne met rien pour les IP d’écoute (connexions entrantes),
  4. on ne met rien pour les domaines acceptés,
  5. on ne mat rien pour le relais de domaine,
  6. on ne met rien pour le relais de machine,
  7. on répond non pour minimiser les requetes DNS
  8. on choisi le format Maildir pour la méthode de distribution,
  9. on répond oui à la séparation des fichiers de configuration.

Normalement, notre serveur mail est prêt.

Installation du serveur IMAPS Dovecot

Pour rappel et pour faire simple le serveur IMAPS va permettre de lire ses mails dans un client de messagerie convivial.
On installe le paquetage :

apt-get install dovecot-imapd

Puis on va modifier sa configuration manuellement :

nano /etc/dovecot/dovecot.conf

Voici mon fichier sans les commentaires :

## Dovecot configuration file

protocols = imaps managesieve
listen = localhost
protocol imap {
listen = *:993
ssl_listen = *:993
}
protocol managesieve {
listen = *:4190
}
disable_plaintext_auth = yes
log_timestamp = “%Y-%m-%d %H:%M:%S ”
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
mail_privileged_group = mail
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
postmaster_address = ma.vrai@.mail
mail_plugins = sieve
}
auth default {
mechanisms = plain
passdb pam {
args =
}
userdb passwd {
}
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
}
client {
path = /var/run/dovecot/auth-client
mode = 0660
}
}
}
dict {
}
plugin {
}

Et c’est tout, normalement on peut accéder à nos mail depuis notre client de messagerie préféré avec les options suivantes :

  • Serveur entrant: IMAP
  • Nom d’hôte de serveur: imap.scribox.org
  • Port de connexion: 993
  • Sécurité de connexion: SSL/TLS
  • Authentification: Mot de passe normal
  • Pour le smtp sortant, on prend celui de notre registrar.

Installation du client web Roundcube

Pour rappel et pour faire simple, Roundcube est notre interface graphique de gestions de mail. Notre boite mail quoi !
J’ai commencé par installer SquirelMail mais il faut dire la vérité, il est moche ! Du coup on va plutôt installer Roundcube même si l’utilisation de MySQL rend la tache plus compliquée.
On commence par installer les paquetages :

apt-get install roundcube roundcube-mysql

Malheureusement l’installation ne fonctionne pas car il n’arrive pas à se connecter à la base de données distante. Mais il a quand même eu le temps de créer quelques fichiers qui nous intéressent. On modifie manuellement le fichier :

nano /etc/dbconfig-common/roundcube.conf

Les lignes qui nous intéressent sont les suivantes, on les remplis suivant la configuration qu’on a mise en place lors de l’installation du VPS_SQL et de PhpMyAdmin :


dbc_dbserver=’IP.DU.VPS.SQL’

dbc_dbport=’PORT_SQL_DU_VPS_SQL’

dbc_dbadmin=’vpsweb’

Une fois enregistré on relance l’installation et il devrait pouvoir se connecter :

apt-get install roundcube roundcube-mysql

Mais comme il est très tenace cela ne suffira pas, le fichier de connexion de Roundcube à la base de donnée ne contient pas encore les bonnes infos ! On le modifie manuellement :

nano /etc/roundcube/debian-db.php


$dbserver=’IP.DU.VPS.SQL’;
$dbport=’PORT_SQL_DU_VPS_SQL’;
$dbtype=’mysql’;

On en profite pour modifier la page de login pour que l’utilisateur n’est pas le choix du serveur :

nano /var/lib/roundcube/config/main.inc.php

On recherche et on modifie les lignes suivantes :


$rcmail_config[‘auto_create_user’] = TRUE;
$rcmail_config[‘default_host’] = ‘ssl://imap.scribox.org’;
$rcmail_config[‘default_port’] = 993;

On va ensuite dé commenter les deux lignes d’Alias dans le fichier de configuration de Roundcube pour apache :

nano /etc/apache2/conf.d/roundcube


Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/
Alias /roundcube /var/lib/roundcube

On relance apache et on test dans notre navigateur :

service apache2 reload

Pour l’URL il faut écrire notre domaine en https :
roundcube_https_ok.png
Ouf, ça fonctionne. J’espère que chez vous aussi…

Antispam

Sans rentrer dans le détail on va installer spamassassin :

apt-get install spamassassin

On modifie sa configuration de base pour activer le démon et la mise à jour auto des filtres :

command sed -i -e 's/^ENABLED=.*/ENABLED=1/' -e 's/^CRON=.*/CRON=1/' '/etc/default/spamassassin'

On retourne pour la énième fois modifier notre pare feu pour y ajouter une règle :

nano /etc/init.d/firewall


# SpamAssassin
iptables -A INPUT -p tcp -m tcp –syn –dport 783 -j ACCEPT

etc/init.d/firewall

On modifie la configuration de Exim et décommentant et vérifiant la ligne suivante :

nano /etc/exim4/conf.d/main/02_exim4-config_options

spamd_address = 127.0.0.1 783

Et on recharge Exim et on démarre le démon spamassassin :

/service exim4 restart
/service spamassassin restart

Pour aller plus loin

Il resterait à modifier les Alias de Roundcube dans Apache car pour l’instant Roundcube est accessible sur tous les hosts virtuels, on peut également amélioré l’entrée de l’utilisateur en modifiant le fichier /var/lib/roundcube/config/main.inc.php.
Il faudrait surtout installer des règles plus précises pour l’antispam et antivirus mais ce sera pour un prochain épisode…

Au suivant

Maintenant que notre serveur gère les mails on va pouvoir lui ajouter la gestion de listes de diffusions (mailing list).

Sources

Les suivants sont pour postfix, au cas ou ça intéresse quelqu’un :

Faire des sauvegardes

L’installation de notre serveur est bien avancé et on commence à l’utiliser, il serait bien de mettre en place un système de sauvegardes.

Préambule

Différentes solutions de sauvegarde existent, du simple script qui sauvegarde un fichier au système complet de backups, synchronisé ou non. Notre installation se situe entre les deux, c’est à dire qu’elle est assez complexe avec ses deux machines pour faire plus que copier un répertoire vers un autre mais pas assez pour avoir des machines supplémentaires dédiées à la redondance ou aux backups. De plus je suppose que notre hébergeur a ses propres systèmes de sauvegardes en interne, donc on va se contenter de sauvegarder quelques répertoires du serveur Web et la base de données du serveur SQL. Chacune des deux machines servira d’espace de sauvegarde à l’autre, ce sera suffisant pour ce qu’on en fait et pour notre budget ! Le risque est de faire la même bourde sur les deux machines, ou qu’une machine vérolée infecte l’autre dans quels cas on perdra tout.
Notre choix s’arrête sur le paquetage backup-manager qui permet beaucoup de choses avec un configuration plutôt simple.
En plus des sauvegardes de notre VPS_WEB, on fait la sauvegarde de la base de données de la seconde machine ( VPS_SQL ) depuis le même programme, quand je vous dit que backup-manager sait tout faire ! On utilise notre VPS_WEB pour gérer la mécanique de sauvegarde.
Remarque: On pourrait faire l’inverse en utilisant la fonction pipe de backup-manager pour récupérer les répertoires du VPS_WEB sur le VPS_SQL.

Préparation

Il nous faut d’abord créer un utilisateur pour les 2 machines et qui gèrera les sauvegardes à travers SSH. Sur le serveur VPS_SQL on créé un utilisateur nommé vpsbackup et on l’autorise à se connecter par ssh :

adduser vpsbackup
echo "AllowUsers vpsbackup" >> /etc/ssh/sshd_config
/etc/init.d/ssh restart

Puis sur le serveur VPS_WEB on créé un utilisateur système nommévspbackup :

adduser vpsbackup

En se loguant avec ce nouvel utilisateur on créé une clé ssh qui nous permettra d’envoyer les sauvegardes vers l’autre VPS, on dit de mettre la clé dans /home/vpsbackup/.ssh/id_dsa, on ne met pas de passphrase :

su vpsbackup
ssh-keygen -t dsa

Maintenant on va envoyer notre clé vers le VPS_SQL (on note ici la manière de renseigner le port SSH configuré plus tôt à la commande) :

ssh-copy-id -i ~/.ssh/id_dsa.pub "-p PORT_SSH_DU_VPS_SQL vpsbackup@"

Il demande le mot de passe de l’utilisateur vpsbackup puis indique qu’il a copier la clé. On test la connexion avec :

ssh -p PORT_SSH_DU_VPS_SQL vpsbackup@

Le prompt à changer en indiquant le nom de la machine. Tout est OK on peut se déloguer de la session SSH et ensuite de l’utilisateur vpsbackup :

exit
exit

Ensuite on crée le répertoire qui contiendra les sauvegardes qu’on donne à l’utilisateur nouvellement créé :

mkdir /var/vspbackup
chown -R vspbackup:vspbackup /var/vspbackup

A noter que pour se connecter à MySQL sur la seconde machine, on utilise le compte MySQL vpsweb créer lors de l’installation de PhpMyAdmin.

Installation

Sur notre VPS_WEB on installe le paquetage :

apt-get install backup-manager

La fenêtre de configuration apparait, on lui indique le dossier de destination des sauvegardes /var/vpsbackup, le propriétaire des sauvegardes sera root ainsi que le groupe, et au vue de notrestructure de dossier on lui dit de sauvegarder /etc /root /home /usr/local/bin /var/www ainsi que la base SQL, on créer des archives incrémentales avec une sauvegarde complète toutes les semaines.
On modifie son fichier de configuration pour coller à nos besoins :

nano /etc/backup-manager.conf

# REPOSITORY
export BM_REPOSITORY_ROOT=”/var/vpsackup”
export BM_TEMP_DIR=”/tmp”
export BM_REPOSITORY_SECURE=”true”
export BM_REPOSITORY_USER=”root”
export BM_REPOSITORY_GROUP=”root”
export BM_REPOSITORY_CHMOD=”770″
# ARCHIVE
export BM_ARCHIVE_CHMOD=”660″
export BM_ARCHIVE_TTL=”14″
export BM_REPOSITORY_RECURSIVEPURGE=”false”
export BM_ARCHIVE_PURGEDUPS=”true”
export BM_ARCHIVE_PREFIX=”$HOSTNAME”
export BM_ARCHIVE_STRICTPURGE=”true”
export BM_ARCHVIE_NICE_LEVEL=”10″
export BM_ARCHIVE_METHOD=”tarball-incremental mysql”
# ENCRYPTION
export BM_ENCRYPTION_METHOD=”false”
export BM_ENCRYPTION_RECIPIENT=””
# TARBALL
export BM_TARBALL_NAMEFORMAT=”long”
export BM_TARBALL_FILETYPE=”tar.gz”
export BM_TARBALL_OVER_SSH=”false”
export BM_TARBALL_DUMPSYMLINKS=”false”
export BM_TARBALL_DIRECTORIES=”/etc /root /home /usr/local/bin /var/www”
export BM_TARBALL_BLACKLIST=”/var/vpsbackup *.log”
export BM_TARBALL_SLICESIZE=”1000M”
export BM_TARBALL_EXTRA_OPTIONS=””
export BM_TARBALLINC_MASTERDATETYPE=”weekly”
export BM_TARBALLINC_MASTERDATEVALUE=”1″
# MYSQL
export BM_MYSQL_DATABASES=”__ALL__”
export BM_MYSQL_SAFEDUMPS=”true”
export BM_MYSQL_ADMINLOGIN=”vpsweb”
export BM_MYSQL_ADMINPASS=”MOT_DE_PASSE_SQL”
export BM_MYSQL_HOST=”IP_V4_DU_VPS_SQL”
export BM_MYSQL_PORT=”PORT_SQL_DU_VPS_SQL”
export BM_MYSQL_FILETYPE=”bzip2″
# UPLOADS METHODS
export BM_UPLOAD_METHOD=”scp”
export BM_UPLOAD_HOSTS=”IP_DU_VPS_SQL”
export BM_UPLOAD_DESTINATION=”/home/vpsbackup”
# SSH
export BM_UPLOAD_SSH_USER=”vpsbackup”
export BM_UPLOAD_SSH_KEY=”/home/vpsbackup/.ssh/id_dsa”
export BM_UPLOAD_SSH_HOSTS=”IP_V4_DU_VPS_SQL”
export BM_UPLOAD_SSH_PORT=”PORT_SSH_DU_VPS_SQL”
export BM_UPLOAD_SSH_DESTINATION=”/home/vpsbackup”
export BM_UPLOAD_SSH_PURGE=”true”
export BM_UPLOAD_SSH_TTL=”14″

Ne pas oublier de remplacer les IP et port par ceux qu’on a choisi tout au long de l’installation des serveurs et de désactiver toutes les autres méthodes présentes dans ce fichier.
On lance un premier backup pour tester :

backup-manager -v

On vérifie sur notre deuxième machine que les archives sont présentes dans /home/vpsbackup avec normalement une archive par répertoire sauvegardé, plus une archive pour mysql.
Et on vérifier sur note première machine que backup-manager s’est bien ajouté aux taches planifiées:

l /etc/cron.weekly/backup-manager

Et voila on aura de jolies sauvegardes.
Pour s’amuser, si vous avez suivi tous les épisodes de note installation de serveur, vous pouvez partager le répertoire /var/vpsbackup du VPS_WEB avec BitTorrent Sync vers votre NAS. (Attention toutefois si votre VPS est limité en bande passante par mois)

Au suivant

C’est bon on a fait des sauvegarde on peut maintenant tout casser en essayant d’installer un serveur mail.

Sources

Installer BitTorrent Sync

Moment de détente dans notre installation de serveur avec un tout nouveau jouet concurrent de Dropbox et consort nommé BTsync.

btsync.png
BitTorrent Sync est un outil de synchronisation sécurisée de fichiers disponible sur les plateformes Windows, Mac et Linux (et donc NAS) sérieux concurrent (on verra) aux Dropbox like, pour le découvrir on va l’installer sur notre VPS puis à la maison sur notre Windows.

Préparation du serveur

On télécharge l’archive et on la décompresse :

wget http://btsync.s3-website-us-east-1.amazonaws.com/btsync_x64.tar.gz
tar -zxvf btsync_x64.tar.gz -C /usr/local/bin/

On créé le script de service et on le rend exécutable :

nano /etc/init.d/btsync

#!/bin/sh
# btsync service
# Take from <https://gist.github.com/MendelGusmao/5398362>
# Replace with linux users you want to run BTSync clients for
BTSYNC_USERS=”jcdenis”
DAEMON=/usr/bin/btsync

start() {
echo “Starting btsync…”
for btsuser in $BTSYNC_USERS; do
HOMEDIR=`getent passwd $btsuser | cut -d: -f6`
if [ -d $HOMEDIR/.sync ]; then
HOME=”$HOMEDIR” start-stop-daemon -b -o -c $btsuser -S -u $btsuser -x $DAEMON — –config $HOMEDIR/.sync/config.json
fi
done
}

stop() {
echo “Stopping btsync…”
for btsuser in $BTSYNC_USERS; do
HOMEDIR=`getent passwd $btsuser | cut -d: -f6`
if [ -d $HOMEDIR/.sync ]; then
start-stop-daemon -o -c $btsuser -K -u $btsuser -x $DAEMON
fi
done
}

status() {
for btsuser in $BTSYNC_USERS; do
dbpid=`pgrep -u $btsuser btsync`
if [ -z “$dbpid” ]; then
echo “btsync for USER $btsuser: not running.”
else
echo “btsync for USER $btsuser: running (pid $dbpid)”
fi
done
}

case “$1” in
start)
start
;;
stop)
stop
;;
restart|reload|force-reload)
stop
start
;;
status)
status
;;
*)
echo “Usage: /etc/init.d/btsync {start|stop|reload|force-reload|restart|status}”
exit 1
esac

exit 0

chmod +x /usr/local/bin/btsync

On le place au démarrage, personnellement j’utilise sysv-rc-conf (voir les trucs et astuces) mais rcconf peut le faire tout aussi bien.

Partage du serveur

On passe à la partie concernant le partage de fichiers, dans le script prédécent j’ai autorisé l’utilisateur ‘jcdenis’, donc on continue avec lui. A noter qu’on n’utilisera pas l’interface web disponible.
Dans la home de l’utilisateur on va créer le répertoire partagé et un répertoire qui servira à la synchronisation et on va y placer son fichier de configuration:

mkdir /home/jcdenis/btshare
mkdir /home/jcdenis/.sync
btsync --dump-sample-config > /home/jcdenis/.sync/sync.conf

On met de coté une clé secrète qu’on créé avec :

btsync --generate-secret

Puis on modifie sa configuration :

nano /home/jcdenis/.sync/sync.conf

{
“device_name”: “ScriboxWeb”,
“listening_port”: 54321,
“storage_path”: “/home/jcdenis/.sync”,
“check_for_updates”: true,
“use_upnp”: false,
“download_limit”: 0,
“upload_limit”: 0,
“webui”: {
//”listen”: “0.0.0.0:8888”,
“login” : “admin”,
“password” : “password”
},
“shared_folders”: [
{
“secret” : “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”,
“dir” : “/home/jcdenis/btshare”,
“use_relay_server” : true,
“use_tracker” : true,
“use_dht” : false,
“search_lan” : true,
“use_sync_trash” : true,
“known_hosts” : []
}
]
}

N’oubliez pas de remplacer les valeurs ‘secret’ et ‘dir’ par les vôtres !
Enfin on dit à btsync de prendre en compte notre configuration :

btsync --config /home/jcdenis/.sync/sync.conf

Le serveur a un par feu, il faut le modifier pour autoriser le port 54321 qu’on vient de configurer en ajoutant :

nano /etc/init.d/firewall

# BitTorrent Sync
iptables -t filter -A OUTPUT -p tcp –dport 54321 -j ACCEPT
iptables -t filter -A OUTPUT -p udp –dport 54321 -j ACCEPT
iptables -t filter -A INPUT -p tcp –dport 54321 -j ACCEPT
iptables -t filter -A INPUT -p udp –dport 54321 -j ACCEPT

On prend en compte la modification :

/etc/init.d/firewall

Voila notre serveur est configuré.
Si par hasard il y a des bugs ou qu’on souhaite arrêter btsync, un petit killall btsync suffira. Ensuite il faudra relancer le service puis lui redonner notre configuration.

Partage local

Sur notre PC Windows, on installe BitTorrent Sync disponible ici
On ajoute un dossier à partager et on entre le ‘secret’ généré un peu plus tôt sur le serveur :
tbsync_win_1.png
On double click sur le dossier pour afficher ses préférences, on lui spécifie un hôte prédéfini avec l’IP de notre serveur et le port choisi plus haut :
tbsync_win_2.png
Et voila les répertoires des deux machines sont synchronisés !

Partage NAS

On va profiter du fait que j’ai un NAS pour tester BTsync dessus.
Suivant les gammes de NAS Synology l’architecture processeur n’est pas du tout la même, il va donc falloir trouver la votre, une liste complète est disponible sur le Wiki Synology. Pour mon vieux Synology DS211j ce sera la version ARM de BTsync.
En premier lieu il faut se connecter en SSH sur notre NAS, et donc activer ce service, pour cela rendez-vous dans l’interface web d’administration du NAS, puis dans Control Panel => Terminal => Enable SSH service et appliquer le changement.
conf_nas_ssh.png
Ensuite sur notre PC dans notre bon vieux PuTTY on se connecte à notre NAS avec le login root et le mot de passe du compte admin :
nas_ssh_start.png
On créé un répertoire pour les fichiers partagés, on télécharge l’archive de BTsync, on la décompresse et on démarre Btsync :

mkdir /var/sync
wget http://btsync.s3-website-us-east-1.amazonaws.com/btsync_arm.tar.gz
tar -zxvf btsync_arm.tar.gz
~/btsync

Maintenant on se rend dans l’interface web de gestion sur notre NAS sur le port 8888. (si vous avez un pare feu sur votre NAS, n’oubliez pas de l’ouvrir) On lui demande d’ajouter un dossier, on entre la clé secrète créé au début de cette article et on choisi le répertoire créé précédemment :
nas_btsync_gui.png
Et c’est tout !

Si les trois machines (NAS, PC, VPS) sont opérationnelles on devrait voir quelque chose comme ça :
btsync_NAS_PC_VPS_ok.png

Au suivant

C’est bien beau de jouer, mais si on casse tout, on perd tout, alors on va mettre en place un système de sauvegardes.

Sources

Quota

Notre installation Debian doit accueillir plusieurs utilisateurs pour lesquels il va falloir limiter l’espace pris par leur répertoire public de Dotclear. (comptes FTP et Dotclear)

Cette semaine j’ai pris un VPS Cloud pour voir, et il semblerait que sur cette version on dispose d’un accès à /etc/fstab et avec un vrai disque dedans et qu’on puisse activer les quotas dessus sans installation de modules de kernel ou autres !

Prérequis

Bonne nouvelle, le noyau Debian des VPS OVH et OpenVz supportent par défaut les quotas, pas besoin de se torturer à préparer des partitions, installer des programmes, etc…
Mauvaise nouvelle cela ne fonctionne pas ! En effet les containers VPS Classic d’OVH ont leur serveur maitre sous OpenVz qui permet de gérer les options usrquota et grpquota sur la partition principale en simfs, mais malheureusement pour les machines virtuelles, ce n’est pas activé, et pas question pour ces machines d’utiliser vzquota et vzctl pour le faire. On aurait pu passer par les outils traditionnels que sont quota et quotatool mais sans entrer dans les détails encore une fois cela ne fonctionne pas à cause d’un bug enfin plutôt d’une envie “à la con” des développeurs d’avoir modifier les chemins des infos partitions (rapport à /etc/fstab, /etc/mtab, /proc/self/mounts, etc…) pour la machine virtuelle, du coup tous ces outils restent muet ne trouvant par leur bonheur… (Sans compter que le modprobe loop est indisponible pour créer ses propres systèmes de fichiers acceptant les quotas)
J’ai fait une petite demande à @ pour que les sysadmin activent l’option, on verra si l’info remonte…
Bref j’ai perdu 2 jours à essayer de trouver un tour de passe passe pour utiliser les quotas et j’abandonne, pas non plus envie de compiler un noyau ce n’est pas de mon niveau, à moins que la modif soit faites sur l’install OpenVz d’OVH (ce qui prendrait 2 clics au sysadmin je pense….)

Au suivant

Cela n’empêche en rien de continuer, ce qu’on fait avec l’installation du serveur web Apache2.

Sources

Quelques idées au cas ou je le fasse un jour…

Trucs et astuces

L’installation de notre serveur est fonctionnelle toutefois on peut toujours l’améliorer.

Sans entrer dans de longues explications voici quelques commandes que vous pourrez approfondir pour vous-même en faisant des recherches sur internet, je vous recommande également d’abuser de la commande man et des aides en ligne ( –help) des programmes, je vous conseil aussi une source intéressante montrant souvent plusieurs solutions/points de vue qui est StackOverflow. Comme pour mes autres articles, j’ajouterai et/ou modifierai cette page au fur et à mesure de mes découvertes.
Et ne rigolez pas si vous êtes un expert, car pour ma part, je débute.

Gagner du temps

Créer un fichier
La méthode lente serait d’ouvrir le fichier avec un éditeur, de la modifier puis de l’enregistrer:

nano plop

#!/bin/bash

Ctrl-X y [Enter]
Une méthode plus rapide est de tout faire en ligne commande:

echo '!#bin/bash' > plop

Modifier un fichier
Si par la suite on veux ajouter une ligne a la fin du fichier:

echo '#OPTION="off"' >> plop

On peut directement dé commenter et modifier une ligne avec la commande sed:

sed -i -e "s/[#]*\(.*OPTION=\).*$/\1\"on\"/" 'plop'

Écriture de conditions
Dans un script il y a toujours des test de conditions, if, else, on peut les écrire de différentes manières.
La version longue:

#!/bin/bash
myvar=’1′
if [ “$myvar” -eq 1 ]
then
my_function “$myvar”
fi

Et la version courte:

#!/bin/bash
[ “$myvar” -eq 1 ] && my_function “$myvar”

Grâce aux && la fonction en deuxième partie ne sera exécutée que si la première partie est vrai.

IP machine
Sur les VPS d’OVH l’interface réseau n’est pas eth0 mais venet0 et la première IP de la machine est sur venet0:0 il est alors simple de l’extraire avec:

ifconfig venet0:0 | grep inet | cut -d: -f2 | cut -d' ' -f1

On peut également utiliser un autre tour de passe passe:

grep $(cat '/etc/hostname') /etc/hosts | cut -d' ' -f1 | head -n 1

Tweaks

Nombres de processus
Pour ne pas plomber la machine et prévenir certaines attaques ou simplement défaut de notre installation qui pourrait voir son nombre de processus et donc son occupation mémoire grimper en flèche, on fait simple et rapide en limitant le nombre de processus sur la machine à 100:

echo "* hard nproc 100" >> /etc/security/limits.conf

Il est possible d’affiner cette règle par utilisateur, processus, etc…

Moins de programme au démarrage
Il y a dans notre configuration des programmes dont on ne se sert pas et qui pourtant sont exécutés au démarrage et tournent en tache de fond. Plusieurs méthodes existent pour les désactiver.
Par exemple, on ne se sert pas de Bind, on l’arrête et on l’enlève du démarrage avec les commandes:

service bind9 stop
update-rc.d -f bind9 remove

On peut aussi utiliser un programme bien pratique et visuel:

apt-get install sysv-rc-conf
sysv-rc-conf

On décoche les services inutiles avec la barre d’espace, on peut stopper directement les service depuis ce programme avec la touche ‘-‘ et on quitte avec la touche ‘q’.
Au prochain reboot ces services ne s’exécuteront pas.

Windows

Vous êtes comme moi un utilisateur de Microsoft Windows, hé oui ça arrive, voici quelques astuces spéciales Windows. Envoyer un fichier par SSH
Pour directement envoyer un fichier depuis un ordinateur Windows vers une machine Linux en passant par le protocole SSH on utilise un des outils de PuTTY. On ouvre un “Invite de commandes” et on prépare un répertoire spécial pour les transfert, pour cela on créé un dossier à la racine de la partition système, on y place le programme qui va bien et on le dit à Windows:

cd C:\
mkdir scp
cd C:\scp
copy "C:\Program Files\PuTTY\pscp.exe" pscp.exe
set Path=%Path%;C:\scp\

Pour envoyer un fichier vers la machine Linux, on met ce fichier dans ce répertoire et on utilise la commande:

cd C:\scp
pscp.exe -P PORT FICHIER LOGIN@.DU.SERVEUR:DOSSIER_SERVEUR

Ici j’ai ajouté le port car sur ma machine SSH n’est pas sur le port par défaut, et il faut que votre LOGIN est le droit d’écriture sur le dossier ou vous envoyer le fichier.

Au suivant

Toujours pour se détendre et pour essayer de nouveau jouet, dans le prochain article on va installer BitTorrent Sync.

Entretien du système

Pour que notre installation de serveur web reste belle et propre, il faut la maintenir à jour.

Mise à jour et nettoyage

Il faut maintenir notre système à jour, certains utilisent des scripts lancés en cron qui mettent à jour le système sans rien demander, mais on ne va pas aller jusque la, en effet il est préférable de valider quel paquetage doit être mis à jour ou non. (Nouvelle version de php incompatible avec nos sites, etc…) Il faut également faire le ménage dans ce que contient la machine, programmes inutiles, vieux fichiers, logs… On va simplement créé un script qu’on lancera de temps en temps et qui contient toutes les commandes pour garder à jour note système.

Mise en place

Tout d’abords on va ajouter un ou deux programmes :

apt-get install deborphan debian-goodies

On créé un fichier qu’on va limiter à l’utilisateur root et qu’on pourra lancer de n’importe ou :

echo '#!/bin/bash' > /usr/local/bin/scriboxupd
chown root:root /usr/local/bin/scriboxupd
chmod 700 /usr/local/bin/scriboxupd

Script

Les commandes exécutées par le script sont commentées dedans :

nano /usr/local/bin/scriboxupd

#!/bin/bash
# Automatic update and cleaning of the system
#
# More detail about this script on:
# http://jcd.lv/post/2013/04/01/Debian-squeeze-64-sur-VPS-OVH
#
# Copyright (c) Jean-Christian Denis <http://jcd.lv>
# This script is licensed under GNU GPL version 2.0 or above
#
# Version: 2013.04.19.1
#
PROGNAME=$(basename $0)

echo “System maintenance script”

# Display error and exit
function error_exit
{
echo -e “${PROGNAME}: ${1:-“Unknow error”}” 1>&2
exit 1
}

# Test commands and exit if not exist (can check up to 9 commands at once)
function command_exist
{
# Loop through arguments
for arg in $*
do
# Use ‘command -v’ wich return 0 when argument not found
command -v $arg >/dev/null || error_exit “Missing command ‘$arg’.”
done
}

# Display a beautiful message
function part_msg
{
echo -e “\e[33m [+] ${PROGNAME}: ${1:-“Starting new action”}…\e[0m”
}

# Script requires root privilege
[ “$UID” -ne 0 ] && error_exit “Require root privileges. \nTry ‘sudo $PROGNAME”

# Check required programmes
command_exist ‘apt-get’ ‘dpkg’ ‘rkhunter’ ‘deborphan’ ‘checkrestart’

# Parse script arguments
force=
for argument in $*
do
case $argument in
# Script reply Yes to all query if you use ‘scriboxupd -force’
“-force”) force=” -y” ;;
“-f”) force=” -y” ;;
*) error_exit “Unknow argument.”
esac
done

# Actions (self explain)

part_msg “Update packages list”
apt-get update

part_msg “Upgrade packages”
apt-get upgrade $force

part_msg “Clean packages list”
apt-get clean

part_msg “Auto clean packages”
apt-get autoclean

part_msg “Auto remove packages”
apt-get autoremove

part_msg “Purge config”
dpkg –purge $(COLUMNS=200 dpkg -l | grep “^rc” | tr -s ‘ ‘ | cut -d ‘ ‘ -f 2)

part_msg “Remove orphan packages”
apt-get remove –purge `deborphan –guess-all` $force

part_msg “Anti rootkit propupd”
rkhunter –propupd

part_msg “Anti rootkit update”
rkhunter –update

part_msg “Check services using old libraries”
checkrestart -v

echo “$PROGNAME: Update successfully completed”
exit 0

Comme on a pas de tête on ajoute un petit rappel dans notre bash qui sera affiché lors de nos connexions à la console :

echo "echo 'Remember to maintain your system up to date with scriboxupd'" >> /home/jcdenis/.bashrc

Il n’y a plus qu’à tester en relançant notre bash puis la commande :

. /home/jcdenis/.bashrc
scriboxupd

Au suivant

On reviendra sur ce script au fur et à mesure de nos besoins et de nos découvertes, pour l’instant ce n’est qu’un entrainement à l’écriture de script shell. Dans le prochain article on va se détendre un peu et voir quelques trucs et astuces pour gagner du temps.

Sources

Script d’ajout de blog

Pour aller plus loin de l’installation de notre serveur, on va écrire un script de création de blog qui nous facilitera la vie.

Je ne vous explique pas en détail ce que contient ce script qui à mon avis n’est pas terminé. Je vos conseil de reprendre juste la structure des actions à mener puis de le réécrire vous même, c’est un très bon exercice pour apprendre à écrire des script shell. Ce script permet juste avec quelques questions d’ouvrir un nouveau blog sur notre plateforme avec son administrateur, ses répertoires, son sous-domaines et son accès FTP, etc…Toutes les actions qu’il effectue sont prévues uniquement pour une installation strictement identique à celle de notre série d’article mais vous pouvez largement vous en inspirer et l’adapter sans trop de mal à votre serveur. C’est mon premier vrai script alors soyez indulgents.

Installation

Vous le trouverez en pièce jointe de cet article, il suffit de le rapatrier sur votre serveur et le rendre exécutable :

wget http://jcd.lv/public/VPSOVH/dcnewblog
mv dcnewblog /usr/local/bin/dcnewblog
chown root:root /usr/local/bin/dcnewblog
chmod 770 /usr/local/bin/dcnewblog

PS: Si vous l’exécutez sur votre serveur sans même avoir jeté un coup d’œil dans son code, vous ne méritez pas d’avoir un serveur !

Script

#!/bin/bash
#
# A shell script to create a new Dotclear’s blog
# with associated new user, domain, vhost, ftp…
#
# Copyright (c) Jean-Christian Denis <http://jcd.lv>
# This script is licensed under GNU GPL version 2.0 or above
#
# All the path, programs, IP, port etc present in this script
# are for our specific installation of our server.
#
# Get more detail about this script at:
# <http://jcd.lv/post/2013/04/10/Script-d-ajout-de-blog>
#
# And more detail about our server installation at:
# <http://jcd.lv/post/2013/04/01/Debian-squeeze-64-sur-VPS-OVH>
#
# TODO:
# – Pick up server domain from apache
# – Set user quota
#

PROGNAME=$(basename $0) # Program name
PROGVERSION=’2013.04.21.1′ # Program version

clear # Clean up the console and say hello
echo “Dotclear’s new blog creation script”

#
# Help and usage of this script
#

scriptusage=”
$PROGNAME help and usage:

** Exemples **
$PROGNAME -f -p /var/dotclear -l newuser -m newuser@.com -d exemple.com

** Arguments **
-p, \-dotclear-path Dotclear’s root directory -p /var/dotclear
-d, \-server-domain Blogs main domain -d exemple.com
-m, \-blog email Blog contact email -m my.real@.mail
-l, \-blog-login Blog identifiant -l MyFirstBlog
-f, \-fake-mode Do nothing (fake mode) -f
-h, \-help This help -h
-v, \-version Show program version -v

** Fake mode **
Execute script but do nothing on accounts and SQL and FTP.

** About Dotclear’s root directory **
This script uses Dotclear’s configuration file that
contains all we need to connect to the SQL server,
generate password, etc…

** About blog identifiant **
The blog identifiant is used in multiple places.
– the blog id, of course
– the blog name, can be changed later
– the blog administrator login
– the blog sub-domain name
– the FTP user account
– the system user account

** About author **
More detail about this script on:
<http://jcd.lv/?q=Script-d-ajout-de-blog>

Copyright (c) Jean-Christian Denis <http://jcd.lv>
This script is licensed under GNU GPL version 2.0 or above

#
# List of variables used in this script
#

fakemode= # Fake mode, do not execute actions
showend= # Memory for a cooool display

serverip= # This server IPv4
serverdomain= # Blogs main server domain name
ftpport= # FTP server listen port

dcpath= # Dotclear’s install path
dcfile= # Dotclear’s configuration file path
dcdbhost= # Dotclear’s database host
dcdbuser= # Dotclear’s database port
dcdbpassword= # Dotclear’s database password
dcdbname= # Dotclaer’s database name
dcdbprefix= # Dotclear’s database table prefix
dcmasterkey= # Dotclear’s master key
dcadminurl= # Dotclear’s administration URL

bloglogin= # Blog administrator login (and blog id…)
blogemail= # Blog administrator email
blogpassword= # Blog administration password
bloguid= # Blog unique identifiant
blogurl= # Blog public URL
blogdate= # Blog creation date

#
# Functions
#

# Error that stop script execution
# Take one argument: <message>
function error_exit
{
echo -e “${PROGNAME}: Abording script execution – ${1:-“Unknow error”}” 1>&2
exit 1
}

# Display a warning message
# Take one argument: <message>
function error_msg
{
showend=
echo -e “\e[30;31m/!\ \e[0m${1:-“Unknow warning”}”
return 0
}

# Display a query
# Take one argument: <message>
function query_msg
{
echo -e “\e[30;36m(?) \e[0m${1:-“What is your answer”}? ”
return 0
}

# Display a message if it is in fake mode
# Take one argument: <message>
function fake_msg
{
echo -e “\e[30;33m [ fake mode ]\e[0m ”
return 0
}

# Display one line of detail of variables
# Take 2 arguments: <name> <value>
function detail_msg
{
# Find lengh of argument
n=”$1″
l=$(echo ${#n})

# Split display with tab
if [ “$l” -lt 12 ]; then
t=” ”
elif [ “$l” -gt 19 ]; then
t=” ”
else
t=” ”
fi

# Display formated message
echo -e “\e[30;35m – \e[0m$1$t$2”
return 0
}

# Display a message that begin a script block
# Take one argument: <message>
function begin_block
{
showend=1
echo -e “\e[30;33m[+] \e[0m${1:-“Starting new action”}… ”
return 0
}

# Display a message that end a script block
# Take no arguments
function end_block
{
if [ -n “$showend” ]; then shwoend=; echo -e “\e[30;32m->- \e[0mDone”; fi
return 0
}

# Display the script help
# Take no arguments
function show_usage
{
echo -e “$scriptusage”
exit 0
}

# Display the script version
# Take no arguments
function show_version
{
echo -e “$PROGNAME $PROGVERSION”
exit 0
}

# Test commands and exit if not exist
# Take up to 9 arguments: <command name to check>
function command_exist
{
# Loop through arguments
for arg in $*
do
# ‘command -v’ returns 0 when argument not found
command -v $arg >/dev/null || error_exit “Missing command ‘$arg’.”
done
return 0
}

# Check if Dotlcear’s path exists
# Take one argument: <dcpath>
function check_dc_path
{
# Path is not empty and it is a directory
if [ -n “$1” -a -d “$1″ ]; then
dcpath=”$1”
check_dc_file “$1”
return 0
else
dcpath=
dcfile=
error_msg “Require a valid Dotclear’s path.”
return 1
fi
}

# Check if Dotclear’s configuation file exists
# Take one argument: <dcpath>
function check_dc_file
{
# File name
f=”$1″”/inc/config.php”
# File name is not empty and it is a file and it is readable
if [ -n “$f” -a -f “$f” -a -r “$f” ]; then
dcfile=”$f”
return 0
else
dcpath=
dcfile=
error_msg “Failed to read Dotclear’s configuration file.”
return 1
fi
}

# Check server domain
# Take one argument: <serverdomain>
function check_server_domain
{
# Domain contains letters and numbers and one dot near the end
if [[ “$1″ =~ ^[A-Za-z0-9]{2,}\.[A-Za-z]{2,4}$ ]]; then
serverdomain=”$1″
return 0
else
serverdomain=””
error_msg “Server domain is not valid.”
return 1
fi
}

# Check if identifiant is used on whole system
# Take one argument: <bloglogin>
function check_identifiant
{
# Check form of bloglogin
check_blog_login “$1”
[ $? -eq 1 ] && return 1

# Check system user
check_system_account “$1”
[ $? -eq 1 ] && return 1

# Check ftp account
check_ftp_account “$1”
[ $? -eq 1 ] && return 1

# This part was removed as dotclear user has not right on mysql table
# Check sql account
#check_sql_account “$1”
#[ $? -eq 1 ] && return 1

# Check Dotclear account
check_dotclear_account “$1”
[ $? -eq 1 ] && return 1

return 0
}

# Check blog login form
# Take one argument: <bloglogin>
function check_blog_login
{
# Login contains only 4 to 24 letters
if [[ “$1″ =~ ^[A-Za-z]{5,24}$ ]]; then
bloglogin=”$1”
return 0
else
bloglogin=
error_msg “Blog login is not valid.”
return 1
fi
}

# Check if blog login is a system user
# Take one argument: <bloglogin>
function check_system_account
{
rsp=$(n=$(egrep “^$1” /etc/passwd 2>/dev/null); echo $?)

if [ $rsp -eq 2 ]; then
bloglogin=
error_exit “Failed to read system user file”
return 1

elif [ $rsp -eq 0 ]; then
bloglogin=
error_msg “That blog login already exists (System)”
return 1

else
return 0
fi
}

# Check if blog login is a ftp account
# Take one argument: <bloglogin>
function check_ftp_account
{
rsp=$(n=$(egrep “^$1” /etc/vsftpd/passwd 2>/dev/null); echo $?)

if [ $rsp -eq 2 ]; then
bloglogin=
error_exit “Failed to read FTP user file”
return 1

elif [ $rsp -eq 0 ]; then
bloglogin=
error_msg “That blog login already exists (vsFTPd)”
return 1

else
return 0
fi
}

# Check if blog logi is a sql account
# Take one argument: <bloglogin>
function check_sql_account
{
q=”SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = ‘”$1″‘)”
rsp=$(mysql \-batch \-skip-column-names -h “$dcdbhost” -P “$dcdbport” -u “$dcdbuser” -p”$dcdbpassword” -e “$q” 2>/dev/null)

if [ $? -ne 0 ]; then
bloglogin=
error_exit “Failed to connect to MySQL server”
return 1

elif [ $rsp -eq 1 ]; then
bloglogin=
error_msg “That blog login already exists (MySQL)”
return 1

else
return 0
fi
}

# Check if blog login is a Dotcler account
# Take one argument: <bloglogin>
function check_dotclear_account
{
# Check Dotclear’s user
q=”SELECT EXISTS(SELECT 1 FROM “$dcdbprefix”user WHERE user_id = ‘”$1″‘)”
rsp=$(echo “$q” | mysql -s -h “$dcdbhost” -P “$dcdbport” -D “$dcdbname” -u “$dcdbuser” -p”$dcdbpassword” 2>/dev/null)

if [ $? -ne 0 ]; then
bloglogin=
error_exit “Failed to query MySQL server”
return 1

elif [ $rsp -eq 1 ]; then
bloglogin=
error_msg “That blog login already exists (Dotclear user)”
return 1
fi

# Check Dotclear’s blog
q=”SELECT EXISTS(SELECT 1 FROM “$dcdbprefix”blog WHERE blog_id = ‘”$1″‘)”
rsp=$(echo “$q” | mysql -s -h “$dcdbhost” -P “$dcdbport” -D “$dcdbname” -u “$dcdbuser” -p”$dcdbpassword” 2>/dev/null)

if [ $? -ne 0 ]; then
bloglogin=
error_exit “Failed to query MySQL server”
return 1
elif [ $rsp -eq 1 ]; then
bloglogin=
error_msg “That blog login already exists (Dotclear blog)”
return 1
fi

return 0
}

# Check blog email
# Take one argument: <blogemail>
function check_blog_email
{
if [[ “$1″ =~ .*@.* ]]; then
blogemail=”$1”
return 0
else
blogemail=
error_msg “A valid email is required to send blog password to its admnistrator.”
return 1
fi
}

# Find DB host and port from full host (work for IPv4 only)
# Take one argument: <dcdbhost>
function set_host_port
{
# Extract host part
dcdbhost=$(echo “$1” | cut -d’:’ -f1)
# Extract port part
dcdbport=$(echo “$1” | cut -d’:’ -f2)
# Clean up
[ “$1” = “$dcdbport” ] && dcdbport=0

return 0
}

# Display Dotclear’s configuration file constant
# Take one argument: <PHP Constant to find>
function get_dc_constant
{
# Read file as php file and echo searched constant
rsp=$(php -r “define(‘DC_RC_PATH’,true); include ‘”$dcpath”/inc/config.php’; echo “$1″;” 2>/dev/null)
[ $? -ne 0 ] && error_exit “Failed to parse Dotclear’s value of ‘$1’.”
echo “$rsp”
return 0
}

# Find and set FTP port
# This method follows our installation of vsftp
# Take no arguments
function set_ftp_port
{
# Is there a directive ‘listen_port=xxx’ in vsftpd configuration ?
p=$( grep listen_port /etc/vsftpd.conf | cut -d’=’ -f2 )
if [ -n “$p” ]; then
ftpport=”$p”
else
ftpport=’21’
fi

return 0
}

# Query SQL server (only command without response)
# Take one argument: <a sql query>
function execute_sql_query
{
rsp=$(mysql -h “$dcdbhost” -P “$dcdbport” -D “$dcdbname” -u “$dcdbuser” -p”$dcdbpassword” -e “$1” 2>/dev/null)
[ $? -ne 0 ] && error_exit “Failed to query MySQL server”
return 0
}

# Encrypt data. Reproduce has_hmac from PHP and also Cleabricks crypt::hmac
# Take at least 3 arguments: <digest> <data> <key>
function hash_hmac
{
digest=”$1″
data=”$2″
key=”$3″
shift 3
echo -n “$data” | openssl dgst “-$digest” -hmac “$key” “$@”
return 0
}

#
# Check list
#

# Script requires root privilege
[ “$UID” -ne 0 ] && error_exit “Require root privileges. Try ‘sudo $PROGNAME”

# Check required programs (and list all command used in this script)
command_exist ‘grep’ ‘egrep’ ‘cut’ ‘mkdir’ ‘chown’ ‘chmod’ ‘date’ ‘head’ ‘fold’
command_exist ‘awk’ ‘mysql’ ‘md5sum’ ‘openssl’ ‘apache2’ ‘php’ ‘htpasswd’ ‘vsftpd’

#
# Parse script arguments
#

# Inform user that he can use arguments
if [ $# = 0 ]; then
error_msg “No arguments given. Try ‘$PROGNAME \-help’ for more information.”
else
begin_block “Reading script arguments”
while [ “$1” != “” ]; do
case $1 in
-p | \-dotclear-path ) shift
detail_msg “Found ‘Dotclear path'” “$1”
check_dc_path “$1”
;;
-d | \-server-domain ) shift
detail_msg “Found ‘server domain'” “$1”
check_server_domain “$1”
;;
-m | \-blog-email ) shift
detail_msg “Found ‘blog email'” “$1”
check_blog_email “$1”
;;
-l | \-blog-login ) shift
detail_msg “Found ‘blog login'” “$1”
check_blog_login “$1”
;;
-f | \-fake-mode ) detail_msg “Found ‘fake mode'” “Enable”
fakemode=1
;;
-h | \-help ) detail_msg “Found ‘help'” “Enable”
show_usage
;;
-v | \-version ) detail_msg “Found ‘version'” “Enable”
show_version
;;
*) error_exit “Unknow operand. Try $PROGNAME \-help for more information.”
esac
shift
done
end_block
fi

#
# Parse Dotclear’s configuration file
#

# Dotclear’s configuration file is very important
# as it contains informations to connect to mysql server
# and to encode passwords.
if [ -z “$dcpath” ]; then
while true
read -p “`query_msg “What is the installation directory of Dotclear”`” dcpath
do
check_dc_path “$dcpath”
if [ -n “$dcpath” -a -n “$dcfile” ]; then break; fi
done
fi

begin_block “Reading configuration file ‘$dcfile'”

set_host_port $(get_dc_constant ‘DC_DBHOST’)
dcdbuser=$(get_dc_constant ‘DC_DBUSER’)
dcdbpassword=$(get_dc_constant ‘DC_DBPASSWORD’)
dcdbname=$(get_dc_constant ‘DC_DBNAME’)
dcdbprefix=$(get_dc_constant ‘DC_DBPREFIX’)
dcmasterkey=$(get_dc_constant ‘DC_MASTER_KEY’)
dcadminurl=$(get_dc_constant ‘DC_ADMIN_URL’)

end_block

#
# Guess required informations
#

# Check identifiant first to reset bloglogin if it exists
if [ -n “$bloglogin” ]; then check_identifiant “$bloglogin”; fi

# If some variables not set then guess information
if [ -z “$serverdomain” -o -z “$bloglogin” -o -z “$blogemail” ]
then
begin_block “Requiring more informations”

# Blogs main server domain
if [ -z “$serverdomain” ]; then
while true
read -p “`query_msg ‘What is the blogs main domain for this blog sub-domain’`” serverdomain
do
check_server_domain “$serverdomain”
[ -n “$serverdomain” ] && break
done
fi

# Blog id, it is also the login for blog admin, ftp and sql account
if [ -z “$bloglogin” ]
then
while true
read -p “`query_msg ‘What is the identifiant of the blog’`” bloglogin
do
check_blog_login “$bloglogin”
[ -n “$bloglogin” ] && check_identifiant “$bloglogin”
[ -n “$bloglogin” ] && break
done
fi

# Blog admin email (we just do a quick test on it)
if [ -z “$blogemail” ]
then
while true
read -p “`query_msg ‘What is the email of the administrator of the blog’`” blogemail
do
check_blog_email “$blogemail”
[ -n “$blogemail” ] && break
done
fi
end_block
fi

#
# Additionals variables
#

# Blogurl
blogurl=”$bloglogin.$serverdomain”

# Blog password real password from random func
# List of chars is taken from library clearbricks crypt::createPassword
blogpassword=`head -c 500 /dev/urandom | tr -dc ‘a-zA-Z0-9!@$’ | fold -w 8 | head -n 1`

# On OVH VPS server we can find our IP with these two methods
# serverip=$( grep “$(cat ‘/etc/hostname’)” /etc/hosts | cut -d’ ‘ -f1 | head -n 1 )
serverip=$( ifconfig venet0:0 | grep inet | cut -d: -f2 | cut -d’ ‘ -f1 )

# FTP port – following our installation of vsftpd
set_ftp_port

#
# Display all variables
#

begin_block “Showing configured variables”

detail_msg “Server Domain name” “$serverdomain”
detail_msg “Server IPv4” “$serverip”
detail_msg “Server FTP port” “$ftpport”
detail_msg “Database Host” “$dcdbhost”
detail_msg “Database Port” “$dcdbport”
detail_msg “Database User” “$dcdbuser”
detail_msg “Database Password” “$dcdbpassword”
detail_msg “Database Name” “$dcdbname”
detail_msg “Database Table prefix” “$dcdbprefix”
detail_msg “Dotclear Administration URL” “$dcadminurl”
detail_msg “Dotclear Master key” “$dcmasterkey”
detail_msg “Blog Login” “$bloglogin”
detail_msg “Blog Password” “$blogpassword”
detail_msg “Blog Email” “$blogemail”
detail_msg “Blog URL” “$blogurl”

end_block

# Continue or not ?
read -n 1 -s -p “`query_msg ‘Do you want to start creation of the new blog [y/n]’`” startcreate
echo “”
# Stop script if answer is not ‘y’
if [ ! “$startcreate” = “y” ]; then
begin_block “Stopping script, bye”
# We can add features later here
end_block
exit 0
fi

#
# Create system user
#

begin_block “Creating system account for user ‘$bloglogin'”
if [ -n “$fakemode” ]; then fake_msg;
else
# Encode password for system user
systempassword=$(perl -e ‘print crypt($ARGV[0], “password”)’ $blogpassword)

# Add user to the system
useradd -d “/home/$bloglogin” -s /bin/bash -m “$bloglogin” -p ‘”$systempassword”‘
fi
end_block

#
# Create folders and blog files
#

begin_block “Creating files structure in ‘/home/$bloglogin'”
if [ -n “$fakemode” ]; then fake_msg;
else
# Make path recursively
mkdir -p “/home/$bloglogin/www/public”
# Set them the property of the new user
chown -R “$bloglogin”:”$bloglogin” “/home/$bloglogin/www”
# Set there permissions
chmod -R 755 “/home/$bloglogin/www”
fi
end_block

#
# Create FTP account
#

begin_block “Creating FTP account for user ‘$bloglogin'”
if [ -n “$fakemode” ]; then fake_msg;
else
# Encode FTP password and add it to the FTP user list
htpasswd -b /etc/vsftpd/passwd “$bloglogin” “$blogpassword”

# Restart FTP service to take account of this change
/etc/init.d/vsftpd restart
fi
end_block

#
# Create virtual host
#

begin_block “Creating blog virual host ‘$blogurl'”
if [ -n “$fakemode” ]; then fake_msg;
else
# Set up virtual host file
echo “<VirtualHost *:80>
ServerAdmin $blogemail
ServerName $blogurl
ServerAlias www.$blogurl
DocumentRoot /home/$bloglogin/www
<Directory /home/$bloglogin/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>” > “/etc/apache2/sites-available/$bloglogin”

# Enable vhost in Apache
a2ensite “$bloglogin”

# Restart Apache to take account of this change
/etc/init.d/apache2 restart
fi
end_block

#
# Create blog specifics files
#

begin_block “Creating blog files ‘$bloglogin'”
if [ -n “$fakemode” ]; then fake_msg;
else
# Set up index file
echo “<?php define(‘DC_BLOG_ID’,’$bloglogin’);
require ‘$dcpath/inc/public/prepend.php’;
?>” > “/home/$bloglogin/www/index.php”

# Set up Apache rewrite rules
echo ‘RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?$1’ > “/home/$bloglogin/www/.htaccess”

fi
end_block

#
# Create blog in database
#

begin_block “Creating blog ‘$bloglogin’ in database”
if [ -n “$fakemode” ]; then fake_msg;
else
# Prepare some date and time
scriptuxts=$(date +%s)
scriptdate=$(date +”%Y-%m-%d”)
scripttime=$(date +”%H:%M:%S”)

# Encode blog password
dcpassword=$( hash_hmac ‘sha1’ ‘”$blogpassword”‘ ‘”$dcmasterkey”‘ )

# Blog uid from blogid and time
bloguid=`echo -n “$blogid$scriptuxts” | md5sum | awk ‘{print $1}’`

# Insert dotclear’s blog
execute_sql_query ”
INSERT INTO “$dcdbprefix”blog
(blog_id, blog_uid, blog_creadt, blog_upddt, blog_url, blog_name, blog_desc, blog_status)
VALUES
(‘”$bloglogin”‘, ‘”$bloguid”‘, ‘”$scriptdate” “$scripttime”‘, ‘”$scriptdate” “$scripttime”‘, ‘http://”$blogurl”‘, ‘”$bloglogin”‘, ”, 0)
;”

# Insert dotclear’s user
execute_sql_query ”
INSERT INTO “$dcdbprefix”blog
(user_id, user_pwd, user_email, user_default_blog, user_creadt, user_upddt)
VALUES
(‘”$bloglogin”‘,'”$dcpassword”‘,'”$bloglogin”‘,'”$scriptdate” “$scripttime”‘, ‘”$scriptdate” “$scripttime”)
;”

# Insert dotclear’s permissions
execute_sql_query ”
INSERT INTO “$dcdbprefix”blog
(user_id, blog_id, permissions)
VALUES
(‘”$bloglogin”‘, ‘”$bloglogin”‘, ‘|admin|’)
;”
fi
end_block

#
# Send email
#

begin_block “Sendind email to ‘$blogemail’ with account informations”
if [ -n “$fakemode” ]; then fake_msg;
else

mail -s ‘Your blog is installed !’ “$blogemail”<<ENDOFFILE
Hello,
Your new blog is installed and ready to use.

Blog:
\—
You can manage your blog from your browser.

Blog public URL: $blogurl
Administration URL: $dcadminurl
Login: $bloglogin
Password: $blogpassword

FTP:
\-\-
You can access your public directory by FTP.

IP: $serverip
Port: $ftpport
Login: $bloglogin
Password: $blogpassword

Have fun!
ENDOFFILE
fi
end_block

#
# End of script
#

echo “New Dotclear’s blog and related accounts successfully created!”
exit 0

Au suivant

Dans le prochain article nous allons prendre soin de notre serveur.