About to write dhcp-hosts
This commit is contained in:
parent
65ed96cc29
commit
ef67c18135
3 changed files with 80 additions and 12 deletions
77
main.py
77
main.py
|
@ -3,7 +3,7 @@
|
||||||
from flask import Flask, request, abort, make_response, \
|
from flask import Flask, request, abort, make_response, \
|
||||||
render_template, redirect, url_for, \
|
render_template, redirect, url_for, \
|
||||||
json, jsonify, session, flash
|
json, jsonify, session, flash
|
||||||
from collections import namedtuple
|
from collections import namedtuple, OrderedDict
|
||||||
from subprocess import check_call, call
|
from subprocess import check_call, call
|
||||||
from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
|
from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
|
||||||
|
|
||||||
|
@ -74,7 +74,6 @@ def create_user(username, password, creator):
|
||||||
reload_freeradius()
|
reload_freeradius()
|
||||||
|
|
||||||
def login_required(f):
|
def login_required(f):
|
||||||
print(f)
|
|
||||||
def g(*args, **kwargs):
|
def g(*args, **kwargs):
|
||||||
if not session.get('logged_in', False):
|
if not session.get('logged_in', False):
|
||||||
return redirect(url_for('login', redirect_to=request.url))
|
return redirect(url_for('login', redirect_to=request.url))
|
||||||
|
@ -292,6 +291,44 @@ def ips():
|
||||||
ipmap = load_ips()
|
ipmap = load_ips()
|
||||||
return render_template("ips.html", ipmap=ipmap)
|
return render_template("ips.html", ipmap=ipmap)
|
||||||
|
|
||||||
|
def parse_macs(macs):
|
||||||
|
r = []
|
||||||
|
macs = macs.strip()
|
||||||
|
parts = macs.split(',')
|
||||||
|
for p in parts:
|
||||||
|
p = p.strip()
|
||||||
|
m = mac_re.match(p)
|
||||||
|
if m:
|
||||||
|
r.append(m.group(0))
|
||||||
|
return r
|
||||||
|
|
||||||
|
def write_dhcp_files(ipmap):
|
||||||
|
tempfile = "{}.{}".format(dhcp_hosts_file, timestamp)
|
||||||
|
f = open(tempfile,"w")
|
||||||
|
prefix = ipmap["prefix"]
|
||||||
|
for i in range(1,255):
|
||||||
|
ip = ipmap[i]
|
||||||
|
if ip.dhcp_pool:
|
||||||
|
continue
|
||||||
|
if ip.reserved_by or ip.locked:
|
||||||
|
meta = OrderedDict()
|
||||||
|
if ip.reserved_by:
|
||||||
|
meta['reserved-by'] = ip.reserved_by
|
||||||
|
if ip.locked:
|
||||||
|
meta['locked'] = True
|
||||||
|
print("# " + json.dumps(meta))
|
||||||
|
if len(ip.macs) == 0:
|
||||||
|
macs = impossible_mac
|
||||||
|
else:
|
||||||
|
macs = ",".join(ip.macs)
|
||||||
|
tag = ""
|
||||||
|
if ip.gw and len(ip.macs) > 0:
|
||||||
|
tag = ",set:client" + ip.macs[0].replace(":","").lower()
|
||||||
|
print("{},{}.{}{}".format(macs,prefix,i,tag))
|
||||||
|
f.close()
|
||||||
|
shutil.move(tempfile, dhcp_hosts_file)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/ip/<int:last_byte>", methods=['GET', 'POST'])
|
@app.route("/ip/<int:last_byte>", methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def ip(last_byte):
|
def ip(last_byte):
|
||||||
|
@ -302,17 +339,37 @@ def ip(last_byte):
|
||||||
# ('dhcp', 'on'),
|
# ('dhcp', 'on'),
|
||||||
# ('dhcp-client-mac', '00:23:54:8c:65:13'),
|
# ('dhcp-client-mac', '00:23:54:8c:65:13'),
|
||||||
# ('dhcp-client-mac', '10.6.122.2')])
|
# ('dhcp-client-mac', '10.6.122.2')])
|
||||||
# ImmutableMultiDict([('dhcp-client', 'any'), ('dhcp', 'on')])
|
# ImmutableMultiDict([('dhcp-client', 'pool'), ('dhcp', 'on')])
|
||||||
# ImmutableMultiDict([('reserved', 'on'), ('reserved-by', 'Andy')])
|
# ImmutableMultiDict([('reserved', 'on'), ('reserved-by', 'Andy')])
|
||||||
print(request.form)
|
print(request.form)
|
||||||
|
|
||||||
|
reserved_by = request.form.get('reserved-by', '')[:100]
|
||||||
|
dhcp_pool = request.form.get('dhcp-client', '') == 'pool'
|
||||||
|
macs = parse_macs(request.form.get('dhcp-client-mac', ''))
|
||||||
|
gw = request.form.get('dhcp-gw','')[:15]
|
||||||
|
gw = gw if ip_re.match(gw) else ''
|
||||||
|
|
||||||
|
with exclusive_lock:
|
||||||
|
ipmap = load_ips()
|
||||||
|
if not ipmap[last_byte].locked:
|
||||||
|
ipmap[last_byte] = Ip(
|
||||||
|
reserved_by=reserved_by,
|
||||||
|
dhcp_pool=dhcp_pool,
|
||||||
|
locked=False,
|
||||||
|
macs=macs,
|
||||||
|
gw=gw,
|
||||||
|
)
|
||||||
|
write_dhcp_files(ipmap)
|
||||||
|
|
||||||
return redirect(url_for('ips'))
|
return redirect(url_for('ips'))
|
||||||
ipmap = load_ips()
|
else:
|
||||||
addr = "{}.{}".format(ipmap["prefix"], last_byte)
|
ipmap = load_ips()
|
||||||
return render_template(
|
addr = "{}.{}".format(ipmap["prefix"], last_byte)
|
||||||
"ip.html",
|
return render_template(
|
||||||
addr=addr,
|
"ip.html",
|
||||||
meta=ipmap[last_byte],
|
addr=addr,
|
||||||
)
|
meta=ipmap[last_byte],
|
||||||
|
)
|
||||||
|
|
||||||
@app.route("/logout")
|
@app.route("/logout")
|
||||||
def logout():
|
def logout():
|
||||||
|
|
|
@ -48,9 +48,9 @@
|
||||||
<fieldset id="dhcp-fieldset" disabled>
|
<fieldset id="dhcp-fieldset" disabled>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-1">
|
<div class="col-sm-offset-1">
|
||||||
<input type="radio" id="dhcp-client-any" name="dhcp-client" value="any"
|
<input type="radio" id="dhcp-client-pool" name="dhcp-client" value="pool"
|
||||||
{% if meta.dhcp_pool %}checked="checked"{% endif %}/>
|
{% if meta.dhcp_pool %}checked="checked"{% endif %}/>
|
||||||
<label for="dhcp-client-any">A cualquier dispositivo</label>
|
<label for="dhcp-client-pool">A cualquier dispositivo</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
|
@ -7,6 +7,15 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<h3>Asignaciones de IPs</h3>
|
||||||
|
</div>
|
||||||
|
<div class="row" style="padding-bottom: 1em;">
|
||||||
|
<b>Red:</b> <span>10.6.122.0/24</span>
|
||||||
|
<b>Gateway:</b> <span>10.6.122.1</span>
|
||||||
|
<b>DNS:</b> <span>10.6.100.66, 10.6.100.67</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% for row in range(16) %}
|
{% for row in range(16) %}
|
||||||
<div class="ips-row">
|
<div class="ips-row">
|
||||||
|
@ -48,6 +57,8 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row" style="padding-bottom: 3em; padding-top: 1em;"><a href="{{ url_for('admin') }}">Regresar</a></div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
$(function() {
|
||||||
$(".ips-cell:not(.unusable)").hover(
|
$(".ips-cell:not(.unusable)").hover(
|
||||||
|
|
Loading…
Reference in a new issue