Vous êtes ici : Accueil > Administration réseaux > Asterisk + LDAP
Asterisk + LDAP
Dans cet article, nous allons détailler l'installation et la configuration d'un serveur Asterisk couplé à un serveur LDAP. Cette méthode permet au serveur Asterisk de stocker les informations relatives aux utilisateur (SIP dans le cas de cet article) ainsi que le dialplan dans un annuaire LDAP.
Pré-requis :
Avant toute chose, il faut avoir un serveur LDAP fonctionnel. pour ma part mon serveur LDAP est couplé à un Samba et à le rôle d'un PDC (un exemple de configuration est disponible sur le site ici : PDC Samba + LDAP).
La racine de l'annuaire LDAP est dc=domain,dc=local
L'admin de l'annuaire est cn=admin,dc=domain,dc=local
Ce guide a été réalisé sur une Debian Lenny.
Notes :
Dans cet article, je vous montre qu'il est possible de mettre aussi les extensions dans l'annuaire LDAP mais personnellement, je préfère laisser la configuration dans le fichier d'origine (/etc/asterisk/extensions.conf). Je trouve cela plus lisible et en cas de soucis beaucoup plus pratique... C'est donc à vous de voir !
Installation d'Asterisk :
Avant toute chose, il faut récupérer la dernière version d'Asterisk (1.6.2.10 à l'écriture de cet article) disponible ici. Il faut ensuite décompresser l'archive téléchargée :
# tar xvzf asterisk-1.6.2.10.tar.gz
Rendons nous ensuite dans le dossier créé :
# cd asterisk-1.6.2.10
Notes :
La dernière version est à l'heure actuelle la version 1.8.2.1 disponible ici. Il suffit alors dans les deux étapes décrites précédemment de remplacer par le bon numéro de version. La configuration suivante de ne change pas par rapport à l'ancienne version.
Il faut ensuite installer les dépendances requises pour la compilation d'Asterisk :
# apt-get install gcc g++ make libncurses5-dev
Nous allons ensuite compiler asterisk :
Préparation à la compilation :
# ./configure
Ajout du module LDAP pour Asterisk et téléchargements des voix françaises :
# make menuconfig
Compilation :
# make
Installation :
# make install
Installation des exemples de fichiers de configuration :
# make sample
Configuration d'Asterisk :
Schéma LDAP :
Avant toute chose, nous allons indiquer à notre LDAP les variables à prendre en compte pour Asterisk. Ceci se passe dans un schéma disponible ici. Copier l'ensemble de ce fichier dans le fichier asterisk.schema que vous placerez dans le répertoire /etc/ldap/schema.
Il faut ensuite indiquer à LDAP de prendre en compte ce schéma. Pour cela, il faut modifier le fichier de configuration /etc/ldap/slapd.conf comme ceci :
include /etc/ldap/schema/asterisk.schema
Pour que cette modification soit prises en compte, il faut relancer le serveur LDAP :
# /etc/init.d/slapd restart
Configuration de l'annuaire LDAP :
Afin de stocker les paramètres des comptes SIP de l'Asterisk, il faut que nous ayons un endroit ou les stockés. Nous pouvons les stocker à l'endroit ou le PDC Samba + LDAP stocke les utilisateurs mais pour ma part, j'ai décidé de séparer ces deux informations par soucis de lisibilité. J'ai donc choisi de créer une OU (Organizational Unit) dédiée à Asterisk. J'ai donc créer une OU Asterisk et avec deux "sous-OU" users et extensions. Vous pouvez ajouter cette configuration comme cela :
tout d'abord créez un fichier LDIF contenant ceci :
#OU asterisk dn: ou=asterisk,dc=domain,dc=local objectClass: top objectClass: organizationalUnit ou: asterisk # OU users dn: ou=users,ou=asterisk,dc=domain,dc=local objectClass: top objectClass: organizationalUnit ou: users # OU extensions dn: ou=extensions,ou=asterisk,dc=domain,dc=local objectClass: top objectClass: organizationalUnit ou: extensions
Il faut ensuite ajouter ce fichier LDIF à notre arborescence LDAP, pour cela il faut utiliser la commande ldapadd :
# ldapadd -x -D "cn=admin,dc=domain,dc=local" -W -f chemindevotreldif
- -x : permet d'utiliser une authentification simple (en opposition à l'authentiification SASL)
- -D : permet de se connecter avec l'utilisateur indiqué (ici cn=admin,dc=domain,dc=local)
- -W : permet de ne pas rentrer le mot de passe de l'admin LDAP dans la commande
- -f : permet de spécifier un fichier LDIF à ajouter à l'annuaire LDAP
Connexion au serveur LDAP :
La configuration de la connexion entre le serveur Asterisk et le serveur LDAP se déroule dans le fichier /etc/asterisk/res_ldap.conf. La configuration se déroule en plusieurs parties. Tout d'abord, il y a une partie générale qui contient les paramètres de connexions au serveur LDAP puis vient la partie contenant les paramètres des utilisateurs SIP stockés dans l'annuaire LDAP :
[_general] host=127.0.0.1 port=389 protocol=3 basedn=ou=asterisk,dc=domain,dc=local pass=votremotdepasseadminLDAP user=cn=admin,dc=domain,dc=local [sip] name = uid callerid = AstAccountCallerID canreinvite = AstAccountCanReinvite context = AstAccountContext host = AstAccountHost type = AstAccountType mailbox = AstAccountMailbox md5secret = AstAccountRealmedPassword fullcontact = AstAccountFullContact nat = AstAccountNAT qualify = AstAccountQualify allow = AstAccountAllowedCodec useragent = AstAccountUserAgent lastms = AstAccountLastQualifyMilliseconds additionalFilter=(objectClass=AsteriskSIPUser) [extensions] context = AstContext exten = AstExtension priority = AstPriority app = AstApplication appdata = AstApplicationData additionalFilter=(objectClass=AsteriskExtension)
Comme vous pouvez le voir la section [sip] permet de faire la translation entre les variables Asterisk et les variables LDAP afin que les deux serveur puissent se "comprendre". Il en est de même pour la partie [extensions].
Une fois que nous avons définit la connexion entre le serveur Asterisk et le serveur LDAP, il faut dire à Asterisk où il doit aller chercher les paramètres des utilisateurs SIP. Pour cela, il faut modifier le fichier /etc/asterisk/extconfig.conf comme ceci :
sipusers => ldap,"ou=users,ou=asterisk,dc=domain,dc=local",sip sippeers => ldap,"ou=users,ou=asterisk,dc=domain,dc=local",sip extensions => ldap,"ou=extensions,ou=asterisk,dc=domain,dc=local",extensions
Configuration générale des comptes SIP :
La configuration générale des comptes SIP se passe comme lors d'une configuration normale, c'est à dire dans le fichier /etc/asterisk/sip.conf :
[general] rtcachefriends=yes callevents=yes realm=domain.local
- rtcachefriends=yes //permet de mettre en cache les infos des utilisateurs (obligatoire car elle permet de garder en mémoire l'adresse IP avec laquelle l'utilisateur s'est connecté. Sans ce paramètre l'appel n'aboutira pas car l'Asterisk ne saura pas trouver les utilisateurs.
- callevents=yes //permet de remonter les informations concernant un appel
- realm=domain.local //nom de domaine géré par l'annuaire LDAP
Configuration générale du dialplan :
La configuration générale du diaplan s'effectue dans le fichier /etc/asterisk/extensions.conf. Il faut rajouter cette ligne à au context concerné (ici internal) pour qu'il aille chercher ses informations dans l'annuaire LDAP :
[internal] switch => Realtime/@
Vérification de la connexion au LDAP :
Avant toute chose, il faut recharger la configuration afin que les modifications que l'on a apporté soient prises en compte. Pour cela, il faut se connecter au CLI d'Asterisk :
# asterisk -vvvvvvvvvvvvvvvvvvvvvr
Mettre plusieurs v dans la commande permet d'augmenter le niveau de debug.
Normalement, vous devriez voir apparaître ces lignes dans le CLI :
== Parsing '/etc/asterisk/asterisk.conf': == Found == Parsing '/etc/asterisk/extconfig.conf': == Found == Binding sipusers to ldap/ou=users,ou=asterisk,dc=domain,dc=local/sip == Binding sippeers to ldap/ou=users,ou=asterisk,dc=domain,dc=local/sip == Binding extensions to ldap/ou=extensions,ou=asterisk,dc=domain,dc=local/extensions
Il faut ensuite taper les commandes suivantes dans le CLI:
srv-ced*CLI> module reload
Cette commande permet de recharger tous les modules qu'Asterisk à charger notamment le module LDAP.
Puis nous rechargeons le fichier sip.conf :
srv-ced*CLI> sip reload
Nous rechargeons ensuite le fichier extensions.conf:
srv-ced*CLI> dialplan reload
La commande realtime show ldap status permet de connaître l'état de la connexion entre le serveur Asterisk et le serveur LDAP.
srv-ced*CLI> realtime show ldap status Connected to 'ldap://127.0.0.1:389', baseDN ou=asterisk,dc=domain,dc=local with username cn=admin,dc=domain,dc=local for 3 days, 16 hours, 2 minutes, 54 seconds.
Ajout des utilisateurs :
Maintenant que nos deux serveurs communiquent correctement ensemble, nous pouvons ajouter les utilisateurs dans notre annuaire LDAP. Cette opération peut vite être fastidieuse donc je me suis fait un petit script qui fait tout (ou presque pour moi) 🙂 . Le voici :
#!/bin/sh ####################### # Ajout user LDAP + Asterisk # # # # ced-info.com 10/08/2010 # ####################### #Ajout de l'user dans Asterisk #création du fichier temp pour le ldif mkdir -p ~/tmp touch ~/tmp/user.ldif ldif=~/tmp/user.ldif #Ajout de l'user echo "Entrez le nom du nouvel utilisateur :" read user echo "Quel numéro voulez vous attribuer pour $user ?" read num echo "Mot de passe Asterisk pour $user :" #on désactive l'affichage pour ne pas voir le mot de passe stty -echo read pass #on réactive l'affichage stty echo echo "" #on crypte le mot de passe en md5 md5pwd=`echo -n "$user:domain.local:$pass" | md5sum | cut -c1-32` #On génère le ldif pour le user echo "dn:uid=$user,ou=users,ou=asterisk,dc=domain,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskSIPUser">>$ldif echo "cn: $user">>$ldif echo "sn: $user">>$ldif echo "uid: $user">>$ldif echo "AstAccountContext: internal">>$ldif echo "AstAccountCallerID: $user <$num>">>$ldif echo "AstAccountRealmedPassword: $md5pwd">>$ldif echo "AstAccountQualify: yes">>$ldif echo "AstAccountNAT: yes">>$ldif echo "AstAccountType: friend">>$ldif echo "AstAccountHost: dynamic">>$ldif echo "AstAccountMailbox: $num@default">>$ldif echo "AstAccountCanReinvite: yes">>$ldif echo "AstAccountAllowedCodec: alaw">>$ldif echo "AstAccountLastQualifyMilliseconds: 500">>$ldif #on génére le ldif pour le dialplan echo "dn:cn=$num-1,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-1">>$ldif echo "sn: $num-1">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 1">>$ldif echo "AstApplication: Answer">>$ldif echo "">>$ldif echo "dn:cn=$num-2,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-2">>$ldif echo "sn: $num-2">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 2">>$ldif echo "AstApplication: Dial">>$ldif echo "AstApplicationData: SIP/$user">>$ldif echo "">>$ldif echo "dn:cn=$num-3,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-3">>$ldif echo "sn: $num-3">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 3">>$ldif echo "AstApplication: Voicemail">>$ldif echo "AstApplicationData: $num@default">>$ldif echo "">>$ldif echo "dn:cn=$num-4,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-4">>$ldif echo "sn: $num-4">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 4">>$ldif echo "AstApplication: Hangup">>$ldif #on injecte le ldif dans le LDAP echo "Ajout de $user dans asterisk !" ldapadd -x -D "cn=admin,dc=domain,dc=local" -W -f $ldif #ajout de la boite vocale dans voicemail.conf voicemail=/etc/asterisk/voicemail.conf echo "$num => $num,$user">>$voicemail #on nettoie rm $ldif exit
Copiez l'intégralité de ce script dans un fichier (par exemple adduser.sh).
Rendez le fichier exécutable :
# chmod +x adduser.sh
Vous pouvez maintenant exécuter ce script et vous laisser guider 🙂
# ./adduser.sh
Test de la configuration :
Nous allons maintenant créer un utilisateur test. Lancez le script et répondez aux questions :
- nom de l'utilisateur : test
- numéro de l'utilisateur : 1000
- mot de passe : test
Une fois l'utilisateur créé, prenez votre softphone préféré (pour ma part j'ai utilisé twinkle sous ubuntu car il permet de gérer deux lignes : cela m'évite de créer plusieurs utilisateurs test) et paramétré le pour qu'il puisse se connecter à votre serveur Asterisk. Pour le mot passe, même si dans le script, il prend la forme (utilisateur:domain.local:motdepasse), c'est toujours celui que vous avez rentrez dans le script à savoir test !
Vérifiez dans le CLI que votre utilisateur s'enregistre bien :
srv-ced*CLI> -- Registered SIP 'test' at 192.168.1.10 port 5060 > Saved useragent "Twinkle/1.4.2" for peer test
Nous voyons que le client s'enregistre bien. Passons maintenant à l'appel :
srv-ced*CLI> == Using SIP RTP CoS mark 5 -- Executing Answer("SIP/test-00000053", "") -- Executing Dial("SIP/test-00000053", "SIP/test") == Using SIP RTP CoS mark 5 -- Called test -- SIP/test-00000054 is ringing -- SIP/test-00000056 answered SIP/test-00000055
Nous voyons que l'appel s'effectue correctement et que le correspondant décroche bien.
Notre configuration Asterisk + LDAP est désormais fonctionnelle. J'espère que cet article vous aura été utile et n'hésitez pas à laisser vos remarques :)!
ATTENTION : cette configuration ne prend en compte que l'utilisation d'un LDAP pour l'authentification des utilisateur SIP. Si vous utilisez déjà un Asterisk, veuillez rajouter ces paramètres sans écraser les anciens contenus dans votre fichier.
- rtcachefriends=yes //permet de mettre en cache les infos des utilisateurs (obligatoire car elle permet de garder en mémoire l'adresse IP avec laquelle l'utilisateur s'est connecté. Sans ce paramètre l'appel n'aboutira pas car l'Asterisk ne saura pas trouver les utilisateurs.
- callevents=yes //permet de remonter les informations concernant un appel
- realm=127.0.0.1 //adresse IP de l'annuaire LDAP
Configuration générale du dialplan :
La configuration générale du diaplan s'effectue dans le fichier /etc/asterisk/extensions.conf. Il faut rajouter cette ligne à au context concerné (ici internal) pour qu'il aille chercher ses informations dans l'annuaire LDAP :
[internal] switch => Realtime/@
Vérification de la connexion au LDAP :
Avant toute chose, il faut recharger la configuration afin que les modifications que l'on a apporté soient prises en compte. Pour cela, il faut se connecter au CLI d'Asterisk :
# asterisk -vvvvvvvvvvvvvvvvvvvvvr
Mettre plusieurs v dans la commande permet d'augmenter le niveau de debug.
Normalement, vous devriez voir apparaître ces lignes dans le CLI :
== Parsing '/etc/asterisk/asterisk.conf': == Found == Parsing '/etc/asterisk/extconfig.conf': == Found == Binding sipusers to ldap/ou=users,ou=asterisk,dc=domain,dc=local/sip == Binding sippeers to ldap/ou=users,ou=asterisk,dc=domain,dc=local/sip == Binding extensions to ldap/ou=extensions,ou=asterisk,dc=domain,dc=local/extensions
Il faut ensuite taper les commandes suivantes dans le CLI:
srv-ced*CLI> module reload
Cette commande permet de recharger tous les modules qu'Asterisk à charger notamment le module LDAP.
Puis nous rechargeons le fichier sip.conf :
srv-ced*CLI> sip reload
Nous rechargeons ensuite le fichier extensions.conf:
srv-ced*CLI> dialplan reload
La commande realtime show ldap status permet de connaître l'état de la connexion entre le serveur Asterisk et le serveur LDAP.
srv-ced*CLI> realtime show ldap status Connected to 'ldap://127.0.0.1:389', baseDN ou=asterisk,dc=domain,dc=local with username cn=admin,dc=domain,dc=local for 3 days, 16 hours, 2 minutes, 54 seconds.
Ajout des utilisateurs :
Maintenant que nos deux serveurs communiquent correctement ensemble, nous pouvons ajouter les utilisateurs dans notre annuaire LDAP. Cette opération peut vite être fastidieuse donc je me suis fait un petit script qui fait tout (ou presque pour moi) 🙂 . Le voici :
#!/bin/sh ####################### # Ajout user LDAP + Asterisk # # # # ced-info.com 10/08/2010 # ####################### #Ajout de l'user dans Asterisk #création du fichier temp pour le ldif mkdir -p ~/tmp touch ~/tmp/user.ldif ldif=~/tmp/user.ldif #Ajout de l'user echo "Entrez le nom du nouvel utilisateur :" read user echo "Quel numéro voulez vous attribuer pour $user ?" read num echo "Mot de passe Asterisk pour $user :" #on désactive l'affichage pour ne pas voir le mot de passe stty -echo read pass #on réactive l'affichage stty echo echo "" #on crypte le mot de passe en md5 md5pwd=`echo -n "$user:domain.local:$pass" | md5sum | cut -c1-32` #On génère le ldif pour le user echo "dn:uid=$user,ou=users,ou=asterisk,dc=domain,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskSIPUser">>$ldif echo "cn: $user">>$ldif echo "sn: $user">>$ldif echo "uid: $user">>$ldif echo "AstAccountContext: internal">>$ldif echo "AstAccountCallerID: $user <$num>">>$ldif echo "AstAccountRealmedPassword: $md5pwd">>$ldif echo "AstAccountQualify: yes">>$ldif echo "AstAccountNAT: yes">>$ldif echo "AstAccountType: friend">>$ldif echo "AstAccountHost: dynamic">>$ldif echo "AstAccountMailbox: $num@default">>$ldif echo "AstAccountCanReinvite: yes">>$ldif echo "AstAccountAllowedCodec: alaw">>$ldif echo "AstAccountLastQualifyMilliseconds: 500">>$ldif #on génére le ldif pour le dialplan echo "dn:cn=$num-1,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-1">>$ldif echo "sn: $num-1">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 1">>$ldif echo "AstApplication: Answer">>$ldif echo "">>$ldif echo "dn:cn=$num-2,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-2">>$ldif echo "sn: $num-2">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 2">>$ldif echo "AstApplication: Dial">>$ldif echo "AstApplicationData: SIP/$user">>$ldif echo "">>$ldif echo "dn:cn=$num-3,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-3">>$ldif echo "sn: $num-3">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 3">>$ldif echo "AstApplication: Voicemail">>$ldif echo "AstApplicationData: $num@default">>$ldif echo "">>$ldif echo "dn:cn=$num-4,ou=extensions,ou=asterisk,dc=ced-info,dc=local">>$ldif echo "objectClass: top">>$ldif echo "objectClass: inetOrgPerson">>$ldif echo "objectClass: AsteriskExtension">>$ldif echo "cn: $num-4">>$ldif echo "sn: $num-4">>$ldif echo "AstContext: internal">>$ldif echo "AstExtension: $num">>$ldif echo "AstPriority: 4">>$ldif echo "AstApplication: Hangup">>$ldif #on injecte le ldif dans le LDAP echo "Ajout de $user dans asterisk !" ldapadd -x -D "cn=admin,dc=domain,dc=local" -W -f $ldif #ajout de la boite vocale dans voicemail.conf voicemail=/etc/asterisk/voicemail.conf echo "$num => $num,$user">>$voicemail #on nettoie rm $ldif exit
Copiez l'intégralité de ce script dans un fichier (par exemple adduser.sh).
Rendez le fichier exécutable :
# chmod +x adduser.sh
Vous pouvez maintenant exécuter ce script et vous laisser guider 🙂
# ./adduser.sh
Test de la configuration :
Nous allons maintenant créer un utilisateur test. Lancez le script et répondez aux questions :
- nom de l'utilisateur : test
- numéro de l'utilisateur : 1000
- mot de passe : test
Une fois l'utilisateur créé, prenez votre softphone préféré (pour ma part j'ai utilisé twinkle sous ubuntu car il permet de gérer deux lignes : cela m'évite de créer plusieurs utilisateurs test) et paramétré le pour qu'il puisse se connecter à votre serveur Asterisk. Pour le mot passe, même si dans le script, il prend la forme (utilisateur:domain.local:motdepasse), c'est toujours celui que vous avez rentrez dans le script à savoir test !
Vérifiez dans le CLI que votre utilisateur s'enregistre bien :
srv-ced*CLI> -- Registered SIP 'test' at 192.168.1.10 port 5060 > Saved useragent "Twinkle/1.4.2" for peer test
Nous voyons que le client s'enregistre bien. Passons maintenant à l'appel :
srv-ced*CLI> == Using SIP RTP CoS mark 5 -- Executing Answer("SIP/test-00000053", "") -- Executing Dial("SIP/test-00000053", "SIP/test") == Using SIP RTP CoS mark 5 -- Called test -- SIP/test-00000054 is ringing -- SIP/test-00000056 answered SIP/test-00000055
Nous voyons que l'appel s'effectue correctement et que le correspondant décroche bien.
Notre configuration Asterisk + LDAP est désormais fonctionnelle. J'espère que cet article vous aura été utile et n'hésitez pas à laisser vos remarques :)!
Articles similaires
Espace utilisateur
-
Connexion
Pingback: Graduate programs at future university()
Pingback: خطابات توصية لجامعة المستقبل()
Pingback: https://shippingtousa.mystrikingly.com/()
Pingback: pharmaciesshipping.wordpress.com20230515canadian-pharmaceuticals-online-with-no-prescription()
Pingback: trommelforum.chforumprofilefranbervage()
Pingback: www.horreur.clubcommunityprofilecanadianpharmacy()
Pingback: essidi.cmcommunityprofilecanadianpharmacy()
Pingback: nicol.co.tzcommunityprofilecanadianpharmacy()
Pingback: https://abusetalk.co.uk/forum/profile/canadianpharmacy/()
Pingback: plclink.co.ukcommunityprofilecanadianpharmacy()
Pingback: https://warriorfarm.co.uk/community/profile/153413/()
Pingback: best canadian pharmacy()
Pingback: top rated online canadian pharmacies()
Pingback: https://www.careerstek.com/forum/profile/canadianpharmacy/()