Le blog de Zergy

2011 - IPocalypse

2011 - IPocalypse

Il y a quelques jours, les derniers blocs d'adresses IP v4 ont été attribués. Avant de paniquer sur la fin d'internet, essayons d'y voir plus clair.

Introduction

Qu'est-ce qu'une adresse IP ?

Afin de communiquer sur un réseau, les ordinateurs et logiciels utilisent des protocoles et des normes, ceux-ci vont de la forme que doit avoir le connecteur de la carte réseau à la fréquence des ondes Wi-Fi en passant par la taille d'une requête et la façon d'envoyer des données.

Parmi ces protocoles de communication, l'un des plus utilisé est le protocole IP (pour « Internet Protocol »), celui-ci fait utilisation d'adresses dites IP afin que les équipements l'utilisant puissent se contacter, comme les adresses physiques permettant à une lettre d'arriver à destination.

Une adresse IP désigne donc un équipement sur un réseau informatique, celle-ci peux être assignée manuellement ou automatiquement par un service DHCP.

Quelle forme prennent-elles ?

Il existe actuellement deux protocoles IP, l'IP version 4 (ci-après « IP v4 ») et l'IP version 6 (ci-après « IP v6 »). Le premier à été créé au début des années 1980; le second date des années 2000.

Actuellement, IP v4 est encore très massivement utilisé, que ce soit sur internet ou sur votre réseau local si vous en avez un. Une adresse IP v4 est codée sur 32 bits et prend la forme suivante :

AAA.BBB.CCC.DDD

Où AAA, BBB, CCC et DDD peuvent varier de 0 à 255 (notation décimale de mots de 8 bits), on obtient donc 232 adresses possible en théorie, soit 4 294 967 296.

IP v6 est son successeur, en plus d'apporter de multiples améliorations, il modifie totalement le système d'adressage ; à présent les adresses sont codées sur 128 bits et prennent cette forme :

aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh

Où les blocs, séparés par le signe deux points « : », varient de 0 à ffff (notation hexadécimal de mots de 16 bits), on obtient 2128 adresses possibles théoriquement, c'est à dire… heu… beaucoup. icon_smile3

340 282 366 920 938 463 463 374 607 431 768 211 456 pour être plus précis.

Pour simplifier la notation d'une adresse IP v6, on a établi la méthode suivante, prenons l'IP v6 2001:0db8:0000:85a3:0000:0000:ac1f:8001 :

  • Il est permis d'omettre de 1 à 3 chiffres zéros non significatifs dans chaque groupe de 4 chiffres hexadécimaux, on obtient donc 2001:db8:0:85a3:0:0:ac1f:8001 ;
  • Une unique suite de un ou plusieurs groupes consécutifs de 16 bits tous nuls peut être omise, en conservant toutefois les signes deux points de chaque côté de la suite de chiffres omise, c'est-à-dire une paire de deux-points (::), on obtient donc 2001:db8:0:85a3::ac1f:8001.

Passe-moi le CIDR !

Dans la suite de cet article, j'utiliserai très souvent la notation dite CIDR. Celle-ci est une méthode de notation du masque de sous-réseau.

Un masque de sous réseau késako ? Il s'agit d'un masque binaire appliqué sur une adresse IP v4 ou IP v6 pour savoir si elle fait partie du même réseau qu'une autre. Ils font la séparation entre les bits de l'adresse IP qui désignent le réseau et ceux qui désignent les machines de ce réseau.

Prenons un exemple : Nous avons deux ordinateurs connectés physiquement au même réseau IP v4, ils utilisent les adresses IP v4 192.168.5.4 et 192.168.5.78 et utilisent tous deux le masque de sous-réseau 255.255.255.128.

Traduisons ces IP v4 en binaire :

IP v4 décimale PC1 : 192.168.5.4
Masque décimal PC1 : 255.255.255.128
IP v4 décimale PC2 : 192.168.5.78
Masque décimal PC2 : 255.255.255.128

IP v4 binaire PC1 :  11000000.10101000.00001001.00000100
Masque binaire PC1 : 11111111.11111111.11111111.10000000
IP v4 binaire PC2 :  11000000.10101000.00001001.01001110
Masque binaire PC2 : 11111111.11111111.11111111.10000000

Tout les bits d'adresse IP ayant le même poids qu'un bit de masque de sous-réseau à 1 est dit masqué et désigne le réseau, dans notre cas, nous avons donc les 25 premiers bits en partant du poids fort qui sont assignés au réseau, les 7 autres sont utilisés pour désigner les machines de ce réseau.

                      __________________________
                     /                          \
IP v4 binaire PC1 :  11000000.10101000.00001001.00000100
Masque binaire PC1 : 11111111.11111111.11111111.10000000
IP v4 binaire PC2 :  11000000.10101000.00001001.01001110
Masque binaire PC2 : 11111111.11111111.11111111.10000000
                     \__________________________/
                              Bits réseau

Les bits désignant le réseau doivent être identiques pour que les deux ordinateurs se voient comme faisant partie du même réseau. Dans notre exemple, c'est le cas. icon_smile3

La notation CIDR est une forme raccourcie qui indique le nombre de bits du masque de sous-réseau d'une adresse IP qui sont assignés à la désignation du réseau. Dans notre exemple, la notation CIDR des adresses des ordinateurs PC1 et PC2 est :

  • PC1 : 192.168.5.4/25
  • PC2 : 192.168.5.78/25

Si en IP v4 la notation de masque de sous réseau décimal est très utilisée, elle a été abandonné en IP v6, non seulement parce qu'il n'y a plus de notation décimale en IP v6, mais aussi pour raccourcir la notation.

Pourquoi changer ?

Amélioration de performances

IP v6 apporte diverses améliorations comme la simplification des trames réseau qu'il utilise, l'intégration d'IPSEC qui était une fonctionnalités externe de IP v4 ou la possibilité de joindre une machine plutôt qu'une autre en fonction de ses meilleurs performances réseau (voir Anycast) et la disparition pur et simple de la diffusion (ou broadcast).

