136 lines
4.4 KiB
Python
136 lines
4.4 KiB
Python
import routeros_api
|
|
from django.shortcuts import render, redirect
|
|
from django.contrib.auth import login, logout
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib.auth.models import User
|
|
|
|
# A dummy user is used to authenticate against Django's session management.
|
|
# This is not a real user in the database, but a temporary, in-memory user.
|
|
# This is required to use the @login_required decorator.
|
|
# We create the user if it does not exist.
|
|
try:
|
|
User.objects.get(username='dummy')
|
|
except User.DoesNotExist:
|
|
User.objects.create_user('dummy', password='dummy')
|
|
|
|
def login_view(request):
|
|
if request.method == 'POST':
|
|
router_ip = request.POST.get('router_ip')
|
|
username = request.POST.get('username')
|
|
password = request.POST.get('password')
|
|
|
|
try:
|
|
connection = routeros_api.RouterOsApiPool(
|
|
router_ip,
|
|
username=username,
|
|
password=password,
|
|
plaintext_login=True
|
|
)
|
|
api = connection.get_api()
|
|
# If connection is successful, store credentials in session
|
|
request.session['router_ip'] = router_ip
|
|
request.session['username'] = username
|
|
request.session['password'] = password
|
|
|
|
user = User.objects.get(username='dummy')
|
|
login(request, user)
|
|
|
|
return redirect('dashboard')
|
|
except Exception as e:
|
|
# Handle connection error
|
|
return render(request, 'core/login.html', {'error': str(e)})
|
|
|
|
return render(request, 'core/login.html')
|
|
|
|
@login_required(login_url='/')
|
|
def dashboard_view(request):
|
|
router_ip = request.session.get('router_ip')
|
|
username = request.session.get('username')
|
|
password = request.session.get('password')
|
|
|
|
if not all([router_ip, username]):
|
|
return redirect('login')
|
|
|
|
try:
|
|
connection = routeros_api.RouterOsApiPool(
|
|
router_ip,
|
|
username=username,
|
|
password=password,
|
|
plaintext_login=True
|
|
)
|
|
api = connection.get_api()
|
|
|
|
# Fetch PPPoE secrets
|
|
ppp_secrets = api.get_resource('/ppp/secret').get()
|
|
|
|
# Fetch Hotspot users
|
|
hotspot_users = api.get_resource('/ip/hotspot/user').get()
|
|
|
|
# Process data
|
|
customers = []
|
|
for user in ppp_secrets:
|
|
customers.append({
|
|
'id': user.get('id'),
|
|
'name': user.get('name'),
|
|
'mac_address': user.get('caller-id', '-'),
|
|
'type': 'PPPoE',
|
|
'profile': user.get('profile', '-'),
|
|
'expires': user.get('comment', '-')
|
|
})
|
|
|
|
for user in hotspot_users:
|
|
customers.append({
|
|
'id': user.get('id'),
|
|
'name': user.get('name'),
|
|
'mac_address': user.get('mac-address', '-'),
|
|
'type': 'Hotspot',
|
|
'profile': user.get('profile', '-'),
|
|
'expires': user.get('comment', '-')
|
|
})
|
|
|
|
total_customers = len(customers)
|
|
total_hotspot = len(hotspot_users)
|
|
total_pppoe = len(ppp_secrets)
|
|
|
|
context = {
|
|
'customers': customers,
|
|
'total_customers': total_customers,
|
|
'total_hotspot': total_hotspot,
|
|
'total_pppoe': total_pppoe,
|
|
}
|
|
|
|
return render(request, 'core/dashboard.html', context)
|
|
|
|
except Exception as e:
|
|
# On error, redirect to login and show error
|
|
return redirect('login')
|
|
|
|
def logout_view(request):
|
|
logout(request)
|
|
return redirect('login')
|
|
|
|
def create_pppoe_profile_view(request):
|
|
if not request.session.get('router_ip'):
|
|
return redirect('login')
|
|
return render(request, 'core/create_pppoe_profile.html')
|
|
|
|
def input_pppoe_customer_view(request):
|
|
if not request.session.get('router_ip'):
|
|
return redirect('login')
|
|
return render(request, 'core/input_customer.html')
|
|
|
|
def create_hotspot_voucher_view(request):
|
|
if not request.session.get('router_ip'):
|
|
return redirect('login')
|
|
return render(request, 'core/create_hotspot_voucher.html')
|
|
|
|
def edit_route_view(request):
|
|
if not request.session.get('router_ip'):
|
|
return redirect('login')
|
|
return render(request, 'core/edit_route.html')
|
|
|
|
def monthly_report_view(request):
|
|
if not request.session.get('router_ip'):
|
|
return redirect('login')
|
|
return render(request, 'core/monthly_report.html')
|