Newer
Older
#!/usr/bin/env python3
import os
import sys
import subprocess
import argparse

Ezekiel Dohmen
committed
def print_symvers_in_dir_and_exit(modsymDir):
#Support dkms installations with multiple .symvers files
symversFiles = []
for (dirpath, dirnames, filenames) in os.walk(modsymDir):
for filename in filenames:
if filename.endswith(".symvers"):
symversFiles.append(dirpath + "/" + filename)
if len(symversFiles) > 0:
for fileName in symversFiles:
print(fileName + " ", end='')

Ezekiel Dohmen
committed
exit()
parser = argparse.ArgumentParser(description='A utility to search for symvers files for dkms kernel modules')
parser.add_argument('modname', help='Name of the module to search for a symvers file for.')
parser.add_argument('-q', '--quiet', default=False, action='store_true', help='Request no output on errors')
args = parser.parse_args()
modname = args.modname
quiet_err = args.quiet
uname = os.uname()
modstat = subprocess.run(
['/usr/sbin/dkms', '-k', uname.release, 'status', modname],
capture_output=True, text=True,
)
if modstat.returncode == 0 and modstat.stdout:
modstat = modstat.stdout.split(':')[0].split(', ')
if len(modstat) >= 4:
modvers = modstat[1]
mkvers = modstat[2]
march = modstat[3]

Ezekiel Dohmen
committed
modsymDir = os.path.join(
'/var/lib/dkms',
modname,
modvers,
mkvers,

Ezekiel Dohmen
committed
march

Ezekiel Dohmen
committed
print_symvers_in_dir_and_exit(modsymDir)
#If the above code did not exit the module was not found in a dkms installation
#search the manual install location
modsymDir = os.path.join('/var/cache', modname)
print_symvers_in_dir_and_exit(modsymDir)

Ezekiel Dohmen
committed
#We only get here if we did not find the symvers above
if quiet_err:
exit(1)
exit("Module '{}' symvers file could not be found.".format(modname))