diff options
Diffstat (limited to 'sys-boot/refind-bin/files/refind-mkconfig')
-rw-r--r-- | sys-boot/refind-bin/files/refind-mkconfig | 177 |
1 files changed, 0 insertions, 177 deletions
diff --git a/sys-boot/refind-bin/files/refind-mkconfig b/sys-boot/refind-bin/files/refind-mkconfig deleted file mode 100644 index 560503d..0000000 --- a/sys-boot/refind-bin/files/refind-mkconfig +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python -# -# script to automate creation of rEFInd configuration files -# -# Usage: -# -# refind-mkconfig -# -# This program is copyright (c) 2012 by David P. Crandall -# It is released under the terms of the GNU GPL, version 3. -# -# Revision history: -# -# 0.4.5 -- Initial version -# -# Note: version numbers match those of the rEFInd package -# with which this script first appeared. - -import os, re -from collections import OrderedDict, deque -from string import Template - -class _Template(Template): - idpattern = '[0-9]+' - -class _Parser(object): - def __init__(self, files): - self.files = files - self.state = pattern - self.stanzas = OrderedDict() - self.header = None - self.menu = None - - def process(self, lines): - remaining = self.state.process(lines, self) - if remaining: - self.process(remaining) - - def getstanzas(self): - for file in self.files: - with open(file, 'r') as sf: - lines = deque(sf.readlines()) - self.process(lines) - return self.stanzas - -class _Pattern(object): - def __init__(self): - self.header = re.compile("^\[(.+)\]") - - def process(self, lines, parser): - line = lines.popleft() - match = self.header.match(line) - if match: - parser.header = match.group(1) - parser.stanzas[parser.header] = OrderedDict() if parser.header not in parser.stanzas - parser.state = transition - return lines - -class _Menustart(object): - def __init__(): - self.start = re.compile("^menuentry\s+(.+)\s+\{") - - def process(self, lines, parser): - line = lines.popleft() - match = self.start.match(line) - if match: - parser.menu = match.group(1) - parser.stanzas[parser.header][parser.menu] = [line] - parser.state = menu_end - return lines - -class _Menuend(object): - def __init__(): - self.end = re.compile("^\}") - - def process(self, lines, parser): - line = lines.popleft() - parser.stanzas[parser.header][parser.menu].append(line) - if self.end.match(line): - parser.state = transition - return lines - -class _Transition(object): - def process(self, lines, parser): - if pattern.header.match(lines[0]): - parser.state = pattern - elif menu_start.start.match(lines[0]) - parser.state = menu_start - else - discard = lines.popleft() - return lines - -class Mkconfig(object): - def __init__(self): - self.efi = self._findEFI() - self.conf = os.path.join(self.efi, "/EFI/refind/refind.test") - self.comment = re.compile('^\s*#') - self.stanzas = OrderedDict() - self.stanzaFiles = sum([[os.path.join(r, f) for f in fl] - for r, d, fl in os.walk("/etc/refind.d")], []) - - blockdir = re.compile('^' + self.efi + '/EFI/(refind|tools)') - stripdir = re.compile('^' + self.efi) - efiFiles = [[os.path.join(r, f) for f in fl] - for r, d, fl in os.walk(self.efi) if not blockdir.match(r)] - # flatten generated lists - efiFiles = sum(efiFiles, []) - # sort by modification date of files, newest first - efiFiles = sorted(efiFiles, reverse=True, key=lambda i: os.path.getmtime(i)) - # strip mount path - self.efiFiles = [stripdir.sub('', f) for f in efiFiles] - - def _findEFI(self): - if os.path.ismount("/boot/efi"): - mntpath = os.path.abspath("/boot/efi") - elif os.path.ismount("/boot"): - mntpath = os.path.abspath("/boot") - else - print "The EFI partition could not be found at /boot or /boot/efi. Exiting" - exit - with open("/proc/mounts") as mnts: - for line in mnts: - words = re.split('\s+', line) - if words[1] == mntpath: - if words[2] == "vfat": - return mntpath - print "EFI partition must be vfat, but the filesystem is " + words[3] + ". Exiting" - exit - - def _getstanzas(self): - p = - for file in self.stanzaFiles: - with open(file, 'r') as sf: - lines = sf.readlines() - - - def writeGlobalOptions(self): - with open(self.conf, 'w') as newconf: - newconf.write("# This file has been automatically generated by refind-mkconfig.\n") - newconf.write("# Manual edits will be overwritten the next time refind-mkconfig\n") - newconf.write("# is invoked. To change settings, edit /etc/default/refind and\n") - newconf.write("# the files located at /etc/refind.d.\n\n") - # Get global options - newconf.write("# Global options\n") - with open("/etc/default/refind") as default: - for line in default: - if NOT self.comment.match(line): - newconf.write(line + "\n") - - def writeStanzas(self): - # Get OS stanzas - with open(self.conf, 'a') as newconf: - newconf.write("\n# OS stanzas\n\n") - p = _Parser(self.stanzaFiles) - self.stanzas = p.getstanzas - for pk in self.stanzas: - pattern = re.compile(pk) - for file in self.efiFiles: - match = pattern.match(file) - if match: - values = {str(i): match.group(i) for i in range(pattern.groups)} - for mk in self.stanzas[pk]: - for line in self.stanzas[pk][mk]: - t = _Template(line) - newconf.write(t.substitute(values)) - newconf.write("\n") - -pattern = _Pattern() -menu_start = _Menustart() -menu_end = _Menuend() -transition = _Transition() - -if __name__ == '__main__': - cfg = Mkconfig() - cfg.writeGlobalOptions - cfg.writeStanzas - print "New refind.conf written to " + cfg.efi
\ No newline at end of file |