Merge pull request #1097 from bunkerity/dev

Merge branch "dev" into branch "staging"
This commit is contained in:
Théophile Diot 2024-04-16 17:51:02 +01:00 committed by GitHub
commit a8539c73f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
169 changed files with 1939 additions and 1317 deletions

View file

@ -35,12 +35,12 @@ jobs:
python -m pip install --no-cache-dir --require-hashes -r src/common/db/requirements.txt
echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV
- name: Initialize CodeQL
uses: github/codeql-action/init@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9
uses: github/codeql-action/init@df5a14dc28094dc936e103b37d749c6628682b60 # v3.25.0
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql.yml
setup-python-dependencies: false
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9
uses: github/codeql-action/analyze@df5a14dc28094dc936e103b37d749c6628682b60 # v3.25.0
with:
category: "/language:${{matrix.language}}"

View file

@ -63,10 +63,10 @@ jobs:
SSH_IP: ${{ secrets.ARM_SSH_IP }}
SSH_CONFIG: ${{ secrets.ARM_SSH_CONFIG }}
- name: Setup Buildx
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0
if: inputs.CACHE_SUFFIX != 'arm'
- name: Setup Buildx (ARM)
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0
if: inputs.CACHE_SUFFIX == 'arm'
with:
endpoint: ssh://root@arm

View file

@ -36,7 +36,7 @@ jobs:
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Get ARM availabilities
id: availabilities
uses: scaleway/action-scw@c718eca1fcb9fec1fb1433752d61599c6a0ad2e9
uses: scaleway/action-scw@be2696f261325a78354eda14988c80405f33e082
with:
args: instance server-type get zone=fr-par-2
export-config: true
@ -53,7 +53,7 @@ jobs:
JSON: ${{ steps.availabilities.outputs.json }}
- name: Create ARM VM
id: scw
uses: scaleway/action-scw@c718eca1fcb9fec1fb1433752d61599c6a0ad2e9
uses: scaleway/action-scw@be2696f261325a78354eda14988c80405f33e082
with:
args: instance server create zone=fr-par-2 type=${{ env.TYPE }} root-volume=block:50GB
- name: Get info
@ -62,7 +62,7 @@ jobs:
echo "id=${{ fromJson(steps.scw.outputs.json).id }}" >> "$GITHUB_OUTPUT"
echo "ip=${{ fromJson(steps.scw.outputs.json).public_ip.address }}" >> "$GITHUB_OUTPUT"
- name: Wait for VM
uses: scaleway/action-scw@c718eca1fcb9fec1fb1433752d61599c6a0ad2e9
uses: scaleway/action-scw@be2696f261325a78354eda14988c80405f33e082
with:
args: instance server wait ${{ fromJson(steps.scw.outputs.json).ID }} zone=fr-par-2
- name: Wait for SSH

View file

@ -52,7 +52,7 @@ jobs:
rm -f asn.mmdb country.mmdb
gunzip asn.mmdb.gz country.mmdb.gz
- name: Commit and push changes
uses: stefanzweifel/git-auto-commit-action@8756aa072ef5b4a080af5dc8fef36c5d586e521d # v5.0.0
uses: stefanzweifel/git-auto-commit-action@8621497c8c39c72f3e2a999a26b4ca1b5058a842 # v5.0.1
with:
branch: dev
commit_message: "Monthly mmdb update"

View file

@ -72,10 +72,10 @@ jobs:
SSH_IP: ${{ secrets.ARM_SSH_IP }}
SSH_CONFIG: ${{ secrets.ARM_SSH_CONFIG }}
- name: Setup Buildx
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0
if: startsWith(env.ARCH, 'arm') == false
- name: Setup Buildx (ARM)
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0
if: startsWith(env.ARCH, 'arm') == true
with:
endpoint: ssh://root@arm

View file

@ -58,7 +58,7 @@ jobs:
SSH_IP: ${{ secrets.ARM_SSH_IP }}
SSH_CONFIG: ${{ secrets.ARM_SSH_CONFIG }}
- name: Setup Buildx (ARM)
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0
with:
endpoint: ssh://root@arm
platforms: linux/arm64,linux/arm/v7,linux/arm/v6

View file

@ -23,7 +23,7 @@ jobs:
- name: Checkout source code
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Delete ARM VM
uses: scaleway/action-scw@c718eca1fcb9fec1fb1433752d61599c6a0ad2e9
uses: scaleway/action-scw@be2696f261325a78354eda14988c80405f33e082
with:
args: instance server delete ${{ secrets.ARM_ID }} zone=fr-par-2 with-ip=true with-volumes=all force-shutdown=true
access-key: ${{ secrets.SCW_ACCESS_KEY }}

View file

@ -25,6 +25,6 @@ jobs:
results_format: sarif
publish_results: true
- name: "Upload SARIF results to code scanning"
uses: github/codeql-action/upload-sarif@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9
uses: github/codeql-action/upload-sarif@df5a14dc28094dc936e103b37d749c6628682b60 # v3.25.0
with:
sarif_file: results.sarif

View file

@ -25,7 +25,7 @@ jobs:
- name: Install terraform
uses: hashicorp/setup-terraform@a1502cd9e758c50496cc9ac5308c4843bcd56d36 # v3.0.0
- name: Install kubectl
uses: azure/setup-kubectl@901a10e89ea615cf61f57ac05cecdf23e7de06d8 # v3.2
uses: azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
if: inputs.TYPE == 'k8s'
with:
version: "v1.28.6"

View file

@ -34,7 +34,7 @@ jobs:
tar xf /tmp/terraform.tar -C / && mkdir ~/.ssh && touch ~/.ssh/id_rsa.pub
env:
SECRET_KEY: ${{ secrets.SECRET_KEY }}
- uses: azure/setup-kubectl@901a10e89ea615cf61f57ac05cecdf23e7de06d8 # v3.2
- uses: azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
if: inputs.TYPE == 'k8s'
with:
version: "v1.28.2"

View file

@ -66,11 +66,11 @@ jobs:
REG_USER: ${{ github.actor }}
REG_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: inputs.TYPE == 'k8s'
- uses: azure/setup-kubectl@901a10e89ea615cf61f57ac05cecdf23e7de06d8 # v3.2
- uses: azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4.0.0
if: inputs.TYPE == 'k8s'
with:
version: "v1.28.2"
- uses: azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # v3.5
- uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # v4.2.0
if: inputs.TYPE == 'k8s'
- name: Pull BW linux ubuntu test image
if: inputs.TYPE == 'linux'

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 910 KiB

After

Width:  |  Height:  |  Size: 911 KiB

View file

@ -1,5 +1,5 @@
mike==2.0.0
mkdocs==1.5.3
mkdocs-material[imaging]==9.5.17
mkdocs-print-site-plugin==2.3.6
mkdocs-material[imaging]==9.5.18
mkdocs-print-site-plugin==2.4.0
pytablewriter==1.2.0

View file

@ -196,9 +196,9 @@ ghp-import==2.1.0 \
--hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \
--hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343
# via mkdocs
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
importlib-metadata==7.1.0 \
--hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \
@ -311,9 +311,9 @@ mkdocs==1.5.3 \
# -r requirements.in
# mike
# mkdocs-material
mkdocs-material==9.5.17 \
--hash=sha256:06ae1275a72db1989cf6209de9e9ecdfbcfdbc24c58353877b2bb927dbe413e4 \
--hash=sha256:14a2a60119a785e70e765dd033e6211367aca9fc70230e577c1cf6a326949571
mkdocs-material==9.5.18 \
--hash=sha256:1e0e27fc9fe239f9064318acf548771a4629d5fd5dfd45444fd80a953fe21eb4 \
--hash=sha256:a43f470947053fa2405c33995f282d24992c752a50114f23f30da9d8d0c57e62
# via
# -r requirements.in
# mkdocs-print-site-plugin
@ -321,9 +321,9 @@ mkdocs-material-extensions==1.3.1 \
--hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \
--hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31
# via mkdocs-material
mkdocs-print-site-plugin==2.3.6 \
--hash=sha256:01ccb1ceccc87f29e1612bebb77c3bf9980809fbce750fc2113f9d6acea589d4 \
--hash=sha256:82e5cabcfb7fe3074daecea018f28ccb4bff086f965e3103fe91019a76752f22
mkdocs-print-site-plugin==2.4.0 \
--hash=sha256:2257e8116cdea6c4063a2bbd84c8cf00ace62de4cb2e09516124a08c20fc2033 \
--hash=sha256:b44d4533c5be8bd4676d61ff9b8a946dc340ef5e745a8c60fe1072e22032b2d8
# via -r requirements.in
packaging==24.0 \
--hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \
@ -613,9 +613,9 @@ requests==2.31.0 \
# importlib-resources
# The following packages are considered to be unsafe in a requirements file:
setuptools==69.2.0 \
--hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \
--hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c
setuptools==69.5.1 \
--hash=sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987 \
--hash=sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32
# via mkdocs-material
six==1.16.0 \
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c as builder
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb as builder
# Export var for specific actions on linux/arm/v7
ARG TARGETPLATFORM
@ -31,7 +31,7 @@ COPY src/common/helpers helpers
COPY src/common/settings.json settings.json
COPY src/common/utils utils
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("antibot")
@ -10,8 +13,12 @@ def pre_render(**kwargs):
"svg_color": "blue",
}
}
except:
return {"counter_failed_challenges": {"value": "unknown", "title": "Challenge", "subtitle": "Failed", "subtitle_color": "info", "svg_color": "blue"}}
except BaseException:
print(format_exc(), flush=True)
return {
"counter_failed_challenges": {"value": "unknown", "title": "Challenge", "subtitle": "Failed", "subtitle_color": "info", "svg_color": "blue"},
"error": format_exc(),
}
def antibot(**kwargs):

View file

@ -10,27 +10,25 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#antibot" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}
{% for key, value in pre_render["data"].items() %}
{% if key.startswith("ping_") %}
<div class="core-card-status">
<div class="core-card-status-container">

View file

@ -1,5 +1,6 @@
from datetime import datetime
from json import loads
from traceback import format_exc
def pre_render(app, *args, **kwargs):
@ -10,8 +11,9 @@ def pre_render(app, *args, **kwargs):
data["date"] = datetime.fromisoformat(data["date"]).strftime("%Y-%m-%d %H:%M:%S")
return data
except:
return {"date": None, "files": []}
except BaseException:
print(format_exc(), flush=True)
return {"date": None, "files": [], "error": format_exc()}
def backup(**kwargs):

View file

@ -10,55 +10,53 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{ plugin.get("description") }}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#backup-and-restore" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info -->
<div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}
<div class="core-card">
<div class="core-card-wrap">
<h5 class="core-card-title">Last Backup</h5>
<h5 class="core-card-title">LAST BACKUP</h5>
</div>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{ pre_render["data"]["date"] }}</p>
<p data-info class="core-card-text">{{ pre_render["data"].get("date", "No backup found") }}</p>
</div>
</div>
<div class="core-card-list">
<div class="core-card-list-title-container">
<h5 class="core-card-list-title">Backup files</h5>
</div>
<div class="core-card-list-container">
<!-- list container-->
<div class="core-card-list-wrap">
<!-- list -->
<ul class="col-span-12 w-full">
{% for item in pre_render['data']["files"] %}
<li class="core-card-list-item">
<p class="core-card-list-item-content col-span-12">{{ item }}</p>
</li>
{% endfor %}
</ul>
<!-- end list-->
{% if pre_render['data'].get("files", [])|length > 0 %}
<div class="core-layout-separator"></div>
<div class="core-card-list">
<div class="core-card-list-title-container">
<h5 class="core-card-list-title">BACKUP FILES</h5>
</div>
<div class="core-card-list-container">
<!-- list container-->
<div class="core-card-list-wrap">
<!-- list -->
<ul class="col-span-12 w-full">
{% for item in pre_render['data']["files"] %}
<li class="core-card-list-item">
<p class="core-card-list-item-content col-span-12">{{ item }}</p>
</li>
{% endfor %}
</ul>
<!-- end list-->
</div>
<!-- end list container-->
</div>
<!-- end list container-->
</div>
</div>
{% endif %}
{% endif %}
{% else %}
<div class="core-card">

View file

@ -1,4 +1,5 @@
from operator import itemgetter
from traceback import format_exc
def pre_render(**kwargs):
@ -9,8 +10,9 @@ def pre_render(**kwargs):
format_data = [{"code": int(key.split("_")[1]), "count": int(value)} for key, value in data.items()]
format_data.sort(key=itemgetter("count"), reverse=True)
return {"top_bad_behavior": format_data}
except:
return {"top_bad_behavior": "unknown"}
except BaseException:
print(format_exc(), flush=True)
return {"top_bad_behavior": "unknown", "error": format_exc()}
def badbehavior(**kwargs):

View file

