mirror of
https://github.com/unraid/webgui.git
synced 2026-04-30 23:09:42 -05:00
feat: make libvirt networks accessible via gui
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user