From e1860050e0b6d984d486895bec74f61dcec65638 Mon Sep 17 00:00:00 2001 From: U039b Date: Sat, 21 Sep 2024 17:43:08 +0200 Subject: [PATCH] Add the status page --- colander/core/templatetags/colander_tags.py | 4 + colander/core/threatr.py | 16 +++ colander/core/views/status_views.py | 22 ++++ colander/static/css/project.css | 45 +++++--- .../scss/_custom_bootstrap_variables.scss | 14 ++- colander/templates/base.html | 9 +- colander/templates/helpers/square_pill.html | 1 + colander/templates/pages/status/base.html | 105 ++++++++++++++++++ .../templates/pages/status/module_card.html | 19 ++++ .../templates/pages/status/module_row.html | 16 +++ config/settings/base.py | 2 +- config/urls.py | 3 + 12 files changed, 234 insertions(+), 22 deletions(-) create mode 100644 colander/core/views/status_views.py create mode 100644 colander/templates/helpers/square_pill.html create mode 100644 colander/templates/pages/status/base.html create mode 100644 colander/templates/pages/status/module_card.html create mode 100644 colander/templates/pages/status/module_row.html diff --git a/colander/core/templatetags/colander_tags.py b/colander/core/templatetags/colander_tags.py index 646c3f6..88379e1 100644 --- a/colander/core/templatetags/colander_tags.py +++ b/colander/core/templatetags/colander_tags.py @@ -1,5 +1,6 @@ import json from base64 import urlsafe_b64encode +from datetime import timedelta from django import template @@ -35,6 +36,9 @@ def to_b64(instance): encoded = instance.encode('utf-8') return urlsafe_b64encode(encoded).decode().replace('=', '') +@register.filter(name="humanize_duration") +def to_humanized_duration(instance): + return "{:0>8}".format(str(timedelta(seconds=int(instance)))) @register.filter(name="to_cyberchef_input") def to_cyberchef_input(instance): diff --git a/colander/core/threatr.py b/colander/core/threatr.py index e7d21d0..b554992 100644 --- a/colander/core/threatr.py +++ b/colander/core/threatr.py @@ -54,6 +54,22 @@ def __load_credentials(self): credentials = credentials.first() self.api_key = credentials.credentials.get('api_key', '') + def get_status(self): + """ + Get the status of Threatr server. + :return: the status of Threatr + """ + status = { + 'configured': True + } + if not self.__correctly_configured: + status['configured'] = False + return status + response = requests.get(f'{self.url}/api/status/', headers=self.__get_headers()) + if response.status_code < 300: + status.update(response.json()) + return status + def get_types(self): """ Get all the types defined in Threatr models. diff --git a/colander/core/views/status_views.py b/colander/core/views/status_views.py new file mode 100644 index 0000000..7b0b148 --- /dev/null +++ b/colander/core/views/status_views.py @@ -0,0 +1,22 @@ +from django.conf import settings +from django.shortcuts import render + +from colander.core.threatr import ThreatrClient + + +def colander_status_view(request): + client = ThreatrClient() + colander_git_commit_hash = '' + try: + colander_git_commit_hash = settings.GIT_COMMIT_HASH + except: pass + return render( + request, + 'pages/status/base.html', + context={ + 'threatr': client.get_status(), + 'colander': { + 'git_commit_hash': colander_git_commit_hash + } + } + ) diff --git a/colander/static/css/project.css b/colander/static/css/project.css index 00c8d0d..1391902 100644 --- a/colander/static/css/project.css +++ b/colander/static/css/project.css @@ -1,3 +1,12 @@ +.text-success-light { + color: #5ace88; } + +.text-danger-light { + color: #fd7474; } + +.text-dark-light { + color: #696868; } + .bg-secondary-light { background-color: rgba(169, 145, 212, 0.1) !important; } @@ -38,7 +47,7 @@ --bs-gray-400: #cbc8d0; --bs-gray-500: #adb5bd; --bs-gray-600: #868e96; - --bs-gray-700: #444; + --bs-gray-700: #696868; --bs-gray-800: #343a40; --bs-gray-900: #17141F; --bs-primary: #7122da; @@ -59,7 +68,7 @@ --bs-dark-rgb: 23, 20, 31; --bs-white-rgb: 255, 255, 255; --bs-black-rgb: 0, 0, 0; - --bs-body-color-rgb: 68, 68, 68; + --bs-body-color-rgb: 105, 104, 104; --bs-body-bg-rgb: 255, 255, 255; --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; @@ -68,7 +77,7 @@ --bs-body-font-size: 0.8rem; --bs-body-font-weight: 400; --bs-body-line-height: 1.5; - --bs-body-color: #444; + --bs-body-color: #696868; --bs-body-bg: #fff; --bs-border-width: 1px; --bs-border-style: solid; @@ -1567,7 +1576,7 @@ progress { font-size: 0.8rem; font-weight: 400; line-height: 1.5; - color: #444; + color: #696868; background-color: #fff; background-clip: padding-box; border: 1px solid #cbc8d0; @@ -1582,7 +1591,7 @@ progress { .form-control[type="file"]:not(:disabled):not([readonly]) { cursor: pointer; } .form-control:focus { - color: #444; + color: #696868; background-color: #fff; border-color: #b891ed; outline: 0; @@ -1599,7 +1608,7 @@ progress { padding: 0.375rem 0.75rem; margin: -0.375rem -0.75rem; margin-inline-end: 0.75rem; - color: #444; + color: #696868; background-color: #F9F8FC; pointer-events: none; border-color: inherit; @@ -1620,7 +1629,7 @@ progress { padding: 0.375rem 0; margin-bottom: 0; line-height: 1.5; - color: #444; + color: #696868; background-color: transparent; border: solid transparent; border-width: 1px 0; } @@ -1683,7 +1692,7 @@ textarea.form-control-lg { font-size: 0.8rem; font-weight: 400; line-height: 1.5; - color: #444; + color: #696868; background-color: #fff; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); background-repeat: no-repeat; @@ -1707,7 +1716,7 @@ textarea.form-control-lg { background-color: #F9F8FC; } .form-select:-moz-focusring { color: transparent; - text-shadow: 0 0 0 #444; } + text-shadow: 0 0 0 #696868; } .form-select-sm { padding-top: 0.25rem; @@ -1968,7 +1977,7 @@ textarea.form-control-lg { font-size: 0.8rem; font-weight: 400; line-height: 1.5; - color: #444; + color: #696868; text-align: center; white-space: nowrap; background-color: #F9F8FC; @@ -2170,7 +2179,7 @@ textarea.form-control-lg { --bs-btn-font-size: 0.8rem; --bs-btn-font-weight: 400; --bs-btn-line-height: 1.5; - --bs-btn-color: #444; + --bs-btn-color: #696868; --bs-btn-bg: transparent; --bs-btn-border-width: 1px; --bs-btn-border-color: transparent; @@ -2568,7 +2577,7 @@ textarea.form-control-lg { --bs-dropdown-padding-y: 0.5rem; --bs-dropdown-spacer: 0.125rem; --bs-dropdown-font-size: 0.8rem; - --bs-dropdown-color: #444; + --bs-dropdown-color: #696868; --bs-dropdown-bg: #fff; --bs-dropdown-border-color: var(--bs-border-color-translucent); --bs-dropdown-border-radius: 0.375rem; @@ -2577,7 +2586,7 @@ textarea.form-control-lg { --bs-dropdown-divider-bg: var(--bs-border-color-translucent); --bs-dropdown-divider-margin-y: 0.6rem; --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - --bs-dropdown-link-color: #444; + --bs-dropdown-link-color: #696868; --bs-dropdown-link-hover-color: #fff; --bs-dropdown-link-hover-bg: #7122da; --bs-dropdown-link-active-color: #fff; @@ -2930,7 +2939,7 @@ textarea.form-control-lg { --bs-nav-tabs-border-color: #EDEDED; --bs-nav-tabs-border-radius: 0.375rem; --bs-nav-tabs-link-hover-border-color: #F9F8FC #F9F8FC #EDEDED; - --bs-nav-tabs-link-active-color: #444; + --bs-nav-tabs-link-active-color: #696868; --bs-nav-tabs-link-active-bg: #fff; --bs-nav-tabs-link-active-border-color: #EDEDED #EDEDED #fff; border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); } @@ -3879,10 +3888,10 @@ textarea.form-control-lg { --bs-list-group-border-radius: 0.375rem; --bs-list-group-item-padding-x: 1.2rem; --bs-list-group-item-padding-y: 0.6rem; - --bs-list-group-action-color: #444; - --bs-list-group-action-hover-color: #444; + --bs-list-group-action-color: #696868; + --bs-list-group-action-hover-color: #696868; --bs-list-group-action-hover-bg: #fafafa; - --bs-list-group-action-active-color: #444; + --bs-list-group-action-active-color: #696868; --bs-list-group-action-active-bg: #F9F8FC; --bs-list-group-disabled-color: #868e96; --bs-list-group-disabled-bg: #fff; @@ -4578,7 +4587,7 @@ textarea.form-control-lg { --bs-popover-header-bg: #e7e5ec; --bs-popover-body-padding-x: 0.6rem; --bs-popover-body-padding-y: 0.6rem; - --bs-popover-body-color: #444; + --bs-popover-body-color: #696868; --bs-popover-arrow-width: 1rem; --bs-popover-arrow-height: 0.5rem; --bs-popover-arrow-border: var(--bs-popover-border-color); diff --git a/colander/static/scss/_custom_bootstrap_variables.scss b/colander/static/scss/_custom_bootstrap_variables.scss index 3eee865..4244550 100644 --- a/colander/static/scss/_custom_bootstrap_variables.scss +++ b/colander/static/scss/_custom_bootstrap_variables.scss @@ -5,7 +5,7 @@ $gray-300: #EDEDED; $gray-400: #cbc8d0; $gray-500: #adb5bd; $gray-600: #868e96; -$gray-700: #444; +$gray-700: #696868; $gray-800: #343a40; $gray-900: #17141F; $black: #000; @@ -51,6 +51,18 @@ $popover-max-width: 512px; $popover-body-padding-x: 0.5*$spacer; $popover-body-padding-y: 0.5*$spacer; +.text-success-light { + color: mix(white, $success, 30%); +} + +.text-danger-light { + color: mix(white, $danger, 30%); +} + +.text-dark-light { + color: $gray-700; +} + .bg-secondary-light { background-color: rgba($secondary, 0.1) !important; } diff --git a/colander/templates/base.html b/colander/templates/base.html index a557eff..a1a3b73 100644 --- a/colander/templates/base.html +++ b/colander/templates/base.html @@ -63,11 +63,16 @@ {% block top_bar %}