Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/12/2011, 20h45   #1
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
Par défaut Problème de variable lors de l'appel d'un fichier sql

Bonjour à tous,

Voilà un petit problème à vous soumettre :

J'ai un fichier sql, contenant une requête qui devra être appelée par plusieurs shells.

Cette requête contient des variables.

Ex: select * from table where champ = $var

Dans les shells, je dois "envoyer" cette requête dans un pipe, puis l'exécuter.

Le problème est que je n'arrive pas à remplacer les variables par leur valeur, déclarée dans le shell avant d'envoyer la requête dans le pipe.

J'espère que vous pourrez m'aider

Merci d'avance,

Nicolas
eomer est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/12/2011, 22h10   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
probablement en faisant un truc du genre :
Code :
echo "commande sql "$valeur" where ..... "$variable" ; " | interpreteurSQL
exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ unset toto ; unset titi
$ toto=20
$ titi=gazoil
$ echo "select * from "$titi" where ref >= "$toto" ; " | mysql -u francois -p perso -h undertaker
Enter password: 
ref     date            prix    km
20      2011-07-03      39.83   564
21      2011-08-01      56.26   716
22      2011-08-27      54.85   722
23      2011-09-17      46.7    581
24      2011-10-09      55.4    708
25      2011-11-01      58.47   718
26      2011-11-29      57.74   691
$ 
$ 
$ unset toto ; unset titi
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 22h32   #3
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
Ça c'est exactement ce que je faisais avant. Mais là, j'essaie de séparer la requête et le Shell.

Fichier.sql
Fichier.sh

Comment :
1. Déclarer les variables
2. Appeller le fichier sql pour que les variables dans la requête soient bien remplacées par leur valeur.

J'espère que c'est plus clair
eomer est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 09/12/2011, 23h24   #4
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
En gros :

fichier.sql

Code :
1
2
 
select ch1, ch2, ch3 from $table where champ1 = $champ
fichier.sh

Code :
1
2
3
4
5
 
table=personnes
champ=Paul
 
. fichier.sql | mysql  -u francois -p perso -h undertaker
eomer est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/12/2011, 04h20   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Le contenu des fichiers lus n'est pas sujet au développement des variables. Désolé.

une solution : utiliser un fichier patron, le modifier avec sed, avec les variables ad'hoc, vers un fichier temporaire, et utiliser ce fichier temporaire, ou utiliser la sortie de sed
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/12/2011, 07h12   #6
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
Arf! Il me semblait bien que ce n'était pas si simple...

Pour vous donner une idée du contexte, j'ai plusieurs shells différents qui doivent tourner sur des DB différentes mais de même structure, mais qui doivent exécuter la même requête à un moment ou l'autre, avec des variables différentes. Les shells sont sujets à modification, la requête aussi, mais je n'ai pas envie de devoir éditer une dizaine de shells à chaque fois que la requête change...L'idée d'avoir un fichier sql séparé, c'est surtout pour pouvoir éditer la requête dans un éditeur adhoc avec un highlight correct de la syntaxe.

Et si je fais quelque chose comme ceci, puisque si je ne me trompe, si on appelle un shell et non un fichier txt ou sql, les variables passent...

fichier01.sql
Code :
1
2
 
 select ch1, ch2, ch3 from $table where champ1 = $champ
fichierquer.sh
Code :
1
2
3
4
5
6
7
 
