Applications

Ansible

Logo Ansible

La gestion automatisée de tout un parc de serveurs,

De l'installation d'applications à la configuration en passant par toutes les tâches de maintenance.

Tout est automatique grâce aux playbooks Ansible.

Pré-requis: maitriser le YAML, disposer d'un environnement virtuel en Python et disposer sur son système du programme sshpass.


Pour les systèmes à base de dnf

$ sudo dnf install python3 sshpass

Pour les systèmes à base de apt

$ sudo apt install python3 sshpass

Pour les systèmes à base de zypper

$ sudo zypper install python3 sshpass

 
 

 

 

 

Fichier attachéTaille
Image icon logo ansible34.32 Ko

Ansible: Installer son environnement virtuel Python

Pour utiliser Ansible, il est nécessaire de disposer d'un environnement virtuel Python.

Pour ce faire, rien de plus simple:

1 - Création de l'environnement virtuel dans son dossier personnel

$ cd ~
$ python3.11 -m venv ansible

2 - Activation de l'environnement virtuel et effectuer la mise à jour de l'outil python pip

$ cd ansible/
$ source bin/activate
$ python3 -m pip install -U pip

3 - Installation du module Ansible

$ python3 -m pip install -U ansible

4 - Vérifier la bonne installation de Ansible

$ ansible --version
ansible [core 2.16.7]
  config file = None
  configured module search path = ['/home/ronan/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/ronan/ansible/lib/python3.11/site-packages/ansible
  ansible collection location = /home/ronan/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/ronan/ansible/bin/ansible
  python version = 3.11.3 (main, Aug  9 2023, 09:30:45) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)] (/home/ronan/ansible/bin/python3)
  jinja version = 3.1.4
  libyaml = True

$ ansible -m ping localhost
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Et voilà, l'environnement virtuel Python pour Ansible est prêt et opérationnel.

Etiquettes: 

Ansible: le fichier inventaire

Pour fonctionner, Ansible a besoin de connaitre la liste exhaustive de tous les serveurs qu'il doit administrer.

La documentation Ansible en ligne

1 - Création du fichier hosts

$ vim hosts

2 - Le contenu du fichier doit ressembler à ceci

$ cat hosts
[nginx]
SERVER1
SERVER2

[rabbitmq]
SERVER3

[glpi]
SERVER4

[docker]
SERVER5
SERVER6

[prod]
SERVER1
SERVER3
SERVER4
SERVER5

[dev]
SERVER2
SERVER6

Il est possible d'indiquer entre [...] un terme permettant de regrouper les différents serveurs en catégorie.

La commande suivante permet d'afficher tous les hosts présents dans le fichier inventaire.

$ ansible-inventory --graph
@all:
  |--@ungrouped:
  |--@nginx:
  |  |--SERVER1
  |  |--SERVER2
  |--@rabbitmq:
  |  |--SERVER3
  |--@glpi:
  |  |--SERVER4
  |--@docker:
  |  |--SERVER5
  |  |--SERVER6
  |--@prod:
  |  |--SERVER1
  |  |--SERVER3
  |  |--SERVER4
  |  |--SERVER5
  |--@dev:
  |  |--SERVER2
  |  |--SERVER6

... d'un groupe en particulier

$ ansible-inventory --graph nginx
@nginx:
  |--SERVER1
  |--SERVER2

 
 

 

 

Etiquettes: 

Ansible: le fichier de configuration ansible.cfg

Le fichier ansible.cfg n'est pas forcément nécessaire pour l'utilisation d'Ansible, mais il est fortement conseillé pour la simplifier.

Documentation Ansible en ligne

Voici un exemple limité des principaux paramètres à renseigner.

$ cat ansible.cfg
[defaults]
inventory          = ./hosts
interpreter_python = /usr/bin/python3
host_key_checking  = False
log_path           = ./ansible.log
remote_user        = root

- On y indique l'emplacement du fichier inventaire hosts
- L'interpréteur python à utiliser sur les serveurs distants
- On ne vérifie pas les clés des serveurs distants. Cela évite d'avoir tous les serveurs de renseignés dans le fichier ~/.ssh/know_hosts
- On renseigne le fichier pour les logs
- Le user utilisé pour se connecter aux différents serveurs

Il est possible de générer automatiquement le fichier de configuration via cette commande

$ ansible-config init --disabled > ansible.cfg

 

Etiquettes: 

Ansible: utilisation avec une clé ssh

Pour éviter, à chaque fois, de saisir le mot de passe (option -k) permettant de se connecter aux serveurs distants, il est possible d'utiliser une connexion par clé ssh.

La documentation Ansible en ligne

Tout est indiqué ici pour générer une clé ssh.

Une fois la clé ssh générée, il faut la copier sur tous les serveurs distants.
Pour cela, nous allons utiliser Ansible pour le faire à grande échelle.

Nous allons donc utiliser la commande authorized_key pour le faire.

$ ansible -m authorized_key -u mon_user -a "user=mon_user exclusive=true state=present key=""{{ lookup('file', '~/.ssh/id_rsa.pub') }}""" all -k

- L'option -m authorized_keys permet d'indiquer que nous souhaitons utiliser la commande authorized_keys
- L'option -u mon_user permet d'indiquer avec quel utilisateur se connecter aux serveurs distants.
- L'option -a "..." permet de renseigner les arguments nécessaires pour la commande authorized_keys. On y indique le user concerné, le terme exclusive permet d'indiquer qu'il doit y avoir une seule clé ssh d'autorisée, le terme state permet d'indiquer que la clé publique doit être présente (absent si l'on souhaite la supprimer) et enfin, le terme key permet, grâce à la fonction lookup, de copier le contenu du fichier ~/.ssh/id_rsa.pub du serveur local dans le fichier authorized_keys du ou des serveurs distants.
- Le mot clé all permet d'indiquer que l'opération doit être effectuée sur tous les hosts présents dans l'inventaire.
- L'option -k permet de saisir le mot de passe pour se connecter aux serveurs distants.

