lxconsole/lxconsole/templates/main.html

278 lines
11 KiB
HTML

<!DOCTYPE html>
<html lang="en">
{% include 'head.html' %}
<!-- Add dark-mode class to body for dark theme-->
<body class="hold-transition sidebar-mini layout-fixed layout-navbar-fixed">
<script>0</script>
<div class="wrapper">
{% include 'navbar.html' %}
{% include 'sidebar.html' %}
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<div class="container-fluid">
{% block header %}
{% endblock header %}
</div>
</section>
<!-- Main content -->
<section class="content">
<div class="container-fluid" id="page-container"">
<div class="row">
{% block content %}
{% endblock content %}
</div>
</div>
</section>
</div>
{% include 'modals/main.html' %}
{% block modal %}
{% endblock modal %}
<footer class="main-footer">
<div class="float-right d-none d-sm-block">
Version 0.4.0
</div>
Copyright &copy; 2020-Present <a href="https://penninglabs.com">Penning Labs</a>. All rights reserved.
</footer>
</div>
<!-- ./wrapper -->
<!-- jQuery - https://code.jquery.com/jquery-3.7.1.js -->
<script src="../static/js/jquery/jquery-3.7.1.js"></script>
<!-- Bootstrap 5 - https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js -->
<script src="../static/js/bootstrap/bootstrap-5.2.3.bundle.min.js"></script>
<!-- jQuery Datatables - https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js -->
<script src="../static/js/datatables/jquery.dataTables-1.13.6.min.js"></script>
<!-- Datatables Bootstrap 5 - https://cdn.datatables.net/1.13.6/js/dataTables.bootstrap5.min.js -->
<script src="../static/js/datatables/dataTables.bootstrap5.min.js"></script>
<script src="../static/js/jquery-knob/jquery.knob.min.js"></script>
<!-- AdminLTE App -->
<script src="../static/dist/js/adminlte.min.js"></script>
<!-- Page specific script -->
<script src="../static/js/sidebar.js"></script>
<script>
function changeProject(project){
window.location.href = 'server?id=' + serverId + '&project=' + project;
// var url = new URL(window.location);
// var search_params = url.searchParams;
// search_params.set('project', project);
// url.search = search_params.toString();
// location = url.toString();
}
function changeServer(id){
window.location.href = 'server?id=' + id;
// var url = new URL(window.location);
// var search_params = url.searchParams;
// search_params.set('id', id);
// url.search = search_params.toString();
// location = url.toString();
}
function loadAccountModal(){
console.log("Info: loading account modal");
$.get("../api/users/get_user?id={{ page_user_id }}", function (data) {
data = data.metadata
$("#usernameEditInput").val(data.username);
$("#firstNameEditInput").val(data.first_name);
$("#lastNameEditInput").val(data.last_name);
$("#emailEditInput").val(data.email);
$("#accountModal").modal('show');
});
}
function populateServerSelectDropdown() {
//Populate the Server dropdown
$.getJSON("../api/servers/list_servers?id="+serverId, function (data) {
data = data.data
for (var index = 0; index < data.length; index++) {
if (data[index].name == '')
optionText = data[index].addr
else
optionText = data[index].name + ' (' + data[index].addr + ')'
if (data[index].id == serverId)
$('#serverListNav').append('<option value="' + data[index].id + '" selected="selected">' + optionText + '</option>');
else
$('#serverListNav').append('<option value="' + data[index].id + '">' + optionText + '</option>');
}
})
}
function populateProjectSelectDropdown() {
//Populate the Project dropdown
$.getJSON("../api/projects/list_projects?id="+serverId+"&project="+project, function (data) {
data = data.metadata
for (var index = 0; index < data.length; index++) {
optionText = data[index].replace('/1.0/projects/','');
if (optionText == project)
$('#projectListNav').append('<option value="' + optionText + '" selected="selected">' + optionText + '</option>');
else
$('#projectListNav').append('<option value="' + optionText + '">' + optionText + '</option>');
}
})
}
function updateAccount(){
$.post("../api/users/update_user", {
id: "{{ page_user_id }}",
username: $("#usernameEditInput").val(),
first_name: $("#firstNameEditInput").val(),
last_name: $("#lastNameEditInput").val(),
email: $("#emailEditInput").val(),
password: $("#passwordEditInput").val(),
confirm_password: $("#confirmPasswordEditInput").val()
}, function (data) {
console.log(data);
if (data.alert){
alert(data.alert);
}
});
}
operationReloadTimeout = ''
operationReloadTime = 5000
operationExists = false
function operationStatusCheck(){
//Clear the automatic page reload
clearTimeout(operationReloadTimeout);
//Request list of opertions
$.get("../api/operations/list_operations?id="+serverId+"&project=" + project + "&recursion=1", function (data) {
//Clear any previous messages in notification area
$('#notificationText').text("");
notification = ""
// Check if we have any running operations
if (data.metadata.hasOwnProperty('running') && data.metadata.running.length > 0){
// Loop through each operation to find one to display
for (let i = 0; i < data.metadata.running.length; i++) {
// Check if task has a description property
if (data.metadata.running[i].hasOwnProperty('description') && data.metadata.running[i].description != null) {
// Create an array of descriptions that we do not want to display
ignoredDescriptions = ['Showing console','Executing command']
// Check if description is in the ignored array
if (ignoredDescriptions.includes(data.metadata.running[i].description)){
continue
}
operationExists = true;
notification += data.metadata.running[i].description
// Downloading image should also have download_progress that can be displayed
if (data.metadata.running[i].description == 'Downloading image'){
if (data.metadata.running[i].hasOwnProperty('metadata') && data.metadata.running[i].metadata != null) {
if (data.metadata.running[i].metadata.hasOwnProperty('download_progress') && data.metadata.running[i].metadata.download_progress != null) {
notification += ' ' + data.metadata.running[i].metadata.download_progress
}
}
}
// Many of the operations will indicate which resource the operation is being perfomed on
if (data.metadata.running[i].hasOwnProperty('resources') && data.metadata.running[i].resources != null) {
if (data.metadata.running[i].resources.hasOwnProperty('instances') && data.metadata.running[i].resources.instances != null) {
notification += " " + data.metadata.running[i].resources.instances[0].replace("/1.0/instances/","")
}
else if (data.metadata.running[i].resources.hasOwnProperty('containers') && data.metadata.running[i].resources.containers != null) {
notification += " " + data.metadata.running[i].resources.containers[0].replace("/1.0/containers/","")
}
else if (data.metadata.running[i].resources.hasOwnProperty('virtual-machines') && data.metadata.running[i].resources.virtual-machines != null) {
notification += " " + data.metadata.running[i].resources.virtual-machines[0].replace("/1.0/virtual-machines/","")
}
}
// Display the notification message and end the loop
$('#notificationText').text(notification)
break
}
}
}
// Check if we have any failed operations
else if (data.metadata.hasOwnProperty('failure') && data.metadata.failure.length > 0){
// Loop through each operation to find one to display
for (let i = 0; i < data.metadata.running.length; i++) {
// Check if task has a description property
if (data.metadata.failure[i].hasOwnProperty('description') && data.metadata.failure[i].description != null) {
notification += data.metadata.failure[i].description
// Many of the operations will indicate which resource the operation is being perfomed on
if (data.metadata.failure[i].hasOwnProperty('resources') && data.metadata.failure[i].resources != null) {
if (data.metadata.failure[i].resources.hasOwnProperty('instances') && data.metadata.failure[i].resources.instances != null) {
notification += " " + data.metadata.failure[i].resources.instances[i].replace("/1.0/instances/","")
}
else if (data.metadata.failure[i].resources.hasOwnProperty('containers') && data.metadata.failure[i].resources.containers != null) {
notification += " " + data.metadata.failure[i].resources.containers[i].replace("/1.0/containers/","")
}
else if (data.metadata.failure[i].resources.hasOwnProperty('virtual-machines') && data.metadata.failure[i].resources.virtual-machines != null) {
notification += " " + data.metadata.failure[i].resources.virtual-machines[i].replace("/1.0/virtual-machines/","")
}
}
if (data.metadata.failure[i].hasOwnProperty('err')){
notification += ". Failure: " + data.metadata.failure[i].err
}
// Log the error notification to the console
console.log(notification)
// Display the notification message and end the loop
$('#notificationText').text(notification)
break
}
}
}
else {
// If we had an existing running operation, reload page to update
if (operationExists) {
reloadPageContent()
}
operationExists = false
}
// Schedule operationStatusCheck to run again
operationReloadTimeout = setTimeout(() => { operationStatusCheck(); }, operationReloadTime);
});
}
</script>
{% block script %}
{% endblock script %}
</body>
</html>