Import Upstream version 3.0.11

This commit is contained in:
luoyaoming 2024-04-24 09:47:14 +08:00
parent c7283898d4
commit bf1a96b61c
85 changed files with 2165 additions and 1754 deletions

View File

@ -1,6 +1,11 @@
name: Run tests
on: [push, pull_request]
on:
# Build at 23:00 every Sunday
schedule:
- cron: "0 23 * * 1"
pull_request:
push:
jobs:
test-distributions:
@ -8,26 +13,20 @@ jobs:
strategy:
matrix:
distro:
- {name: "alpine", tag: "3.14", variant: "-lts"}
- {name: "alpine", tag: "3.14", variant: "-virt"}
- {name: "alpine", tag: "3.13", variant: "-lts"}
- {name: "alpine", tag: "3.13", variant: "-virt"}
- {name: "alpine", tag: "3.12", variant: "-lts"}
- {name: "alpine", tag: "3.12", variant: "-virt"}
- {name: "alpine", tag: "3.11", variant: "-lts"}
- {name: "alpine", tag: "3.11", variant: "-virt"}
- {name: "alpine", tag: "3.10", variant: "-vanilla"}
- {name: "alpine", tag: "3.10", variant: "-virt"}
- {name: "alpine", tag: "3.17", variant: "-lts"}
- {name: "alpine", tag: "3.17", variant: "-virt"}
- {name: "alpine", tag: "3.16", variant: "-lts"}
- {name: "alpine", tag: "3.16", variant: "-virt"}
- {name: "alpine", tag: "3.15", variant: "-lts"}
- {name: "alpine", tag: "3.15", variant: "-virt"}
- {name: "archlinux", tag: "latest"}
- {name: "archlinux", tag: "latest", variant: "-lts"}
- {name: "archlinux", tag: "latest", variant: "-zen"}
- {name: "centos", tag: "7"}
- {name: "almalinux", tag: "8"}
- {name: "almalinux", tag: "9"}
- {name: "almalinux", tag: "8"}
- {name: "debian", tag: "11"}
- {name: "debian", tag: "10"}
- {name: "debian", tag: "9"}
- {name: "debian", tag: "8"}
- {name: "ubuntu", tag: "22.04"}
- {name: "ubuntu", tag: "20.04"}
- {name: "ubuntu", tag: "18.04"}
@ -36,12 +35,12 @@ jobs:
image: docker://docker.io/library/${{ matrix.distro.name }}:${{ matrix.distro.tag }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Install Alpine dependencies
if: matrix.distro.name == 'alpine'
run: |
apk --no-cache --update add bash gcc linux${{ matrix.distro.variant }} linux${{ matrix.distro.variant }}-dev make openssl
apk --no-cache --update add bash gcc linux${{ matrix.distro.variant }} linux${{ matrix.distro.variant }}-dev make openssl coreutils
- name: Install Arch Linux dependencies
if: matrix.distro.name == 'archlinux'
@ -68,7 +67,7 @@ jobs:
if: matrix.distro.name == 'ubuntu'
run: |
apt-get update -q
apt-get install -qy gcc make linux-headers-generic linux-image-generic openssl
apt-get install -qy gcc make linux-headers-generic linux-image-generic openssl shim-signed
- name: Compute packaged kernel version
id: versions
@ -96,7 +95,12 @@ jobs:
run: make install
- name: Run tests
run: ./run_test.sh
run: |
if [ "${{ matrix.distro.name }}" = alpine ] && [ "${{ matrix.distro.variant }}" = "-lts" ]; then
./run_test.sh --no-signing-tool
else
./run_test.sh
fi
test-vm:
name: Test in Ubuntu VM
@ -108,7 +112,7 @@ jobs:
runs-on: ubuntu-${{ matrix.version }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Install dependencies
run: |

View File

@ -1,7 +1,7 @@
RELEASE_DATE := "27 September 2022"
RELEASE_DATE := "27 April 2023"
RELEASE_MAJOR := 3
RELEASE_MINOR := 0
RELEASE_MICRO := 7
RELEASE_MICRO := 11
RELEASE_NAME := dkms
RELEASE_VERSION := $(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_MICRO)
RELEASE_STRING := $(RELEASE_NAME)-$(RELEASE_VERSION)

View File

@ -99,18 +99,27 @@ the configured kernel compression mechanism of choice.
This requires the `openssl` command to be present on the system.
Private key and certificate are auto generated the first time DKMS is run and
placed in `/var/lib/dkms`. These certificate files can be prepulated with your
own certificates of choice.
placed in `/var/lib/dkms`. These certificate files can be pre-populated with
your own certificates of choice.
The location as well can be changed by setting the appropriate variables in
`/etc/dkms/framework.conf`. For example, to awllow usage of the system default
Debian and Ubuntu `update-secureboot-policy` set the configuration file as
follows:
`/etc/dkms/framework.conf`. For example, to allow usage of the system default
Ubuntu `update-secureboot-policy` set the configuration file as follows:
```
mok_signing_key="/var/lib/shim-signed/mok/MOK.der"
mok_certificate="/var/lib/shim-signed/mok/MOK.priv"
mok_signing_key="/var/lib/shim-signed/mok/MOK.priv"
mok_certificate="/var/lib/shim-signed/mok/MOK.der"
```
The paths specified in `mok_signing_key`, `mok_certificate` and `sign_file` can
use the variable `${kernelver}` to represent the target kernel version.
```
sign_file="/lib/modules/${kernelver}/build/scripts/sign-file"
```
The variable `mok_signing_key` can also be a `pkcs11:...` string for a [PKCS#11
engine](https://www.rfc-editor.org/rfc/rfc7512), as long as the `sign_file`
program supports it.
Secure Boot
--
@ -136,14 +145,31 @@ With the appropriate key material on the system, enroll the public key:
You'll be prompted to create a password. Enter it twice, it can also be blank.
Reboot the computer. At boot you'll see the MOK Manager EFI interface, press any
key to enter it.
Reboot the computer. At boot you'll see the MOK Manager EFI interface:
- "Enroll MOK"
- "Continue".
- "Yes".
- Enter the password you set up just now.
- Select "OK" and the computer will reboot again.
![SHIM UEFI key management](/images/mok-key-1.png)
Press any key to enter it, then select "Enroll MOK":
![Perform MOK management](/images/mok-key-2.png)
Then select "Continue":
![Enroll MOK](/images/mok-key-3.png)
And confirm with "Yes" when prompted:
![Enroll the key(s)?](/images/mok-key-4.png)
After this, enter the password you set up with `mokutil --import` in the
previous step:
![Enroll the key(s)?](/images/mok-key-5.png)
At this point you are done, select "OK" and the computer will reboot trusting
the key for your modules:
![Perform MOK management](/images/mok-key-6.png)
After reboot, you can inspect the MOK certificates with the following command:

40
debian/HOWTO.Debian vendored
View File

@ -1,40 +0,0 @@
HOWTO Build DKMS debs w/ Debian & Ubuntu systems
Copyright 2008 Dell Inc.
Author: Mario Limonciello <Mario_Limonciello@Dell.com>
------------
A dkms deb is a common representation of a DKMS package that can be distributed across multiple machines.
After you have a functional DKMS package, you can follow these steps to build a DKMS deb.
1) Start out by putting together a tree in /usr/src/PACKAGE-VERSION. For our example, we are going to use
the PACKAGE lirc and VERSION 0.8.3~pre1. Create a dkms.conf per the recommendations in the DKMS guide.
2) "Add" the package to the dkms tree system:
dkms add -m lirc -v 0.8.3~pre1
3) "Build" the binary modules for the current kernel:
dkms build -m lirc -v 0.8.3~pre1
4) Make the deb and/or dsc for the package:
dkms mkdeb -m lirc -v 0.8.3~pre1
dkms mkdsc -m lirc -v 0.8.3~pre1
The end result will be a deb and/or dsc in /var/lib/dkms/lirc/0.8.3~pre1/deb or /var/lib/dkms/lirc/0.8.3~pre1/dsc
------------
If you would prefer not to contaminate your system with the changes from building these debs, you should
create a framework.conf that contains these variables (adjust for your use case):
source_tree="/path/to/source/tree"
dkms_tree="/path/to/dkms/tree"
You will then call DKMS with an extra variable, '--dkmsframework'. Here is an example of how this would work
using the same lirc example above:
dkms add -m lirc -v 0.8.3~pre1 --dkmsframework framework.conf
dkms build -m lirc -v 0.8.3~pre1 --dkmsframework framework.conf
dkms mkdeb -m lirc -v 0.8.3~pre1 --dkmsframework framework.conf
dkms mkdsc -m lirc -v 0.8.3~pre1 --dkmsframework framework.conf
The end result will be both a debian binary package and a debian source package that you can use.

View File

@ -1,8 +0,0 @@
dkms for Debian
Please edit this to provide information specific to
this dkms Debian package.
(Automatically generated by debmake Version 4.3.1)
-- Luoyaoming <luoyaoming@kylinos.cn> Sun, 09 Oct 2022 14:40:34 +0800

5
debian/changelog vendored
View File

@ -1,5 +0,0 @@
dkms (3.0.7-ok1) yangtze; urgency=low
* Initial release.
-- Luoyaoming <luoyaoming@kylinos.cn> Sun, 09 Oct 2022 14:40:34 +0800

1
debian/clean vendored
View File

@ -1 +0,0 @@
debian/scripts/dh_dkms

53
debian/control vendored
View File

@ -1,53 +0,0 @@
Source: dkms
Section: kernel
Priority: optional
Maintainer: Openkylin Developers <packaging@lists.openkylin.top>
Uploaders: Luoyaoming <luoyaoming@kylinos.cn>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.1
Homepage: https://github.com/dell/dkms
Vcs-Git: https://gitee.com/openkylin/dkms.git
Vcs-Browser: https://gitee.com/openkylin/dkms
Rules-Requires-Root: no
Package: dkms
Architecture: all
Multi-Arch: foreign
Pre-Depends: lsb-release
Depends: ${misc:Depends},
kmod | kldutils,
gcc | c-compiler,
dpkg-dev,
make | build-essential,
patch,
dctrl-tools,
dh-dkms (= ${binary:Version}),
Recommends: fakeroot,
sudo,
linux-headers-686-pae | linux-headers-amd64 | linux-headers-generic | linux-headers,
Suggests: menu, e2fsprogs
Breaks: ${dkms:Breaks}
Description: Dynamic Kernel Module System (DKMS)
DKMS is a framework designed to allow individual kernel modules to be upgraded
without changing the whole kernel. It is also very easy to rebuild modules as
you upgrade kernels.
Package: dh-dkms
Architecture: all
Multi-Arch: foreign
Depends:
${perl:Depends},
${misc:Depends},
Breaks:
dkms (<< 3.0.3-0),
Replaces:
dkms (<< 3.0.3-0),
Provides:
dh-sequence-dkms,
Description: debhelper addon for the Dynamic Kernel Module System (DKMS)
DKMS is a framework designed to allow individual kernel modules to be upgraded
without changing the whole kernel. It is also very easy to rebuild modules as
you upgrade kernels.
.
This package provides a debhelper add-on 'dkms' that simplifies packaging of
dkms kernel module source packages.

429
debian/copyright vendored
View File

@ -1,429 +0,0 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: dkms
Source: https://github.com/dell/dkms
#
# Please double check copyright with the licensecheck(1) command.
Files: .github/workflows/tests.yml
.gitignore
Makefile
README.md
dkms.8.in
dkms.bash-completion
dkms.service
dkms_autoinstaller
dkms_find-provides
dkms_framework.conf
kernel_install.d_dkms
kernel_postinst.d_dkms
kernel_prerm.d_dkms
run_test.sh
test/README
test/dkms_test-1.0/Makefile
test/dkms_test-1.0/dkms.conf
test/dkms_test-1.0/dkms_test.c
Copyright: __NO_COPYRIGHT_NOR_LICENSE__
License: __NO_COPYRIGHT_NOR_LICENSE__
Files: dkms.in
dkms_apport.py
Copyright: 2003-2008 Dell, Inc. Gary Lerhaupt, Matt Domsch, & Mario Limonciello
2009 Dell, Inc. Mario Limonciello
2012 Darik Horn <dajhorn@vanadac.com>
License: GPL-2.0+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
.
The FSF address in the above text is the old one.
.
On Debian systems, the complete text of the GNU General Public License
Version 2 can be found in `/usr/share/common-licenses/GPL-2'.
Files: lsb_release
Copyright: 2000-2004 Free Standards Group, Inc. Dominique MASSONIE <mdomi@users.sourceforge.net>
License: GPL-2.0+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
.
* Changes in 2.0
- Support LSB 2.0 module layout (Mats Wichmann)
.
The FSF address in the above text is the old one.
.
On Debian systems, the complete text of the GNU General Public License
Version 2 can be found in `/usr/share/common-licenses/GPL-2'.
Files: dkms_common.postinst
Copyright: 2002-2005 Flavio Stanchina
2005-2006 Aric Cyr
2007 Mario Limonciello
2009 Alberto Milone
License: __NO_LICENSE__
#----------------------------------------------------------------------------
# Files marked as NO_LICENSE_TEXT_FOUND may be covered by the following
# license/copyright files.
#----------------------------------------------------------------------------
# License file: COPYING
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
.
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
.
Preamble
.
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
.
The precise terms and conditions for copying, distribution and
modification follow.
.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
.
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
.
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
.
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
.
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
.
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
.
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
.
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
.
NO WARRANTY
.
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
.
END OF TERMS AND CONDITIONS
.
How to Apply These Terms to Your New Programs
.
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
.
Also add information on how to contact you by electronic and paper mail.
.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
.
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
.
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
.
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -1,4 +0,0 @@
debian/scripts/dh_dkms usr/bin
debian/scripts/dh_dkms.1 usr/share/man/man1/
debian/scripts/*-dkms usr/share/debhelper/autoscripts/
debian/scripts/dkms.pm usr/share/perl5/Debian/Debhelper/Sequence/

1
debian/dkms.docs vendored
View File

@ -1 +0,0 @@
debian/HOWTO.Debian

1
debian/dkms.install vendored
View File

@ -1 +0,0 @@
debian/scripts/dkms-autopkgtest usr/lib/dkms/

View File

@ -1,5 +0,0 @@
# dependency is provided by apport
python3-script-but-no-python3-dep python3 (does not satisfy python3:any | python3-minimal:any) [usr/share/apport/package-hooks/dkms_packages.py]
# this location is used by multiple external scripts to find dkms bits
executable-in-usr-lib

View File

@ -1,19 +0,0 @@
rm_conffile /etc/bash_completion.d/dkms 3.0.3-2~
rm_conffile /etc/dkms/kernel_install.d_dkms 3.0.3-2~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/rules 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/prerm 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/postinst 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/dirs 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/copyright 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/control 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/compat 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/changelog 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/debian/README.Debian 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkdeb/Makefile 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/debian/rules 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/debian/copyright 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/debian/control 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/debian/compat 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/debian/changelog 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/debian/README.Debian 3.0.3-3~
rm_conffile /etc/dkms/template-dkms-mkbmdeb/Makefile 3.0.3-3~

View File

@ -1,4 +0,0 @@
# modprobe information used for DKMS modules
#
# This is a stub file, should be edited when needed,
# used by default by DKMS.

11
debian/dkms.postinst vendored
View File

@ -1,11 +0,0 @@
#!/bin/sh
set -e
#DEBHELPER#
if dpkg --compare-versions "$2" lt-nl "3.0.3-3~" ; then
for d in /etc/dkms/template-dkms-mkdeb/debian /etc/dkms/template-dkms-mkdeb /etc/dkms/template-dkms-mkbmdeb/debian /etc/dkms/template-dkms-mkbmdeb
do
test ! -d $d || rmdir --ignore-fail-on-non-empty $d
done
fi

View File

@ -1,3 +0,0 @@
include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml

33
debian/rules vendored
View File

@ -1,33 +0,0 @@
#!/usr/bin/make -f
# -*- makefile -*-
include /usr/share/dpkg/pkg-info.mk
%:
dh $@
debian/scripts/dh_dkms: debian/scripts/dh_dkms.in
sed -r "s,^#VERSION#,our \$$VERSION = \"$(DEB_VERSION)\";," $< > $@
dh_dkms.1: debian/scripts/dh_dkms
pod2man \
--center "DKMS Debhelper" \
--release $(DEB_VERSION_UPSTREAM) \
$< > debian/scripts/$@
override_dh_auto_build:
override_dh_auto_install:
override_dh_install: debian/scripts/dh_dkms
override_dh_install:
$(MAKE) install-debian DESTDIR=$(CURDIR)/debian/dkms
dh_install
override_dh_gencontrol:
ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes),yes)
dh_gencontrol -- \
-Vdkms:Breaks="shim-signed (<< 1.34~)"
else
dh_gencontrol
endif

View File

@ -1,196 +0,0 @@
.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{\
. if \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{\
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "DH_DKMS 1"
.TH DH_DKMS 1 "2022-06-02" "3.0.3" "DKMS Debhelper"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
dh_dkms \- correctly handle DKMS usage by a kernel module package
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
\&\fBdh_dkms\fR [\fIdebhelper\ options\fR] [\fB\-l\fR] [\fB\-V\fR[\fIversion\fR]] [\fB\-\-\fR\ \fIfile\fR]
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
dh_dkms is a debhelper program that is responsible for correctly setting
postinst, postrm and dependencies in kernel module packages using \s-1DKMS.\s0
.PP
If a file named debian/package.dkms exists, then different actions are
performed, depending on its contents.
.SH "FILES"
.IX Header "FILES"
.IP "debian/\fIpackage\fR.dkms" 4
.IX Item "debian/package.dkms"
.PD 0
.IP "debian/dkms" 4
.IX Item "debian/dkms"
.PD
It can be a proper configuration file, and in this case it would be installed
in the proper directory as dkms.conf.
.Sp
It can also point to another file (this should be used when the configuration
is provided by upstream), and in this case that file will be installed as dkms.conf
in the proper directory.
.Sp
This file can only miss if a filename is provided when calling dh_dkms.
.SH "OPTIONS"
.IX Header "OPTIONS"
.IP "\fB\-l\fR, \fB\-\-legacy\fR" 4
.IX Item "-l, --legacy"
Add code to also support \s-1DKMS\s0 versions < 2.1.0.0.
.IP "\fB\-V\fR, \fB\-V\fR \fIversion\fR" 4
.IX Item "-V, -V version"
If \f(CW\*(C`PACKAGE_VERSION\*(C'\fR in \fIdkms.conf\fR is set to \f(CW\*(C`#MODULE_VERSION#\*(C'\fR, set it to
the given \fIversion\fR or, if none is given, default to the upstream version of
the current package. Otherwise, leave the value specified in \fIdkms.conf\fR.
.IP "\fB\-\-\fR \fIfile\fR" 4
.IX Item "-- file"
Don't look for debian/\fIpackage\fR.dkms or debian/dkms, but install \fIfile\fR as dkms.conf.
.SH "NOTES"
.IX Header "NOTES"
Note that this command is not idempotent. \fBdh_prep\fR\|(1) should be called
between invocations of this command. Otherwise, it may cause multiple
instances of the same text to be added to maintainer scripts.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
\&\fBdebhelper\fR\|(1)
.PP
This program is part of the Debian \s-1DKMS\s0 package.
.PP
\&\fBdkms\fR\|(8)
.SH "AUTHOR"
.IX Header "AUTHOR"
David Paleino <dapal@debian.org>

View File

@ -1,184 +0,0 @@
#!/usr/bin/perl -w
=head1 NAME
dh_dkms - correctly handle DKMS usage by a kernel module package
=cut
use strict;
use Debian::Debhelper::Dh_Lib;
=head1 SYNOPSIS
B<dh_dkms> [S<I<debhelper options>>] [S<B<-l>>] [S<B<-V>[I<version>]>] [S<B<--> I<file>>]
=head1 DESCRIPTION
dh_dkms is a debhelper program that is responsible for correctly setting
postinst, postrm and dependencies in kernel module packages using DKMS.
If a file named debian/package.dkms exists, then different actions are
performed, depending on its contents.
=head1 FILES
=over 4
=item debian/I<package>.dkms
=item debian/dkms
It can be a proper configuration file, and in this case it would be installed
in the proper directory as dkms.conf.
It can also point to another file (this should be used when the configuration
is provided by upstream), and in this case that file will be installed as dkms.conf
in the proper directory.
This file can only miss if a filename is provided when calling dh_dkms.
=back
=head1 OPTIONS
=over 4
=item B<-l>, B<--legacy>
Add code to also support DKMS versions < 2.1.0.0.
=item B<-V>, B<-V> I<version>
If C<PACKAGE_VERSION> in F<dkms.conf> is set to C<#MODULE_VERSION#>, set it to
the given I<version> or, if none is given, default to the upstream version of
the current package. Otherwise, leave the value specified in F<dkms.conf>.
=item B<--> I<file>
Don't look for debian/I<package>.dkms or debian/dkms, but install I<file> as dkms.conf.
=back
=head1 NOTES
Note that this command is not idempotent. L<dh_prep(1)> should be called
between invocations of this command. Otherwise, it may cause multiple
instances of the same text to be added to maintainer scripts.
=cut
# placeholder substituted at build time
# is shown along generated autoscripts
#VERSION#
init(options => {
"l|legacy" => \$dh{LEGACY_DKMS},
});
foreach my $package (@{$dh{DOPACKAGES}}) {
#next if is_udeb($package);
my $tmp = tmpdir($package);
my $dkms_dir = "/usr/lib/dkms/";
my $dkms_conf = pkgfile($package, "dkms");
my $is_snippet = 0;
my @other_conf;
my $name;
my $package_name;
my $package_version;
my $build_exclusive_config;
if ($dkms_conf) {
# let's see if it's a proper snippet
open(IN, "< $dkms_conf");
while (my $l = <IN>) {
$l =~ /PACKAGE_NAME=(["'])(.*)\1/ && ($is_snippet = 1);
}
close(IN);
if ($is_snippet) {
$name = $dkms_conf;
}
else {
@other_conf = filearray($dkms_conf);
if ($#other_conf > 1) {
error "cannot list more than one file in $dkms_conf!";
}
else {
$name = $other_conf[0];
}
}
}
elsif ($#ARGV == 0) {
$name = $ARGV[0];
}
else {
next;
}
verbose_print "installing $name as dkms.conf";
# now, parse our configuration file
open(IN, "< $name");
while (my $l = <IN>) {
$l =~ /PACKAGE_NAME=(["']?)(.*)\1/ && ($is_snippet = 1 && $package_name = $2);
$l =~ /PACKAGE_VERSION=(["']?)(.*)\1/ && ($package_version = $2);
$l =~ /BUILD_EXCLUSIVE_CONFIG=(["']?)(.*)\1/ && ($build_exclusive_config = $2);
}
close(IN);
#$ENV{DH_AUTOSCRIPTDIR} = "debian/scripts/";
if ($build_exclusive_config) {
addsubstvar($package, "misc:Depends", "dkms", ">= 3.0.3-4~");
}
elsif ($dh{LEGACY_DKMS}) {
doit("install", "-p", "-D", "-m755", "$dkms_dir/common.postinst", "$tmp/usr/share/$package/postinst");
addsubstvar($package, "misc:Depends", "dkms");
}
else {
addsubstvar($package, "misc:Depends", "dkms", ">= 2.1.0.0");
}
if ($dh{V_FLAG_SET}) {
$package_version = $dh{V_FLAG};
if ($package_version eq "") {
# Call isnative because it sets $dh{VERSION}
# as a side effect.
isnative($package);
$package_version = $dh{VERSION};
# Remove the Debian revision
$package_version =~ s/-[^-]+$//;
}
my $old_name = $name;
$name = "debian/".pkgext($package)."dkms.debhelper";
doit("cp", "-a", $old_name, $name);
doit("sed", "-i", "s/#MODULE_VERSION#/$package_version/g", $name);
}
error "could not determine package name"
unless defined($package_name);
error "could not determine package version"
unless defined($package_version);
autoscript($package, "prerm", "prerm-dkms",
"s/#MODULE_NAME#/$package_name/;s/#MODULE_VERSION#/$package_version/");
autoscript($package, "postinst", "postinst-dkms",
"s/#MODULE_NAME#/$package_name/;s/#MODULE_VERSION#/$package_version/");
doit("install", "-p", "-D", "-m644", "$name", "$tmp/usr/src/$package_name-$package_version/dkms.conf");
}
=head1 SEE ALSO
L<debhelper(1)>
This program is part of the Debian DKMS package.
L<dkms(8)>
=head1 AUTHOR
David Paleino <dapal@debian.org>
=cut

View File

@ -1,208 +0,0 @@
#!/bin/sh
# Common autopkgtest script for testing a dkms source package.
# Author: Martin Pitt <martin.pitt@ubuntu.com>
# Copyright: (C) 2014 Canonical Ltd.
set -eu
result=0
summary=
crlf="
"
header_packages=
check_for_linux_headers() {
# Act only on the first run.
if [ -n "$header_packages" ]; then
return
fi
# What Linux header packages are installed?
header_packages=$(dpkg-query -f '${Status} ${Package}\n' -W 'linux-headers-*' | sed -r -n 's/^install ok installed //p')
if [ -n "$header_packages" ]; then
echo "I: Using the following Linux header packages that were already installed:"
for p in $header_packages ; do
echo "I: $p"
done
return
fi
# What Linux header packages could be installed?
# linux-doc is a dependency generated by autodep8 for autopkgtest-pkg-dkms
# install only linux-headers-* matching the source version of linux-doc
wanted_source_version=$(dpkg-query -f '${source:Version}' -W linux-doc 2>/dev/null || true)
candidates=$(apt-cache search --names-only '^linux-headers-' | awk '{print $1}' | grep -v -E -e '-common(-rt)?$')
echo "I: No Linux header packages are installed."
echo "I: Installing all available ones from src:linux $wanted_source_version:"
for p in $candidates ; do
if [ -z "$wanted_source_version" ]; then
echo "I: $p"
header_packages="$header_packages $p"
continue
fi
source_versions=$(apt-cache show $p | perl -ne 'if (/^$/) { print $s || $v, "\n"; $s=$v=""; } $s=$1 if /^Source: .* \((.*)\)$/; $v=$1 if /^Version: (.*)$/;')
for sv in $source_versions ; do
if [ "$sv" = "$wanted_source_version" ]; then
echo "I: install $p"
header_packages="$header_packages $p"
continue 2
fi
done
echo "I: skip $p"
done
apt-get install --no-install-recommends -yq $header_packages </dev/null 2>&1 || RC=$?
if [ "$RC" -ne 0 ]; then
echo "E: Linux headers failed to install" >&2
exit 1
fi
}
run_pkg() {
pkg="$1"
echo "I: Removing binary package $pkg, to get clean state"
export DEBIAN_FRONTEND=noninteractive
apt-get purge -yq $pkg </dev/null 2>&1 >/dev/null || true
echo "I: Installing binary package $pkg"
export DEBIAN_FRONTEND=noninteractive
RC=0
apt-get install --no-install-recommends -yq $pkg </dev/null 2>&1 || RC=$?
if [ "$RC" -ne 0 ]; then
echo "E: Package $pkg failed to install" >&2
result=1
return
fi
# Try and remove dkms to spot packages which miss a dkms dependency
echo "I: Checking for missing dkms dependency by trying to deinstall dkms"
dpkg --remove dkms || true
if ! dkms_conf=$(dpkg -L $pkg | grep '/usr/src' | grep '/dkms.conf$'); then
echo "I: Package $pkg has no dkms.conf, skipping"
return
fi
check_for_linux_headers
echo "I: Testing binary package $pkg"
dkms_pkg=$(bash -c ". $dkms_conf > /dev/null; echo \$PACKAGE_NAME" 2>/dev/null)
dkms_ver=$(bash -c ". $dkms_conf > /dev/null; echo \$PACKAGE_VERSION" 2>/dev/null)
for k in /lib/modules/*/build
do
test -d "$k" || continue
kver="${k%/build}"
kver="${kver#/lib/modules/}"
# If any linux-meta is in triggers, only test abistems that
# match triggers otherwise continue. This helps integration
# with adt-matrix which specifically requests test results
# against each individual linux-meta and tracks unique results
# per kernel abi.
abistem=$(echo $kver | sed 's/-[a-z]*$//')
case "${ADT_TEST_TRIGGERS-}" in
*linux-meta*)
case "$ADT_TEST_TRIGGERS" in
*"$abistem"*)
;;
*)
continue
;;
esac
esac
echo "I: Trying to build $dkms_pkg/$dkms_ver for $kver"
res=0
dkms build -m "$dkms_pkg" -v "$dkms_ver" -k "$kver" || res=$?
if [ "$res" = 9 ]; then
echo "I: $dkms_pkg/$dkms_ver is not supported on $kver (BUILD_EXCLUSIVE directive), skipping"
summary="${summary}I: SKIP $kver${crlf}"
continue
fi
if [ "$res" != 0 ]; then
echo "E: $dkms_pkg/$dkms_ver failed to build for $kver" >&2
makelog="/var/lib/dkms/$dkms_pkg/$dkms_ver/build/make.log"
echo "========== $makelog ==========" >&2
cat "$makelog" >&2 || true
echo "====================" >&2
summary="${summary}I: FAIL $kver${crlf}"
result=1
continue
fi
if ! dkms install -m "$dkms_pkg" -v "$dkms_ver" -k "$kver" ; then
echo "E: $dkms_pkg/$dkms_ver failed to install for $kver" >&2
summary="${summary}I: FAIL $kver${crlf}"
result=1
continue
fi
echo "I: Testing if $dkms_pkg modules are correctly installed"
dkmsstatus="$(dkms status $dkms_pkg -k $kver)"
echo "$dkmsstatus"
if [ -z "$dkmsstatus" ]; then
echo "E: dkms status output is empty!" >&2
summary="${summary}I: FAIL $kver${crlf}"
result=1
continue
fi
# This should check for exact zfs module against exact kernel
# abi to allow testing multiple kernels simultaniously. Some
# dkms modules are pre-built inside the kernel (i.e. zfs on
# Ubuntu) thus we should accept such result.
if ! echo "$dkmsstatus" | sed 's/ (WARNING! Diff between built and installed module!)//g' | grep -q "installed$"; then
echo "E: not installed" >&2
summary="${summary}I: FAIL $kver${crlf}"
result=1
continue
fi
summary="${summary}I: PASS $kver${crlf}"
done
# collect build logs as artifacts
if [ -d /var/lib/dkms ]; then
(cd /var/lib/dkms; find -name "make.log" -print0 | xargs -r -0 tar cv) > "$AUTOPKGTEST_ARTIFACTS/$pkg-make-logs.tar"
fi
# skip modprobing for now; this fails too often (needs particular
# hardware/firmware/etc)
# for mod in $(awk -F '"' '/^BUILT_MODULE_NAME/ {print $2}' $dkms_conf); do
# echo "I: modprobe $mod"
# if ! modprobe $mod; then
# echo "E: Failed to modprobe module $mod" >&2
# exit 1
# else
# echo "I: $modname loaded"
# fi
# done
}
# Do not (fail to) build the modules upon linux-header-* and *-dkms package
# installation, which can cause apt-get to fail. We will do this later with
# improved error reporting.
# (This only works if the *-dkms package is not yet installed.)
touch /etc/dkms/no-autoinstall
for pkg in $(grep-dctrl -FDepends -e '(^| )dkms' -o -FPackage -e '\-dkms' debian/control -sPackage -n); do
# package might be arch: restriction or udeb etc.
if ! apt-cache show $pkg >/dev/null 2>&1; then
echo "I: Skipping unavailable package $pkg"
continue
fi
run_pkg $pkg
done
if [ -n "$summary" ]; then
echo "I: Summary:"
echo -n "$summary"
fi
exit $result
# vim: sw=4:ts=4:et

