Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Re2o
dhcp
Commits
0f4cd64e
Commit
0f4cd64e
authored
Feb 04, 2020
by
chapeau
Committed by
root
Feb 04, 2020
Browse files
Generate DHCP files on ip_type and not on extensions
parent
9baece2c
Changes
1
Hide whitespace changes
Inline
Side-by-side
main.py
View file @
0f4cd64e
#!/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
logger
=
logging
.
getLogger
()
import
subprocess
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__
))
path
=
(
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'
)
...
@@ -29,36 +21,72 @@ def regen_dhcp(api_client):
...
@@ -29,36 +21,72 @@ def regen_dhcp(api_client):
host_mac_ip
=
{}
host_mac_ip
=
{}
for
hmi
in
api_client
.
list
(
"dhcp/hostmacip/"
):
for
hmi
in
api_client
.
list
(
"dhcp/hostmacip/"
):
if
'ipv4'
in
hmi
:
if
hmi
[
'ip_type'
]
not
in
host_mac_ip
.
keys
()
:
if
hmi
[
'extension'
]
not
in
host_mac_ip
.
keys
():
host_mac_ip
[
hmi
[
'ip_type'
]]
=
[]
host_mac_ip
[
hmi
[
'
extension'
]]
=
[]
host_mac_ip
[
hmi
[
'
ip_type'
]].
append
((
hmi
[
'hostname'
],
host_mac_ip
[
hmi
[
'extension'
]
].
append
((
hmi
[
'hostname'
]
,
hmi
[
'extension'
],
hmi
[
'mac_address'
],
hmi
[
'mac_address'
],
hmi
[
'ipv4'
]))
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
():
for
ip_type
,
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/dhcp
.{ip_type
}.list'
.
format
(
ip_type
=
ip_type
)
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
)
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
()
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment