Compare commits

..

No commits in common. "master" and "compa_2.8" have entirely different histories.

3 changed files with 30 additions and 75 deletions

View file

103
main.py
View file

@ -1,109 +1,64 @@
#!/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
import sys LOG_LEVEL = logging.INFO
import os
import subprocess
path =(os.path.dirname(os.path.abspath(__file__))) logger = logging.getLogger()
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(path+'/config.ini') config.read(os.path.join(BASE_DIR, '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):
"""Genere les fichiers de zone du DHCP, par extension et par plage d'ip""" host_mac_ip = {}
host_mac_ip_ext = {}
host_mac_ip_type = {}
api_res = api_client.list("dhcp/hostmacip/") for hmi in api_client.list("dhcp/hostmacip/"):
if 'ipv4' in hmi:
build_hmi(host_mac_ip_ext, api_res, 'extension') if hmi['extension'] not in host_mac_ip.keys():
build_hmi(host_mac_ip_type, api_res, 'ip_type') host_mac_ip[hmi['extension']] = []
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"
"}}") "}}")
generate_file(template, host_mac_ip_ext, "dhcp") for extension, hmi_list in host_mac_ip.items():
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, extension, mac_address, ipv4 in hmi_list) ) for hostname, mac_address, ipv4 in hmi_list)
filename = path+'/generated/{file_prefix}{key}.list'.format( filename = os.path.join(BASE_DIR, 'generated/dhcp{extension}.list'.format(extension=extension))
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 arg in sys.argv: for service in api_client.list("services/regen", params=dict(hostname=client_hostname)):
if arg=="--force": if service['service_name'] == 'dhcp' and service['need_regen']:
logger.info("Regenerating service dhcp")
regen_dhcp(api_client) regen_dhcp(api_client)
api_client.patch(service['api_url'], data={'need_regen': False})
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})
reload_server()

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