前言这个 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-ESXibash ./一键编译.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-ESXised -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(不推荐)这里不写,看复杂模式.
开始编译编译完成后,目录下的 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 yaymakepkg -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-9wget 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.82sed -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.82rm -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-9export 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-buildcd 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"