Script de remplacement automatique d'ip dans un fichier '.conf'

Bonjour bonsoir !
Étant donné que j’ai une IP dynamique, je cherche à créer un script qui remplacerait automatiquement mon adresse IP externe dans un fichier de configuration qui en a besoin.
Je ne sais pas trop comment m’y prendre. Quelles commandes sont les plus indiquées selon vous ?
En clair, pour le code :

  • récupérer IP publique -> ‘IP publique récupérée’
  • si ‘IP publique récupérée’ != ‘IP publique présente à tel endroit, tel endroit et tel endroit’ dans le fichier .conf, alors la remplacer à tous ces endroits,
  • si non, laisser tel quel.
  • activer le script une fois toutes les 3h.

Pour la première ligne, j’ai pensé à

curl ipinfo.io/ip

Mais pour la suite, je suis un peu limité. J’ai d’abord regardé du côté de sed mais je ne comprends pas tout…
Si une âme charitable a de quoi m’avancer, j’en serais ravi !

Bonjour,

#!/usr/bin/env python3

from urllib import request
from urllib.error import HTTPError

def get_ip_addr ():
	opener = request.build_opener ()
	return (opener.open ('http://ipinfo.io/ip').read ().decode ('utf8').split ('\n') [0])

if __name__ == '__main__':
	print (get_ip_addr ())

Soit ce script te retourne l’adresse IP dans sa sortie standard, soit tu l’importes dans un autre script Python3 pour utiliser la fonction get_ip_addr ().

Ou en shell:

#!/bin/bash

ip_pub=$(curl --silent ipinfo.io/ip)
files="chemin/vers/fichier/conf/1 chemin/vers/fichier/conf/2 chemin/vers/fichier/conf/3"
regex="[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"

for file in $files ; do
        if [ $(grep -c $ip_pub $file) -lt 1 ] ; then
                echo "adresse IP dans le fichier $file différente de l'adresse IP publique actuelle: $ip_pub"
                sed -E -i".old" "s/$regex/$ip_pub/g" $file && echo "adresse IP remplacée dans le fichier $file"
        fi
done

La regex peut être un peu affinée, mais elle matchera toutes les IPv4 et même des trucs qui ressemblent à des IPv4 sans en être (1.2.3.4 par exemple).
Tu peux spécifier plusieurs fichiers de config en même temps (j’avais mal lu la question), le remplacement de l’adresse se fera à tous les endroits de chaque fichier.

Merci pour les retours, je vais prendre le temps de potasser tout ça. Je connais mal les langages que vous utilisez.
J’ai oublié un truc dans le code, j’aimerais avoir aussi :
- récupérer IP publique -> ‘IP publique récupérée’
- si ‘IP publique récupérée’ != ‘IP publique présente à tel endroit, tel endroit et tel endroit’ dans le fichier .conf, alors, fermer programme, la remplacer à tous ces endroits, puis relancer le programme.
- si non, laisser tel quel.
+ activer le script une fois toutes les 3h.

Je ne sais pas si cela est possible avec les langages que vous utilisez.
J’imagine que oui.
Aussi, info importante, il y a d’autres IPv4 dans le fichier .conf et il ne faut pas y toucher. On ne peut donc pas les matcher à la volée. Je pense donc qu’il faut circonscrire le script à des lignes précises.

Où ça ?

C’est vrai que ni @Sputnik93, ni moi n’avons prévu que la connexion ne fonctionne pas.
Mais, après, nous avons juste donné deux méthodes pour récuperer l’adresse IP tel quel, si tu veux en faire quelque chose derrière, il faut le scripter aussi. De plus, nous n’avons pas le format du fichier .conf.

Avec une bonne petit tâche cron des familles, ça fera le café :

0 */3 * * * /chemin/vers/ton/script

Je l’ai mis en gras sur le post précédent.
J’ai les commandes shell pour arrêter et relancer le programme en question, je ne sais pas si ça peut marcher rentré tel quel dans du python…

Je ne comprends pas trop ce que tu veux dire. Une sortie en cas d’absence de connexion ? Ça sera sans doute exceptionnel mais pourquoi pas.

Le format est en .json, lisible avec un éditeur de texte. Je veux simplement pouvoir comparer l’IP récupéré avec celles présentes à des endroits précis du document et les remplacer si elles sont différentes.
Mais vous m’avez déjà donné pas mal d’infos, je vais essayer d’en faire un script propre.

Et merci beaucoup pour la tâche cron !

Alors, un truc de ce genre en Python3 :

#!/usr/bin/env python3

from urllib import request
from urllib.error import HTTPError
from json
from subprocess import call

ip_url = 'http://ipinfo.io/ip'
conf_file = '/ton/fichier/de/conf.conf'
conf_ip_name = 'nom_du_parametre_ip_dans_la_conf'
actions = {
	'error': ['/chemin/de/ton/programme/pour/erreur', 'param1', 'param2'],
	'new': ['/chemin/de/ton/programme/pour/nouvelle/ip', 'param1', 'param2'],
	'same': ['/chemin/de/ton/programme/pour/meme/ip', 'param1', 'param2'],
	}

def get_ip_addr ():
	try:
		opener = request.build_opener ()
		return (opener.open (ip_url).read ().decode ('utf8').split ('\n') [0])
	except HTTPError:
		return (None)

if __name__ == '__main__':
	conf = json.load (conf_file)
	old_ip = conf [conf_ip_name]
	new_ip = get_ip_addr ()
	if new_ip == None:
		call (actions ['error'])
	elif new_ip == old_ip:
		call (actions ['same'])
	else:
		conf [conf_ip_name] = new_ip
		json.dump (conf, conf_file)
		call (actions ['new'])

Pour les varaibles au début, mets les bonnes valeurs pour les chemins, puis pour les actions, mets les commandes à lancer entre simples côtes, avec les paramètres séparés par des virgules comme dans l’exemple.
Si une action ne fait rien, défini simplement l’action à ['/bin/true'].

Profites-en pour essayer de comprendre comme ça fonctionne, n’utilise jamais un script fourni à l’arache par quelqu’un dans un forum sans être sûr de le comprendre un minimum.

C’est bien mon intention. J’ai envie d’apprendre comment ça marche avant de m’en servir. J’ai simplement pour habitude d’apprendre en échangeant avec d’autres personnes, je trouve ça plus vivant.
Merci encore !