#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ HTML шаблон WiFi GPS Mapper Report. Все страницы используют единый шаблон. В дальнейшем здесь будет располагаться: • CSS • JavaScript • Навигация • Каркас страниц • Footer """ from datetime import datetime, timezone from reports.utils import ( format_datetime as format_report_datetime, ) # ============================================================ # Report context # ============================================================ class ReportContext: def __init__( self, mode="static", page="root", ): if mode not in ( "static", "server", ): raise ValueError( f"Unknown report mode: {mode}" ) if page not in ( "root", "session", "trips", ): raise ValueError( f"Unknown report page: {page}" ) self.mode = mode self.page = page def session_page(self): return ReportContext( mode=self.mode, page="session", ) def home_url(self): if self.mode == "server": return "/" if self.page == "session": return "../index.html" return "index.html" def dashboard_url(self): if self.mode == "server": return "/reports/" if self.page == "session": return "../index.html" return "index.html" def capture_sessions_url(self): if self.mode == "server": return "/reports/sessions/" if self.page == "session": return "../capture_sessions.html" return "capture_sessions.html" def trips_url( self, ): if self.mode == "server": return "/reports/trips/" return "index.html" def search_url( self, ): if self.mode == "server": return "/reports/search/" return "index.html" def session_url( self, session_id, ): if self.mode == "server": return ( f"/reports/session/{session_id}" ) return ( f"sessions/{session_id}.html" ) def asset_url( self, path, ): path = str(path).lstrip("/") if self.mode == "server": return ( f"/reports/static/{path}" ) if self.page == "session": return ( f"../static/{path}" ) return ( f"static/{path}" ) # ============================================================ # HTML Header # ============================================================ def html_header( context=None, ): if context is None: context = ReportContext() return f""" WiFi GPS Mapper Report """ HTML_END = """ """ # ============================================================ # Navigation # ============================================================ def navigation( active="dashboard", context=None, ): if context is None: context = ReportContext() menu = [ ( "dashboard", "Dashboard", context.dashboard_url(), ), ( "capture_sessions", "Capture Sessions", context.capture_sessions_url(), ), ] if context.mode == "server": menu.append( ( "trips", "Trips", context.trips_url(), ) ) if context.mode == "server": menu.extend( [ ( "access_points", "Access Points", "/reports/access-points/", ), ( "vendors", "Vendors", "/reports/vendors/", ), ( "hashcat", "Hashes", "/reports/hashcat/", ), ] ) menu.append( ( "search", "Search", context.search_url(), ) ) html = """
WiFi GPS Mapper Wireless network scanner
""" return html # ============================================================ # Page begin # ============================================================ def page_begin( title, description="", active="dashboard", context=None, ): if context is None: context = ReportContext() html = html_header( context ) html += """
""" html += navigation( active, context, ) html += f"""

{title}

""" if description: html += f"""
{description}
""" return html # ============================================================ # Page header # ============================================================ def page_header( title, description="", ): html = f"""

{title}

""" if description: html += f"""
{description}
""" return html # ============================================================ # Page end # ============================================================ def page_end(): generated = format_report_datetime( datetime.now( timezone.utc ).isoformat() ) return f"""
{HTML_END} """ # ============================================================ # Card # ============================================================ def card( title, body ): return f"""

{title}

{body}
""" # ============================================================ # Info # ============================================================ def info(text): return f"""
{text}
""" # ============================================================ # Badge # ============================================================ def badge( text, color="gray" ): return f""" {text} """ # ============================================================ # Button # ============================================================ def button( title, url ): return f""" {title} """ # ============================================================ # Statistics card # ============================================================ def stat( value, title ): return f"""
{value}
{title}
""" # ============================================================ # Statistics grid # ============================================================ def stats_grid(items): html = """
""" html += "".join(items) html += """
""" return html # ============================================================ # Search field # ============================================================ def search_box( table_id, placeholder="Search..." ): return f""" """ # ============================================================ # Table container # ============================================================ def table_container(content): return f"""
{content}
""" # ============================================================ # Horizontal separator # ============================================================ def hr(): return "
"