Erreur rencontrée :
Après une mise à jour d'Apache sur mon serveur, celui-çi ne voulait plus redémarrer avec cette erreur en retour.
Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration
Résolution :
Installé le paquet libapache2-mod-php5
$ sudo apt-get install libapache2-mod-php5
$ sudo service apache2 start
Activer les modules nécessaires :
$ sudo a2enmod proxy
$ sudo a2enmod proxy_balancer
$ sudo a2enmod proxy_ajp
Paramétrage en mode HTTP :
Ajouter dans le fichier httpd.conf situé dans le répertoire conf d'Apache (ajuster les valeurs en rouge)
Paramétrage en mode AJP (Tomcat) :
Ajouter dans le fichier httpd.conf situé dans le répertoire conf d'Apache (ajuster les valeurs en rouge)
Pré-requis :
Comment rediriger automatiquement une connexion http en https pour un virtual host précis:
Par exemple http://monDomaine.com --> https://monDomaine.com
RedirectPermanent /login "https://monDomaine.com/login"
Sous Apache, la réécriture d'URL et la redirection de ports est possible grâce au module "mod_rewrite".
Pour l'activer, rien de plus simple :
$ a2enmod rewrite
Les informations de réécriture sont à renseignées, soit dans le fichier de configuration d'Apache (/etc/apache2/apache2.conf), soit dans les fichiers de configuration des virtualhosts.
> RewriteEngine On
> RewriteRule ^/$ /ma_page [L,R]
> RewriteEngine On
> RewriteRule ^/mon_ancienne_page$ /ma_nouvelle_page [L,R]
> RewriteEngine On
> RewriteCond %{SERVER_PORT} ^8080$
> RewriteRule ^(.*) http://%{SERVER_NAME}:80/ [L,R]
> RewriteEngine On
> RewriteCond %{SERVER_PORT} ^8080$
> RewriteRule ^(.*)/mon_ancienne_page$ http://%{SERVER_NAME}:80/ma_nouvelle_page [L,R]
Tests réalisés sur une distribution Linux style Ubuntu
$ sudo apt-get install apache2-utils
$ ab -n 1000 -c 20 http://monserveur/index.html
Cela permet de faire des tests de charge sur votre serveur et de récupérer ses capacités en terme de nombre de requete / seconde.
Quand un site Drupal est mis hors-ligne, plus personne ne peut y accéder.
Cette option est pratique pour des opérations de maintenance et/ou de mises à jour.
Le seul inconvénient, ne pas quitter sa session avant d'avoir remis le site en ligne sous peine de ne plus pouvoir y accéder.
Si par malheur cela se produit, pas de panique, une solution simple existe afin de remettre son site en ligne.
Pour débloquer son site, il suffit de s'y connecter en y ajoutant /user ou /?q=user à la fin de l'adresse.
http://monSite.fr/user (si les URLs simplifiées sont activées)
ou
http://monSite.fr/?q=user (si les URLs simplifiées ne sont pas activées)
Seul l'administrateur est autorisé à se connecter.
1 - Installer le paquet php5-dev.
$ sudo apt-get install php5-dev
2 - Se placer dans le répertoire /tmp.
$ cd /tmp/
3 - Vérifier à l'adresse http://pecl.php.net/package/uploadprogress la dernière version disponible puis télécharger l'archive souhaitée.
$ wget http://pecl.php.net/get/uploadprogress-1.0.3.1.tgz
4 - Extraire l'archive téléchargée.
$ tar xzvf uploadprogress-1.0.3.1.tgz
5 - Se placer dans le répertoire uploadprogress-x.x.x
$ cd uploadprogress-1.0.3.1/
6 - Compiler les sources et installer le programme
$ phpize
$ ./configure
$ make
$ sudo make install
7 - Rajoutez "extension=uploadprogress.so" au fichier php.ini.
8 - Redémarrer apache.
$ /etc/init.d/apache2 restart
Si Drupal est installé sur un hébergement OVH, les mises à jour de modules via l'interface de mise à jour de Drupal ne fonctionne plus.
Obligation de télécharger le module à mettre à jour et de l'uploader sur le serveur via le FTP.
Pour retrouver un comportement standard, il suffit de modifier un tout petit fichier situé à la racine du serveur FTP.
Il s'agit du fichier .ovhconfig
Dans ce fichier, il suffit de modifier la ligne qui contient
container.image=legacy
par
container.image=stable
Tout devrait rentrer dans l'ordre
Suite à la mise à jour de Drupal en version 7.24 & 6.29, il est indipensable d'ajouter ou de modifier le fichier .htaccess présent dans le répertoire sites/default/files.
C'est une question de sécurité.
Cela empêchera toute exécution de scripts malicieux.
$ cat sites/default/files/.htaccess
# Turn off all options we don't need.
Options None
Options +FollowSymLinks
# Set the catch-all handler to prevent scripts from being executed.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
# Override the handler again if we're run later in the evaluation list.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>
# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
Si le fichier .htaccess n'existe pas, le créer.
Il faut également protéger le répertoire temporaire de Drupal avec ce même fichier .htaccess.
Pour connaitre le répertoire temporaire de Drupal, il suffit d'aller dans "Configuration --> Média --> Système de fichiers".
En règle générale, sur un serveur Linux, il s'agit du répertoire /tmp.
Pour le protéger, rien de plus simple, il suffit d'effectuer une copie du fichier sites/default/files/.htaccess dans le répertoire /tmp.
Sur un serveur Linux, le répertoire /tmp est vider à chaque redémarrage.
Il faut donc penser à recopier le fichier .htaccess après chaque redémarrage.
Sinon, une petite tâche cron et le problème est réglé :
$ crontab -l
# m h dom mon dow command
@reboot cp -a /var/www/public_html/sites/default/files/.htaccess /tmp/
Penser à modifier le chemin d'accès au fichier .htaccess.
Pour finir, supprimer le fichier CHANGELOG.txt. Cela évitera à n'importe qui de connaitre la version actuellement installée.
Si mon module Drupal "Test de connexion" vous intéresse, vous pouvez le télécharger en cliquant sur les liens ci-dessous correspondant à votre version de Drupal.
Disponible pour la version 6.x de Drupal :
MD5SUM : 25c575cc262272e6a2a7dc656196c25b test_connexion.tar.gz
Disponible pour la version 7.x de Drupal :
MD5SUM : 9b7a14d2e38c1111f2cc841df365f839 test_connexion-7.x-1.0.tar.gz
Dans Drupal 7, il est tout à fait possible d'extraire n'importe quelles données d'un noeud (Page, Article etc etc) grâce aux API Drupal.
Quelles sont les données récupérables :
Exemple avec un article test créé spécialement.
Pour afficher cette description, il suffit d'utiliser l'API node_load en indiquant le NID du noeud concerné :
<?php
$nid = 412;
$node = node_load($nid);
print_r($node);
?>
Ce qui donne :
stdClass Object ( [vid] => 431 [uid] => 0 [title] => Article vide pour test [log] => [status] => 0 [comment] => 2 [promote] => 0 [sticky] => 0 [nid] => 412 [type] => story [language] => fr [created] => 1334738152 [changed] => 1386527877 [tnid] => 0 [translate] => 0 [revision_timestamp] => 1386527877 [revision_uid] => 1 [taxonomy_vocabulary_2] => Array ( ) [body] => Array ( [und] => Array ( [0] => Array ( [value] =>Contenu vide pour test
[summary] => [format] => 2 [safe_value] =>Contenu vide pour test
[safe_summary] => ) ) ) [rdf_mapping] => Array ( [rdftype] => Array ( [0] => sioc:Item [1] => foaf:Document ) [title] => Array ( [predicates] => Array ( [0] => dc:title ) ) [created] => Array ( [predicates] => Array ( [0] => dc:date [1] => dc:created ) [datatype] => xsd:dateTime [callback] => date_iso8601 ) [changed] => Array ( [predicates] => Array ( [0] => dc:modified ) [datatype] => xsd:dateTime [callback] => date_iso8601 ) [body] => Array ( [predicates] => Array ( [0] => content:encoded ) ) [uid] => Array ( [predicates] => Array ( [0] => sioc:has_creator ) [type] => rel ) [name] => Array ( [predicates] => Array ( [0] => foaf:name ) ) [comment_count] => Array ( [predicates] => Array ( [0] => sioc:num_replies ) [datatype] => xsd:integer ) [last_activity] => Array ( [predicates] => Array ( [0] => sioc:last_activity_date ) [datatype] => xsd:dateTime [callback] => date_iso8601 ) ) [cid] => 0 [last_comment_timestamp] => 1334738152 [last_comment_name] => [last_comment_uid] => 1 [comment_count] => 0 [name] => [picture] => 0 [data] => )
Si on souhaite afficher la date de création du noeud, il suffit d'écrire
<?php
$nid = 412;
$node = node_load($nid);
$timestamp = $node->created;
$date = date("d-m-Y", $timestamp);
echo $date;
?>
Ce qui donne :
18-04-2012
Pour afficher le contenu
<?php
$nid = 412;
$node=node_load($nid);
print $node->body['und']['0']['value'];
?>
Ce qui donne :
Contenu vide pour test
Dans Drupal 6, l'affichage du contenu s'effectue de cette manière :
<?php
$nid = 412;
$node=node_load($nid);
print $node->body;
?>
Les arrays ['und']['0']['value'] sont inexistants.
En cas de perte des identifiants, il faut savoir que tous les comptes utilisateurs sont enregistrés dans la table users.
Dans cette table, à chaque compte correspond un id unique (colonne UID).
Pour Drupal, les utilisateurs anonymes et privilégiés sont systématiquement les deux premières lignes de cette table et ont pour UID respectif 0 et 1.
Pour changer identifiant et mot de passe, il suffit d'exécuter la requête SQL suivante avec la console MySQL ou PhpMyAdmin :
$ mysql -u root -p
> use drupal
> update users set
name = 'identifiant_admin',
pass = md5('mot_de_passe')
where uid = 1;
Liste des raccourcis clavier afin d'utiliser Eclipse plus rapidement.
CTRL + SHIFT + L
CTRL + ALT + Up
CTRL + SHIFT + /
CTRL + Espace
CTRL + SHIFT + I
CTRL + D
Comment savoir si son site internet s'affiche correctement dans différentes résolution.
Afin de simuler l'affichage de son site sur un PC, un portable, un netbook, une tablette et un smartphone, Firefox possède une fonction permettant de manipuler la résolution d'affichage.
Pour activer l'option, appuyer sur les touches Ctrl + Shift + M
Idem pour désactiver l'option.
Pour pouvoir sauvegarder et/ou synchroniser tous ses marque-pages, mots de passe, préférences et son historique de navigation du navigateur Firefox, il faut utiliser l'extension Sync.
Depuis la version 4 de Firefox, cette extension est installée par défaut.
Pour cela, il suffit de se créer un nouveau compte sur le serveur de la fondation Mozilla, via les options de Sync.
Toutes ces données sont cryptées et sauvegardées sur leur serveur.
De cette manière, il est possible de synchroniser toutes ses données entre plusieurs navigateurs Firefox (à la maison, sur l'ordinateur familial, sur le portable et au travail)
Cela permet également de faire des sauvegardes régulières. Plus besoin d'installer des extensions supplémentaires pour sauvegarder les mots de passe et les marque-pages.
Mais il est également possible d'avoir son propre serveur de synchronisation grâce à l'application Weave écrite en PHP.
Pré-requis :
Avoir un serveur LAMP (Linux Apache MySQL PHP)
Installé l'extension SQLite pour PHP
$ apt-get install php5-sqlite
Installation :
Télécharger l'archive weave_minimal.tgz :
$ cd /var/www
$ wget http://www.isbeta.fr/4f612 -O weave_minimal.tgz
MD5SUM : 12c7dfef24eb0bb249a1f4723cd8daf6 weave_minimal.tgz
Extraire l'archive :
$ tar -xvzf ./weave_minimal.tgz
Ajouter un alias dans la configuration Apache se nommant /weave et pointant vers /var/www/weave_minimal/index.php
Modifier le propriétaire du dossier weave_minimal :
$ chown -R www-data:www-data /var/www/weave-minimal/
Redémarrer Apache :
$ service apache2 restart
Pour créer la base de données, ouvrir un navigateur, Firefox de préférence ;o) et saisir cette adresse dans la barre d'adresse > http://localhost/weave/1.0/blah/info/collection <
Si tout se passe bien, saisir "blah" pour l'utilisateur et laisser le mot de passe vide.
Valider en appuyant sur Entrée puis quitter Firefox (ou l'autre navigateur ;o)
La base de données "weave_db" doit être créée (pour vérifier):
$ cd /var/www/weave_minimal/ && ls -l
Pour créer un utilisateur :
$ cd /var/www/weave_minimal/
$ php ./create_user
Ce script PHP permet de créer, modifier ou supprimer un utilisateur
L'installation du serveur est terminée, il ne reste plus qu'à configurer Sync.
Si tout se passe comme il faut, une page doit s'ouvrir dans Firefox indiquant que la configuration est terminée.
Répéter les opérations 1 à 6 pour tous les navigateurs Firefox à synchroniser.
Généralement, le résultat d'une requête est affiché horizontalement.
mysql> SELECT * FROM test2 LIMIT 0,5;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
+----+-----+
5 rows in set (0.00 sec)
Pour afficher le résultat verticalement, il suffit de remplacer le ";" par "\G".
mysql> SELECT * FROM test2 LIMIT 0,5\G
*************************** 1. row ***************************
id: 1
val: 10
*************************** 2. row ***************************
id: 2
val: 20
*************************** 3. row ***************************
id: 3
val: 30
*************************** 4. row ***************************
id: 4
val: 40
*************************** 5. row ***************************
id: 5
val: 50
5 rows in set (0.00 sec)
Les commandes suivantes ajoute l'utilisateur "superUser" ayant tous les droits "ALL PRIVILEGES.....WITH GRANT OPTION" sur toutes les bases de sonnées "*.*", avec le mot de passe "secret" et pouvant se connecter de n'importe quelle machine "%":
Se connecter au serveur mysql avec l'utilisateur root
$ mysql -u root -p
> GRANT ALL PRIVILEGES ON *.* TO 'superUser'@'%' IDENTIFIED BY 'secret' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
Sous Ubuntu, par exemple, pour se connecter à un serveur MySQL, il est nécessaire de saisir dans la console la commande suivante :
$ mysql -h mon_serveur_mysql -u nom_user -p nom_base_de_donnees
-h pour indiquer le serveur mysql (optionnel si le serveur est localhost)
-u pour indiquer le nom d'utilisateur
-p pour permettre la saisie du mot de passe
et on termine la commande par le nom de la base de données à utiliser (optionnel).
Il existe un moyen plus simple pour se connecter à MySQL surtout si les paramètres de connexions sont souvent les mêmes.
Pour cela, il suffit de créer dans son répertoire personnel le fichier .my.cnf.
$ touch ~/.my.cnf
D'y renseigner les informations suivantes :
$ cat ~/.my.cnf
[client]
user = nom_user
password = mon_password
host = adresse_ip_ou_fqdn_du_serveur_mysql
De protéger le fichier des regards indiscrets
$ chmod 0600 ~/.my.cnf
Dorénavant, cette simple commande suffira à se connecter au serveur MySQL :
$ mysql nom_base_de_donnees
Pour créer un trigger dans MySql suite à une insertion de données avec enregistrement de données dans une autre table
$ .
> CREATE TRIGGER nom_du_trigger AFTER INSERT ON nom_de_la_table_a_surveiller
> FOR EACH ROW
> INSERT INTO nom_de_la_table (champs1, champs2, champs3) VALUES ( valeur1, valeur2, valeur3);
Pour créer un trigger dans MySql suite à une modification de données avec enregistrement de données dans
une autre table
$ .
> CREATE TRIGGER nom_du_trigger AFTER UPDATE ON nom_de_la_table_a_surveiller
> FOR EACH ROW
> INSERT INTO nom_de_la_table (champs1, champs2, champs3) VALUES ( valeur1, valeur2, valeur3);
Pour créer un trigger dans MySql suite à une suppression de données avec enregistrement de données dans
une autre table
$ .
> CREATE TRIGGER nom_du_trigger AFTER DELETE ON nom_de_la_table_a_surveiller
> FOR EACH ROW
> INSERT INTO nom_de_la_table (champs1, champs2, champs3) VALUES ( valeur1, valeur2, valeur3);
$ .
> CREATE TRIGGER mon_trigger AFTER INSERT ON ma_table
> FOR EACH ROW
> INSERT INTO ma_table_log (id_ajoute, valeur1_ajoutee, valeur2_ajoutee) VALUES ( NEW.id, NEW.valeur1,
NEW.valeur2);
Lors d'une insertion en masse dans une table Mysql, si une clé existe déjà, la totalité de l'insertion n'est pas exécutée.
Pour ignorer cette erreur, il suffit d'utiliser le mot clé IGNORE dans la requête d'insertion.
Exemple :
Définition de la table test2
CREATE TABLE IF NOT EXISTS `test2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `val` (`val`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Définition d'une clé unique sur le champ "val".
Données de la table
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
+----+-----+
5 rows in set (0.00 sec)
Requête d'insertion en masse
mysql> INSERT INTO test2 (val) VALUES (60), (70), (10), (80);
ERROR 1062 (23000): Duplicate entry '10' for key 'val'
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
+----+-----+
7 rows in set (0.00 sec)
Lors de l'insertion, une erreur est générée pour la valeur "10".
Celle-ci existe déjà dans la table.
Le "SELECT" montre que seules les valeurs "60" et "70" ont été insérées.
La valeur "80" n'a pas été insérée car la requête a générée une erreur au moment de l'insertion de la valeur "10".
Requête d'insertion avec le mot clé "IGNORE"
mysql> INSERT IGNORE INTO test2 (val) VALUES (80), (90), (10), (100);
Query OK, 3 rows affected (0.00 sec)
Records: 4 Duplicates: 1 Warnings: 0
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 9 | 90 |
| 10 | 100 |
+----+-----+
10 rows in set (0.00 sec)
Le résultat de la requête indique que 3 insertions ont été exécutées sur 4.
La valeur "10" a été ignorée.
Le "SELECT" montre que les valeurs "80", "90" et "100" ont bien été insérées.
Pour restaurer une base de données
Attention, il faut que la base de données soit créée auparavant
Dans une console
$ mysql -h adresse_ip -u user -p -D nom_de_la_base_de_données < nom_du_fichier_sql
Par exemple
$ mysql -h localhost -u root -p -D mesvideos < mesvideos.sql
Cela a pour effet d'importer le contenu du fichier mesvideos.sql dans la base de données mesvideos.
Pour restaurer toutes les bases de données
Pour info, il n'est pas nécessaire que les bases de données soient créées auparavant
Dans une console
$ mysql -h adresse_ip -u user -p < nom_du_fichier_sql
Par exemple
$ mysql -h localhost -u root -p < allbases.sql
Cela a pour effet d'importer la totalité des bases de données contenues dans le fichier allbases.sql.
Pour sauvegarder une base de données
Dans une console
$ mysqldump -h adresse_ip -u user -p nom_de_la_base_de_donnees > nom_du_fichier_sql
Par exemple
$ mysqldump -h localhost -u root -p mesvideos > mesvideos.sql
Cela a pour effet d'exporter toutes les données de la base mesvideos dans le fichier mesvideos.sql
Pour sauvegarder toutes les bases de données
Dans une console
$ mysqldump -h adresse_ip -u user -p -A > nom_du_fichier_sql
Par exemple
$ mysqldump -h localhost -u root -p -A > allbases.sql
Cela a pour effet d'exporter toutes les bases de données dans le fichier allbases.sql
Par défaut, sur une distribution style Debian, le serveur MySql accepte les connexions uniquement à partir de la machine locale.
Toutes connexions à partir d'un host différent sont automatiquement refusées.
$ netstat -lpn | grep mysql
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 4884/mysqld
Pour autoriser les connexions à partir de n'importe quels hosts, il faut modifier le fichier /etc/mysql/my.cnf.
Modifier le ligne bind-address = 127.0.0.1 et remplacer 127.0.0.1 par 0.0.0.0
$ cat /etc/mysql/my.cnf | grep "bind-address"
bind-address = 0.0.0.0
Redémarrer le serveur MySql afin d'appliquer la modification
$ service mysql restart
Puis vérifier avec la commande netstat
$ netstat -lpn | grep mysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6039/mysqld
Pour se connecter au sevreur MySQL depuis une console
$ mysql -u nom_du_user -p
puis saisir le mot de passe
Pour changer le mot de passe de l'utilisateur root (qui n'est pas le même que l'utilisateur root du système), tapez la commande suivante dans un terminal :
$ sudo mysqladmin -u root password nouveau_mot_de_passe -p
Redéfinir de force le mot de passe ROOT
Méthode 1
On stoppe le serveur MySQL
$ sudo /etc/init.d/mysql stop
On se connecte au serveur sans tenir compte des privilèges utilisateurs :
$ sudo /usr/bin/mysqld_safe --skip-grant-tables & mysql -h localhost
Nous allons utiliser la table contenant les paramètres de MySQL :
$ > use mysql
On met en place le nouveau mot de passe :
$ > update user set password = password('<votre_mot_de_passe>') where user = 'root' and host='localhost';
On quitte le prompt de MySQL :
$ > quit
On redémarre le serveur MySQL en utilisation normale :
$ sudo /etc.init.d/mysql restart
Méthode 2
$ sudo /etc/init.d/mysql reset-password
Méthode 3
$ sudo dpkg-reconfigure mysql-server-5.0
Se connecter à MySQL :
$ mysql -h localhost -u user -p
Sélectionner la base de données :
$ .
> USE maBaseDeDonnees;
Exécuter la requête :
$ .
> SELECT * INTO OUTFILE '/home/user/monFichier.txt' FROM maTable;
! Il faut que le user connecté à MySQL ait l'autorisation d'écrire dans le répertoire indiqué
Il existe 2 manières pour sélectionner une base de données MySQL
Directement lors de la connexion
$ mysql -u root -p votre_base
Une fois connecté à MySQL mysql
$ .
> use votre_base;
Dans une console, saisir la commande suivante :
$ vboxmanage clonevdi nom_du_disque_a_cloner nom_du_nouveau_disque
En mode graphique :
$ vboxmanage startvm nom_de_la_machine_virtuelle
Sans interface graphique :
$ vboxmanage startvm nom_de_la_machine_virtuelle --type headless
(Dans ce mode, le contrôle de la machine est accessible uniquement via SSH)
En mode graphique :
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "nom_de_la_machine_virtuelle"
Sans interface graphique :
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "nom_de_la_machine_virtuelle" --type headless
(Dans ce mode, le contrôle de la machine est accessible uniquement via SSH)
$ vboxmanage controlvm nom_de_la_machine_virtuelle poweroff
Zimbra est un serveur de messagerie avec des fonctionnalités de travail collaboratif.
La version Open Source comprend la fonction de serveur de messagerie, de calendriers partagés, de carnets d'adresses partagés, de gestionnaire de fichiers, de gestionnaire de tâches, wiki, messagerie instantanée.
A l'heure actuelle, ZIMBRA est compatible avec un certains nombres de distributions Linux 64 bits.
Toutes les versions 32 bits sont dépréciées.
Cepandant, il est quand même possible d'installer Zimbra sur la version 32 bits de Ubuntu 8.04 LTS.
Voir la liste des distribution compatible.
La dernière version disponible de Zimbra est la 7.1.3 GA Release
Zimbra nécessite un serveur à lui tout seul.
Il ne peut pas être installé sur un serveur déjà configuré comme serveur mail, http etc ...
Il lui faut une machine ayant au minimum 1 GO de mémoire vive.
ZIMBRA étant installé dans le répertoire /opt, il est fortement conseillé de créer une partition spécifique ayant comme point de montage /opt.
Par exemple, pour un disque dur de 40 GB, une partition racine / de 10 GB pour le système, une partition /opt de 30 GB pour Zimbra et une partition Swap de 2.9 GB.
Procéder à l'installation d'Ubuntu 8.04 LTS avec le strict minimum.
Les paquets supplémentaires à installer sont OpenSSH-server & DNS Server
Au moment du choix des paquets supplémentaires à installer choisir OpenSSH-server & DNS Server
Pour paramétrer notre nouveau système, nous installerons Webmin
Se connecter au système (via SSH par exemple).
$ sudo wget http://www.webmin.com/jcameron-key.asc
$ sudo apt-key add jcameron-key.asc
Ajouter le dépot Webmin au fichier /etc/apt/sources.list :
$ echo "deb http://download.webmin.com/download/repository sarge contrib" >> /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install webmin
Une fois l'installation terminée, se connecter à Webmin via un navigateur web à l'adresse https://ip_du_serveur:10000
Se connecter à Webmin via un navigateur à l'adresse https://adresse_ip_du_serveur:10000
Le user et le password correspondent à l'utilisateur créé lors de l'installation d'Ubuntu.
Le menu Webmin :
Pour mettre Webmin en français, cliquer sur le menu Webmin, puis Change Language and Theme
Cocher l'option Personal choice puis sélectionner French (FR) dans la liste déroulante
Valider en cliquant sur Make Changes
Recharger Webmin en appuyant sur F5
Via Webmin, configurer le serveur en IP fixe.
Cliquer sur le menu Réseau puis sur Configuration Réseau
Cliquer sur Interfaces Réseau puis sélectionner l'onget Interfaces Permanentes
Cliquer sur le nom de l'interface réseau (ETH0 en règle générale)
Sélectionner l'option Static configuration.
Renseigner l'adresse IP puis le masque de sous-réseau
Cliquer sur Sauvegarder
Cliquer sur Retourner à configuration réseau
Cliquer sur Passerelles et Routage
Sélectionner l'option Passerelle puis y indiquer l'adresse IP du routeur
Cliquer sur Sauvegarder
Cliquer sur Adresses de la machine
Sélectionner la ligne correspondant à l'adresse IP 127.0.1.1 et la supprimer (Attention à ne pas supprimer la ligne correspondant à l'adresse IP 127.0.0.1).
Cliquer sur Ajouter une nouvelle adresse de machine
Y renseigner la nouvelle adresse IP du serveur et son nom de machine puis cliquer sur Créer
Cliquer sur Retourner à configuration réseau
Cliquer sur Client DNS
Dans le champ Nom du poste, y indiquer le nom de la machine.
Dans le champ Serveurs DNS, y indiquer l'adresse IP 127.0.0.1
Dans le champ Domaines de recherche, sélectionner l'option Listé et y indiquer son nom de domaine
Cliquer sur Sauvegarder
Enfin, cliquer sur le bouton Appliquer la configuration
Attention, si la nouvelle adresse IP appliquée au serveur est différente de la précédente, la connexion à Webmin sera perdue. Il suffit juste de se reconnecter à Webmin via la nouvelle adresse IP du serveur.
Fichier attaché | Taille |
---|---|
![]() | 278 octets |
![]() | 46 octets |
![]() | 1.25 Ko |
![]() | 710 octets |
![]() | 351 octets |
![]() | 170 octets |
Pré-requis :
Installer le paquet dnsutils
$ sudo apt-get install dnsutils
Configuration de Bind9 :
Tous les fichiers nécessaires sont disponibles en bas de cette page
Dans les exemples suivants, mon serveur à comme adresse IP fixe : 192.168.1.10
Ce fichier doit contenir uniquement le nom de la machine.
Fichier modifié précédemment via Webmin.
Ce fichier doit ressembler à cela
Fichier modifié précédemment via Webmin.
Ce fichier doit ressembler à cela
En bleu les infos à rajouter dans ce fichier.
Attention à bien respecter l'indentation du texte avec une tabulation
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
//ajout des liens vers le fichier de configuration du domaine mondomaine.com
zone "mondomaine.com" {
type master;
file "/etc/bind/zones/mondomaine.com.hosts";
};
//ajout des liens vers le fichier de configuration du reverse pour le LAN
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/rev.192.168.1.in-addr.arpa";
};
include "/etc/bind/named.conf.local";
On indique dans ce fichier sur quel port effectuer les requêtes d'identification (sur le port 53)
On y indique également les adresses des serveurs DNS externes (ceux de Free par exemple) dans la section forwarders
Attention à bien respecter l'indentation du texte avec une tabulation
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you might need to uncomment the query-source
// directive below. Previous versions of BIND always asked
// questions using port 53, but BIND 8.1 and later use an unprivileged
// port by default.
query-source address * port 53;
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
forwarders {
212.27.40.240;
212.27.40.241;
};
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
$ sudo mkdir /etc/bind/zones
$ sudo nano /etc/bind/zones/mondomaine.com.hosts
Y indiquer les infos suivantes
Attention à bien respecter l'indentation du texte avec une tabulation
$ttl 86400
@ IN SOA zimbra.mondomaine.com. mail.mondomaine.com. (
2008061802
21600
3600
604800
86400 )
;ENREGISTREMENT "A" DNS <-> IP CLASSIQUES
@ IN NS mail.mondomaine.com.
IN MX 10 mail.mondomaine.com.
IN A 192.168.1.10
mail IN A 192.168.1.10
zimbra IN A 192.168.1.10
;ENREGISTREMENT MESSAGERIE
mondomaine.com. IN MX 10 zimbra
$ sudo nano /etc/bind/zones/rev.192.168.1.in-addr.arpa
Y indiquer les infos suivantes
Attention à bien respecter l'indentation du texte avec une tabulation
@ IN SOA mondomaine.com. admin.mondomaine.com. (
2006081405
28800
604800
604800
86400 )
IN NS zimbra.mondomaine.com.
10 IN PTR zimbra.mondomaine.com.
Redémarrage de Bind afin d'appliquer les modifications
$ sudo /etc/init.d/bind9 restart (ou # sudo service bind9 restart)
$ named-checkconf
Vérifier les enregistrements DNS via DIG & NSLOOKUP directement sur le serveur via SSH
$ dig mx mondomaine.com
; <<>> DiG 9.4.2-P2.1 <<>> mx mondomaine.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57311
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; QUESTION SECTION:
;mondomaine.com. IN MX
;; ANSWER SECTION:
mondomaine.com. 86400 IN MX 10 zimbra.mondomaine.com.
mondomaine.com. 86400 IN MX 10 mail.mondomaine.com.
;; AUTHORITY SECTION:
mondomaine.com. 86400 IN NS mail.mondomaine.com.
;; ADDITIONAL SECTION:
mail.mondomaine.com. 86400 IN A 192.168.1.10
zimbra.mondomaine.com. 86400 IN A 192.168.1.10
;; Query time: 16 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 12 10:00:24 2011
;; MSG SIZE rcvd: 118
$ dig a mail.mondomaine.com
; <<>> DiG 9.4.2-P2.1 <<>> a mail.mondomaine.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18243
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;mail.mondomaine.com. IN A
;; ANSWER SECTION:
mail.mondomaine.com. 86400 IN A 192.168.1.10
;; AUTHORITY SECTION:
mondomaine.com. 86400 IN NS mail.mondomaine.com.
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 12 10:05:01 2011
;; MSG SIZE rcvd: 63
$ nslookup mondomaine.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: mondomaine.com
Address: 192.168.1.10
L'installation et la configuration de BIND9 est enfin terminée
Pour simplifier la configuration d'un serveur Bind9, j'ai écrit un script de configuration automatique.
Pour le télécharger, cliquer ici
MD5SUM : 86a0a889ce9afe13fd12df48722f8182 configure_bind9.sh
$ sudo apt-get install libpcre3 libgmp3c2 libstdc++5 libltdl3 fetchmail curl sysstat sqlite3
Editer le fichier /etc/default/sysstat
$ sudo nano /etc/default/sysstat
Modifier ENABLED="true"
Téléchargement de Zimbra 7.1.3 GA
Zimbra 7.1.3 GA est la dernière version compatible avec une version Linux 32 bits
Voir sur le site de Zimbra la dernière version disponible
Récupérer la dernière version de Zimbra :
$ wget http://files.zimbra.com/downloads/7.1.3_GA/zcs-7.1.3_GA_3346.UBUNTU8.201...
Décompresser et restaurer l'archive téléchargée
$ tar xvzf ./zcs-7.1.3_GA_3346.UBUNTU8.20110928134533.tgz
$ cd zcs-7.1.3_GA_3346.UBUNTU8.20110928134533/
$ sudo ./install.sh
Poursuite de l'installation ...
Pendant l'installation, les enregistrements DNS sont vérifiés par rapport au nom de domaine zimbra.mondomaine.com. Une erreur va donc être retournée.
DNS ERROR resolving MX for zimbra.mondomaine.com
It is suggested that the domain name have an MX record configured in DNS
Change domain name? [Yes] Yes ici, répondre YES
Create Domain: [zimbra.mondomaine.com] mondomaine.com ici, entrer le nom du domaine
MX: zimbra.mondomaine.com (192.168.1.10)
MX: mail.mondomaine.com (192.168.1.10)
Poursuite du paramétrage automatique ...
Configuration des différents services ...
Patienter un petit moment le temps que tous les services démarrent
L'installation est enfin terminée
Il ne reste plus qu'à se connecter à l'interface de configuration du serveur Zimbra via un navigateur à l'adresse https://adress_ip_du_serveur:7071
Le paramétrage de Zimbra se fait via son interface de configuration à l'adresse https://adresse_ip_du_serveur:7071
user = admin
password = celui choisi lors de l'installation
L'interface de connexion au serveur :
Le menu de Zimbra :
Paramètres globaux
- Agent MTA
Valider en cliquant sur Enregistrer
Domaines
- Information générale
- Zimlets
Valider en cliquant sur Enregistrer
Classe de service
- Défault
- Caractéristiques
- Préférences
- Options générales
- Options mail
- Options d'agenda
Valider en cliquant sur Enregistrer
Toutes ces commandes ZIMBRA sont exécutées avec le user "zimbra" :
$ sudo su
$ su - zimbra
Stopper Zimbra
$ zmcontrol stop
Démarrer Zimbra
$ zmcontrol start
Etat Zimbra
$ zmcontrol status
Afficher la version de Zimbra
$ zmcontrol -v
Afficher la configuration locale de Zimbra
$ zmlocalconfig -s
Afficher le mot de passe MySQL du compte root
$ zmlocalconfig -s mysql_root_password
Afficher le mot de passe MySQL du compte zimbra
$ zmlocalconfig -s zimbra_mysql_password
Se connecter à MySQL avec le compte root
$ mysql -S /opt/zimbra/db/mysql.sock -u root --password=mysql_root_password
Afficher les répertoires d'un utilisateur
$ zmmailbox -z -m user@monDomaine.com gaf
-z : utiliser les droits de l'administrateur
-m : spécifie pour quel utilisateur on liste les répertoires
gaf : Get All Folders
Vider le répertoire d'un utilisateur
$ zmmailbox -z -m user@monDomaine.com ef /nomDuRepertoire
ef : Empty Folder
Afficher la liste des users
$ zmprov -l gaa
Afficher la liste des users admin
$ zmprov -l gaaa
Modifier le mot de passe d'un compte
sp (setPassword)
$ zmprov sp moncompte@monDomaine.com myNewPassword
Déverrouiller un compte
ma (modifyAccount)
$ zmprov ma moncompte@monDomaine.com zimbraAccountStatus active
Créer un compte mail
ca (createAccount)
$ zmprov ca moncompte@monDomaine.com monPassword displayName moncompte
Exporter les différents dossiers d'un compte dans une archive tgz
Les différents dossiers exportables (autres que mail):
Les dossiers standards des mails :
Commande à exécuter :
$ zmmailbox -z -m user@domaine.com getRestUrl -u http://`zmhostname`:8080 "/nom_du_dossier?fmt=tgz" > /mon_dossier_de_sauvegarde/mon_fichier_export.tgz
Exporter la totalité d'un compte dans une archive tgz
$ zmmailbox -z -m compte@domaine.fr getRestURL -u http://`zmhostname`:8080 "//?fmt=tgz" > ./compte.tgz
Importer les différents dossiers d'un compte d'une archive tgz
Les différentes valeurs du paramètre resolve :
Commande à exécuter :
$ zmmailbox -z -m user@domaine.com postRestUrl -u http://`zmhostname`:8080 "/nom_du_dossier?fmt=tgz&resolve=reset" /mon_dossier_de_sauvegarde/mon_fichier_export.tgz
Importer la totalité d'un compte à partir d'une archive tgz
$ zmmailbox -z -m compte@domaine.fr postRestURL -u http://`zmhostname`:8080 "//?fmt=tgz&resolve=reset" ./compte.tgz
Réactiver la fonction "Notebook" du "Porte-documents" dans Zimbra 7
$ zmprov mc default zimbraFeatureBriefcaseSpreadsheetEnabled TRUE
$ zmprov mc default zimbraFeatureBriefcaseSlidesEnabled TRUE
$ zmcontrol restart
Réactiver la fonction de messagerie instantanée dans Zimbra 7
$ zmprov -l -v mcf zimbraXMPPEnabled TRUE
$ zmprov -v mc default zimbraFeatureIMEnabled TRUE
$ zmprov -v mc default zimbraFeatureInstantNotify TRUE
$ zmcontrol restart
Script de sauvegarde
$ cat sauvegarde.sh
#!/bin/bash
#Sauvegarde automatique
#Arret des services ZIMBRA
su - zimbra -c "/opt/zimbra/bin/zmcontrol stop" >> /backup/log/01stopZimbra.`date +%Y_%m_%d_%s`.log 2>&1
#Pause de 30 secondes
sleep 30
#Sauvegarde incrementielle du repertoire /opt/zimbra dans une archive TAR
/bin/tar --create --file=/backup/archive.`date +%Y_%m_%d_%s`.tar --listed-incremental=/backup/backup.list /opt/zimbra >> /backup/log/02tar.`date +%Y_%m_%d_%s`.log 2>&1
#Redemarrage des services ZIMBRA
su - zimbra -c "/opt/zimbra/bin/zmcontrol start" >> /backup/log/03startZimbra.`date +%Y_%m_%d_%s`.log 2>&1
#Statuts des services Zimbra
su - zimbra -c "/opt/zimbra/bin/zmcontrol status" > /backup/log/04statusZimbra.`date +%Y_%m_%d_%s`.log 2>&1
1 fois par semaine (ou plus en fonction des besoins) réinitialiser la sauvegarde incrémentielle en supprimant le fichier /backup/backup.list.
Restauration :
Stopper les services ZIMBRA
$ sudo su -
$ su - zimbra -c "zmcontrol stop"
Supprimer le répertoire /opt/zimbra puis restaurer la première archive complète
$ rm -r /opt/zimbra/
$ tar --extract --listed-incremental=/dev/null --file archive.1.tar
Puis restaurer les archives suivantes si besoin
$ tar --extract --listed-incremental=/dev/null --file archive.2.tar
Redémarrer les services ZIMBRA
$ su - zimbra -c "zmcontrol start"
Sur un historique de sauvegarde de 10 archives, pour restaurer l'archive 4, restaurer les archives 1, 2, 3 & 4 et ce dans le bon ordre. Ne pas restaurer directement l'archive 4, elle serait incomplète.
Pour accepter les certificats non reconnus dans la configuration de Zimbra :
$ sudo nano /opt/zimbra/conf/localconfig.xml
Dans la section :
$ sudo su
$ su - zimbra
$ zmcontrol restart
$ exit
Pouvoir profiter du push e-mail avec Zimbra est possible grâce à une application PHP simulant un serveur Microsoft Server ActiveSync.
Pour cela, rien de plus simple.
Le seul inconvénient est de disposer d'un serveur, autre que celui sur lequel est installé Zimbra, car il faut obligatoirement un serveur sur lequel sera installé Apache et PHP.
Un second serveur Ubuntu sera donc utile pour pouvoir profiter du push e-mail.
$ wget http://download.berlios.de/z-push/z-push-1.5.5-790.tar.gz
$ cp ./z-push-1.5.5-790.tar.gz /home/push/public_html/
$ cd /home/push/public_html/ && tar -xvzf ./z-push-1.5.5-790.tar.gz
$ cd ./z-push/backend/
$ wget http://freefr.dl.sourceforge.net/project/zimbrabackend/Release51/zimbra5...
$ tar -xvzf zimbra51.tgz
$ cd .. && nano ./config.php
$ chown www-data:www-data ./state/
La configuration du serveur PUSH est enfin terminée.
Il ne reste plus qu'à configurer Microsoft Exchange Active Sync sur le téléphone en y indiquant l'adresse http du serveur (push.mondomaine.com par exemple - Ne pas indiquer l'alias /Microsoft-Server-ActiveSync dans l'adresse du serveur) et les services à synchroniser (agenda, carnet d'adresses, tâches etc etc)
Il faut, bien entendu, que le serveur push.mondomaine.com (par exemple) soit accessible de l'extérieur.
Comment faire pour que le webmail du serveur Zimbra (installé sur la machine 10.10.0.10 par exemple) et le serveur push.mondomaine.com (installé sur la machine 10.10.0.20 par exemple) soient tous les 2 accessibles de l'extérieur sur le port HTTP 80 et/ou HTTPS 443.
Surtout que dans un routeur, il est possible de rediriger un port que sur une seule adresse IP.
Donc, soit on redirige le port 80 & 443 vers la machine 10.10.0.10 et dans ce cas le serveur web installé sur la machine 10.10.0.20 n'est pas accessible soit on fait l'inverse et dans ce cas c'est le webmail Zimbra installé sur la machine 10.10.0.10 qui n'est plus accessible.
Pour résoudre ce problème, il suffit de créer un second serveur virtuel sur la machine où se trouve le serveur push.mondomaine.com et de le nommer zimbra.mondomaine.com (par exemple) et de le configurer comme un serveur proxy qui transmettra les requêtes HTTP vers le serveur Zimbra.
Il suffit donc de paramétrer le routeur afin de rediriger le port 80 et 443 vers la machine 10.10.0.20. Le serveur virtuel zimbra.mondomaine.com se chargera de transmettre les requêtes vers la machine 10.10.0.10 et affichera, par conséquent, le webmail de Zimbra.
Cliquer pour la configuration d'un serveur virtuel en mode proxy.
Pouvoir gérer les téléphones qui se connectent au serveur Z-PUSH, c'est ce que propose de faire cette application PHP "zpush-zimbra-provisioning"
Avec "zpush-zimbra-provisioning", il est possible de lister tous les appareils mobiles qui se connectent au serveur, de les supprimer et enfin, il est également possible de les réinitialiser (retour à la config usine).
La version en cours est "zpush-zimbra-provisioning-1.02.tgz"
Pour vérifier la dernière version, http://sourceforge.net/projects/zimbrabackend/files/Provisioning%20%28Remote%20Wipe%29%20Support%20-%20Needs%20Release%2045%20or%20later/
Pour l'installer, rien de plus simple :
$ sudo su
$ cd /var/www
$ wget http://freefr.dl.sourceforge.net/project/zimbrabackend/Provisioning%20%2...
$ tar -xvzf zpush-zimbra-provisioning-1.02.tgz
L'installation est terminée, il faut maintenant créer la base de données :
$ sudo su
$ cd /var/www/zimbra-provisioning
$ mysql -u root -p < zpush_zimbra.sql
Dans MySql, créer un user avec password ayant tous les droits sur la base de données "zpush_zimbra"
Modification du fichier "zimbradb.php" :
Il faut modifier le fichier /var/www/zimbra-provisioning/zimbradb.php et renseigner les paramètres de connexion à la base de données MySql. Y inscrire le user et le password créés précédement.
$mysql_server = "localhost:3306";
$mysql_username = "provuser";
$mysql_password = "provpassword";
$mysql_zimbradb = "zpush_zimbra";
Une fois le fichier modifier, il faut le copier dans le dossier Backend de Z-PUSH.
Création du user admin :
Dans votre navigateur préféré, se rendre à l'adresse
http://adresse_ip_du_serveur/zimbra-provisioning/registerAdminGUIuser.php
Cette page va permettre de créer le compte admin.
Une fois le compte créé, il est recommandé de renommer le script registerAdminGUIuser.php ou de le supprimer.
$ sudo su
$ cd /var/www/zimbra-provisioning
$ mv registerAdminGUIuser.php registerAdminGUIuser.php.old
$ chown root:root registerAdminGUIuser.php.old
$ chmod 600 registerAdminGUIuser.php.old
Modifier la configuration de Z-PUSH :
Pour profiter de cette option, il faut activer le provisioning dans la configuration de Z-PUSH.
Pour cela, il suffit de modifier le fichier config.php (dans le dossier de Z-PUSH)
=== Enable Provisioning ===
define('PROVISIONING', true);
Et voilà, tout est terminé, vous pouvez vous rendre à l'adresse http://adresse_ip_du_serveur/zimbra-provisioning, vous authentifier et gérer tous les appareils mobiles.
La page d'accueil permet de lister tous les appareils.
En cliquant sur "Détail" d'un appareil, il est possible de supprimer l'appareil en cliquant sur "DELETE DEVICE" ou de le réinitialiser en cliquant sur "WIPE DEVICE"
Attention, en cliquant sur "WIPE DEVICE" le téléphone sera entièrement réinitialiser - Retour à la configuration usine - Très pratique pour se débarasser d'un téléphone sans laisser aucune trace des données.
Code de l'erreur :
Mail : system failure: exception during auth {RemoteManager: zimbra.domain.fr->zimbra@zimbra.domain.fr:22} Code d'erreur : service.FAILURE Method: [unknown] Détails :soap:Receiver
Cette erreur indique un problème d'accès au serveur via SSH sur le port 22.
Pour résoudre cette erreur, j'ai simplement ajouter dans le fichier /etc/hosts.allow, le nom de mon serveur Zimbra.
$ hostname -f
zimbra.domain.fr
$ nano /etc/hosts.allow
# Ajout de la ligne :
ALL: zimbra.domain.fr
^O (enregistrer)
^X (quitter)
$
Depuis le 01 juillet 2012, pour je ne sais quelle raison, java utilisait toutes les ressources CPU.
Ne trouvant pas la cause du problème, j'étais sur le point de réinstaller mon serveur Zimbra quand je suis tombé sur ce post :
http://www.zimbrafr.org/forum/topic/5003-java-100-cpu-et-seconde-interca...
La cause : L'ajustement de la seconde intercalaire.
Qu'est ce que c'est que ce truc là.
Explication sur Wikipedia :
Une seconde intercalaire, également appelée saut de seconde ou seconde additionnelle, est un ajustement d'une seconde du Temps universel coordonné (UTC). Et ce, afin qu'il reste assez proche du Temps universel (UT) défini quant à lui par l'orientation de la Terre par rapport aux étoiles.
http://fr.wikipedia.org/wiki/Seconde_intercalaire
Le remède : Tout simple. Il suffit de reparamétrer l'horloge du serveur avec la commande suivante :
$ date -s "`date`"
Tout est rentré dans l'ordre comme par magie.
Ce "bug" touche les 2 applications Java et MySql
Code de l'erreur :
Mail : system failure: Unable to read logger stats Code d'erreur : service.FAILURE Method: [unknown] Détails :soap:Receiver
Pour résoudre cette erreur, exécuter les commandes suivantes en tant que root.
$ /opt/zimbra/libexec/zmsyslogsetup
$ /etc/init.d/rsyslog restart
$ /opt/zimbra/libexec/zmfixperms
Pour terminer, en tant que user zimbra
$ zmloggerctl start
$ zmcontrol status
Tout devrait rentrer dans l'ordre.
Pour générer un nouveau certificat dans Zimbra quand le précédent a expiré, suivre la procédure ci-dessous :
Via SSH, se connecter au serveur Zimbra puis saisir les commandes suivantes (en root)
$ sudo su
# Commencez par générer une nouvelle autorité de certification (CA).
$ /opt/zimbra/bin/zmcertmgr createca -new
...
# Puis générer un certificat signé par le CA qui expire dans 365 jours.
$ /opt/zimbra/bin/zmcertmgr createcrt -new -days 365
...
# Ensuite déployer le certificat.
$ /opt/zimbra/bin/zmcertmgr deploycrt self
...
# Ensuite déployer le CA.
$ /opt/zimbra/bin/zmcertmgr deployca
...
# Pour finir, vérifier que le certificat a été déployé à tous les services.
$ /opt/zimbra/bin/zmcertmgr viewdeployedcrt
::service mta::
...
::service proxy::
...
::service mailboxd::
...
::service ldap::
...
$
Quelques petites idées trouvées par-ci, par-là ...
Le site https://codemoji.org/#/encrypt de la fondation Mozilla, permet de chiffrer des messages à l'aide d'emojis.
Vous écrivez votre message, vous choisissez l'emoji qui vous plait pour le chiffrement et le message chiffré est disponible en ligne et une url courte est fournie afin de partager le message chiffré à qui vous voulez.
Des liens de partages automatiques vers les différents réseaux sociaux sont également disponibles.
Petite démonstration en image.
Super sympa.
Seule contrainte, ne pas oublier l'emoji qui a servi au cryptage afin de pouvoir déchiffrer le message.
Afficher la suite de Fibonacci en bash, php, python3
En bash:
#!/bin/bash
#set -x
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
function is_int {
if grep -E -v -q "^-?[0-9]+$" <<< $1; then
return 1
fi
return 0
}
if [ -z $1 ] || ! is_int $1 || (($1 <= 0)); then
printf "\
Usage: %s nbr_int
nbr_int: Un nombre entier supérieur à 0\n" $0
exit 1
fi
a=0
b=1
while (($b < $1)); do
printf "%d\n" $b
((b=a+b))
((a=b-a))
done
printf "b/a = %1.15f\n" $(echo $b/$a | bc -l)
exit 0
En php:
#!/usr/bin/env php
<?php
if(! isset($argv[1]) || ! is_numeric($argv[1]) || intval($argv[1]) <= 0){
printf("Usage: %s nbr_int
nbr_int: Un nombre entier supérieur à 0\n", $argv[0]);
exit(1);
}
$nbr_int = intval($argv[1]);
$a = 0;
$b = 1;
while ($b < $nbr_int) {
printf("%d\n", $b);
$b = $a + $b;
$a = $b - $a;
}
printf("b/a = %1.15f\n", $b/$a);
exit(0);
En python3:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys, argparse
parser = argparse.ArgumentParser(description=u"Calcul et affiche les n premiers nombres de la suite de Fibonacci.")
parser.add_argument("number", help=u"Nombre maximum de calcul de la séquence. Ce nombre doit égal ou supérieur à 2.", type=int)
parser.add_argument("-g", "--display-golden-number", dest="golden", help=u"Afficher le nombre d'or.", action="store_true")
parser.add_argument("--log", default=sys.stdout, type=argparse.FileType('w'), help=u"Fichier où sera enregistré le résultat.")
args = parser.parse_args()
if args.number < 2:
print(u"Indiquer un nombre supérieur ou égal à 2.")
sys.exit(1)
a,b = 0,1
while b < args.number:
print("{:d}".format(b), file=args.log)
a,b = b,a+b
if args.golden:
print(u"\nb/a = {:1.15f} (Nombre d'or)".format(b/a), file=args.log)
args.log.close()
sys.exit(0)
Tous ces scripts prennent en paramètre un nombre entier positif.
En prime, le quotient des deux derniers termes est affiché et représente le nombre d'or si le nombre passé en argument est supérieur ou égal à 1 000 000 (pour la précision du nombre d'or).
Le script Python est un peu plus développé avec une gestion des arguments plus pointue.
Transmettre des messages chiffrés.
Framabin est un service en ligne de Framasoft, libre et gratuit, qui permet de transmettre des messages, de façon sécurisée (les messages sont chiffrés en utilisant l’algorithme AES 256 bits).
Il est possible de définir une date d'expiration, et une option est diponible afin de supprimer le message dès la première lecture.
Une fois le message créé, 2 urls sont fournies pour le partage et la suppression du message.
Partagez des images de façon anonyme.
Framapic est un service en ligne de Framasoft, libre et gratuit, qui permet de partager des images, de façon sécurisée (les images sont cryptées sur le serveur).
Il est possible d'y envoyer une image à partir de son poste ou d'une url.
Il est possible de définir une date d'expiration, et une option est diponible afin de supprimer l'image dès le premier accès.
Enfin, un bouton permet de partager le lien de l'image directement sur Twitter et 4 urls sont fournies pour l'affichage, le téléchargement, le partage et la suppression de l'image.
LessPass est un outil, en ligne, qui permet de gérer ses différents mots de passe en les calculant, à la demande, à l'aide d'informations fournies, à l'inverse des différents gestionnaires de mots de passe qui eux les enregistrent dans une base.
Le gros avantage de cette solution, tous vos mots de passe sont disponibles n'importe quand, n'importe où, sur n'importe quelle machine et n'importe quel navigateur.
Deux informations importantes ne doivent pas être oubliées.
L'adresse du site web LessPass ainsi que votre mot de passe maître.
Ah oui, il faut quand même se souvenir d'un mot de passe.
Une extension pour Chrome et Firefox est également disponible. Cela évite d'aller sur le site web.
Comment cela fonctionne-t-il ?
Pour fonctionner, l'algorithme a besoin de trois informations:
A l'aide de ces informations, l'algorithme calcul un mot de passe, de la longueur souhaitée et contenant ou pas des caractères spécifiques.
C'est ce mot de passe qui doit être utilisé pour vous connecter sur le site indiqué.
A utiliser, bien sûr, lors de la création d'un compte, ou alors si le compte est déjà existant, le mot de passe correspondant doit être changé par celui-ci.
LessPass est Open Source. Ce qui signifie que le code est accessible.
Les sources sont disponibles sur GitHub https://github.com/lesspass/lesspass/
LessPass peut également être auto-hébergé. (container docker)
L'algorithme est consultable ici https://github.com/lesspass/core/blob/master/index.js
Grâce à cet outil, fini les mots de passe identiques pour tous les sites sur lesquels vous avez un compte.
Table ASCII ( 0 - 127 )
Décimal Octal Hex Binaire Caractère ------- ----- --- -------- ------ 000 000 00 00000000 NUL (Null char.) 001 001 01 00000001 SOH (Start of Header) 002 002 02 00000010 STX (Start of Text) 003 003 03 00000011 ETX (End of Text) 004 004 04 00000100 EOT (End of Transmission) 005 005 05 00000101 ENQ (Enquiry) 006 006 06 00000110 ACK (Acknowledgment) 007 007 07 00000111 BEL (Bell) 008 010 08 00001000 BS (Backspace) 009 011 09 00001001 HT (Horizontal Tab) 010 012 0A 00001010 LF (Line Feed) 011 013 0B 00001011 VT (Vertical Tab) 012 014 0C 00001100 FF (Form Feed) 013 015 0D 00001101 CR (Carriage Return) 014 016 0E 00001110 SO (Shift Out) 015 017 0F 00001111 SI (Shift In) 016 020 10 00010000 DLE (Data Link Escape) 017 021 11 00010001 DC1 (XON)(Device Control 1) 018 022 12 00010010 DC2 (Device Control 2) 019 023 13 00010011 DC3 (XOFF)(Device Control 3) 020 024 14 00010100 DC4 (Device Control 4) 021 025 15 00010101 NAK (Negative Acknowledgement) 022 026 16 00010110 SYN (Synchronous Idle) 023 027 17 00010111 ETB (End of Trans. Block) 024 030 18 00011000 CAN (Cancel) 025 031 19 00011001 EM (End of Medium) 026 032 1A 00011010 SUB (Substitute) 027 033 1B 00011011 ESC (Escape) 028 034 1C 00011100 FS (File Separator) 029 035 1D 00011101 GS (Group Separator) 030 036 1E 00011110 RS (Request to Send)(Record Separator) 031 037 1F 00011111 US (Unit Separator) 032 040 20 00100000 SP (Space) 033 041 21 00100001 ! (exclamation mark) 034 042 22 00100010 " (double quote) 035 043 23 00100011 # (number sign) 036 044 24 00100100 $ (dollar sign) 037 045 25 00100101 % (percent) 038 046 26 00100110 & (ampersand) 039 047 27 00100111 ' (single quote) 040 050 28 00101000 ( (left opening parenthesis) 041 051 29 00101001 ) (right closing parenthesis) 042 052 2A 00101010 * (asterisk) 043 053 2B 00101011 + (plus) 044 054 2C 00101100 , (comma) 045 055 2D 00101101 - (minus or dash) 046 056 2E 00101110 . (dot) 047 057 2F 00101111 / (forward slash) 048 060 30 00110000 0 049 061 31 00110001 1 050 062 32 00110010 2 051 063 33 00110011 3 052 064 34 00110100 4 053 065 35 00110101 5 054 066 36 00110110 6 055 067 37 00110111 7 056 070 38 00111000 8 057 071 39 00111001 9 058 072 3A 00111010 : (colon) 059 073 3B 00111011 ; (semi-colon) 060 074 3C 00111100 < (less than sign) 061 075 3D 00111101 = (equal sign) 062 076 3E 00111110 > (greater than sign) 063 077 3F 00111111 ? (question mark) 064 100 40 01000000 @ (AT symbol) 065 101 41 01000001 A 066 102 42 01000010 B 067 103 43 01000011 C 068 104 44 01000100 D 069 105 45 01000101 E 070 106 46 01000110 F 071 107 47 01000111 G 072 110 48 01001000 H 073 111 49 01001001 I 074 112 4A 01001010 J 075 113 4B 01001011 K 076 114 4C 01001100 L 077 115 4D 01001101 M 078 116 4E 01001110 N 079 117 4F 01001111 O 080 120 50 01010000 P 081 121 51 01010001 Q 082 122 52 01010010 R 083 123 53 01010011 S 084 124 54 01010100 T 085 125 55 01010101 U 086 126 56 01010110 V 087 127 57 01010111 W 088 130 58 01011000 X 089 131 59 01011001 Y 090 132 5A 01011010 Z 091 133 5B 01011011 [ (left opening bracket) 092 134 5C 01011100 \ (back slash) 093 135 5D 01011101 ] (right closing bracket) 094 136 5E 01011110 ^ (caret cirumflex) 095 137 5F 01011111 _ (underscore) 096 140 60 01100000 ` 097 141 61 01100001 a 098 142 62 01100010 b 099 143 63 01100011 c 100 144 64 01100100 d 101 145 65 01100101 e 102 146 66 01100110 f 103 147 67 01100111 g 104 150 68 01101000 h 105 151 69 01101001 i 106 152 6A 01101010 j 107 153 6B 01101011 k 108 154 6C 01101100 l 109 155 6D 01101101 m 110 156 6E 01101110 n 111 157 6F 01101111 o 112 160 70 01110000 p 113 161 71 01110001 q 114 162 72 01110010 r 115 163 73 01110011 s 116 164 74 01110100 t 117 165 75 01110101 u 118 166 76 01110110 v 119 167 77 01110111 w 120 170 78 01111000 x 121 171 79 01111001 y 122 172 7A 01111010 z 123 173 7B 01111011 { (left opening brace) 124 174 7C 01111100 | (vertical bar) 125 175 7D 01111101 } (right closing brace) 126 176 7E 01111110 ~ (tilde) 127 177 7F 01111111 DEL (delete)
TestDisk & PhotoRec sont deux utilitaires qui permettent de récupérer des données effaçées sur des supports tels que des cartes mémoires et des clés usb.
Disponibles pour Linux, Mac et Windows.
Pour le téléchargement et la documentation complète: http://www.cgsecurity.org/wiki/Main_Page
Pour une meilleur sécurité, il est préférable d'utiliser ces utilitaires sur une copie du support à analyser.
Pour ce faire, l'utilitaire dd disponible sous Linux fera très bien l'affaire.
Pour connaitre le fichier /dev/xxx correspondant au support à analyser, la commande dmesg sous Linux permet de fournir l'information après avoir, bien sûr, inséré le support dans l'ordinateur.
Ou alors, à l'aide du fichier /proc/partitions:
# cat /proc/partitions
major minor #blocks name
8 0 976762584 sda
8 1 194560 sda1
8 2 1000448 sda2
8 3 1 sda3
8 5 975564800 sda5
253 0 975560704 dm-0
Pour effectuer une image du support:
# dd if=/dev/sdx of=/tmp/image.dd
Attention, avec la commande dd, de ne pas inverser les fichiers des paramètres if et of. Les conséquences sont terribles et irréversibles.
Pour installer TestDisk et PhotoRec sous Linux:
# sudo apt-get update
# sudo apt-get install testdisk
Pour les autres systèmes, il est possible de le télécharger ici: http://www.cgsecurity.org/wiki/TestDisk_Download
Pour analyser l'image du support et rechercher les fichiers effaçés avec l'utilitaire testdisk:
# testdisk /tmp/image.dd
TestDisk permet de restaurer des fichiers à partir d'une liste créée suite à une analyse.
Pour analyser l'image du support et rechercher les fichiers effaçés avec l'utilitaire photorec:
# photorec /tmp/image.dd
PhotoRec permet la restauration de tous les fichiers trouvés. Le nombre de fichiers restaurés est plus important qu'avec l'utilitaire TestDisk.
Plus d'info pour TestDisk: http://www.cgsecurity.org/wiki/TestDisk
Plus d'info pour PhotoRec: http://www.cgsecurity.org/wiki/PhotoRec
Sur tous les moteurs de recherche (Google, Bing, QWant ...), il existe une fonction bien particulière qui permet d'effectuer des recherches sur un site en particulier (le site doit être indexé par le ou les moteurs de recherche bien sûr).
Pour cela, il suffit d'indiquer dans la zone de recherche, en plus du ou des termes recherchés, la mention "site:monsite.fr"
Exemple avec Google:
Pour lister toutes les pages d'un site indexées par le moteur de recherche, il suffit d'indiquer seulement la mention "site:monsite.fr"
Exemple avec QWant:
Il existe d'autres fonctions mais celles-ci sont vraiment les plus intéressantes.
ISO-8859-1 ou UTF-8/16.
Quel encodage choisir pour afficher correctement tous les caractères accentués qu'il y a dans la langue française ?
Tous les caractères accentués de la langue française sont gérés par la norme ISO-8859-1.
En HTML, il y a une astuce qui consiste à ne pas s'occuper du type de l'encodage des caractères mais utiliser à la place le nom d'entité des caractères (entity name).
Grâce à cette technique, tous les caractères seront toujours affichés correctement.
Source http://www.w3schools.com/
Par exemple, au lieu d'écrire ceci dans une page HTML
<html>
<body>
<p>Ceci est un caractère accentué</p>
</body>
</html>
Qui pourrait provoquer un problème à l'affichage si le codage des caractères est mal défini (comme ceci)
Ceci est un caractère accentué
Il vaut mieux écrire cela
<html>
<body>
<p>Ceci est un caractère accentué</p>
</body>
</html>
Ce qui donne comme résultat
Ceci est un caractère accentué
Plus besoin de se soucier de l'encodage du fichier.
Character | Entity Number | Entity Name | Description |
---|---|---|---|
Œ | Œ | Œ | capital ligature OE |
œ | œ | œ | small ligature oe |
Š | Š | Š | capital S with caron |
š | š | š | small S with caron |
Ÿ | Ÿ | Ÿ | capital Y with diaeres |
ƒ | ƒ | ƒ | f with hook |
ˆ | ˆ | ˆ | modifier letter circumflex accent |
˜ | ˜ | ˜ | small tilde |
  |   | en space | |
  |   | em space | |
  |   | thin space | |
| ‌ | ‌ | zero width non-joiner |
| ‍ | ‍ | zero width joiner |
| ‎ | ‎ | left-to-right mark |
| ‏ | ‏ | right-to-left mark |
– | – | – | en dash |
— | — | — | em dash |
‘ | ‘ | ‘ | left single quotation mark |
’ | ’ | ’ | right single quotation mark |
‚ | ‚ | ‚ | single low-9 quotation mark |
“ | “ | “ | left double quotation mark |
” | ” | ” | right double quotation mark |
„ | „ | „ | double low-9 quotation mark |
† | † | † | dagger |
‡ | ‡ | ‡ | double dagger |
• | • | • | bullet |
… | … | … | horizontal ellipsis |
‰ | ‰ | ‰ | per mille |
′ | ′ | ′ | minutes |
″ | ″ | ″ | seconds |
‹ | ‹ | ‹ |