Files
iconograph/client/update_grub.py

71 lines
2.0 KiB
Python
Raw Normal View History

2016-03-31 11:09:16 -07:00
#!/usr/bin/python3
2016-05-11 05:02:58 +00:00
import lib
2016-03-31 11:09:16 -07:00
import os
2016-03-31 12:18:00 -07:00
import string
2016-05-10 19:02:14 +00:00
import tempfile
2016-03-31 11:09:16 -07:00
class GrubUpdater(object):
2016-03-31 12:18:00 -07:00
_HOTKEYS = string.digits + string.ascii_letters
2016-03-31 11:09:16 -07:00
def __init__(self, image_dir, boot_dir):
self._image_dir = image_dir
self._boot_dir = boot_dir
2016-05-17 16:11:38 -07:00
assert self._image_dir.startswith(self._boot_dir), (self._image_dir, self._boot_dir)
2016-03-31 11:09:16 -07:00
self._image_path = '/' + os.path.relpath(self._image_dir, self._boot_dir)
def Update(self):
2016-05-10 19:02:14 +00:00
grub_dir = os.path.join(self._boot_dir, 'grub')
2016-03-31 11:14:58 -07:00
2016-05-10 19:11:05 +00:00
with tempfile.NamedTemporaryFile('w', dir=grub_dir, delete=False) as fh:
2016-05-10 20:55:50 +00:00
try:
files = []
for filename in os.listdir(self._image_dir):
if not filename.endswith('.iso'):
continue
files.append(filename)
2016-03-31 11:12:02 -07:00
2016-05-11 19:53:12 +00:00
default_entry = None
2016-11-29 15:10:25 -08:00
fallback_entry = None
2016-05-11 19:53:12 +00:00
current = lib.GetCurrentImage(self._image_dir)
2016-05-10 20:55:50 +00:00
for i, filename in enumerate(sorted(files, reverse=True)):
2016-05-11 19:53:12 +00:00
if filename == current:
default_entry = i
2016-11-29 15:10:25 -08:00
elif fallback_entry is None:
fallback_entry = i
2016-05-10 20:55:50 +00:00
fh.write("""
2016-05-09 20:40:38 +00:00
menuentry "%(image_filename)s (%(volume_id)s)" --hotkey=%(hotkey)s {
2016-03-31 11:09:16 -07:00
search --no-floppy --file --set=root %(image_path)s/%(image_filename)s
iso_path="%(image_path)s/%(image_filename)s"
export iso_path
loopback loop "%(image_path)s/%(image_filename)s"
set root=(loop)
configfile /boot/grub/loopback.cfg
}
""" % {
2016-05-10 20:55:50 +00:00
'image_filename': filename,
'image_path': self._image_path,
'hotkey': self._HOTKEYS[i],
2016-05-11 05:02:58 +00:00
'volume_id': lib.GetVolumeID(os.path.join(self._image_dir, filename)),
2016-05-10 20:55:50 +00:00
})
2016-05-10 19:02:14 +00:00
2016-05-11 19:53:12 +00:00
fh.write("""
set timeout=5
set default=%(default_entry)d
2016-11-29 15:10:25 -08:00
set fallback=%(fallback_entry)d
2016-05-11 19:53:12 +00:00
""" % {
'default_entry': default_entry,
2017-03-30 14:39:45 -07:00
'fallback_entry': fallback_entry if fallback_entry else default_entry,
2016-05-11 19:53:12 +00:00
})
2016-05-10 20:55:50 +00:00
fh.flush()
os.rename(fh.name, os.path.join(grub_dir, 'grub.cfg'))
except:
os.unlink(fh.name)
raise