Skip to content

Instantly share code, notes, and snippets.

@Potat0000
Last active February 4, 2024 05:33
Show Gist options
  • Save Potat0000/1e0c6095b6011fff6aab5ccf1eea57c1 to your computer and use it in GitHub Desktop.
Save Potat0000/1e0c6095b6011fff6aab5ccf1eea57c1 to your computer and use it in GitHub Desktop.
A script to modify pve-manager
#!/usr/bin/env bash
# shellcheck disable=SC2016
# 脚本功能:
# 1. 修改 LXC 源为清华源
# 2. 在面板中显示 CPU 温度和频率
# 3. 去除数据中心概要和节点概要中的订阅状态显示
# 4. 去除无订阅弹窗
# 适配版本:
# 在 PVE 7.4、8.0、8.1 上测试通过
# 理论上适用于所有 Proxmox VE 7、8
# 使用方法:
# 以 root 身份运行即可,运行后刷新浏览器缓存检查效果
# 每次 pve-manager 更新后需重新运行一次脚本
aplinfo="/usr/share/perl5/PVE/APLInfo.pm"
np="/usr/share/perl5/PVE/API2/Nodes.pm"
pvejs="/usr/share/pve-manager/js/pvemanagerlib.js"
plib="/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js"
if ! command -v sensors >/dev/null 2>&1; then
echo 安装 lm-sensors
apt update && apt install -y lm-sensors
fi
pvever=$(pveversion | awk -F "/" '{print $2}')
echo "PVE 版本: $pvever"
echo 备份源文件
if [ ! -e "$np.$pvever.bak" ]; then cp $np "$np.$pvever.bak"; else cp "$np.$pvever.bak" $np; fi
if [ ! -e "$aplinfo.$pvever.bak" ]; then cp $aplinfo "$aplinfo.$pvever.bak"; else cp "$aplinfo.$pvever.bak" $aplinfo; fi
if [ ! -e "$plib.$pvever.bak" ]; then cp $plib "$plib.$pvever.bak"; else cp "$plib.$pvever.bak" $plib; fi
if [ ! -e "$pvejs.$pvever.bak" ]; then cp $pvejs "$pvejs.$pvever.bak"; else cp "$pvejs.$pvever.bak" $pvejs; fi
echo "修改 $(basename $aplinfo)"
echo " - 修改 LXC 源"
sed -i 's|http://download.proxmox.com|https://mirrors.bfsu.edu.cn/proxmox|g' $aplinfo
echo "修改 $(basename $np)"
echo " - 添加数据源"
therm='$res->{thermalstate} = `sensors`;'
cpure='$res->{cpure} = `cat /proc/cpuinfo | grep -i "cpu mhz"`;'
sed -i "/PVE::pvecfg::version_text()/a \ $cpure\n\ $therm" $np
echo "修改 $(basename $pvejs)"
echo " - 添加 CPU 温度和频率展示项"
tmpf=tmpfile.temp
cat >$tmpf <<'EOF'
{
itemId: 'thermal',
colspan: 2,
printBar: false,
title: gettext('温度'),
textField: 'thermalstate',
renderer: value => {
const v = value.trim().split(/\n{2,}(?=[A-z]+[-_])/).map(v => {
let name = v.match(/^[^-]+/)[0] + ': ';
let tempure = v.match(/(?<=:\s+\+)(?:\d+(?:\.\d*[1-9])?)|N\/A/g);
if (tempure[0] == 'N/A') {
return '';
} else {
tempure = tempure.map(v => v + '°C');
}
if (/coretemp/i.test(name)) {
name = 'CPU: ';
tempure = tempure[0] + ' (' + tempure.slice(1).join(', ') + ')';
} else if (/nvme/i.test(name)) {
name = 'NVME: ';
tempure = tempure[0];
} else if (/iwlwifi/i.test(name)) {
name = 'WiFiCard: ';
tempure = tempure[0];
} else {
tempure = tempure[0];
}
return name + tempure;
}).filter(v => v !== '');
return v.sort().join(' | ');
}
},
{
itemId: 'cpumhz',
colspan: 2,
printBar: false,
title: gettext('CPU频率'),
textField: 'cpure',
renderer: value => {
const v = value.match(/(?<=:\s+)\d+/g);
return v.map(e => e + 'MHz').join(' | ');
}
},
EOF
ln=$(sed -n '/pveversion/,+10{/},/{=;q}}' $pvejs)
sed -i "${ln}r $tmpf" $pvejs
rm $tmpf
echo " - 去除数据中心概要和节点概要中的订阅状态显示"
ln=$(sed -n '/Load average/,+10{/},/{=;q}}' $pvejs)
sed -i "$((ln + 1)),$((ln + 5))d" $pvejs
ln1=$(sed -n '/pmxNodeInfoRepoStatus/{=;q}' $pvejs)
ln2=$(sed -n '/pmxNodeInfoRepoStatus/,+10{/})/{=;q}}' $pvejs)
sed -i "$((ln1 - 2)),${ln2}d" $pvejs
ln1=$(sed -n "/title: gettext('Subscriptions')/{=;q}" $pvejs)
ln2=$(sed -n "/title: gettext('Subscriptions')/,+20{/],/{=;q}}" $pvejs)
sed -i "$((ln1 - 1)),$((ln2 + 1))d" $pvejs
echo "修改 $(basename $plib)"
ln=$(sed -n '{N; /\s*if (.*data\.status.*) {/{=;q} ; D}' $plib)
if [ -z "$ln" ]; then
echo " - 无需去除弹窗"
else
echo " - 去除弹窗"
sed -i -r "$((ln - 1)) s/^(\s+).*$/\1if (false) {/" $plib
sed -i "$ln d" $plib
fi
echo -n "重启服务..."
systemctl restart pveproxy
echo " Done"
echo "请使用 Shift+F5 刷新浏览器缓存查看效果"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment