From 34f7d4968d5b6a26fa5aa1b8b24283ac6e04650c Mon Sep 17 00:00:00 2001
From: SimonFair <39065407+SimonFair@users.noreply.github.com>
Date: Sat, 15 Mar 2025 16:22:37 +0000
Subject: [PATCH 01/85] Save PCI Data.
---
etc/rc.d/rc.6 | 4 ++++
sbin/savepcidata | 31 +++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
create mode 100644 sbin/savepcidata
diff --git a/etc/rc.d/rc.6 b/etc/rc.d/rc.6
index 8368d0f93..27022117c 100755
--- a/etc/rc.d/rc.6
+++ b/etc/rc.d/rc.6
@@ -219,6 +219,10 @@ if [[ ! -f /boot/logs/syslog && -z $MIRROR && -z $COPY ]]; then
fi
fi
+# Save PCI data to validate system changes at system start.
+
+/usr/sbin/savepcidata
+
# Before unmounting file systems write a reboot or halt record to wtmp.
/sbin/$SHUTDOWN_COMMAND -w
diff --git a/sbin/savepcidata b/sbin/savepcidata
new file mode 100644
index 000000000..01d24ae46
--- /dev/null
+++ b/sbin/savepcidata
@@ -0,0 +1,31 @@
+#!/usr/bin/php
+ $parts[0], // Full PCI address
+ 'class' => trim($parts[1], '"'),
+ 'vendor_id' => trim($parts[2], '"'),
+ 'device_id' => trim($parts[3], '"'),
+ 'revision' => (strpos($parts[4], '-r') === 0) ? substr($parts[4], 2) : null,
+ ];
+
+ // Determine correct indices for subsystem vendor/device IDs
+ $subsys_vendor_index = (isset($device['revision']) ? 5 : 4);
+ $subsys_device_index = $subsys_vendor_index + 1;
+
+ $device['subsystem_vendor_id'] = trim($parts[$subsys_vendor_index], '"');
+ $device['subsystem_device_id'] = trim($parts[$subsys_device_index], '"');
+
+ $devices[] = $device;
+ }
+
+ file_put_contents("/boot/config/savedpcidata.json",json_encode($devices,JSON_PRETTY_PRINT));
+?>
\ No newline at end of file
From d1dd42246c5af2032ff2f110059a4843ee98dd8c Mon Sep 17 00:00:00 2001
From: SimonFair <39065407+SimonFair@users.noreply.github.com>
Date: Sat, 15 Mar 2025 16:33:39 +0000
Subject: [PATCH 02/85] Set executable permission for savepcidata
---
sbin/savepcidata | 0
1 file changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 sbin/savepcidata
diff --git a/sbin/savepcidata b/sbin/savepcidata
old mode 100644
new mode 100755
From cfdd4c487d92eb02750b69b1adb79c5c982b0904 Mon Sep 17 00:00:00 2001
From: SimonFair <39065407+SimonFair@users.noreply.github.com>
Date: Fri, 4 Apr 2025 10:20:26 +0100
Subject: [PATCH 03/85] Initial commit
---
.../dynamix.vm.manager/VMMachines.page | 11 ++--
.../templates/Custom.form.php | 9 ++-
emhttp/plugins/dynamix/CPUvms.page | 15 ++++-
emhttp/plugins/dynamix/DashStats.page | 24 +++-----
emhttp/plugins/dynamix/include/CPUset.php | 13 +++--
emhttp/plugins/dynamix/include/Helpers.php | 58 +++++++++++++++++++
emhttp/plugins/dynamix/include/SysDevs.php | 11 +++-
7 files changed, 111 insertions(+), 30 deletions(-)
diff --git a/emhttp/plugins/dynamix.vm.manager/VMMachines.page b/emhttp/plugins/dynamix.vm.manager/VMMachines.page
index 19b64eee3..713cf4198 100644
--- a/emhttp/plugins/dynamix.vm.manager/VMMachines.page
+++ b/emhttp/plugins/dynamix.vm.manager/VMMachines.page
@@ -20,6 +20,8 @@ Markdown="false"
$docroot ??= ($_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp');
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
+$is_intel_cpu = is_intel_cpu();
+$core_types = $is_intel_cpu ? get_intel_core_types() : [];
$cpus = cpu_list();
$hover = in_array($theme,['white','azure']) ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.1)';
@@ -28,7 +30,7 @@ $fgcolor = in_array($theme,['white','azure']) ? '#1c1c1c' : '#f2f2f2';
$incolor = $theme!='gray' ? $bgcolor : '#121510';
function showCPUs($uuid) {
- global $cpus;
+ global $cpus,$is_intel_cpu,$core_types;
$vm = domain_to_config($uuid);
$vcpu = $vm['domain']['vcpu'];
$nopining = "";
@@ -38,12 +40,13 @@ function showCPUs($uuid) {
unset($cpu1,$cpu2);
[$cpu1, $cpu2] = my_preg_split('/[,-]/',$pair);
$check = ($vcpu && in_array($cpu1, $vcpu)) ? 'fa-circle orange-text':'fa-circle-o';
+ if ($is_intel_cpu && count($core_types) > 0) $core_type = "$core_types[$cpu1]"; else $core_type = "";
if (!$cpu2) {
- echo "";
+ echo "";
} else {
- echo "";
+ echo "";
$check = ($vcpu && in_array($cpu2, $vcpu)) ? 'fa-circle orange-text':'fa-circle-o';
- echo "";
+ echo "";
}
}
echo "
vCPUs: {$vm['domain']['vcpus']} $nopining";
diff --git a/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php b/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php
index ef782b506..fa8e5118e 100644
--- a/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php
+++ b/emhttp/plugins/dynamix.vm.manager/templates/Custom.form.php
@@ -555,16 +555,19 @@ if ($snapshots!=null && count($snapshots) && !$boolNew) {
';
+ }
+ }
$cdroms = $lv->get_cdrom_stats($res,true,true) ;
if ($state == 'running') {
$mem = $dom['memory']/1024;
@@ -117,7 +126,7 @@ foreach ($vms as $vm) {
unset($dom);
if (!isset($domain_cfg["CONSOLE"])) $vmrcconsole = "web" ; else $vmrcconsole = $domain_cfg["CONSOLE"] ;
if (!isset($domain_cfg["RDPOPT"])) $vmrcconsole .= ";no" ; else $vmrcconsole .= ";".$domain_cfg["RDPOPT"] ;
- $menu = sprintf("onclick=\"addVMContext('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', '%s')\"", addslashes($vm),addslashes($uuid),addslashes($template),$state,addslashes($vmrcurl),strtoupper($vmrcprotocol),addslashes($log),addslashes($fstype), $vmrcconsole,false,addslashes(str_replace('"',"'",$WebUI)));
+ $menu = sprintf("onclick=\"addVMContext('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', '%s', %s)\"", addslashes($vm),addslashes($uuid),addslashes($template),$state,addslashes($vmrcurl),strtoupper($vmrcprotocol),addslashes($log),addslashes($fstype), $vmrcconsole,false,addslashes(str_replace('"',"'",$WebUI)),$pcierror);
$kvm[] = "kvm.push({id:'$uuid',state:'$state'});";
switch ($state) {
case 'running':
@@ -196,7 +205,11 @@ foreach ($vms as $vm) {
$title = _('Select ISO image');
$cdstr = $cdromcount." / 2";
echo "
';
+ }
+ }
+ $menu = sprintf("onclick=\"addVMContext('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')\"", addslashes($vm), addslashes($uuid), addslashes($template), $state, addslashes($vmrcurl), strtoupper($vmrcprotocol), addslashes($log),addslashes($fstype), $vmrcconsole,false,addslashes(str_replace('"',"'",$WebUI)),$pcierror);
$icon = $lv->domain_get_icon_url($res);
switch ($state) {
case 'running':
From 002b857b2265ea2ea8a4bd2e0de8671515d10342 Mon Sep 17 00:00:00 2001
From: SimonFair <39065407+SimonFair@users.noreply.github.com>
Date: Sun, 6 Apr 2025 09:27:46 +0100
Subject: [PATCH 07/85] Add acknowledge all button
---
emhttp/plugins/dynamix/SysDevs.page | 20 +++++++++--
emhttp/plugins/dynamix/include/PCIUpdate.php | 38 ++++++++++++++------
emhttp/plugins/dynamix/include/SysDevs.php | 4 +++
3 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/emhttp/plugins/dynamix/SysDevs.page b/emhttp/plugins/dynamix/SysDevs.page
index 02ed63cf8..675c0d07d 100644
--- a/emhttp/plugins/dynamix/SysDevs.page
+++ b/emhttp/plugins/dynamix/SysDevs.page
@@ -46,6 +46,17 @@ function applyCfg() {
$("#applycfg").attr("disabled",true);
});
}
+function formatFullInput(input) {
+ return input
+ .split(';')
+ .filter(Boolean) // remove empty trailing entry
+ .map(entry => {
+ let [pci, status] = entry.split(',');
+ status = status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();
+ return `${pci} _(${status})_`;
+ })
+ .join('
';
- }
+ if (isset($pci_device_changes["0000:".$pciid])) $pcierror = true;
}
$cdroms = $lv->get_cdrom_stats($res,true,true) ;
if ($state == 'running') {
@@ -207,8 +204,7 @@ foreach ($vms as $vm) {
echo "