Compare commits
7 Commits
ffcf0d084e
...
139b669495
Author | SHA1 | Date | |
---|---|---|---|
139b669495 | |||
e5ad0d0516 | |||
d5e14c8e2e | |||
ee335cfbd7 | |||
29ee3522b2 | |||
d7c8034672 | |||
a730a3ac05 |
52
app/main.py
52
app/main.py
@ -76,6 +76,28 @@ def __get_token(request: Request) -> dict:
|
|||||||
return jwt.decode(token=token, key=jwt_decode_key, algorithms=ALGORITHMS.RS256, options={'verify_aud': False})
|
return jwt.decode(token=token, key=jwt_decode_key, algorithms=ALGORITHMS.RS256, options={'verify_aud': False})
|
||||||
|
|
||||||
|
|
||||||
|
def __json_config() -> dict:
|
||||||
|
return {
|
||||||
|
'VERSION': str(VERSION),
|
||||||
|
'COMMIT': str(COMMIT),
|
||||||
|
'DEBUG': str(DEBUG),
|
||||||
|
'DLS_URL': str(DLS_URL),
|
||||||
|
'DLS_PORT': str(DLS_PORT),
|
||||||
|
'SITE_KEY_XID': str(SITE_KEY_XID),
|
||||||
|
'INSTANCE_REF': str(INSTANCE_REF),
|
||||||
|
'ALLOTMENT_REF': [str(ALLOTMENT_REF)],
|
||||||
|
'TOKEN_EXPIRE_DELTA': str(TOKEN_EXPIRE_DELTA),
|
||||||
|
'LEASE_EXPIRE_DELTA': str(LEASE_EXPIRE_DELTA),
|
||||||
|
'LEASE_RENEWAL_PERIOD': str(LEASE_RENEWAL_PERIOD),
|
||||||
|
'CORS_ORIGINS': str(CORS_ORIGINS),
|
||||||
|
'TZ': str(TZ),
|
||||||
|
# static / calculated
|
||||||
|
'LEASE_RENEWAL_DELTA': str(LEASE_RENEWAL_DELTA),
|
||||||
|
'LEASE_CALCULATED_RENEWAL': str(Lease.calculate_renewal(LEASE_RENEWAL_PERIOD, LEASE_RENEWAL_DELTA)),
|
||||||
|
'CLIENT_TOKEN_EXPIRE_DELTA': str(CLIENT_TOKEN_EXPIRE_DELTA),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@app.get('/', summary='* Index')
|
@app.get('/', summary='* Index')
|
||||||
async def index():
|
async def index():
|
||||||
return RedirectResponse('/-/')
|
return RedirectResponse('/-/')
|
||||||
@ -93,21 +115,7 @@ async def _health():
|
|||||||
|
|
||||||
@app.get('/-/config', summary='* Config', description='returns environment variables.')
|
@app.get('/-/config', summary='* Config', description='returns environment variables.')
|
||||||
async def _config():
|
async def _config():
|
||||||
return JSONr({
|
return JSONr(__json_config())
|
||||||
'VERSION': str(VERSION),
|
|
||||||
'COMMIT': str(COMMIT),
|
|
||||||
'DEBUG': str(DEBUG),
|
|
||||||
'DLS_URL': str(DLS_URL),
|
|
||||||
'DLS_PORT': str(DLS_PORT),
|
|
||||||
'SITE_KEY_XID': str(SITE_KEY_XID),
|
|
||||||
'INSTANCE_REF': str(INSTANCE_REF),
|
|
||||||
'ALLOTMENT_REF': [str(ALLOTMENT_REF)],
|
|
||||||
'TOKEN_EXPIRE_DELTA': str(TOKEN_EXPIRE_DELTA),
|
|
||||||
'LEASE_EXPIRE_DELTA': str(LEASE_EXPIRE_DELTA),
|
|
||||||
'LEASE_RENEWAL_PERIOD': str(LEASE_RENEWAL_PERIOD),
|
|
||||||
'CORS_ORIGINS': str(CORS_ORIGINS),
|
|
||||||
'TZ': str(TZ),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@app.get('/-/readme', summary='* Readme')
|
@app.get('/-/readme', summary='* Readme')
|
||||||
@ -115,28 +123,32 @@ async def _readme(request: Request):
|
|||||||
from markdown import markdown
|
from markdown import markdown
|
||||||
content = load_file('../README.md').decode('utf-8')
|
content = load_file('../README.md').decode('utf-8')
|
||||||
markdown = markdown(text=content, extensions=['tables', 'fenced_code', 'md_in_html', 'nl2br', 'toc'])
|
markdown = markdown(text=content, extensions=['tables', 'fenced_code', 'md_in_html', 'nl2br', 'toc'])
|
||||||
context = {'request': request, 'markdown': markdown, 'VERSION': VERSION}
|
context = {'request': request, 'VERSION': VERSION, 'markdown': markdown }
|
||||||
return templates.TemplateResponse(name='views/dashboard_readme.html', context=context)
|
return templates.TemplateResponse(name='views/dashboard_readme.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
@app.get('/-/manage', summary='* Management UI')
|
@app.get('/-/manage', summary='* Management UI')
|
||||||
async def _manage(request: Request):
|
async def _manage(request: Request):
|
||||||
return templates.TemplateResponse(name='views/manage.html', context={'request': request, 'VERSION': VERSION})
|
context = {'request': request, 'VERSION': VERSION}
|
||||||
|
return templates.TemplateResponse(name='views/manage.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
@app.get('/-/dashboard', summary='* Dashboard')
|
@app.get('/-/dashboard', summary='* Dashboard')
|
||||||
async def _dashboard(request: Request):
|
async def _dashboard(request: Request):
|
||||||
return templates.TemplateResponse(name='views/dashboard.html', context={'request': request, 'VERSION': VERSION})
|
context = {'request': request, 'VERSION': VERSION, 'CONFIG': __json_config()}
|
||||||
|
return templates.TemplateResponse(name='views/dashboard.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
@app.get('/-/dashboard/origins', summary='* Dashboard - Origins')
|
@app.get('/-/dashboard/origins', summary='* Dashboard - Origins')
|
||||||
async def _dashboard_origins(request: Request):
|
async def _dashboard_origins(request: Request):
|
||||||
return templates.TemplateResponse(name='views/dashboard_origins.html', context={'request': request, 'VERSION': VERSION})
|
context = {'request': request, 'VERSION': VERSION}
|
||||||
|
return templates.TemplateResponse(name='views/dashboard_origins.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
@app.get('/-/dashboard/leases', summary='* Dashboard - Leases')
|
@app.get('/-/dashboard/leases', summary='* Dashboard - Leases')
|
||||||
async def _dashboard_origins(request: Request):
|
async def _dashboard_origins(request: Request):
|
||||||
return templates.TemplateResponse(name='views/dashboard_leases.html', context={'request': request, 'VERSION': VERSION})
|
context = {'request': request, 'VERSION': VERSION}
|
||||||
|
return templates.TemplateResponse(name='views/dashboard_leases.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
@app.get('/-/origins', summary='* Origins')
|
@app.get('/-/origins', summary='* Origins')
|
||||||
|
12
app/static/assets/css/bootstrap-icons.min.css
vendored
12
app/static/assets/css/bootstrap-icons.min.css
vendored
File diff suppressed because one or more lines are too long
8
app/static/assets/css/bootstrap.min.css
vendored
8
app/static/assets/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
7
app/static/assets/js/bootstrap.min.js
vendored
7
app/static/assets/js/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
@ -8,15 +8,50 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ 'active' if request.url.path == '/-/dashboard/origins' }}" aria-current="page" href="/-/dashboard/origins">
|
<a class="nav-link {{ 'active' if request.url.path == '/-/dashboard/origins' }}" aria-current="page" href="/-/dashboard/origins">
|
||||||
<i class="bi-pc-display-horizontal"></i> Origins
|
<i class="bi-pc-display-horizontal"></i> Origins <span id="origin-cnt" class="badge text-bg-secondary"></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ 'active' if request.url.path == '/-/dashboard/leases' }}" aria-current="page" href="/-/dashboard/leases">
|
<a class="nav-link {{ 'active' if request.url.path == '/-/dashboard/leases' }}" aria-current="page" href="/-/dashboard/leases">
|
||||||
<i class="bi-layers"></i> Leases
|
<i class="bi-layers"></i> Leases <span id="lease-cnt" class="badge text-bg-secondary"></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<script type="application/javascript">
|
||||||
|
function loadLOriginCnt() {
|
||||||
|
let xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", '/-/origins?leases=false', true);
|
||||||
|
xhr.onreadystatechange = function () {
|
||||||
|
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
|
||||||
|
const x = JSON.parse(xhr.response)
|
||||||
|
document.getElementById('origin-cnt').innerHTML = x.length
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadLeaseCnt() {
|
||||||
|
let xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", '/-/leases?origin=false', true);
|
||||||
|
xhr.onreadystatechange = function () {
|
||||||
|
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
|
||||||
|
const x = JSON.parse(xhr.response)
|
||||||
|
document.getElementById('lease-cnt').innerHTML = x.length
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
// load initial
|
||||||
|
loadLOriginCnt()
|
||||||
|
loadLeaseCnt()
|
||||||
|
|
||||||
|
// refresh every 5 seconds
|
||||||
|
setInterval(() => {
|
||||||
|
loadLOriginCnt()
|
||||||
|
loadLeaseCnt()
|
||||||
|
}, 5000);
|
||||||
|
</script>
|
||||||
|
|
||||||
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
|
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
|
||||||
<span>Help</span>
|
<span>Help</span>
|
||||||
|
@ -29,8 +29,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">Configuration</h5>
|
||||||
|
<h6 class="card-subtitle mb-2 text-body-secondary">
|
||||||
|
Using timezone: {{ CONFIG.TZ }}. Make sure this is correct and match your clients!
|
||||||
|
</h6>
|
||||||
|
<p class="card-text">
|
||||||
|
Your clients renew their license every {{ CONFIG.LEASE_CALCULATED_RENEWAL }}.<br/>
|
||||||
|
If the renewal fails, the license is {{ CONFIG.LEASE_RENEWAL_DELTA }} valid.<br/>
|
||||||
|
<br/>
|
||||||
|
Your client-token file (.tok) is valid for {{ CONFIG.CLIENT_TOKEN_EXPIRE_DELTA }}.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
<pre id="config"></pre>
|
<pre id="config"></pre>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
|
@ -18,9 +18,10 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="load()" title="refresh">
|
<button type="button" class="btn btn-sm btn-outline-secondary me-2" onclick="load()" title="refresh">
|
||||||
<i class="bi bi-arrow-clockwise"></i>
|
<i class="bi bi-arrow-clockwise"></i>
|
||||||
</button>
|
</button>
|
||||||
|
<button id="btn-auto-refresh" type="button" class="btn btn-sm active">auto-refresh</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -31,11 +32,29 @@
|
|||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
<script type="application/javascript">
|
<script type="application/javascript">
|
||||||
|
let autoRefresh = true
|
||||||
|
|
||||||
function load() {
|
function load() {
|
||||||
const leases = document.getElementById('leases')
|
const leases = document.getElementById('leases')
|
||||||
fetchLeases(leases)
|
fetchLeases(leases)
|
||||||
}
|
}
|
||||||
|
|
||||||
load()
|
load()
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
if(autoRefresh)
|
||||||
|
load()
|
||||||
|
}, 5000);
|
||||||
|
|
||||||
|
const btnAutoRefresh = document.getElementById('btn-auto-refresh')
|
||||||
|
btnAutoRefresh.addEventListener("click", () => {
|
||||||
|
if(btnAutoRefresh.classList.contains('active')) {
|
||||||
|
autoRefresh = false
|
||||||
|
btnAutoRefresh.classList.remove('active')
|
||||||
|
} else {
|
||||||
|
autoRefresh = false
|
||||||
|
btnAutoRefresh.classList.add('active')
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -21,9 +21,10 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="load()" title="refresh">
|
<button type="button" class="btn btn-sm btn-outline-secondary me-2" onclick="load()" title="refresh">
|
||||||
<i class="bi bi-arrow-clockwise"></i>
|
<i class="bi bi-arrow-clockwise"></i>
|
||||||
</button>
|
</button>
|
||||||
|
<button id="btn-auto-refresh" type="button" class="btn btn-sm active">auto-refresh</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -34,6 +35,8 @@
|
|||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
<script type="application/javascript">
|
<script type="application/javascript">
|
||||||
|
let autoRefresh = true
|
||||||
|
|
||||||
function load() {
|
function load() {
|
||||||
const origins = document.getElementById('origins')
|
const origins = document.getElementById('origins')
|
||||||
fetchOriginsWithLeases(origins)
|
fetchOriginsWithLeases(origins)
|
||||||
@ -47,5 +50,21 @@
|
|||||||
if (response)
|
if (response)
|
||||||
deleteOrigins().finally(() => load())
|
deleteOrigins().finally(() => load())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
if(autoRefresh)
|
||||||
|
load()
|
||||||
|
}, 5000);
|
||||||
|
|
||||||
|
const btnAutoRefresh = document.getElementById('btn-auto-refresh')
|
||||||
|
btnAutoRefresh.addEventListener("click", () => {
|
||||||
|
if(btnAutoRefresh.classList.contains('active')) {
|
||||||
|
autoRefresh = false
|
||||||
|
btnAutoRefresh.classList.remove('active')
|
||||||
|
} else {
|
||||||
|
autoRefresh = false
|
||||||
|
btnAutoRefresh.classList.add('active')
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user