@ -10,19 +10,25 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available
<a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#bad-behavior" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">
in the documentation
</a>
.
</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
metrics = {
"counter_blacklist_url": {"value": "unknown", "title": "URL", "subtitle": "denied", "subtitle_color": "error", "svg_color": "red"},
@ -12,7 +15,9 @@ def pre_render(**kwargs):
for key in metrics:
metrics[key]["value"] = data.get(key, 0)
return metrics
except:
except BaseException:
print(format_exc(), flush=True)
metrics["error"] = format_exc()
return metrics

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#blacklisting" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,9 +1,13 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
ping_data = kwargs["app"].config["INSTANCES"].get_ping("bunkernet")
return {"ping_status": {"title": "BUNKERNET STATUS", "value": ping_data["status"]}}
except:
return {"ping_status": {"title": "BUNKERNET STATUS", "value": "error"}}
except BaseException:
print(format_exc(), flush=True)
return {"ping_status": {"title": "BUNKERNET STATUS", "value": "error"}, "error": format_exc()}
def bunkernet(**kwargs):

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#bunkernet" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("cors")
@ -11,8 +14,12 @@ def pre_render(**kwargs):
}
}
except:
return {"counter_failed_cors": {"value": "unknown", "title": "CORS", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"}}
except BaseException:
print(format_exc(), flush=True)
return {
"counter_failed_cors": {"value": "unknown", "title": "CORS", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
"error": format_exc(),
}
def cors(**kwargs):

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#cors" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("country")
@ -10,9 +13,11 @@ def pre_render(**kwargs):
"svg_color": "red",
}
}
except:
except BaseException:
print(format_exc(), flush=True)
return {
"counter_failed_country": {"value": "unknown", "title": "Country", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"}
"counter_failed_country": {"value": "unknown", "title": "Country", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
"error": format_exc(),
}

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#country" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("dnsbl")
@ -10,8 +13,12 @@ def pre_render(**kwargs):
"svg_color": "red",
}
}
except:
return {"counter_failed_dnsbl": {"value": "unknown", "title": "DNSBL", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"}}
except BaseException:
print(format_exc(), flush=True)
return {
"counter_failed_dnsbl": {"value": "unknown", "title": "DNSBL", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
"error": format_exc(),
}
def dnsbl(**kwargs):

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#dnsbl" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,4 +1,5 @@
from operator import itemgetter
from traceback import format_exc
def pre_render(**kwargs):
@ -9,8 +10,9 @@ def pre_render(**kwargs):
format_data = [{"code": int(key.split("_")[1]), "count": int(value)} for key, value in data.items()]
format_data.sort(key=itemgetter("count"), reverse=True)
return {"top_errors": format_data}
except:
return {"top_errors": []}
except BaseException:
print(format_exc(), flush=True)
return {"top_errors": [], "error": format_exc()}
def errors(**kwargs):

View file

@ -9,20 +9,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/settings/#errors" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("greylist")
@ -10,9 +13,11 @@ def pre_render(**kwargs):
"svg_color": "red",
}
}
except:
except BaseException:
print(format_exc(), flush=True)
return {
"counter_failed_greylist": {"value": "unknown", "title": "GREYLIST", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"}
"counter_failed_greylist": {"value": "unknown", "title": "GREYLIST", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
"error": format_exc(),
}

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#greylisting" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,4 +1,5 @@
from operator import itemgetter
from traceback import format_exc
def pre_render(**kwargs):
@ -16,8 +17,9 @@ def pre_render(**kwargs):
format_data.append({"url": f"/{key}", "count": int(value)})
format_data.sort(key=itemgetter("count"), reverse=True)
return {"top_limit": format_data}
except:
return {"top_limit": []}
except BaseException:
print(format_exc(), flush=True)
return {"top_limit": [], "error": format_exc()}
def limit(**kwargs):

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#limiting" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("misc")
@ -18,8 +21,8 @@ def pre_render(**kwargs):
"svg_color": "lime",
},
}
except:
except BaseException:
print(format_exc(), flush=True)
return {
"counter_failed_default": {
"value": "unknown",
@ -29,6 +32,7 @@ def pre_render(**kwargs):
"svg_color": "sky",
},
"counter_failed_method": {"value": "unknown", "title": "DISALLOWED METHODS", "subtitle": "count", "subtitle_color": "info", "svg_color": "lime"},
"error": format_exc(),
}

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/settings/#miscellaneous" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,10 +1,16 @@
from traceback import format_exc
def pre_render(**kwargs):
ping = {}
data = {}
error = ""
try:
ping_data = kwargs["app"].config["INSTANCES"].get_ping("redis")
ping = {"ping_status": {"title": "REDIS STATUS", "value": ping_data["status"]}}
except:
except BaseException:
print(format_exc(), flush=True)
error = format_exc()
ping = {"ping_status": {"title": "REDIS STATUS", "value": "error"}}
try:
@ -19,9 +25,14 @@ def pre_render(**kwargs):
}
}
except:
except BaseException:
print(format_exc(), flush=True)
error += format_exc()
data = {"counter_redis_nb_keys": {"value": "unknown", "title": "REDIS KEYS", "subtitle": "total number", "subtitle_color": "info", "svg_color": "sky"}}
if error:
return ping | data | {"error": error}
return ping | data

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/settings/#redis" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,4 +1,5 @@
from operator import itemgetter
from traceback import format_exc
def pre_render(**kwargs):
@ -9,8 +10,9 @@ def pre_render(**kwargs):
format_data = [{"port": int(key.split("_")[1]), "count": int(value)} for key, value in data.items()]
format_data.sort(key=itemgetter("count"), reverse=True)
return {"top_reverse_scan": format_data}
except:
return {"top_reverse_scan": []}
except BaseException:
print(format_exc(), flush=True)
return {"top_reverse_scan": [], "error": format_exc()}
def reversescan(**kwargs):

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#reverse-scan" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -1,3 +1,6 @@
from traceback import format_exc
def pre_render(**kwargs):
try:
data = kwargs["app"].config["INSTANCES"].get_metrics("whitelist")
@ -11,7 +14,8 @@ def pre_render(**kwargs):
}
}
except:
except BaseException:
print(format_exc(), flush=True)
return {
"counter_passed_whitelist": {
"value": "unknown",
@ -19,7 +23,8 @@ def pre_render(**kwargs):
"subtitle": "request passed",
"subtitle_color": "success",
"svg_color": "green",
}
},
"error": format_exc(),
}

View file

@ -10,20 +10,21 @@
<div class="core-card">
<h5 class="core-card-title">INFO</h5>
<div class="core-card-text-container">
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
</div>
<p class="core-card-text mt-4 mb-2">More information available <a href="https://docs.bunkerweb.io/{{ bw_version }}/security-tuning/#whitelisting" class="hover:brightness-90 cursor-pointer mt-2 underline text-primary">in the documentation</a>.</p>
</div>
<!-- end info --> <div class="core-layout-separator"></div>
{% if pre_render["status"] and pre_render["status"] == "ko" or "error" in pre_render["data"] %}
<div class="flex justify-center col-span-12">
<p class="text-white">Error during pre rendering</p>
<div class="ml-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
</div>
<div class="my-2 flex justify-center col-span-12">
<div class="mr-1">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
</svg>
</div>
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render["data"].get("error", "No log to show") }}</p>
</div>
{% endif %}
{% if pre_render["status"] and pre_render["status"] == "ok" and "error" not in pre_render["data"] %}

View file

