Added access logs.

This commit is contained in:
A B
2024-10-28 17:15:49 +00:00
parent 7cf99af20d
commit 0880401cc4
7 changed files with 145 additions and 61 deletions

View File

@ -7,9 +7,9 @@ from django.utils.safestring import mark_safe
from django.db.models import Count
from django.contrib.auth.admin import UserAdmin
from .models import User
from vpn.models import User, ACL
from .models import User, AccessLog
from django.utils.timezone import localtime
from vpn.models import User, ACL, ACLLink
from vpn.forms import UserForm
from .server_plugins import (
Server,
@ -23,6 +23,43 @@ admin.site.site_title = "VPN Manager"
admin.site.site_header = "VPN Manager"
admin.site.index_title = "OutFleet"
def format_object(data):
try:
if isinstance(data, dict):
formatted_data = json.dumps(data, indent=2)
return mark_safe(f"<pre>{formatted_data}</pre>")
elif isinstance(data, str):
return mark_safe(f"<pre>{data}</pre>")
else:
return mark_safe(f"<pre>{str(data)}</pre>")
except Exception as e:
return mark_safe(f"<span style='color: red;'>Error: {e}</span>")
class UserNameFilter(admin.SimpleListFilter):
title = 'User'
parameter_name = 'user'
def lookups(self, request, model_admin):
users = set(User.objects.values_list('username', flat=True))
return [(user, user) for user in users]
def queryset(self, request, queryset):
if self.value():
return queryset.filter(user__username=self.value())
return queryset
class ServerNameFilter(admin.SimpleListFilter):
title = 'Server Name'
parameter_name = 'acl__server__name'
def lookups(self, request, model_admin):
servers = set(ACL.objects.values_list('server__name', flat=True))
return [(server, server) for server in servers]
def queryset(self, request, queryset):
if self.value():
return queryset.filter(acl__server__name=self.value())
return queryset
@admin.register(Server)
class ServerAdmin(PolymorphicParentModelAdmin):
@ -56,6 +93,7 @@ class ServerAdmin(PolymorphicParentModelAdmin):
class UserAdmin(admin.ModelAdmin):
form = UserForm
list_display = ('username', 'comment', 'registration_date', 'hash', 'server_count')
list_editable = ('hash', )
search_fields = ('username', 'hash')
readonly_fields = ('hash',)
@ -78,13 +116,40 @@ class UserAdmin(admin.ModelAdmin):
for server in selected_servers:
ACL.objects.get_or_create(user=obj, server=server)
@admin.register(AccessLog)
class AccessLogAdmin(admin.ModelAdmin):
list_display = ('user', 'server', 'action', 'formatted_timestamp')
list_filter = (UserNameFilter, ServerNameFilter, 'timestamp')
search_fields = ('accesslog__user', 'server', 'timestamp')
readonly_fields = ('server', 'user', 'formatted_timestamp', 'action', 'formated_data')
@admin.display(description='Timestamp')
def formatted_timestamp(self, obj):
local_time = localtime(obj.timestamp)
return local_time.strftime('%Y-%m-%d %H:%M:%S %Z')
@admin.display(description='Details')
def formated_data(self, obj):
return format_object(obj.data)
class ACLLinkInline(admin.TabularInline):
model = ACLLink
extra = 1
help_text = 'Add or change ACL links'
verbose_name = 'Dynamic link'
verbose_name_plural = 'Dynamic links'
fields = ('link',)
@admin.register(ACL)
class ACLAdmin(admin.ModelAdmin):
list_display = ('user', 'server', 'server_type', 'link', 'created_at')
list_filter = ('user', 'server__server_type')
search_fields = ('user__name', 'server__name', 'server__comment', 'user__comment', 'link')
readonly_fields = ('user_info', )
list_display = ('user', 'server', 'server_type', 'display_links', 'created_at')
list_editable = ('server', )
list_filter = (UserNameFilter, 'server__server_type', ServerNameFilter)
search_fields = ('user__name', 'server__name', 'server__comment', 'user__comment', 'links__link')
readonly_fields = ('user_info',)
inlines = [ACLLinkInline]
@admin.display(description='Server Type', ordering='server__server_type')
def server_type(self, obj):
@ -96,13 +161,12 @@ class ACLAdmin(admin.ModelAdmin):
user = obj.user
try:
data = server.get_user(user)
if isinstance(data, dict):
formatted_data = json.dumps(data, indent=2)
return mark_safe(f"<pre>{formatted_data}</pre>")
elif isinstance(data, str):
return mark_safe(f"<pre>{data}</pre>")
else:
return mark_safe(f"<pre>{str(data)}</pre>")
return format_object(data)
except Exception as e:
return mark_safe(f"<span style='color: red;'>Error: {e}</span>")
return mark_safe(f"<span style='color: red;'>Error: {e}</span>")
@admin.display(description='Links')
def display_links(self, obj):
links = obj.links.all()
return mark_safe('<br>'.join([link.link for link in links]))