Ansible: les commandes ...

Voici quelques exemples d'utilisation des différentes commandes disponibles avec Ansible

Etiquettes: 

Ansible: la commande ping

La première commande Ansible que nous allons utiliser est la commande ping.

La documentation Ansible en ligne

Cette commande va permettre de tester si tous les serveurs sont accessibles et disponibles.

L'option -k permet de saisir le mot de passe pour se connecter aux serveurs. Le mot de passe doit être identique à tous les serveurs. Pour éviter cette manipulation, il est possible d'utiliser une connexion via une clé ssh.

L'option -m permet d'indique la commande à utiliser (ping).

Le mot clé all permet d'indiquer que nous souhaitons exécuter la commande sur tous les hosts présents dans le fichier inventaire.

$ ansible -k -m ping all
SSH password:
SERVER5 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
SERVER2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
SERVER1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
SERVER3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
SERVER4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
SERVER6 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Si je souhaite exécuter la commande ping uniquement sur mes hosts nginx

$ ansible -k -m ping nginx
SSH password:
SERVER2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
SERVER1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Rien de plus simple.

Etiquettes: 

Ansible: la commande setup

La comande setup permet d'obtenir un inventaire exhaustif des hosts de l'inventaire.

La documentation Ansible en ligne

Attention, cette commande retourne un json de plus de 1000 lignes contenant toutes les informations du ou des hosts interrogés.

Chaque clé du json peut être utilisée dans les playbooks Ansible grâce à la variable ansible_facts.

$ ansible -m setup SERVER1
SERVER1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.50.2.253",
            "172.17.0.1"
        ],
...
       "module_setup": true
    },
    "changed": false
}

Il est possible de filtrer directement sur un paramètre précis.

$ ansible -m setup SERVER1 -a "filter=ansible_processor_nproc"
SERVER1 | SUCCESS => {
    "ansible_facts": {
        "ansible_processor_nproc": 2
    },
    "changed": false
}

Pour info, tout comme les hosts présents dans le fichier inventaire, le serveur Ansible lui-même peut être utilisé grâce au mot clé localhost.

$ ansible -m setup localhost -a "filter=ansible_loadavg"
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_loadavg": {
            "15m": 0.43,
            "1m": 1.9,
            "5m": 0.78
        }
    },
    "changed": false
}

Etiquettes: 

Ansible: la commande "command"

La commande command permet d'exécuter une commande simple.

Voir la commande shell pour des exécutions plus complexes.

La documentation Ansible en ligne

Le commande n'étant pas exécutée par l'interpréteur de commande, l'utilisation des caractères spéciaux tels que * < > | ; & ne fonctionne pas.

Quelques exemples:

$ ansible -m command -a "uptime" SERVER1
SERVER1 | CHANGED | rc=0 >>
 13:37:18 up 12 days,  3:58,  2 users,  load average: 0,16, 0,11, 0,25

$ ansible -m command -a "w" SERVER2
SERVER2 | CHANGED | rc=0 >>
 13:41:22 up 12 days,  4:02,  2 users,  load average: 0,10, 0,09, 0,20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user pts/0    10.99.17.12      lun.10    2.00s  1.31s  0.00s w
user pts/1    10.99.17.12      09:53   34:37   0.25s  0.01s sshd: user [priv]

$ SERVER3 -m command -a "date" SERVER3
localhost | CHANGED | rc=0 >>
mer. juin  5 13:55:55 CEST 2024

 

Etiquettes: 

Ansible: la commande shell

La commande shell permet d'exécuter des commandes simples mais aussi complexes et également sous forme de scripts.

Documentation Ansible en ligne

Exemples:

$ ansible -m shell -a 'find /var/log/nginx/ -type f -name "access.log*" | xargs stat --printf "%-80n%-15s%-35w\n"' nginx
SERVER2 | CHANGED | rc=0 >>
/var/log/nginx/access.log-20240116                                              7052050        2023-11-15 17:37:33.620096531 +0100
/var/log/nginx/access.log                                                       10191          2024-01-16 09:28:20.137458998 +0100
SERVER1 | CHANGED | rc=0 >>
/var/log/nginx/access.log-20240116                                              2101711        2023-11-15 16:03:11.480149331 +0100
/var/log/nginx/access.log                                                       22278          2024-01-16 09:29:28.959290202 +0100

$ ansible -m shell -a 'cat /etc/passwd | grep root' SERVER1:SERVER2
SERVER1 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
SERVER2 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash

$ ansible -m shell -a 'echo "Hello world!" > /tmp/hello_world ; ls -l /tmp/hello_world ; cat /tmp/hello_world' localhost
localhost | CHANGED | rc=0 >>
-rw-r--r-- 1 user group 13  5 juin  14:20 /tmp/hello_world
Hello world!

Etiquettes: 

Ansible: les playbooks ...

Quelques exemples de playbooks.

Ansible: playbooks: Template basique

Voici un template basique pour démarrer un nouveau playbook Ansible.

- name: Description du playbook
  hosts: all
  gather_facts: true
  tasks:
    ...


Le format est en YAML.
Il faut être très rigoureux concernant l'indentation.
Enormément d'erreurs sont dues à une mauvaise indentation.

