fix: block incompatible kernel from being installed
[zfs.git] / rpm / generic / zfs-dkms.spec.in
blob6735c4a67ec521fdf1a1eb26020838007b6fd452
1 %{?!packager: %define packager Brian Behlendorf <behlendorf1@llnl.gov>}
3 %if ! 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler}
4 %define not_rpm 1
5 %endif
7 # Exclude input files from mangling
8 %global __brp_mangle_shebangs_exclude_from ^/usr/src/.*$
10 %define module @PACKAGE@
11 %define mkconf scripts/dkms.mkconf
13 Name: %{module}-dkms
15 Version: @VERSION@
16 Release: @RELEASE@%{?dist}
17 Summary: Kernel module(s) (dkms)
19 Group: System Environment/Kernel
20 License: @ZFS_META_LICENSE@
21 URL: https://github.com/openzfs/zfs
22 Source0: %{module}-%{version}.tar.gz
23 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
24 BuildArch: noarch
26 Requires: dkms >= 2.2.0.3
27 Requires(pre): dkms >= 2.2.0.3
28 Requires(post): dkms >= 2.2.0.3
29 Requires(preun): dkms >= 2.2.0.3
30 Requires: gcc, make, perl, diffutils
31 Requires(post): gcc, make, perl, diffutils
32 %if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler}
33 Requires: kernel-devel >= @ZFS_META_KVER_MIN@, kernel-devel <= @ZFS_META_KVER_MAX@.999
34 Requires(post): kernel-devel >= @ZFS_META_KVER_MIN@, kernel-devel <= @ZFS_META_KVER_MAX@.999
35 Conflicts: kernel-devel < @ZFS_META_KVER_MIN@, kernel-devel > @ZFS_META_KVER_MAX@.999
36 Obsoletes: spl-dkms <= %{version}
37 %endif
38 Provides: %{module}-kmod = %{version}
39 AutoReqProv: no
41 %if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9)
42 # We don't directly use it, but if this isn't installed, rpmbuild as root can
43 # crash+corrupt rpmdb
44 # See issue #12071
45 BuildRequires: ncompress
46 %endif
48 %description
49 This package contains the dkms ZFS kernel modules.
51 %prep
52 %setup -q -n %{module}-%{version}
54 %build
55 %{mkconf} -n %{module} -v %{version} -f dkms.conf
57 %install
58 if [ "$RPM_BUILD_ROOT" != "/" ]; then
59 rm -rf $RPM_BUILD_ROOT
61 mkdir -p $RPM_BUILD_ROOT/usr/src/
62 cp -rf ${RPM_BUILD_DIR}/%{module}-%{version} $RPM_BUILD_ROOT/usr/src/
64 %clean
65 if [ "$RPM_BUILD_ROOT" != "/" ]; then
66 rm -rf $RPM_BUILD_ROOT
69 %files
70 %defattr(-,root,root)
71 /usr/src/%{module}-%{version}
73 %pre
74 echo "Running pre installation script: $0. Parameters: $*"
75 # We don't want any other versions lingering around in dkms.
76 # Tests with 'dnf' showed that in case of reinstall, or upgrade
77 # the preun scriptlet removed the version we are trying to install.
78 # Because of this, find all zfs dkms sources in /var/lib/dkms and
79 # remove them, if we find a matching version in dkms.
81 dkms_root=/var/lib/dkms
82 if [ -d ${dkms_root}/%{module} ]; then
83 cd ${dkms_root}/%{module}
84 for x in [[:digit:]]*; do
85 [ -d "$x" ] || continue
86 otherver="$x"
87 opath="${dkms_root}/%{module}/${otherver}"
88 if [ "$otherver" != %{version} ]; then
89 # This is a workaround for a broken 'dkms status', we caused in a previous version.
90 # One day it might be not needed anymore, but it does not hurt to keep it.
91 if dkms status -m %{module} -v "$otherver" 2>&1 | grep "${opath}/source/dkms.conf does not exist"
92 then
93 echo "ERROR: dkms status is broken!" >&2
94 if [ -L "${opath}/source" -a ! -d "${opath}/source" ]
95 then
96 echo "Trying to fix it by removing the symlink: ${opath}/source" >&2
97 echo "You should manually remove ${opath}" >&2
98 rm -f "${opath}/source" || echo "Removal failed!" >&2
101 if [ `dkms status -m %{module} -v "$otherver" | grep -c %{module}` -gt 0 ]; then
102 echo "Removing old %{module} dkms modules version $otherver from all kernels."
103 dkms remove -m %{module} -v "$otherver" --all ||:
106 done
107 cd ${dkms_root}
110 # Uninstall this version of zfs dkms modules before installation of the package.
111 if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then
112 echo "Removing %{module} dkms modules version %{version} from all kernels."
113 dkms remove -m %{module} -v %{version} --all ||:
116 %post
117 echo "Running post installation script: $0. Parameters: $*"
118 # Add the module to dkms, as reccommended in the dkms man page.
119 # This is generally rpm specfic.
120 # But this also may help, if we have a broken 'dkms status'.
121 # Because, if the sources are available and only the symlink pointing
122 # to them is missing, this will resolve the situation
123 echo "Adding %{module} dkms modules version %{version} to dkms."
124 dkms add -m %{module} -v %{version} %{!?not_rpm:--rpm_safe_upgrade} ||:
126 # After installing the package, dkms install this zfs version for the current kernel.
127 # Force the overwriting of old modules to avoid diff warnings in dkms status.
128 # Or in case of a downgrade to overwrite newer versions.
129 # Or if some other backed up versions have been restored before.
130 echo "Installing %{module} dkms modules version %{version} for the current kernel."
131 dkms install --force -m %{module} -v %{version} ||:
133 %preun
134 dkms_root="/var/lib/dkms/%{module}/%{version}"
135 echo "Running pre uninstall script: $0. Parameters: $*"
136 # In case of upgrade we do nothing. See above comment in pre hook.
137 if [ "$1" = "1" -o "$1" = "upgrade" ] ; then
138 echo "This is an upgrade. Skipping pre uninstall action."
139 exit 0
142 # Check if we uninstall the package. In that case remove the dkms modules.
143 # '0' is the value for the first parameter for rpm packages.
144 # 'remove' or 'purge' are the possible names for deb packages.
145 if [ "$1" = "0" -o "$1" = "remove" -o "$1" = "purge" ] ; then
146 if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then
147 echo "Removing %{module} dkms modules version %{version} from all kernels."
148 dkms remove -m %{module} -v %{version} --all %{!?not_rpm:--rpm_safe_upgrade} && exit 0
150 # If removing the modules failed, it might be because of the broken 'dkms status'.
151 if dkms status -m %{module} -v %{version} 2>&1 | grep "${dkms_root}/source/dkms.conf does not exist"
152 then
153 echo "ERROR: dkms status is broken!" >&2
154 echo "You should manually remove ${dkms_root}" >&2
155 echo "WARNING: installed modules in /lib/modules/`uname -r`/extra could not be removed automatically!" >&2
157 else
158 echo "Script parameter $1 did not match any removal condition."
161 exit 0