Skip to content
Snippets Groups Projects
find_module_symvers 1.84 KiB
Newer Older
#!/usr/bin/env python3

import os
import sys
import subprocess

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='')
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]
            '/var/lib/dkms',
            modname,
            modvers,
            mkvers,
        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)
#We only get here if we did not find the symvers above
exit("Module '{}' symvers file could not be found.".format(modname))