La clé name permet de nommer le playbook
La clé hosts permet d'indiquer la liste des hosts présents dans l'inventaire à utiliser
La clé gather_facts permet d'obtenir un inventaire complet des hosts (true ou false)
La clé tasks permet de renseigner toutes les tâches que le playbook doit exécuter.

Concernant la clé hosts, la sélection est multiple.

Par exemple, le mot clé all permet d'indiquer la liste complète de tous les hosts.
Si je veux un host en particulier
    hosts: SERVER1 # (attention à la casse pour les nom de hosts).
Si je veux deux hosts
    hosts: SERVER1:SERVER2
Si je veux tous les hosts exceptés le SERVER2
    hosts: all:!SERVER2
Si je veux mes hosts nginx de prod
    hosts: nginx:&prod

Etiquettes: 

Ansible: playbooks: Template élaboré

Voici un template plus élaboré pour démarrer un nouveau playbook Ansible et prenant en compte des variables.

---
# Description
- name: Description du playbook
  hosts: localhost
  gather_facts: true
  gather_subset: all
  become: true
  serial: false
  collections:
    - community.vmware
  vars:
    bar: 1
    foo: "bar"
    bar_dict: {
      foo: {bar: "foo", foo: 2},
      bar: {bar: "bar", foo: 3}
    }
    date: "{{lookup('pipe','date +%Y%m%d')}}"
    bar_list:
      - bar
      - foo
    tmp_dir: /tmp
    tmp_file: "{{ tmp_dir }}/toto"
    enc_vault_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          32326566396363316431393632363934396534323464343139636430386337633930383363303531
          3765303765326332316633316565356533623630383337320a306131613737336662616234343135
          37373938646264653264653639386262303662366464396163346366666230646332393639653532
          3761333761623763610a656337316333393963386466303734663066313334396234656166383731
          3830
    ansible_distro: "{{ ansible_distribution | lower }}"
  vars_prompt:
    - name: install_git
      prompt: Faut-il installer le programme git (o/n) ?
      private: false
      default: o
  pre_tasks:
      - include_vars: vars.yaml
  tasks:
    - name: the first task
      # Comment
      ansible.builtin.debug:
        msg: |
          let's go
          inventory_hostname: {{ inventory_hostname }}
          bar: {{ bar }}
          foo: {{ foo }}
          bar_dict: {{ bar_dict }}
          bar_dict['bar']['foo']: {{ bar_dict['bar']['foo'] }}
          date: {{ date }}
          bar_list: {{ bar_list }}
          tmp_dir: {{ tmp_dir }}
          tmp_file: {{ tmp_file }}
          dec_vault_password: {{ enc_vault_password }}
          install_git: {{ install_git }}
          include_vars__other: {{ other }}
          ansible_distribution: {{ ansible_distribution }}
          ansible_distro: {{ ansible_distro }}
        verbosity: 0
 

 

Quelques petites explications:

- gather_facts (true/false) permet d'obtenir l'inventaire du ou des hosts
- gather_subset (liste exhaustive)  permet d'obtenir des informations supplémentaire concernant le ou les hosts
- become (true/false) permet d'obtenir les droits SUDO
- serial (true/false) permet d'indiquer s'il faut exécuter les tâches en série, host par host ou simultanément sur tous les hosts
- collections permet d'inclure des plugins Ansible supplémentaires
- vars permet d'inclure différentes variables (string, int, dict, list)
- vars_prompt permet d'inclure des variables initialisées par un prompt lors de l'exécution du playbook
- pre_tasks permet d'exécuter des tâches avant l'exécution des tâches du playbook (j'inclus des variables globales grâce à include_vars)

Pour info, la commande lookup('pipe', ...) permet de récupérer le résultat de la sortie standard de la commande passée en paramètre.
Plus d'info ici

Etiquettes: 

Apache

Logo Apache

Invalid command 'php_flag'

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

Load Balancing

Effectuer du load balancing avec les modules proxy, proxy_balancer et proxy_ajp d'Apache2

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)

<Proxy balancer://mycluster>
BalancerMember http://adresseIpDuServeur1 min=10 max=500 timeout=60 loadfactor=1
BalancerMember http://adresseIpDuServeur2 min=10 max=500 timeout=60 loadfactor=1
</Proxy>
 
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /monAdresse balancer://mycluster stickysession=JSESSIONID scolonpathdelim=On
ProxyPassReverse /monAdresse balancer://mycluster stickysession=JSESSIONID scolonpathdelim=On
 

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)

ProxyPass /monAdresse balancer://mycluster stickysession=JSESSIONID scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember ajp://adresseIpDuServeur1:8009/ min=10 max=500 timeout=60 route=node1 loadfactor=1
BalancerMember ajp://adresseIpDuServeur1:8009/ min=10 max=500 timeout=60 route=node2 loadfactor=1
Order deny,allow
Allow from all
</Proxy>
 
Modifier les fichiers serveur.xml situé dans les répertoires conf de Tomcat (sur tous les serveurs à utiliser)
Décommenter la ligne :
<Connector maxThreads="400" port="8009" protocol="AJP/1.3" redirectPort="8443" />
Décommenter et modifier la ligne (incrémenter la valeur du node pour chaque serveur) :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="noden">
 
Pour finir, redémarrer tous les serveurs Tomcat et le serveur Apache pour prendre en compte les modifications.

Redirection automatique http vers https

Pré-requis :

  1. Activer le mod_ssl sur Apache
  2. Générer un certificat SSL
  3. Avoir son site accessible aussi bien en http qu'en https

Comment rediriger automatiquement une connexion http en https pour un virtual host précis:

Par exemple http://monDomaine.com --> https://monDomaine.com

  1. Editer le fichier de configuration du virtual host (/etc/apache2/sites-enabled/monDomaine.com.conf)
  2. Ajouter les informations suivantes indiquées en rouge
    <VirtualHost *:80>
    ServerName monDomaine.com
    CustomLog /var/log/apache2/toto-access.log combined
    ErrorLog /var/log/apache2/toto-error.log
    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteLog /var/log/apache2/https_rewrite.log
    RewriteLogLevel 1
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]
    </IfModule>
    </VirtualHost>
  3. Redémarrer Apache (/etc/init.d/apache2 restart)
 
Pour rediriger une page bien précise :
 
 
Préciser à la fin du fichier de configuration du virtual host l'information suivante
 

RedirectPermanent /login "https://monDomaine.com/login"

 

Réécriture d'URL et redirection de ports Apache

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.

Réécitrure d'URL

  • Pour réécrire / en /ma_page

> RewriteEngine On
> RewriteRule ^/$ /ma_page [L,R]

  • Pour réécrire /mon_ancienne_page en /ma_nouvelle_page

> RewriteEngine On
> RewriteRule ^/mon_ancienne_page$ /ma_nouvelle_page [L,R]

Redirection de ports

  • Pour rediriger toutes les requêtes du port 8080 vers le port 80

> RewriteEngine On
> RewriteCond  %{SERVER_PORT} ^8080$
> RewriteRule ^(.*) http://%{SERVER_NAME}:80/ [L,R]

  • Pour rediriger 'http://mon_site:8080/mon_ancienne_page' vers 'http://mon_site/ma_nouvelle_page'

> RewriteEngine On
> RewriteCond  %{SERVER_PORT} ^8080$
> RewriteRule ^(.*)/mon_ancienne_page$ http://%{SERVER_NAME}:80/ma_nouvelle_page [L,R]

Etiquettes: 

Tester les capacités d'un serveur web

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

  • -n = nombre de requetes
  • -c = nombre de requetes en parallèle (cad envoyé au meme moment)

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.

Etiquettes: 

Tomcat + Apache + SSL

Voici un exemple de configuration permettant d'avoir un frontend Apache ou Nginx, un backend Tomcat (ou autre) et le tout avec une connexion sécurisée SSL.

Un frontend Apache ou Nginx en mode proxy avec un backend Tomcat, rien de plus commun, une simple configuration comme celle-ci suffit à obtenir le résultat souhaité dans la conf virtualhost d'Apache ou de Nginx.

Pour Apache:

<VirtualHost *:80>
ServerName mondomaine.fr
...
ProxyPass           /         http://localhost:8080
ProxyPassReverse    /         http://localhost:8080
...
</VirtualHost>

Pour Nginx:

server {
    server_name mondomaine.fr;
    listen 80;    
    location / {
        include proxy_params;
        proxy_pass http://localhost:8080;
    }
}

Pour la connexion SSL, une modification doit être faite dans la configuration server.xml du Tomcat.

Il est nécessaire de définir un nouveau connector pour la connexion sécurisée.

<Connector connectionTimeout="20000" port="6443" protocol="HTTP/1.1" scheme="https" secure="true" proxyPort="443" proxyName="mondomaine.fr" />

Il faut définir un port d'écoute (6443), le "scheme" https, la valeur true à la propriété "secure", le port du serveur proxy (dans la conf apache / nginx) et enfin le nom du domaine associé (dans la conf apache / nginx).

Pour terminer, la conf à faire dans le virtualhost apache / nginx

Pour apache:

<VirtualHost *:443>
    ServerName mondomaine.fr
    ...
    SSLEngine on
    SSLCertificateFile "C:\Certbot\live\mondomaine.fr\fullchain.pem"
    SSLCertificateKeyFile "C:\Certbot\live\mondomaine.fr\privkey.pem"
    ...
    ProxyPass           /         http://localhost:6443
    ProxyPassReverse    /        http://localhost:6443
    ...
</VirtualHost>

Pour nginx:

server {
        server_name mondomaine.fr;
        location / {
                include proxy_params;
                proxy_pass http://localhost:6443;
        }
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mondomaine.fr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Attention, la configuration du serveur proxy s'effectue bien en HTTP, mais sur le port 6443.

Seule la connexion au frontend est sécurisée (avec le monde extérieur).
Celle entre le frontend et le backend n'a pas besoin de l'être puisqu'ils sont sur le même serveur.

Drupal

Logo Drupal

Tous mes trucs et astuces pour utiliser Drupal

Etiquettes: 

Débloquer un site hors-ligne

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.

Etiquettes: 

Installer la barre de progression PECL pour Drupal (sous Linux)

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
 

Etiquettes: 

MAJ des modules Drupal sur un hébergement OVH

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

Mise à jour Drupal 7.24 & 6.29

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.

Mon module Drupal : Test de connexion

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 :

http://www.isbeta.fr/6ac7a

MD5SUM : 25c575cc262272e6a2a7dc656196c25b  test_connexion.tar.gz

Disponible pour la version 7.x de Drupal :

http://www.isbeta.fr/91e09

MD5SUM : 9b7a14d2e38c1111f2cc841df365f839  test_connexion-7.x-1.0.tar.gz

Etiquettes: 

Récupérer (extraire) les données d'un noeud

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.

Etiquettes: 

Réinitialiser le mot de passe administrateur de Drupal

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;

Eclipse

Logo Eclipse

Tous mes trucs et astuces pour utiliser Eclipse

Raccourcis clavier

Liste des raccourcis clavier afin d'utiliser Eclipse plus rapidement.

  • Pour obtenir la liste complète des raccourcis clavier, appuyer sur CTRL + SHIFT + L
  • Pour dupliquer une ligne, appuyer sur CTRL + ALT + Up
  • Pour commenter ou décommenter une ligne ou un bloc, appuyer sur CTRL + SHIFT + /
  • Pour utiliser l'auto-complétion, appuyer sur CTRL + Espace
  • Pour indenter le code, appuyer sur CTRL + SHIFT + I
  • Pour effacer la ligne courante, appuyer sur CTRL + D
  • Pour sélectionner un bloc de texte, appuyer sur ALT + SHIFT + A (très pratique pour sélectionner une partie d'un code sur plusieurs lignes pour pouvoir le modifier en une seule fois ou écrire un commentaire sur plusieurs lignes tout en restant aligné - le curseur se transforme en + permettant de dessiner une zone d'encadrement)
Etiquettes: 

Firefox

Logo Firefox

Tous mes trucs et astuces pour utiliser Firefox

Etiquettes: 

Aperçu d'un site dans différentes résolutions d'affichages

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.

Etiquettes: 

Installer son propre serveur de synchronisation WEAVE pour Firefox

Logo Weave

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.

  1. Cliquer sur le menu Firefox puis Configurer Sync
     
  2. Cliquer sur Se connecter de la section J'ai déjà un compte Firefox Sync
     
  3. Cliquer sur  Je n'ai pas l'appareil avec moi
     
  4. Saisir le nom de l'utilisateur et le mot de passe
     
  5. Dans Serveur, choisir Utiliser un serveur personnalisé... puis saisir l'adresse http du serveur perso
    < http://mondomaine.com/weave/ > (le protocole HTTPS est recommandé pour plus de sécurité mais il faut le praramétré au niveau du serveur Apache)
     
  6. Saisir "1234" pour la Clé de synchronisation puis cliquer sur Suivant

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.

Etiquettes: 

MySQL

Logo MySql
Tous mes trucs et astuces pour utiliser MySQL

Afficher verticalement le résulat d'une requête

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)

Ajouter un super utilisateur MySql

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;

 

Etiquettes: 

Connexion automatique à un serveur MySQL

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

Créer un trigger

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);


 
A la place du mot clé AFTER, nous pouvons également utiliser BEFORE qui exécute l'action avant l'évènement.
 
Pour récupérer les valeurs de la table surveillée utiliser les mots clés OLD et/ou NEW (OLD.nom_du_champ ou NEW.nom_du_champ)
 
Par exemple :

$ .
> 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);

 

Etiquettes: 

Gestion des dates

Dans MySql, les dates sont au format yyyy-mm-dd (aaaa-mm-jj)
 
Ajouter x jour(s) à un champ de type date :
SELECT DATE_ADD(champ_date, INTERVAL x DAY) FROM ma_table
mysql> SELECT DATE_ADD('2013-09-06', INTERVAL 10 DAY) FROM sys;
2013-09-16
ou
SELECT champ_date + INTERVAL x DAY FROM ma_table
mysql> SELECT '2013-09-06' + INTERVAL 10 DAY FROM sys;
2013-09-16
Ajouter x mois à un champ de type date :
SELECT DATE_ADD(champ_date, INTERVAL x MONTH) FROM ma_table
mysql> SELECT DATE_ADD('2013-09-06', INTERVAL 2 MONTH) FROM sys;
2013-11-06
Ajouter x année(s) à un champ de type date :
SELECT DATE_ADD(champ_date, INTERVAL x YEAR) FROM ma_table
mysql> SELECT DATE_ADD('2013-09-06', INTERVAL 2 YEAR) FROM sys;
2015-09-06
Mettre à jour un champ de type date en y ajoutant x jour(s) et/ou x mois et/ou x année(s) :
UPDATE ma_table SET champ_date = DATE_ADD(champ_date, INTERVAL x DAY)
UPDATE ma_table SET champ_date = DATE_ADD(champ_date, INTERVAL x MONTH)
UPDATE ma_table SET champ_date = DATE_ADD(champ_date, INTERVAL x YEAR)
Pour un retranchement, utiliser le signe moins (-) devant la valeur x
mysql> SELECT DATE_ADD('2013-09-06', INTERVAL -2 YEAR) FROM sys;
2011-09-06
Afficher la date du jour dans une requête :
SELECT CURRENT_DATE FROM ma_table
mysql> SELECT CURRENT_DATE FROM sys;
2013-09-06
ou
SELECT CURDATE() FROM ma_table
mysql> SELECT CURDATE() FROM sys;
2013-09-06
Afficher le jour, le mois ou l'année d'un champ de type date :
SELECT DAY(champ_date) FROM ma_table
mysql> SELECT DAY('2013-09-06') FROM sys;
6
SELECT MONTH(champ_date) FROM ma_table
mysql> SELECT MONTH('2013-09-06') FROM sys;
9
SELECT YEAR(champ_date) FROM ma_table
mysql> SELECT YEAR('2013-09-06') FROM sys;
2013

 

Etiquettes: 

Ignorer l'erreur "Duplicate entry for key"

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.

Etiquettes: 

MySQL: Mettre à jour le champ d'une table en fonction d'un champ d'une autre table

L'exemple suivant permet de mettre à jour le champ nom_region de la table codes_postaux à partir du champ nom_region de la table departements

UPDATE
    codes_postaux c
SET
    c.nom_region = (
    SELECT
        d2.nom_region
    FROM
        departements d2
    WHERE
        d2.code_departement = LEFT(c.Postcode_from,
        2))
WHERE
    EXISTS (
    SELECT
        1
    FROM
        departements d1
    WHERE
        d1.code_departement = LEFT(c.Postcode_from,
        2) )
    AND c.Country_name = 'FRANCE'

Ceci grâce principalement au mot clé EXISTS

Personnellement, je trouve que cette syntaxe est beaucoup plus rapide que certaines autres trouvées sur internet comme par exemple avec une jointure avec la table source entre le UPDATE et le SET

UPDATE table1 AS b
INNER JOIN table2 AS g ON b.champ1= g.champ1
SET b.champ2= g.champ2
WHERE  (b.champ2= '' or b.champ2= 0) and
  g.champ2 > 0
Etiquettes: 

Restaurer / importer une base de données MySql

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.

Etiquettes: 

Sauvegarder / exporter une base de données

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

Etiquettes: 

Se connecter à un serveur MySql à partir de n'importe quel host

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

Etiquettes: 

Utilisation de MySQL en console

Connexion MySQL

Pour se connecter au sevreur MySQL depuis une console

$ mysql -u nom_du_user -p

puis saisir le mot de passe

Etiquettes: 

Ajouter ou modifier le mot de passe ROOT

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

Etiquettes: 

Controler l'intégrité des bases de données

$ mysqlcheck -A -u root -p

Puis saisir le mot de passe

 

Enregistrer le résultat d'une requête dans un fichier

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é

Etiquettes: 

Sélectionner la base de données à utiliser

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;

Etiquettes: 

VirtualBox

VirtualBox

Tous mes trucs et astuces pour utiliser VirtualBox

Dupliquer un disque

Dans une console, saisir la commande suivante :

$ vboxmanage clonevdi nom_du_disque_a_cloner nom_du_nouveau_disque

Démarrer une machine virtuelle via une console

Sous Linux

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)

Sous Windows

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)

Arrêter une machine virtuelle via une console

$ vboxmanage controlvm nom_de_la_machine_virtuelle poweroff

ZIMBRA

Logo Zimbra

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.

 

Installation de Zimbra sur Ubuntu 8.04 LTS 32 bits

Voir la documentation Ubuntu

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.

Etiquettes: 

Installation Ubuntu 8.04 LTS

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

choix du nom de la machine

Au moment du choix des paquets supplémentaires à installer choisir OpenSSH-server & DNS Server

choix des paquets à installer

Pour paramétrer notre nouveau système, nous installerons Webmin

Etiquettes: 

Installation de 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

Etiquettes: 

Paramétrage de Webmin

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 :

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

webmin_en_francais

Via Webmin, configurer le serveur en IP fixe.

Cliquer sur le menu Réseau puis sur Configuration Réseau

configuration_reseau

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

interface_eth0

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

adresse passerelle

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

Adresse machine

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

Client DNS

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.

Etiquettes: 

Configuration de Bind9

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

Configuration du fichier /etc/hostname

Ce fichier doit contenir uniquement le nom de la machine.

Configuration du fichier /etc/hosts

Fichier modifié précédemment via Webmin.

Ce fichier doit ressembler à cela

Configuration du fichier /etc/resolv.conf

Fichier modifié précédemment via Webmin.

Ce fichier doit ressembler à cela

Configuration du fichier /etc/bind/named.conf

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";

Configuration du fichier /etc/bind/named.conf.options

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; };
};

Création du dossier /etc/bind/zones

$ sudo mkdir /etc/bind/zones

Création du fichier /etc/bind/zones/mondomaine.com.hosts

$ 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

Création du fichier /etc/bind/zones/rev.192.168.1.in-addr.arpa

$ 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.

Vérification de la configuration

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

Fichier attachéTaille
Binary Data hosts.278 octets
Binary Data resolv.conf46 octets
Binary Data named.conf1.25 Ko
Binary Data named.conf_.options710 octets
Binary Data mondomaine.com_.hosts351 octets
Binary Data rev.192.168.1.in-addr.arpa170 octets
Etiquettes: 

Installation de Zimbra

Paquets pré-requis à l'installation de Zimbra

$ 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

Détail de l'installation :

  • Do you agree with the terms of the software license agreement? [N] Y (répondre Y)
  • Install zimbra-ldap [Y] (laisser le choix par défaut)
  • Install zimbra-logger [Y] (laisser le choix par défaut)
  • Install zimbra-mta [Y] (laisser le choix par défaut)
  • Install zimbra-snmp [Y] (laisser le choix par défaut)
  • Install zimbra-store [Y] (laisser le choix par défaut)
  • Install zimbra-apache [Y] (laisser le choix par défaut)
  • Install zimbra-spell [Y] (laisser le choix par défaut)
  • Install zimbra-memcached [N] (laisser le choix par défaut)
  • Install zimbra-proxy [N] (laisser le choix par défaut)
  • The system will be modified.  Continue? [N] Y (répondre Y)

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)

Paramétrage du mot de passe admin

  • Address unconfigured (**) items  (? - help) Taper 3
  • Select, or 'r' for previous menu [r] Taper 4
  • Password for admin@mondomaine.com (min 6 characters): [MOvHWVTgi] Saisir un mot de passe
  • Select, or 'r' for previous menu [r] Taper r
  • *** CONFIGURATION COMPLETE - press 'a' to apply
    Select from menu, or press 'a' to apply config (? - help) Taper a
  • Save configuration data to a file? [Yes] (laisser le choix par défaut)
  • Save config in file: [/opt/zimbra/config.23103] (laisser le choix par défaut)
  • The system will be modified - continue? [No] (répondre Y)

Poursuite du paramétrage automatique ...

  • Notify Zimbra of your installation? [Yes] (taper Y ou N)

Configuration des différents services ...

Patienter un petit moment le temps que tous les services démarrent

  • Configuration complete - press return to exit

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

