Skip to content

Commit

Permalink
v1.2.6
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewalanpenning committed Mar 2, 2021
1 parent 9cdbc2a commit ae6f846
Show file tree
Hide file tree
Showing 21 changed files with 584 additions and 363 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# v1.2.6
- moved local exports of backups to /var/lxdware/backups
- added compression algorithms options to creating backups
- added instance_only and optimized_storage options to creating backups
- modified backup export to provide a download link
- improved code to reduce PHP notices in error log for undefined variables and arrays
- added htmlentities() to a few echo statements that where missing it in the PHP code

# v1.2.5
- added ability to create an instance from JSON
- added "instance type" option to replicate cloud instance types from AWS, Azure, and GCE
Expand Down
2 changes: 1 addition & 1 deletion admin/about.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html lang="en">
<body>
<p><strong>About</strong>: The LXD Dashboard by LXDWARE is open source software that provides a web-based user interface for controlling your LXD infrastructure.</p>
<p><strong>Version</strong>: 1.2.5</p>
<p><strong>Version</strong>: 1.2.6</p>
<p><strong>License</strong>: GPL-3.0</p>
<p><strong>URL</strong>: https://lxdware.com</p>
</body>
Expand Down
62 changes: 53 additions & 9 deletions admin/instance.html
Original file line number Diff line number Diff line change
Expand Up @@ -573,10 +573,47 @@ <h5 class="modal-title" id="exampleModalLabel">Backup Instance</h5>
</div>
<div class="modal-body">
<div class="row">
<label class="col-2 col-form-label text-right">Name:</label>
<div class="col-9">
<label class="col-3 col-form-label text-right">Name:</label>
<div class="col-8">
<div class="form-group">
<input type="text" id="backupName" class="form-control" placeholder="" name="backupName">
</div>
</div>
</div>
<div class="row">
<label class="col-3 col-form-label text-right">Instance Only:</label>
<div class="col-8 text-right">
<div class="form-group">
<select id="backupInstanceOnly" class="form-control" name="backupInstanceOnly">
<option value="false" selected>false</option>
<option value="true">true</option>
</select>
</div>
</div>
</div>
<div class="row">
<label class="col-3 col-form-label text-right">Optimized Storage:</label>
<div class="col-8 text-right">
<div class="form-group">
<input type="text" id="backupName" class="form-control" placeholder="" name="copy">
<select id="backupOptimizedStorage" class="form-control" name="backupOptimizedStorage">
<option value="false" selected>false</option>
<option value="true">true</option>
</select>
</div>
</div>
</div>
<div class="row">
<label class="col-3 col-form-label text-right">Compression:</label>
<div class="col-8">
<div class="form-group">
<select id="backupCompressionAlgorithm" class="form-control" name="backupCompressionAlgorithm">
<option value="bzip2">bzip2</option>
<option value="gzip" selected>gzip</option>
<option value="lzma">lzma</option>
<option value="none">none</option>
<option value="xz">xz</option>
<option value="zstd">zstd</option>
</select>
</div>
</div>
</div>
Expand Down Expand Up @@ -1427,8 +1464,11 @@ <h5 class="modal-title" id="exampleModalLabel">About LXDWARE Dashboard</h5>

