update functions & clean all
This commit is contained in:
parent
2390c055ba
commit
660c981521
1 changed files with 125 additions and 10 deletions
|
@ -7,7 +7,7 @@ DNS dynamique avec l'api d'online.net et de python
|
||||||
:category: network
|
:category: network
|
||||||
:slug: dyndns_online
|
:slug: dyndns_online
|
||||||
:authors: Milka64
|
:authors: Milka64
|
||||||
:summary: Comment faire du DNS dynamique avec online.net et python
|
:summary: Comment faire du DNS dynamique avec Scaleway et python
|
||||||
:status: draft
|
:status: draft
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,20 +22,21 @@ J'ai bien commencé à chercher des solution de dynDNS mais je me suis vite rend
|
||||||
|
|
||||||
Ensuite, je me suis dit que j'allais me monter un bind auto-hebergé mais par manque de temps, j'ai mis cette solution de coté.
|
Ensuite, je me suis dit que j'allais me monter un bind auto-hebergé mais par manque de temps, j'ai mis cette solution de coté.
|
||||||
|
|
||||||
Et par le plus grand des hasard en mettant à jour une entrée DNS, je me suis rendu compte qu'Online avait une API pour gérer ses services.
|
Et par le plus grand des hasard en mettant à jour une entrée DNS, je me suis rendu compte que Scaleway avait une API pour gérer ses services.
|
||||||
|
|
||||||
Dyndns.py
|
Dyndns.py
|
||||||
---------
|
---------
|
||||||
|
|
||||||
J'ai donc écrit `ce petit script <https://gitlab.com/Milka64/dyndns_online.net>`_ (qui est utilisable par tous) dont je vais détailler les differentes parties.
|
J'ai donc écrit `ce petit script <https://gitlab.com/Milka64/dyndns_online.net>`_ (qui est utilisable par tous) dont je vais détailler les differentes parties.
|
||||||
|
|
||||||
fonction args
|
Il n'y a besoin que du token de l'api (disponible `ici <https://console.online.net/fr/api/access>`_)
|
||||||
|
|
||||||
|
Fonction args
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
Parse les argument du scripts
|
Elle parse les argument du scripts, et permets d'avoir un `--help`.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
:linenos:
|
|
||||||
|
|
||||||
def get_args():
|
def get_args():
|
||||||
"""
|
"""
|
||||||
|
@ -53,24 +54,138 @@ Parse les argument du scripts
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
fonction clear
|
Fonction clear
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Éfface les version innutilisé
|
Efface les versions innutilisé:
|
||||||
|
|
||||||
fonction update
|
.. code-block:: python
|
||||||
|
|
||||||
|
def clear_versions(args, session):
|
||||||
|
"""
|
||||||
|
clear inactive versions
|
||||||
|
"""
|
||||||
|
all_versions = session.get("https://api.online.net/api/v1/domain/" + args.domain + "/version").json()
|
||||||
|
versions_to_remove = [x for x in session.get("https://api.online.net/api/v1/domain/" + args.domain + "/version").json() if not x['active']]
|
||||||
|
for version in versions_to_remove:
|
||||||
|
if args.verbose:
|
||||||
|
print("Deleting : " + version['name'])
|
||||||
|
api_session.delete("https://api.online.net/api/v1/domain/" + args.domain + "/version/" + version["uuid_ref"])
|
||||||
|
|
||||||
|
|
||||||
|
Fonction update
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Crée une nouvelle zone, la peuple (avec les entrées de la version active) et l'active.
|
Crée une nouvelle zone, la peuple (avec les entrées de la version active) et l'active.
|
||||||
|
|
||||||
main
|
.. code-block:: python
|
||||||
|
|
||||||
|
def create_new_version(args, records, records_to_update):
|
||||||
|
"""
|
||||||
|
Create new zone version with name YYYYMMDDhhmm
|
||||||
|
"""
|
||||||
|
new_name = datetime.now().strftime("%Y%m%d%H%M")
|
||||||
|
if args.verbose:
|
||||||
|
print("Generating new zone called : " + new_name)
|
||||||
|
url = "https://api.online.net/api/v1/domain/" + args.domain + "/version"
|
||||||
|
data = {
|
||||||
|
'name' : new_name
|
||||||
|
}
|
||||||
|
res = api_session.post(url, data)
|
||||||
|
if "error" in res.json():
|
||||||
|
exit(res.json()['error_description'])
|
||||||
|
id_to_update = res.json()["uuid_ref"]
|
||||||
|
url = "https://api.online.net/api/v1/domain/" + args.domain + "/version/" + id_to_update + "/zone"
|
||||||
|
for record in records:
|
||||||
|
if record['name'] in records_to_update:
|
||||||
|
record['data'] = public_ip
|
||||||
|
data = {
|
||||||
|
'name' : record['name'],
|
||||||
|
'type' : record['type'],
|
||||||
|
'ttl' : record['ttl'],
|
||||||
|
'data' : record['data'],
|
||||||
|
'priority' : 0,
|
||||||
|
}
|
||||||
|
res = api_session.post(url, data)
|
||||||
|
if "error" in res.json():
|
||||||
|
exit(res['error_description'])
|
||||||
|
url = "https://api.online.net/api/v1/domain/" + args.domain + "/version/" + id_to_update + "/enable"
|
||||||
|
res = api_session.patch(url)
|
||||||
|
try:
|
||||||
|
res_json = res.json()
|
||||||
|
except:
|
||||||
|
res_json = {}
|
||||||
|
if "error" in res_json:
|
||||||
|
exit(res['error_description'])
|
||||||
|
|
||||||
|
Main
|
||||||
~~~~
|
~~~~
|
||||||
|
|
||||||
Appelé lors de l'éxecution du scipt
|
Appelé lors de l'éxecution du scipt
|
||||||
|
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
## PARSE AGRS ##
|
||||||
|
args = get_args()
|
||||||
|
|
||||||
|
## Check if Token is present
|
||||||
|
if not args.token:
|
||||||
|
exit("token is required")
|
||||||
|
|
||||||
|
## Get public IP ##
|
||||||
|
try:
|
||||||
|
public_ip = requests.get(args.url).text
|
||||||
|
except:
|
||||||
|
exit("Can't get public IP")
|
||||||
|
if not public_ip:
|
||||||
|
exit("Can't get public IP")
|
||||||
|
if args.verbose:
|
||||||
|
print("Public IP is : " + public_ip)
|
||||||
|
|
||||||
|
## Init api session ##
|
||||||
|
api_session = requests.session()
|
||||||
|
api_session.headers['Authorization'] = 'Bearer ' + args.token
|
||||||
|
|
||||||
|
## Check api connection ##
|
||||||
|
try:
|
||||||
|
response = api_session.get("https://api.online.net/api/v1/domain/list")
|
||||||
|
except:
|
||||||
|
exit("Can't connect to api")
|
||||||
|
if "error" in response.json():
|
||||||
|
exit(response.json()['error_description'])
|
||||||
|
|
||||||
|
|
||||||
|
## Get records and compare IP ##
|
||||||
|
records = api_session.get("https://api.online.net/api/v1/domain/" + args.domain + "/zone").json()
|
||||||
|
if "error" in records:
|
||||||
|
exit(records['error_description'])
|
||||||
|
|
||||||
|
records_to_update = args.records.split(',')
|
||||||
|
|
||||||
|
old_ip = [x['data'] for x in records if x['name'] in records_to_update and not public_ip in x["data"]]
|
||||||
|
|
||||||
|
if not old_ip:
|
||||||
|
exit()
|
||||||
|
|
||||||
|
else:
|
||||||
|
create_new_version(args, records, records_to_update)
|
||||||
|
|
||||||
|
## Clear inactive versions ##
|
||||||
|
if args.clean:
|
||||||
|
clear_versions(args, api_session)
|
||||||
|
|
||||||
BONUS : acme.sh + api online
|
BONUS : acme.sh + api online
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
En me documentant sur l'api d'online, je me suis rendu compte qu'acme.sh permet d'utiliser l'api d'Online.
|
En me documentant sur l'api d'online, je me suis rendu compte qu'acme.sh permet d'utiliser l'api de Scaleway.
|
||||||
|
|
||||||
|
Jusqu'à présent je mettais à jour mes certificats à la main tous les 3 mois (avec quelques raté à l'occasion...).
|
||||||
|
|
||||||
|
Il n'y a juste besoin du token.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ acme.sh --issue --dns dns_online -d 0w.tf -d "*.0w.tf" --reloadcmd "nginx -s reload" --server letsencrypt --force
|
||||||
|
|
Loading…
Reference in a new issue