惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
WordPress大学
WordPress大学
小众软件
小众软件
IT之家
IT之家
腾讯CDC
月光博客
月光博客
量子位
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

LanYunのBlog

优化macOS Dock栏的显示与隐藏 解决macOS全屏模式下某些情况显示原始鼠标指针的问题 Yarn从Classic迁移到Modern nginx自编译 用santa对二进制进行监控和授权 ESXI 8.0安装黑群晖DSM 7.x openwrt编译过程记录 编译monero For macOS ARM 自建busuanzi不蒜子平台统计平台 浅记博客更新日志 (机翻)Kubo配置文件 修改brew services中服务的启动参数 技术杂记📝 解决Surge模块不能同步问题 为Arch Linux配置邮件服务 解决ESXI和群晖使用SSH密钥登录问题 为J4125软路由ESXI中群晖提供UPS服务 在arch linux上搭建rustdesk server 解决虚拟机扩容中GPT PMBR大小不符问题 搭建Tuic V5 优雅地为macOS提供python多版本的支持 修复root路径下文件权限问题 解决macOS 14上利用Whisky运行steam时有关问题 在macOS中用PhpStorm配置Xdebug调试 利用CloudFlare Workers快速自建一个IP获取器 如何自动续期证书? 从0开始速配VPS用于网站等 搭建一个基于ChatGPT的QQ机器人(Yunzai-Bot) For Mac 010 Editor For Mac 13.0.1 Crack 破解 关于部署Cloudflare Zero Trust遇到的问题浅记录📝
自编译NutClient-ESXI,更改邮件逻辑
LanYun · 2023-07-25 · via LanYunのBlog

前言

这个 NutClient-ESXi 项目中邮件发送相关功能对我而言不可用,故打算自己对项目进行修改,然后编译.

目前修改后的效果: 若有UPS事件,能够正常地向指定邮箱发送通知及事件内容.

注: 本文是为本博客中 为 J4125 软路由 ESXI 中群晖提供 UPS 服务 的文章服务的.故不会详细解释NutClient-ESXI相关内容.

本文中邮件发送操作是通过SSH到服务器来进行代理操作的,请确保ESXI中存在linux虚拟机或你有台linux服务器.

若你遇到ESXI SSH某些问题,请参阅本博客中关于 解决 ESXI 和群晖使用 SSH 密钥登录问题 的文章.

若你服务器未配置相关邮件相关服务,请参阅本博客中关于 为 Arch Linux 配置邮件服务 的文章.

本文编译设备: Linux LanYunArch 6.4.4-arch1-1 x86_64 GNU/Linux

因为glibc编译失败,所以拉取的是docker centos7

文本内容可能花费时间较长(取决于你设备性能,单线程编译取决于单核性能),建议可以泡杯咖啡☕️来等待.

本文会编译旧版GCC和MAKE用于编译glibc-2.17,因为ESXI最高只支持glibc-2.17(比较老,故作者推荐centos7进行编译)

如何查看GLIBC支持的版本? linux:strings /lib64/libc.so.6 | grep GLIBC_

由于ESXI不支持strins命令,故你需要SFTP拉到本地来看看👀.

⚠️若你ESXI运行在架构为x86_64的CPU上,请勿用ARM架构进行编译,

极速模式(推荐)

人群能力建议: 有手有🧠,会Google等基本素质

难度: 无

前提: 已阅读前言中提到的所有文章

此模式用到: docker

用到本人fork的项目: NutClient-ESXi

1
2
3
4
5
6
7
8
9
10


docker run -i -t --privileged -v /Users/lanyun/Downloads:/share --platform linux/amd64 centos:7 bash
su
cd ~
yum install -y git
git clone https://github.com/LanYunDev/NutClient-ESXi.git
cd NutClient-ESXi
bash ./一键编译.sh

注: 你甚至只需要运行一个一键编译.sh文件,即可完成编译.

低速模式

人群能力建议: 会复制粘贴

难度: 低

安装软件包

请根据不同的系统的软件包管理器来安装必须的软件包.

1
2
3
apt install wget patch gcc zip make tar file git 
yum install -y wget patch gcc zip make tar file git
pacman -S wget patch gcc zip make tar file git

修改项目内容

请确定你要远程SSH进行执行的代码.

例如ssh -T root@IP地址 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22 "mail -s 'UPS 事件 on ${HOSTNAME}' xx@lanyundev.com"

1
2
3
4
5
6
7
8
9
10
11
git clone https://github.com/rgc2000/NutClient-ESXi.git 
cd NutClient-ESXi
sed -i -e "s/payload: nut-bin smtptools-bin/payload: nut-bin/g;s/shell uname -i/shell uname -m/g; /smtp/s/^[^#]/#&/" "Makefile"
sed -i -e "s#tar -xf nut-\$(NUT_VERSION).tar.gz#&\
; sed -i -e \"s/on line power/已连接电源/g;s/UPS %s on battery/UPS %s 正使用电池供电/g;s/UPS %s battery is low/UPS %s 电池电量低/g;s/UPS %s: forced shutdown in progress/UPS %s: 正在进行强制关机/g;s/Communications with UPS %s established/已建立与 UPS %s 的通信/g;s/Communications with UPS %s lost/与 UPS %s 的通信丢失/g;s/Auto logout and shutdown proceeding/自动注销并进行关机/g;s/UPS %s battery needs to be replaced/UPS %s 需要更换电池/g;s/UPS %s is unavailable/UPS %s 不可用/g;s/upsmon parent process died - shutdown impossible/upsmon 父进程已停止 - 无法进行关机/g;s/UPS %s: calibration in progress/UPS %s:正在进行校准/g\" \"./nut-\$(NUT_VERSION)/clients/upsmon.h\"#" 'Makefile'
rm -rf ./patches/smtptools*




