%global codepath kmesh
Name:          Kmesh
Version:       0.4.1
Release:       5
Summary:       %{name} is a eBPF-based service mesh kernel solution
License:       ASL 2.0 and GPL-2.0
URL:           https://github.com/kmesh-net
Source0:       https://github.com/kmesh-net/kmesh/archive/refs/tags/v%{version}.tar.gz

BuildRequires: cmake make pkgconf dracut
BuildRequires: protobuf protobuf-c protobuf-c-devel
BuildRequires: golang >= 1.21.4
BuildRequires: clang >= 10.0.1 llvm >= 10.0.1
BuildRequires: libbpf-devel kernel-devel >= 5.10
BuildRequires: libboundscheck
BuildRequires: uname-build-checks

Requires: bpftool
Requires: libbpf
Requires: libboundscheck

Patch0001:    Downgrade-go-version-to-v1.21.4.patch
Patch0002:    Remove-useless-tag-in-Makefile.patch
Patch0003:    Support-uid-gid.patch
Patch0004:    fix-oncn-mda-don-t-support-use-ipv6-family-in-sockop.patch
Patch0005:    remove-libboundscheck-dependency.patch
Patch0006:    The-FN-get_netns_cookie-in-the-6.x-kernel-is-changed.patch
Patch0007:    add-sockmap-dump-function.patch
Patch0008:    Remove-cgroup-connect6-ebpf-prog.patch

%description
%{name} is a eBPF-based service mesh kernel solution.

ExclusiveArch: x86_64 aarch64

%prep
%autosetup -n %{codepath}-%{version} -p1

%build
cd %{_builddir}/%{codepath}-%{version}
export GOPROXY=https://repo.huaweicloud.com/repository/goproxy/
export GONOSUMDB=*
export GO111MODULE=on
go mod tidy
./build.sh -b

%install
mkdir -p %{buildroot}%{_bindir}
install %{_builddir}/%{codepath}-%{version}/kmesh-daemon %{buildroot}%{_bindir}
install -Dpm 0600 %{_builddir}/%{codepath}-%{version}/kmesh-cni %{buildroot}%{_bindir}
install %{_builddir}/%{codepath}-%{version}/build/kmesh-start-pre.sh %{buildroot}%{_bindir}
install %{_builddir}/%{codepath}-%{version}/build/kmesh-stop-post.sh %{buildroot}%{_bindir}
install %{_builddir}/%{codepath}-%{version}/oncn-mda/deploy/mdacore %{buildroot}%{_bindir}

mkdir -p %{buildroot}%{_datarootdir}/oncn-mda
install -Dpm 0600 %{_builddir}/%{codepath}-%{version}/oncn-mda/build/ebpf_src/CMakeFiles/sock_ops.dir/sock_ops.c.o %{buildroot}%{_datarootdir}/oncn-mda
install -Dpm 0600 %{_builddir}/%{codepath}-%{version}/oncn-mda/build/ebpf_src/CMakeFiles/sock_redirect.dir/sock_redirect.c.o %{buildroot}%{_datarootdir}/oncn-mda

mkdir -p %{buildroot}/kmesh
install %{_builddir}/%{codepath}-%{version}/build/docker/start_kmesh.sh %{buildroot}/kmesh

mkdir -p %{buildroot}/usr/lib64
install %{_builddir}/%{codepath}-%{version}/bpf/deserialization_to_bpf_map/libkmesh_deserial.so %{buildroot}/usr/lib64
install %{_builddir}/%{codepath}-%{version}/api/v2-c/libkmesh_api_v2_c.so %{buildroot}/usr/lib64

mkdir -p %{buildroot}/lib/modules/kmesh
if [ -f "%{_builddir}/%{codepath}-%{version}/kernel/ko/kmesh.ko" ]; then
	install %{_builddir}/%{codepath}-%{version}/kernel/ko/kmesh.ko %{buildroot}/lib/modules/kmesh
fi

mkdir -p %{buildroot}/%{_sysconfdir}/oncn-mda
install %{_builddir}/%{codepath}-%{version}/oncn-mda/etc/oncn-mda.conf %{buildroot}/%{_sysconfdir}/oncn-mda/

mkdir -p %{buildroot}/usr/lib/systemd/system
install %{_builddir}/%{codepath}-%{version}/build/kmesh.service %{buildroot}/usr/lib/systemd/system

%check
cd %{_builddir}/%{codepath}-%{version}
#make
#make test

%post
echo "installing ..."
if [ -f "/lib/modules/kmesh/kmesh.ko" ]; then
	ln -sf /lib/modules/kmesh/kmesh.ko /lib/modules/`uname -r`
	depmod -a
fi

%preun
if [ "$1" == "1" ]; then
    systemctl status kmesh | grep "active (running)"
    if [ "$?" == "0" ]; then
        systemctl restart kmesh.service
    fi
else
    systemctl stop kmesh.service
fi

%postun
if [ "$1" -ne "1" ]; then
    rm -rf /lib/modules/`uname -r`/kmesh.ko
fi
depmod -a

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root)
%attr(0500,root,root) %{_bindir}/kmesh-daemon
%attr(0500,root,root) %{_bindir}/kmesh-cni
%attr(0500,root,root) %{_bindir}/mdacore

%attr(0500,root,root) /usr/lib64/libkmesh_deserial.so
%attr(0500,root,root) /usr/lib64/libkmesh_api_v2_c.so

%attr(0500,root,root) %dir /usr/share/oncn-mda
%attr(0500,root,root) /usr/share/oncn-mda/sock_ops.c.o
%attr(0500,root,root) /usr/share/oncn-mda/sock_redirect.c.o

%attr(0700,root,root) %dir %{_sysconfdir}/oncn-mda
%config(noreplace) %attr(0600,root,root) %{_sysconfdir}/oncn-mda/oncn-mda.conf
%config(noreplace) %attr(0600,root,root) /usr/lib/systemd/system/kmesh.service
%attr(0500,root,root) /usr/bin/kmesh-start-pre.sh
%attr(0500,root,root) /usr/bin/kmesh-stop-post.sh
%attr(0500,root,root) /kmesh/start_kmesh.sh

%changelog
* Wed Aug 26 2026 weli-l<1289113577@qq.com> - 0.4.1-5
- modify  ebpf prog permissions

* Fri Dec 12 2025 weli-l<1289113577@qq.com> - 0.4.1-4
- remove cgroup/connect6 ebpf prog

* Fri Mar 21 2025 weli-l<1289113577@qq.com> - 0.4.1-3
- 1. fix oncn-mda don't support ipv4 mapped ipv6
  2. remove libboundscheck dependence 

* Tue Dec 17 2024 weli-l<1289113577@qq.com> - 0.4.1-2
- modify ebpf prog permissions

* Mon Sep 02 2024 weli-l<1289113577@qq.com> - 0.4.1-1
- init Kmesh 0.4.1

* Fri Aug 18 2023 JofDiamonds <kwb0523@163.com> - 0.3.0-3
- update spec

* Thu Aug 17 2023 JofDiamonds <kwb0523@163.com> - 0.3.0-2
- update package

* Mon Jul 31 2023 JofDiamonds <kwb0523@163.com> - 0.3.0-1
- init package