Compare commits

...
Sign in to create a new pull request.

8 commits

Author SHA1 Message Date
Gabriel Detraz
9edb21f1c4 If no ipv4, pass 2020-06-20 11:45:13 +02:00
Gabriel Detraz
7fc1031f8e Make submodule tracking a branch 2020-04-06 19:30:42 +02:00
Gabriel Detraz
6fd56bd7ec Add generated 2020-04-06 18:31:20 +02:00
dd5d3b7301 Noms de fichier en minuscule et sans espace 2020-02-14 09:20:21 +01:00
chirac
1c8e1e68f8 Merge branch 'ip_type_generation' into 'master'
Ip type generation

See merge request re2o/dhcp!3
2020-02-13 15:04:25 +01:00
01694fc604 Retrocompatibility 2020-02-04 11:52:43 +00:00
0f4cd64eee Generate DHCP files on ip_type and not on extensions 2020-02-04 11:07:30 +00:00
chirac
9baece2c7b Merge branch 'compa_2.8' into 'master'
Compatibilité 2.8

See merge request re2o/dhcp!2
2020-01-22 21:54:33 +01:00
3 changed files with 75 additions and 30 deletions

0
generated/.gitkeep Normal file
View file

101
main.py
View file

@ -1,64 +1,109 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os
from configparser import ConfigParser from configparser import ConfigParser
import logging
import socket import socket
from re2oapi import Re2oAPIClient from re2oapi import Re2oAPIClient
LOG_LEVEL = logging.INFO import sys
import os
import subprocess
logger = logging.getLogger() path =(os.path.dirname(os.path.abspath(__file__)))
logger.setLevel(LOG_LEVEL)
formatter = logging.Formatter('%(levelname)s :: %(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
stream_handler.setLevel(LOG_LEVEL)
logger.addHandler(stream_handler)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
config = ConfigParser() config = ConfigParser()
config.read(os.path.join(BASE_DIR, 'config.ini')) config.read(path+'/config.ini')
api_hostname = config.get('Re2o', 'hostname') api_hostname = config.get('Re2o', 'hostname')
api_password = config.get('Re2o', 'password') api_password = config.get('Re2o', 'password')
api_username = config.get('Re2o', 'username') api_username = config.get('Re2o', 'username')
def regen_dhcp(api_client): def regen_dhcp(api_client):
host_mac_ip = {} """Genere les fichiers de zone du DHCP, par extension et par plage d'ip"""
host_mac_ip_ext = {}
host_mac_ip_type = {}
for hmi in api_client.list("dhcp/hostmacip/"): api_res = api_client.list("dhcp/hostmacip/")
if 'ipv4' in hmi:
if hmi['extension'] not in host_mac_ip.keys(): build_hmi(host_mac_ip_ext, api_res, 'extension')
host_mac_ip[hmi['extension']] = [] build_hmi(host_mac_ip_type, api_res, 'ip_type')
host_mac_ip[hmi['extension']].append((hmi['hostname'],
hmi['mac_address'],
hmi['ipv4']))
template = ("host {hostname}{extension} {{\n" template = ("host {hostname}{extension} {{\n"
" hardware ethernet {mac_address};\n" " hardware ethernet {mac_address};\n"
" fixed-address {ipv4};\n" " fixed-address {ipv4};\n"
"}}") "}}")
for extension, hmi_list in host_mac_ip.items(): generate_file(template, host_mac_ip_ext, "dhcp")
generate_file(template, host_mac_ip_type, "dhcp.ip_type.")
def build_hmi(host_mac_ip, api_res, key):
for hmi in api_res:
if hmi[key] not in host_mac_ip.keys():
host_mac_ip[hmi[key]] = []
if 'ipv4' in hmi:
host_mac_ip[hmi[key]].append((hmi['hostname'],
hmi['extension'],
hmi['mac_address'],
hmi['ipv4']))
def generate_file(template, host_mac_ip, file_prefix):
for key, hmi_list in host_mac_ip.items():
dhcp_leases_content = '\n\n'.join(template.format( dhcp_leases_content = '\n\n'.join(template.format(
hostname=hostname, hostname=hostname,
extension=extension, extension=extension,
mac_address=mac_address, mac_address=mac_address,
ipv4=ipv4 ipv4=ipv4
) for hostname, mac_address, ipv4 in hmi_list) ) for hostname, extension, mac_address, ipv4 in hmi_list)
filename = os.path.join(BASE_DIR, 'generated/dhcp{extension}.list'.format(extension=extension)) filename = path+'/generated/{file_prefix}{key}.list'.format(
key=key,
file_prefix=file_prefix).lower().replace(" ", "_")
with open(filename, 'w+') as f: with open(filename, 'w+') as f:
f.write(dhcp_leases_content) f.write(dhcp_leases_content)
api_client = Re2oAPIClient(api_hostname, api_username, api_password)
def reload_server():
"""Relance le serveur DHCP."""
try:
subprocess.check_output(
['/bin/systemctl', 'restart', 'isc-dhcp-server'],
stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as err:
print(
"Erreur lors du redémarrage de isc-dhcp-server.\n"
"Code de retour: %s, Sortie:\n%s",
err.returncode, err.output.decode())
print(err)
def check_syntax():
"""Vérifie la configuration du serveur DHCP."""
try:
subprocess.check_output(
['/usr/sbin/dhcpd', '-t', '-cf', '/etc/dhcp/dhcpd.conf'],
stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as err:
print(
"Erreur lors de la vérification de la configuration DHCP.\n"
"Code de retour: %s, Sortie:\n%s",
err.returncode, err.output.decode())
return False
return True
api_client = Re2oAPIClient(api_hostname, api_username, api_password, use_tls=True)
client_hostname = socket.gethostname().split('.', 1)[0] client_hostname = socket.gethostname().split('.', 1)[0]
for service in api_client.list("services/regen", params=dict(hostname=client_hostname)): for arg in sys.argv:
if service['service_name'] == 'dhcp' and service['need_regen']: if arg=="--force":
logger.info("Regenerating service dhcp")
regen_dhcp(api_client) regen_dhcp(api_client)
for service in api_client.list("services/regen/"):
if service['hostname'] == client_hostname and \
service['service_name'] == 'dhcp' and \
service['need_regen']:
regen_dhcp(api_client)
if check_syntax():
api_client.patch(service['api_url'], data={'need_regen': False}) api_client.patch(service['api_url'], data={'need_regen': False})
reload_server()

@ -1 +1 @@
Subproject commit b12df74fe73f351986ff51c8122089644218f8fe Subproject commit ffaed921030deb6b6b01649709666807feb95370