Skip to content

Instantly share code, notes, and snippets.

@shawnanastasio
Created November 17, 2018 10:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shawnanastasio/2be9d896326b5179dd89615ab0716e92 to your computer and use it in GitHub Desktop.
Save shawnanastasio/2be9d896326b5179dd89615ab0716e92 to your computer and use it in GitHub Desktop.
Automatic syslinux.cfg generator for petitboot
#!/usr/bin/env python3
import os
import re
import sys
BOOT_DIR = "/boot/"
ENTRY_NAME_PREFIX = "Gentoo Linux"
APPEND = "crypt_root=UUID=76543706-8215-4e11-bbfb-8acf447d6bb7 root=/dev/mapper/root"
KERNEL_RE = "vmlinux.*[0-9]+\.[0-9]+\.[0-9]+.*"
INITRD_RE = "initramfs.*[0-9]+\.[0-9]+\.[0-9]+.*"
def file_modified_key(elem):
return os.path.getmtime(BOOT_DIR + elem)
def get_version_from_filename(filename):
# Assumes file ends with version.
# Ex. "vmlinux-4.18.10-gentoo" returns "4.18.10-gentoo"
return re.findall(".*([0-9]+\.[0-9]+\.[0-9]+.*)", filename)[0]
def generate_entry_name(version):
return ENTRY_NAME_PREFIX + " " + version
def generate_entry(kernel, initrd):
version = get_version_from_filename(kernel)
output = "LABEL " + generate_entry_name(version) + "\n"
output += "\tKERNEL /" + kernel + "\n"
if initrd is not None:
output += "\tINITRD /" + initrd + "\n"
output += "\tAPPEND " + APPEND + "\n"
return output
def main():
kernels = [f for f in os.listdir(BOOT_DIR) if re.match(KERNEL_RE, f)]
initrds = [f for f in os.listdir(BOOT_DIR) if re.match(INITRD_RE, f)]
# Sort by date modified
kernels.sort(key=file_modified_key, reverse=True)
initrds.sort(key=file_modified_key, reverse=True)
if len(kernels) == 0:
sys.stderr.write("No kernels found! Check BOOT_DIR and KERNEL_RE!\n")
sys.exit(1)
# Generate syslinux. Use the newest kernel as default.
sysconfig_out = "DEFAULT " + generate_entry_name(get_version_from_filename(kernels[0])) + "\n"
for i in range(len(kernels)):
version = get_version_from_filename(kernels[i])
# Get the matching initrd if it was found
try:
initrd = [x for x in initrds if get_version_from_filename(x) == version][0]
except:
initrd = None
# Generate entry and append to output
sysconfig_out += generate_entry(kernels[i], initrd) + "\n"
# Print output
sys.stdout.write(sysconfig_out)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment