feat: make libvirt networks accessible via gui

This commit is contained in:
F4IL3D
2021-10-12 18:36:38 +02:00
parent 1d26b90f1f
commit 7f80367fd5
7 changed files with 144 additions and 64 deletions
+10 -5
View File
@@ -1494,11 +1494,16 @@ Open the folder for the version of Windows you are installing and then select th
Three drivers will be found. Select them all, click next, and the vDisks you have assigned will appear.
:end
:vms_network_bridge_help:
Select the name of the network bridge you wish to use as default for your VMs,
the setting 'virbr0' will let libvirt create a virtual bridge that utilizes NAT (network address translation)
and act as a DHCP server to hand out IP addresses to virtual machines directly.
More optional selections are present when virtual bridges are created under network settings.
:vms_network_source_help:
Select the name of the network you wish to use as default for your VMs.
You can choose between **'bridges'** created under network settings or
**'libvirt'** created with virsh command in the terminal.
The bridge **'virbr0'** and the associated virtual network **'default'** are
created by libvirt.
Both utilizes NAT (network address translation) and act as a DHCP server to hand out IP addresses to virtual machines directly.
More optional selections are present for bridges under network settings or for libvirt networks with the virsh command in the terminal.
**If your are unsure, choose 'virbr0' as the recommended Unraid default.**
NOTE: You can also specify a network bridge on a per-VM basis.
:end
+13 -6
View File
@@ -51,7 +51,7 @@ function detect(&$syslinux, $key) {
return $value;
}
$syslinux = file('/boot/syslinux/syslinux.cfg',FILE_IGNORE_NEW_LINES+FILE_SKIP_EMPTY_LINES);
$arrValidBridges = getNetworkBridges();
$arrValidNetworks = getValidNetworks();
$pcie_acs_override = detect($syslinux, 'pcie_acs_override');
$vfio_allow_unsafe = detect($syslinux, 'allow_unsafe_interrupts');
$bgcolor = strstr('white,azure',$display['theme']) ? '#f2f2f2' : '#1c1c1c';
@@ -169,12 +169,19 @@ _(Default Windows VirtIO driver ISO)_ (_(optional)_):
:vms_virtio_driver_help:
<div class="advanced" markdown="1">
_(Default network bridge)_:
: <select id="bridge" name="BRNAME">
<?foreach ($arrValidBridges as $strBridge) echo mk_option($domain_cfg['BRNAME'], $strBridge, $strBridge);?>
_(Default network source)_:
: <select id="network" name="BRNAME">
<?foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks[$key] as $strNetwork) {
echo mk_option($domain_cfg['BRNAME'], $strNetwork, $strNetwork);
}
}?>
</select>
:vms_network_bridge_help:
:vms_network_source_help:
_(Upon host shutdown)_:
: <select id="hostshutdown" name="HOSTSHUTDOWN">
@@ -443,7 +450,7 @@ $(function(){
$("#mediadir").prop("disabled", checked);
$("#winvirtio_select").prop("disabled", checked);
$("#winvirtio").prop("disabled", checked);
$("#bridge").prop("disabled", checked);
$("#network").prop("disabled", checked);
$("#hostshutdown").prop("disabled", checked);
$("#pcie_acs_override").prop("disabled", checked);
$("#vm_shutdown_timeout").prop("disabled", checked);
+42 -18
View File
@@ -619,11 +619,25 @@
continue;
}
$netmodel = $nic['model'] ?: 'virtio-net';
$netstr .= "<interface type='bridge'>
<mac address='{$nic['mac']}'/>
<source bridge='" . htmlspecialchars($nic['network'], ENT_QUOTES | ENT_XML1) . "'/>
<model type='$netmodel'/>
</interface>";
$net_res =$this->libvirt_get_net_res($this->conn, $nic['network']);
exec("brctl show | cut -f1| awk NF | sed -n '1!p'", $br);
if($net_res) {
$netstr .= "<interface type='network'>
<mac address='{$nic['mac']}'/>
<source network='" . htmlspecialchars($nic['network'], ENT_QUOTES | ENT_XML1) . "'/>
<model type='$netmodel'/>
</interface>";
} elseif(in_array($nic['network'], $br)) {
$netstr .= "<interface type='bridge'>
<mac address='{$nic['mac']}'/>
<source bridge='" . htmlspecialchars($nic['network'], ENT_QUOTES | ENT_XML1) . "'/>
<model type='$netmodel'/>
</interface>";
} else {
continue;
}
}
}
@@ -2100,25 +2114,22 @@
function get_nic_info($domain) {
$macs = $this->get_xpath($domain, "//domain/devices/interface/mac/@address", false);
$net = $this->get_xpath($domain, "//domain/devices/interface/@type", false);
$bridge = $this->get_xpath($domain, "//domain/devices/interface/source/@bridge", false);
$model = $this->get_xpath($domain, "//domain/devices/interface/model/@type", false);
if (!$macs)
return $this->_set_last_error();
$ret = [];
for ($i = 0; $i < $macs['num']; $i++) {
if ($net[$i] != 'bridge')
$tmp = libvirt_domain_get_network_info($domain, $macs[$i]);
if ($tmp)
$ret[] = $tmp;
else {
$net = $this->get_xpath($domain, "//domain/devices/interface/mac[@address='$macs[$i]']/../source/@*", false);
$model = $this->get_xpath($domain, "//domain/devices/interface/mac[@address='$macs[$i]']/../model/@type", false);
if(empty(macs[$i]) && empty($net[0])) {
$this->_set_last_error();
$ret[] = [
'mac' => $macs[$i],
'network' => $bridge[$i],
'model' => $model[$i]
];
continue;
}
$ret[] = [
'mac' => $macs[$i],
'network' => $net[0],
'model' => $model[0]
];
}
return $ret;
@@ -2384,5 +2395,18 @@
return $this->domain_define($xml);
}
function libvirt_get_net_res($conn, $net) {
return libvirt_network_get($conn, $net);
}
function libvirt_get_net_list($conn, $opt=VIR_NETWORKS_ALL) {
// VIR_NETWORKS_{ACTIVE|INACTIVE|ALL}
return libvirt_list_networks($conn, $opt);
}
function libvirt_get_net_xml($res, $xpath=NULL) {
return libvirt_network_get_xml_desc($res, $xpath);
}
}
?>
@@ -904,21 +904,35 @@
return trim($strCPUModel);
}
function getNetworkBridges() {
exec("brctl show|grep -Po '^(vir)?br\d\S*'", $arrValidBridges);
function getValidNetworks() {
global $lv;
$arrValidNetworks = [];
exec("brctl show|grep -Po '^(vir)?br\d\S*'", $arrBridges);
if (!is_array($arrValidBridges)) {
$arrValidBridges = [];
if (!is_array($arrBridges)) {
$arrBridges = [];
}
// Make sure the default libvirt bridge is first in the list
if (($key = array_search('virbr0', $arrValidBridges)) !== false) {
unset($arrValidBridges[$key]);
if (($key = array_search('virbr0', $arrBridges)) !== false) {
unset($arrBridges[$key]);
}
// We always list virbr0 because libvirt might not be started yet (thus the bridge doesn't exists)
array_unshift($arrValidBridges, 'virbr0');
array_unshift($arrBridges, 'virbr0');
return array_values($arrValidBridges);
$arrValidNetworks['bridges'] = array_values($arrBridges);
$arrVirtual = $lv->libvirt_get_net_list($lv->get_connection());
if (($key = array_search('default', $arrVirtual)) !== false) {
unset($arrVirtual[$key]);
}
array_unshift($arrVirtual, 'default');
$arrValidNetworks['libvirt'] = array_values($arrVirtual);
return $arrValidNetworks;
}
function domain_to_config($uuid) {
@@ -32,7 +32,7 @@
$arrValidCdromBuses = getValidCdromBuses();
$arrValidVNCModels = getValidVNCModels();
$arrValidKeyMaps = getValidKeyMaps();
$arrValidBridges = getNetworkBridges();
$arrValidNetworks = getValidNetworks();
$strCPUModel = getHostCPUModel();
$arrConfigDefaults = [
@@ -1010,12 +1010,17 @@
</td>
</tr>
<tr class="advanced">
<td>_(Network Bridge)_:</td>
<td>_(Network Source)_:</td>
<td>
<select name="nic[<?=$i?>][network]">
<?
foreach ($arrValidBridges as $strBridge) {
echo mk_option($arrNic['network'], $strBridge, $strBridge);
foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks[$key] as $strNetwork) {
echo mk_option($arrNic['network'], $strNetwork, $strNetwork);
}
}
?>
</select>
@@ -1044,8 +1049,8 @@
</p>
<p>
<b>Network Bridge</b><br>
The default libvirt managed network bridge (virbr0) will be used, otherwise you may specify an alternative name for a private network bridge to the host.
<b>Network Source</b><br>
The default libvirt managed network bridge (virbr0) will be used, otherwise you may specify an alternative name for a private network to the host.
</p>
<p>
@@ -1067,12 +1072,17 @@
</td>
</tr>
<tr class="advanced">
<td>_(Network Bridge)_:</td>
<td>_(Network Source)_:</td>
<td>
<select name="nic[{{INDEX}}][network]">
<?
foreach ($arrValidBridges as $strBridge) {
echo mk_option($domain_bridge, $strBridge, $strBridge);
foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks[$key] as $strNetwork) {
echo mk_option($domain_bridge, $strNetwork, $strNetwork);
}
}
?>
</select>
@@ -28,7 +28,7 @@
$arrValidOtherDevices = getValidOtherDevices();
$arrValidUSBDevices = getValidUSBDevices();
$arrValidDiskDrivers = getValidDiskDrivers();
$arrValidBridges = getNetworkBridges();
$arrValidNetworks = getValidNetworks();
$strCPUModel = getHostCPUModel();
// Read localpaths in from libreelec.cfg
@@ -827,12 +827,17 @@ $hdrXML = "<?xml version='1.0' encoding='UTF-8'?>\n"; // XML encoding declaratio
</td>
</tr>
<tr class="advanced">
<td>_(Network Bridge)_:</td>
<td>_(Network Source)_:</td>
<td>
<select name="nic[<?=$i?>][network]">
<?
foreach ($arrValidBridges as $strBridge) {
echo mk_option($arrNic['network'], $strBridge, $strBridge);
foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks as $strNetwork) {
echo mk_option($arrNic['network'], $strNetwork, $strNetwork);
}
}
?>
</select>
@@ -859,8 +864,8 @@ $hdrXML = "<?xml version='1.0' encoding='UTF-8'?>\n"; // XML encoding declaratio
</p>
<p>
<b>Network Bridge</b><br>
The default libvirt managed network bridge (virbr0) will be used, otherwise you may specify an alternative name for a private network bridge to the host.
<b>Network Source</b><br>
The default libvirt managed network bridge (virbr0) will be used, otherwise you may specify an alternative name for a private network to the host.
</p>
<p>
@@ -882,12 +887,17 @@ $hdrXML = "<?xml version='1.0' encoding='UTF-8'?>\n"; // XML encoding declaratio
</td>
</tr>
<tr class="advanced">
<td>_(Network Bridge)_:</td>
<td>_(Network Source)_:</td>
<td>
<select name="nic[{{INDEX}}][network]">
<?
foreach ($arrValidBridges as $strBridge) {
echo mk_option($domain_bridge, $strBridge, $strBridge);
foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks as $strNetwork) {
echo mk_option($domain_bridge, $strNetwork, $strNetwork);
}
}
?>
</select>
@@ -28,7 +28,7 @@
$arrValidOtherDevices = getValidOtherDevices();
$arrValidUSBDevices = getValidUSBDevices();
$arrValidDiskDrivers = getValidDiskDrivers();
$arrValidBridges = getNetworkBridges();
$arrValidNetworks = getValidNetworks();
$strCPUModel = getHostCPUModel();
// Read localpaths in from openelec.cfg
@@ -827,12 +827,17 @@ $hdrXML = "<?xml version='1.0' encoding='UTF-8'?>\n"; // XML encoding declaratio
</td>
</tr>
<tr class="advanced">
<td>_(Network Bridge)_:</td>
<td>_(Network Source)_:</td>
<td>
<select name="nic[<?=$i?>][network]">
<?
foreach ($arrValidBridges as $strBridge) {
echo mk_option($arrNic['network'], $strBridge, $strBridge);
foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks as $strNetwork) {
echo mk_option($arrNic['network'], $strNetwork, $strNetwork);
}
}
?>
</select>
@@ -859,8 +864,8 @@ $hdrXML = "<?xml version='1.0' encoding='UTF-8'?>\n"; // XML encoding declaratio
</p>
<p>
<b>Network Bridge</b><br>
The default libvirt managed network bridge (virbr0) will be used, otherwise you may specify an alternative name for a private network bridge to the host.
<b>Network Source</b><br>
The default libvirt managed network bridge (virbr0) will be used, otherwise you may specify an alternative name for a private network to the host.
</p>
<p>
@@ -882,12 +887,17 @@ $hdrXML = "<?xml version='1.0' encoding='UTF-8'?>\n"; // XML encoding declaratio
</td>
</tr>
<tr class="advanced">
<td>_(Network Bridge)_:</td>
<td>_(Network Source)_:</td>
<td>
<select name="nic[{{INDEX}}][network]">
<?
foreach ($arrValidBridges as $strBridge) {
echo mk_option($domain_bridge, $strBridge, $strBridge);
foreach (array_keys($arrValidNetworks) as $key) {
echo mk_option("", $key, "- ".$key." -", "disabled");
foreach ($arrValidNetworks as $strNetwork) {
echo mk_option($domain_bridge, $strNetwork, $strNetwork);
}
}
?>
</select>