View File

@ -1,8 +0,0 @@
#!/usr/bin/perl
use warnings;
use strict;
use Debian::Debhelper::Dh_Lib;
insert_before("dh_installinit", "dh_dkms");
1;

View File

@ -1,27 +0,0 @@
# The original file can be found in template-dkms-mkdeb/debian/postinst
# in the DKMS tarball, check it for copyright notices.
DKMS_NAME=#MODULE_NAME#
DKMS_PACKAGE_NAME=$DKMS_NAME-dkms
DKMS_VERSION=#MODULE_VERSION#
postinst_found=0
case "$1" in
configure)
for DKMS_POSTINST in /usr/lib/dkms/common.postinst /usr/share/$DKMS_PACKAGE_NAME/postinst; do
if [ -f $DKMS_POSTINST ]; then
$DKMS_POSTINST $DKMS_NAME $DKMS_VERSION /usr/share/$DKMS_PACKAGE_NAME "" $2
postinst_found=1
break
fi
done
if [ "$postinst_found" -eq 0 ]; then
echo "ERROR: DKMS version is too old and $DKMS_PACKAGE_NAME was not"
echo "built with legacy DKMS support."
echo "You must either rebuild $DKMS_PACKAGE_NAME with legacy postinst"
echo "support or upgrade DKMS to a more current version."
exit 1
fi
;;
esac

View File

@ -1,10 +0,0 @@
DKMS_NAME=#MODULE_NAME#
DKMS_VERSION=#MODULE_VERSION#
case "$1" in
remove|upgrade|deconfigure)
if [ "$(dkms status -m $DKMS_NAME -v $DKMS_VERSION)" ]; then
dkms remove -m $DKMS_NAME -v $DKMS_VERSION --all
fi
;;
esac

View File

@ -1 +0,0 @@
3.0 (native)

View File

@ -1,2 +0,0 @@
# for debian/scripts/dh_dkms.in
maintainer-manual-page [debian/scripts/dh_dkms.1]

View File

@ -1,4 +0,0 @@
Bug-Database: https://github.com/dell/dkms/issues
Bug-Submit: https://github.com/dell/dkms/issues/new
Repository: https://github.com/dell/dkms.git
Repository-Browse: https://github.com/dell/dkms

7
debian/watch vendored
View File

@ -1,7 +0,0 @@
version=4
#we no longer are hosted on linux.dell.com
#http://linux.dell.com/dkms/permalink/dkms-(.*)\.tar\.gz
https://github.com/dell/dkms/releases \
.*[^n]/(?:|v|version-|r|REL_|rel-|dkms(?:_|-))(\d[^\s/]*)\.(?:tar\.xz|txz|tar\.bz2|tbz2|tar\.gz|tgz)

211
dkms.8.in
View File