@ -586,6 +586,7 @@ class Database:
)
)
order = 0
for setting, value in settings.items():
value.update(
{
@ -627,13 +628,16 @@ class Database:
if value.get("multiple") != db_setting.multiple:
updates[Settings.multiple] = value.get("multiple")
if order != db_setting.order:
updates[Settings.order] = order
if updates:
self.logger.warning(f'Setting "{setting}" already exists, updating it with the new values')
session.query(Settings).filter(Settings.id == setting).update(updates)
else:
if db_plugin:
self.logger.warning(f'Setting "{setting}" does not exist, creating it')
to_put.append(Settings(**value))
to_put.append(Settings(**value | {"order": order}))
db_values = [select.value for select in session.query(Selects).with_entities(Selects.value).filter_by(setting_id=value["id"])]
missing_values = [select for select in db_values if select not in select_values]
@ -652,6 +656,8 @@ class Database:
self.logger.warning(f'Removing all selects from setting "{setting}" as there are no longer any in the list')
session.query(Selects).filter_by(setting_id=value["id"]).delete()
order += 1
db_names = [job.name for job in session.query(Jobs).with_entities(Jobs.name).filter_by(plugin_id=plugin["id"])]
job_names = [job["name"] for job in jobs]
missing_names = [job for job in db_names if job not in job_names]
@ -1137,11 +1143,15 @@ class Database:
with self.__db_session() as session:
config = {}
multisite = []
for setting in session.query(Settings).with_entities(
Settings.id,
Settings.context,
Settings.default,
Settings.multiple,
for setting in (
session.query(Settings)
.with_entities(
Settings.id,
Settings.context,
Settings.default,
Settings.multiple,
)
.order_by(Settings.order)
):
default = setting.default or ""
config[setting.id] = default if not methods else {"value": default, "global": True, "method": "default"}
@ -1433,6 +1443,7 @@ class Database:
session.query(Services_settings).filter(Services_settings.setting_id.in_(missing_ids)).delete()
session.query(Global_values).filter(Global_values.setting_id.in_(missing_ids)).delete()
order = 0
for setting, value in settings.items():
value.update({"plugin_id": plugin["id"], "name": value["id"], "id": setting})
db_setting = (
@ -1446,6 +1457,7 @@ class Database:
Settings.regex,
Settings.type,
Settings.multiple,
Settings.order,
)
.filter_by(id=setting)
.first()
@ -1456,7 +1468,7 @@ class Database:
for select in value.pop("select", []):
to_put.append(Selects(setting_id=value["id"], value=select))
to_put.append(Settings(**value))
to_put.append(Settings(**value | {"order": order}))
else:
updates = {}
@ -1484,6 +1496,9 @@ class Database:
if value.get("multiple") != db_setting.multiple:
updates[Settings.multiple] = value.get("multiple")
if order != db_setting.order:
updates[Settings.order] = order
if updates:
changes = True
session.query(Settings).filter(Settings.id == setting).update(updates)
@ -1502,6 +1517,8 @@ class Database:
changes = True
to_put.append(Selects(setting_id=setting, value=select))
order += 1
db_names = [job.name for job in session.query(Jobs).with_entities(Jobs.name).filter_by(plugin_id=plugin["id"])]
job_names = [job["name"] for job in jobs]
missing_names = [job for job in db_names if job not in job_names]
@ -1666,6 +1683,7 @@ class Database:
)
)
order = 0
for setting, value in settings.items():
db_setting = session.query(Settings).filter_by(id=setting).first()
@ -1678,7 +1696,8 @@ class Database:
for select in value.pop("select", []):
to_put.append(Selects(setting_id=value["id"], value=select))
to_put.append(Settings(**value))
to_put.append(Settings(**value | {"order": order}))
order += 1
for job in jobs:
db_job = (
@ -1823,6 +1842,7 @@ class Database:
Settings.multiple,
)
.filter_by(plugin_id=plugin.id)
.order_by(Settings.order)
):
data["settings"][setting.id] = {
"context": setting.context,

View file

@ -82,6 +82,7 @@ class Settings(Base):
regex = Column(String(1024), nullable=False)
type = Column(SETTINGS_TYPES_ENUM, nullable=False)
multiple = Column(String(128), nullable=True)
order = Column(Integer, default=0, nullable=False)
selects = relationship("Selects", back_populates="setting", cascade="all")
services = relationship("Services_settings", back_populates="setting", cascade="all")

View file

@ -222,9 +222,9 @@ sqlalchemy==2.0.29 \
--hash=sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5 \
--hash=sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758
# via -r requirements.armv7.in
typing-extensions==4.10.0 \
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
typing-extensions==4.11.0 \
--hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \
--hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a
# via
# psycopg
# psycopg-pool

View file

@ -286,9 +286,9 @@ sqlalchemy==2.0.29 \
--hash=sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5 \
--hash=sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758
# via -r requirements.in
typing-extensions==4.10.0 \
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
typing-extensions==4.11.0 \
--hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \
--hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a
# via
# psycopg
# psycopg-pool

View file

@ -118,9 +118,9 @@ google-auth==2.29.0 \
--hash=sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360 \
--hash=sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415
# via kubernetes
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
jinja2==3.1.3 \
--hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \

View file

@ -2,6 +2,6 @@ pip==24.0
pip-compile-multi==2.6.3
pip-tools==7.4.1
pip-upgrader==1.4.15
setuptools==69.2.0
setuptools==69.5.1
tomli==2.0.1
wheel==0.43.0

View file

@ -117,9 +117,9 @@ colorclass==2.2.2 \
docopt==0.6.2 \
--hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491
# via pip-upgrader
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
importlib-metadata==7.1.0 \
--hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \
@ -163,9 +163,9 @@ requests==2.31.0 \
# via
# -r requirements-deps.in
# pip-tools
setuptools==69.2.0 \
--hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \
--hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c
setuptools==69.5.1 \
--hash=sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987 \
--hash=sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32
# via pip-upgrader
terminaltables==3.1.10 \
--hash=sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543 \

View file

@ -1,4 +1,4 @@
pip==24.0
pip-tools==7.4.1
setuptools==69.2.0
setuptools==69.5.1
wheel==0.43.0

View file

@ -36,9 +36,9 @@ pyproject-hooks==1.0.0 \
# via
# -r requirements.in
# pip-tools
setuptools==69.2.0 \
--hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \
--hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c
setuptools==69.5.1 \
--hash=sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987 \
--hash=sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32
# via
# build
# pip-tools

View file

@ -1,4 +1,4 @@
FROM redhat/ubi9:9.3@sha256:1fafb0905264413501df60d90a92ca32df8a2011cbfb4876ddff5ceb20c8f165 as builder
FROM redhat/ubi9:9.3@sha256:66233eebd72bb5baa25190d4f55e1dc3fff3a9b77186c1f91a0abdb274452072 as builder
ENV OS=rhel
ENV NGINX_VERSION 1.24.0
@ -67,7 +67,7 @@ COPY src/scheduler scheduler
COPY src/ui ui
COPY src/VERSION VERSION
FROM redhat/ubi9:9.3@sha256:1fafb0905264413501df60d90a92ca32df8a2011cbfb4876ddff5ceb20c8f165
FROM redhat/ubi9:9.3@sha256:66233eebd72bb5baa25190d4f55e1dc3fff3a9b77186c1f91a0abdb274452072
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c as builder
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb as builder
# Export var for specific actions on linux/arm/v7
ARG TARGETPLATFORM
@ -35,7 +35,7 @@ COPY src/common/utils utils
COPY src/scheduler scheduler
COPY src/VERSION VERSION
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -202,6 +202,7 @@ def generate_external_plugins(plugins: List[Dict[str, Any]], *, original_path: U
if not ret:
logger.error(f"Sending {'pro ' if pro else ''}external plugins failed, configuration will not work as expected...")
def generate_caches(plugins: List[Any], db: Database):
for plugin in plugins:
job_cache_files = db.get_jobs_cache_files(plugin_id=plugin["id"])
@ -250,6 +251,7 @@ def generate_caches(plugins: List[Any], db: Database):
logger.debug(f"Removing empty directory {file}")
rmtree(file, ignore_errors=True)
def api_to_instance(api):
hostname_port = api.endpoint.replace("http://", "").replace("https://", "").replace("/", "").split(":")
return {
@ -257,6 +259,7 @@ def api_to_instance(api):
"env": {"API_HTTP_PORT": int(hostname_port[1]), "API_SERVER_NAME": api.host},
}
def run_in_slave_mode(db: Database, dotenv_env: Dict[str, Any]):
# Instantiate db
db = Database(logger, sqlalchemy_string=dotenv_env.get("DATABASE_URI", getenv("DATABASE_URI", None)))
@ -272,7 +275,7 @@ def run_in_slave_mode(db: Database, dotenv_env: Dict[str, Any]):
logger.warning("Database doesn't have any config saved yet, retrying in 5s ...")
sleep(5)
env = db.get_config()
# Download plugins
pro_plugins = db.get_plugins(_type="pro", with_data=True)
generate_external_plugins(pro_plugins, original_path=PRO_PLUGINS_PATH)
@ -314,6 +317,7 @@ def run_in_slave_mode(db: Database, dotenv_env: Dict[str, Any]):
while True:
sleep(5)
if __name__ == "__main__":
try:
# Don't execute if pid file exists
@ -393,7 +397,7 @@ if __name__ == "__main__":
# Override instances if needed
override_instances = env.get("OVERRIDE_INSTANCES", "")
apis=[]
apis = []
if override_instances:
for instance in override_instances.split(" "):
apis.append(API(instance))

View file

@ -1,6 +1,6 @@
certbot==2.10.0
configobj==5.0.8
cryptography==42.0.5
maxminddb==2.6.0
maxminddb==2.6.1
python-magic==0.4.27
schedule==1.2.1

View file

@ -215,9 +215,9 @@ distro==1.9.0 \
--hash=sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed \
--hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2
# via certbot
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
importlib-metadata==7.1.0 \
--hash=sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570 \
@ -229,55 +229,76 @@ josepy==1.14.0 \
# via
# acme
# certbot
maxminddb==2.6.0 \
--hash=sha256:048e85e74828d1c7327df4ca452a4b859dd2ca2b9746c978fe613138cae65b97 \
--hash=sha256:0626df312d92e8b34ab1bf12921ac44a05a82a70f611f3bb6ed5b55668344849 \
--hash=sha256:0dfe9b4af5870a60b9abaaa898b458d2af2338cabe2f8fa6c7d74bf473f1d01a \
--hash=sha256:16c2619779abe6baa722e6d65500393a6ea8fe5a3ce24bb02564defb020f51cd \
--hash=sha256:2ba1c6cc68316dec14b1251741d5b5c7538ccebc6aadddc61fd870e090adfdff \
--hash=sha256:2e9c672952c5ed22bf7aae69830116a9d0747d9abd9ebcfe375d31432fdea2e8 \
--hash=sha256:2f036479418ed91ec019c7ef6e3e6757797a16891dbf8829d9c1b74e2a5feb5b \
--hash=sha256:313afcdaeda32e5249093a0672bd1276261511ddc93e52fb2dda87061f1ba154 \
--hash=sha256:31f6819ed566668e890937aadc79373cf9de20378ac76f323628863d8f3d1383 \
--hash=sha256:42c58ad0e5c70bbaedd3b681b172000256f4710c6c2180221c9f43f826381c00 \
--hash=sha256:4e02868d8081e6cadfe0cd8e7dc577c172a7dd78b65bbafff89b8b2bec41e493 \
--hash=sha256:4e5647563d11f57df239988371db2eeed8246ad4673eb3d798892d1812e5d653 \
--hash=sha256:4e7a0735a04545386df64eb8bc9aea9971b172584066e0d88af8404ba6ccbbd9 \
--hash=sha256:4ec0e12623b53b3548239f0082bc2417e71543e2e5b7b4f49c56545f52013f7f \
--hash=sha256:50b0318222b99b27cb3abff3f85983e36a33fb785445402930b28d2c3fe320d0 \
--hash=sha256:541650f00ecaff32b486ca0a89fd74a2493e35e0cfe1142b4a66b852de6e00c4 \
--hash=sha256:568ad9f34ec4118e7e1b9b583c086576ac68add40232ae57a2b1d4bd4834705e \
--hash=sha256:5ee2e5138ef28b7cf920fedb313b0e605bc66bd2d46c9abcd9656d18ed4eb660 \
--hash=sha256:61f7f6b12264d52eba5235580edecd0bad0aac7c1c5ba0a0970373c5d19b81d7 \
--hash=sha256:6508bd089be94174608c0d95f95983b891daa07181eef4aaae2ff55930a3022b \
--hash=sha256:6883311bdd673d27781cbb8e06cc623aef497aa970e5e532cb79a13460955d09 \
--hash=sha256:695466fe8933430d53894f91ce3a468383a6c1a2f89eeddd05dad21377ea94d9 \
--hash=sha256:6ec791c115dbfa20d0a4d4f0a2c336886f6abb30025a6ac2eb42b94c581bdd67 \
--hash=sha256:725b01b6cb4b744b846041168b02dcf05908ce02e544aa35d64dbcf2448efd05 \
--hash=sha256:74eb211e4a755d6f8b9704239c42d06cdcb42beb2030a707d629e8db092faf72 \
--hash=sha256:8d126f0d2784d53aa613c009b89677bbf88defb3bf7a66e9b8e60e0859f23aa4 \
--hash=sha256:9df22644fe0b022f8dbdd56bc066ce02d29a67e5d7a543949f1bd43638234ce9 \
--hash=sha256:a2864cb9093d89b5ccfcdd124da6b8feb3cc3ac7891ab5b43b7131a8a0050bd9 \
--hash=sha256:a6e028be4c38d9c11a408a2fbd89626d0bbf1eb89996bf0beaf1e11453937bd6 \
--hash=sha256:af8c4792272f85b0f9da70f3c3670bc3163590d5c9964412ed47ab3f31138c21 \
--hash=sha256:b15df0645f067c229cafdbc5160c3a0512b3ec16f3c77252dc83341312329fc9 \
--hash=sha256:bd8a06f0f16bb502887fada29b2d9f3cec4c6e44e230fdf0cc67452fa0232f7c \
--hash=sha256:c5b91c62bc274d0a83ac88088a6db2dac1301acb8aa7bf80a901a07120361e1d \
--hash=sha256:c79c1892e0b582660f1d821b0b68bb6100ca60dc13cfc2553e3c12939907fa75 \
--hash=sha256:c9168f0251bbb6806fd85dea7e145b53163f3e74626bf65b8b62b24121bbb038 \
--hash=sha256:c9ebcd1603ace5768934668e940bc3f7a23973b06c833031bb3ef1ff6d5193bf \
--hash=sha256:cda00948032969affce349588ee8638eae97f47b8b10b4064e7e9bf6bda3410d \
--hash=sha256:d1fcf83866b77faf501eba458cc59760d8945a310ba53a8d47d9bb04592cb1cb \
--hash=sha256:db4919488de1215650316284fe079f07b463d4c5f96ce01b338adaac8f35936d \
--hash=sha256:dfa11a83c615a7cfd407e47cc6b8576aad2322bc6ce4af2b6a916fb634a5556e \
--hash=sha256:e90b8be14ded4f01f71c23034600b088594417e42a7bbdd132e87d923246db0e \
--hash=sha256:eee0250b6cfc30eca89f06fc4d455aad51f657da05612dfe6207aa9be870edb7 \
--hash=sha256:f1b5149c8064e9d47d98d382ed54037f0ba25ca9c1e2b1d1cd9958c3808ced44 \
--hash=sha256:f223183a9e5c8e2044f6347c07b71deab4dac36d44de46163ff3358cb4f909c8 \
--hash=sha256:f50300386c030a1152c1c97a02f880bc80bc8ddff500b782fd41334382f0dbda \
--hash=sha256:fa1f45ca2b2b60bd3c88cea33bb8ca948f3dd44795049477248c804e2c02b726 \
--hash=sha256:fa897a9ae335559d26d63656d4d34f4a9a0e63be3cb67624fdcd448b7d010536 \
--hash=sha256:fb8d69564a3b682d8f1dd79a97b52f6525a2a4939ef9a23c7b108ec2f973a42a
maxminddb==2.6.1 \
--hash=sha256:03f59f5c06bb54907e74f8a5d5149032a6e14cb2d990e17e4b0446d18195ede6 \
--hash=sha256:0855c3532063e16c71b9ca7f624d3061f0e6da03a1e4ff7fabf9253a278b3016 \
--hash=sha256:0f5286b5db8065a59cf9e005281c9d74d3839a8cda8e8ee04305d42d5afcc523 \
--hash=sha256:103c7c5740a63d42f1062a99c79712d73106b3b0663c4e6c559f502b673c50c8 \
--hash=sha256:153ca60a282d5ba1db86eedd27b6bb0e158d0f94682598f9900f20690e01395f \
--hash=sha256:16dc122ebaae59922c007bcb9cf2a0621f550392b54f7f5e0171baa111be5a55 \
--hash=sha256:17272badaa3e0293858ea9a48fe3e9fe8d6b20cc465a54cd4766d05aeff6ca59 \
--hash=sha256:21e93c0d094d167bb96ab49c89df2746d78c99228c5273bd7dc6d11385dd63b3 \
--hash=sha256:2319e73cad84bb3897a0cfbe8473a87b0e83b7a69b84118be829cc761a4388ac \
--hash=sha256:2396eb49868c2f078ba566359b66249643409dfca1372b5497cef06bf7965c4a \
--hash=sha256:242e572b3e132146acd0e2633c00564a8e33cf6de54c060778c618070d109054 \
--hash=sha256:24f362eb049109f01dda5adba03d703d1a83e73fa95569ea2bc723a7ecbbea2b \
--hash=sha256:2a943e4a0dd59bd6b98ee131f40bdf4efbab8db7667c3dfa9165b1e06ed3b46d \
--hash=sha256:2ad27b9a06da43f0192e19e772b3fc01b72a6d231d55e665ec675a235533b0c5 \
--hash=sha256:30d66df204847ab114b84b04adf60e91a1dc1a30ab42a3e41337ed10efb4f2ab \
--hash=sha256:32571299316c01eecfc364cd5b94cfa2a484ee45b1cb2cd80464d7f666c4be11 \
--hash=sha256:33859797f89c2949f86a98a0b89dc577a40561643e78084ad44307bbdc40dd76 \
--hash=sha256:39be382e82ecf231869e4c3f628f18b21f032b7bc42f980b75f042c16818b991 \
--hash=sha256:3c8db454446d83b65bd605f6093400897a8698de82ca1c20f37494361ee5b6a7 \
--hash=sha256:3ce8cdf86cbfb569fe7f33dbef283476d7693e002a4b73195996655067f770bd \
--hash=sha256:3eb4711af74a6d8e10e28095c2a18a7ab010826d68665757383c140989f7e075 \
--hash=sha256:3f04a217240323caea98adb0eaf0342466656486fc27b18ff53f74414dbaecce \
--hash=sha256:416f3fddd1add9a421483b26d24abaf2dd355f3a5afd72923681698d345d99d6 \
--hash=sha256:41af38a328cfa94041135753b7ab2dc08863b22535a4295f6e65f72de0a862b9 \
--hash=sha256:44d546d6f8ac103c13daf965ac1970a6a32a8b2f33bdbc8a280f87383ce7c5cd \
--hash=sha256:45d78c8e527ea90947d04450709032459221011a2d14cf5ac645ca1f76e8e7f2 \
--hash=sha256:4774750c744c378653536ad6d5f8e28bcb2566e7e24081e881b00c95b51cad09 \
--hash=sha256:4a2a1b713ceea188d066ca676c033f334baad4f41bc1d89640c9795d514b6617 \
--hash=sha256:4a75d73d8aaa82718d3553880951d1b7fe8c1cd309a84b992ca7789b832b1de7 \
--hash=sha256:4d718bb2379d06e8ca3c4aa09f22634e84fe76db44f66845d7c18c1f0e414fd6 \
--hash=sha256:4e21d5ccf34eb1eee14d95c616b7628035953ed4d79ff560188014ae7f1aaaf7 \
--hash=sha256:5555698be89fa568b787570911a2aa5c666c335c12dcc5cd8166f96e3155e210 \
--hash=sha256:5719b58cfbed4464f89afcbdbaf1eb84f9de805f1716f27c671bf11635ce5458 \
--hash=sha256:58a070a18ca6d17d79002b35351fa9373012a98ad5680c0c49d0794c1286d9d9 \
--hash=sha256:6acc873145aade367d39f5c2c013eeba1fc7709c1cca8aa9a46dd25db12958ef \
--hash=sha256:6c5d591f625e03b0a34df0c7ff81580676397b8335e13ece130c6e39e4a3afb9 \
--hash=sha256:6d3790e9ee0157a320b0aa7ddf9f33290f33797608beae604b202a24aaf9db17 \
--hash=sha256:81a1070b61e2fabff936d256490924e49c8b54d3f9fa61f32c0c91b83dc11259 \
--hash=sha256:86457125adccf5c248d481fc1cd80e77674afeaf45995aed480a3c7e0e118ddc \
--hash=sha256:87989f153ce9a0974c69bb0bf26a3cb339c7dfbbfe3330883075543d8ef70fc5 \
--hash=sha256:8eb72818e43d2e52e896e72622f41219afe98913eda456ef626fb10a636acca3 \
--hash=sha256:940c349e0937e1123f1ae7f213e4a7e90e972cd4501c5898ec70814e4c472747 \
--hash=sha256:9ac567627ac141d3e1a797b5696b4e652b1660ddfa6c861f202eed1eb34143ab \
--hash=sha256:9b8ef7ed2bbbd8216a0560dd06caafe2fc1d6f9fa18cf46282c6f4a9a3d91b9c \
--hash=sha256:9c5aa6d50a30cc733b57afa80cbb51c004a7beac23a6c6a56e3550992faaeac1 \
--hash=sha256:9eb6a13e781e2e7a02e88734e29139fb0e5e4024020b146da56202893e425595 \
--hash=sha256:a029d2c23b8ad9f4e8316319d79f0d55899aa8e6d69a2bee77d998991256dee0 \
--hash=sha256:a467ebf7cec651001a318aab5c9582f6774886e8d2d86aac77db33e5006ea118 \
--hash=sha256:ae3c76fbc989eca9b31512ae899528a9dae9092f4c9b7e807ed55b9ff4254ed0 \
--hash=sha256:b1090088504c4b45cf1f3ffc32eabd6d5065e56883d910658e5d5f31e80e4be4 \
--hash=sha256:b3863e6017b96ee3ae1a6bb7ef0c25cd9013b04cccc1fd27880ab6371cdd1d84 \
--hash=sha256:b8e0fa2ec7f58411262ab3edd837d3a1844e6068e128eca222867ad465b97e9d \
--hash=sha256:bcc9ac85007ab222838974b084f49bb62531669e793a7730260dec2cf6e34bfd \
--hash=sha256:c8f9fcd1bb0e016e7a2ff2341920f99932cd0f573e18bc89e9ad168c9cb93392 \
--hash=sha256:c9dd4275749d1d3fb3700df373cd593235ee307f17a3180bad151562e8294a61 \
--hash=sha256:cd4afedf6fab1678e5fac0f0cdeb9be2f77fcc07ae1ebc5abe788aec32dd3de8 \
--hash=sha256:d0a8b70fcfa0980c0e8501e1506115dbd6f2410436f54161647627430d7cbb66 \
--hash=sha256:d44081ec6633a225e051eaf851aa5986aae5f5c8c1f33cf78b3a825c5d0df642 \
--hash=sha256:d45a6a5d964182ff083f2ee545d049517e88f0898ab4df3e119582518cd97b64 \
--hash=sha256:db8e0a5c1262d43ba5d0f6efb357ba9e5b65b7f3fc982b77a9f543f222a7fca3 \
--hash=sha256:e973d98f3bf828a94016d3875cb44e17739ad3957282505c16c68d20cf3a70a1 \
--hash=sha256:f117fe0b5bafee78dbd97606dc60bba2160cfe1968484925174d7aadb7a38f37 \
--hash=sha256:f11a0899eb671c77dc131c8dd5d6702eb2d7c19952790c87b36ef72d73696bc2 \
--hash=sha256:f1481c05b2a7fa909bb48ada037d2c920d7845ea737d9a1e6513ab1c85a64a32 \
--hash=sha256:f40c1a145550a297b8c8743d62b8b1bf9fa572b36fa1df9157ea45fed0da9abc \
--hash=sha256:f6edc11c4fb4c1ecbfb28cc5da167f7db415c4fabc1aeff0171b06473057e5fb \
--hash=sha256:fa43c3783da55ca2a2ed68b97048b63c86ee1462caf32e5f9bfe038db9dac31f \
--hash=sha256:fb56115caee4f3beafd2907845dc8f80c633424cbe270a3738f6ba609ff7248e \
--hash=sha256:fc3526c587f53dd32a5191e81f4239bb3ead70f56a97936b3427b72e3a5cc55f
# via -r requirements.in
parsedatetime==2.6 \
--hash=sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455 \
@ -320,9 +341,9 @@ schedule==1.2.1 \
# via importlib-metadata
# The following packages are considered to be unsafe in a requirements file:
setuptools==69.2.0 \
--hash=sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e \
--hash=sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c
setuptools==69.5.1 \
--hash=sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987 \
--hash=sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32
# via -r requirements.in
six==1.16.0 \
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c as builder
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb as builder
# Export var for specific actions on linux/arm/v7
ARG TARGETPLATFORM
@ -33,7 +33,7 @@ COPY src/common/helpers helpers
COPY src/ui ui
COPY src/VERSION VERSION
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027

View file

@ -401,6 +401,7 @@ def inject_variables():
pro_expire=metadata["pro_expire"].strftime("%d-%m-%Y") if metadata["pro_expire"] else "Unknown",
pro_overlapped=metadata["pro_overlapped"],
plugins=app.config["CONFIG"].get_plugins(),
bw_version="1.5.7"
)
@ -637,7 +638,7 @@ def home():
config = app.config["CONFIG"].get_config(with_drafts=True)
override_instances = config["OVERRIDE_INSTANCES"]["value"] != ""
instances = app.config["INSTANCES"].get_instances(override_instances=override_instances)
instance_health_count = 0
for instance in instances:

View file

@ -1,6 +1,6 @@
bcrypt==4.1.2
beautifulsoup4==4.12.3
Flask==3.0.2
Flask==3.0.3
Flask-Login==0.6.3
Flask_WTF==1.2.1
gunicorn[gthread]==21.2.0

View file

@ -45,9 +45,9 @@ click==8.1.7 \
--hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \
--hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de
# via flask
flask==3.0.2 \
--hash=sha256:3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e \
--hash=sha256:822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d
flask==3.0.3 \
--hash=sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3 \
--hash=sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842
# via
# -r requirements.in
# flask-login
@ -272,9 +272,9 @@ soupsieve==2.5 \
--hash=sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690 \
--hash=sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7
# via beautifulsoup4
typing-extensions==4.10.0 \
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
typing-extensions==4.11.0 \
--hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \
--hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a
# via qrcode
werkzeug==3.0.2 \
--hash=sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795 \

View file

@ -8,8 +8,7 @@ from typing import Any, List, Optional, Tuple, Union
from API import API # type: ignore
from ApiCaller import ApiCaller # type: ignore
from dotenv import dotenv_values # type: ignore
from Database import Database # type: ignore
from dotenv import dotenv_values # type: ignore
class Instance:
@ -168,13 +167,12 @@ class Instances:
ApiCaller(
[
API(
f"http://{instance['hostname']}:{str(instance['port'])}",
f"http://{instance['hostname']}:{instance['port']}",
instance["server_name"],
)
]
)
),
)
)
return instances
# Docker instances (containers or services)

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,65 @@
import { Tabs, Popover } from "./utils/settings.js";
import { Tabs } from "./utils/settings.js";
class TabPopover {
constructor() {
this.init();
}
init() {
window.addEventListener("pointerover", (e) => {
//POPOVER LOGIC
try {
if (
e.target.closest("button").hasAttribute(`data-popover-btn`) ||
e.target.closest("svg").hasAttribute(`data-popover-btn`)
) {
this.showPopover(e.target);
}
} catch (err) {}
});
window.addEventListener("pointerout", (e) => {
//POPOVER LOGIC
try {
if (
e.target.closest("button").hasAttribute(`data-popover-btn`) ||
e.target.closest("svg").hasAttribute(`data-popover-btn`)
) {
this.hidePopover(e.target);
}
} catch (err) {}
});
}
showPopover(el) {
const btn = el.closest("button").hasAttribute("data-popover-btn")
? el.closest("button")
: el.closest("svg");
const popoverName = btn.getAttribute("data-popover-btn");
//toggle curr popover
const popover = btn.parentElement.querySelector(
`[data-popover-content=${popoverName}]`,
);
popover.classList.add("transition-all", "delay-200", "opacity-0");
popover.classList.remove("hidden");
setTimeout(() => {
popover.classList.remove("opacity-0");
}, 10);
}
hidePopover(el) {
const btn = el.closest("button").hasAttribute("data-popover-btn")
? el.closest("button")
: el.closest("svg");
const popoverName = btn.getAttribute("data-popover-btn");
//toggle curr popover
const popover = btn.parentElement.querySelector(
`[data-popover-content=${popoverName}]`,
);
popover.classList.add("hidden");
popover.classList.remove("transition-all", "delay-200");
}
}
class SubmitAccount {
constructor() {
@ -45,7 +106,7 @@ class SubmitAccount {
"focus:valid:!ring-red-500",
"active:!border-red-500",
"active:valid:!border-red-500",
"valid:!border-red-500"
"valid:!border-red-500",
);
this.pwAlertEl.classList.add("opacity-0");
this.pwAlertEl.setAttribute("aria-hidden", "true");
@ -59,7 +120,7 @@ class SubmitAccount {
"focus:valid:!ring-red-500",
"active:!border-red-500",
"active:valid:!border-red-500",
"valid:!border-red-500"
"valid:!border-red-500",
);
this.pwAlertEl.classList.remove("opacity-0");
this.pwAlertEl.setAttribute("aria-hidden", "false");
@ -77,14 +138,14 @@ class PwBtn {
const passwordContainer = e.target.closest("[data-input-group]");
const inpEl = passwordContainer.querySelector("input");
const invBtn = passwordContainer.querySelector(
'[data-setting-password="invisible"]'
'[data-setting-password="invisible"]',
);
const visBtn = passwordContainer.querySelector(
'[data-setting-password="visible"]'
'[data-setting-password="visible"]',
);
inpEl.setAttribute(
"type",
inpEl.getAttribute("type") === "password" ? "text" : "password"
inpEl.getAttribute("type") === "password" ? "text" : "password",
);
if (inpEl.getAttribute("type") === "password") {
@ -131,5 +192,5 @@ class SwitchTabForm {
const setPWBtn = new PwBtn();
const setSubmit = new SubmitAccount();
const setTabs = new Tabs();
const setPopover = new Popover();
const setTabPopover = new TabPopover();
const setSwitchTabForm = new SwitchTabForm();

View file

@ -284,7 +284,6 @@ class SetRootOnlyConf {
),
);
}
console.log(itemsToRemove);
itemsToRemove.forEach((item) => {
item.remove();
});

View file

@ -386,7 +386,6 @@ class Banner {
//]
// Try to get data from api
if (sessionStorage.getItem("bannerNews") !== null) {
console.log(JSON.parse(sessionStorage.getItem("bannerNews")));
return this.updateBanner(
JSON.parse(sessionStorage.getItem("bannerNews")),
);

View file

@ -249,7 +249,8 @@ class ServiceModal {
inpName === "OLD_SERVER_NAME" ||
inpName === "is_draft" ||
inpName === "operation" ||
inpName === "settings-filter"
inpName === "settings-filter" ||
inp.hasAttribute("data-combobox")
)
return;
@ -1523,6 +1524,18 @@ const checkServiceModalKeyword = new CheckNoMatchFilter(
document.querySelector("[data-services-nomatch]"),
);
const checkServiceModalSelect = new CheckNoMatchFilter(
document.querySelectorAll(
"button[data-services-setting-select-dropdown-btn]",
),
"select",
document
.querySelector("[data-services-modal-form]")
.querySelectorAll("[data-plugin-item]"),
document.querySelector("[data-services-modal-form]"),
document.querySelector("[data-services-nomatch]"),
);
try {
const checkServiceCardKeyword = new CheckNoMatchFilter(
document.querySelectorAll("input#service-name-keyword"),

View file

@ -1,9 +1,21 @@
class Popover {
constructor() {
this.init();
this.visiblePopover = null;
this.relateBtn = null;
}
init() {
window.addEventListener(
"scroll",
(e) => {
try {
this.hidePopover(this.relateBtn);
} catch (e) {}
},
true,
);
window.addEventListener("pointerover", (e) => {
//POPOVER LOGIC
try {
@ -38,11 +50,17 @@ class Popover {
const popover = btn.parentElement.querySelector(
`[data-popover-content=${popoverName}]`,
);
popover.classList.add("transition-all", "delay-200", "opacity-0");
popover.classList.remove("hidden");
this.visiblePopover = popover;
this.relateBtn = btn;
this.updatePos();
setTimeout(() => {
popover.classList.remove("opacity-0");
}, 10);
}, 100);
}
hidePopover(el) {
@ -57,6 +75,22 @@ class Popover {
popover.classList.add("hidden");
popover.classList.remove("transition-all", "delay-200");
}
updatePos() {
const btn = this.relateBtn;
const popover = this.visiblePopover;
const btnRect = btn.getBoundingClientRect();
const btnTop = btnRect.y;
const btnLeft = btnRect.x;
popover.style.top = `${
btnTop - popover.getBoundingClientRect().height + 20
}px`;
popover.style.left = `${
btnLeft - popover.getBoundingClientRect().width / 3
}px`;
}
}
class TabsSelect {
@ -111,22 +145,24 @@ class TabsSelect {
});
// If fragment exists, click on the corresponding tab
if (
window.location.hash &&
window.location.pathname.endsWith("global_config")
) {
const fragment = window.location.hash.substring(1);
if (fragment) {
const tab = this.tabContainer.querySelector(
`button[data-tab-select-handler='${fragment}']`,
);
tab.click();
// Scroll to the top of the page (with a delay to ensure the tab is clicked first)
setTimeout(() => {
window.scrollTo(0, 0);
}, 100);
try {
if (
window.location.hash &&
window.location.pathname.endsWith("global_config")
) {
const fragment = window.location.hash.substring(1);
if (fragment) {
const tab = this.tabContainer.querySelector(
`button[data-tab-select-handler='${fragment}']`,
);
tab.click();
// Scroll to the top of the page (with a delay to ensure the tab is clicked first)
setTimeout(() => {
window.scrollTo(0, 0);
}, 100);
}
}
}
} catch (e) {}
}
resetTabsStyle() {
@ -182,8 +218,17 @@ class TabsSelect {
const dropdown = this.tabContainer.querySelector(
"[data-tab-select-dropdown]",
);
const combobox = dropdown.querySelector("[data-combobox]");
if (combobox) {
// simulate clear combobox wit keyboard
combobox.value = "";
}
dropdown.classList.toggle("hidden");
dropdown.classList.toggle("flex");
// Case open, try to focus on combobox input
if (!dropdown.classList.contains("hidden") && combobox) {
combobox.focus();
}
this.updateTabArrow();
}
@ -231,6 +276,13 @@ class FilterSettings {
this.contextTxtEl = document.querySelector(
`span[data-${this.prefix}-setting-select-text="context"]`,
);
this.typeTxtEl = document.querySelector(
`span[data-${this.prefix}-setting-select-text="type"]`,
);
this.comboboxEl = document.querySelector(
`[data-${this.prefix}-tabs-select] [data-combobox]`,
);
this.isComboCheck = false;
this.tabContainer = tabContainer;
this.contentContainer = contentContainer;
this.tabsEls = this.tabContainer.querySelectorAll(
@ -248,15 +300,31 @@ class FilterSettings {
});
}
if (this.comboboxEl) {
this.comboboxEl.addEventListener("input", () => {
this.runComboFilter();
});
this.comboboxEl.addEventListener("focusin", () => {
this.runComboFilter();
});
}
window.addEventListener("click", (e) => {
try {
if (
e.target.hasAttribute(
"data-global-config-setting-select-dropdown-btn",
(e.target.hasAttribute(
`data-${this.prefix}-setting-select-dropdown-btn`,
) &&
e.target.getAttribute(
"data-global-config-setting-select-dropdown-btn",
) === "context"
e.target.getAttribute(
`data-${this.prefix}-setting-select-dropdown-btn`,
) === `context`) ||
(e.target.hasAttribute(
`data-${this.prefix}-setting-select-dropdown-btn`,
) &&
e.target.getAttribute(
`data-${this.prefix}-setting-select-dropdown-btn`,
) === `type`)
) {
return this.runFilter();
}
@ -265,14 +333,33 @@ class FilterSettings {
});
}
runComboFilter() {
// Case combobox, we want to filter tabs only and not settings
this.tabsEls.forEach((tab) => {
tab.classList.remove("hidden");
const tabName = tab.getAttribute(`data-tab-select-handler`);
// check tab name matching combobox value
if (this.comboboxEl) {
const comboboxValue = this.comboboxEl.value;
if (!tabName.toLowerCase().includes(comboboxValue.toLowerCase())) {
tab.classList.add("hidden");
return;
}
}
});
return;
}
runFilter() {
this.resetFilter();
//get inp format
const inpValue = this.input.value.trim().toLowerCase();
const inpValue = this.input.value.trim().toLowerCase().replaceAll("_", " ");
//loop all tabs
this.tabsEls.forEach((tab) => {
const tabName = tab.getAttribute(`data-tab-select-handler`);
//get settings of tabs except multiples
const settings = this.getSettingsFromTab(tab);
@ -287,7 +374,22 @@ class FilterSettings {
.querySelector("h5")
.textContent.trim()
.toLowerCase();
if (!title.includes(inpValue) && inpValue !== "") {
// Try to get
const settingEl =
setting.querySelector("input")?.getAttribute("id") ||
setting.querySelector("select")?.getAttribute("id") ||
"";
const settingId = settingEl.trim().toLowerCase().replaceAll("_", " ");
if (
!title
.trim()
.toLowerCase()
.replaceAll("_", " ")
.includes(inpValue) &&
inpValue !== "" &&
!settingId.includes(inpValue)
) {
needToHide = true;
}
@ -299,7 +401,7 @@ class FilterSettings {
if (currContextFilter !== "all") {
const settingContext = setting
.getAttribute("data-global-config-context")
.getAttribute(`data-${this.prefix}-context`)
.toLowerCase();
if (settingContext !== currContextFilter) {
needToHide = true;
@ -308,6 +410,22 @@ class FilterSettings {
}
} catch (e) {}
// check type if filter exists
try {
if (this.typeTxtEl) {
const currTypeFilter = this.typeTxtEl.textContent.toLowerCase();
if (currTypeFilter !== "all") {
const settingContext = setting
.getAttribute(`data-${this.prefix}-type`)
.toLowerCase();
if (settingContext !== currTypeFilter) {
needToHide = true;
}
}
}
} catch (e) {}
if (needToHide) {
setting.classList.add("hidden");
settingHiddenCount++;
@ -327,7 +445,20 @@ class FilterSettings {
.querySelector("h5")
.textContent.trim()
.toLowerCase();
if (!title.includes(inpValue) && inpValue !== "") {
const settingEl =
multSetting.querySelector("input")?.getAttribute("id") ||
setting.querySelector("select")?.getAttribute("id") ||
"";
const settingId = settingEl.trim().toLowerCase().replaceAll("_", " ");
if (
!title
.trim()
.toLowerCase()
.replaceAll("_", " ")
.includes(inpValue) &&
inpValue !== "" &&
!settingId.includes(inpValue)
) {
needToHideMult = true;
}
@ -339,7 +470,7 @@ class FilterSettings {
if (currContextFilter !== "all") {
const settingContext = multSetting
.getAttribute("data-global-config-context")
.getAttribute(`data-${this.prefix}-context`)
.toLowerCase();
if (settingContext !== currContextFilter) {
needToHideMult = true;
@ -348,11 +479,28 @@ class FilterSettings {
}
} catch (e) {}
try {
if (this.typeTxtEl) {
const currtypeFilter = this.typeTxtEl.textContent.toLowerCase();
if (currtypeFilter !== "all") {
const settingtype = multSetting
.getAttribute(`data-${this.prefix}-type`)
.toLowerCase();
if (settingtype !== currtypeFilter) {
needToHideMult = true;
}
}
}
} catch (e) {}
if (needToHideMult) {
multSetting.classList.add("hidden");
multSettingHiddenCount++;
}
} catch (err) {}
} catch (err) {
console.log(err);
}
});
// check for each multiple groups if all are hidden
@ -409,7 +557,7 @@ class FilterSettings {
multTitle.classList.add("hidden");
}
//case no setting or no multiple match, check if match at least tab name
// case no setting or no multiple match, check if match at least tab name
// if no context, else we don't care about name
if (
settingCount === settingHiddenCount &&
@ -417,13 +565,28 @@ class FilterSettings {
) {
const tabName = tab.getAttribute(`data-tab-select-handler`);
const tabTxt = tab.textContent.trim().toLowerCase();
const tabType = tab.getAttribute(`data-tab-plugin-type`);
let needHideTab = false;
try {
if (this.contextTxtEl.textContent.toLowerCase() !== "all")
if (
this.contextTxtEl &&
this.contextTxtEl.textContent.toLowerCase() !== "all"
)
needHideTab = true;
} catch (e) {}
if (!tabTxt.includes(inpValue)) needHideTab = true;
try {
if (
this.typeTxtEl &&
this.typeTxtEl.textContent.toLowerCase() !== tabType
)
needHideTab = true;
} catch (e) {}
if (
!tabTxt.trim().toLowerCase().replaceAll("_", " ").includes(inpValue)
)
needHideTab = true;
if (needHideTab) {
tab.classList.add("!hidden");

View file

@ -92,6 +92,10 @@
}
.popover-settings-container {
@apply z-[1000] h-fit max-w-[250px] transition-all duration-500 dark:brightness-90 transition rounded-md p-3 -translate-y-7 fixed bg-blue-500;
}
.popover-tab {
@apply transition-all duration-500 dark:brightness-90 transition z-50 rounded-md p-3 left-0 -translate-y-7 bottom-0 absolute bg-blue-500;
}
@ -239,7 +243,7 @@
}
.card-detail-item {
@apply flex flex-col items-center sm:flex-row col-span-1 py-1 sm:py-0;
@apply flex items-center col-span-1 py-1 sm:py-0;
}
.card-detail-item-title {
@ -339,7 +343,7 @@
}
.core-card-list {
@apply ml-2 mr-2 mb-2 mt-2 h-fit content-start md:col-span-6 overflow-hidden grid grid-cols-12 max-h-100 sm:max-h-125 col-span-12 p-4 relative break-words dark:brightness-110 bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border;
@apply ml-2 mr-2 mb-2 mt-2 h-fit content-start md:col-span-6 overflow-x-hidden overflow-y-auto grid grid-cols-12 max-h-100 sm:max-h-125 col-span-12 p-4 relative break-words dark:brightness-110 bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border;
}
.w-small.core-card-list {

View file

@ -115,14 +115,13 @@
</div>
{% endif %}
</div>
{% if not is_pro_version and pro_status != "inactive" %}
<form class="mt-6 relative col-span-12 grid grid-cols-12 w-full justify-items-center"
id="activate-key-form"
action="account"
method="POST"
autocomplete="off">
<div class="col-span-12">
<h5 class="text-xl my-1 transition duration-300 ease-in-out text-md font-bold m-0 dark:text-gray-200">ACTIVATE KEY</h5>
<h5 class="text-xl my-1 transition duration-300 ease-in-out text-md font-bold m-0 dark:text-gray-200">{%if is_pro_version %}UPDATE KEY {% else %} ACTIVATE KEY {% endif %}</h5>
</div>
<input type="hidden" name="operation" value="activate-key" />
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
@ -170,7 +169,6 @@
class="valid-btn">SAVE</button>
</div>
</form>
{% endif %}
</div>
<div data-tab-item="username"
class="hidden grid grid-cols-12 w-full justify-items-center">
@ -245,7 +243,7 @@
id="username-button"
name="username-button"
value="username"
class="edit-btn">Edit</button>
class="valid-btn">Save</button>
</div>
</form>
<!-- end update username -->
@ -376,7 +374,7 @@
<strong class="opacity-0 font-normal text-sm text-red-500" data-pw-alert>Value does not match password</strong>
</div>
<div class="col-span-12 flex justify-center">
<button type="submit" id="pw-button" name="pw-button" class="edit-btn">Edit</button>
<button type="submit" id="pw-button" name="pw-button" class="valid-btn">Save</button>
</div>
</form>
<form data-tab-item="totp"

View file

@ -170,11 +170,11 @@
</div>
</div>
<div data-bans-list-container
class=" {% if bans|length == 0 %}hidden{% endif %} w-full overflow-hidden grid grid-cols-12 max-h-100 sm:max-h-125 col-span-12 p-4 relative break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
class=" {% if bans|length == 0 %}hidden{% endif %} w-full overflow-hidden grid grid-cols-12 col-span-12 p-4 relative break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
<div class="col-span-12">
<h5 class="mb-4 mt-2 font-bold dark:text-white/90 mx-2">BANS LIST</h5>
</div>
<div class="col-span-12 overflow-y-auto overflow-x-auto">
<div class=" max-h-100 sm:max-h-125 col-span-12 overflow-y-auto overflow-x-auto">
<div data-bans-bans-list>
<!-- list container-->
{% set bans_headers = [

View file

@ -29,16 +29,28 @@
"global",
"multisite"
]
},
{
"type": "select",
"name": "Type",
"id": "type",
"value": "all",
"values": [
"all",
"core",
"external",
"pro"
]
}
] %}
<div data-global-config-filter
class="h-fit p-4 col-span-12 md:col-span-6 lg:col-span-5 2xl:col-span-4 3xl:col-span-3 relative min-w-0 break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
class="h-fit p-4 col-span-12 md:col-span-6 3xl:col-span-4 relative min-w-0 break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
<h5 class="mb-2 font-bold dark:text-white/90">FILTER</h5>
<div class="mx-2 grid grid-cols-12 gap-x-4 gap-y-2">
{% for filter in filters %}
{% if filter['type'] == 'input' %}
<!-- search inpt-->
<div class="flex flex-col relative col-span-12">
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out text-sm sm:text-md font-bold m-0 dark:text-gray-200">
{{ filter['name'] }}
</h5>
@ -55,7 +67,7 @@
{% endif %}
{% if filter['type'] == 'select' %}
<!-- select -->
<div class="flex flex-col relative col-span-12">
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out text-sm sm:text-md font-bold m-0 dark:text-gray-200">
{{ filter['name'] }}
</h5>
@ -80,6 +92,7 @@
role="listbox"
data-global-config-setting-select-dropdown="{{ filter['id'] }}"
class="mt-1 hidden z-100 absolute flex-col w-full translate-y-16 max-h-[350px] overflow-hidden overflow-y-auto">
{% for value in filter['values'] %}
<button role="option"
data-global-config-setting-select-dropdown-btn="{{ filter['id'] }}"

View file

@ -177,11 +177,11 @@
</div>
</div>
<div data-reports-list-container
class="w-full overflow-hidden grid grid-cols-12 max-h-100 sm:max-h-125 col-span-12 p-4 relative break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
class="w-full overflow-hidden grid grid-cols-12 col-span-12 p-4 relative break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
<div class="col-span-12">
<h5 class="mb-4 mt-2 font-bold dark:text-white/90 mx-2">REPORTING</h5>
</div>
<div class="col-span-12 overflow-y-auto overflow-x-auto">
<div class=" max-h-100 sm:max-h-125 col-span-12 overflow-y-auto overflow-x-auto">
<!-- list container-->
<div class="min-w-[1300px] w-full grid grid-cols-12 rounded p-2">
{% set reports_header = [

View file

@ -37,7 +37,7 @@
<!-- end actions -->
{% if services|length >= 4 %}
<!-- service info and actions -->
<div class="p-0 sm:mx-2 md:mx-4 md:px-4 grid grid-cols-12 col-span-12 md:gap-x-4 gap-y-4 relative min-w-0 break-words rounded-2xl bg-clip-border">
<div class="p-0 sm:mx-2 md:mx-4 grid grid-cols-12 col-span-12 md:gap-x-4 gap-y-4 relative min-w-0 break-words rounded-2xl bg-clip-border">
<!-- info-->
{% set services_info = [
{"name" : "SERVICES TOTAL", "data" : services|length|string},
@ -171,7 +171,7 @@
{% endif %}
<!-- end service info and actions -->
<!-- services container-->
<div class="p-0 sm:mx-2 md:mx-4 md:px-4 grid grid-cols-12 col-span-12 md:gap-x-4 gap-y-4 relative min-w-0 break-words rounded-2xl bg-clip-border">
<div class="p-0 sm:mx-2 md:mx-4 md:px-1 grid grid-cols-12 col-span-12 md:gap-x-4 gap-y-4 relative min-w-0 break-words rounded-2xl bg-clip-border">
{% if services|length == 0 %}
<div class="col-span-12 sm:col-span-4 sm:col-start-5">
<div class="transition duration-300 ease-in-out dark:opacity-90 text-center relative w-full p-4 text-white bg-blue-500 rounded-lg">

View file

@ -43,20 +43,62 @@
</button>
</div>
<div data-services-tabs-select-header class="flex flex-col">
<div class="flex flex-col sm:flex-row justify-start w-full items-start sm:items-center gap-y-3 gap-x-4">
<div class="flex flex-col md:flex-row justify-start w-full items-start md:items-end gap-y-3 gap-x-4">
<div class="w-full sm:min-w-[250px] max-w-[300px]">{% include "settings_tabs_select.html" %}</div>
<div class="flex flex-col sm:flex-row">
<!-- search inpt-->
<div class="flex relative w-full max-w-[200px]">
<div class="sm:mx-2 mb-1 min-w-[200px] flex flex-col relative col-span-12 md:col-span-6">
<h5 class="hidden sm:block my-1 transition duration-300 ease-in-out text-sm sm:text-md font-bold m-0 dark:text-gray-200">
Search
</h5>
<label class="sr-only" for="settings-filter">search</label>
<input type="text"
id="settings-filter"
name="settings-filter"
class="col-span-12 dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-3 py-1 font-normal text-gray-700 transition-all placeholder:text-gray-500"
placeholder="search by keyword"
placeholder="keyword"
pattern="(.*?)"
required />
</div>
<!-- end search inpt-->
<!-- type plugin -->
<div class="hidden mx-2 mb-1 min-w-[200px] sm:flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out text-sm sm:text-md font-bold m-0 dark:text-gray-200">
Type
</h5>
<button aria-controls="filter-type" data-services-setting-select="type" class="disabled:opacity-75 dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400 dark:disabled:bg-gray-800 dark:disabled:border-gray-800 duration-300 ease-in-out dark:opacity-90 dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 focus:border-green-500 flex justify-between align-middle items-center text-left text-sm leading-5.6 ease w-full rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-1.5 py-1 md:px-3 font-normal text-gray-700 transition-all placeholder:text-gray-500">
<span aria-description="current filter state value" id="services-type" data-name="services-type" data-services-setting-select-text="type">all</span>
<!-- chevron -->
<svg data-services-setting-select="type" class="transition-transform h-4 w-4 fill-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"></path>
</svg>
</button>
<!-- end chevron -->
<!-- dropdown-->
<div id="filter-type" role="listbox" data-services-setting-select-dropdown="type" class="mt-1 hidden z-100 absolute flex-col w-full translate-y-16 max-h-[350px] overflow-hidden overflow-y-auto">
<button role="option" data-services-setting-select-dropdown-btn="type" value="all" class="dark:bg-primary bg-primary text-gray-300 border-t rounded-t border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300">
all
</button>
<button role="option" data-services-setting-select-dropdown-btn="type" value="core" class=" bg-white dark:bg-slate-700 border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300">
core
</button>
<button role="option" data-services-setting-select-dropdown-btn="type" value="external" class=" bg-white dark:bg-slate-700 border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300">
external
</button>
<button role="option" data-services-setting-select-dropdown-btn="type" value="pro" class=" bg-white dark:bg-slate-700 rounded-b border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300">
pro
</button>
</div>
<!-- end dropdown-->
</div>
<!-- end type plugin-->
</div>
</div>
<div class="w-full min-w-[300px] my-1 sm:my-0">
<hr class="separator" />

View file

@ -57,7 +57,7 @@
{% if multList.append(value['multiple']) %}{% endif %}
{% endif %}
{% if not value['multiple'] %}
<div data-setting-container data-{{ current_endpoint }}-context="{{ value['context'] }}" class="relative mx-0 sm:mx-2 md:mx-3 lg:mx-4 my-2 col-span-12 md:my-3 md:col-span-6 2xl:my-3 2xl:col-span-4" id="form-edit-{{ current_endpoint }}-{{ value["id"] }}">
<div data-setting-container data-{{ current_endpoint }}-type="{{ plugin['type'] }}" data-{{ current_endpoint }}-context="{{ value['context'] }}" class="relative mx-0 sm:mx-2 md:mx-3 lg:mx-4 my-2 col-span-12 md:my-3 md:col-span-6 2xl:my-3 2xl:col-span-4" id="form-edit-{{ current_endpoint }}-{{ value["id"] }}">
<!-- title and info -->
<div class="flex items-center my-1 relative z-10">
<h5 class="input-title">{{ value["label"] }}</h5>
@ -290,7 +290,7 @@
current_endpoint == "global-config"
or current_endpoint == "services" and value['context'] == "multisite"
) %}
<div data-setting-container="{{ setting }}_SCHEMA" data-{{ current_endpoint }}-context="{{ value['context'] }}" class="relative mx-2 md:mx-3 my-2 md:my-3 col-span-12 md:col-span-6 2xl:col-span-4" id="form-edit-{{ current_endpoint }}-{{ value["id"] }}_SCHEMA">
<div data-setting-container="{{ setting }}_SCHEMA" data-{{ current_endpoint }}-type="{{ plugin['type'] }}" data-{{ current_endpoint }}-context="{{ value['context'] }}" class="relative mx-2 md:mx-3 my-2 md:my-3 col-span-12 md:col-span-6 2xl:col-span-4" id="form-edit-{{ current_endpoint }}-{{ value["id"] }}_SCHEMA">
<!-- title and info -->
<div class="flex items-center my-1 relative z-10">
<h5 class="input-title">{{ value["label"] }}</h5>

View file

@ -22,15 +22,17 @@
role="listbox"
data-tab-select-dropdown
class="hidden z-100 absolute flex-col w-full overflow-hidden overflow-y-auto max-h-[350px]">
<input data-combobox type="text" placeholder="Search plugin" class="cursor-text first border rounded-t border-gray-100 text-left focus:outline outline-none text-sm leading-5.6 ease block w-full appearance-none border-gray-300 dark:border-gray-200 bg-white dark:bg-gray-400 bg-clip-padding px-3 py-1 font-normal text-gray-800 transition-all placeholder:text-gray-500 dark:placeholder:text-gray-600">
{% set first_el = "True" %}
{% for plugin in plugins %}
{% if current_endpoint == "services" and plugin["settings"]
and check_settings(plugin["settings"], "multisite") or current_endpoint == "global-config" %}
<button role="option"
data-tab-select-handler="{{ plugin['id'] }}"
data-tab-plugin-type="{{ plugin['type'] }}"
data-select="false"
id="edit-{{ current_endpoint }}-{{ plugin['id'] }}-tab"
class=" {% if loop.first %}active first{% endif %} {% if loop.last %}last{% endif %} settings-tabs-select-dropdown-btn">
class="{% if loop.first %}active{% endif %} {% if loop.last %}last{% endif %} settings-tabs-select-dropdown-btn">
{{ plugin['name'] }}
</button>
{% endif %}

View file

@ -128,7 +128,8 @@
Username<strong class="required-mark">*</strong>
</h5>
<label class="sr-only" for="admin_username">Username</label>
<input type="text"
<input tabindex="1"
type="text"
id="admin_username"
name="admin_username"
class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500"
@ -145,7 +146,8 @@
Password<strong class="required-mark">*</strong>
</h5>
<label class="sr-only" for="admin_password">Password</label>
<input type="password"
<input tabindex="1"
type="password"
id="admin_password"
name="admin_password"
class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500"
@ -162,7 +164,8 @@
Confirm Password<strong class="required-mark">*</strong>
</h5>
<label class="sr-only" for="admin_password_check">Confirm Password</label>
<input type="password"
<input tabindex="1"
type="password"
id="admin_password_check"
name="admin_password_check"
class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500"
@ -181,7 +184,8 @@
<div class="flex flex-col relative col-span-12 mx-2 max-w-[400px] w-full">
<h5 class="text-base mb-1 transition duration-300 ease-in-out text-md font-bold m-0">Email</h5>
<label class="sr-only" for="newsletter-email">email</label>
<input type="email"
<input tabindex="1"
type="email"
id="newsletter-email"
name="EMAIL"
class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500"
@ -194,6 +198,7 @@
<div data-checkbox-handler="newsletter-check"
class="relative mb-7 md:mb-0 z-10">
<input data-check
tabindex="1"
type="checkbox"
id="newsletter-check"
name="newsletter-check"
@ -225,7 +230,8 @@
UI Host (REVERSE_PROXY_HOST)<strong class="required-mark">*</strong>
</h5>
<label class="sr-only" for="ui_host">ui host</label>
<input type="text"
<input tabindex="1"
type="text"
id="ui_host"
name="ui_host"
value="{{ ui_host }}"
@ -241,7 +247,8 @@
UI URL (REVERSE_PROXY_URL)<strong class="required-mark">*</strong>
</h5>
<label class="sr-only" for="ui_url">ui url</label>
<input type="text"
<input tabindex="1"
type="text"
id="ui_url"
name="ui_url"
class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500"
@ -257,7 +264,8 @@
Server name<strong class="required-mark">*</strong>
</h5>
<label class="sr-only" for="server_name">server name</label>
<input type="text"
<input tabindex="1"
type="text"
id="server_name"
name="server_name"
class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500"
@ -271,7 +279,8 @@
<div class="flex flex-col relative col-span-12 my-3 mx-2 max-w-[400px] w-full">
<h5 class="text-base my-1 transition duration-300 ease-in-out text-md font-bold m-0">Check server name DNS</h5>
<div class="flex justify-start items-center">
<button id="check-server-name"
<button tabindex="1"
id="check-server-name"
class="flex justify-start w-fit tracking-wide inline-block px-6 py-3 font-bold text-center text-white uppercase align-middle transition-all rounded-lg cursor-pointer bg-primary hover:bg-primary/80 focus:bg-primary/80 leading-normal text-xs ease-in shadow-xs bg-150 bg-x-25 hover:-translate-y-px active:opacity-85 hover:shadow-md">
<span>check</span>
<span aria-check-color
@ -287,7 +296,8 @@
<label class="sr-only" for="auto_lets_encrypt">auto let's encrypt</label>
<div data-checkbox-handler="auto_lets_encrypt"
class="relative mb-7 md:mb-0 z-10">
<input data-check
<input tabindex="1"
data-check
type="checkbox"
id="auto_lets_encrypt"
name="auto_lets_encrypt"
@ -312,7 +322,8 @@
data-resume>http://</p>
</div>
<div class="col-span-12 flex justify-center">
<button type="submit"
<button tabindex="2"
type="submit"
id="setup-button"
name="setup-button"
value="setup"

View file

@ -44,6 +44,9 @@ def get_remain(seconds):
return " ".join(time_parts), term
SHOWN_FILE_TYPES = ("text/plain", "text/html", "text/css", "text/javascript", "application/json", "application/xml")
def path_to_dict(
path: str,
*,
@ -157,6 +160,8 @@ def path_to_dict(
mime = Magic(mime=True)
file_type = mime.from_buffer(conf["data"])
print(file_type, flush=True)
file_info = {
"name": conf["file_name"],
"job_name": conf["job_name"],
@ -170,7 +175,7 @@ def path_to_dict(
"can_edit": False,
"can_delete": False,
"can_download": True,
"content": "Download file to view content" if file_type != "text/plain" else conf["data"].decode("utf-8"),
"content": conf["data"].decode("utf-8") if file_type in SHOWN_FILE_TYPES else "Download file to view content",
}
if conf["service_id"]:

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
# Install firefox and geckodriver
RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \

View file

@ -118,9 +118,9 @@ h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
--hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761
# via wsproto
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via
# requests
# trio

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
# Install firefox and geckodriver
RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \

View file

@ -118,9 +118,9 @@ h11==0.14.0 \
--hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \
--hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761
# via wsproto
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via
# requests
# trio

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -104,9 +104,9 @@ docker==7.0.0 \
--hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \
--hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3
# via -r requirements.in
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
packaging==24.0 \
--hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -104,9 +104,9 @@ docker==7.0.0 \
--hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \
--hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3
# via -r requirements.in
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
packaging==24.0 \
--hash=sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5 \

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -68,94 +68,94 @@ httptools==0.6.1 \
--hash=sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185 \
--hash=sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3
# via uvicorn
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via anyio
pydantic==2.6.4 \
--hash=sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6 \
--hash=sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5
pydantic==2.7.0 \
--hash=sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352 \
--hash=sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383
# via fastapi
pydantic-core==2.16.3 \
--hash=sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a \
--hash=sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed \
--hash=sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979 \
--hash=sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff \
--hash=sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5 \
--hash=sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45 \
--hash=sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340 \
--hash=sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad \
--hash=sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23 \
--hash=sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6 \
--hash=sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7 \
--hash=sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241 \
--hash=sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda \
--hash=sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187 \
--hash=sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba \
--hash=sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c \
--hash=sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2 \
--hash=sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c \
--hash=sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132 \
--hash=sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf \
--hash=sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972 \
--hash=sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db \
--hash=sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade \
--hash=sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4 \
--hash=sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8 \
--hash=sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f \
--hash=sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9 \
--hash=sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48 \
--hash=sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec \
--hash=sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d \
--hash=sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9 \
--hash=sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb \
--hash=sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4 \
--hash=sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89 \
--hash=sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c \
--hash=sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9 \
--hash=sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da \
--hash=sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac \
--hash=sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b \
--hash=sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf \
--hash=sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e \
--hash=sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137 \
--hash=sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1 \
--hash=sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b \
--hash=sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8 \
--hash=sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e \
--hash=sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053 \
--hash=sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01 \
--hash=sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe \
--hash=sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd \
--hash=sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805 \
--hash=sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183 \
--hash=sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8 \
--hash=sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99 \
--hash=sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820 \
--hash=sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074 \
--hash=sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256 \
--hash=sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8 \
--hash=sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975 \
--hash=sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad \
--hash=sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e \
--hash=sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca \
--hash=sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df \
--hash=sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b \
--hash=sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a \
--hash=sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a \
--hash=sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721 \
--hash=sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a \
--hash=sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f \
--hash=sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2 \
--hash=sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97 \
--hash=sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6 \
--hash=sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed \
--hash=sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc \
--hash=sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1 \
--hash=sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe \
--hash=sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120 \
--hash=sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f \
--hash=sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a
pydantic-core==2.18.1 \
--hash=sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6 \
--hash=sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb \
--hash=sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0 \
--hash=sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6 \
--hash=sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47 \
--hash=sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a \
--hash=sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a \
--hash=sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac \
--hash=sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88 \
--hash=sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db \
--hash=sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d \
--hash=sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d \
--hash=sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9 \
--hash=sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e \
--hash=sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b \
--hash=sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d \
--hash=sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649 \
--hash=sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c \
--hash=sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1 \
--hash=sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09 \
--hash=sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0 \
--hash=sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90 \
--hash=sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d \
--hash=sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294 \
--hash=sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144 \
--hash=sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b \
--hash=sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1 \
--hash=sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b \
--hash=sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2 \
--hash=sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad \
--hash=sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622 \
--hash=sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17 \
--hash=sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06 \
--hash=sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc \
--hash=sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50 \
--hash=sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d \
--hash=sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59 \
--hash=sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539 \
--hash=sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a \
--hash=sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b \
--hash=sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5 \
--hash=sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9 \
--hash=sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278 \
--hash=sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6 \
--hash=sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44 \
--hash=sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0 \
--hash=sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb \
--hash=sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80 \
--hash=sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5 \
--hash=sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570 \
--hash=sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b \
--hash=sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de \
--hash=sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6 \
--hash=sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8 \
--hash=sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203 \
--hash=sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7 \
--hash=sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048 \
--hash=sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae \
--hash=sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89 \
--hash=sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f \
--hash=sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926 \
--hash=sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2 \
--hash=sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76 \
--hash=sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d \
--hash=sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411 \
--hash=sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9 \
--hash=sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2 \
--hash=sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586 \
--hash=sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35 \
--hash=sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c \
--hash=sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143 \
--hash=sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6 \
--hash=sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60 \
--hash=sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b \
--hash=sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226 \
--hash=sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519 \
--hash=sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31 \
--hash=sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7 \
--hash=sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b
# via pydantic
python-dotenv==1.0.1 \
--hash=sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca \
@ -222,9 +222,9 @@ starlette==0.37.2 \
--hash=sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee \
--hash=sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823
# via fastapi
typing-extensions==4.10.0 \
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
typing-extensions==4.11.0 \
--hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \
--hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a
# via
# anyio
# fastapi

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -1,2 +1,2 @@
maxminddb==2.6.0
maxminddb==2.6.1
requests==2.31.0

View file

@ -100,59 +100,80 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
maxminddb==2.6.0 \
--hash=sha256:048e85e74828d1c7327df4ca452a4b859dd2ca2b9746c978fe613138cae65b97 \
--hash=sha256:0626df312d92e8b34ab1bf12921ac44a05a82a70f611f3bb6ed5b55668344849 \
--hash=sha256:0dfe9b4af5870a60b9abaaa898b458d2af2338cabe2f8fa6c7d74bf473f1d01a \
--hash=sha256:16c2619779abe6baa722e6d65500393a6ea8fe5a3ce24bb02564defb020f51cd \
--hash=sha256:2ba1c6cc68316dec14b1251741d5b5c7538ccebc6aadddc61fd870e090adfdff \
--hash=sha256:2e9c672952c5ed22bf7aae69830116a9d0747d9abd9ebcfe375d31432fdea2e8 \
--hash=sha256:2f036479418ed91ec019c7ef6e3e6757797a16891dbf8829d9c1b74e2a5feb5b \
--hash=sha256:313afcdaeda32e5249093a0672bd1276261511ddc93e52fb2dda87061f1ba154 \
--hash=sha256:31f6819ed566668e890937aadc79373cf9de20378ac76f323628863d8f3d1383 \
--hash=sha256:42c58ad0e5c70bbaedd3b681b172000256f4710c6c2180221c9f43f826381c00 \
--hash=sha256:4e02868d8081e6cadfe0cd8e7dc577c172a7dd78b65bbafff89b8b2bec41e493 \
--hash=sha256:4e5647563d11f57df239988371db2eeed8246ad4673eb3d798892d1812e5d653 \
--hash=sha256:4e7a0735a04545386df64eb8bc9aea9971b172584066e0d88af8404ba6ccbbd9 \
--hash=sha256:4ec0e12623b53b3548239f0082bc2417e71543e2e5b7b4f49c56545f52013f7f \
--hash=sha256:50b0318222b99b27cb3abff3f85983e36a33fb785445402930b28d2c3fe320d0 \
--hash=sha256:541650f00ecaff32b486ca0a89fd74a2493e35e0cfe1142b4a66b852de6e00c4 \
--hash=sha256:568ad9f34ec4118e7e1b9b583c086576ac68add40232ae57a2b1d4bd4834705e \
--hash=sha256:5ee2e5138ef28b7cf920fedb313b0e605bc66bd2d46c9abcd9656d18ed4eb660 \
--hash=sha256:61f7f6b12264d52eba5235580edecd0bad0aac7c1c5ba0a0970373c5d19b81d7 \
--hash=sha256:6508bd089be94174608c0d95f95983b891daa07181eef4aaae2ff55930a3022b \
--hash=sha256:6883311bdd673d27781cbb8e06cc623aef497aa970e5e532cb79a13460955d09 \
--hash=sha256:695466fe8933430d53894f91ce3a468383a6c1a2f89eeddd05dad21377ea94d9 \
--hash=sha256:6ec791c115dbfa20d0a4d4f0a2c336886f6abb30025a6ac2eb42b94c581bdd67 \
--hash=sha256:725b01b6cb4b744b846041168b02dcf05908ce02e544aa35d64dbcf2448efd05 \
--hash=sha256:74eb211e4a755d6f8b9704239c42d06cdcb42beb2030a707d629e8db092faf72 \
--hash=sha256:8d126f0d2784d53aa613c009b89677bbf88defb3bf7a66e9b8e60e0859f23aa4 \
--hash=sha256:9df22644fe0b022f8dbdd56bc066ce02d29a67e5d7a543949f1bd43638234ce9 \
--hash=sha256:a2864cb9093d89b5ccfcdd124da6b8feb3cc3ac7891ab5b43b7131a8a0050bd9 \
--hash=sha256:a6e028be4c38d9c11a408a2fbd89626d0bbf1eb89996bf0beaf1e11453937bd6 \
--hash=sha256:af8c4792272f85b0f9da70f3c3670bc3163590d5c9964412ed47ab3f31138c21 \
--hash=sha256:b15df0645f067c229cafdbc5160c3a0512b3ec16f3c77252dc83341312329fc9 \
--hash=sha256:bd8a06f0f16bb502887fada29b2d9f3cec4c6e44e230fdf0cc67452fa0232f7c \
--hash=sha256:c5b91c62bc274d0a83ac88088a6db2dac1301acb8aa7bf80a901a07120361e1d \
--hash=sha256:c79c1892e0b582660f1d821b0b68bb6100ca60dc13cfc2553e3c12939907fa75 \
--hash=sha256:c9168f0251bbb6806fd85dea7e145b53163f3e74626bf65b8b62b24121bbb038 \
--hash=sha256:c9ebcd1603ace5768934668e940bc3f7a23973b06c833031bb3ef1ff6d5193bf \
--hash=sha256:cda00948032969affce349588ee8638eae97f47b8b10b4064e7e9bf6bda3410d \
--hash=sha256:d1fcf83866b77faf501eba458cc59760d8945a310ba53a8d47d9bb04592cb1cb \
--hash=sha256:db4919488de1215650316284fe079f07b463d4c5f96ce01b338adaac8f35936d \
--hash=sha256:dfa11a83c615a7cfd407e47cc6b8576aad2322bc6ce4af2b6a916fb634a5556e \
--hash=sha256:e90b8be14ded4f01f71c23034600b088594417e42a7bbdd132e87d923246db0e \
--hash=sha256:eee0250b6cfc30eca89f06fc4d455aad51f657da05612dfe6207aa9be870edb7 \
--hash=sha256:f1b5149c8064e9d47d98d382ed54037f0ba25ca9c1e2b1d1cd9958c3808ced44 \
--hash=sha256:f223183a9e5c8e2044f6347c07b71deab4dac36d44de46163ff3358cb4f909c8 \
--hash=sha256:f50300386c030a1152c1c97a02f880bc80bc8ddff500b782fd41334382f0dbda \
--hash=sha256:fa1f45ca2b2b60bd3c88cea33bb8ca948f3dd44795049477248c804e2c02b726 \
--hash=sha256:fa897a9ae335559d26d63656d4d34f4a9a0e63be3cb67624fdcd448b7d010536 \
--hash=sha256:fb8d69564a3b682d8f1dd79a97b52f6525a2a4939ef9a23c7b108ec2f973a42a
maxminddb==2.6.1 \
--hash=sha256:03f59f5c06bb54907e74f8a5d5149032a6e14cb2d990e17e4b0446d18195ede6 \
--hash=sha256:0855c3532063e16c71b9ca7f624d3061f0e6da03a1e4ff7fabf9253a278b3016 \
--hash=sha256:0f5286b5db8065a59cf9e005281c9d74d3839a8cda8e8ee04305d42d5afcc523 \
--hash=sha256:103c7c5740a63d42f1062a99c79712d73106b3b0663c4e6c559f502b673c50c8 \
--hash=sha256:153ca60a282d5ba1db86eedd27b6bb0e158d0f94682598f9900f20690e01395f \
--hash=sha256:16dc122ebaae59922c007bcb9cf2a0621f550392b54f7f5e0171baa111be5a55 \
--hash=sha256:17272badaa3e0293858ea9a48fe3e9fe8d6b20cc465a54cd4766d05aeff6ca59 \
--hash=sha256:21e93c0d094d167bb96ab49c89df2746d78c99228c5273bd7dc6d11385dd63b3 \
--hash=sha256:2319e73cad84bb3897a0cfbe8473a87b0e83b7a69b84118be829cc761a4388ac \
--hash=sha256:2396eb49868c2f078ba566359b66249643409dfca1372b5497cef06bf7965c4a \
--hash=sha256:242e572b3e132146acd0e2633c00564a8e33cf6de54c060778c618070d109054 \
--hash=sha256:24f362eb049109f01dda5adba03d703d1a83e73fa95569ea2bc723a7ecbbea2b \
--hash=sha256:2a943e4a0dd59bd6b98ee131f40bdf4efbab8db7667c3dfa9165b1e06ed3b46d \
--hash=sha256:2ad27b9a06da43f0192e19e772b3fc01b72a6d231d55e665ec675a235533b0c5 \
--hash=sha256:30d66df204847ab114b84b04adf60e91a1dc1a30ab42a3e41337ed10efb4f2ab \
--hash=sha256:32571299316c01eecfc364cd5b94cfa2a484ee45b1cb2cd80464d7f666c4be11 \
--hash=sha256:33859797f89c2949f86a98a0b89dc577a40561643e78084ad44307bbdc40dd76 \
--hash=sha256:39be382e82ecf231869e4c3f628f18b21f032b7bc42f980b75f042c16818b991 \
--hash=sha256:3c8db454446d83b65bd605f6093400897a8698de82ca1c20f37494361ee5b6a7 \
--hash=sha256:3ce8cdf86cbfb569fe7f33dbef283476d7693e002a4b73195996655067f770bd \
--hash=sha256:3eb4711af74a6d8e10e28095c2a18a7ab010826d68665757383c140989f7e075 \
--hash=sha256:3f04a217240323caea98adb0eaf0342466656486fc27b18ff53f74414dbaecce \
--hash=sha256:416f3fddd1add9a421483b26d24abaf2dd355f3a5afd72923681698d345d99d6 \
--hash=sha256:41af38a328cfa94041135753b7ab2dc08863b22535a4295f6e65f72de0a862b9 \
--hash=sha256:44d546d6f8ac103c13daf965ac1970a6a32a8b2f33bdbc8a280f87383ce7c5cd \
--hash=sha256:45d78c8e527ea90947d04450709032459221011a2d14cf5ac645ca1f76e8e7f2 \
--hash=sha256:4774750c744c378653536ad6d5f8e28bcb2566e7e24081e881b00c95b51cad09 \
--hash=sha256:4a2a1b713ceea188d066ca676c033f334baad4f41bc1d89640c9795d514b6617 \
--hash=sha256:4a75d73d8aaa82718d3553880951d1b7fe8c1cd309a84b992ca7789b832b1de7 \
--hash=sha256:4d718bb2379d06e8ca3c4aa09f22634e84fe76db44f66845d7c18c1f0e414fd6 \
--hash=sha256:4e21d5ccf34eb1eee14d95c616b7628035953ed4d79ff560188014ae7f1aaaf7 \
--hash=sha256:5555698be89fa568b787570911a2aa5c666c335c12dcc5cd8166f96e3155e210 \
--hash=sha256:5719b58cfbed4464f89afcbdbaf1eb84f9de805f1716f27c671bf11635ce5458 \
--hash=sha256:58a070a18ca6d17d79002b35351fa9373012a98ad5680c0c49d0794c1286d9d9 \
--hash=sha256:6acc873145aade367d39f5c2c013eeba1fc7709c1cca8aa9a46dd25db12958ef \
--hash=sha256:6c5d591f625e03b0a34df0c7ff81580676397b8335e13ece130c6e39e4a3afb9 \
--hash=sha256:6d3790e9ee0157a320b0aa7ddf9f33290f33797608beae604b202a24aaf9db17 \
--hash=sha256:81a1070b61e2fabff936d256490924e49c8b54d3f9fa61f32c0c91b83dc11259 \
--hash=sha256:86457125adccf5c248d481fc1cd80e77674afeaf45995aed480a3c7e0e118ddc \
--hash=sha256:87989f153ce9a0974c69bb0bf26a3cb339c7dfbbfe3330883075543d8ef70fc5 \
--hash=sha256:8eb72818e43d2e52e896e72622f41219afe98913eda456ef626fb10a636acca3 \
--hash=sha256:940c349e0937e1123f1ae7f213e4a7e90e972cd4501c5898ec70814e4c472747 \
--hash=sha256:9ac567627ac141d3e1a797b5696b4e652b1660ddfa6c861f202eed1eb34143ab \
--hash=sha256:9b8ef7ed2bbbd8216a0560dd06caafe2fc1d6f9fa18cf46282c6f4a9a3d91b9c \
--hash=sha256:9c5aa6d50a30cc733b57afa80cbb51c004a7beac23a6c6a56e3550992faaeac1 \
--hash=sha256:9eb6a13e781e2e7a02e88734e29139fb0e5e4024020b146da56202893e425595 \
--hash=sha256:a029d2c23b8ad9f4e8316319d79f0d55899aa8e6d69a2bee77d998991256dee0 \
--hash=sha256:a467ebf7cec651001a318aab5c9582f6774886e8d2d86aac77db33e5006ea118 \
--hash=sha256:ae3c76fbc989eca9b31512ae899528a9dae9092f4c9b7e807ed55b9ff4254ed0 \
--hash=sha256:b1090088504c4b45cf1f3ffc32eabd6d5065e56883d910658e5d5f31e80e4be4 \
--hash=sha256:b3863e6017b96ee3ae1a6bb7ef0c25cd9013b04cccc1fd27880ab6371cdd1d84 \
--hash=sha256:b8e0fa2ec7f58411262ab3edd837d3a1844e6068e128eca222867ad465b97e9d \
--hash=sha256:bcc9ac85007ab222838974b084f49bb62531669e793a7730260dec2cf6e34bfd \
--hash=sha256:c8f9fcd1bb0e016e7a2ff2341920f99932cd0f573e18bc89e9ad168c9cb93392 \
--hash=sha256:c9dd4275749d1d3fb3700df373cd593235ee307f17a3180bad151562e8294a61 \
--hash=sha256:cd4afedf6fab1678e5fac0f0cdeb9be2f77fcc07ae1ebc5abe788aec32dd3de8 \
--hash=sha256:d0a8b70fcfa0980c0e8501e1506115dbd6f2410436f54161647627430d7cbb66 \
--hash=sha256:d44081ec6633a225e051eaf851aa5986aae5f5c8c1f33cf78b3a825c5d0df642 \
--hash=sha256:d45a6a5d964182ff083f2ee545d049517e88f0898ab4df3e119582518cd97b64 \
--hash=sha256:db8e0a5c1262d43ba5d0f6efb357ba9e5b65b7f3fc982b77a9f543f222a7fca3 \
--hash=sha256:e973d98f3bf828a94016d3875cb44e17739ad3957282505c16c68d20cf3a70a1 \
--hash=sha256:f117fe0b5bafee78dbd97606dc60bba2160cfe1968484925174d7aadb7a38f37 \
--hash=sha256:f11a0899eb671c77dc131c8dd5d6702eb2d7c19952790c87b36ef72d73696bc2 \
--hash=sha256:f1481c05b2a7fa909bb48ada037d2c920d7845ea737d9a1e6513ab1c85a64a32 \
--hash=sha256:f40c1a145550a297b8c8743d62b8b1bf9fa572b36fa1df9157ea45fed0da9abc \
--hash=sha256:f6edc11c4fb4c1ecbfb28cc5da167f7db415c4fabc1aeff0171b06473057e5fb \
--hash=sha256:fa43c3783da55ca2a2ed68b97048b63c86ee1462caf32e5f9bfe038db9dac31f \
--hash=sha256:fb56115caee4f3beafd2907845dc8f80c633424cbe270a3738f6ba609ff7248e \
--hash=sha256:fc3526c587f53dd32a5191e81f4239bb3ead70f56a97936b3427b72e3a5cc55f
# via -r requirements.in
requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \

View file

@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
idna==3.6 \
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
idna==3.7 \
--hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
--hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
# via requests
requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

View file

@ -1,4 +1,4 @@
FROM python:3.12.2-alpine3.19@sha256:25a82f6f8b720a6a257d58e478a0a5517448006e010c85273f4d9c706819478c
FROM python:3.12.3-alpine3.19@sha256:ef097620baf1272e38264207003b0982285da3236a20ed829bf6bbf1e85fe3cb
WORKDIR /tmp

Some files were not shown because too many files have changed in this diff Show more