Etiquettes: 

Paramétrage de Zimbra

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 :

interface connexion serveur

Le menu de Zimbra :

menu zimbra

Les différents paramétrages à modifier :

Paramètres globaux

- Agent MTA

  • Renseigner un relais MTA pour les livraisons externes
    Pour un relais MTA avec authentification, voir ici
  • Renseigner le nom de l'hôte SMTP entrant

Valider en cliquant sur Enregistrer

Domaines

- Information générale

  • Renseigner le nom d'hôte du service public
  • Renseigner le fuseau horaire

- Zimlets

  • Tout sélectionner

Valider en cliquant sur Enregistrer

Classe de service

- Défault

- Caractéristiques

  • Cocher Messenger

- Préférences

- Options générales

  • Cocher Connexion automatique aux services IM
  • Sélectionner la langue

- Options mail

  • Cocher Afficher les images extérieures dans les mails HTML
  • Choisir Grouper les mails par mails
  • Choisir Toujours rédiger les mails avec HTML
  • Choisir Style de police par défaut de l'éditeur des mails HTML : Arial

- Options d'agenda

  • Sélectionner le fuseau horaire

Valider en cliquant sur Enregistrer

Les ports à ouvrir dans le routeur :

Ports forwarding Zimbra

Etiquettes: 

Commandes Zimbra

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 zip

Les différents dossiers exportables (autres que mail):

  • _gal
  • Briefcase
  • Calendar
  • Chats
  • Contacts
  • Notebook
  • Public
  • Tasks
  • Emailed Contacts

Les dossiers standards des mails :

  • Inbox
  • Sent
  • Drafts
  • Junk
  • Trash

Commande à exécuter :

Pour info, tout dépend de la configuration du serveur Zimbra, mais il est possbile que les WebServices Rest soient disponibles en https sur le port 8443.
Dans ce cas, il faut le prendre en compte dans les commandes ci-dessous.

$ zmmailbox -z -m user@domaine.com getRestUrl -u http://`zmhostname`:8080 "/nom_du_dossier?fmt=zip" > /mon_dossier_de_sauvegarde/mon_fichier_export.zip

Exporter la totalité d'un compte dans une archive zip

$ zmmailbox -z -m compte@domaine.fr getRestURL -u http://`zmhostname`:8080 "//?fmt=zip" > ./compte.zip

Importer les différents dossiers d'un compte d'une archive zip

Les différentes valeurs du paramètre resolve :

  • skip : ignore les doublons
  • modify : modifie les anciens éléments
  • reset : supprime tout (dossiers, éléments) avant import
  • replace : supprime les éléments avant import

 Commande à exécuter :

$ zmmailbox -z -m user@domaine.com postRestUrl -u http://`zmhostname`:8080 "/nom_du_dossier?fmt=zip&resolve=reset" /mon_dossier_de_sauvegarde/mon_fichier_export.zip

Importer la totalité d'un compte à partir d'une archive zip

$ zmmailbox -z -m compte@domaine.fr postRestURL -u http://`zmhostname`:8080 "//?fmt=zip&resolve=reset" ./compte.zip

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

Sauvegarde Zimbra

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.

 
Restaurer une sauvegarde suite à un plantage du système
 
  1. Réinstaller Ubuntu Server
  2. Réinstaller Zimbra via l'option ./install.sh --softwareonly
  3. Exécuter la commande /opt/zimbra/libexec/zmsetup.pl
  4. Restaurer les données via la procédure de restauration
Etiquettes: 

Webmail : Ajouter un compte externe avec un certificat autosigné

Pour accepter les certificats non reconnus dans la configuration de Zimbra : 

$ sudo nano /opt/zimbra/conf/localconfig.xml

Dans la section : 

  <key name="ssl_allow_untrusted_certs">
    <value>false</value>
  </key>
 
Remplacer "false" par "true"
 
  <key name="ssl_allow_untrusted_certs">
    <value>true</value>
  </key>
 
Sauvegarder puis redémarrer les services Zimbra :

$ sudo su
$ su - zimbra
$ zmcontrol restart
$ exit

Etiquettes: 

Push e-mail avec Z-PUSH : Installation et configuration pour Zimbra

z-push

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

  • Copier l'archive dans le répertoire public_html du home correspondant au serveur virtuel

$ cp ./z-push-1.5.5-790.tar.gz /home/push/public_html/

  • Se rendre dans le dossier public_html et extraire le contenu de l'archive

$ cd /home/push/public_html/ && tar -xvzf ./z-push-1.5.5-790.tar.gz

  • Se rendre dans le dossier ./z-push/backend nouvellement créé

$ cd ./z-push/backend/

$ wget http://freefr.dl.sourceforge.net/project/zimbrabackend/Release51/zimbra5...
$ tar -xvzf zimbra51.tgz

  • Retourner dans le dossier z-push et éditer le fichier config.php

$ cd .. && nano ./config.php

  • Dans le fichier config.php, modifier les lignes suivantes :

    === Disable Provisioning ===
    define('PROVISIONING', false);

    === Replace ===
    $BACKEND_PROVIDER = "BackendZimbra";

    === Add ===
    define('ZIMBRA_URL', 'http://<zimbra url>');
    define('ZIMBRA_USER_DIR', 'zimbra');
    define('ZIMBRA_SYNC_CONTACT_PICTURES', true);
    define('ZIMBRA_VIRTUAL_CONTACTS',true);
    define('ZIMBRA_VIRTUAL_APPOINTMENTS',true);
    define('ZIMBRA_VIRTUAL_TASKS',true);
    define('ZIMBRA_IGNORE_EMAILED_CONTACTS',true);
    define('ZIMBRA_HTML',false);
    define('ZIMBRA_ENFORCE_VALID_EMAIL',true);

    === Optional ===
    define('ZIMBRA_NOKIA_MFE_FIX',true);
    define('ZIMBRA_NOKIA_MFE_ALWAYS_OVERWRITE',true);

    Commenter toutes les définitions IMAP (SERVER, PORT etc etc)
  • Le fichier doit ressembler à ceci config.php
  • Modifier le propriétaire du dossier state

