一、说明
1.1 背景
在上一篇文章《OpenEuler 22.03 安装 snmptt 1.5》中介绍了手工安装snmptt的方法,可以看出过程非常简单,由于是perl脚本,连源代码编译都不涉及,基本上只涉及文件的操作,并且依赖的包也不多。
事实上只需要一个bash脚本就可以完成snmptt的安装,不过rpm包可能是更符合用户习惯的办法。在更早的文章《使用rpmbuild将源代码制成rpm包》中介绍了rpmbuild的使用,本文将介绍如何将snmptt源代码制作成rpm包。
1.2 环境
- 操作系统:OpenEuler 22.03
- snmptt:1.5
二、创建
2.1 准备源代码压缩包
首先从Github主页下载snmptt的源代码压缩包snmptt_1.5.tgz,压缩包中包含了全量perl脚本工具。按照rpmbuild的习惯,需要先解压压缩包,对文件夹改名后重新压缩。
tar -zxf snmptt_1.5.tgz
cp -r snmptt_1.5 snmptt-1.5
tar -zcf snmptt-1.5.tar.gz snmptt-1.5/
2.2 准备rpmbuild目录
由于snmptt的安装过程中涉及创建用户和不少系统文件操作,因此需要root权限。在root用户下使用rpmdev-setuptree命令,创建/root/rpmbuild目录,将源代码压缩包放入SOURCES目录下
mv snmptt-1.5.tar.gz ~/rpmbuild/SOURCES/
2.3 编辑spec文件
编辑SPECS/snmptt.spec
Name: snmptt
Version: 1.5
Release: 1%{?dist}
Summary: SNMPTT (SNMP Trap Translator) is an SNMP trap handler written in Perl for use with the Net-SNMP / UCD-SNMP snmptrapd program
License: GPLv3+
Source0: %{name}-%{version}.tar.gz
BuildRequires: net-snmp, perl-Config-IniFiles, perl-Net-IP, perl-Text-ParseWords, perl-Time-HiRes, perl-Text-Balanced
%description
SNMPTT (SNMP Trap Translator) is an SNMP trap handler written in Perl for use with the Net-SNMP / UCD-SNMP snmptrapd program
%prep
%setup -q
%build
%install
%__mkdir_p $RPM_BUILD_ROOT/%{_sbindir}
%__install -m 0755 %{name} $RPM_BUILD_ROOT/%{_sbindir}/
%__mkdir_p $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}
%__chown -R %{name}:%{name} $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}
%__chmod 755 $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}
%__install -m 0644 %{name}.ini $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/
%__install -m 0644 examples/%{name}.conf.generic $RPM_BUILD_ROOT/%{_sysconfdir}/%{name}/%{name}.conf
%__mkdir_p $RPM_BUILD_ROOT/%{_localstatedir}/log/%{name}
%__chown -R %{name}:%{name} $RPM_BUILD_ROOT/%{_localstatedir}/log/%{name}
%__chmod -R 750 $RPM_BUILD_ROOT/%{_localstatedir}/log/%{name}
%__mkdir_p $RPM_BUILD_ROOT/%{_localstatedir}/spool/%{name}
%__chown -R %{name}:%{name} $RPM_BUILD_ROOT/%{_localstatedir}/spool/%{name}
%__chmod -R 750 $RPM_BUILD_ROOT/%{_localstatedir}/spool/%{name}
%__mkdir_p $RPM_BUILD_ROOT/%{_unitdir}
%__install -m 0644 %{name}.service $RPM_BUILD_ROOT/%{_unitdir}/
%__mkdir_p $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/
%__install -m 0644 %{name}.logrotate $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/%{name}
%__install -m 0755 snmptthandler $RPM_BUILD_ROOT/%{_sbindir}/snmptthandler
%pre
adduser -r %{name} > /dev/null 2>&1 || :
%files
%attr(0755, %{name}, %{name}) %{_sbindir}/%{name}
%attr(0755, %{name}, %{name}) %{_sbindir}/snmptthandler
%attr(0644, %{name}, %{name}) %{_sysconfdir}/%{name}/%{name}.ini
%attr(0644, %{name}, %{name}) %{_sysconfdir}/%{name}/%{name}.conf
%attr(0644, %{name}, %{name}) %{_unitdir}/%{name}.service
%attr(0644, %{name}, %{name}) %{_sysconfdir}/logrotate.d/%{name}
%attr(0750, %{name}, %{name}) %{_localstatedir}/spool/%{name}
%attr(0750, %{name}, %{name}) %{_localstatedir}/log/%{name}
%post
systemctl daemon-reload
%preun
if [ $1 -eq 0 ]; then
systemctl stop snmptt > /dev/null 2>&1 || :
systemctl disable snmptt > /dev/null 2>&1 || :
fi
%postun
if [ $1 -eq 0 ]; then
userdel snmptt > /dev/null 2>&1 || :
fi
2.4 创建
至此可以使用rpmbuild命令进行rpm包的创建,但是如果直接运行会报错空 %files 文件 /root/rpmbuild/BUILD/snmptt-1.5/debugfiles.list
网络上提供了两种方案解决:
rpmbuild -bb SPECS/snmptt.spec --nodebuginfoecho "%debug_package %{nil}" >> /usr/lib/rpm/macros
我使用了第一种方法解决。
三、测试
创建完成后使用rpm -ivh命令进行安装。
可以按照上一篇文章《OpenEuler 22.03 安装 snmptt 1.5》的方案进行测试。
注意由于snmptt会写入文件,为了方便,可以直接关闭selinux:setenforce 0。
- 修改snmptrapd.conf、snmptrapd.service、snmptrapd.service、snmptt.conf文件
- 启动snmptrapd和snmptt服务
- 应用snmptrap命令发送测试报文,检查/var/log/snmptt/snmptt.log日志是否生成并且内容正确。
如果测试正确,可以再使用rpm -e命令卸载,检查有无卸载干净。
四、笔记
snmptt安装过程中进行的创建文件操作,对应手工删除命令如下:
rm -f /usr/sbin/snmptt
rm -f /usr/sbin/snmptthandler
rm -rf /etc/snmptt/
rm -rf /var/log/snmptt/
rm -rf /var/spool/snmptt/
rm -f /usr/lib/systemd/system/snmptt.service
rm -f /etc/logrotate.d/snmptt
userdel snmptt