[[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#ssh -T root@IP地址 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22 "mail -s '\''UPS 事件 on ${HOSTNAME}'\'' xx@lanyundev.com"#' "./skeleton/opt/nut/bin/notify.sh" || sed -i -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#ssh -T root@IP地址 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 22 "mail -s '\''UPS 事件 on ${HOSTNAME}'\'' xx@lanyundev.com"#' "./skeleton/opt/nut/bin/notify.sh"

配置编译环境

Docker(推荐)

推荐用docker,因为我用最新arch Linux整编译环境,搞了几天都没整起(大部分在摸鱼,等编译结果,报错再改,改了报错又改,进入了无底洞的时间循环♻️).

废话不多说,直接上命令.

1
2
3


docker run -i -t --privileged -v /Users/lanyun/Downloads:/share --platform linux/amd64 centos:7 bash

最新Linux(不推荐)

这里不写,看复杂模式.

开始编译

1
make 

编译完成后,目录下的 upsmon-xxx.vib upsmon-update.sh upsmon-remove.sh upsmon-install.sh 就是我们所需要的文件了!

复杂模式(不推荐)

人群能力建议: 极客

难度: 中

编译GCC-9

由于arch Linux(默认make版本为4.4.1 gcc版本为13.1.1)的yay里面有GCC-9,故我直接用yay编译,方便.

1
2
3
4
5
6
7
8
9
10
11
12
pacman -S base-devel
su - lanyun
cd ~
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
echo $(nproc)
vim /etc/makepkg.conf
yay -Ss gcc
yay -S gcc9
sudo su

编译MAKE-3.82

只能源码编译,别问,问就是特性.

如果编译出错,别问,问就是特性.

1
2
3
4
5
6
7
8
9
10
11
12
13

export CC=/usr/bin/gcc-9
wget ftp://ftp.gnu.org/gnu/make/make-3.82.tar.gz
tar xvf make-3.82.tar.gz && rm make-3.82.tar.gz
cd make-3.82
sed -i 's/#if !defined __alloca \&\& !defined __GNU_LIBRARY__/#if !defined __alloca \&\& defined __GNU_LIBRARY__/g; s/#ifndef __GNU_LIBRARY__/#ifdef __GNU_LIBRARY__/g' "./glob/glob.c"
./configure --prefix=/opt/make-3.82 && sh build.sh
make -j$(nproc) && make install
cd ~
ln /opt/make-3.82/bin/make /usr/bin/make-3.82
rm -rf make-3.82


指定编译的GLIBC

如果编译出错,别问,问就是特性.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

export CC=/usr/bin/gcc-9


export PATH=/opt/make-3.82/bin:$PATH
export MAKE=/opt/make-3.82/bin/make

cd ~
wget https://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.xz
tar -xJf glibc-2.17.tar.xz && rm -f glibc-2.17.tar.xz

mkdir -p build/glibc-build
cd build/glibc-build

/root/glibc-2.17/configure CFLAGS="-fno-builtin-strlen -ggdb -O2" FEATURES="preserve-libs nostrip splitdebug" --prefix=/root/build/glibc-build

make



本文中有关文件链接:

make-3.82.tar.gz glibc-2.17.tar.xz

废弃代码(不再使用),垃圾代码,慎用(=别用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sed -i -e "s/payload: nut-bin smtptools-bin/payload: nut-bin/g;s/shell uname -i/shell uname -m/g; /smtp/s/^[^#]/#&/; s/LDFLAGS=\"-lrt -lpthread\"/LDFLAGS=\"-lrt -lpthread -static-libstdc++\"/" "Makefile"
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e "s/uname -i/uname -m/g" "./script/mkvib.sh" || sed -i -e "s/uname -i/uname -m/g" "./script/mkvib.sh"
echo "添加-static-libstdc++选项"
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#替换我#' "./skeleton/opt/nut/bin/notify.sh" || sed -i -e 's#/opt/nut/bin/smtpblast -f "${FROM}" -t "${TO}"#替换我#' "./skeleton/opt/nut/bin/notify.sh"
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e "s/on line power/已连接电源/g;" "./$nut_version/clients/upsmon.h" ||
[[ "$(uname)" == "Darwin" ]] && sed -i '' -e "s/payload: nut-bin smtptools-bin/payload: nut-bin/g;s/shell uname -i/shell uname -m/g; /smtp/s/^[^#]/#&/" "Makefile" ||
nut_version=$(basename patches/nut-* | sed 's/-esxi.*$//')
sed -i -e "$(grep -n "tar -xf nut-\$(NUT_VERSION).tar.gz" "Makefile" | cut -d ':' -f 1)a\\
sed -i -e \"s/on line power/已连接电源/g;s/UPS %s on battery/UPS %s 正使用电池供电/g;s/UPS %s battery is low/UPS %s 电池电量低/g;s/UPS %s: forced shutdown in progress/UPS %s: 正在进行强制关机/g;s/Communications with UPS %s established/已建立与 UPS %s 的通信/g;s/Communications with UPS %s lost/与 UPS %s 的通信丢失/g;s/Auto logout and shutdown proceeding/自动注销并进行关机/g;s/UPS %s battery needs to be replaced/UPS %s 需要更换电池/g;s/UPS %s is unavailable/UPS %s 不可用/g;s/upsmon parent process died - shutdown impossible/upsmon 父进程已停止 - 无法进行关机/g;s/UPS %s: calibration in progress/UPS %s:正在进行校准/g\" \"./\$(NUT_VERSION)/clients/upsmon.h\"" 'Makefile'






export CFLAGS="-g -O2 -march=i486"
echo "跳过MAKE检测" && [[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's/critic_missing="\$critic_missing make"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure" || sed -i -e 's/critic_missing="\$critic_missing make"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure"
echo "跳过GCC检测" && [[ "$(uname)" == "Darwin" ]] && sed -i '' -e 's/critic_missing="\$critic_missing gcc"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure" || sed -i -e 's/critic_missing="\$critic_missing gcc"/ac_prog_version="\$ac_prog_version, ok"; ac_verc_fail=no;/g' "./glibc-2.17/configure"

CFLAGS="-g -O2 -fno-builtin-strlen" FEATURES="preserve-libs nostrip splitdebug" --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu
make CFLAGS="-m64" LDFLAGS="-m64"