Skip to content

Commit 7b9ec04

Browse files
committed
Changes to the WebGUI: changes to jinja2 templates, uses FastAPI server, hides login button when session_store is null, fixes double slash issue.
1 parent dfb4d0f commit 7b9ec04

20 files changed

+361
-334
lines changed

intelmq/app/server.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import os
88
import gunicorn.app.base
99
import uvicorn
10+
import pathlib
1011

1112
from fastapi import FastAPI
13+
from fastapi.staticfiles import StaticFiles
1214
from fastapi.middleware.cors import CORSMiddleware
1315
from uvicorn.workers import UvicornH11Worker
1416

@@ -18,6 +20,7 @@
1820

1921
from intelmq.app.config import Config
2022
from intelmq.app.api.router import router as api_router
23+
from intelmq.app.webgui.router import router as web_router
2124

2225

2326
class IntelMQUvicornWorker(UvicornH11Worker):
@@ -58,6 +61,11 @@ def init_app():
5861
app.add_middleware(CORSMiddleware, allow_origins=config.allow_origins, allow_methods=("GET", "POST"))
5962
app.include_router(api_router, prefix="/api/v1")
6063

64+
if config.enable_webgui:
65+
static_files = pathlib.Path(__file__).parent / "webgui" / "static"
66+
app.mount("/static", StaticFiles(directory=static_files), name="static")
67+
app.include_router(web_router)
68+
6169
intelmq.app.api.exceptions.register(app)
6270

6371

intelmq/app/webgui/__init__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +0,0 @@
1-
"""Python __init__ file that provides the path to the module
2-
3-
SPDX-FileCopyrightText: 2020 IntelMQ Team <intelmq-team@cert.at>
4-
SPDX-License-Identifier: AGPL-3.0-or-later
5-
6-
"""
7-
import pathlib
8-
from .version import __version__, __version_info__ # noqa
9-
10-
path = pathlib.Path(__file__).parent

intelmq/app/webgui/build.py

Lines changed: 0 additions & 60 deletions
This file was deleted.

intelmq/app/webgui/router.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# SPDX-FileCopyrightText: 2023 IntelMQ Team
2+
# SPDX-License-Identifier: AGPL-3.0-or-later
3+
import collections
4+
import pathlib
5+
6+
from fastapi import APIRouter, Request, Depends
7+
from fastapi.responses import HTMLResponse
8+
from fastapi.templating import Jinja2Templates
9+
10+
from intelmq.app.config import Config
11+
from intelmq.app.dependencies import app_config
12+
13+
router = APIRouter(default_response_class=HTMLResponse)
14+
templates_dir = pathlib.Path(__file__).parent / "templates"
15+
templates = Jinja2Templates(directory=templates_dir)
16+
Page = collections.namedtuple("Page", ["name", "title", "url", "icon_url"])
17+
18+
19+
def get_pages(request: Request):
20+
return [
21+
Page(
22+
name="configs",
23+
title="Configuration",
24+
url=request.url_for('get_configuration'),
25+
icon_url=request.url_for('static', path='images/configuration.png'),
26+
),
27+
Page(
28+
name="management",
29+
title="Management",
30+
url=request.url_for('get_management'),
31+
icon_url=request.url_for('static', path='images/management.png'),
32+
),
33+
Page(
34+
name="monitor",
35+
title="Monitor",
36+
url=request.url_for('get_monitor'),
37+
icon_url=request.url_for('static', path='images/monitor.png'),
38+
),
39+
Page(
40+
name="check",
41+
title="Check",
42+
url=request.url_for('get_check'),
43+
icon_url=request.url_for('static', path='images/check.png'),
44+
),
45+
Page(
46+
name="about",
47+
title="About",
48+
url=request.url_for('get_about'),
49+
icon_url=request.url_for('static', path='images/about.png'),
50+
)
51+
]
52+
53+
54+
@router.get("/", include_in_schema=False)
55+
async def get_index(request: Request, config: Config = Depends(app_config)):
56+
return templates.TemplateResponse("index.html", {
57+
"request": request,
58+
"pages": get_pages(request),
59+
"config": config
60+
})
61+
62+
63+
@router.get("/configuration", include_in_schema=False)
64+
async def get_configuration(request: Request, config: Config = Depends(app_config)):
65+
return templates.TemplateResponse("configuration.html", {
66+
"request": request,
67+
"pages": get_pages(request),
68+
"config": config
69+
})
70+
71+
72+
@router.get("/management", include_in_schema=False)
73+
def get_management(request: Request, config: Config = Depends(app_config)):
74+
return templates.TemplateResponse("management.html", {
75+
"request": request,
76+
"pages": get_pages(request),
77+
"config": config
78+
})
79+
80+
81+
@router.get("/monitor", include_in_schema=False)
82+
def get_monitor(request: Request, config: Config = Depends(app_config)):
83+
return templates.TemplateResponse("monitor.html", {
84+
"request": request,
85+
"pages": get_pages(request),
86+
"config": config
87+
})
88+
89+
90+
@router.get("/check", include_in_schema=False)
91+
def get_check(request: Request, config: Config = Depends(app_config)):
92+
return templates.TemplateResponse("check.html", {
93+
"request": request,
94+
"pages": get_pages(request),
95+
"config": config
96+
})
97+
98+
99+
@router.get("/about", include_in_schema=False)
100+
def get_about(request: Request, config: Config = Depends(app_config)):
101+
return templates.TemplateResponse("about.html", {
102+
"request": request,
103+
"pages": get_pages(request),
104+
"config": config
105+
})

intelmq/app/webgui/static/js/about.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,10 @@
55

66
function get_versions() {
77
let intelmq_version_element = document.getElementById('intelmq-version');
8-
let intelmq_api_version_element = document.getElementById('intelmq-api-version');
9-
let intelmq_manager_version_element = document.getElementById('intelmq-manager-version');
108

119
authenticatedGetJson(managementUrl('version'))
1210
.done(function (data) {
1311
intelmq_version_element.innerHTML = data.intelmq;
14-
intelmq_api_version_element.innerHTML = data['intelmq-api'];
15-
intelmq_manager_version_element.innerHTML = '3.2.0';
1612
})
1713
.fail(function (jqxhr, textStatus, error) {
1814
let err = `${textStatus}, ${error}`;

intelmq/app/webgui/static/js/configs.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ var documentation = null;
3030
var span = null;
3131
var table = null;
3232
var disabledKeys = ['group', 'name', 'module'];
33-
var $manipulation, $saveButton; // jQuery of Vis control panel; elements reseted with network
33+
var $manipulation, $saveButton; // jQuery of Vis control panel; elements reset with network
3434
var node = null;
3535

3636
var $EDIT_DEFAULT_BUTTON = $("#editDefaults");
@@ -544,7 +544,7 @@ function saveData(data, callback) {
544544

545545
saveFormData();
546546

547-
// check inputs beeing valid
547+
// check inputs being valid
548548
if (node.bot_id === '' && node.group === '') {
549549
show_error('fields id and group must not be empty!');
550550
return;
@@ -740,7 +740,7 @@ function draw() {
740740
initNetwork();
741741
if (window.location.hash) {
742742
let node = window.location.hash.substr(1);
743-
setTimeout(() => { // doesnt work immediately, I don't know why. Maybe a js guru would bind to visjs onready if that exists or sth.
743+
setTimeout(() => { // doesn't work immediately, I don't know why. Maybe a js guru would bind to visjs onready if that exists or sth.
744744
try {
745745
fitNode(node);
746746
} catch (e) {

intelmq/app/webgui/static/js/intelmq-manager.js

Lines changed: 0 additions & 29 deletions
This file was deleted.

intelmq/app/webgui/static/js/static.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ var LOAD_X_LOG_LINES = 30;
7676

7777
var MESSAGE_LENGTH = 200;
7878

79-
var MONITOR_BOT_URL = "monitor.html?bot_id={0}";
79+
var MONITOR_BOT_URL = "monitor?bot_id={0}";
8080

8181
var page_is_exiting = false;
8282

0 commit comments

Comments
 (0)