From 3489a20e46c601cc3fbb7ede8333b7d8eec4b048 Mon Sep 17 00:00:00 2001
From: matthewalanpenning
Date: Sat, 31 Jul 2021 15:44:58 -0400
Subject: [PATCH] v2.1.0
---
CHANGELOG.md | 8 +
README.md | 4 +-
lxd-dashboard/about.html | 31 +-
lxd-dashboard/images.html | 8 +-
lxd-dashboard/instances-single.html | 2234 ++++++++++++++++++--
lxd-dashboard/instances.html | 47 +-
lxd-dashboard/network-acls-egress.html | 569 +++++
lxd-dashboard/network-acls-ingress.html | 569 +++++
lxd-dashboard/network-acls.html | 18 +-
lxd-dashboard/networks.html | 989 ++++++++-
lxd-dashboard/php/aaa/authorization.php | 57 +-
lxd-dashboard/php/lxd/instances-single.php | 588 +++++-
lxd-dashboard/php/lxd/instances.php | 4 -
lxd-dashboard/php/lxd/network-acls.php | 283 ++-
lxd-dashboard/php/lxd/networks.php | 173 +-
lxd-dashboard/php/lxd/operations.php | 2 +-
lxd-dashboard/php/lxd/storage-pools.php | 20 +
lxd-dashboard/php/lxd/storage-volumes.php | 18 +
lxd-dashboard/profiles.html | 13 +-
lxd-dashboard/projects.html | 12 +-
lxd-dashboard/remotes.html | 10 +-
lxd-dashboard/settings.html | 55 +-
lxd-dashboard/sidebar.html | 2 +-
lxd-dashboard/simplestreams.html | 18 +-
lxd-dashboard/storage-pools.html | 20 +-
lxd-dashboard/storage-volumes.html | 13 +-
26 files changed, 5469 insertions(+), 296 deletions(-)
create mode 100644 lxd-dashboard/network-acls-egress.html
create mode 100644 lxd-dashboard/network-acls-ingress.html
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c900bfdd8c09db20b523ffcc4bd6f9f6cc131e4..c669e721bd83eeffecf6f23ee33a03866ef82ab3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+# v2.1.0
+- Feature: Users can now add network, disk, and proxy devices directly to an instance from a form
+- Feature: Users can now remove network, disk, and proxy devices from an instance using the dashboard
+- Feature: Additional configuration properties have been added to the web form for creating Networks
+- Feature: Users can add/remove Network ACL egress/ingress rules using the dashboard
+- Feature: The Exec terminal experience has been added to instances
+- Feature: Users can click on the "Check for updates" button in the About modal to get a version status
+
# v2.0.3
- Bug Fix: Continuing the bug fix from previous version, used float type casting for memory variables on remote-single page rather than letting PHP automatically deciding on variable type.
diff --git a/README.md b/README.md
index ff1487f4611acdfec55e1fa4b311d97b18ae19df..5e801f9b5afbe6332eac317fc1e54409c18e9d21 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# lxd-dashboard
-LXDWARE is an open source LXD dashboard that provides a web-based user interface for controlling the entire LXD-based virtual infrastructure. Some of the features include:
+This open source LXD dashboard is developed by LXDWARE and provides a web-based user interface capable of managing multiple LXD servers from a single location. Some of the features include:
- Connect and manage multiple LXD servers
- Create LXD container and virtual machine instances from either a form or JSON input
@@ -12,7 +12,7 @@ LXDWARE is an open source LXD dashboard that provides a web-based user interface
- Create, edit, apply, and remove LXD profiles
- Create, edit, and delete networks, storage pools, storage volumes, and projects
- Switch between projects on an LXD host
-- Interact with instances using web-based terminal console
+- Interact with instances using web-based terminal
- Create and download backups of LXD instance to your local computer
- Create local users and groups
- Apply role based access control
diff --git a/lxd-dashboard/about.html b/lxd-dashboard/about.html
index fb48bfeb608b5c736672c59111554c674c439b9f..f28aa46553f666973735852fae24e7f7a0808c6d 100644
--- a/lxd-dashboard/about.html
+++ b/lxd-dashboard/about.html
@@ -19,9 +19,32 @@ along with this program. If not, see .
- About : LXDWARE is an open source LXD dashboard that provides a web-based user interface for controlling the entire LXD-based virtual infrastructure.
- Version : 2.0.3
- License : AGPL-3.0
- URL : https://lxdware.com
+ This open source LXD dashboard is developed by LXDWARE and provides a web-based user interface capable of managing multiple LXD servers from a single location.
+
+ Version : v2.1.0
+ License : AGPL-3.0
+ URL : https://lxdware.com
+
+
+
+
+
\ No newline at end of file
diff --git a/lxd-dashboard/images.html b/lxd-dashboard/images.html
index 5f0a83c84a070d29f4078fa22be4c68f31e06d02..77334a786968335e99643095f455b39c29338982 100644
--- a/lxd-dashboard/images.html
+++ b/lxd-dashboard/images.html
@@ -229,7 +229,7 @@ along with this program. If not, see .
-
+
Repository:
@@ -239,6 +239,9 @@ along with this program. If not, see .
+
+
+
Image Type:
@@ -249,6 +252,9 @@ along with this program. If not, see .
+
+
+
diff --git a/lxd-dashboard/instances-single.html b/lxd-dashboard/instances-single.html
index decb4b387213e511d7e72df769600c5d0e8d43a2..ae7ad3e9e6510163f5ca34aff1ace8033dc1111e 100644
--- a/lxd-dashboard/instances-single.html
+++ b/lxd-dashboard/instances-single.html
@@ -197,12 +197,14 @@ along with this program. If not, see .
General
Snapshots
Profiles
+ Interfaces
Network Devices
Disk Devices
Proxy Devices
Backups
Logs
Console
+ Exec
@@ -405,7 +407,7 @@ along with this program. If not, see .
Snapshots
@@ -426,7 +428,7 @@ along with this program. If not, see .
Profiles
@@ -439,12 +441,35 @@ along with this program. If not, see .
+
@@ -462,6 +487,10 @@ along with this program. If not, see
.
@@ -479,6 +508,10 @@ along with this program. If not, see
.
@@ -498,7 +531,7 @@ along with this program. If not, see
.
Backups
@@ -546,6 +579,28 @@ along with this program. If not, see
.
+
@@ -593,16 +648,19 @@ along with this program. If not, see .
-
Name:
-
-
Stateful:
-
+
Stateful:
+
false
@@ -610,11 +668,14 @@ along with this program. If not, see .
+
+
+
@@ -632,17 +693,20 @@ along with this program. If not, see .
@@ -660,18 +724,21 @@ along with this program. If not, see .
@@ -689,17 +756,20 @@ along with this program. If not, see .
@@ -717,18 +787,21 @@ along with this program. If not, see .
@@ -747,31 +820,40 @@ along with this program. If not, see .
Description:
-
OS:
-
Release:
-
Public:
-
+
false
@@ -779,12 +861,15 @@ along with this program. If not, see .
+
+
+
@@ -803,15 +888,18 @@ along with this program. If not, see
.
Name:
-
Instance Only:
-
+
false
@@ -819,10 +907,13 @@ along with this program. If not, see .
+
+
+
Optimized Storage:
-
+
false
@@ -830,10 +921,13 @@ along with this program. If not, see .
+
+
+
Compression:
-
+
bzip2
@@ -845,59 +939,1037 @@ along with this program. If not, see .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Are you sure you want to delete this instance?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Additional Properties
+
+
+
+
+
+
Limits.Write:
+
+
+
+
+
+
+
+
Required:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Read Only:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
Recursive:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Propagation:
+
+
+
+ (not set)
+ private
+ rprivate
+ rshared
+ rslave
+ runbindable
+ shared
+ slave
+ unbindable
+
+
+
+
+
+
+
+
+
Shift:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Raw Mount Options:
+
+
+
+
+
+
+
Ceph User Name:
+
+
+
+
+
+
+
Ceph Cluster Name:
+
+
+
+
+
+
+
Boot Priority:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Property Set:
+
+
+
+ network
+ nictype
+
+
+
+
+
+
+
+
+
NIC Type:
+
+
+
+ bridged
+ ipvlan
+ macvlan
+ p2p
+ physical
+ routed
+ sriov
+
+
+
+
+
+
+
+
+
Parent Type:
+
+
+
+ bridge
+ macvlan
+ ovn
+ sriov
+
+
+
+
+
+
+
+
+
+
+
Interface Name:
+
+
+
+
+
+
+
+
+
+
+
+ Additional Properties
+
+
+
+
+
+
Mode:
+
+
+
+ (not set)
+ l2
+ l3s
+
+
+
+
+
+
+
+
+
+
+
Limits.Ingress:
+
+
+
+
+
+
+
Limits.Egress:
+
+
+
+
+
+
+
+
IPv4 Address:
+
+
+
+
+
+
+
IPv4 Gateway:
+
+
+
+
+
+
+
IPv4 Host Table:
+
+
+
+
+
+
+
IPv4 Host Address:
+
+
+
+
+
+
+
+
IPv4 Routes External:
+
+
+
+
+
+
+
IPv6 Address:
+
+
+
+
+
+
+
IPv6 Gateway:
+
+
+
+
+
+
+
IPv6 Host Table:
+
+
+
+
+
+
+
IPv6 Host Address:
+
+
+
+
+
+
+
+
IPv6 Routes External:
+
+
+
+
+
+
+
Security.MAC.Filtering:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Security.IPv4.Filtering:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Security.IPv6.Filtering:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
MAAS Subnet IPv4:
+
+
+
+
+
+
+
MAAS Subnet IPv6:
+
+
+
+
+
+
+
Boot Priority:
+
+
+
+
+
+
+
+
+
Security Port Isolation:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
GVRP:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Security ACLs:
+
+
+
+
+
+
+
Security ACLs Default Ingress Action:
+
+
+
+ (not set)
+ allow
+ reject
+ drop
+
+
+
+
+
+
+
+
+
Security ACLs Default Egress Action:
+
+
+
+ (not set)
+ allow
+ reject
+ drop
+
+
+
+
+
+
+
+
+
Security ACLs Default Ingress Logged:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Security ACLs Default Egress Logged:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
Are you sure you want to delete this instance?
-
-
-
-
-
-
-
+
+
+
-
Profile:
-
+
+
+
+
+
+
+
+
+ Additional Properties
+
+
+
+
+
Bind:
+
+
+
+ (not set)
+ host
+ instance
+
+
+
+
+
+
+
+
+
+
+
+
NAT:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Proxy Protocol:
+
+
+
+ (not set)
+ true
+ false
+
+
+
+
+
+
+
+
+
Security UID:
+
+
+
+
+
+
+
@@ -916,31 +1988,40 @@ along with this program. If not, see
.
Description:
-
OS:
-
Release:
-
Public:
-
+
false
@@ -948,11 +2029,14 @@ along with this program. If not, see .
+
+
+
@@ -1446,8 +2530,15 @@ along with this program. If not, see
.
const projectName = urlParams.get('project');
var instanceDetails = "";
var instanceStateDetails = "";
- var socket;
- var term;
+ var consoleControlSocket;
+ var consoleDataSocket;
+ var consoleTerminal;
+
+ var execControlSocket;
+ var execDataSocket;
+
+ var execSocket;
+ var execTerminal;
var activeTab = "#v-pills-general";
function logout(){
@@ -1608,6 +2699,10 @@ along with this program. If not, see
.
$('#profileTableList').DataTable().ajax.reload(null, false);
break;
+ case "#v-pills-interfaces":
+ $('#interfaceTableList').DataTable().ajax.reload(null, false);
+ break;
+
case "#v-pills-network-devices":
$('#networkDeviceTableList').DataTable().ajax.reload(null, false);
break;
@@ -1632,6 +2727,10 @@ along with this program. If not, see
.
// code block
break;
+ case "#v-pills-exec":
+ // code block
+ break;
+
default:
// code block
}
@@ -1731,9 +2830,9 @@ along with this program. If not, see
.
]
});
- //Load Network Devices Table
- $('#networkDeviceTableList').DataTable( {
- ajax: "./php/lxd/instances-single.php?instance=" + encodeURI(instanceName) + "&remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&action=listInstanceNetworkDevices",
+ //Load Interfaces Table
+ $('#interfaceTableList').DataTable( {
+ ajax: "./php/lxd/instances-single.php?instance=" + encodeURI(instanceName) + "&remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&action=listInstanceInterfaces",
columns: [
{},
{ title: "Name" },
@@ -1748,6 +2847,24 @@ along with this program. If not, see
.
]
});
+ //Load Network Devices Table
+ $('#networkDeviceTableList').DataTable( {
+ ajax: "./php/lxd/instances-single.php?instance=" + encodeURI(instanceName) + "&remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&action=listInstanceNetworkDevices",
+ columns: [
+ {},
+ { title: "Name" },
+ { title: "Type" },
+ { title: "Parent" },
+ { title: "Network" },
+ { title: "Interface Name" },
+ { title: "Action" }
+ ],
+ order: [],
+ columnDefs: [
+ { targets: 0, orderable: false, width: "25px" }
+ ]
+ });
+
//Load Disk Devices Table
$('#diskDeviceTableList').DataTable( {
ajax: "./php/lxd/instances-single.php?instance=" + encodeURI(instanceName) + "&remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&action=listInstanceDiskDevices",
@@ -1756,7 +2873,8 @@ along with this program. If not, see
.
{ title: "Name" },
{ title: "Path" },
{ title: "Usage" },
- { title: "Type" }
+ { title: "Type" },
+ { title: "Action" }
],
order: [],
columnDefs: [
@@ -1772,7 +2890,8 @@ along with this program. If not, see
.
{ title: "Name" },
{ title: "Connect" },
{ title: "Listen" },
- { title: "Type" }
+ { title: "Type" },
+ { title: "Action" }
],
order: [],
columnDefs: [
@@ -2199,6 +3318,682 @@ along with this program. If not, see
.
});
}
+ function loadAddDiskDeviceModal(){
+ console.log("Info: loading disk device modal");
+ $("#diskPoolInput").load("./php/lxd/storage-pools.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&action=listStoragePoolsForSelectOption");
+ $("#addDiskDeviceModal").modal('show');
+ }
+
+ function loadAddNetworkDeviceModal(){
+ console.log("Info: loading network device modal");
+ $("#networkParentInput").load("./php/lxd/networks.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&action=listNetworksForSelectOption");
+ changeParentTypeInput();
+ $("#addNetworkDeviceModal").modal('show');
+ }
+
+ function changeStorageVolumeInput(){
+ var diskPoolInput = $("#diskPoolInput").val();
+ if (diskPoolInput == ""){
+ $("#diskSourceInput").show()
+ $("#diskSourceSelectInput").hide()
+ }
+ else{
+ //show and populate select field
+ $("#diskSourceSelectInput").load("./php/lxd/storage-volumes.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&pool=" + encodeURI(diskPoolInput) + "&action=listStorageVolumesForSelectOption");
+ $("#diskSourceInput").hide()
+ $("#diskSourceSelectInput").show()
+ }
+
+ }
+
+ function changePropertySetInput(){
+ var networkPropertySetInput = $("#networkPropertySetInput").val()
+ if (networkPropertySetInput == "network"){
+ $("#networkNetworkRow").show();
+ $("#networkParentTypeRow").show();
+ $("#networkNicTypeRow").hide();
+ $("#networkParentTypeInput").val('bridge');
+ changeParentTypeInput();
+ }
+ if (networkPropertySetInput == "nictype"){
+ $("#networkNetworkRow").hide();
+ $("#networkParentTypeRow").hide();
+ $("#networkNicTypeRow").show();
+ changeNicTypeInput();
+ }
+ }
+
+ function changeParentTypeInput(){
+ var networkParentTypeInput = $("#networkParentTypeInput").val();
+ $("#networkNetworkInput").load("./php/lxd/networks.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&type=" + encodeURI(networkParentTypeInput) + "&managed_only=true" + "&action=listNetworksForSelectOption");
+ if (networkParentTypeInput == "bridge"){
+ $("#networkParentRow").hide()
+ $("#networkNetworkRow").show()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").hide()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").show()
+ $("#networkLimitsIngressRow").show()
+ $("#networkLimitsEgressRow").show()
+ $("#networkLimitsMaxRow").show()
+ $("#networkIpv4AddressRow").show()
+ $("#networkIpv6AddressRow").show()
+ $("#networkIpv4RoutesRow").show()
+ $("#networkIpv6RoutesRow").show()
+ $("#networkSecurityMacFilteringRow").show()
+ $("#networkSecurityIpv4FilteringRow").show()
+ $("#networkSecurityIpv6FilteringRow").show()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").show()
+ $("#networkSecurityPortIsolationRow").show()
+ $("#networkGvrpRow").hide()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkParentTypeInput == "macvlan"){
+ $("#networkParentRow").hide()
+ $("#networkNetworkRow").show()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").hide()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").hide()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").hide()
+ $("#networkIpv6AddressRow").hide()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").show()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkParentTypeInput == "ovn"){
+ $("#networkParentRow").hide()
+ $("#networkNetworkRow").show()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").hide()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").show()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").show()
+ $("#networkIpv6AddressRow").show()
+ $("#networkIpv4RoutesRow").show()
+ $("#networkIpv6RoutesRow").show()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").hide()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").hide()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+
+ $("#networkIpv4RoutesExternalRow").show()
+ $("#networkIpv6RoutesExternalRow").show()
+ $("#networkSecurityAclsRow").show()
+ $("#networkSecurityAclsDefaultIngressActionRow").show()
+ $("#networkSecurityAclsDefaultEgressActionRow").show()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").show()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").show()
+ }
+ if (networkParentTypeInput == "sriov"){
+ $("#networkParentRow").hide()
+ $("#networkNetworkRow").show()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").hide()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").hide()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").hide()
+ $("#networkIpv6AddressRow").hide()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").show()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").hide()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ }
+
+ function changeNicTypeInput(){
+ var networkNicTypeInput = $("#networkNicTypeInput").val();
+ if (networkNicTypeInput == "bridged"){
+ $("#networkParentRow").show()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").show()
+ $("#networkLimitsIngressRow").show()
+ $("#networkLimitsEgressRow").show()
+ $("#networkLimitsMaxRow").show()
+ $("#networkIpv4AddressRow").show()
+ $("#networkIpv6AddressRow").show()
+ $("#networkIpv4RoutesRow").show()
+ $("#networkIpv6RoutesRow").show()
+ $("#networkSecurityMacFilteringRow").show()
+ $("#networkSecurityIpv4FilteringRow").show()
+ $("#networkSecurityIpv6FilteringRow").show()
+ $("#networkMaasSubnetIpv4Row").show()
+ $("#networkMaasSubnetIpv6Row").show()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").show()
+ $("#networkSecurityPortIsolationRow").show()
+ $("#networkGvrpRow").hide()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkNicTypeInput == "macvlan"){
+ $("#networkParentRow").show()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").hide()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").hide()
+ $("#networkIpv6AddressRow").hide()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").show()
+ $("#networkMaasSubnetIpv6Row").show()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").show()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkNicTypeInput == "sriov"){
+ $("#networkParentRow").show()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").hide()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").hide()
+ $("#networkIpv6AddressRow").hide()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").show()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").show()
+ $("#networkMaasSubnetIpv6Row").show()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").hide()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkNicTypeInput == "physical"){
+ $("#networkParentRow").show()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").hide()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").hide()
+ $("#networkIpv6AddressRow").hide()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").show()
+ $("#networkMaasSubnetIpv6Row").show()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").show()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkNicTypeInput == "ipvlan"){
+ $("#networkParentRow").show()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").hide()
+ $("#networkLimitsIngressRow").hide()
+ $("#networkLimitsEgressRow").hide()
+ $("#networkLimitsMaxRow").hide()
+ $("#networkIpv4AddressRow").show()
+ $("#networkIpv6AddressRow").show()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").hide()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").show()
+ $("#networkModeRow").show()
+ $("#networkIpv4GatewayRow").show()
+ $("#networkIpv4HostTableRow").show()
+ $("#networkIpv6GatewayRow").show()
+ $("#networkIpv6HostTableRow").show()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkNicTypeInput == "p2p"){
+ $("#networkParentRow").hide()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").show()
+ $("#networkLimitsIngressRow").show()
+ $("#networkLimitsEgressRow").show()
+ $("#networkLimitsMaxRow").show()
+ $("#networkIpv4AddressRow").hide()
+ $("#networkIpv6AddressRow").hide()
+ $("#networkIpv4RoutesRow").show()
+ $("#networkIpv6RoutesRow").show()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").show()
+ $("#networkVlanRow").hide()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").hide()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").hide()
+ $("#networkIpv4HostTableRow").hide()
+ $("#networkIpv6GatewayRow").hide()
+ $("#networkIpv6HostTableRow").hide()
+ $("#networkIpv4HostAddressRow").hide()
+ $("#networkIpv6HostAddressRow").hide()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ if (networkNicTypeInput == "routed"){
+ $("#networkParentRow").show()
+ $("#networkNetworkRow").hide()
+ $("#networkInterfaceNameRow").show()
+ $("#networkMtuRow").show()
+ $("#networkHwaddrRow").show()
+ $("#networkHostNameRow").show()
+ $("#networkLimitsIngressRow").show()
+ $("#networkLimitsEgressRow").show()
+ $("#networkLimitsMaxRow").show()
+ $("#networkIpv4AddressRow").show()
+ $("#networkIpv6AddressRow").show()
+ $("#networkIpv4RoutesRow").hide()
+ $("#networkIpv6RoutesRow").hide()
+ $("#networkSecurityMacFilteringRow").hide()
+ $("#networkSecurityIpv4FilteringRow").hide()
+ $("#networkSecurityIpv6FilteringRow").hide()
+ $("#networkMaasSubnetIpv4Row").hide()
+ $("#networkMaasSubnetIpv6Row").hide()
+ $("#networkBootPriorityRow").hide()
+ $("#networkVlanRow").show()
+ $("#networkVlanTaggedRow").hide()
+ $("#networkSecurityPortIsolationRow").hide()
+ $("#networkGvrpRow").show()
+ $("#networkModeRow").hide()
+ $("#networkIpv4GatewayRow").show()
+ $("#networkIpv4HostTableRow").show()
+ $("#networkIpv6GatewayRow").show()
+ $("#networkIpv6HostTableRow").show()
+ $("#networkIpv4HostAddressRow").show()
+ $("#networkIpv6HostAddressRow").show()
+ $("#networkIpv4RoutesExternalRow").hide()
+ $("#networkIpv6RoutesExternalRow").hide()
+ $("#networkSecurityAclsRow").hide()
+ $("#networkSecurityAclsDefaultIngressActionRow").hide()
+ $("#networkSecurityAclsDefaultEgressActionRow").hide()
+ $("#networkSecurityAclsDefaultIngressLoggedRow").hide()
+ $("#networkSecurityAclsDefaultEgressLoggedRow").hide()
+ }
+ }
+
+ function addInstanceDiskDevice(){
+ var diskNameInput = $("#diskNameInput").val();
+ var diskPoolInput = $("#diskPoolInput").val();
+ var diskSourceInput = $("#diskSourceInput").val();
+ var diskSourceSelectInput = $("#diskSourceSelectInput").val();
+ var diskPathInput = $("#diskPathInput").val();
+ var diskLimitsReadInput = $("#diskLimitsReadInput").val();
+ var diskLimitsWriteInput = $("#diskLimitsWriteInput").val();
+ var diskLimitsMaxInput = $("#diskLimitsMaxInput").val();
+ var diskRequiredInput = $("#diskRequiredInput").val();
+ var diskReadOnlyInput = $("#diskReadOnlyInput").val();
+ var diskSizeInput = $("#diskSizeInput").val();
+ var diskSizeStateInput = $("#diskSizeStateInput").val();
+ var diskRecursiveInput = $("#diskRecursiveInput").val();
+ var diskPropagationInput = $("#diskPropagationInput").val();
+ var diskShiftInput = $("#diskShiftInput").val();
+ var diskRawMountOptionsInput = $("#diskRawMountOptionsInput").val();
+ var diskCephUserNameInput = $("#diskCephUserNameInput").val();
+ var diskCephClusterNameInput = $("#diskCephClusterNameInput").val();
+ var diskBootPriorityInput = $("#diskBootPriorityInput").val();
+
+ if (diskPoolInput != ""){
+ diskSourceInput = diskSourceSelectInput
+ }
+
+ console.log("Info: adding disk device " + diskNameInput + " to instance " + instanceName);
+ $.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) +
+ "&name=" + encodeURI(diskNameInput) +
+ "&pool=" + encodeURI(diskPoolInput) +
+ "&source=" + encodeURI(diskSourceInput) +
+ "&path=" + encodeURI(diskPathInput) +
+ "&limits_read=" + encodeURI(diskLimitsReadInput) +
+ "&limits_write=" + encodeURI(diskLimitsWriteInput) +
+ "&limits_max=" + encodeURI(diskLimitsMaxInput) +
+ "&required=" + encodeURI(diskRequiredInput) +
+ "&read_only=" + encodeURI(diskReadOnlyInput) +
+ "&size=" + encodeURI(diskSizeInput) +
+ "&size_state=" + encodeURI(diskSizeStateInput) +
+ "&recursive=" + encodeURI(diskRecursiveInput) +
+ "&propagation=" + encodeURI(diskPropagationInput) +
+ "&shift=" + encodeURI(diskShiftInput) +
+ "&raw_mount_options=" + encodeURI(diskRawMountOptionsInput) +
+ "&ceph_user_name=" + encodeURI(diskCephUserNameInput) +
+ "&ceph_cluster_name=" + encodeURI(diskCephClusterNameInput) +
+ "&boot_priority=" + encodeURI(diskBootPriorityInput) +
+ "&action=addInstanceDiskDevice", function (data) {
+ //Sync operation type
+ var operationData = JSON.parse(data);
+ console.log(operationData);
+ if (operationData.error_code >= 400){
+ alert(operationData.error);
+ }
+ setTimeout(() => { reloadPageContent(); }, 1000);
+ });
+ }
+
+ function addInstanceNetworkDevice(){
+ var networkNameInput = $("#networkNameInput").val();
+ var networkPropertySetInput = $("#networkPropertySetInput").val();
+ var networkNicTypeInput = $("#networkNicTypeInput").val();
+ var networkParentTypeInput = $("#networkParentTypeInput").val();
+ var networkParentInput = $("#networkParentInput").val();
+ var networkNetworkInput = $("#networkNetworkInput").val();
+ var networkInterfaceNameInput = $("#networkInterfaceNameInput").val();
+ var networkMtuInput = $("#networkMtuInput").val();
+ var networkModeInput = $("#networkModeInput").val();
+ var networkHwaddrInput = $("#networkHwaddrInput").val();
+ var networkHostNameInput = $("#networkHostNameInput").val();
+ var networkLimitsIngressInput = $("#networkLimitsIngressInput").val();
+ var networkLimitsEgressInput = $("#networkLimitsEgressInput").val();
+ var networkLimitsMaxInput = $("#networkLimitsMaxInput").val();
+ var networkIpv4AddressInput = $("#networkIpv4AddressInput").val();
+ var networkIpv4GatewayInput = $("#networkIpv4GatewayInput").val();
+ var networkIpv4HostTableInput = $("#networkIpv4HostTableInput").val();
+ var networkIpv4HostAddressInput = $("#networkIpv4HostAddressInput").val();
+ var networkIpv4RoutesInput = $("#networkIpv4RoutesInput").val();
+ var networkIpv4RoutesExternalInput = $("#networkIpv4RoutesExternalInput").val();
+ var networkIpv6AddressInput = $("#networkIpv6AddressInput").val();
+ var networkIpv6GatewayInput = $("#networkIpv6GatewayInput").val();
+ var networkIpv6HostTableInput = $("#networkIpv6HostTableInput").val();
+ var networkIpv6HostAddressInput = $("#networkIpv6HostAddressInput").val();
+ var networkIpv6RoutesInput = $("#networkIpv6RoutesInput").val();
+ var networkIpv6RoutesExternalInput = $("#networkIpv6RoutesExternalInput").val();
+ var networkSecurityMacFilteringInput = $("#networkSecurityMacFilteringInput").val();
+ var networkSecurityIpv4FilteringInput = $("#networkSecurityIpv4FilteringInput").val();
+ var networkSecurityIpv6FilteringInput = $("#networkSecurityIpv6FilteringInput").val();
+ var networkMaasSubnetIpv4Input = $("#networkMaasSubnetIpv4Input").val();
+ var networkMaasSubnetIpv6Input = $("#networkMaasSubnetIpv6Input").val();
+ var networkBootPriorityInput = $("#networkBootPriorityInput").val();
+ var networkVlanInput = $("#networkVlanInput").val();
+ var networkVlanTaggedInput = $("#networkVlanTaggedInput").val();
+ var networkSecurityPortIsolationInput = $("#networkSecurityPortIsolationInput").val();
+ var networkGvrpInput = $("#networkGvrpInput").val();
+ var networkSecurityAclsInput = $("#networkSecurityAclsInput").val();
+ var networkSecurityAclsDefaultIngressActionInput = $("#networkSecurityAclsDefaultIngressActionInput").val();
+ var networkSecurityAclsDefaultEgressActionInput = $("#networkSecurityAclsDefaultEgressActionInput").val();
+ var networkSecurityAclsDefaultIngressLoggedInput = $("#networkSecurityAclsDefaultIngressLoggedInput").val();
+ var networkSecurityAclsDefaultEgressLoggedInput = $("#networkSecurityAclsDefaultEgressLoggedInput").val();
+
+ console.log("Info: adding network device " + networkNameInput + " to instance " + instanceName);
+ $.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) +
+ "&name=" + encodeURI(networkNameInput) +
+ "&property_set=" + encodeURI(networkPropertySetInput) +
+ "&nictype=" + encodeURI(networkNicTypeInput) +
+ "&parent_type=" + encodeURI(networkParentTypeInput) +
+ "&parent=" + encodeURI(networkParentInput) +
+ "&network=" + encodeURI(networkNetworkInput) +
+ "&interface_name=" + encodeURI(networkInterfaceNameInput) +
+ "&mtu=" + encodeURI(networkMtuInput) +
+ "&mode=" + encodeURI(networkModeInput) +
+ "&hwaddr=" + encodeURI(networkHwaddrInput) +
+ "&host_name=" + encodeURI(networkHostNameInput) +
+ "&limits_ingress=" + encodeURI(networkLimitsIngressInput) +
+ "&limits_egress=" + encodeURI(networkLimitsEgressInput) +
+ "&limits_max=" + encodeURI(networkLimitsMaxInput) +
+ "&ipv4_address=" + encodeURI(networkIpv4AddressInput) +
+ "&ipv4_gateway=" + encodeURI(networkIpv4GatewayInput) +
+ "&ipv4_host_table=" + encodeURI(networkIpv4HostTableInput) +
+ "&ipv4_host_address=" + encodeURI(networkIpv4HostAddressInput) +
+ "&ipv4_routes=" + encodeURI(networkIpv4RoutesInput) +
+ "&ipv4_routes_external=" + encodeURI(networkIpv4RoutesExternalInput) +
+ "&ipv6_address=" + encodeURI(networkIpv6AddressInput) +
+ "&ipv6_gateway=" + encodeURI(networkIpv6GatewayInput) +
+ "&ipv6_host_table=" + encodeURI(networkIpv6HostTableInput) +
+ "&ipv6_host_address=" + encodeURI(networkIpv6HostAddressInput) +
+ "&ipv6_routes=" + encodeURI(networkIpv6RoutesInput) +
+ "&ipv6_routes_external=" + encodeURI(networkIpv6RoutesExternalInput) +
+ "&security_mac_filtering=" + encodeURI(networkSecurityMacFilteringInput) +
+ "&security_ipv4_filtering=" + encodeURI(networkSecurityIpv4FilteringInput) +
+ "&security_ipv6_filtering=" + encodeURI(networkSecurityIpv6FilteringInput) +
+ "&maas_subnet_ipv4=" + encodeURI(networkMaasSubnetIpv4Input) +
+ "&maas_subnet_ipv6=" + encodeURI(networkMaasSubnetIpv6Input) +
+ "&boot_priority=" + encodeURI(networkBootPriorityInput) +
+ "&vlan=" + encodeURI(networkVlanInput) +
+ "&vlan_tagged=" + encodeURI(networkVlanTaggedInput) +
+ "&security_port_isolation=" + encodeURI(networkSecurityPortIsolationInput) +
+ "&gvrp=" + encodeURI(networkGvrpInput) +
+ "&security_acls=" + encodeURI(networkSecurityAclsInput) +
+ "&security_acls_default_ingress_action=" + encodeURI(networkSecurityAclsDefaultIngressActionInput) +
+ "&security_acls_default_egress_action=" + encodeURI(networkSecurityAclsDefaultEgressActionInput) +
+ "&security_acls_default_ingress_logged=" + encodeURI(networkSecurityAclsDefaultIngressLoggedInput) +
+ "&security_acls_default_egress_logged=" + encodeURI(networkSecurityAclsDefaultEgressLoggedInput) +
+ "&action=addInstanceNetworkDevice", function (data) {
+ //Sync operation type
+ var operationData = JSON.parse(data);
+ console.log(operationData);
+ if (operationData.error_code >= 400){
+ alert(operationData.error);
+ }
+ setTimeout(() => { reloadPageContent(); }, 1000);
+ });
+ }
+
+ function addInstanceProxyDevice(){
+ var proxyDeviceNameInput = $("#proxyDeviceNameInput").val();
+ var proxyListenInput = $("#proxyListenInput").val();
+ var proxyConnectInput = $("#proxyConnectInput").val();
+ var proxyBindInput = $("#proxyBindInput").val();
+ var proxyUidInput = $("#proxyUidInput").val();
+ var proxyGidInput = $("#proxyGidInput").val();
+ var proxyModeInput = $("#proxyModeInput").val();
+ var proxyNatInput = $("#proxyNatInput").val();
+ var proxyProxyProtocolInput = $("#proxyProxyProtocolInput").val();
+ var proxySecurityUidInput = $("#proxySecurityUidInput").val();
+ var proxySecurityGidInput = $("#proxySecurityGidInput").val();
+
+ console.log("Info: adding proxy device " + proxyDeviceNameInput + " to instance " + instanceName);
+ $.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&name=" + encodeURI(proxyDeviceNameInput) + "&listen=" + encodeURI(proxyListenInput) + "&connect=" + encodeURI(proxyConnectInput) + "&bind=" + encodeURI(proxyBindInput) + "&uid=" + encodeURI(proxyUidInput) + "&gid=" + encodeURI(proxyGidInput) + "&mode=" + encodeURI(proxyModeInput) + "&nat=" + encodeURI(proxyNatInput) + "&proxy_protocol=" + encodeURI(proxyProxyProtocolInput) + "&security_uid=" + encodeURI(proxySecurityUidInput) + "&security_gid=" + encodeURI(proxySecurityGidInput) + "&action=addInstanceProxyDevice", function (data) {
+ //Sync operation type
+ var operationData = JSON.parse(data);
+ console.log(operationData);
+ if (operationData.error_code >= 400){
+ alert(operationData.error);
+ }
+ setTimeout(() => { reloadPageContent(); }, 1000);
+ });
+ }
+
+ function removeInstanceDevice(deviceName){
+ console.log("Info: removing device " + deviceName + " from instance " + instanceName);
+ $.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&name=" + encodeURI(deviceName) + "&action=removeInstanceDevice", function (data) {
+ //Async operation type
+ var operationData = JSON.parse(data);
+ console.log(operationData);
+ if (operationData.error_code >= 400){
+ alert(operationData.error);
+ }
+ operationStatusCheck();
+ setTimeout(() => { reloadPageContent(); }, 1000);
+ });
+ }
+
function editInstanceJson(){
console.log("Info: viewing instance " + instanceName);
$.get("./php/lxd/instances.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&action=loadInstanceInformation", function (data) {
@@ -2251,85 +4046,196 @@ along with this program. If not, see
.
$.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&action=retrieveHostAndPort", function (data) {
var operationData = JSON.parse(data);
console.log(operationData);
- host = operationData.host;
- port = operationData.port;
+ var host = operationData.host;
+ var port = operationData.port;
//Check to see if we can connect to the LXD remote host over a secure connection
fetch('https://' + host + ':' + port + '/1.0', { mode: 'no-cors' })
.then(response => {
//If we made it here then the self-signed LXD certificate would have been already trusted by the user's browser we can setup a secure websocket connection
$.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&action=establishInstanceWebSocketConsoleConnection", function (data) {
- var operationData = JSON.parse(data);
- var operation = operationData.operation;
- var secret = operationData.secret;
-
- if(operation == "" && secret == ""){
- alert("Unable to connect via websocket");
- return;
- }
+ var operationData = JSON.parse(data);
+ var operation = operationData.operation;
+ var consoleControlURL = "wss://" + host + ":" + port + operation + "/websocket?secret=" + operationData.control;
+ var consoleDataURL = "wss://" + host + ":" + port + operation + "/websocket?secret=" + operationData.secret;
+
+ if(operation == "" && operationData.secret == ""){
+ alert("Unable to connect via websocket");
+ return;
+ }
+
+ //Create a new "control" websocket
+ consoleControlSocket = new WebSocket(consoleControlURL);
- var url = "wss://" + host + ":" + port + operation + "/websocket?secret=" + secret;
- socket = new WebSocket(url);
-
- term.onData( (data) => {
- if (socket.readyState === 1) {
- socket.send(convertString2ArrayBuffer(data))
+ //Listen for "control" websocket errors
+ consoleControlSocket.onerror = function (e) {
+ console.log("There was a WebSocket error: " + e);
}
- });
- //Listen for websocket errors
- socket.onerror = function (e) {
- console.log("There was a WebSocket error: " + e);
- }
+ //Listen for "control" websocket opening connection
+ consoleControlSocket.onopen = function (e) {
+ console.log( "Console Control WebSocket ReadyState: " + consoleControlSocket.readyState );
+ };
+
+ //Listen for "control" websocket messages
+ consoleControlSocket.onmessage = function (e) {
+ if (e.data instanceof ArrayBuffer) {
+ if (convertArrayBuffer2String(e.data) != null){
+ consoleTerminal.write(convertArrayBuffer2String(e.data));
+ }
+ }
+ };
+
+ //Listen for "control" websocket closing
+ consoleControlSocket.onclose = function (e) {
+ console.log(e);
+ };
+
+ //Create a new "data" websocket
+ consoleDataSocket = new WebSocket(consoleDataURL);
+
+ //Listen for "data" websocket errors
+ consoleDataSocket.onerror = function (e) {
+ console.log("There was a WebSocket error: " + e);
+ }
- //Listen for websocket opening connection
- socket.onopen = function (e) {
- //Set binaryType to ArrayBuffer. This should be default value
- socket.binaryType = 'arraybuffer';
- console.log( "WebSocket ReadyState: " + socket.readyState );
- term.write("--- Encrypted Console Opened via WebSocket --- \r\n");
- //Send Ctrl+d and return to show login screen on console connections
- setTimeout(() => { socket.send(convertString2ArrayBuffer('\04 \r')); }, 1000);
- //Switch console action buttons
- $("#startConsoleButton").hide();
- $("#stopConsoleButton").show();
- };
+ //Listen for "data" websocket opening connection
+ consoleDataSocket.onopen = function (e) {
+ //Set binaryType to ArrayBuffer. This should be default value
+ consoleDataSocket.binaryType = 'arraybuffer';
+
+ console.log( "Console Data WebSocket ReadyState: " + consoleDataSocket.readyState );
+ consoleTerminal.write("--- Encrypted Connection Opened via WebSocket --- \r\n");
+
+ //Send return to show login screen on console connections
+ setTimeout(() => { consoleDataSocket.send(convertString2ArrayBuffer('\r')); }, 1000);
+
+ //Switch console action buttons
+ $("#startConsoleButton").hide();
+ $("#stopConsoleButton").show();
+ };
- //Listen for websocket messages
- socket.onmessage = function (e) {
- if (e.data instanceof ArrayBuffer) {
- if (convertArrayBuffer2String(e.data) != null){
- term.write(convertArrayBuffer2String(e.data));
+ //Listen for "data" websocket messages
+ consoleDataSocket.onmessage = function (e) {
+ if (e.data instanceof ArrayBuffer) {
+ if (convertArrayBuffer2String(e.data) != null){
+ consoleTerminal.write(convertArrayBuffer2String(e.data));
+ }
}
+ };
+
+ //Listen for "data" websocket closing
+ consoleDataSocket.onclose = function (e) {
+ console.log(e);
+ consoleTerminal.write("\r\n--- Encrypted Connection Closed ---\r\n");
+ $("#stopConsoleButton").hide();
+ $("#startConsoleButton").show();
+ };
+
+ });
+
+ })
+ .catch((error) => {
+ console.log("Error: ", error)
+ //If we make it here then we had an error connection to LXD server. Most likely the Self-Signed Certificate is not yet trusted by the user's browser
+ data = 'There was an error connecting to your LXD server.
The LXD server may be using a self-signed certificate.
Visit
https://' + host + ':' + port +' to accept the certificate if not yet trusted.';
+ $("#webSocketConnectionError").html(data);
+ $('#webSocketConnectionErrorModal').modal('show');
+ })
+
+ });
+
+ }
+
+ function establishInstanceWebSocketExecConnection() {
+ $.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&action=retrieveHostAndPort", function (data) {
+ var operationData = JSON.parse(data);
+ console.log(operationData);
+ var host = operationData.host;
+ var port = operationData.port;
+
+ //Check to see if we can connect to the LXD remote host over a secure connection
+ fetch('https://' + host + ':' + port + '/1.0', { mode: 'no-cors' })
+ .then(response => {
+ //If we made it here then the self-signed LXD certificate would have been already trusted by the user's browser we can setup a secure websocket connection
+ var execShellInput = $("#execShellInput").val();
+ $.get("./php/lxd/instances-single.php?remote=" + encodeURI(remoteId) + "&project=" + encodeURI(projectName) + "&instance=" + encodeURI(instanceName) + "&shell=" + encodeURI(execShellInput) + "&action=establishInstanceWebSocketExecConnection", function (data) {
+ var operationData = JSON.parse(data);
+ var operation = operationData.operation;
+ var execControlURL = "wss://" + host + ":" + port + operation + "/websocket?secret=" + operationData.control;
+ var execDataURL = "wss://" + host + ":" + port + operation + "/websocket?secret=" + operationData.secret;
+
+ if(operation == "" && operationData.secret == ""){
+ alert("Unable to connect via websocket");
+ return;
}
- };
-
- //Listen for websocket closing
- socket.onclose = function (e) {
- term.dispose();
- term = new Terminal({
- cursorBlink: "block"
- });
- term.open(document.getElementById("terminal-console"));
-
- console.log(e);
- };
-
- //Attempt to close websocket before the page unloads
- window.onbeforeunload = function() {
- socket.send(convertString2ArrayBuffer('\04 \r'))
- socket.close();
- };
-
- //Add Event Listener for page unloading to close websocket
- window.addEventListener("unload", function () {
- if(socket.readyState == WebSocket.OPEN){
- socket.send(convertString2ArrayBuffer('\04 \r'))
- socket.close();
+
+ //Create a new "control" websocket
+ execControlSocket = new WebSocket(execControlURL);
+
+ //Listen for "control" websocket errors
+ execControlSocket.onerror = function (e) {
+ console.log("There was a WebSocket error: " + e);
+ }
+
+ //Listen for "control" websocket opening connection
+ execControlSocket.onopen = function (e) {
+ console.log( "Exec Control WebSocket ReadyState: " + execControlSocket.readyState );
+ };
+
+ //Listen for "control" websocket messages
+ execControlSocket.onmessage = function (e) {
+ if (e.data instanceof ArrayBuffer) {
+ if (convertArrayBuffer2String(e.data) != null){
+ execTerminal.write(convertArrayBuffer2String(e.data));
+ }
+ }
+ };
+
+ //Listen for "control" websocket closing
+ execControlSocket.onclose = function (e) {
+ console.log(e);
+ };
+
+ //Create a new "data" websocket
+ execDataSocket = new WebSocket(execDataURL);
+
+ //Listen for "data" websocket errors
+ execDataSocket.onerror = function (e) {
+ console.log("There was a WebSocket error: " + e);
}
- });
- });
+ //Listen for "data" websocket opening connection
+ execDataSocket.onopen = function (e) {
+ //Set binaryType to ArrayBuffer. This should be default value
+ execDataSocket.binaryType = 'arraybuffer';
+
+ console.log( "Exec Data WebSocket ReadyState: " + execDataSocket.readyState );
+ execTerminal.write("--- Encrypted Connection Opened via WebSocket --- \r\n");
+
+ //Switch console action buttons
+ $("#startExecButton").hide();
+ $("#stopExecButton").show();
+ };
+
+ //Listen for "data" websocket messages
+ execDataSocket.onmessage = function (e) {
+ if (e.data instanceof ArrayBuffer) {
+ if (convertArrayBuffer2String(e.data) != null){
+ execTerminal.write(convertArrayBuffer2String(e.data));
+ }
+ }
+ };
+
+ //Listen for "data" websocket closing
+ execDataSocket.onclose = function (e) {
+ console.log(e);
+ execTerminal.write("\r\n--- Encrypted Connection Closed ---\r\n");
+ $("#stopExecButton").hide();
+ $("#startExecButton").show();
+ };
+
+ });
})
.catch((error) => {
@@ -2345,10 +4251,18 @@ along with this program. If not, see
.
}
function closeWebSocketConsoleConnection() {
- socket.send(convertString2ArrayBuffer('\04 \r'))
- socket.close();
- $("#stopConsoleButton").hide();
- $("#startConsoleButton").show();
+ //Closing the "control" websocket for console operations will stop the operation without crashing existing host's WebSockets.
+ consoleControlSocket.close();
+ consoleDataSocket.close();
+ }
+
+ function closeWebSocketExecConnection() {
+ //Sending Ctrl+d (exit) three times to back out of potential nested shells or logins up to three deep. If not logged out, WebSocket operation may continue to run.
+ execDataSocket.send(convertString2ArrayBuffer('\04 \r \04 \r \04 \r'))
+
+ //Closing the "control" websocket for console operations will stop the operation without crashing existing host WebSockets.
+ execControlSocket.close();
+ execDataSocket.close();
}
function editBootConfiguration() {
@@ -2556,12 +4470,52 @@ along with this program. If not, see
.
activeTab = $(e.target).attr("href") // activated tab
});
+ //Initialize xterm for Console
+ consoleTerminal = new Terminal({
+ cursorBlink: "block"
+ });
+
+ //Setup listener for Console terminal
+ consoleTerminal.onData( (data) => {
+ if (consoleDataSocket.readyState === 1) {
+ consoleDataSocket.send(convertString2ArrayBuffer(data))
+ }
+ });
- term = new Terminal({
+ //Initialize xterm for Exec
+ execTerminal = new Terminal({
cursorBlink: "block"
});
- term.open(document.getElementById("terminal-console"));
+ //Setup listener for Exec terminal
+ execTerminal.onData( (data) => {
+ if (execDataSocket.readyState === 1) {
+ execDataSocket.send(convertString2ArrayBuffer(data))
+ }
+ });
+
+ //Open Console terminal
+ consoleTerminal.open(document.getElementById("terminal-console"));
+
+ //Open Exec terminal
+ execTerminal.open(document.getElementById("terminal-exec"));
+
+
+ //Add Event Listener for page unloading to close WebSocket connections
+ window.addEventListener("beforeunload", function () {
+ //Check to see if the Console WebSocket was initiated
+ if (typeof consoleDataSocket == "object"){
+ if(consoleDataSocket.readyState == WebSocket.OPEN){
+ closeWebSocketConsoleConnection()
+ }
+ }
+ //Check to see if the Exec WebSocket was initiated
+ if (typeof execDataSocket == "object"){
+ if(execDataSocket.readyState == WebSocket.OPEN){
+ closeWebSocketExecConnection();
+ }
+ }
+ });
});
diff --git a/lxd-dashboard/instances.html b/lxd-dashboard/instances.html
index 339352e6e0daa80ff165a6e226db9dc7ad4595fc..8a41d8818ea73def95457df7b133f1861c72dd24 100644
--- a/lxd-dashboard/instances.html
+++ b/lxd-dashboard/instances.html
@@ -231,17 +231,20 @@ along with this program. If not, see
.
diff --git a/lxd-dashboard/remotes.html b/lxd-dashboard/remotes.html
index 0541daad7001e84698795ebd806dcfc5b359d42d..46893371dd0f24126e79b37e4e3d8e9c0395ab60 100644
--- a/lxd-dashboard/remotes.html
+++ b/lxd-dashboard/remotes.html
@@ -229,7 +229,7 @@ along with this program. If not, see
.
-
+
@@ -241,7 +241,7 @@ along with this program. If not, see
.
-
+
@@ -253,7 +253,7 @@ along with this program. If not, see
.
-
+
@@ -285,11 +285,11 @@ along with this program. If not, see .
Import the certificate file on your remote LXD server by running the command:
- lxc config trust add lxdware.crt
+ lxc config trust add lxdware.crt
For LXD hosts that are not part of a cluster, use the following command to listen for incoming connections:
- lxc config set core.https_address [::]
+ lxc config set core.https_address [::]
diff --git a/lxd-dashboard/settings.html b/lxd-dashboard/settings.html
index cde7c64f2375e86927f673f72e327bc307e0b7b6..47f3184398c4492bad6a85fe96199abf48bc453d 100644
--- a/lxd-dashboard/settings.html
+++ b/lxd-dashboard/settings.html
@@ -246,47 +246,62 @@ along with this program. If not, see .
Username:
-
Password:
-
First Name:
-
Last Name:
-
@@ -312,12 +327,15 @@ along with this program. If not, see
.
Group:
-
@@ -345,12 +363,15 @@ along with this program. If not, see
.
Group:
-
@@ -398,20 +419,26 @@ along with this program. If not, see
.
Name:
-
@@ -437,12 +464,15 @@ along with this program. If not, see
.
Role:
-
@@ -470,12 +500,15 @@ along with this program. If not, see
.
Role:
-
diff --git a/lxd-dashboard/sidebar.html b/lxd-dashboard/sidebar.html
index d1a1211196fc24a135a0a848bb64444d32a64e2b..4a66083a7cc4dc216f2e2b2ed9ae18dd9b320414 100644
--- a/lxd-dashboard/sidebar.html
+++ b/lxd-dashboard/sidebar.html
@@ -185,7 +185,7 @@ along with this program. If not, see
.
$('#projectsIcon').css('color','#fff');
}
- if (location.pathname == "/network-acls.html"){
+ if (location.pathname == "/network-acls.html" || location.pathname == "/network-acls-egress.html" || location.pathname == "/network-acls-ingress.html"){
$('#networkAclsSpan').css('color','#fff');
$('#networkAclsIcon').css('color','#fff');
}
diff --git a/lxd-dashboard/simplestreams.html b/lxd-dashboard/simplestreams.html
index b53c3d7be2770f04b848d937555480b8ee65e92f..a4399cb0137bd833072ddb895bd3c0b4baa914b6 100644
--- a/lxd-dashboard/simplestreams.html
+++ b/lxd-dashboard/simplestreams.html
@@ -221,21 +221,27 @@ along with this program. If not, see
.
-
URL:
-
diff --git a/lxd-dashboard/storage-pools.html b/lxd-dashboard/storage-pools.html
index 6b80479d0ec74cb3de2ad1ed02db87f41a8f22c8..9db2446a8bde1803fa99ea16cf85d29c9c25d1e1 100644
--- a/lxd-dashboard/storage-pools.html
+++ b/lxd-dashboard/storage-pools.html
@@ -234,29 +234,38 @@ along with this program. If not, see
.
Name:
+
+
+
Size (GB):
-
Driver:
-
+
btrfs
@@ -267,6 +276,9 @@ along with this program. If not, see .
+
+
+
Content Type:
@@ -249,14 +252,20 @@ along with this program. If not, see .
+
+
+