$ chown www-data:www-data ./state/

  • Via Virtualmin, pour le domaine push.mondomaine.com par exemple, créer un Alias /Microsoft-Server-ActiveSync pointant vers /home/push/public_html/z-push/index.php

    Dans Virtualmin, on sélectionne le domaine dans la liste déroulante, puis Services --> Configure Website
    Cliquer sur le bouton Alias et redirections puis saisir les infos dans la section Alias des répertoires des documents
    Cliquer sur le bouton Sauvegarder puis sur Appliquer les changements en haut à droite
     

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.


Importer un certificat SSL auto-signé dans les appareils mobiles utilisant le serveur Z-PUSH en HTTPS

  1. Avec un navigateur (Firefox par exemple), se rendre à l'adresse HTTPS du serveur Z-PUSH (https://push.mondomaine.com)
  2. Accepter l'exception de sécurité pour le certificat SSL auto-signé
  3. Dans Firefox, cliquer sur l'icone de sécurité située à gauche de l'adresse puis sur "Plus d'informations".
  4. Cliquer sur "Afficher le certificat" puis dans l'onglet "Détails", cliquer sur exporter.
  5. Enregistrer le certificat avec le type "Certificat X.509 (DER)"
  6. Transférer le certificat sur l'appareil mobile (Bluetooth, USB etc etc ...)
  7. Dans l'appareil mobile, se rendre dans le dossier où a été enregistré le certificat puis l'ouvrir afin de l'enregistrer dans la base des certificats d'autorité.
Etiquettes: 

Z-PUSH : Installer un système de gestion des téléphones

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.

Erreurs rencontrées

Erreur d'accès à la file d'attente dans l'interface d'administration de Zimbra

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)
$

Charge CPU à 100%

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


Problème d'accès aux logs

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.

Mise à jour de l'antivirus

Procédure de mise à jour:

# su - zimbra
$ mkdir /tmp/clamdb
$ mv /opt/zimbra/data/clamav/db/* /tmp/clamdb
$ /opt/zimbra/common/bin/freshclam --config-file=/opt/zimbra/conf/freshclam.conf
$ zmamavisdctl restart
$ zmcontrol status

Mise à jour de l'anti spam

Procédure de mise à jour:

# su - zimbra
$ /opt/zimbra/common/bin/sa-update -D
$ zmamavisdctl restart
$ mkdir /tmp/state
$ mv /opt/zimbra/data/spamassassin/state /tmp/state
$ zmamavisdctl restart
$ zmcontrol status

Configurer un relais MTA avec authentification

Pour ne pas avoir de problème lors de l'envoi des mails, il est conseillé d'utiliser un relais SMTP pour l'envoi des mails à l'extérieur du domaine.

En effet, il y a de grandes chances pour que tous les mails envoyés avec notre propre serveur soient considérés comme du SPAM.

C'est pour cette raison qu'il vaut mieux utiliser un relais SMTP de confiance, mais qui dit de confiance, dit forcément authentification surtout si notre serveur ne se trouve pas sur le même réseau que notre relais SMTP.

Dans l'exemple, je vais configurer sur mon serveur ZIMBRA, qui se trouve hébergé chez ONLINE, le relais SMTP de Free (fournisseur de ma box à la maison - j'ai donc le droit par conséquent d'utiliser leur serveur SMTP)

Toutes les commandes ci-dessous doivent être exécutées avec le user zimbra.

## Je me connecter en tant que user zimbra
root@vm-zimbra:~# su - zimbra
## Je renseigne mon relais SMTP
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaRelayHost smtp.free.fr:587
## Création du fichier relay_password contenant le user et le mot de passe pour le relais smtp
zimbra@vm-zimbra:~$ echo smtp.free.fr user:pass > /opt/zimbra/conf/relay_password
## Conversion du fichier relay_password en table postfix
zimbra@vm-zimbra:~$ postmap /opt/zimbra/conf/relay_password
## Ceci permet de tester que le user et le mot de passe est bien associé au relais smtp
zimbra@vm-zimbra:~$ postmap -q smtp.free.fr /opt/zimbra/conf/relay_password
## Configuration de postfix pour l'utilisation de la table d'identification du relais smtp
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpSaslPasswordMaps lmdb:/opt/zimbra/conf/relay_password
## Activation de l'authentification SSL
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpSaslAuthEnable yes
## Désactivation de l'utilisation du "canonical name" du relais smtp
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpCnameOverridesServername no
## Activation de la séc urité TLS
zimbra@vm-zimbra:~$ zmprov ms vm-zimbra.domain.fr zimbraMtaSmtpTlsSecurityLevel may

Normalement, tout est désormais opérationnel.
Tous les mails envoyés à l'extérieur du domaine seront transférés désormais via le relais SMTP.

Générer un nouveau certificat pour Zimbra

Erreurs rencontrées:

1. TLS: can't accept: error:14094415:SSL routines:ssl3_read_bytes:sslv3 alert certificate expired.
2. Unable to start TLS: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed when connecting to ldap master.

Pas de panique, il suffit juste de suivre la procédure ci-dessous:

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::
...
$

Etiquettes: