Implement getting alerts in overview
This commit is contained in:
parent
f52d01d6f7
commit
04d4cee222
|
@ -40,6 +40,7 @@ from core.views.manage.threshold.irc import (
|
||||||
ThresholdIRCNetworkRelays,
|
ThresholdIRCNetworkRelays,
|
||||||
ThresholdIRCNetworkRelayStatus,
|
ThresholdIRCNetworkRelayStatus,
|
||||||
ThresholdIRCNetworks,
|
ThresholdIRCNetworks,
|
||||||
|
ThresholdIRCOverviewAlerts,
|
||||||
ThresholdIRCStats,
|
ThresholdIRCStats,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -101,6 +102,11 @@ urlpatterns = [
|
||||||
ThresholdIRCStats.as_view(),
|
ThresholdIRCStats.as_view(),
|
||||||
name="threshold_irc_stats",
|
name="threshold_irc_stats",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"manage/threshold/irc/overview/alerts/",
|
||||||
|
ThresholdIRCOverviewAlerts.as_view(),
|
||||||
|
name="threshold_irc_overview_alerts",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"manage/threshold/irc/overview/networks/",
|
"manage/threshold/irc/overview/networks/",
|
||||||
ThresholdIRCNetworks.as_view(),
|
ThresholdIRCNetworks.as_view(),
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from core.lib.opensearch import client, run_main_query
|
||||||
from core.lib.threshold import threshold_request
|
from core.lib.threshold import threshold_request
|
||||||
|
|
||||||
|
|
||||||
|
@ -139,3 +142,56 @@ def del_network(net):
|
||||||
payload = {}
|
payload = {}
|
||||||
deleted = threshold_request(url, payload, method="DELETE")
|
deleted = threshold_request(url, payload, method="DELETE")
|
||||||
return deleted
|
return deleted
|
||||||
|
|
||||||
|
|
||||||
|
def construct_alert_query():
|
||||||
|
# Get the initial query
|
||||||
|
query = {
|
||||||
|
"size": 25,
|
||||||
|
"query": {
|
||||||
|
"bool": {
|
||||||
|
"must": [
|
||||||
|
{"match": {"src": "irc"}},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sort": [
|
||||||
|
{
|
||||||
|
"ts": {
|
||||||
|
"order": "desc",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
return query
|
||||||
|
|
||||||
|
|
||||||
|
def get_irc_alerts(user):
|
||||||
|
query = construct_alert_query()
|
||||||
|
print("QUERY1", query)
|
||||||
|
results = run_main_query(
|
||||||
|
client,
|
||||||
|
user, # passed through run_main_query to filter_blacklisted
|
||||||
|
query,
|
||||||
|
custom_query=True,
|
||||||
|
index=settings.OPENSEARCH_INDEX_INT,
|
||||||
|
)
|
||||||
|
print("ALERTS", results)
|
||||||
|
if not results:
|
||||||
|
return []
|
||||||
|
results_parsed = []
|
||||||
|
if "hits" in results.keys():
|
||||||
|
if "hits" in results["hits"]:
|
||||||
|
for item in results["hits"]["hits"]:
|
||||||
|
element = item["_source"]
|
||||||
|
element["id"] = item["_id"]
|
||||||
|
|
||||||
|
# Split the timestamp into date and time
|
||||||
|
ts = element["ts"]
|
||||||
|
ts_spl = ts.split("T")
|
||||||
|
date = ts_spl[0]
|
||||||
|
time = ts_spl[1]
|
||||||
|
element["date"] = date
|
||||||
|
element["time"] = time
|
||||||
|
results_parsed.append(element)
|
||||||
|
return results_parsed
|
||||||
|
|
|
@ -123,7 +123,8 @@ def run_main_query(client, user, query, custom_query=False, index=None, size=Non
|
||||||
search_query = construct_query(query, size)
|
search_query = construct_query(query, size)
|
||||||
try:
|
try:
|
||||||
response = client.search(body=search_query, index=index)
|
response = client.search(body=search_query, index=index)
|
||||||
except RequestError:
|
except RequestError as err:
|
||||||
|
print(err)
|
||||||
return False
|
return False
|
||||||
filter_blacklisted(user, response)
|
filter_blacklisted(user, response)
|
||||||
return response
|
return response
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
<div id="alerts">
|
||||||
|
{% include 'manage/threshold/partials/notify.html' %}
|
||||||
|
{% if alerts is not None %}
|
||||||
|
<div class="icons">
|
||||||
|
<button
|
||||||
|
class="button is-small">
|
||||||
|
<span class="icon" data-tooltip="Conn">
|
||||||
|
<i class="fa-solid fa-cloud-exclamation"></i>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="button is-small">
|
||||||
|
<span class="icon" data-tooltip="Highlight">
|
||||||
|
<i class="fa-solid fa-square-quote"></i>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="button is-small">
|
||||||
|
<span class="icon" data-tooltip="ZNC">
|
||||||
|
<i class="fa-brands fa-unity"></i>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="button is-small">
|
||||||
|
<span class="icon" data-tooltip="Query">
|
||||||
|
<i class="fa-solid fa-inbox"></i>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="button is-small">
|
||||||
|
<span class="icon" data-tooltip="Self">
|
||||||
|
<i class="fa-solid fa-message-bot"></i>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="content" style="max-height: 30em; overflow: auto;">
|
||||||
|
|
||||||
|
<div class="table-container">
|
||||||
|
<table class="table is-fullwidth is-hoverable">
|
||||||
|
<thead>
|
||||||
|
<th>ts</th>
|
||||||
|
<th>name</th>
|
||||||
|
<th>type</th>
|
||||||
|
<th>msg</th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for alert in alerts %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>{{ alert.date }}</p>
|
||||||
|
<p>{{ alert.time }}</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ alert.net }}/{{ alert.num }}
|
||||||
|
<td>
|
||||||
|
{% if alert.type == 'conn' %}
|
||||||
|
<span class="icon" data-tooltip="Conn">
|
||||||
|
<i class="fa-solid fa-cloud-exclamation"></i>
|
||||||
|
</span>
|
||||||
|
{% elif alert.type == 'highlight' %}
|
||||||
|
<span class="icon" data-tooltip="Highlight">
|
||||||
|
<i class="fa-solid fa-square-quote"></i>
|
||||||
|
</span>
|
||||||
|
{% elif alert.type == 'znc' %}
|
||||||
|
<span class="icon" data-tooltip="ZNC">
|
||||||
|
<i class="fa-brands fa-unity"></i>
|
||||||
|
</span>
|
||||||
|
{% elif alert.type == 'query' %}
|
||||||
|
<span class="icon" data-tooltip="Query">
|
||||||
|
<i class="fa-solid fa-inbox"></i>
|
||||||
|
</span>
|
||||||
|
{% elif alert.type == 'self' %}
|
||||||
|
<span class="icon" data-tooltip="Self">
|
||||||
|
<i class="fa-solid fa-message-bot"></i>
|
||||||
|
</span>
|
||||||
|
{% else %}
|
||||||
|
{{ alert.type }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td style="max-width: 10em" class="wrap">{{ alert.msg }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
|
@ -37,6 +37,15 @@
|
||||||
hx-swap="outerHTML">
|
hx-swap="outerHTML">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style="display: none;"
|
||||||
|
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||||
|
hx-get="{% url 'threshold_irc_overview_alerts' %}"
|
||||||
|
hx-trigger="load"
|
||||||
|
hx-target="#alerts"
|
||||||
|
hx-swap="outerHTML">
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
|
@ -62,7 +71,6 @@
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div id="alerts">
|
<div id="alerts">
|
||||||
Alerts here
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -16,6 +16,15 @@ class ThresholdIRCStats(SuperUserRequiredMixin, View):
|
||||||
return render(request, self.stats_template, context)
|
return render(request, self.stats_template, context)
|
||||||
|
|
||||||
|
|
||||||
|
class ThresholdIRCOverviewAlerts(SuperUserRequiredMixin, View):
|
||||||
|
stats_template = "manage/threshold/irc/overview/alerts.html"
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
alerts = threshold.get_irc_alerts(request.user)
|
||||||
|
context = {"alerts": alerts}
|
||||||
|
return render(request, self.stats_template, context)
|
||||||
|
|
||||||
|
|
||||||
class ThresholdIRCNetworks(SuperUserRequiredMixin, View):
|
class ThresholdIRCNetworks(SuperUserRequiredMixin, View):
|
||||||
template_name = "manage/threshold/irc/overview/networks.html"
|
template_name = "manage/threshold/irc/overview/networks.html"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue