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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

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"