mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-23 03:43:12 +00:00
portail captif to capture mac
This commit is contained in:
parent
5ebe7c3b75
commit
833a3f5348
4 changed files with 112 additions and 2 deletions
|
@ -110,3 +110,6 @@ GID_RANGES = {
|
||||||
|
|
||||||
# Some Django apps you want to add in you local project
|
# Some Django apps you want to add in you local project
|
||||||
OPTIONNAL_APPS = ()
|
OPTIONNAL_APPS = ()
|
||||||
|
|
||||||
|
CAPTIVE_IP_RANGE = "10.51.0.0/16"
|
||||||
|
|
||||||
|
|
46
re2o/templates/re2o/portail_login.html
Normal file
46
re2o/templates/re2o/portail_login.html
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{% extends "users/sidebar.html" %}
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Gabriel Détraz
|
||||||
|
Copyright © 2017 Goulven Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load static %}
|
||||||
|
{% block title %}Machine non reconnue{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% bootstrap_form_errors loginform %}
|
||||||
|
|
||||||
|
<form class="form" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_form loginform %}
|
||||||
|
{% bootstrap_button action_name button_type="submit" icon="star" %}
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
{% if success %}
|
||||||
|
|
||||||
|
Votre Machine a été enregistré avec succès, débranchez votre cable, attendez quelques secondes puis rebranchez le, vous devriez alors avoir internet ! (si vous êtes à jour de cotisation).
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -48,7 +48,7 @@ from django.conf.urls import include, url
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
|
|
||||||
from .views import index, about_page, contact_page
|
from .views import index, about_page, contact_page, portail_login
|
||||||
|
|
||||||
handler500 = 're2o.views.handler500'
|
handler500 = 're2o.views.handler500'
|
||||||
handler404 = 're2o.views.handler404'
|
handler404 = 're2o.views.handler404'
|
||||||
|
@ -58,6 +58,7 @@ urlpatterns = [
|
||||||
url(r'^about/$', about_page, name='about'),
|
url(r'^about/$', about_page, name='about'),
|
||||||
url(r'^contact/$', contact_page, name='contact'),
|
url(r'^contact/$', contact_page, name='contact'),
|
||||||
url('^logout/', auth_views.logout, {'next_page': '/'}),
|
url('^logout/', auth_views.logout, {'next_page': '/'}),
|
||||||
|
url(r'^portail_login/$', portail_login, name='portail_login'),
|
||||||
url('^', include('django.contrib.auth.urls')),
|
url('^', include('django.contrib.auth.urls')),
|
||||||
url(r'^i18n/', include('django.conf.urls.i18n')),
|
url(r'^i18n/', include('django.conf.urls.i18n')),
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
|
|
|
@ -34,6 +34,11 @@ from django.template.context_processors import csrf
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.views.decorators.cache import cache_page
|
from django.views.decorators.cache import cache_page
|
||||||
|
from django.contrib.auth.forms import AuthenticationForm
|
||||||
|
from django.contrib import messages
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import ipaddress
|
||||||
|
|
||||||
from preferences.models import (
|
from preferences.models import (
|
||||||
Service,
|
Service,
|
||||||
|
@ -41,9 +46,10 @@ from preferences.models import (
|
||||||
AssoOption,
|
AssoOption,
|
||||||
HomeOption
|
HomeOption
|
||||||
)
|
)
|
||||||
|
from machines.models import Nas
|
||||||
|
|
||||||
from .contributors import CONTRIBUTORS
|
from .contributors import CONTRIBUTORS
|
||||||
|
from re2o.settings import CAPTIVE_IP_RANGE
|
||||||
|
|
||||||
def form(ctx, template, request):
|
def form(ctx, template, request):
|
||||||
"""Form générique, raccourci importé par les fonctions views du site"""
|
"""Form générique, raccourci importé par les fonctions views du site"""
|
||||||
|
@ -69,6 +75,60 @@ def index(request):
|
||||||
'asso_name': asso_name
|
'asso_name': asso_name
|
||||||
}, 're2o/index.html', request)
|
}, 're2o/index.html', request)
|
||||||
|
|
||||||
|
def get_ip(request):
|
||||||
|
"""Returns the IP of the request, accounting for the possibility of being
|
||||||
|
behind a proxy.
|
||||||
|
"""
|
||||||
|
ip = request.META.get("HTTP_X_FORWARDED_FOR", None)
|
||||||
|
if ip:
|
||||||
|
# X_FORWARDED_FOR returns client1, proxy1, proxy2,...
|
||||||
|
ip = ip.split(", ")[0]
|
||||||
|
else:
|
||||||
|
ip = request.META.get("REMOTE_ADDR", "")
|
||||||
|
return ip
|
||||||
|
|
||||||
|
def apply(cmd):
|
||||||
|
return subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
def mac_from_ip(ip):
|
||||||
|
cmd = ['/usr/sbin/arp','-na',ip]
|
||||||
|
p = apply(cmd)
|
||||||
|
output, errors = p.communicate()
|
||||||
|
if output is not None :
|
||||||
|
mac_addr = output.decode().split()[3]
|
||||||
|
return str(mac_addr)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def portail_login(request):
|
||||||
|
""" Check for authentication. If success, register the current machine for the user."""
|
||||||
|
login_form = AuthenticationForm(data=request.POST)
|
||||||
|
success = False
|
||||||
|
if login_form.is_valid():
|
||||||
|
remote_ip = get_ip(request)
|
||||||
|
if ipaddress.ip_address(remote_ip) in ipaddress.ip_network(CAPTIVE_IP_RANGE):
|
||||||
|
mac_addr = mac_from_ip(remote_ip)
|
||||||
|
if mac_addr:
|
||||||
|
nas_type = Nas.objects.get(name="Switches")
|
||||||
|
result, reason = login_form.user_cache.autoregister_machine(mac_addr, nas_type)
|
||||||
|
if result:
|
||||||
|
success=True
|
||||||
|
else:
|
||||||
|
messages.error(request, "Erreur dans l'enregistrement de la machine : %s" % reason, '')
|
||||||
|
else:
|
||||||
|
messages.error(request, "Erreur dans la récupération de la MAC")
|
||||||
|
else:
|
||||||
|
messages.error(request, "Merci de vous connecter en filaire pour enregistrer une machine")
|
||||||
|
return form(
|
||||||
|
{
|
||||||
|
'loginform': login_form,
|
||||||
|
'success' : success
|
||||||
|
},
|
||||||
|
're2o/portail_login.html',
|
||||||
|
request
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def about_page(request):
|
def about_page(request):
|
||||||
""" The view for the about page.
|
""" The view for the about page.
|
||||||
|
|
Loading…
Reference in a new issue