sed -i_orig "s/data.status === 'Active'/true/g" /usr/share/pve-manager/js/pvemanagerlib.js
sed -i_orig "s/if (res === null || res === undefined || \!res || res/if(/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
sed -i_orig "s/.data.status.toLowerCase() !== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy

清除浏览器缓存,刷新页面

方法一:修改订阅状态检测逻辑

这是笔者自行探索总结出来的方法。

  • 原理:通过修改订阅状态检测的条件判断,将严格不等于!==改为严格等于===,本质上仅替换一个字符。当系统检测订阅状态时,原本需要状态为"active"才不显示警告,修改后只要状态不是"active"就不会触发警告弹窗,从而实现屏蔽了未订阅提示。

  • 优缺点:完美适配PVE 9.x版本,不会导致PVE的WEB后台「软件包版本」按钮无法响应。

  • 适用PVE版本范围:经测试PVE 8.x和PVE 9.x版本有效,理论上兼容PVE 7.x及以前版本。

cp /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak

line_num=$(grep -n "res.data.status.toLowerCase() !== 'active'" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js | head -1 | cut -d: -f1)
sed -i "${line_num}s/!==/===/" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

systemctl restart pveproxy

方法二:禁用弹窗显示函数

该方法是从Github上PVE-Tools-9项目中找到的。

  • 原理:通过将Ext.Msg.show函数调用替换为void表达式,使弹窗显示函数失效。void操作符会计算表达式但返回undefined,从而阻止了弹窗的实际显示。

  • 优缺点:不能完美适配PVE 9.x版本,导致PVE的WEB后台「软件包版本」按钮无法响应。

  • 适用PVE版本范围:理论上兼容所有版本。

cp /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak

sed -Ezi "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

systemctl restart pveproxy

方法三:重写条件判断表达式

这是网络上流传最广的方法,绝大部分教程都是基于此方法。

  • 原理:彻底重写订阅检测的条件判断逻辑,将复杂的条件检查替换为简单的false值。通过两个sed命令分别处理条件语句的起始部分和状态检测部分,使整个条件判断永远返回false,从而跳过弹窗显示代码。

  • 优缺点:同方法二,不能完美适配PVE 9.x版本,会导致「软件包版本」按钮无法响应。

  • 适用PVE版本范围:理论上兼容所有版本。

cp /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak

sed -i "s/if (res === null || res === undefined || \!res || res/if(/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
sed -i "s/.data.status.toLowerCase() !== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

systemctl restart pveproxy

后记

上述三种方法同样适用于屏蔽PBS备份系统的无有效订阅提示弹窗,即Proxmox Backup Server,修改文件操作完成之后重启PBS代理服务即可。

此外,对于PBS系统来说,这三种方法均能正确实现屏蔽作用,无其他影响。

systemctl restart proxmox-backup-proxy

参考文献

[1] PVE-Tools[EB/OL]. https://github.com/Mapleawaa/PVE-Tools-9/blob/main/PVE-Tools.sh.