QUER()
{
echo "echo""
. fichier$sql.sql
echo """
}
monshell.sh
Code :
1
2
3
4
5
6
 
export sql=01
export table=personnes
export champ=Paul
. fichierquer.sh 
QUER | mysql  -u francois -p perso -h undertaker
Une autre idée serait de commenter le la partie echo " dans le fichier sql, puis de renommer le fichier sql en sh et retirer les caractères de commentaire, inclure le fichier sh puis le buter. Faisable?

Merci d'avance,

-N
eomer est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/12/2011, 10h43   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
tu ne peux pas sourcer un fichier de commandes sql dans un interpréteur de commandes : il ne va pas comprendre le contenu du fichier tel qu'il le devrait être.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2011, 20h50   #8
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
Damned! Je suis donc fait comme un rat...

Il ne me reste plus qu'à faire des .sh contenant les requêtes... Mais j'avoue que ça ne me plait pas des masses

Et si je crée un shell qui construit un shell temporaire contenant la requête, puis qui l'efface après que je l'ai appelé dans mon shell d'origine?
eomer est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 06h26   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
utilise une fonction :
Code :
1
2
3
4
5
6
maBelleFonctionSQL() {
   sql="$1"
   table="$2"
   champ="$3"
   mysql  -u francois -p perso -h undertaker -e "select ch1, ch2, ch3 from $table where champ1 = $champ"
}
et plus loin :
Code :
maBelleFonctionSQL 01 personnes Paul
sachant que les arguments passés ici à la fonction peuvent être des paramètres positionnels du script…
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 15h42   #10
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par N_BaH Voir le message
utilise une fonction :
Code :
1
2
3
4
5
6
maBelleFonctionSQL() {
   sql="$1"
   table="$2"
   champ="$3"
   mysql  -u francois -p perso -h undertaker -e "select ch1, ch2, ch3 from $table where champ1 = $champ"
}
Salut

J'ai pas tout lu en détail (peut-être aurais-je du) mais à quoi sert la variable "sql" de ta fonction ???

Ou plus simple: pourquoi copier des variables dans d'autres ???

Code :
1
2
3
maBelleFonctionSQL() {
   mysql  -u francois -p perso -h undertaker -e "select ch1, ch2, ch3 from $2 where champ1 = $3"
}
Je ne demanderai pas pourquoi écrire une fonction qui ne fait qu'une ligne plutôt que d'appeler direct la ligne mais je t'assure que j'en ai très envie...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 16h08   #11
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Citation:
à quoi sert la variable "sql"
aucune idée. Je reprend les termes de la question.
Citation:
pourquoi copier des variables dans d'autres ?
pour montrer ce qui se passe; ce n'est évidemment pas nécessaire.
Citation:
pourquoi écrire une fonction qui ne fait qu'une ligne plutôt que d'appeler direct la ligne
parce que, à ce que j'ai compris (eomer n'est pas très clair), la commande doit être appelée avec différents arguments.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 18h43   #12
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
Je vais essayer de clarifier alors

J'ai :
- 10 bases de données
- une vingtaine de shells
- une vingtaine de requêtes

Plusieurs shells différents peuvent appeler les mêmes requêtes, ou inversement un shell peut utiliser plusieurs requêtes différentes en fonction de ce que j'ai besoin de faire.

L'idée, pour "simplifier" et organiser tout ça, est de séparer les requêtes des shells, histoire de ne pas finir avec plusieurs centaines de shells, et de pouvoir faire un changement éventuel à un seul emplacement, dans un seul fichier.

Un dossier contenant les shells, et un contenant les requêtes. La difficulté vient de ce que j'aimerais avoir les requêtes dans des fichiers blabla.sql (extension qui me permet de les modifier dans un éditeur ad hoc, avec un highlight de la syntaxe. Ces requêtes sont relativement longues (jusqu'à une dizaine de join en tout genre, et au moins autant de variables).

Comment dans un shell, appeler un fichier sql, et exécuter la requête tout en ayant remplacé les variables par leur valeur...

J'espère que c'est plus clair

Je n'ai aucun problème par contre, à passer par un shell intermédiaire qui transformerait le fichier sql en fichier sh par exemple.

Dans les posts plus haut, la variable $sql servait à identifier le bon fichier sql
eomer est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 20h31   #13
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par eomer Voir le message
Je vais essayer de clarifier alors

J'ai :
- 10 bases de données
- une vingtaine de shells
- une vingtaine de requêtes

Plusieurs shells différents peuvent appeler les mêmes requêtes, ou inversement un shell peut utiliser plusieurs requêtes différentes en fonction de ce que j'ai besoin de faire.

L'idée, pour "simplifier" et organiser tout ça, est de séparer les requêtes des shells, histoire de ne pas finir avec plusieurs centaines de shells, et de pouvoir faire un changement éventuel à un seul emplacement, dans un seul fichier.

Un dossier contenant les shells, et un contenant les requêtes. La difficulté vient de ce que j'aimerais avoir les requêtes dans des fichiers blabla.sql (extension qui me permet de les modifier dans un éditeur ad hoc, avec un highlight de la syntaxe. Ces requêtes sont relativement longues (jusqu'à une dizaine de join en tout genre, et au moins autant de variables).

Comment dans un shell, appeler un fichier sql, et exécuter la requête tout en ayant remplacé les variables par leur valeur...

J'espère que c'est plus clair

Je n'ai aucun problème par contre, à passer par un shell intermédiaire qui transformerait le fichier sql en fichier sh par exemple.

Mouais. En fait tu cherches à séparer les choses. Un peu comme en MVC...

Bon, à la base, il n'y a rien qui t'interdise de donner une extension ".sql" à un script shell. C'est pas super propre mais c'est permis. Ca pourrait donc te simplifier certaines choses. Tu pourrais par exemple intégrer la fonction de N_BaH dans tes scripts "sql" que tu appellerais depuis ton shell. Ou mieux, tu peux écrire tes fonctions shells dans des scripts ".sql" que tu sourceras dans tes scripts shells. Ainsi ces derniers connaitront lesdites fonctions qu'ils pourront appeler.
Exemple
toto.sql
Code bash :
1
2
3
4
5
6
maBelleFonctionSQL() {
   sql="$1"
   table="$2"
   champ="$3"
   mysql  -u francois -p perso -h undertaker -e "select ch1, ch2, ch3 from $table where champ1 = $champ"
}

script_principal.sh
Code bash :
1
2
3
 
source toto.sql
maBelleFonctionSQL 01 personnes Paul

Toutefois cela reste pas super propre. Un ".sql" étant sensé contenir une requête et non un script.

Autre possibilité: envoyer directement tes fichiers sql dans mysql. Après-tout, mysql attend une requête. Que cette requête vienne d'un echo ou d'un fichier, quelle importance ???
Exemple:
toto.sql
Code bash :
select ch1, ch2, ch3 from table where champ1 = valeur;

script.sh
Code bash :
cat toto.sql |mysql -u francois -p perso -h undertaker

Citation:
Envoyé par eomer Voir le message
Dans les posts plus haut, la variable $sql servait à identifier le bon fichier sql
Ouais. Bon ben avec mon exemple cela devient presque inutile. Enfin l'important est d'arriver à construire l'idée. Ensuite, que tu la traduises par des strings en dur ou par des variables...

Toutefois je ne vois pas trop comment créer des sql avec des variables. Tu parles d'éditeur highligh donc je présume qu'il s'agit d'un éditeur sql. Donc qui demande une syntaxe sql. Et dans ce genre de syntaxe, il n'y a pas de place pour des variables...
Ou alors tu écris ton propre interpréteur.
1) des fichiers sql écrits dans une syntaxe propriétaire intégrant la notion de variable
Exemple
toto.sql
Code bash :
select %1 from %2 where %3

2) un programme chargé de convertir le sql propriétaire en sql standard
Code bash :
traducteur.sh toto.sql "ch1, ch2, ch3" "table" "champ1 = valeur" |mysql -u francois -p perso -h undertaker
Le programme "traducteur.sh" étant de ton fait et prenant en compte toto.sql "ch1, ch2, ch3" "table" "champ1 = valeur" pour générer la string
"select ch1, ch2, ch3 from table where champ1 = valeur;". Toutefois, pour ce travail, je conseillerais un langage un poil plus puissant que le shell (comme par exemple Python)...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 23h16   #14
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 47
Points : 39
Points : 39
Question bête mais je ne vois pas la précision qui me semble primordiale pour le pb en question...
C'est une base de quel éditeur ?
Oracle ?
DB2 ?
SQLServer ?
etc...

Il y a bien des réponses avec MySql mais le propriétaire du post ne mentionne rien à ce sujet...

Autant avec Oracle et du shell Unix/Linux je le fais sans pb autant en DB2 il me semble que ce n'est pas possible, ou alors en générant un fichier sql dynamiquement via le shell...
Cordialement
2beornot2be est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/12/2011, 23h42   #15
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
C'est une base Sybase IQ

Mais personnellement, je ne pense pas que cela change grand chose... Le noeud du problème c'est de savoir comment je pourrais appeler un fichier sql dans un shell, tout en lui passant les variables avant de l'exécuter.

Je remets les mains dedans demain matin... et je vais tester deux ou trois trucs
eomer est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/12/2011, 11h56   #16
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Un script sql avec des parametre identifiable ex : ==P1== ==P2== ...
et un petit sed ,awk ou autre pour traduire avant le pipe ...
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2011, 21h05   #17
Nouveau Membre du Club
 
Inscription : août 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 47
Points : 39
Points : 39
Oui en gros mon "sql dynamique" généré via un script

@eomer: si il y a une importance, sous DB2 il est possible de lancer un .sql mais pas de lui passer un paramètre me semble t-il, j'ai cherché pas mal de temps sans trouver sur un projet pour me rabattre sur du sql dynamiquement généré.
Sous Oracle je le fais couramment et Sybase je ne connais pas...

Au passage je viens de voir qu'il était possible de placer "d'accord" / "pas d'accord" mais au minimum pour faire avancer le "chmilblique" ceux qui placent des "pas d'accord" donnez vos solutions! C'est un forum d'entraide ou je me suis gouré ???
2beornot2be est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 13/12/2011, 10h55   #18
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
+1 , d'accord avec toi, les votes devraient etre publiquement nominatifs ( ils le sont "secretement" déjà puisqu'on peut ensuite changer de vote ... )
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2011, 11h42   #19
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
faudrait surtout qu'il soit justifiés par un petit texte genre 100 caractères ... pour pouvoir "voter" en justifiant par "inapproprié/hors sujet/faux/super idée/parfait/merci/etc...etc..."
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2011, 18h20   #20
Candidat au titre de Membre du Club
 
Nicolas Nicolas Haegelsteen
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Nicolas Nicolas Haegelsteen

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 11
Points : 11
Bon, je n'avais pas abandonné le sujet... mais je cherchais.
Pour le moment, j'ai trouvé une solution qui me satisfait, mais qui me parait tellement simple que j'ai la vague impression de m'être mal exprimé en posant ma question...

shell principal : test.sh
Code :
1
2
3
4
5
 
var=valeurA
sql.sh sql
wait
. runq.sh>quer.txt
shell intermédiaire :sql.sh
Code :
1
2
3
4
 
echo 'echo "'>runq.sh
cat $1.sql>>runq.sh
echo '"'>>runq.sh
le fichier sql : sql.sql
Code :
1
2
 
select * from table where pi=$var
résultat : quer.txt
Code :
1
2
 
select * from table where pi=valeurA
Voilà...

@2beornot2be: Par contre, je suis très intéressé par ton sql dynamique. Y'a un exemple, tuto, post là dessus?
eomer est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h24.


 
 
 
 
Partenaires

Hébergement Web