function createBackup(){
var backupName = $("#backupName").val();
var backupInstanceOnly = $("#backupInstanceOnly").val();
var backupOptimizedStorage = $("#backupOptimizedStorage").val();
var backupCompressionAlgorithm = $("#backupCompressionAlgorithm").val();
console.log("Info: backing up instance " + instanceName + " to " + backupName);
$.get("./php/lxd/instances.php?remote=" + encodeURI(remoteName) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&name=" + encodeURI(backupName) + "&action=createBackup", function (data) {
$.get("./php/lxd/instances.php?remote=" + encodeURI(remoteName) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&name=" + encodeURI(backupName) + "&instance_only=" + encodeURI(backupInstanceOnly) + "&optimized_storage=" + encodeURI(backupOptimizedStorage) + "&compression_algorithm=" + encodeURI(backupCompressionAlgorithm) + "&action=createBackup", function (data) {
var operationData = JSON.parse(data);
console.log(operationData);
if (operationData.status_code == 100 && operationData.metadata.status_code < 400){
Expand All @@ -1441,11 +1481,15 @@ <h5 class="modal-title" id="exampleModalLabel">About LXDWARE Dashboard</h5>
});
}

function downloadBackup(backupName){
console.log("Info: downloading backup " + backupName + " from instance " + instanceName);
$.get("./php/lxd/instances.php?remote=" + encodeURI(remoteName) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&name=" + encodeURI(backupName) + "&action=downloadBackup", function (data) {
console.log(data);
window.location.href = data;
function exportBackup(backupName){
console.log("Info: exporting backup " + backupName + " from instance " + instanceName + " to a file");
$('#spinner').show();
$('#notificationArea').show();
$('#notification').text('Exporting ' + backupName + ' to local file');
$.get("./php/lxd/instances.php?remote=" + encodeURI(remoteName) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&name=" + encodeURI(backupName) + "&action=exportBackupFile", function (data) {
$('#spinner').hide();
$('#notificationArea').hide();
$('#notification').text("");
});
}

Expand Down
217 changes: 121 additions & 96 deletions admin/php/lxd/instance-list.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,115 +19,140 @@
$url = "https://" . $row['host'] . ":" . $row['port'] . "/1.0/instances?recursion=2&project=" . $project;
$instance_api_data = shell_exec("sudo curl -k -L --connect-timeout 3 --cert $cert --key $key -X GET '$url'");
$instance_api_data = json_decode($instance_api_data, true);
$instance_api_data = $instance_api_data['metadata'];

$i = 0;
echo '{ "data": [';

foreach ($instance_api_data as $instance_data){

if ($instance_data['name'] == "")
continue;

if ($i > 0){
echo ",";
}
$i++;

echo "[ ";
if ($instance_data['status'] == "Running"){
echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'><i class='fas fa-cube fa-lg' style='color:#4e73df'></i> </a>";
echo '",';

if (isset($instance_api_data['metadata'])){
$instance_api_data = $instance_api_data['metadata'];

$i = 0;
echo '{ "data": [';

foreach ($instance_api_data as $instance_data){

if ($instance_data['name'] == "")
continue;

if ($i > 0){
echo ",";
}
$i++;

echo "[ ";
if ($instance_data['status'] == "Running"){
echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'><i class='fas fa-cube fa-lg' style='color:#4e73df'></i> </a>";
echo '",';

echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'> ".htmlentities($instance_data['name'])."</a>";
echo '",';
}
else {
echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'><i class='fas fa-cube fa-lg' style='color:#ddd'></i> </a>";
echo '",';

echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'> ".htmlentities($instance_data['name'])."</a>";
echo '",';
}

echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'> ".$instance_data['name']."</a>";
if (isset($instance_data['config']['image.os']))
echo htmlentities($instance_data['config']['image.os']);
else
echo "";
echo '",';
}
else {

echo '"' . htmlentities($instance_data['location']) . '",';

//IPv4
echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'><i class='fas fa-cube fa-lg' style='color:#ddd'></i> </a>";
echo '",';

echo '"';
echo "<a href='instance.html?instance=".$instance_data['name']."&remote=".$remote."&project=".$project."'> ".$instance_data['name']."</a>";
if (isset($instance_data['state']['network'])){
foreach ($instance_data['state']['network'] as $nic => $nic_properties){
foreach ($nic_properties['addresses'] as $nic_address){
if ($nic_address['family'] == "inet" && $nic_address['scope'] == "global"){
echo htmlentities($nic_address['address']) . " (" . htmlentities($nic) . ")<br />";
}
}
}
}
echo '",';
}

echo '"' . $instance_data['config']['image.os'] . '",';
echo '"' . $instance_data['location'] . '",';

//IPv4
echo '"';
foreach ($instance_data['state']['network'] as $nic=>$nic_properties){
foreach ($nic_properties['addresses'] as $nic_address){
if ($nic_address['family'] == "inet" && $nic_address['scope'] == "global"){
echo $nic_address['address'] . " (" . $nic . ")<br />";


//IPv6
echo '"';

if (isset($instance_data['state']['network'])){
foreach ($instance_data['state']['network'] as $nic => $nic_properties){
foreach ($nic_properties['addresses'] as $nic_address){
if ($nic_address['family'] == "inet6" && $nic_address['scope'] == "global"){
echo htmlentities($nic_address['address']) . " (" . htmlentities($nic) . ")<br />";
}
}
}
}
}
echo '",';

//IPv6
echo '"';
foreach ($instance_data['state']['network'] as $nic=>$nic_properties){
foreach ($nic_properties['addresses'] as $nic_address){
if ($nic_address['family'] == "inet6" && $nic_address['scope'] == "global"){
echo $nic_address['address'] . " (" . $nic . ")<br />";
echo '",';

echo '"' . htmlentities($instance_data['type']) . '",';

//Convert the memory usage to an appropriate unit
if ($instance_data['state']['memory']['usage'] < 1073741824){
$memory = number_format($instance_data['state']['memory']['usage']/1024/1024, 2);
$memory_unit = "MB";
}
else {
$memory = number_format($instance_data['state']['memory']['usage']/1024/1024/1024, 2);
$memory_unit = "GB";
}

echo '"' . htmlentities($memory) . " " . $memory_unit . '",';

//When first created, the root disk usage is not set for brief second causing a PHP Notice in error log for Undefined index: root
if (isset($instance_data['state']['disk']['root']['usage'])){
//Convert the storage usage to an approprate unit
if ($instance_data['state']['disk']['root']['usage'] < 1073741824){
$disk_total = number_format($instance_data['state']['disk']['root']['usage']/1024/1024,2);
$disk_unit = "MB";
}
if ($instance_data['state']['disk']['root']['usage'] >= 1073741824 && $instance_data['state']['disk']['root']['usage'] < 1099511627776) {
$disk_total = number_format($instance_data['state']['disk']['root']['usage']/1024/1024/1024,2);
$disk_unit = "GB";
}
if ($instance_data['state']['disk']['root']['usage'] >= 1099511627776){
$disk_total = number_format($instance_data['state']['disk']['root']['usage']/1024/1024/1024/1024,2);
$disk_unit = "TB";
}
}
else {
$disk_total = 0.00;
$disk_unit = "MB";
}


echo '"' . htmlentities($disk_total) . " " . $disk_unit . '",';
echo '"' . htmlentities($instance_data['status']) . '",';

if ($instance_data['status'] == "Running"){
echo '"';
echo "<a href='#' onclick=stopInstance('".$instance_data['name']."')> <i class='fas fa-stop fa-lg' style='color:#ddd' title='Stop' aria-hidden='true'></i> </a>";
echo '"';
}
else{
echo '"';
echo "<a href='#' onclick=startInstance('".$instance_data['name']."')> <i class='fas fa-play fa-lg' style='color:#ddd' title='Start' aria-hidden='true'></i> </a>";
echo '"';
}

echo " ]";

}
echo '",';

echo '"' . $instance_data['type'] . '",';

//Convert the memory usage to an appropriate unit
if ($instance_data['state']['memory']['usage'] < 1073741824){
$memory = number_format($instance_data['state']['memory']['usage']/1024/1024, 2);
$memory_unit = "MB";
}
else {
$memory = number_format($instance_data['state']['memory']['usage']/1024/1024/1024, 2);
$memory_unit = "GB";
}

echo '"' . $memory . " " . $memory_unit . '",';

//Convert the storage usage to an approprate unit
if ($instance_data['state']['disk']['root']['usage'] < 1073741824){
$disk_total = number_format($instance_data['state']['disk']['root']['usage']/1024/1024,2);
$disk_unit = "MB";
}
if ($instance_data['state']['disk']['root']['usage'] >= 1073741824 && $instance_data['state']['disk']['root']['usage'] < 1099511627776) {
$disk_total = number_format($instance_data['state']['disk']['root']['usage']/1024/1024/1024,2);
$disk_unit = "GB";
}
if ($instance_data['state']['disk']['root']['usage'] >= 1099511627776){
$disk_total = number_format($instance_data['state']['disk']['root']['usage']/1024/1024/1024/1024,2);
$disk_unit = "TB";
}

echo '"' . $disk_total . " " . $disk_unit . '",';
echo '"' . $instance_data['status'] . '",';

if ($instance_data['status'] == "Running"){
echo '"';
echo "<a href='#' onclick=stopInstance('".$instance_data['name']."')> <i class='fas fa-stop fa-lg' style='color:#ddd' title='Stop' aria-hidden='true'></i> </a>";
echo '"';
}
else{
echo '"';
echo "<a href='#' onclick=startInstance('".$instance_data['name']."')> <i class='fas fa-play fa-lg' style='color:#ddd' title='Start' aria-hidden='true'></i> </a>";
echo '"';
}

echo " ]";


echo " ]}";
}
else {
echo '{ "data": [] }';
}

echo " ]}";

}

}
Expand Down
Loading

0 comments on commit ae6f846

Please sign in to comment.