@ -55,13 +55,16 @@ is a framework which allows kernel modules to be dynamically built
for each kernel on your system in a simplified and organized fashion.
.SH ACTIONS
.SY add
.OP module/module\-version
.OP /path/to/source\-tree
.OP /path/to/tarball.tar
.OP "module/module\-version | /path/to/source\-tree | /path/to/tarball.tar"
.YS
.IP "" 4
Adds a module/module\-version combination to the tree for builds and installs.
If module/module\-version, \-m module/module\-version, or \-m module\ \-v version are passed as options, this command
If
.IR module/module\-version ,
.IR "\-m module/module\-version" ,
or
.I \-m module\ \-v module\-version
are passed as options, this command
requires source in
.I /usr/src/<module>\-<module\-version>/
as well as a properly
@ -74,7 +77,7 @@ is passed as an option, and source-tree contains a
file, it will copy
.I /path/to/source\-tree
to
.I /usr/src/module\-module\-version.
.IR /usr/src/module\-module\-version .
If
.I /path/to/tarball.tar
is passed, this command behaves like the
@ -146,8 +149,8 @@ by default, and the
.B --force
option should be used to override this.
If you pass a .rpm file, dkms will try to install that file with
.B rpm -Uvh
, and it will perform an
.BR "rpm -Uvh" ,
and it will perform an
.B autoinstall
action to be sure that everything is built for your kernel if the RPM installed successfully.
.SY uninstall
@ -426,8 +429,8 @@ with the modules found underneath the /collisions directory, and they will be st
until you manually delete them.
.SH DKMS.CONF
When performing an
.B add
, a proper
.BR add ,
a proper
.I dkms.conf
file must be found. A properly formatted conf file is essential
for communicating to
@ -451,42 +454,16 @@ largest family consists of BUILT_MODULE_NAME[#], BUILT_MODULE_LOCATION[#], DEST_
DEST_MODULE_LOCATION[#] and STRIP[#]. When indexing these arrays when creating your
dkms.conf, each family should start at index value 0.
.TP
.B MAKE[#]=
The MAKE directive array tells DKMS which make command should be used for building your module. The default make command
should be put into
.B MAKE[0].
Other entries in the MAKE array will only be used if their corresponding entry in
.B MAKE_MATCH[#]
matches, as a regular expression (using grep -E), the kernel that the module is being built for.
Note that if no value is placed in
.B MAKE_MATCH[#]
for any
.B MAKE[#]
where # > 0, then that
.B MAKE
directive is ignored.
.B MAKE_MATCH[0]
is optional and if it is populated, it will be used to determine
if MAKE[0] should be used to build the module for that kernel. If multiple
.B MAKE_MATCH
directives match against the kernel being built for, the last matching
.B MAKE[#]
will be used to build your module. If no MAKE directive is specified or if no
MAKE_MATCH matches the kernel being built for, DKMS
will attempt to use a generic MAKE command to build your module.
KERNELRELEASE will be automatically appended to MAKE[#]. If you want to
suppress this behavior, you can quote the make command: 'make'.
.B PACKAGE_NAME=
This directive is used to give the name associated with the entire package of modules. This is the same
name that is used with the
.B \-m
option when building, adding, etc. and may not necessarily be the same as the MODULE_NAME. This
directive must be present in every dkms.conf.
.TP
.B MAKE_MATCH[#]=
See the above entry on
.B MAKE[#]
directives. This array should be populated with regular expressions which, when matched
against the kernel being built for, will tell
.B DKMS
to use the corresponding make command in the
.B MAKE[#]
directive array to build your module.
.B PACKAGE_VERSION=
This directive is used to give the version associated with the entire package of modules being installed within that dkms
package. This directive must be present in every dkms.conf.
.TP
.B BUILT_MODULE_NAME[#]=
This directive gives the name of the module just after it is built. If your DKMS module
@ -547,21 +524,58 @@ By default strip is considered to be "yes". If set to "no", DKMS will not
run strip \-g against your built module to remove debug symbols from it.
STRIP[0] is used as the default for any unset entries in the STRIP array.
.TP
.B PACKAGE_NAME=
This directive is used to give the name associated with the entire package of modules. This is the same
name that is used with the
.B \-m
option when building, adding, etc. and may not necessarily be the same as the MODULE_NAME. This
directive must be present in every dkms.conf.
.B MAKE[#]=
The MAKE directive array tells DKMS which make command should be used for building your module. The default make command
should be put into
.B MAKE[0].
Other entries in the MAKE array will only be used if their corresponding entry in
.B MAKE_MATCH[#]
matches, as a regular expression (using grep -E), the kernel that the module is being built for.
Note that if no value is placed in
.B MAKE_MATCH[#]
for any
.B MAKE[#]
where # > 0, then that
.B MAKE
directive is ignored.
.B MAKE_MATCH[0]
is optional and if it is populated, it will be used to determine
if MAKE[0] should be used to build the module for that kernel. If multiple
.B MAKE_MATCH
directives match against the kernel being built for, the last matching
.B MAKE[#]
will be used to build your module. If no MAKE directive is specified or if no
MAKE_MATCH matches the kernel being built for, DKMS
will attempt to use a generic MAKE command to build your module.
KERNELRELEASE will be automatically appended to MAKE[#]. If you want to
suppress this behavior, you can quote the make command: 'make'.
.TP
.B PACKAGE_VERSION=
This directive is used to give the version associated with the entire package of modules being installed within that dkms
package. This directive must be present in every dkms.conf.
.B MAKE_MATCH[#]=
See the above entry on
.B MAKE[#]
directives. This array should be populated with regular expressions which, when matched
against the kernel being built for, will tell
.B DKMS
to use the corresponding make command in the
.B MAKE[#]
directive array to build your module.
.TP
.B CLEAN=
CLEAN specifies the make clean command to be used to clean up both before and after building the
module. If unset, it is assumed to be "make clean".
.TP
.B NO_WEAK_MODULES=
The
.B NO_WEAK_MODULES
parameter prevents dkms from creating a symlink into the weak-updates directory, which is the
default on Red Hat derivatives. The weak modules facility was designed to eliminate the need to
rebuild kernel modules when kernel upgrades occur and relies on the symbols within the kABI.
Fedora does not guaranteed a stable kABI so it should be disabled in the specific module override by setting it to "yes". For example, for an Nvidia DKMS module you would set the following in /etc/dkms/nvidia.conf:
NO_WEAK_MODULES="yes"
.TP
.B OBSOLETE_BY=
This directive allows you to specify a kernel version that obsoletes the necessity for this
particular DKMS module. This can be specified as a particular upstream kernel or an ABI
@ -640,10 +654,30 @@ missing or broken dependencies cause non-fatal warnings.
.TP
.B BUILD_EXCLUSIVE_KERNEL=
This optional directive allows you to specify a regular expression which defines
the subset of kernels which DKMS is allowed to build your module for. If the kernel
being built for does not match against this regular expression, the dkms build
will error out. For example, if you set it as ="^2\.4.*", your module would not be
built for 2.6 kernels.
the subset of kernels which DKMS is allowed to build your module for.
If the kernel being built for does not match against this regular expression (or
does not the satisfy the constraints of any other
.B BUILD_EXCLUSIVE_*
directive), the dkms build will error out with exit code 77.
Note that dkms autoinstall will ignore this type of error condition and simply
skip the respective modules.
For example, if you set it as ="^2\.4.*", your module would not be built for 2.6
or later kernels.
.TP
.B BUILD_EXCLUSIVE_KERNEL_MIN=
and
.B BUILD_EXCLUSIVE_KERNEL_MAX=
These optional directives allow one to specify the minimal and maximal kernel
versions supported by the module. If one (or both) of these are defined, the
module will not be built for kernels outside the specified version limits.
For example, if you set
.B BUILD_EXCLUSIVE_KERNEL_MIN
as "=3.5", your module would be built for e.g. "3.5-rc2", "3.6.18" or other
later versions but not for "3.4.999" or earlier kernels.
Similarly, if you set
.B BUILD_EXCLUSIVE_KERNEL_MAX
as ="4.12", your module would be built for e.g. "4.11.999", "3.9-rc5" or
other earlier versions, but not for "4.12-rc1" or later kernels.
.TP
.B BUILD_EXCLUSIVE_ARCH=
This optional directive functions very similarly to
@ -651,6 +685,16 @@ This optional directive functions very similarly to
except that it matches against the kernel architecture. For example, if you set
it to ="i.86", your module would not be built for ia32e, x86_64, amd64, s390, etc.
.TP
.B BUILD_EXCLUSIVE_CONFIG=
This optional directive allows you to specify a space separated list of
kernel configuration options ("CONFIG_FOO") that must be enabled in the
targeted kernels ".config" file (either to be compiled in or to be built
as a module) or absent (if prefixed with an exclamation mark, e.g.
"!CONFIG_BAR") in order to build the module.
For example, if you set it as ="CONFIG_PCI !CONFIG_PREEMPT_RT", your module
would only be built for kernels that have PCI enabled, but the RT patchset
disabled.
.TP
.B POST_ADD=
The name of the script to be run after an
.B add
@ -696,25 +740,11 @@ version in question will be substituted in its place. This is especially useful
commands when specifying which INCLUDE statements should be used when compiling your
module (eg. MAKE="make all INCLUDEDIR=/lib/modules/${kernelver}/build/include").
.TP
.B $dkms_tree
See the section on /etc/dkms/framework.conf for more information. This variable represents
the location of the DKMS tree on the local system. By default this is
.I /var/lib/dkms
, but this value should not be hard\-coded into a dkms.conf in the event that the local user
has changed it on their system.
.TP
.B $source_tree
See the section on /etc/dkms/framework.conf for more information. This variable represents
the location where DKMS keeps source on the local system. By default this is
.I /usr/src
, but this value should not be hard\-coded into a dkms.conf in the event that the local user
has changed it on their system.
.TP
.B $kernel_source_dir
This variable holds the value of the location of your kernel source directory. Usually, this
will be
.I /lib/modules/$kernelver/build
, unless otherwise specified with the
.IR /lib/modules/$kernelver/build ,
unless otherwise specified with the
.B \-\-kernelsourcedir
option.
.SH DKMS.CONF OVERRIDES
@ -736,21 +766,43 @@ This configuration file controls how the overall DKMS framework handles. It is s
in every time the dkms command is run. Mainly it can currently be used to set different
default values for the variables.
The file contains descriptions for each directive it supports.
Additionally to /etc/dkms/framework.conf,
.B any file matching the glob
/etc/dkms/framework.conf.d/*.conf will be loaded as well.
.TP
.B $dkms_tree, $source_tree, $install_tree
control where DKMS looks for its framework.
.B $dkms_tree, $source_tree, $install_tree, $tmp_location
Control which folders DKMS uses for components and artifacts.
.TP
.B $verbose
Can be set to anything but a null value to enable verbose output in DKMS.
.TP
.B $symlink_modules
controls whether binary modules are copied to /lib/modules or if only symlinks are created there. Note that these variables can also
Controls whether binary modules are copied to /lib/modules or if only symlinks are created there. Note that these variables can also
be manipulated on the command line with \-\-dkmstree, \-\-sourcetree, \-\-installtree
and \-\-symlink-modules options.
.TP
.B $autoinstall_all_kernels
used by the common postinst for DKMS modules. It controls if the build should be done for all installed kernels or only for the current and latest installed kernel. It has no command
Used by the common postinst for DKMS modules. It controls if the build should be done for all installed kernels or only for the current and latest installed kernel. It has no command
line equivalent.
.TP
.B $sign_file
This is the path of the
.I sign-file
kernel binary that is used to sign the kernel modules. The variable
.B $kernelver
can be used in path to represent the target kernel version. The path for the binary depends on the distribution.
.TP
.B $mok_signing_key, $mok_certificate
Location of the key and certificate files used for Secure boot. The variable
.B $kernelver
can be used in path to represent the target kernel version.
.I mok_signing_key
can also be a "pkcs11:..." string for PKCS#11 engine, as long as the sign_file program supports it.
.TP
.B $modprobe_on_install
Automatically load the built modules upon successful installation.
.SH dkms_autoinstaller
This boot\-time service automatically installs any module which has
.B AUTOINSTALL="yes"
@ -760,9 +812,6 @@ file. The service works quite simply and if multiple versions of a module are in
your system's DKMS tree, it will not do anything and instead explain that manual
intervention is required.
.SH AUTHOR
Gary Lerhaupt
Gary Lerhaupt, Emil Velikov, Simone Caronni, Xu Zhen
.SH WEBPAGE
.I https://github.com/dell/dkms
.SH MAILING\-LIST
dkms\-devel@dell.com
.I http://lists.us.dell.com/mailman/listinfo/dkms\-devel

592
dkms.in
View File

@ -27,8 +27,8 @@ shopt -s extglob
# The last group of variables has been deprecated
readonly dkms_conf_variables="CLEAN PACKAGE_NAME
PACKAGE_VERSION POST_ADD POST_BUILD POST_INSTALL POST_REMOVE PRE_BUILD
PRE_INSTALL BUILD_DEPENDS BUILD_EXCLUSIVE_KERNEL BUILD_EXCLUSIVE_ARCH
BUILD_EXCLUSIVE_CONFIG
PRE_INSTALL BUILD_DEPENDS BUILD_EXCLUSIVE_ARCH BUILD_EXCLUSIVE_CONFIG
BUILD_EXCLUSIVE_KERNEL BUILD_EXCLUSIVE_KERNEL_MIN BUILD_EXCLUSIVE_KERNEL_MAX
build_exclude OBSOLETE_BY MAKE MAKE_MATCH
PATCH PATCH_MATCH patch_array BUILT_MODULE_NAME
built_module_name BUILT_MODULE_LOCATION built_module_location
@ -40,6 +40,13 @@ readonly dkms_conf_variables="CLEAN PACKAGE_NAME
REMAKE_INITRD MODULES_CONF MODULES_CONF_OBSOLETES
MODULES_CONF_ALIAS_TYPE MODULES_CONF_OBSOLETE_ONLY"
# All of the variables not related to signing we will accept from framework.conf.
readonly dkms_framework_nonsigning_variables="source_tree dkms_tree install_tree tmp_location
verbose symlink_modules autoinstall_all_kernels
modprobe_on_install"
# All of the signing related variables we will accept from framework.conf.
readonly dkms_framework_signing_variables="sign_file mok_signing_key mok_certificate"
# Some important regular expressions. Requires bash 3 or above.
# Any poor souls still running bash 2 or older really need an upgrade.
readonly mv_re='^([^/]*)/(.*)$'
@ -219,12 +226,15 @@ set_module_suffix()
module_suffix="$module_uncompressed_suffix$module_compressed_suffix"
}
set_kernel_source_dir()
set_kernel_source_dir_and_kconfig()
{
if [[ -z $ksourcedir_fromcli ]]; then
if [[ -z "${ksourcedir_fromcli}" ]]; then
# $1 = the kernel to base the directory on
kernel_source_dir="$(_get_kernel_dir "$1")"
fi
if [[ -z "${kconfig_fromcli}" ]]; then
kernel_config="${kernel_source_dir}/.config"
fi
}
check_all_is_banned()
@ -259,7 +269,7 @@ setup_kernels_arches()
kernelver[$i]=${line%/*}
arch[$i]=${line#*/}
i=$(($i + 1))
done < <(module_status_built "$module" "$module_version")
done < <(module_status_built "$module" "$module_version" | sort -V)
fi
# Set default kernel version and arch, if none set (but only --all isn't set)
@ -442,7 +452,7 @@ read_conf()
# Set variables supported in dkms.conf files (eg. $kernelver)
local kernelver="$1"
local arch="$2"
set_kernel_source_dir "$1"
set_kernel_source_dir_and_kconfig "$1"
# Find which conf file to check
@ -490,6 +500,18 @@ read_conf()
pre_install="$PRE_INSTALL"
obsolete_by="$OBSOLETE_BY"
# Fail if no PACKAGE_NAME
if [[ ! $package_name ]]; then
echo $"dkms.conf: Error! No 'PACKAGE_NAME' directive specified.">&2
return_value=1
fi
# Fail if no PACKAGE_VERSION
if [[ ! $package_version ]]; then
echo $"dkms.conf: Error! No 'PACKAGE_VERSION' directive specified.">&2
return_value=1
fi
# Set module naming/location arrays
local index array_size=0 s
for s in ${#BUILT_MODULE_NAME[@]} \
@ -518,8 +540,8 @@ read_conf()
# If unset, set by defaults
[[ ! ${built_module_name[$index]} ]] && \
((${#DEST_MODULE_LOCATION[@]} == 1)) && \
built_module_name[$index]=$module
((array_size == 1)) && \
built_module_name[$index]=$PACKAGE_NAME
[[ ! ${dest_module_name[$index]} ]] && \
dest_module_name[$index]=${built_module_name[$index]}
[[ ${built_module_location[$index]} && \
@ -548,7 +570,7 @@ read_conf()
;;
esac
# Override location for specific kernels
# Override location for specific distributions
dest_module_location[$index]="$(override_dest_module_location ${dest_module_location[$index]})"
# Fail if no DEST_MODULE_LOCATION
@ -556,7 +578,8 @@ read_conf()
echo $"dkms.conf: Error! No 'DEST_MODULE_LOCATION' directive specified for record #$index.">&2
return_value=1
fi
# Fail if bad DEST_MODULE_LOCATION
# Fail if bad DEST_MODULE_LOCATION
case ${DEST_MODULE_LOCATION[$index]} in
/kernel*)
;;
@ -572,6 +595,11 @@ read_conf()
esac
done
# Warn if no modules are specified
if ((array_size == 0)); then
echo $"dkms.conf: Warning! Zero modules specified." >&2
fi
# Get the correct make command
[[ ${MAKE_MATCH[0]} ]] || make_command="${MAKE[0]}"
for ((index=0; index < ${#MAKE[@]}; index++)); do
@ -592,11 +620,11 @@ read_conf()
if readelf -p .comment $kernel_source_dir/vmlinux | grep -q LLD; then
make_command="${make_command} LD=ld.lld"
fi
elif [[ -e $kernel_source_dir/.config ]]; then
if grep -q CONFIG_CC_IS_CLANG=y $kernel_source_dir/.config; then
elif [[ -e "${kernel_config}" ]]; then
if grep -q CONFIG_CC_IS_CLANG=y "${kernel_config}"; then
make_command="${make_command} CC=clang"
fi
if grep -q CONFIG_LD_IS_LLD=y $kernel_source_dir/.config; then
if grep -q CONFIG_LD_IS_LLD=y "${kernel_config}"; then
make_command="${make_command} LD=ld.lld"
fi
fi
@ -612,35 +640,19 @@ read_conf()
# Set build_exclude
[[ $BUILD_EXCLUSIVE_KERNEL && ! $1 =~ $BUILD_EXCLUSIVE_KERNEL ]] && build_exclude="yes"
[[ $BUILD_EXCLUSIVE_KERNEL_MIN && "$(VER "$1")" < "$(VER "$BUILD_EXCLUSIVE_KERNEL_MIN")" ]] && build_exclude="yes"
[[ $BUILD_EXCLUSIVE_KERNEL_MAX && "$(VER "$1")" > "$(VER "$BUILD_EXCLUSIVE_KERNEL_MAX")" ]] && build_exclude="yes"
[[ $BUILD_EXCLUSIVE_ARCH && ! $2 =~ $BUILD_EXCLUSIVE_ARCH ]] && build_exclude="yes"
if [[ $BUILD_EXCLUSIVE_CONFIG && -e $kernel_source_dir/.config ]]; then
if [[ $BUILD_EXCLUSIVE_CONFIG && -e "${kernel_config}" ]]; then
local kconf
for kconf in $BUILD_EXCLUSIVE_CONFIG ; do
case "$kconf" in
!*) grep -q -E "^${kconf#!}=[ym]" $kernel_source_dir/.config && build_exclude="yes" ;;
*) grep -q -E "^${kconf}=[ym]" $kernel_source_dir/.config || build_exclude="yes" ;;
!*) grep -q "^${kconf#!}=[ym]" "${kernel_config}" && build_exclude="yes" ;;
*) grep -q "^${kconf}=[ym]" "${kernel_config}" || build_exclude="yes" ;;
esac
done
fi
# Fail if absolutely no DEST_MODULE_LOCATION
if ((${#dest_module_location[@]} == 0)); then
echo $"dkms.conf: Error! No 'DEST_MODULE_LOCATION' directive specified." >&2
return_value=1
fi
# Fail if no PACKAGE_NAME
if [[ ! $package_name ]]; then
echo $"dkms.conf: Error! No 'PACKAGE_NAME' directive specified.">&2
return_value=1
fi
# Fail if no PACKAGE_VERSION
if [[ ! $package_version ]]; then
echo $"dkms.conf: Error! No 'PACKAGE_VERSION' directive specified.">&2
return_value=1
fi
# Set clean
[[ $clean ]] || clean="make clean"
@ -648,25 +660,67 @@ read_conf()
return $return_value
}
# Source specified variables from dkms framework configuration files.
read_framework_conf() {
for i in /etc/dkms/framework.conf /etc/dkms/framework.conf.d/*.conf; do
[[ -e "$i" ]] && safe_source "$i" "$@"
done
}
# Little helper function for parsing the output of modinfo.
get_module_verinfo(){
res=("" "" "")
local ver
local srcver
local checksum
local vals=
while read -a vals; do
case ${vals[0]} in
case "${vals[0]}" in
version:)
res[0]=${vals[1]}
res[2]=${vals[2]}
ver="${vals[1]}"
checksum="${vals[2]}"
;;
srcversion:)
res[1]=${vals[1]}
;;
srcver="${vals[1]}"
;;
esac
done < <(modinfo $1)
done < <(modinfo "$1")
echo -E "${ver}"
# Use obsolete checksum info if srcversion is not available
echo -E "${srcver:-$checksum}"
}
# Compare two modules' version
# Output:
# "==": They are the same version and the same srcversion
# "=": They are the same version, but not the same srcversion
# ">": 1st one is newer than 2nd one
# "<": 1st one is older than 2nd one
# "?": Cannot determine
# Returns 0 if same version, otherwise 1
compare_module_version()
{
readarray -t ver1 <<< "$(get_module_verinfo "$1")"
readarray -t ver2 <<< "$(get_module_verinfo "$2")"
if [[ "${ver1[0]}" = "${ver2[0]}" ]]; then
if [[ "${ver1[1]}" = "${ver2[1]}" ]]; then
echo "=="
else
echo "="
fi
return 0
elif [[ ! "$ver1" ]] || [[ ! "$ver2" ]]; then
echo "?"
elif [[ "$(VER "${ver1[0]}")" > "$(VER "${ver2[0]}")" ]]; then
echo ">"
else
echo "<"
fi
return 1
}
# Perform some module version sanity checking whenever we are installing
# or removing modules.
# modules.
check_version_sanity()
{
# $1 = kernel_version
@ -677,8 +731,7 @@ check_version_sanity()
local lib_tree="$install_tree/$1" res=
echo $"Running module version sanity check."
local i=0
local -a kernels_info dkms_info
if [ -n $3 ]; then
if [ -n "$3" ]; then
# Magic split into array syntax saves trivial awk and cut calls.
local -a obs=(${3//-/ })
local -a my=(${1//-/ })
@ -726,34 +779,28 @@ check_version_sanity()
return 0
fi
local dkms_module=$(compressed_or_uncompressed "$dkms_tree/$module/$module_version/$1/$2/module/" "${4}")
get_module_verinfo $kernels_module; kernels_info=("${res[@]}")
get_module_verinfo $dkms_module; dkms_info=("${res[@]}")
if [[ ! ${dkms_info[1]} && ${kernels_info[1]} ]]; then
# Use obsolete checksum info
dkms_info[1]=${dkms_info[2]}
kernels_info[1]=${kernels_info[2]}
local cmp_res="$(compare_module_version "${kernels_module}" "${dkms_module}")"
if [[ "${cmp_res}" = ">" ]]; then
if [[ ! "$force" ]]; then
error $"Module version $(get_module_verinfo "${dkms_module}" | head -n 1) for $4${module_suffix}" \
$"is not newer than what is already found in kernel $1 ($(get_module_verinfo "${kernels_module}" | head -n 1))." \
$"You may override by specifying --force."
return 1
fi
elif [[ "${cmp_res}" = "==" ]]; then
if [[ ! "$force" ]]; then
# if the module has neither version nor srcversion/checksum, check the binary files instead
local verinfo="$(get_module_verinfo "${dkms_module}")"
if [[ "$(echo "$verinfo" | tr -d '[:space:]')" ]] || diff "${kernels_module}" "${dkms_module}" &>/dev/null; then
echo $"Module version $(echo "$verinfo" | head -n 1) for $4${module_suffix}" >&2
echo $"exactly matches what is already found in kernel $1." >&2
echo $"DKMS will not replace this module." >&2
echo $"You may override by specifying --force." >&2
return 1
fi
fi
fi
if [[ $kernels_info && $dkms_info && ! ( $(VER $dkms_info) > $(VER $kernels_info) ) && ! $force ]]; then
error $"Module version $dkms_info for ${4}$module_suffix" \
$"is not newer than what is already found in kernel $1 ($kernels_info)." \
$"You may override by specifying --force."
return 1
else
return 0
fi
if [[ ${kernels_info[1]} && ${dkms_info[1]} && ${kernels_info[1]} = ${dkms_info[1]} &&
-n "${kernels_info[0]}" && -n "${dkms_info[0]}" && ${kernels_info[0]} = ${dkms_info[0]} && ! $force ]]; then
echo $"" >&2
echo $"Good news! Module version $dkms_info for ${4}$module_suffix" >&2
echo $"exactly matches what is already found in kernel $1." >&2
echo $"DKMS will not replace this module." >&2
echo $"You may override by specifying --force." >&2
return 1
fi
return 0
}
@ -768,7 +815,7 @@ check_module_args() {
read_conf_or_die() {
read_conf "$@" && return
die 8 $"Bad conf file."\
$"File: $conf does not represent a valid dkms.conf file."
$"File: ${3:-$conf} does not represent a valid dkms.conf file."
}
run_build_script() {
@ -857,7 +904,7 @@ prepare_kernel()
# $1 = kernel version to prepare
# $2 = arch to prepare
set_kernel_source_dir "$1"
set_kernel_source_dir_and_kconfig "$1"
# Check that kernel-source exists
_check_kernel_dir "$1" || {
@ -868,6 +915,23 @@ prepare_kernel()
prepare_signing()
{
do_signing=0
if [[ ! -f "${kernel_config}" ]]; then
echo "Kernel config ${kernel_config} not found, modules won't be signed"
return
fi
if ! grep -q "^CONFIG_MODULE_SIG_HASH=" "${kernel_config}"; then
echo "The kernel is be built without module signing facility, modules won't be signed"
return
fi
sign_hash=$(grep "^CONFIG_MODULE_SIG_HASH=" "${kernel_config}" | cut -f2 -d= | sed 's/"//g')
# Lazy source in signing related configuration
read_framework_conf $dkms_framework_signing_variables
if [ ! "${sign_file}" ]; then
case "$running_distribution" in
debian* )
@ -879,10 +943,10 @@ prepare_signing()
sign_file="/usr/src/linux-headers-$kernelver/scripts/sign-file"
fi
;;
* )
sign_file="/lib/modules/$kernelver/build/scripts/sign-file"
;;
esac
if [[ ! -f "${sign_file}" ]]; then
sign_file="/lib/modules/$kernelver/build/scripts/sign-file"
fi
fi
echo "Sign command: $sign_file"
@ -892,9 +956,10 @@ prepare_signing()
fi
if [[ -z "${mok_signing_key}" ]]; then
# No custom key specified, use the default key created by update-secureboot-policy for Debian/Ubuntu
# No custom key specified, use the default key created by update-secureboot-policy for Ubuntu
# Debian's update-secureboot-policy has no --new-key option
case "$running_distribution" in
debian* | ubuntu* )
ubuntu* )
mok_signing_key="/var/lib/shim-signed/mok/MOK.priv"
mok_certificate="/var/lib/shim-signed/mok/MOK.der"
@ -909,6 +974,7 @@ prepare_signing()
fi
echo "Certificate or key are missing, generating them using update-secureboot-policy..."
SHIM_NOTRIGGER=y update-secureboot-policy --new-key &>/dev/null
update-secureboot-policy --enroll-key
fi
;;
@ -925,11 +991,25 @@ prepare_signing()
fi
echo "Public certificate (MOK): $mok_certificate"
if ( [ ! -f $mok_signing_key ] && [[ ! "$mok_signing_key" == *":"* ]] ) || [ ! -f $mok_certificate ]; then
# scripts/sign-file.c in kernel source also supports using "pkcs11:..." as private key
if [[ "$mok_signing_key" != "pkcs11:"* ]] && ( [ ! -f "$mok_signing_key" ] || [ ! -f "$mok_certificate" ] ); then
echo "Certificate or key are missing, generating self signed certificate for MOK..."
if ! command -v openssl >/dev/null; then
echo "openssl not found, can't generate key and certificate."
return
fi
openssl req -new -x509 -nodes -days 36500 -subj "/CN=DKMS module signing key" \
-newkey rsa:2048 -keyout $mok_signing_key \
-outform DER -out $mok_certificate > /dev/null 2>&1
-newkey rsa:2048 -keyout "$mok_signing_key" \
-outform DER -out "$mok_certificate" > /dev/null 2>&1
if [ ! -f "${mok_signing_key}" ]; then
echo "Key file ${mok_signing_key} not found and can't be generated, modules won't be signed"
return
fi
fi
if [ ! -f "${mok_certificate}" ]; then
echo "Certificate file ${mok_certificate} not found and can't be generated, modules won't be signed"
return
fi
do_signing=1
@ -941,8 +1021,6 @@ prepare_build()
# If the module has not been added, try to add it.
is_module_added "$module" "$module_version" || add_module
set_kernel_source_dir "$kernelver"
local -r base_dir="$dkms_tree/$module/$module_version/$kernelver/$arch"
local -r build_dir="$dkms_tree/$module/$module_version/build"
local -r source_dir="$dkms_tree/$module/$module_version/source"
@ -957,7 +1035,7 @@ prepare_build()
read_conf_or_die "$kernelver" "$arch"
# Error out if build_exclude is set
[[ $build_exclude ]] && die 9 \
[[ $build_exclude ]] && die 77 \
$"The $base_dir/dkms.conf for module $module includes a BUILD_EXCLUSIVE directive which does not match this kernel/arch/config."\
$"This indicates that it should not be built."
@ -966,8 +1044,6 @@ prepare_build()
$"The directory $source_dir does not appear to have module source located within it."\
$"Build halted."
prepare_kernel "$kernelver" "$arch"
# Set up temporary build directory for build
rm -rf "$build_dir"
cp -a "$source_dir/" "$build_dir"
@ -985,6 +1061,24 @@ prepare_build()
$"Check $build_dir for more information."
done
if [[ -e "${kernel_config}" ]]; then
if grep -q 'CONFIG_CC_IS_CLANG=y' "${kernel_config}"; then
local cc=clang
if command -v "$cc" >/dev/null; then
export CC="$cc"
export KERNEL_CC="$cc"
fi
fi
if grep -q 'CONFIG_LD_IS_LLD=y' "${kernel_config}"; then
local ld=ld.lld
if command -v "$ld" >/dev/null; then
export LD="$ld"
export KERNEL_LD="$ld"
fi
fi
fi
# Run the pre_build script
run_build_script pre_build "$pre_build"
}
@ -1006,13 +1100,6 @@ actual_build()
unset CC
fi
if [[ -e $kernel_source_dir/.config ]]; then
cc=$(sed -n 's|^CONFIG_CC_VERSION_TEXT="\([^ ]*\) .*"|\1|p' $kernel_source_dir/.config)
if command -v "$cc" >/dev/null; then
export CC="$cc"
fi
fi
invoke_command "$clean" "Cleaning build area" background
echo $"DKMS make.log for $module-$module_version for kernel $kernelver ($arch)" >> "$build_log"
date >> "$build_log"
@ -1047,9 +1134,9 @@ actual_build()
[[ ${strip[$count]} != no ]] && strip -g "$built_module"
if [ -n "${do_signing}" ]; then
if (( do_signing )); then
echo "Signing module $built_module"
eval '"$sign_file" sha512 "$mok_signing_key" "$mok_certificate" "$built_module"'
"$sign_file" "$sign_hash" "$mok_signing_key" "$mok_certificate" "$built_module"
fi
if [ "$module_compressed_suffix" = ".gz" ]; then
@ -1084,6 +1171,8 @@ clean_build()
do_build()
{
set_kernel_source_dir_and_kconfig "$kernelver"
prepare_kernel "$kernelver" "$arch"
prepare_signing
prepare_build
actual_build
@ -1157,96 +1246,102 @@ do_install()
# Save the original_module if one exists, none have been saved before, and this is the first module for this kernel
local lib_tree="$install_tree/$kernelver"
local any_module_installed
local count
for ((count=0; count < ${#built_module_name[@]}; count++)); do
echo $""
echo $"${dest_module_name[$count]}$module_suffix:"
# Check this version against what is already in the kernel
check_version_sanity "$kernelver" "$arch" "$obsolete_by" "${dest_module_name[$count]}" || continue
echo $""
echo $"${dest_module_name[$count]}$module_suffix:"
# Check this version against what is already in the kernel
check_version_sanity "$kernelver" "$arch" "$obsolete_by" "${dest_module_name[$count]}" || continue
if ((count == 0)) && ! run_build_script pre_install "$pre_install" && ! [[ $force ]]; then
die 101 $"pre_install failed, aborting install." \
$"You may override by specifying --force."
fi
local m=${dest_module_name[$count]}
local installed_modules=$(find_module "$lib_tree" "$m")
local module_count=${#installed_modules[@]}
echo $" - Original module"
local original_copy=$(compressed_or_uncompressed "$dkms_tree/$module/original_module/$kernelver/$arch" "$m")
if [[ -L $dkms_tree/$module/kernel-$kernelver-$arch &&
-n "$original_copy" ]]; then
echo $" - An original module was already stored during a previous install"
elif ! [[ -L $dkms_tree/$module/kernel-$kernelver-$arch ]]; then
local archive_pref1=$(compressed_or_uncompressed "$lib_tree/extra" "$m")
local archive_pref2=$(compressed_or_uncompressed "$lib_tree/updates" "$m")
local archive_pref3=$(compressed_or_uncompressed "$lib_tree${dest_module_location[$count]}" "$m")
local archive_pref4=""
((module_count == 1)) && archive_pref4=${installed_modules[0]}
local original_module=""
local found_orginal=""
for original_module in $archive_pref1 $archive_pref2 $archive_pref3 $archive_pref4; do
[[ -f $original_module ]] || continue
case "$running_distribution" in
debian* | ubuntu* )
;;
*)
echo $" - Found $original_module"
echo $" - Storing in $dkms_tree/$module/original_module/$kernelver/$arch/"
echo $" - Archiving for uninstallation purposes"
mkdir -p "$dkms_tree/$module/original_module/$kernelver/$arch"
mv -f "$original_module" "$dkms_tree/$module/original_module/$kernelver/$arch/"
;;
esac
found_original="yes"
break
done
if [[ ! $found_original ]] && ((module_count > 1)); then
echo $" - Multiple original modules exist but DKMS does not know which to pick"
echo $" - Due to the confusion, none will be considered during a later uninstall"
elif [[ ! $found_original ]]; then
echo $" - No original module exists within this kernel"
if ((count == 0)) && ! run_build_script pre_install "$pre_install" && ! [[ $force ]]; then
die 101 $"pre_install failed, aborting install." \
$"You may override by specifying --force."
fi
local m=${dest_module_name[$count]}
local installed_modules=$(find_module "$lib_tree" "$m")
local module_count=${#installed_modules[@]}
echo $" - Original module"
local original_copy=$(compressed_or_uncompressed "$dkms_tree/$module/original_module/$kernelver/$arch" "$m")
if [[ -L $dkms_tree/$module/kernel-$kernelver-$arch &&
-n "$original_copy" ]]; then
echo $" - An original module was already stored during a previous install"
elif ! [[ -L $dkms_tree/$module/kernel-$kernelver-$arch ]]; then
local archive_pref1=$(compressed_or_uncompressed "$lib_tree/extra" "$m")
local archive_pref2=$(compressed_or_uncompressed "$lib_tree/updates" "$m")
local archive_pref3=$(compressed_or_uncompressed "$lib_tree${dest_module_location[$count]}" "$m")
local archive_pref4=""
((module_count == 1)) && archive_pref4=${installed_modules[0]}
local original_module=""
local found_orginal=""
for original_module in $archive_pref1 $archive_pref2 $archive_pref3 $archive_pref4; do
[[ -f $original_module ]] || continue
case "$running_distribution" in
debian* | ubuntu* )
;;
*)
echo $" - Found $original_module"
echo $" - Storing in $dkms_tree/$module/original_module/$kernelver/$arch/"
echo $" - Archiving for uninstallation purposes"
mkdir -p "$dkms_tree/$module/original_module/$kernelver/$arch"
mv -f "$original_module" "$dkms_tree/$module/original_module/$kernelver/$arch/"
;;
esac
found_original="yes"
break
done
if [[ ! $found_original ]] && ((module_count > 1)); then
echo $" - Multiple original modules exist but DKMS does not know which to pick"
echo $" - Due to the confusion, none will be considered during a later uninstall"
elif [[ ! $found_original ]]; then
echo $" - No original module exists within this kernel"
fi
else
echo $" - This kernel never originally had a module by this name"
fi
else
echo $" - This kernel never originally had a module by this name"
fi
if ((module_count > 1)); then
echo $" - Multiple same named modules!"
echo $" - $module_count named $m$module_suffix in $lib_tree/"
case "$running_distribution" in
debian* | ubuntu* )
;;
*)
echo $" - All instances of this module will now be stored for reference purposes ONLY"
echo $" - Storing in $dkms_tree/$module/original_module/$kernelver/$arch/collisions/"
;;
esac
for module_dup in $(find_module "$lib_tree" "$m"); do
dup_tree="${module_dup#$lib_tree}";
dup_name="${module_dup##*/}"
dup_tree="${dup_tree/${dup_name}}"
if ((module_count > 1)); then
echo $" - Multiple same named modules!"
echo $" - $module_count named $m$module_suffix in $lib_tree/"
case "$running_distribution" in
debian* | ubuntu* )
;;
*)
echo $" - Stored $module_dup"
mkdir -p "$dkms_tree/$module/original_module/$kernelver/$arch/collisions/$dup_tree"
mv -f $module_dup "$dkms_tree/$module/original_module/$kernelver/$arch/collisions/$dup_tree"
;;
echo $" - All instances of this module will now be stored for reference purposes ONLY"
echo $" - Storing in $dkms_tree/$module/original_module/$kernelver/$arch/collisions/"
;;
esac
done
fi
for module_dup in $(find_module "$lib_tree" "$m"); do
dup_tree="${module_dup#$lib_tree}";
dup_name="${module_dup##*/}"
dup_tree="${dup_tree/${dup_name}}"
case "$running_distribution" in
debian* | ubuntu* )
;;
*)
echo $" - Stored $module_dup"
mkdir -p "$dkms_tree/$module/original_module/$kernelver/$arch/collisions/$dup_tree"
mv -f $module_dup "$dkms_tree/$module/original_module/$kernelver/$arch/collisions/$dup_tree"
;;
esac
done
fi
# Copy module to its location
echo $" - Installation"
echo $" - Installing to $install_tree/$kernelver${dest_module_location[$count]}/"
mkdir -p $install_tree/$kernelver${dest_module_location[$count]}
[[ $symlink_modules ]] && symlink="-s"
local toinstall=$(compressed_or_uncompressed "$base_dir/module" "$m")
cp -f $symlink "$toinstall" "$install_tree/$kernelver${dest_module_location[$count]}/${toinstall##*/}"
# Copy module to its location
echo $" - Installation"
echo $" - Installing to $install_tree/$kernelver${dest_module_location[$count]}/"
mkdir -p $install_tree/$kernelver${dest_module_location[$count]}
[[ $symlink_modules ]] && symlink="-s"
local toinstall=$(compressed_or_uncompressed "$base_dir/module" "$m")
cp -f $symlink "$toinstall" "$install_tree/$kernelver${dest_module_location[$count]}/${toinstall##*/}"
any_module_installed=1
done
if ((${#built_module_name[@]} > 0)) && [[ ! "${any_module_installed}" ]]; then
die 6 $"Installation aborted."
fi
# Create the kernel-<kernelver> symlink to designate this version as active
rm -f "$dkms_tree/$module/kernel-$kernelver-$arch" 2>/dev/null
ln -s "$module_version/$kernelver/$arch" "$dkms_tree/$module/kernel-$kernelver-$arch" 2>/dev/null
@ -1266,12 +1361,12 @@ do_install()
do_uninstall "$kernelver" "$arch"
die 6 $"Problems with depmod detected. Automatically uninstalling this module." \
$"Install Failed (depmod problems). Module rolled back to built state."
exit 6
exit 6
}
if [[ $modprobe_on_install ]]; then
# Make the newly installed modules available immediately
find /sys/devices -name modalias -print0 | xargs -0 cat | xargs modprobe -a -b -q
find /sys/devices -name modalias -print0 | xargs -0 cat | sort -u | xargs modprobe -a -b -q
if [ -f /lib/systemd/system/systemd-modules-load.service ]; then
systemctl restart systemd-modules-load.service
fi
@ -1407,7 +1502,7 @@ find_actual_dest_module_location()
for l in $locations; do
installed=$(compressed_or_uncompressed "${install_tree}/${kernelver}${l}" "${dest_module_name[${count}]}")
if [[ -n "${installed}" ]] && diff "${dkms_owned}" "${installed}" > /dev/null 2>&1; then
if [[ -n "${installed}" ]] && compare_module_version "${dkms_owned}" "${installed}" &>/dev/null; then
echo "${l}"
return 0
fi
@ -1445,15 +1540,16 @@ do_uninstall()
echo $""
echo $"${dest_module_name[$count]}$module_suffix:"
echo $" - Uninstallation"
echo $" - Deleting from: $install_tree/$1${real_dest_module_location}/"
rm -f "$install_tree/$1${real_dest_module_location}/${dest_module_name[$count]}$module_uncompressed_suffix"*
dir_to_remove="${real_dest_module_location#/}"
while [ "${dir_to_remove}" != "${dir_to_remove#/}" ]; do
dir_to_remove="${dir_to_remove#/}"
done
# dir_to_remove may be an empty string
if [[ -d "$dir_to_remove" ]]; then
if [[ "${real_dest_module_location}" ]]; then
echo $" - Deleting from: $install_tree/$1${real_dest_module_location}/"
rm -f "$install_tree/$1${real_dest_module_location}/${dest_module_name[$count]}$module_uncompressed_suffix"*
dir_to_remove="${real_dest_module_location#/}"
while [ "${dir_to_remove}" != "${dir_to_remove#/}" ]; do
dir_to_remove="${dir_to_remove#/}"
done
(if cd "$install_tree/$1"; then rpm -qf "${dir_to_remove}" >/dev/null 2>&1 || rmdir -p --ignore-fail-on-non-empty "${dir_to_remove}"; fi || true)
else
echo $" - Module was not found within $install_tree/$1/"
fi
echo $" - Original module"
local origmod=$(compressed_or_uncompressed "$dkms_tree/$module/original_module/$1/$2" "${dest_module_name[$count]}")
@ -1868,7 +1964,7 @@ load_tarball()
trap "rm -rf $temp_dir_name" EXIT
tar -xaf $archive_location -C $temp_dir_name
if [[ ! $temp_dir_name/dkms_main_tree ]]; then
if [[ ! -d $temp_dir_name/dkms_main_tree ]]; then
# Tarball was not generated from mktarball.
# Just find the dkms.conf file and load the source.
conf=$(find $temp_dir_name/ -name dkms.conf 2>/dev/null | head -n 1)
@ -1948,7 +2044,7 @@ load_tarball()
run_match()
{
set_kernel_source_dir "$kernelver"
set_kernel_source_dir_and_kconfig "$kernelver"
# Error if $template_kernel is unset
if [[ ! $template_kernel ]]; then
@ -1989,8 +2085,8 @@ run_match()
# Iterate over the kernel_status and match kernel to the template_kernel
while read template_line; do
template_module=`echo "$template_line" | awk {'print $1'} | sed 's/,$//'`
template_version=`echo "$template_line" | awk {'print $2'} | sed 's/,$//'`
template_module=$(echo "$template_line" | awk {'print $1'} | sed 's/,$//')
template_version=$(echo "$template_line" | awk {'print $2'} | sed 's/,$//')
# Print out a match header
echo $"Module: $template_module"
@ -2109,29 +2205,33 @@ add_source_tree() {
# functionality, and makes it much easier to reinstall DKMS kernel modules
# by hand if dkms_autoinstaller is not used.
autoinstall() {
local status mv mvka m v k a last_v last_m tenative
local install_count next_depends
local status mv mvka m v k a
local progress next_depends
local -a to_install=()
local -a next_install=()
local -a known_modules=()
local -a installed_modules=()
local -a skipped_modules=()
local -a failed_modules=()
local -A build_depends=()
local -A latest=()
# Walk through our list of installed and built modules, and create
# a list of modules that need to be reinstalled.
# Assuming all versions of same module to be parsed sequentially.
# a list of modules and their latest version.
while read status mvka; do
IFS='/' read m v k a <<< "$mvka"
[[ ! $last_m ]] && last_m="$m"
# autoinstall previous module's latest version after its deps.
if [[ $last_m != $m ]]; then
if [[ $tenative ]]; then
to_install[${#to_install[@]}]="$tenative"
build_depends["$last_m"]="${BUILD_DEPENDS[@]}"
fi
last_m="$m"
last_v='0'
tenative=''
if [[ -z "${latest["$m"]}" ]]; then
known_modules[${#known_modules[@]}]="$m"
latest["$m"]="$v"
elif [[ ("$(VER "$v")" > "$(VER "${latest["$m"]}")") ]]; then
latest["$m"]="$v"
fi
done < <(module_status)
# Walk through our list of known modules, and create
# a list of modules that need to be reinstalled.
for m in "${known_modules[@]}"; do
v="${latest["$m"]}"
# If the module is already installed or weak-installed, skip it.
if _is_module_installed "$m" "$v" "$kernelver" "$arch"; then
installed_modules[${#installed_modules[@]}]="$m"
@ -2141,36 +2241,27 @@ autoinstall() {
installed_modules[${#installed_modules[@]}]="$m"
continue
fi
# if the module does not want to be autoinstalled, skip it.
read_conf_or_die "$k" "$a" "$dkms_tree/$m/$v/source/dkms.conf"
# If the module does not want to be autoinstalled, skip it.
read_conf_or_die "$kernelver" "$arch" "$dkms_tree/$m/$v/source/dkms.conf"
if [[ ! $AUTOINSTALL ]]; then
continue
fi
# otherwise, only autoinstall the latest version we have hanging around.
if [[ ($(VER $v) > $(VER $last_v)) ]]; then
last_v="$v"
tenative="$m/$v"
fi
done < <(module_status)
# We may have exited the loop with $tenative set. If it is,
# it contains something that should be updated.
if [[ $tenative ]]; then
to_install[${#to_install[@]}]="$tenative"
# Otherwise, autoinstall the latest version we have hanging around.
to_install[${#to_install[@]}]="$m/$v"
build_depends["$m"]="${BUILD_DEPENDS[@]}"
fi
done
[[ $to_install ]] || return 0
while true; do
install_count=0
progress=0
next_install=( )
# Step 1: Remove installed modules from all dependency lists.
for m in ${!build_depends[@]}; do
next_depends=
for d in ${build_depends[$m]}; do
for i in ${installed_modules[@]}; do
for i in ${installed_modules[@]} ${skipped_modules[@]}; do
[[ "$d" = "$i" ]] && continue 2
done
next_depends+="$d "
@ -2183,8 +2274,16 @@ autoinstall() {
IFS=/ read m v <<< "$mv"
if [[ -z "${build_depends[$m]}" ]]; then
(module="$m" module_version="$v" kernelver="$kernelver" arch="$arch" install_module)
installed_modules[${#installed_modules[@]}]="$m"
install_count=$(($install_count +1))
status=$?
if [ "$status" = 0 ]; then
installed_modules[${#installed_modules[@]}]="$m"
progress=$(($progress +1))
elif [ "$status" = 77 ]; then
skipped_modules[${#skipped_modules[@]}]="$m"
progress=$(($progress +1))
else
failed_modules[${#failed_modules[@]}]="$m($status)"
fi
else
next_install[${#next_install[@]}]="$mv"
fi
@ -2192,19 +2291,37 @@ autoinstall() {
wait
# Step 3: Keep going if at least one module was installed during
# this iteration.
[[ "$install_count" -gt 0 ]] || break;
# Step 4: Remove modules that were installed during Step 2 from
# the job queue.
# Step 3: Remove modules that install was attempted for
# during Step 2 from the job queue.
to_install=( "${next_install[@]}" )
# Step 4: Keep going if at least one module was installed during
# this iteration.
[[ "$progress" -gt 0 ]] || break;
done
if [[ "${#installed_modules[@]}" -gt 0 ]]; then
echo "dkms autoinstall on $kernelver/$arch succeeded for ${installed_modules[@]}"
fi
if [[ "${#skipped_modules[@]}" -gt 0 ]]; then
echo "dkms autoinstall on $kernelver/$arch was skipped for ${skipped_modules[@]}"
fi
if [[ "${#failed_modules[@]}" -gt 0 ]]; then
echo "dkms autoinstall on $kernelver/$arch failed for ${failed_modules[@]}"
fi
for mv in "${to_install[@]}"; do
IFS=/ read m v <<< "$mv"
echo "$m/$v autoinstall failed due to missing dependencies: ${build_depends[$m]}"
done
if [[ "${#failed_modules[@]}" -gt 0 || "${#to_install[@]}" -gt 0 ]]; then
die 11 $"One or more modules failed to install during autoinstall." \
$"Refer to previous errors for more information."
fi
}
#############################
@ -2226,6 +2343,7 @@ unset CC CXX CFLAGS CXXFLAGS LDFLAGS
# Set important variables
current_kernel=$(uname -r)
current_os=$(uname -s)
running_distribution=$(distro_version)
dkms_tree="/var/lib/dkms"
source_tree="/usr/src"
install_tree="/lib/modules"
@ -2233,16 +2351,21 @@ tmp_location=${TMPDIR:-/tmp}
verbose=""
symlink_modules=""
# Check that we can write temporary files
tmpfile=$(mktemp_or_die)
echo "Hello, DKMS!" > "$tmpfile"
if [ "$(cat "$tmpfile")" != "Hello, DKMS!" ]; then
warn $"dkms will not function properly without some free space in \$TMPDIR ($tmp_location)."
fi
rm -f "$tmpfile"
# These can come from the environment or the config file
[[ ! ${ADDON_MODULES_DIR} && -e /etc/sysconfig/module-init-tools ]] && . /etc/sysconfig/module-init-tools
addon_modules_dir="${ADDON_MODULES_DIR}"
[[ ! ${addon_modules_dir} ]] && running_distribution="$(distro_version)"
weak_modules="${WEAK_MODULES_BIN}"
# Source in configuration
for i in /etc/dkms/framework.conf /etc/dkms/framework.conf.d/*.conf; do
[[ -e "${i}" ]] && . "$i" >/dev/null
done
# Source in configuration not related to signing
read_framework_conf $dkms_framework_nonsigning_variables
# Clear out command line argument variables
@ -2251,6 +2374,7 @@ module_version=""
template_kernel=""
conf=""
kernel_config=""
kconfig_fromcli=""
archive_location=""
kernel_source_dir=""
ksourcedir_fromcli=""
@ -2273,7 +2397,6 @@ die_is_fatal="yes"
[ -x /sbin/weak-modules ] && weak_modules='/sbin/weak-modules'
[ -x /usr/lib/module-init-tools/weak-modules ] && weak_modules='/usr/lib/module-init-tools/weak-modules'
no_depmod=""
modprobe_on_install=""
action_re='^(remove|(auto|un)?install|match|mktarball|(un)?build|add|status|ldtarball)$'
@ -2351,6 +2474,7 @@ while (($# > 0)); do
;;
--config*)
read_arg kernel_config "$1" "$2" || shift
kconfig_fromcli="true"
;;
--archive*)
read_arg archive_location "$1" "$2" || shift
@ -2380,7 +2504,7 @@ while (($# > 0)); do
-j)
read_arg parallel_jobs "$1" "$2" || shift
;;
-*|--*)
-*)
error $" Unknown option: $1"
show_usage
exit 2
@ -2407,6 +2531,12 @@ done
# Sanity checking
# The <(cmd) idiom does not work if /proc is not mounted
read line < <(echo "Hello, DKMS!")
if [ "$line" != "Hello, DKMS!" ]; then
warn $"dkms will not function properly if /proc is not mounted."
fi
# Error out if binaries-only is set and source-only is set
if [[ $binaries_only && $source_only ]]; then
die 8 $" You have specified both --binaries-only and --source-only." \

View File

@ -23,13 +23,12 @@ elif [ -f /etc/rc.d/init.d/functions ]; then
. /etc/rc.d/init.d/functions
fi
# We only have these functions on debian/ubuntu
# We only have these functions on Debian/Ubuntu
# so on other distros just stub them out
if [ ! -f /etc/debian_version ]; then
alias log_daemon_msg=/bin/echo
alias log_daemon_msg='/bin/echo -n'
log_end_msg() { if [ "$1" = "0" ]; then echo " Done. "; else echo " Failed. "; fi; }
alias log_action_begin_msg=log_daemon_msg
alias log_action_end_msg=log_end_msg
alias log_action_msg=/bin/echo
fi
exec="/usr/sbin/dkms"
@ -39,15 +38,38 @@ test -f $exec || exit 0
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
uname_s=$(uname -s)
_get_kernel_dir() {
KVER=$1
case ${uname_s} in
Linux) DIR="/lib/modules/$KVER/build" ;;
GNU/kFreeBSD) DIR="/usr/src/kfreebsd-headers-$KVER/sys" ;;
esac
echo $DIR
}
_check_kernel_dir() {
DIR=$(_get_kernel_dir $1)
case ${uname_s} in
Linux) test -e $DIR/include ;;
GNU/kFreeBSD) test -e $DIR/kern && test -e $DIR/conf/kmod.mk ;;
*) return 1 ;;
esac
return $?
}
case "$1" in
start)
if [ -n "$2" ]; then
kernel="$2"
else
kernel=`uname -r`
kernel=$(uname -r)
fi
if [ -f /etc/dkms/no-autoinstall ]; then
log_action_msg "$prog: autoinstall for dkms modules has been disabled"
elif ! _check_kernel_dir $kernel; then
log_action_msg "$prog: autoinstall for kernel $kernel was skipped since the kernel headers for this kernel do not seem to be installed"
else
log_daemon_msg "$prog: running auto installation service for kernel $kernel"
dkms autoinstall --kernelver $kernel
@ -60,6 +82,6 @@ case "$1" in
# Ignore others on debian/ubuntu too
;;
*)
echo $"Usage: $0 {start}"
echo "Usage: $0 {start}"
exit 2
esac

View File

@ -63,8 +63,8 @@ _get_newest_kernel_debian() {
fi
# if $kernel is greater than $COMPARE_TO
if [ `dpkg --compare-versions "$KERNEL_VERSION-$ABI" ge "$COMPARE_TO" && echo "yes" || \
echo "no"` = "yes" ]; then
if [ $(dpkg --compare-versions "$KERNEL_VERSION-$ABI" ge "$COMPARE_TO" && echo "yes" || \
echo "no") = "yes" ]; then
NEWEST_KERNEL=$KERNEL
NEWEST_VERSION=$KERNEL_VERSION
NEWEST_ABI=$ABI
@ -91,14 +91,14 @@ get_newest_kernel() {
CURRENT_ABI=${CURRENT_ABI%%-*}
NEWEST_KERNEL=$(_get_newest_kernel_debian "$CURRENT_VERSION-$CURRENT_ABI")
elif [ `which rpm >/dev/null` ]; then
elif which rpm >>/dev/null 2>&1; then
# If RPM based
NEWEST_KERNEL=$(_get_newest_kernel_rhel)
fi
# Make sure that kernel name that we extracted corresponds to an installed
# kernel
if [ -n "$NEWEST_KERNEL" ] && [ `_is_kernel_name_correct $NEWEST_KERNEL` = "no" ]; then
if [ -n "$NEWEST_KERNEL" ] && [ $(_is_kernel_name_correct $NEWEST_KERNEL) = "no" ]; then
NEWEST_KERNEL=
fi
@ -127,7 +127,7 @@ if [ -r /etc/dkms/framework.conf ]; then
. /etc/dkms/framework.conf
fi
KERNELS=$(ls /lib/modules/ 2>/dev/null || true)
KERNELS=$(ls -v /lib/modules/ 2>/dev/null || true)
CURRENT_KERNEL=$(uname -r)
#We never want to keep an older version side by side to prevent conflicts
@ -156,7 +156,7 @@ elif [ -d "/usr/src/$NAME-$VERSION" ]; then
fi
# On 1st installation, let us look for a directory
# in /lib/modules which matches `uname -r`. If none
# in /lib/modules which matches $(uname -r). If none
# is found it is possible that buildd is being used
# and that uname -r is giving us the name of the
# kernel used by the buildd machine.
@ -178,7 +178,7 @@ NEWEST_KERNEL=$(get_newest_kernel)
if [ -z "$autoinstall_all_kernels" ]; then
# If the current kernel is installed on the system or chroot
if [ `_is_kernel_name_correct $CURRENT_KERNEL` = "yes" ]; then
if [ $(_is_kernel_name_correct $CURRENT_KERNEL) = "yes" ]; then
if [ -n "$NEWEST_KERNEL" ] && [ ${CURRENT_KERNEL} != ${NEWEST_KERNEL} ]; then
KERNELS="$CURRENT_KERNEL $NEWEST_KERNEL"
else
@ -216,8 +216,8 @@ if [ -n "$ARCH" ]; then
fi
for KERNEL in $KERNELS; do
dkms_status=`dkms status -m $NAME -v $VERSION -k $KERNEL $ARCH`
if [ `echo $KERNEL | grep -c "BOOT"` -gt 0 ]; then
dkms_status=$(dkms status -m $NAME -v $VERSION -k $KERNEL $ARCH)
if [ $(echo $KERNEL | grep -c "BOOT") -gt 0 ]; then
echo ""
echo "Module build and install for $KERNEL was skipped as "
echo "it is a BOOT variant"
@ -226,7 +226,7 @@ for KERNEL in $KERNELS; do
#if the module isn't yet built, try to build it
if [ `echo $dkms_status | grep -c ": built"` -eq 0 ]; then
if [ $(echo $dkms_status | grep -c ": built") -eq 0 ]; then
if [ ! -L /var/lib/dkms/$NAME/$VERSION/source ]; then
echo "This package appears to be a binaries-only package"
echo " you will not be able to build against kernel $KERNEL"
@ -238,7 +238,7 @@ for KERNEL in $KERNELS; do
set +e
dkms build -m $NAME -v $VERSION -k $KERNEL $ARCH > /dev/null
case $? in
9)
77)
set -e
echo "Skipped."
continue
@ -251,7 +251,7 @@ for KERNEL in $KERNELS; do
exit $?
;;
esac
dkms_status=`dkms status -m $NAME -v $VERSION -k $KERNEL $ARCH`
dkms_status=$(dkms status -m $NAME -v $VERSION -k $KERNEL $ARCH)
else
echo "Module build for kernel $KERNEL was skipped since the"
echo "kernel headers for this kernel do not seem to be installed."
@ -259,8 +259,8 @@ for KERNEL in $KERNELS; do
fi
#if the module is built (either pre-built or just now), install it
if [ `echo $dkms_status | grep -c ": built"` -eq 1 ] &&
[ `echo $dkms_status | grep -c ": installed"` -eq 0 ]; then
if [ $(echo $dkms_status | grep -c ": built") -eq 1 ] &&
[ $(echo $dkms_status | grep -c ": installed") -eq 0 ]; then
dkms install -m $NAME -v $VERSION -k $KERNEL $ARCH
fi
done

View File

@ -1,4 +1,4 @@
#! /bin/sh
#!/bin/bash
# heavily based upon find-suggests.ksyms by Andreas Gruenbacher <agruen@suse.de>.
# with modifications by Michael Brown <Michael_E_Brown@dell.com>

View File

@ -25,12 +25,17 @@
# non-null value:
# autoinstall_all_kernels=""
# Location of the sign-file kernel binary (default: depends on distribution):
# Location of the sign-file kernel binary. $kernelver can be used in path to
# represent the target kernel version. (default: depends on distribution):
# sign_file="/path/to/sign-file"
# Location of the key and certificate used for Secure boot (default: /var/lib/dkms):
# Location of the key and certificate files used for Secure boot. $kernelver
# can be used in path to represent the target kernel version.
# mok_signing_key can also be a "pkcs11:..." string for PKCS#11 engine, as
# long as the sign_file program supports it.
# (default: /var/lib/dkms):
# mok_signing_key=/var/lib/dkms/mok.key
# mok_certificate=/var/lib/dkms/mok.pub
# Automatically modprobe the built modules upon succesful installation:
# Automatically modprobe the built modules upon successful installation:
# modprobe_on_install="true"

BIN
images/mok-key-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
images/mok-key-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
images/mok-key-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
images/mok-key-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
images/mok-key-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
images/mok-key-6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -42,7 +42,7 @@
# * Changes in 1.2
# - Fixed more bash'isms
# - LSB_VERSION is no longer required in /etc/lsb-release file
#
#
# * Changes in 1.1
# - removed some bash-ism and typos
# Notice: script remains broken with ash because of awk issues
@ -101,8 +101,8 @@ DESCSTR_DELI="release"
###############################################################################
# Display Program Version for internal use (needed by help2man)
DisplayProgramVersion() {
echo "FSG `basename $0` v$SCRIPTVERSION"
DisplayProgramVersion() {
echo "FSG $(basename $0) v$SCRIPTVERSION"
echo
echo "Copyright (C) 2000, 2002, 2004 Free Standards Group, Inc."
echo "This is free software; see the source for copying conditions. There\
@ -117,11 +117,11 @@ DisplayProgramVersion() {
# defines the Usage for lsb_release
Usage() {
echo "FSG `basename $0` v$SCRIPTVERSION prints certain LSB (Linux\
echo "FSG $(basename $0) v$SCRIPTVERSION prints certain LSB (Linux\
Standard Base) and"
echo "Distribution information."
echo
echo "Usage: `basename $0` [OPTION]..."
echo "Usage: $(basename $0) [OPTION]..."
echo "With no OPTION specified defaults to -v."
echo
echo "Options:"
@ -193,7 +193,7 @@ GetLSBInfo() {
then
for tag in "$INFO_ROOT/$INFO_LSB_DIR/"*
do
LSB_VERSION=$LSB_VERSION:`basename $tag`
LSB_VERSION=$LSB_VERSION:$(basename $tag)
done
fi
}
@ -389,7 +389,7 @@ else
fi
fi
# Update args to All if requested
# Update args to All if requested
if [ -n "$ARG_A" ]
then
[ -z "$ARG_C" ] && ARG_C="y"

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
A sample module to test dkms.
A sample module and framework files to test dkms.

View File

@ -0,0 +1,3 @@
all:
@echo ERROR: This module fails to build.
@exit 1

View File

@ -0,0 +1,6 @@
PACKAGE_NAME="dkms_build_exclusive_dependencies_test"
PACKAGE_VERSION="1.0"
BUILD_DEPENDS="dkms_build_exclusive_test"
DEST_MODULE_LOCATION="/updates/dkms"
BUILD_EXCLUSIVE_ARCH="none"
AUTOINSTALL="yes"

View File

@ -0,0 +1,3 @@
all:
@echo ERROR: This module fails to build.
@exit 1

View File

@ -0,0 +1,5 @@
PACKAGE_NAME="dkms_build_exclusive_test"
PACKAGE_VERSION="1.0"
DEST_MODULE_LOCATION="/updates/dkms"
BUILD_EXCLUSIVE_ARCH="none"
AUTOINSTALL="yes"

View File

@ -0,0 +1,3 @@
PACKAGE_NAME="dkms_conf_test"
PACKAGE_VERSION="1.0"
DEST_MODULE_LOCATION="/updates-dkms-test"

View File

View File

@ -0,0 +1,6 @@
PACKAGE_NAME="dkms_conf_test"
PACKAGE_VERSION="1.0"
DEST_MODULE_NAME[0]="bar.ko"
DEST_MODULE_LOCATION="/wrong/path"
BUILT_MODULE_NAME[1]="bar.o"
DEST_MODULE_NAME[1]="foo"

View File

View File

@ -0,0 +1,3 @@
PACKAGE_NAME="dkms_conf_test"
PACKAGE_VERSION="1.0"
AUTOINSTALL="yes"

View File

@ -0,0 +1,3 @@
all:
@echo ERROR: This module should never build.
@exit 1

View File

@ -0,0 +1,11 @@
PACKAGE_NAME="dkms_dependencies_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_dependencies_test"
BUILD_DEPENDS="dkms_failing_test"
MAKE="make all"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,7 @@
obj-m += dkms_emptyver_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,7 @@
PACKAGE_NAME="dkms_emptyver_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_emptyver_test"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,21 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms test module with empty version");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS Test Module - Loaded\n");
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);
MODULE_VERSION("");

View File

@ -0,0 +1,3 @@
all:
@echo ERROR: This module fails to build.
@exit 1

View File

@ -0,0 +1,9 @@
PACKAGE_NAME="dkms_failing_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_failing_test"
MAKE="make all"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,7 @@
obj-m += dkms_multiver_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,5 @@
PACKAGE_NAME="dkms_multiver_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_multiver_test"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,23 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define DKMS_TEST_VER "1.0"
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms multiver test module");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS MultiVer Test Module -%s Loaded\n",DKMS_TEST_VER);
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms multiver test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);
MODULE_VERSION(DKMS_TEST_VER);

View File

@ -0,0 +1,7 @@
obj-m += dkms_multiver_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,5 @@
PACKAGE_NAME="dkms_multiver_test"
PACKAGE_VERSION="2.0"
BUILT_MODULE_NAME="dkms_multiver_test"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,23 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define DKMS_TEST_VER "2.0"
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms multiver test module");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS MultiVer Test Module -%s Loaded\n",DKMS_TEST_VER);
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms multiver test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);
MODULE_VERSION(DKMS_TEST_VER);

View File

@ -0,0 +1,7 @@
obj-m += dkms_nover_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,7 @@
PACKAGE_NAME="dkms_nover_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_nover_test"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,20 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms test module with no version");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS Test Module - Loaded\n");
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);

View File

@ -0,0 +1,7 @@
obj-m += dkms_nover_update_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,12 @@
PACKAGE_NAME="dkms_nover_update_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_nover_update_test"
# MAKE="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
# CLEAN="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build M=$PWD clean"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,20 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms test module with no version");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS Test Module - Loaded\n");
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);

View File

@ -0,0 +1,7 @@
obj-m += dkms_nover_update_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,12 @@
PACKAGE_NAME="dkms_nover_update_test"
PACKAGE_VERSION="2.0"
BUILT_MODULE_NAME="dkms_nover_update_test"
# MAKE="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
# CLEAN="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build M=$PWD clean"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,20 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms test module with no version!");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS Test Module - Loaded\n");
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);

View File

@ -0,0 +1,7 @@
obj-m += dkms_nover_update_test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

View File

@ -0,0 +1,12 @@
PACKAGE_NAME="dkms_nover_update_test"
PACKAGE_VERSION="3.0"
BUILT_MODULE_NAME="dkms_nover_update_test"
# MAKE="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
# CLEAN="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build M=$PWD clean"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,20 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple dkms test module with no version!");
static int __init dkms_test_init(void)
{
printk(KERN_INFO "DKMS Test Module - Loaded\n");
return 0;
}
static void __exit dkms_test_cleanup(void)
{
printk(KERN_INFO "Cleaning up after dkms test module.\n");
}
module_init(dkms_test_init);
module_exit(dkms_test_cleanup);

View File

@ -1,12 +1,7 @@
PACKAGE_NAME="dkms_test"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME="dkms_test"
# MAKE="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
# CLEAN="make -C /lib/modules/${kernelver}/build SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build M=$PWD clean"
AUTOINSTALL="yes"
DEST_MODULE_LOCATION="/kernel/extra"

View File

@ -0,0 +1,3 @@
# The key file will be generated by openssl. Use a temporary path to avoid corrupting the default private key file on the system
mok_signing_key="/tmp/dkms_test_private_key"
mok_certificate="/no/such/path.crt"

View File

@ -0,0 +1 @@
mok_signing_key="/no/such/path.key"

View File

@ -0,0 +1 @@
sign_file="/no/such/file"

View File

@ -0,0 +1,3 @@
do_status() {
echo "do_status() is hijacked!"
}

View File

@ -0,0 +1,2 @@
mok_signing_key="/tmp/dkms_test_private_key"
mok_certificate="/tmp/dkms_test_certificate"

View File

@ -0,0 +1,3 @@
sign_file="/lib/modules/${kernelver}/build/scripts/sign-file"
mok_signing_key="/tmp/dkms_test_dir_${kernelver}/key"
mok_certificate="/tmp/dkms_test_dir_${kernelver}/cert"