Salut tout le monde.

Je suis en train de développer un petit script qui a pour but de mettre à jour un nom de domaine en fonction de l'ip dynamique attribuée à l'hôte, un « no-ip » quoi. Pour la mise à jour du nom de domaine automatique, il faut passer par une API, qui elle dépend du provider chez lequel le nom de domaine a été acheté.

J'ai donc eu l'idée de segmenter mon programme en module pour lui permettre de facilement pouvoir supporter d'autres providers. L'idée pour se faire, est d'utiliser un fichier de configuration de cette forme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
[no-ip]
domain_provider = gandi
ip_resolver = spyzone
 
[gandi]
api_key = xxxxxxxxxxxx
zone = xxxxxx
subdomain_name = xxxxx
L'idée est donc simple. La partie « no-ip » contient le nom des modules à utiliser pour gérer le nom de domaine ainsi que le site à interroger pour obtenir notre IP attribuée, et enfin, l'autre partie (ici « gandi » contient les informations nécessaire au bon fonctionnement du module de gestion du nom de domaine).

Voici la source du script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def listToDico(list_):
	dico_ = dict()
	for configLine in list_:
		dico_[configLine[0]] = configLine[1]
	if len(dico_) == 0:
		return None
	return dico_
 
import sys
import syslog
from configparser import SafeConfigParser
 
syslog.syslog(syslog.LOG_INFO, "Launching of the no-ip script.")
 
configParser = SafeConfigParser()
configParser.read("noip.conf")
 
# Generation of the configuration data.
providerToUse = configParser.get("no-ip", "domain_provider")
providerArgumentsInList = configParser.items(providerToUse)
providerArgumentsInDico = listToDico(providerArgumentsInList)
IPResolverToUse = configParser.get("no-ip", "ip_resolver")
 
# We dynamically import modules setted in the noip.conf.
locals()['urlManager'] = __import__("netsolver." + providerToUse)
locals()['IPManager'] = __import__("netsolver." + IPResolverToUse)
 
domainName = urlManager.gandi.GandiHostManager(providerArgumentsInDico)
ipUsedNow = IPManager.spyzone.SpyzoneManager.getMyExternalIp()
 
if (domainName.getCurrentIp() == ipUsedNow):
	syslog.syslog(syslog.LOG_DEBUG, "IP address still good. No need to update.")
else:
	domainName.setNewIp(ipUsedNow)
	syslog.syslog(syslog.LOG_INFO, "IP address updated with value: " + ipUsedNow)
 
sys.exit(0)
Aux lignes 25 et 26, nous chargeons dynamiquement les modules dont le nom est marqué dans la partie « no-ip » du fichier de configuration. Cette solution semble bonne car elle permet d'ajouter des modules sans avoir à toucher au script en lui même (il suffira d'ajouter son implémentation dans le dossier « netsolver »).

Par contre, mon problème se situe aux lignes 28 et 29 : comment pourrais-je faire en sorte de me passer de la partie statique ? Il faut en effet, au moins que j'instancie un objet de la forme « GandiHostManager », ou « OVHHostManager », etc…
À part avoir un tableau contenant statiquement ces nom dans mon script, je ne vois pas comment faire. Évidemment, la solution ne serait pas optimale car le script devra être modifié à chaque inclusion/exclusion de modules supportés…

Si vous voyez comment faire, je suis preneur. Merci d'avance !