Petit aparté sur les broadcast, anycast, multicast et tout :

  • Unicast : Un équipement d'un réseau discute avec un et un seul autre.
    Exemple IRL : Une discution avec un ami.
  • Multicast : Un équipement réseau parle à plusieurs autres, mais pas à tous. Il émet sur une adresse dite de multicast, tout ceux qui écoutent sur l'adresse multicast sur laquelle il émet recevront les données.
    Exemple IRL : un professeur dans une classe, écouté par une partie des élèves pendant que les autres dorment, discutent ou dessinent dans les marges de leur cahier.
  • Anycast : Un équipement parle avec celui apte à répondre à sa requête le plus efficacement. N'existe pas en IP v4.
    Exemple IRL : Quand vous demandez le sel (ou l'eau) à table, vous le demander à la personne qui va pouvoir vous le (la) passer le plus rapidement.
  • Broadcast : Un équipement réseau parle à tout les autres. N'existe plus en IP v6.
    Exemple IRL : À TAAAABLE !!!!
Vous avez besoin de plus de Gaz Vespene d'adresses IP !

Cependant, dans cet article, nous verrons d'avantage le second problème que IP v6 règle : Le manque d'adresses IP v4.

Évolution d'Internet

IP v4 à sec

Quand IP v4 à été créé dans les années 80, on pensait qu'il y aurait assez d'adresses pour tout le monde ; personne n'avait vraiment vu venir le succès du réseau Internet qui n'était réservé qu'aux universités et structures gouvernementales à l'époque. De plus, on ne pensait pas qu'arriverait un jour des hordes de téléphones portables pouvant s'y connecter.

Vous allez me dire que 4 milliard d'adresses devraient suffire, mais pour être franc, les 232 adresses ne sont que théoriques, certaines plages d'adresses ne sont pas utilisables sur Internet, voici lesquelles :

  • De 0.0.0.0 à 0.255.255.255 (0.0.0.0/8) : Réservé
  • De 10.0.0.0 à 10.255.255.255 (10.0.0.0/8) : Réseau privé de classe A
  • De 127.0.0.0 à 172.0.0.255 (127.0.0.0/8) : Adresses locales
  • De 169.254.0.0 à 169.254.255.255 (169.254.0.0/16) : Adresse locales autoconfigurées
  • De 172.16.0.0 à 172.16.255.255 (172.16.0.0/16) : Réseau privé de classe B
  • De 192.0.0.0 à 192.0.0.255 (192.0.0.0/24) : Réservé par l'IETF
  • De 192.0.2.0 à 192.0.2.255 (192.0.2.0/24) : Réseau de test TEST-NET-1
  • De 192.18.0.0 à 192.18.128.255 (198.18.0.0/15) : Tests de performance
  • De 192.51.100.0 à 192.51.100.255 (198.51.100.0/24) : Réseau de test TEST-NET-2
  • De 192.88.99.0 à 192.88.99.255 (192.88.99.0/24) : 6to4 anycast
  • De 192.168.0.0 à 192.168.255.255 (192.168.0.0/16) : Réseau privé de classe C
  • De 203.0.113.0 à 203.0.113.255 (203.0.113.0/24) : Réseau de test TEST-NET-3
  • De 224.0.0.0 à 239.255.255.255 (224.0.0.0/4) : Adresses multicast
  • De 240.0.0.0 à 255.255.255.255 (240.0.0.0/4) : Réservé à un usage ultérieur
  • 255.255.255.255 : Broadcast

Bref, seules 3 707 435 775 adresses sont réellement utilisables.

Comment sont attribués les adresses IP sur internet ?

Il fût un temps, il suffisait de faire une demande pour se voir attribuer une grosse plage d'adresse d'adresses, regarder la cartographie des adresse IP v4 (carte de 2006) vous montrera que nombre de gros emplacements ont été attribués directement à des entreprises ou à des administrations des États-Unis. Cela date des années 1980, quand on ne pensait pas en voir le bout.

Répartition IPv4

Répartition des adresses IPv4 par RIR

Cependant, avec le temps, on s'est rendu compte qu'on ne pourrait pas continuer à gaspiller ainsi et on s'est mis à rationaliser, ceci à mené à la création de l'IANA au niveau mondial et de divers bureaux d'attribution au niveau continental et national nommés Registre Internet Régionaux (ci-après « RIR »).

  • AfriNIC : Afrique
  • APNIC : Asie et Pacifique
  • ARIN : Amérique du Nord
  • LACNIC : Amérique Latine et Caraïbes
  • RIPE-NCC : Europe, Russie et Moyen-Orient.

Actuellement, les plages d'adresses IP, qu'elles soient en v4 ou en v6, sont détenues par l'IANA, elles sont ensuite fournies aux RIR continentaux en fonction de leurs besoins. Une fois entre les mains des RIR continentaux, elles sont fournies aux RIR nationaux, puis enfin, aux entreprises, ou administrations.

Internet va-t-il tomber en panne demain ?

Épuisement IPv4

Plages IP v4 en réserve, en rouge les réserves de l'IANA, en vert, celles des RIR.

En abscisse le temps en année, en ordonnée les plages IP v4 par bloc de 16 777 216 adresses.

Non, tout simplement car les adresses IP ne sont pas du pétrole, même s'il n'y en a plus en réserve, elles ne s'usent pas, de la même façon, il est possible de remettre dans le pot commun les plages d'adresses non utilisées. Enfin, si l'IANA n'a plus une adresse IP v4 en réserve, les RIR en disposent encore un peu par effet de transmission.

Au pire, Internet aura du mal à croître

Mais heureusement, si vous avez suivi, IP v6 va pouvoir prendre la relève et supprimer ce petit problème. icon_smile3

iso-1664

Malheureusement, le changement ne se fera pas d'un claquement de doigt, nombre d'entreprises et de Fournisseurs d'Accès à Internet (ci-après « FAI ») ont traîné les pieds pour y passer, et puisque c'est au pied du mur que l'on voit mieux le mur, peut-être le tarissement des adresses IP v4 au niveau de l'IANA va les pousser à se rendre compatibles IP v6 en vitesse.

2128 IP v6 et moi et moi et moi…

Oui mais…

Avant tout, répondons à quelques bêtises que l'on trouve régulièrement.

Si je passe à IP v6, je ne pourrai plus accéder aux serveurs qui sont uniquement IP v4.

C'est faux, il est possible d'avoir ce que l'on appel une double pile IP, c'est-à-dire que votre carte réseau aura à la fois une adresse IP v4 et une adresse IP v6, par exemple, voici ce que ça donne chez le FAI auquel je suis abonné.

Sous GNU/Linux

ppp0    Link encap: Protocole Point-à-Point
        inet adr:80.67.176.144 P-t-P:62.4.16.41 Masque:255.255.255.255
        adr inet6: fe80::5043:b090:0:0/10 Scope:Lien
        adr inet6: 2001:910:1090::1/48 Scope:Global
        […]

Sous Microsoft Windows

Carte Ethernet Marvell Yukon 88E8001 Gigabit Ethernet :

        Suffixe DNS propre à la connexion : zergy.lan
        Adresse IP : 192.168.2.2
        Masque de sous-réseau : 255.255.255.0
        Adresse IP : 2001:910:1090:2:c03:256d:9235:62e3
        […]

On voit bien ici que les connexions disposent d'une adresse IP v4 (192.168.2.*) et d'une adresse IP v6 (2001:910:1090:*)

Les connectivités IP v4 et IP v6 sont utilisées selon les besoins.

Les adresses IP v6 en fe80:* sont des adresses de liens locaux, j'y reviendrai par la suite.

IP v6 permet moins d'anonymat que IP v4

On entend souvent cette bêtise à propos de deux choses :

OOo_Firewall

Les systèmes de Translation d'Adresses et Port Réseaux, aussi nommée PAT/NAT, sont un placébo trouvé vers la fin des années 1990 pour permettre à plusieurs ordinateurs d'un réseau local (adresses IP v4 de classes A, B ou C) d'être connecté à Internet avec une seule IP v4 publique.

Certains prêtent à ce système une sécurité puisque les machines à l'intérieur du réseau local ne sont pas directement joignables depuis Internet puisqu'on ne dispose que d'une IP publique.

Cependant, en IP v6, s'il est vrai que tous vos équipement auront une adresse IP v6 publique, les murs de feu de ces machines seront là pour bloquer les attaques, et n'oublions pas qu'un système de PAT/NAT n'empêche pas de se prendre des tuiles, la première faille dans un système informatique étant bien souvent l'utilisateur.

Mais réjouissons-nous, avec la disparition du PAT/NAT fini la redirection de port nécessaire pour jouer correctement. icon_smile3

Pour le problème de l'adresse MAC dans l'adresse IP v6 publique, c'est vrai si l'adresse est réglée automatiquement, et faux si vous la réglez à la main. Et vu qu'en IP v6 votre FAI vous donne gracieusement une plage d'adresses IP, à vous de choisir celle qui vous convient.

Comme les FAI fournissent des plages d'adresses IP v6, on aura encore le même problème

La plage des IP v6 utilisables sur internet vont de 2000:0000:0000:0000:0000:0000:0000:0000 à 9fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff, c'est-à-dire :

  • 1,40737488355327 × 1014 (140 737 488 355 327) plages en /48
  • 3,6028797018963967 × 1016 (36 028 797 018 963 967) plages en /56
  • 9,223372036854775807 × 1018 (9 223 372 036 854 775 807) plages en /64

Que vérifier pour passer à IP v6 chez soit ?

On prend ici le fait que vous souhaitez juste vérifier que vous pouvez vous connecter au réseau Internet en IP v6, il vous faut :

  • Un FAI offrant une connectivité IP v6.
  • Du matériel réseau offrant une connectivité IP v6.
  • Un système d'exploitation avec pile réseau IP v6.
Le FAI

Actuellement, en France, les trois FAI suivants sont compatibles IP v6 :

  • FDN offre des plages IP v6 en /48 sur demande depuis le 22 septembre 2009, d'office depuis juillet 2011.
  • Free (et donc Alice par la force des choses) offre des plages IP v6 en /64 depuis 2007.
  • Nerim offre des plages IP v6 en /48
  • SFR offre des plages IP v6 en /56 depuis fin août 2011

Pour les autres :

  • Orange ne prévoit pas de rendre la Livebox compatible avant 2012 et de commancer la bascule en début 2013. A noter qu'ils ont fait des essais en 2006, mais depuis, silence radio.
  • Pour les autres, on en sait rien.
Le matériel réseau

Les matériels réseaux devant être vérifié pour le passage à IP v6 sont votre routeur -généralement la *box de votre FAI- et votre point d'accès Wifi si celui-ci est un élément à part du routeur.

Si vous utilisez votre *box en mode « Bridge » (mode simple modem ADSL) ou que vous n'avez qu'un simple modem (ADSL ou RTC) pour vous connecter, vous n'êtes pas concerné par cette section, en effet un modem utilise les protocoles PPP et ATM, et n'est donc pas concerné par des problèmes d'IP v4 ou IP v6.

C'est à l'équipement se trouvant derrière de faire la connectivité IP.

Aujourd'hui encore, bon nombre de modems-routeur ou routeurs grand public n'offrent pas de connectivité IP v6, faites attention lors de vos achats.

Pour ce qui est des box des FAI :

  • Freebox et Alicebox : Allez dans l'interface de gestion pour activer la compatibilité IP v6 puis redémarrez-la
  • FDN : Consultez le Wiki de FDN
  • Neufbox : Il vous faut le firmware 3.1.7 au minimum. De là, allez dans l'interface de gestion de votre Neufbox → onglet « Réseau » → « WAN », puis, activez l'option IP v6 et redémarrez votre Neufbox.

Pour tous les équipements et FAI, consultez la documentation fournie et mettez le micro-logiciel (firmware) à jour si besoin.

Le système d'exploitation

Les systèmes d'exploitation récents sont compatibles avec IPv6, par récent on entend :

  • GNU/Linux avec noyau 2.2 ou plus récent, nous sommes au 2.6 depuis 2003.
  • Microsoft Windows XP SP2 ou plus récent
  • Les *BSD et MacOSX sont bien entendu compatibles, mais je ne trouve pas depuis quand.

Quelque soit votre système d'exploitation, le support d'IP v6 doit être activé par défaut, sauf sur Windows XP, voici comment faire pour celui-ci :

  • Panneau de configuration → Connexions réseaux → Clic droit sur l'une des connexion → Sélectionnez « Propriétés » ;
  • Cliquez sur le bouton « Propriété » → Sélectionnez « Réseau » ;
  • Sélectionnez « Microsoft TCP/IP version 6 » ;
  • Cliquez sur « OK » → « OK » → « OK » ;
  • Windows vous demandera de redémarrez pour appliquer les modifications, faites-le.

Tester

Connectez-vous à un site de test, il en existe d'autres.

Les adresses IP v6 que vous utiliserez

Si en IP v4 votre FAI ne vous fournissait qu'une seule et unique adresse IP, en IP v6 vous avez droit à une plage complète, généralement, on vous attribue un /64, certains FAI comme FDN fournissent un /48.

Le problème étant de trouver moyen d'utiliser ces 264 (ou 272, ou 280) adresses. sourire3

Mais outre la plage d'adresse IP v6 publique que vous fournit votre FAI, vous en trouverez d'autres, décrivons-les rapidement :

  • De :: à :ffff:ffff:ffff:ffff:ffff:ffff:ffff (::/8) : Réservé ;
  • De fc00:: à fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff (fc00::/7) : Adresses locales uniques pour les réseaux locaux, non routables sur Internet. Permet par exemple de ne pas rendre disponible hors de son réseau domestique un service de partage de fichiers ;
  • De fe80:: à febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff (fe80/10) : Adresses de liens locaux, propres à chaque interface et utilisées pour certaines fonctions du protocole IP v6 ;
  • De ff:: à ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff (ff00::/8) Adresses multicast

Savoir si un serveur utilise IP v6

A présent que votre connectivité IP v6 à Internet est en place, vous pouvez tester si un serveur quelconque est lui aussi compatible, pour cela, il suffit d'avoir quelques petits outils en ligne de commande.

Ceux-ci n'étant pas installés de base sous Micorosoft Windows voici la procédure pour les mettre en place :

Installation des outils
  • Déjà, téléchargez-les.
  • Décompressez le fichier .zip dans « C:\dig » (ou tout autre dossier de votre choix)
  • Copiez le fichier « resolv.conf » de ce dossier dans « C:\WINDOWS\system32\drivers\etc\ »

Il faut ensuite ajouter le dossier d'installation à la variable PATH du système, pour plus facilement les utiliser.

dig_path

Ajout du dossier de dig au PATH

Sous Windows XP et 2003 :

  • Clic droit sur « Poste de travail » → « Propriétés » → Onglet « Avancé » → Bouton « Variables d'environnement »
  • Dans la zone « Variables systèmes » choisir la ligne « Path » → Bouton « Modifier »
  • Dans la zone « Valeur de la variable » ajoutez « C:\dig; »
  • Cliquez sur « OK » → « OK » → « OK »

Sous Windows Vista et 7 :

  • Clic droit sur « Ordinateur » → « Propriétés » → « Option avancées » → Onglet « Avancé » → Bouton « Variables d'environnement »
  • Dans la zone « Variables systèmes » choisir la ligne « Path » → Bouton « Modifier »
  • Dans la zone « Valeur de la variable » ajoutez « C:\dig; »
  • Cliquez sur « OK » → « OK » → « OK »
Utilisation

Nous allons ici uniquement utiliser la commande « dig » pour interroger un serveur DNS (ceux qui traduisent les adresses IP en nom intelligible et vice-versa) afin de savoir si un serveur dispose d'une IP v6. D'autres commandes comme « host » sont fournies par ces outils mais ne sont pas décrites ici.

L'utilisation est très simple, il suffit d'ouvrir une invite de commande et de taper la commande :

host nomDuServeur

Exemple avec une machine compatible IP v6 :

host www.zergy.net

www.zergy.net is an alias for enalys.zergy.net.
enalys.zergy.net has address 80.67.176.144
enalys.zergy.net has IPv6 address 2001:910:1090:2::1

La commande nous répond que www.zergy.net est un surnom du serveur enalys.zergy.net et que l'adresse IP v4 ce celui-ci est 80.67.176.144.

Cependant, la réponse nous indique également que enalys.zergy.net dispose d'une adresse IP v6 qui est 2001:910:1090:2::1.

Exemple avec une machine non compatible IP v6 :

host www.aeriesguard.com

www.aeriesguard.com is an alias for aeriesguard.com.
aeriesguard.com has address 78.41.233.87
aeriesguard.com mail is handled by 30 mx2.celeonet.com.
aeriesguard.com mail is handled by 25 mx3-cl.celeonet.fr.

La commande nous répond que www.aeriesguard.com est un surnom du serveur aeriesguard.com et que l'adresse IP v4 ce celui-ci est 78.41.233.87.

Les autres lignes indiquent quels sont les serveurs de messagerie utilisés par le domaine aeriesguard.com, rien ne concerne une quelconque compatibilité IP v6. icon_frown

Ertaï, il va falloir arranger ça ! icon_lol

Bonus

Merci à Ertaï pour les corrections.

Sauvegarder automatiquement ses bases MySQL

Sauvegarder automatiquement ses bases MySQL

Les sauvegardes de base de données ne sont pas toujours simple à effectuer, voici un petit script qui vous mâchera le travail.

S'il est possible de sauvegarder les bases de données de MySQL en se contentant de copier les fichiers contenant les bases, cette méthode est crado et peut se solder par un échec cuisant.
Il est largement recommandé d'utiliser l'utilitaire mysqldump pour cette tâche, cependant, l'utiliser manuellement pour sauvegarder les bases de données une à une n'est pas agréable, un oubli ou une mauvaise manipulation est vite arrivée.

Voici donc un petit script à utiliser avec cron pour sauvegarder toutes vos bases de données MySQL automatiquement.

A modifier selon votre convenance, attention, les droits de root sont nécessaires.

La présence du mot de passe root de MySQL dans ce fichier demande de mettre les droits les plus restrictifs possible.

#! /bin/sh -e

################################################################################
#                                                                              #
# LICENCE                                                                      #
#                                                                              #
# This program is free software: you can redistribute it and/or modify it      #
# under the terms of the GNU General Public License as published by the Free   #
# Software Foundation, either version 3 of the License, or (at your option)    #
# any later version.                                                           #
#                                                                              #
# This program is distributed in the hope that it will be useful, but WITHOUT  #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for     #
# more details.                                                                #
#                                                                              #
# You should have received a copy of the GNU General Public License along with #
# this program.  If not, see <http://www.gnu.org/licenses/>.                   #
#                                                                              #
################################################################################

################################################################################
#                                                                              #
# DESCRIPTION                                                                  #
#                                                                              #
# Ce script sauvegarde automatiquement les bases de données MySQL/MariaDB en   #
# utilisant la sauvegarde par base.                                            #
#                                                                              #
#                                                                              #
# VARIABLES                                                                    #
#                                                                              #
# - DATE : Date du jour, utilisé pour le dossier de sauvegarde des bases de    #
#   données à sauvegarder.                                                     #
# - MYSQLROOT : Nom de l'administrateur du système de gestion de bases de      #
#   données, root par défaut.                                                  #
# - MYSQLPASSWD : Mot de passe de l'administrateur du système de gestion de    #
#   base de données.                                                           #
# - BACKUP_DIR : Emplacement du répertoire de base pour les sauvegarde, un     #
#   sous-répertoire portant pour nom la variable date sera crée pour contenir  #
#   les sauvegarde du jour.                                                    #
# - LOG_FILE : Fichier utilisé pour la journalisation.                         #
# - LOG_FILE_DATE : Date de journalisation.                                    #
# - RETENTION : Temps de rétention des sauvegardes.                            #
# - MYSQLDUMP_OPTS : Options utilisées par la commande mysqldump.              #
#                                                                              #
#                                                                              #
# FONCTIONS                                                                    #
#                                                                              #
# - logDate() : Ajoute la date aux messages de journalisation.                 #
# - createLog() : Créer un fichier de journalisation et lui donne les droits   #
#   corrects s'il n'existe pas.                                                #
# - createBackupDir() : Vérifie l'existance du répertoire utilisé par les      #
#   sauvegardes du jour, le crée et lui donne les authorisations correctes le  #
#   cas échéant. Voir les variables BACKUP_DIR et DATE.                        #
#   Quitte et retourne l'état de sortie 1 si le dossier n'existe pas et ne     #
#   peut être crée.                                                            #
# - backupPurge() : Utilise la commande tmpreaper pour suprimmer dans le       #
#   dossier de base des sauvegardes -tel que défini par la variable            #
#   BACKUP_DIR- celles dont l'âge est supérieur à celui défini dans la         #
#   variable RETENTION.                                                        #
#   Quitte et retourne l'état de sortie 2 si les sauvegardes les plus          #
#   anciennes ne peuvent être supprimées.                                      #
# - listDB() : Cette fonction liste les bases de données présentes avec la     #
#   commande mysql pour lister les bases de données présentent dans le système #
#   de base de données que l'on souhaite sauvegarder.                          #
#   Quitte et retourne l'état de sortie 3 si les bases de données ne peuvent   #
#   êtres listées                                                              #
#   Quitte et retourne l'état de sortie 4 si aucunes bases de données          #
#   n'existe.                                                                  #
# - backupDB() : Supprime les sauvegardes présente dans le dossier du jour     #
#   s'ils en existes puis utilise mysql afin de sauvegarder les bases de       #
#   données du système de gestion de base de données que l'on souhaite         #
#   sauvegarder.                                                               #
#   Il est possible de spécifier des options à la commande de sauvegarde via   #
#   la variables MYSQLDUMP_OPTS.                                               #
#   Quitte est retourne l'état de sortie 5 si une erreur se produit lors des   #
#   sauvegardes.                                                               #
# - backupCheck() : Cette fonction effectue un test afin de savoir si les      #
#   sauvegardes se sont bien déroulées. Elle vérifie via la commande find      #
#   couplé à la commande wc -l la présence de fichier dans le répertoire de    #
#   sauvegarde du jour, si le résultat de cette commande est est plus grand    #
#   que 0, elle utilise la commande du -ks si la taille totales des fichiers   #
#   sauvegardé est supérieur à quatre kibi-octects, 4 kio étant la taille d'un #
#   dossier vide ou contenant des fichiers de taille nulle.                    #
#   Quitte et retourne l'état de sortie 6 si aucune sauvegarde n'a put être    #
#   effectuée ou si la taille des sauvegardes est nulle.                       #
#                                                                              #
#                                                                              #
# AUTEUR(S)                                                                    #
#                                                                              #
# - Collyer Cédric <collyer.cedric@zergy.net>                                  #
#                                                                              #
#                                                                              #
# DERNIER(S) CHANGEMENT(S) :                                                   #
#                                                                              #
# - 23/10/2010 : Création du script et écriture de la documentation.           #
# - 21/02/2011 : Ajout de la suppression des répertoires vides dans la         #
#   fonction BackupPurge().                                                    #
# - 24/10/2011 : Abandon du GZ, compression des dump en XZ.                    #
# - 25/10/2011 : Mise au format ISO.                                           #
#                                                                              #
################################################################################

# Initialisation de variables
DATE="$(date '+%Y%m%d')";
MYSQLROOT="root";
MYSQLPASSWD="XXXXXXXX";

BACKUP_DIR="/home/shares/sauvegardes/MySQL";
LOG_FILE="/var/log/mysql-dump.log";
RETENTION="7d";

SHELL="/bin/sh";
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin";

MYSQLDUMP_OPTS="--routines --skip-lock-tables --events";

# Routine d'horodatage des logs
logDate() {
        LOG_FILE_DATE="$(date +'%d/%m/%Y %H:%M')";
}

# Mise en place des journaux.
createLog () {
        if [ ! -f "$LOG_FILE" ]; then
                touch "$LOG_FILE";
                chown mysql "$LOG_FILE";
                chgrp adm "$LOG_FILE";
                chmod 640 "$LOG_FILE";
        fi
}

# Mise en place des répertoires.
createBackupDir () {
        if [ ! -d "$BACKUP_DIR/$DATE" ]; then
                mkdir -p "$BACKUP_DIR/$DATE";
                if [ $? != 0 ]; then
                        logDate;
                        echo "$LOG_FILE_DATE : Impossible de créer le dossier \
de sauvegarde." >> "$LOG_FILE";
                        exit 1;
                fi
                chown root "$BACKUP_DIR/$DATE";
                chgrp staff "$BACKUP_DIR/$DATE";
                chmod 770 "$BACKUP_DIR/$DATE";
        fi
}

# Purge des ancienne sauvegardes.
# Utilisation TMPReaper pour supprimer les sauvegardes vielles de plus de 8
# jours (cf $RETENTION pour changer)
backupPurge() {
        tmpreaper "$RETENTION" "$BACKUP_DIR";
        if [ $? != "0" ]; then
                logDate;
                echo "$LOG_FILE_DATE : Impossible de purger les anciennes \
sauvegardes." >> "$LOG_FILE";
                exit 2;
        fi
        for olddir in $(ls "$BACKUP_DIR"); do
                if [ "$(du -ks $BACKUP_DIR/$olddir | awk {'print $1'})" -eq 4 ]
                then
                        rmdir "$BACKUP_DIR/$olddir";
                fi
        done
}

# Listage des bases de données.
listDB() {
        BASE_LIST="$(mysql --user=$MYSQLROOT --password=$MYSQLPASSWD \
--batch --skip-column-names --execute='SHOW DATABASES;')";
        if [ $? != "0" ]; then
                logDate;
                echo "$LOG_FILE_DATE : Erreur dans la commande de sauvegarde." \
>> "$LOG_FILE";
                exit 3;
        fi
        if [ "$BASE_LIST" = "" ]; then
                logDate;
                echo "$LOG_FILE_DATE : Aucune base présente." >> "$LOG_FILE";
                exit 4;
        fi
}

# Sauvegarde des BDD.
backupDB() {
        for db in $BASE_LIST; do
                if [ -f "$BACKUP_DIR/$DATE/$db.sql.xz" ]; then
                        rm -f "$BACKUP_DIR/$DATE/$db.sql.xz";
                fi
                mysqldump $MYSQLDUMP_OPTS --user="$MYSQLROOT" \
--password="$MYSQLPASSWD" "$db" 2>> "$LOG_FILE" | xz -c\
> "$BACKUP_DIR/$DATE/$db.sql.xz";
                if [ $? -ne "0" ]; then
                        logDate;
                        echo "$LOG_FILE_DATE : Attention erreur dans les \
sauvegardes."  >> "$LOG_FILE";
                        exit 5;
                fi
                chown root "$BACKUP_DIR/$DATE/$db.sql.xz";
                chgrp staff "$BACKUP_DIR/$DATE/$db.sql.xz";
                chmod 660 "$BACKUP_DIR/$DATE/$db.sql.xz";
        done
}

# Vérificarion des sauvegardes.
backupCheck() {
        if [ "$(find $BACKUP_DIR/$DATE -type f | wc -l)" -gt 0 -a \
"$(du -ks $BACKUP_DIR/$DATE | awk {'print $1'})" -gt 4 ]; then
                logDate;
                echo "$LOG_FILE_DATE : Sauvegarde des bases terminé avec \
succés." >> "$LOG_FILE";
        else
                logDate;
                echo "$LOG_FILE_DATE : Aucune base sauvegardées ou leur taille \
est de zéro." >> "$LOG_FILE";
                exit 6;
        fi
}

main() {
        createLog;
        createBackupDir;
        listDB;
        backupDB;
        backupCheck;
        backupPurge;
}

main;

exit 0;

© Copyright 2002-2012 Aeriesguard.com - Mentions légales
Aerie's Guard V 7.0
réalisé par Ertaï, designé par Ivaldir, illustré par Izual et Sophie Masure
Famfamfam