From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 70D351FF0B2 for ; Fri, 09 Oct 2026 08:59:24 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 305BC21611; Fri, 09 Oct 2026 08:59:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791529139; x=1792133939; darn=lists.proxmox.com; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=1XlHr2WFJ45YWr4cEixDgT+xhGjKNPub2J3NOGN1xOE=; b=Ls26Rxja4LV4buC1+Fct9rv2i/vWNG1fRoqc5gasX/EmoVU5ViqxZWWHa6toez3z/2 SRVr2l1Ew77KrsLt4qwABVDVPuK7iQZRerLziKIv5P2rJPv1QGDZrb8L9BQzrPOmwwXq TpsQvFsE02i/WRjvBP6j2e1PlocTHJtrNXPWvy2aJ66Viz0qdRwESh38mOxfhJUe3+nH MySkfJyZWQWAJpXzkN9SVZs6mjJBeT2JFp7JRzvS1JDRB2rcPNE7R24t24m13UF1k4ae Vo2zaXQLZwjzScD8EYvcW+Smequ5ftxMiiSd0/TN483m/zLG09IZkn4WrmrkGX/6APir 9qWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791529139; x=1792133939; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=1XlHr2WFJ45YWr4cEixDgT+xhGjKNPub2J3NOGN1xOE=; b=D92WgGBAbw8gL+W/6qBu5Mloy7mzi2jXz/cSCKXUYTAseHRd9z6pqBCx+T+QEyaoYb ebB1rn6oBquwSr4HmpCIZMs1vyg5A67W6PFIv+lJP0+e3BuxMYXosfudOSgjb0VWGYn1 LSEuL/B1sYREaEZtKhfSbN1X9FBqkcAz5+JnFFOJquoNse+soq5NYzndXcyymgzUKm50 N0AuTCB6yUcAK5ug/RB33rs1GTBfbLJORQFr9OwTXBxpFOnZRXD9wxN2X22p/xPZzAXS tssc9pB17Dxb2/fGZ5vqdsEzM5tgEGTLq22jegS4iFaLON2bhhkuNXAMxx1JaleExdCE tNJA== X-Gm-Message-State: AFq9FYLxdbLezJOKPqme1eCnjqg/80x5rzdL6uT8B4Y+9ymBBo3QexKa 6YgSVkKigg8XLeQb0wemfViFh1myFD1qBvN2lDjbTqjO67KuOH8JszVE69a3OQ== X-Gm-Gg: AYBFou2aVfw3U0dVmD1JtrX21Y+rgBOXlaQ7liKOSveDQ/Rj0YD8Ypgn9fhJHtrtQ3Q 6yn38FmMlklqMsgw72ZSX5jFvHlvZS1pvdj/PhgJJAo48bnn9QLEnH8J3Nw72ndruSPvQ4mjuy9 Uh6unrQZ7ek497YzGGi5GkV+NhrlAqOhUSp+5h1tq7Veq4jAcdwBrMxKekJYzlizwgrnXo0gIax w8JespCD0Zse8fZN4f2TzGg6JChGsjV3pzwWQ2PEbcGG/FH88TcX2qtYU4xrTjc14+n9JOHnWJb tYKdcu6JMpyqoQjVP8BctvEqq3HUZL1RU4thxpmqY+6EZFx0lnU0c7EUDSq7e+hGPnpPYGmBruV 9iCFQ4tt5AcSxaLL/lbszha88i0O5ZFFOXTB4d5HVuHEha9atydSbIfBF+U3+aKS+Wwurg4RKR6 naJgxNYS4TeE8snzY7xF+lFe2YI76vDWExuykycAWUHsnOA2SxDoCOHk/1jG7XUI9VlQhXSRjH2 mD0csCUCzC//A== X-Received: by 2002:a17:90b:2886:b0:3a4:7195:ecbc with SMTP id 98e67ed59e1d1-3ab3a952833mr898293a91.29.1791529139130; Thu, 08 Oct 2026 23:58:59 -0700 (PDT) From: Kaiyang Wu X-Google-Original-From: Kaiyang Wu To: pve-devel@lists.proxmox.com Subject: [PATCH manager v3 3/3] ui: qemu: add pvpanic device support Date: Fri, 9 Oct 2026 14:58:13 +0800 Message-ID: <20261009065813.109006-4-wukaiyang@loongfans.cn> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261009065813.109006-1-wukaiyang@loongfans.cn> References: <20261009065813.109006-1-wukaiyang@loongfans.cn> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy FREEMAIL_ENVFROM_END_DIGIT 1 Envelope-from freemail username ends in digit FREEMAIL_FROM 0.001 Sender email is commonly abused enduser mail provider RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: YCURMEBXRQAU2V6WIRT5XLHSM2JLC532 X-Message-ID-Hash: YCURMEBXRQAU2V6WIRT5XLHSM2JLC532 X-MailFrom: wukaiyang2003@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Kaiyang Wu X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Add basic structure for adding a pvpanic PCI device, allowing to monitor guest system panics through the pvpanic device, and specify panic action to execute when guest system panics. Suggested-by: Dominik Csapak Signed-off-by: Kaiyang Wu --- www/manager6/Makefile | 1 + www/manager6/Utils.js | 18 +++++++++ www/manager6/form/PvpanicSelector.js | 56 ++++++++++++++++++++++++++++ www/manager6/qemu/Options.js | 16 ++++++++ 4 files changed, 91 insertions(+) create mode 100644 www/manager6/form/PvpanicSelector.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index d2ea786b..d3c15c29 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -65,6 +65,7 @@ JSSRC= \ form/PoolSelector.js \ form/PreallocationSelector.js \ form/PrivilegesSelector.js \ + form/PvpanicSelector.js \ form/QemuBiosSelector.js \ form/QemuMachineSelector.js \ form/RecordSearchField.js \ diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js index 8b99371d..8263eea7 100644 --- a/www/manager6/Utils.js +++ b/www/manager6/Utils.js @@ -557,6 +557,24 @@ Ext.define('PVE.Utils', { } }, + render_pvpanic: function (value) { + if (!value) { + return Proxmox.Utils.defaultText + ' (' + Proxmox.Utils.disabledText + ')'; + } + + let pvpanic = PVE.Parser.parsePropertyString(value, 'enabled'); + + if (!PVE.Parser.parseBoolean(pvpanic.enabled)) { + return Proxmox.Utils.disabledText; + } + + if (pvpanic.action) { + return Proxmox.Utils.enabledText + `, Panic Action: ${pvpanic.action}`; + } else { + return Proxmox.Utils.enabledText + ', Panic Action: ' + Proxmox.Utils.defaultText + ' (shutdown)'; + } + }, + render_dc_ha_opts: function (value) { if (!value) { return Proxmox.Utils.defaultText; diff --git a/www/manager6/form/PvpanicSelector.js b/www/manager6/form/PvpanicSelector.js new file mode 100644 index 00000000..eda5795d --- /dev/null +++ b/www/manager6/form/PvpanicSelector.js @@ -0,0 +1,56 @@ +Ext.define('PVE.form.PvpanicSelector', { + extend: 'Proxmox.panel.InputPanel', + alias: 'widget.pvePvpanicSelector', + + viewModel: {}, + + items: [ + { + xtype: 'proxmoxcheckbox', + fieldLabel: gettext('Enable'), + name: 'enabled', + reference: 'enabled', + uncheckedValue: 0, + }, + { + xtype: 'proxmoxKVComboBox', + fieldLabel: gettext('Panic Action'), + name: 'action', + value: '__default__', + comboItems: [ + ['__default__', Proxmox.Utils.defaultText + ' (shutdown)'], + ['none', 'none'], + ['pause', 'pause'], + ['shutdown', 'shutdown'], + ['exit-failure', 'exit-failure'], + ], + bind: { + disabled: '{!enabled.checked}', + }, + }, + ], + + onGetValues: function (values) { + let ret = {}; + + if (values.enabled) { + ret.enabled = 1; + } + if (values.action) { + ret.enabled = values.enabled; + ret.action = values.action; + } + if (Ext.Object.isEmpty(ret)) { + return { delete: 'pvpanic' }; + } + let pvpanic = PVE.Parser.printPropertyString(ret, 'enabled'); + return { pvpanic: pvpanic }; + }, + + setValues: function (values) { + if (values.pvpanic) { + let pvpanic = PVE.Parser.parsePropertyString(values.pvpanic, 'enabled'); + this.callParent([pvpanic]); + } + }, +}); diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js index 8a4721a0..75cdebf9 100644 --- a/www/manager6/qemu/Options.js +++ b/www/manager6/qemu/Options.js @@ -311,6 +311,22 @@ Ext.define('PVE.qemu.Options', { } : undefined, }, + pvpanic: { + header: gettext('Panic Monitor'), + defaultValue: false, + renderer: PVE.Utils.render_pvpanic, + editor: caps.vms['VM.Config.HWType'] + ? { + xtype: 'proxmoxWindowEdit', + subject: gettext('Panic Monitor'), + onlineHelp: 'qm_pvpanic', + items: { + xtype: 'pvePvpanicSelector', + name: 'pvpanic', + }, + } + : undefined, + }, protection: { header: gettext('Protection'), defaultValue: false, -- 2.56.0