This commit is contained in:
SimonFair
2024-05-27 10:43:27 +01:00
parent 4fcf899c5a
commit e6ff7a5d7f
4 changed files with 205 additions and 72 deletions

View File

@@ -100,14 +100,12 @@ if (strpos($strSelectedTemplate,"User-") !== false) {
$strSelectedTemplateUT = str_replace("User-","",$strSelectedTemplateUT);
$usertemplate = 1;
}
$newmodel = is_file("/etc/libvirt/qemu/newmodel");
if ($newmodel && $arrLoad['form'] == "Custom.form.php") { $arrLoad['form'] = "Custom.formXML.php"; $inlineswt = '<input type="checkbox" class="inlineview">'; } else $inlineswt = "";
?>
<link type="text/css" rel="stylesheet" href="<?autov('/plugins/dynamix.vm.manager/styles/dynamix.vm.manager.css')?>">
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.filetree.css')?>">
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.switchbutton.css')?>">
<span class="status advancedview_panel" style="margin-top:<?=$top?>px;"><?=$inlineswt?><input type="checkbox" class="advancedview"></span>
<span class="status advancedview_panel" style="margin-top:<?=$top?>px;"><input type="checkbox" class="inlineview"><input type="checkbox" class="advancedview"></span>
<div class="domain">
<form id="vmform" method="POST">
<input type="hidden" name="domain[type]" value="kvm" />
@@ -167,14 +165,14 @@ function isVMXMLMode() {
}
function isinlineXMLMode() {
return ($.cookie('vmmanager_inline_mode') == 'hide');
return ($.cookie('vmmanager_inline_mode') == 'show');
}
function hidexml(checked)
{
var form = document.getElementById("vmform"); // Replace "yourFormId" with the actual ID of your form
var xmlElements = form.getElementsByClassName("xml");
if (checked == 1) xmldisplay = "none"; else xmldisplay = "";
if (checked == 0) xmldisplay = "none"; else xmldisplay = "";
// Unhide each element
for (var i = 0; i < xmlElements.length; i++) {
xmlElements[i].style.display = xmldisplay; // Setting to empty string will revert to default style
@@ -199,8 +197,8 @@ $(function() {
});
$('.inlineview').switchButton({
labels_placement: "left",
on_label: "_(Hide inline xml)_",
off_label: "_(Show Inline XML)_",
off_label: "_(Hide inline xml)_",
on_label: "_(Show Inline XML)_",
checked: isinlineXMLMode()
});
$('.advancedview').change(function () {
@@ -209,7 +207,7 @@ $(function() {
});
$('.inlineview').change(function () {
hidexml($(this).is(':checked'));
$.cookie('vmmanager_inline_mode', $(this).is(':checked') ? 'hide' : 'show', { expires: 3650 });
$.cookie('vmmanager_inline_mode', $(this).is(':checked') ? 'show' : 'hide', { expires: 3650 });
});
$('#template_img').click(function (){

View File

@@ -2748,10 +2748,9 @@ function build_xml_templates($strXML) {
$xml2["devices"]["usb"][$usbaddr] = $xmlhostdev;
$xml2["devices"]["allusb"] .= $xmlhostdev;
break;
}
}
}
}
foreach($xml2["devices"]["input"] as $input) $xml2["devices"]["allinput"] .= "$input\n";
return $xml2;
}

View File

@@ -24,6 +24,7 @@
}
$arrValidMachineTypes = getValidMachineTypes();
$arrValidPCIDevices = getValidPCIDevices();
$arrValidGPUDevices = getValidGPUDevices();
$arrValidAudioDevices = getValidAudioDevices();
$arrValidOtherDevices = getValidOtherDevices();
@@ -290,6 +291,12 @@
$boolNew = true;
$arrConfig = $arrConfigDefaults;
$arrVMUSBs = getVMUSBs($strXML) ;
$strXML = $lv->config_to_xml($arrConfig);
$domXML = new DOMDocument();
$domXML->preserveWhiteSpace = false;
$domXML->formatOutput = true;
$domXML->loadXML($strXML);
$strXML= $domXML->saveXML();
}
// Add any custom metadata field defaults (e.g. os)
if (!$arrConfig['template']['os']) {
@@ -307,6 +314,7 @@
unset($arrConfig['domain']['uuid']);
}
if ($usertemplate == 1) unset($arrConfig['domain']['uuid']);
$xml2 = build_xml_templates($strXML);
?>
<link rel="stylesheet" href="<?autov('/plugins/dynamix.vm.manager/scripts/codemirror/lib/codemirror.css')?>">
@@ -329,6 +337,7 @@
<tr>
<td>_(Name)_:</td>
<td><input type="text" name="domain[name]" id="domain_name" class="textTemplate" title="_(Name of virtual machine)_" placeholder="_(e.g.)_ _(My Workstation)_" value="<?=htmlspecialchars($arrConfig['domain']['name'])?>" required /></td>
<td><textarea class="xml" id="xmlname" rows=1 disabled ><?=htmlspecialchars($xml2['name'])."\n".htmlspecialchars($xml2['uuid'])."\n".htmlspecialchars($xml2['metadata'])?></textarea></td>
</tr>
</table>
<blockquote class="inline_help">
@@ -339,6 +348,7 @@
<tr class="advanced">
<td>_(Description)_:</td>
<td><input type="text" name="domain[desc]" title="_(description of virtual machine)_" placeholder="_(description of virtual machine)_ (_(optional)_)" value="<?=htmlspecialchars($arrConfig['domain']['desc'])?>" /></td>
<td><textarea class="xml" id="xmldesription" rows=1 disabled ><?=htmlspecialchars($xml2['description'])?></textarea></td>
</tr>
</table>
<div class="advanced">
@@ -428,6 +438,7 @@
?>
</select>
</td>
<td><textarea class="xml" id="xmlcpu" rows=1 disabled ><?=htmlspecialchars($xml2['cpu'])?></textarea></td>
</tr>
</table>
<div class="advanced">
@@ -470,6 +481,7 @@
?>
</div>
</td>
<td><textarea class="xml" id="xmlvcpu" rows=5 disabled ><?=htmlspecialchars($xml2['vcpu'])."\n".htmlspecialchars($xml2['cputune'])?></textarea></td>
</tr>
</table>
<blockquote class="inline_help">
@@ -506,6 +518,7 @@
?>
</select>
</td>
<td><textarea class="xml" id="xmlmem" rows=2 disabled ><?=htmlspecialchars($xml2['memory'])."\n".htmlspecialchars($xml2['currentMemory'])."\n".htmlspecialchars($xml2['memoryBacking'])?></textarea></td>
</tr>
</table>
<div class="basic">
@@ -533,6 +546,7 @@
<?mk_dropdown_options($arrValidMachineTypes, $arrConfig['domain']['machine']);?>
</select>
</td>
<td><textarea class="xml" id="xmlos" rows=5 cols=200 disabled ><?=htmlspecialchars($xml2['os'])."\n".htmlspecialchars($xml2['features'])?></textarea></td>
</tr>
</table>
<div class="advanced">
@@ -651,6 +665,7 @@
<td>
<input type="text" name="media[cdrom]" autocomplete="off" spellcheck="false" data-pickcloseonfile="true" data-pickfilter="iso" data-pickmatch="^[^.].*" data-pickroot="<?=htmlspecialchars($domain_cfg['MEDIADIR'])?>" class="cdrom" value="<?=htmlspecialchars($arrConfig['media']['cdrom'])?>" placeholder="_(Click and Select cdrom image to install operating system)_">
</td>
<td><textarea class="xml" id="xmlvdiskhda" rows=1 disabled wrap="soft"><?=htmlspecialchars($xml2['devices']['disk']['hda'])?></textarea></td>
</tr>
<tr class="advanced">
<td>_(OS Install CDRom Bus)_:</td>
@@ -686,6 +701,7 @@
<?mk_dropdown_options($arrValidCdromBuses, $arrConfig['media']['driversbus']);?>
</select>
</td>
<td><textarea class="xml" id="xmlvdiskhdb" rows=1 disabled wrap="soft"><?=htmlspecialchars($xml2['devices']['disk']['hdb'])?></textarea></td>
</tr>
</table>
<div class="domain_os windows">
@@ -725,6 +741,7 @@
if (strpos($domain_cfg['DOMAINDIR'], dirname(dirname($arrDisk['new']))) === false ||
basename(dirname($arrDisk['new'])) != $arrConfig['domain']['name'] || (
basename($arrDisk['new']) != 'vdisk'.($i+1).'.img') && basename($arrDisk['new']) != 'vdisk'.($i+1).'.qcow2') {
if ($arrDisk['driver'] == "qcow2" && (basename($arrDisk['new']) == 'vdisk'.($i+1).'.qcow2')) $default_option = "auto"; else
$default_option = 'manual';
}
if (file_exists(dirname(dirname($arrDisk['new'])).'/'.$arrConfig['domain']['name'].'/vdisk'.($i+1).'.img') || file_exists(dirname(dirname($arrDisk['new'])).'/'.$arrConfig['domain']['name'].'/vdisk'.($i+1).'.qcow2')) {
@@ -784,6 +801,7 @@
?>
</select><input type="text" name="disk[<?=$i?>][new]" autocomplete="off" spellcheck="false" data-pickcloseonfile="true" data-pickfolders="true" data-pickfilter="img,qcow,qcow2" data-pickmatch="^[^.].*" data-pickroot="/mnt/" class="disk" id="disk_<?=$i?>" value="<?=htmlspecialchars($arrDisk['new'])?>" placeholder="_(Separate sub-folder and image will be created based on Name)_"><div class="disk_preview"></div>
</td>
<td><textarea class="xml" id="xmlvdisk<?=$i?>" rows=4 disabled wrap="soft"><?=htmlspecialchars($xml2['devices']['disk'][$arrDisk['dev']])?></textarea></td>
</tr>
<input type="hidden" name="disk[<?=$i?>][storage]" id="disk[<?=$i?>][storage]" value="<?=htmlspecialchars($arrConfig['template']['storage'])?>">
@@ -1003,6 +1021,7 @@
mk_dropdown_options($arrUnraidShares, $arrUnraidIndex);?>
</select>
</td>
<td><textarea class="xml" id="xmlshare<?=$i?>" rows=4 wrap="soft" disabled ><?=htmlspecialchars($xml2['devices']['filesystem'][$i])?></textarea></td>
</tr>
<tr class="advanced">
@@ -1124,6 +1143,13 @@
?>
</select>
</td>
<?
if ($arrGPU['id'] == 'virtual') {
?>
<td><textarea class="xml" id="xmlgraphics<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['graphics'][0])."\n".htmlspecialchars($xml2['devices']['video'][0])."\n".htmlspecialchars($xml2['devices']['audio'][0])?></textarea></td>
<?} else {?>
<td><textarea class="xml" id="xmlgraphics<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['vga'][$arrGPU['id']])?></textarea></td>
<?}?>
</tr>
<?if ($i == 0) {
@@ -1296,6 +1322,7 @@
?>
</select>
</td>
<td><textarea class="xml" id="xmlaudio<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['audio'][$arrAudio['id']])?></textarea></td>
</tr>
</table>
<?if ($i == 0) {?>
@@ -1340,6 +1367,7 @@
<td>
<input type="text" name="nic[<?=$i?>][mac]" class="narrow" value="<?=htmlspecialchars($arrNic['mac'])?>" title="_(random mac, you can supply your own)_" /> <i class="fa fa-refresh mac_generate" title="_(re-generate random mac address)_"></i>
</td>
<td><textarea class="xml" id="xmlnet<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['interface'][$i])?></textarea></td>
</tr>
<tr class="advanced">
<td>_(Network Source)_:</td>
@@ -1457,7 +1485,7 @@
<tr>
<td>_(USB Devices)_:</td>
<td>
<div class="textarea" style="width: 850px">
<div class="textarea" style="width: 780px">
<?
if (!empty($arrVMUSBs)) {
foreach($arrVMUSBs as $i => $arrDev) {
@@ -1465,7 +1493,8 @@
<label for="usb<?=$i?>">&nbsp&nbsp&nbsp&nbsp<input type="checkbox" name="usb[]" id="usb<?=$i?>" value="<?=htmlspecialchars($arrDev['id'])?>" <?if (count(array_filter($arrConfig['usb'], function($arr) use ($arrDev) { return ($arr['id'] == $arrDev['id']); }))) echo 'checked="checked"';?>
/> &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp <input type="checkbox" name="usbopt[<?=htmlspecialchars($arrDev['id'])?>]" id="usbopt<?=$i?>" value="<?=htmlspecialchars($arrDev['id'])?>" <?if ($arrDev["startupPolicy"] =="optional") echo 'checked="checked"';?>/>&nbsp&nbsp&nbsp&nbsp&nbsp
<input type="number" size="5" maxlength="5" id="usbboot<?=$i?>" class="narrow bootorder" <?=$bootdisable?> style="width: 50px;" name="usbboot[<?=htmlspecialchars($arrDev['id'])?>]" title="_(Boot order)_" value="<?=$arrDev['usbboot']?>" >
<?=htmlspecialchars(substr($arrDev['name'],0,100))?> (<?=htmlspecialchars($arrDev['id'])?>)</label><br/>
<?=htmlspecialchars(substr($arrDev['name'],0,90))?> (<?=htmlspecialchars($arrDev['id'])?>)</label><br/>
<?
}
} else {
@@ -1473,7 +1502,7 @@
}
?>
</div>
</td>
</td><td><textarea class="xml" id="xmlusb<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['allusb'])?></textarea></td>
</tr>
</table>
<blockquote class="inline_help">
@@ -1489,7 +1518,7 @@
<tr>
<td>_(Other PCI Devices)_:</td>
<td>
<div class="textarea" style="width: 850px">
<div class="textarea" style="width: 780px">
<?
$intAvailableOtherPCIDevices = 0;
@@ -1510,6 +1539,7 @@
<label for="pci<?=$i?>">&nbsp&nbsp&nbsp&nbsp<input type="checkbox" name="pci[]" id="pci<?=$i?>" value="<?=htmlspecialchars($arrDev['id'])?>" <?=$extra?>/> &nbsp
<input type="number" size="5" maxlength="5" id="pciboot<?=$i?>" class="narrow pcibootorder" <?=$bootdisable?> style="width: 50px;" name="pciboot[<?=htmlspecialchars($arrDev['id'])?>]" title="_(Boot order)_" value="<?=$pciboot?>" >
<?=htmlspecialchars($arrDev['name'])?> | <?=htmlspecialchars($arrDev['type'])?> (<?=htmlspecialchars($arrDev['id'])?>)</label><br/>
<td><textarea class="xml" id="xmlpci<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['other'][$arrDev['id']])?></textarea></td>
<?
}
}
@@ -1520,6 +1550,7 @@
?>
</div>
</td>
</tr>
</table>
<blockquote class="inline_help">
@@ -1561,7 +1592,7 @@
if ($arrConfig['qemucmdline'] == "") $qemurows = 2 ; else $qemurows = 15 ;
?>
<td>
<textarea id="qemucmdline" name="qemucmdline" rows=<?=$qemurows?> style="width: 850px" onchange="QEMUChgCmd(this)"><?=htmlspecialchars($arrConfig['qemucmdline'])?> </textarea></td></tr>
<textarea id="qemucmdline" name="qemucmdline" class="xmlqemu" rows=<?=$qemurows?> style="width: 780px" onchange="QEMUChgCmd(this)"><?=htmlspecialchars($arrConfig['qemucmdline'])."\n".htmlspecialchars($arrConfig['qemuoverride'])?> </textarea></td></tr>
</td>
</tr>
</table>
@@ -1583,6 +1614,7 @@
?>
</select>
</td>
<td></td><td></td><td><textarea class="xml" id="xmlclock" rows=5 disabled ><?=htmlspecialchars($xml2['clock'])."\n".htmlspecialchars($xml2['on_poweroff'])."\n".htmlspecialchars($xml2['on_reboot'])."\n".htmlspecialchars($xml2['on_crash'])?></textarea></td>
</tr>
<?$clockcount = 0 ;
if (!empty($arrClocks)) {
@@ -1646,6 +1678,8 @@
?>
</select>
</td>
<td></td><td></td><td><textarea class="xml" id="xmlclock" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['allinput'])?></textarea></td>
</tr>
<tr class="advanced disk_file_options">
<td>_(Grab)_:</td>
@@ -1779,6 +1813,19 @@
<p>Click Create to generate the vDisks and return to the Virtual Machines page where your new VM will be created.</p>
</blockquote>
<?}?>
<table>
<tr>
<tr>
<td class="xml">_(Other XML)_:</td>
<?
if ($arrConfig['qemucmdline'] == "") $qemurows = 2 ; else $qemurows = 15 ;
?>
<td>
<textarea id="xmlother" name="xmlother" class="xml" rows=10 style="width: 780px"> <?=htmlspecialchars($xml2['devices']['emulator'][0])."\n".htmlspecialchars($xml2['devices']['console'][0])."\n".htmlspecialchars($xml2['devices']['serial'][0])."\n".htmlspecialchars($xml2['devices']['channel'][0])."\n"?> </textarea></td></tr>
</td>
</tr>
</table>
</div>
<div class="xmlview">

View File

@@ -97,7 +97,7 @@
'protocol' => 'vnc',
'autoport' => 'yes',
'model' => 'qxl',
'keymap' => 'en-us',
'keymap' => 'none',
'port' => -1 ,
'wsport' => -1,
'copypaste' => 'no'
@@ -291,12 +291,6 @@
$boolNew = true;
$arrConfig = $arrConfigDefaults;
$arrVMUSBs = getVMUSBs($strXML) ;
$strXML = $lv->config_to_xml($arrConfig);
$domXML = new DOMDocument();
$domXML->preserveWhiteSpace = false;
$domXML->formatOutput = true;
$domXML->loadXML($strXML);
$strXML= $domXML->saveXML();
}
// Add any custom metadata field defaults (e.g. os)
if (!$arrConfig['template']['os']) {
@@ -309,8 +303,11 @@
} else $arrClocks = $arrDefaultClocks['other'] ;
}
if (strpos($arrConfig['template']['name'],"User-") !== false) $arrConfig['template']['name'] = str_replace("User-","",$arrConfig['template']['name']);
$xml2 = build_xml_templates($strXML);
if (strpos($arrConfig['template']['name'],"User-") !== false) {
$arrConfig['template']['name'] = str_replace("User-","",$arrConfig['template']['name']);
unset($arrConfig['domain']['uuid']);
}
if ($usertemplate == 1) unset($arrConfig['domain']['uuid']);
?>
<link rel="stylesheet" href="<?autov('/plugins/dynamix.vm.manager/scripts/codemirror/lib/codemirror.css')?>">
@@ -333,7 +330,6 @@
<tr>
<td>_(Name)_:</td>
<td><input type="text" name="domain[name]" id="domain_name" class="textTemplate" title="_(Name of virtual machine)_" placeholder="_(e.g.)_ _(My Workstation)_" value="<?=htmlspecialchars($arrConfig['domain']['name'])?>" required /></td>
<td><textarea class="xml" id="xmlname" rows=1 disabled ><?=htmlspecialchars($xml2['name'])."\n".htmlspecialchars($xml2['uuid'])."\n".htmlspecialchars($xml2['metadata'])?></textarea></td>
</tr>
</table>
<blockquote class="inline_help">
@@ -344,7 +340,6 @@
<tr class="advanced">
<td>_(Description)_:</td>
<td><input type="text" name="domain[desc]" title="_(description of virtual machine)_" placeholder="_(description of virtual machine)_ (_(optional)_)" value="<?=htmlspecialchars($arrConfig['domain']['desc'])?>" /></td>
<td><textarea class="xml" id="xmldesription" rows=1 disabled ><?=htmlspecialchars($xml2['description'])?></textarea></td>
</tr>
</table>
<div class="advanced">
@@ -434,7 +429,6 @@
?>
</select>
</td>
<td><textarea class="xml" id="xmlcpu" rows=1 disabled ><?=htmlspecialchars($xml2['cpu'])?></textarea></td>
</tr>
</table>
<div class="advanced">
@@ -477,7 +471,6 @@
?>
</div>
</td>
<td><textarea class="xml" id="xmlvcpu" rows=5 disabled ><?=htmlspecialchars($xml2['vcpu'])."\n".htmlspecialchars($xml2['cputune'])?></textarea></td>
</tr>
</table>
<blockquote class="inline_help">
@@ -514,7 +507,6 @@
?>
</select>
</td>
<td><textarea class="xml" id="xmlmem" rows=2 disabled ><?=htmlspecialchars($xml2['memory'])."\n".htmlspecialchars($xml2['currentMemory'])."\n".htmlspecialchars($xml2['memoryBacking'])?></textarea></td>
</tr>
</table>
<div class="basic">
@@ -542,7 +534,6 @@
<?mk_dropdown_options($arrValidMachineTypes, $arrConfig['domain']['machine']);?>
</select>
</td>
<td><textarea class="xml" id="xmlos" rows=5 cols=200 disabled ><?=htmlspecialchars($xml2['os'])."\n".htmlspecialchars($xml2['features'])?></textarea></td>
</tr>
</table>
<div class="advanced">
@@ -661,7 +652,6 @@
<td>
<input type="text" name="media[cdrom]" autocomplete="off" spellcheck="false" data-pickcloseonfile="true" data-pickfilter="iso" data-pickmatch="^[^.].*" data-pickroot="<?=htmlspecialchars($domain_cfg['MEDIADIR'])?>" class="cdrom" value="<?=htmlspecialchars($arrConfig['media']['cdrom'])?>" placeholder="_(Click and Select cdrom image to install operating system)_">
</td>
<td><textarea class="xml" id="xmlvdiskhda" rows=1 disabled wrap="soft"><?=htmlspecialchars($xml2['devices']['disk']['hda'])?></textarea></td>
</tr>
<tr class="advanced">
<td>_(OS Install CDRom Bus)_:</td>
@@ -697,7 +687,6 @@
<?mk_dropdown_options($arrValidCdromBuses, $arrConfig['media']['driversbus']);?>
</select>
</td>
<td><textarea class="xml" id="xmlvdiskhdb" rows=1 disabled wrap="soft"><?=htmlspecialchars($xml2['devices']['disk']['hdb'])?></textarea></td>
</tr>
</table>
<div class="domain_os windows">
@@ -737,7 +726,6 @@
if (strpos($domain_cfg['DOMAINDIR'], dirname(dirname($arrDisk['new']))) === false ||
basename(dirname($arrDisk['new'])) != $arrConfig['domain']['name'] || (
basename($arrDisk['new']) != 'vdisk'.($i+1).'.img') && basename($arrDisk['new']) != 'vdisk'.($i+1).'.qcow2') {
if ($arrDisk['driver'] == "qcow2" && (basename($arrDisk['new']) == 'vdisk'.($i+1).'.qcow2')) $default_option = "auto"; else
$default_option = 'manual';
}
if (file_exists(dirname(dirname($arrDisk['new'])).'/'.$arrConfig['domain']['name'].'/vdisk'.($i+1).'.img') || file_exists(dirname(dirname($arrDisk['new'])).'/'.$arrConfig['domain']['name'].'/vdisk'.($i+1).'.qcow2')) {
@@ -797,7 +785,6 @@
?>
</select><input type="text" name="disk[<?=$i?>][new]" autocomplete="off" spellcheck="false" data-pickcloseonfile="true" data-pickfolders="true" data-pickfilter="img,qcow,qcow2" data-pickmatch="^[^.].*" data-pickroot="/mnt/" class="disk" id="disk_<?=$i?>" value="<?=htmlspecialchars($arrDisk['new'])?>" placeholder="_(Separate sub-folder and image will be created based on Name)_"><div class="disk_preview"></div>
</td>
<td><textarea class="xml" id="xmlvdisk<?=$i?>" rows=4 disabled wrap="soft"><?=htmlspecialchars($xml2['devices']['disk'][$arrDisk['dev']])?></textarea></td>
</tr>
<input type="hidden" name="disk[<?=$i?>][storage]" id="disk[<?=$i?>][storage]" value="<?=htmlspecialchars($arrConfig['template']['storage'])?>">
@@ -1017,7 +1004,6 @@
mk_dropdown_options($arrUnraidShares, $arrUnraidIndex);?>
</select>
</td>
<td><textarea class="xml" id="xmlshare<?=$i?>" rows=4 wrap="soft" disabled ><?=htmlspecialchars($xml2['devices']['filesystem'][$i])?></textarea></td>
</tr>
<tr class="advanced">
@@ -1139,13 +1125,6 @@
?>
</select>
</td>
<?
if ($arrGPU['id'] == 'virtual') {
?>
<td><textarea class="xml" id="xmlgraphics<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['graphics'][0])."\n".htmlspecialchars($xml2['devices']['video'][0])."\n".htmlspecialchars($xml2['devices']['audio'][0])?></textarea></td>
<?} else {?>
<td><textarea class="xml" id="xmlgraphics<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['vga'][$arrGPU['id']])?></textarea></td>
<?}?>
</tr>
<?if ($i == 0) {
@@ -1318,7 +1297,6 @@
?>
</select>
</td>
<td><textarea class="xml" id="xmlaudio<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['audio'][$arrAudio['id']])?></textarea></td>
</tr>
</table>
<?if ($i == 0) {?>
@@ -1363,7 +1341,6 @@
<td>
<input type="text" name="nic[<?=$i?>][mac]" class="narrow" value="<?=htmlspecialchars($arrNic['mac'])?>" title="_(random mac, you can supply your own)_" /> <i class="fa fa-refresh mac_generate" title="_(re-generate random mac address)_"></i>
</td>
<td><textarea class="xml" id="xmlnet<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['interface'][$i])?></textarea></td>
</tr>
<tr class="advanced">
<td>_(Network Source)_:</td>
@@ -1481,7 +1458,7 @@
<tr>
<td>_(USB Devices)_:</td>
<td>
<div class="textarea" style="width: 780px">
<div class="textarea" style="width: 850px">
<?
if (!empty($arrVMUSBs)) {
foreach($arrVMUSBs as $i => $arrDev) {
@@ -1489,8 +1466,7 @@
<label for="usb<?=$i?>">&nbsp&nbsp&nbsp&nbsp<input type="checkbox" name="usb[]" id="usb<?=$i?>" value="<?=htmlspecialchars($arrDev['id'])?>" <?if (count(array_filter($arrConfig['usb'], function($arr) use ($arrDev) { return ($arr['id'] == $arrDev['id']); }))) echo 'checked="checked"';?>
/> &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp <input type="checkbox" name="usbopt[<?=htmlspecialchars($arrDev['id'])?>]" id="usbopt<?=$i?>" value="<?=htmlspecialchars($arrDev['id'])?>" <?if ($arrDev["startupPolicy"] =="optional") echo 'checked="checked"';?>/>&nbsp&nbsp&nbsp&nbsp&nbsp
<input type="number" size="5" maxlength="5" id="usbboot<?=$i?>" class="narrow bootorder" <?=$bootdisable?> style="width: 50px;" name="usbboot[<?=htmlspecialchars($arrDev['id'])?>]" title="_(Boot order)_" value="<?=$arrDev['usbboot']?>" >
<?=htmlspecialchars(substr($arrDev['name'],0,90))?> (<?=htmlspecialchars($arrDev['id'])?>)</label><br/>
<?=htmlspecialchars(substr($arrDev['name'],0,100))?> (<?=htmlspecialchars($arrDev['id'])?>)</label><br/>
<?
}
} else {
@@ -1498,7 +1474,7 @@
}
?>
</div>
</td><td><textarea class="xml" id="xmlusb<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['allusb'])?></textarea></td>
</td>
</tr>
</table>
<blockquote class="inline_help">
@@ -1514,7 +1490,7 @@
<tr>
<td>_(Other PCI Devices)_:</td>
<td>
<div class="textarea" style="width: 780px">
<div class="textarea" style="width: 850px">
<?
$intAvailableOtherPCIDevices = 0;
@@ -1535,7 +1511,6 @@
<label for="pci<?=$i?>">&nbsp&nbsp&nbsp&nbsp<input type="checkbox" name="pci[]" id="pci<?=$i?>" value="<?=htmlspecialchars($arrDev['id'])?>" <?=$extra?>/> &nbsp
<input type="number" size="5" maxlength="5" id="pciboot<?=$i?>" class="narrow pcibootorder" <?=$bootdisable?> style="width: 50px;" name="pciboot[<?=htmlspecialchars($arrDev['id'])?>]" title="_(Boot order)_" value="<?=$pciboot?>" >
<?=htmlspecialchars($arrDev['name'])?> | <?=htmlspecialchars($arrDev['type'])?> (<?=htmlspecialchars($arrDev['id'])?>)</label><br/>
<td><textarea class="xml" id="xmlpci<?=$i?>" rows=5 disabled ><?=htmlspecialchars($xml2['devices']['other'][$arrDev['id']])?></textarea></td>
<?
}
}
@@ -1546,7 +1521,6 @@
?>
</div>
</td>
</tr>
</table>
<blockquote class="inline_help">
@@ -1588,7 +1562,7 @@
if ($arrConfig['qemucmdline'] == "") $qemurows = 2 ; else $qemurows = 15 ;
?>
<td>
<textarea id="qemucmdline" name="qemucmdline" class="xmlqemu" rows=<?=$qemurows?> style="width: 780px" onchange="QEMUChgCmd(this)"><?=htmlspecialchars($arrConfig['qemucmdline'])."\n".htmlspecialchars($arrConfig['qemuoverride'])?> </textarea></td></tr>
<textarea id="qemucmdline" name="qemucmdline" rows=<?=$qemurows?> style="width: 850px" onchange="QEMUChgCmd(this)"><?=htmlspecialchars($arrConfig['qemucmdline'])?> </textarea></td></tr>
</td>
</tr>
</table>
@@ -1610,7 +1584,6 @@
?>
</select>
</td>
<td></td><td></td><td><textarea class="xml" id="xmlclock" rows=5 disabled ><?=htmlspecialchars($xml2['clock'])."\n".htmlspecialchars($xml2['on_poweroff'])."\n".htmlspecialchars($xml2['on_reboot'])."\n".htmlspecialchars($xml2['on_crash'])?></textarea></td>
</tr>
<?$clockcount = 0 ;
if (!empty($arrClocks)) {
@@ -1658,6 +1631,133 @@
<p>Windows and Hyperv Hpet:no Hypervclock: yes Pit no rtc no. </p>
</p>
</blockquote>
<?
if (!isset($arrConfig['evdev'])) $arrConfig['evdev'][0] = ['dev'=>"",'grab'=>"",'repeat'=>"",'grabToggle'=>""];
foreach ($arrConfig['evdev'] as $i => $arrEvdev) {
$strLabel = ($i > 0) ? appendOrdinalSuffix($i + 1) : '';
?>
<table data-category="evdev" data-multiple="true" data-minimum="1" data-index="<?=$i?>" data-prefix="<?=$strLabel?>">
<tr>
<td>_(Evdev Device)_:</td>
<td>
<select name="evdev[<?=$i?>][dev]" class="dev narrow">
<?
echo mk_option($arrEvdev['dev'], '', _('None'));
foreach(getValidevDev() as $line) echo mk_option($arrEvdev['dev'], $line , $line);
?>
</select>
</td>
<tr class="advanced disk_file_options">
<td>_(Grab)_:</td>
<td>
<select name="evdev[<?=$i?>][grab]" class="evdev_grab" title="_(grab options)_">
<?echo mk_option($arrEvdev['grab'], '', _('None'));
foreach(["all"] as $line) echo mk_option($arrEvdev['grab'],$line,ucfirst($line));?>
</select>
</td>
</tr>
<tr class="advanced disk_file_options">
<td>_(Repeat)_:</td>
<td>
<select name="evdev[<?=$i?>][repeat]" class="evdev_repeat narrow" title="_(grab options)_">
<?echo mk_option($arrEvdev['repeat'], '', _('None'));
foreach(["on","off"] as $line) echo mk_option($arrEvdev['repeat'],$line,ucfirst($line));?>
</select>
</td>
</tr>
<tr class="advanced disk_file_options">
<td>_(Grab Toggle)_:</td>
<td>
<select name="evdev[<?=$i?>][grabToggle]" class="evdev_grabtoggle narrow" title="_(grab options)_">
<?echo mk_option($arrEvdev['grabToggle'], '', _('None'));
foreach(["ctrl-ctrl", "alt-alt", "shift-shift", "meta-meta", "scrolllock" , "ctrl-scrolllock"] as $line) echo mk_option($arrEvdev['grabToggle'],$line,$line);?>
</select>
</td>
</tr>
</table>
<?if ($i == 0) {?>
<div class="advanced">
<blockquote class="inline_help">
<p>
<b> Event Devices</b><br>
Evdev is an input interface built into the Linux kernel. QEMUs evdev passthrough support allows a user to redirect evdev events to a guest. These events can include mouse movements and key presses. By hitting both Ctrl keys at the same time, QEMU can toggle the input recipient. QEMUs evdev passthrough also features almost no latency, making it perfect for gaming. The main downside to evdev passthrough is the lack of button rebinding and in some cases, macro keys wont even work at all.
Optional items are normally only used for keyboards.
</p>
<p>
<b>Device</b><br>
Host device to passthrough to guest.
</p>
<p>
<b>Grab</b><br>
All grabs all input devices instead of just one
</p>
<p>
<b>Repeat</b><br>
Repeat with value 'on'/'off' to enable/disable auto-repeat events
</p>
<p>
<b>GrabToggle</b><br>
GrabToggle with values ctrl-ctrl, alt-alt, shift-shift, meta-meta, scrolllock or ctrl-scrolllock to change the grab key combination</p>
<p>Additional devices can be added/removed by clicking the symbols to the left.</p>
</blockquote>
</div>
<?}?>
<?}?>
<script type="text/html" id="tmplevdev">
<table data-category="evdev" data-multiple="true" data-minimum="1" data-index="<?=$i?>" data-prefix="<?=$strLabel?>">
<tr>
<td>_(Evdev Device)_:</td>
<td>
<select name="evdev[{{INDEX}}][dev]" class="dev narrow">
<?
echo mk_option("", '', _('None'));
foreach(getValidevDev() as $line) echo mk_option("", $line , $line);
?>
</select>
</td>
<tr class="advanced disk_file_options">
<td>_(Grab)_:</td>
<td>
<select name="evdev[{{INDEX}}][grab]" class="evdev_grab" title="_(grab options)_">
<?echo mk_option("" , '', _('None'));
foreach(["all"] as $line) echo mk_option("",$line,ucfirst($line));?>
</select>
</td>
</tr>
<tr class="advanced disk_file_options">
<td>_(Repeat)_:</td>
<td>
<select name="evdev[{{INDEX}}][repeat]" class="evdev_repeat narrow" title="_(grab options)_">
<?echo mk_option("", '', _('None'));
foreach(["on","off"] as $line) echo mk_option("",$line,ucfirst($line));?>
</select>
</td>
</tr>
<tr class="advanced disk_file_options">
<td>_(Grab Toggle)_:</td>
<td>
<select name="evdev[{{INDEX}}][grabToggle]" class="evdev_grabtoggle narrow" title="_(grab options)_">
<?echo mk_option("", '', _('None'));
foreach(["ctrl-ctrl", "alt-alt", "shift-shift", "meta-meta", "scrolllock" , "ctrl-scrolllock"] as $line) echo mk_option("",$line,$line);?>
</select>
</td>
</tr>
</table>
</script>
<table>
<tr>
@@ -1680,19 +1780,6 @@
<p>Click Create to generate the vDisks and return to the Virtual Machines page where your new VM will be created.</p>
</blockquote>
<?}?>
<table>
<tr>
<tr>
<td>_(Other XML)_:</td>
<?
if ($arrConfig['qemucmdline'] == "") $qemurows = 2 ; else $qemurows = 15 ;
?>
<td>
<textarea id="xmlother" name="xmlother" class="xml" rows=10 style="width: 780px"> <?=htmlspecialchars($xml2['devices']['emulator'][0])."\n".htmlspecialchars($xml2['devices']['console'][0])."\n".htmlspecialchars($xml2['devices']['serial'][0])."\n".htmlspecialchars($xml2['devices']['channel'][0])."\n".htmlspecialchars($xml2['devices']['input'][0])?> </textarea></td></tr>
</td>
</tr>
</table>
</div>
<div class="xmlview">
@@ -1957,8 +2044,8 @@ $(function() {
$('.advancedview').change(function () {
if ($(this).is(':checked')) {
setTimeout(function() {
var xmlPanelHeight = window.outerHeight - 550;
if (xmlPanelHeight < 0) xmlPanelHeight = null;
var xmlPanelHeight = window.outerHeight;
if (xmlPanelHeight > 1024) xmlPanelHeight = xmlPanelHeight-550;
editor.setSize(null,xmlPanelHeight);
editor.refresh();
}, 100);
@@ -2468,7 +2555,8 @@ $(function() {
$('#vmform #domain_clock').val('localtime');
$("#vmform #domain_machine option").each(function(){
if ($(this).val().indexOf('i440fx') != -1) {
$('#vmform #domain_machine').val($(this).val()).change();
var usertemplate = <?=$usertemplate?>;
if (usertemplate = 0) $('#vmform #domain_machine').val($(this).val()).change();
return false;
}
});
@@ -2477,7 +2565,8 @@ $(function() {
$('#vmform #clockoffset').val('utc');
$("#vmform #domain_machine option").each(function(){
if ($(this).val().indexOf('q35') != -1) {
$('#vmform #domain_machine').val($(this).val()).change();
var usertemplate = <?=$usertemplate?>;
if (usertemplate = 0) $('#vmform #domain_machine').val($(this).val()).change();
return false;
}
});