* use caching for "debian_live" check

This commit is contained in:
lars 2009-07-15 09:12:11 +00:00
parent bf7e8cd156
commit 3953da477b
1 changed files with 40 additions and 37 deletions

View File

@ -51,6 +51,7 @@ MAJOR_DEVNUM_LOOP = 7
MAJOR_DEVNUM_FLOPPY = 2 MAJOR_DEVNUM_FLOPPY = 2
MAJOR_DEVNUM_RAMDISK = 1 MAJOR_DEVNUM_RAMDISK = 1
MAJOR_DEVNUM_MD_RAID = 9 MAJOR_DEVNUM_MD_RAID = 9
MOUNT_STATE_FILE = '/proc/mounts'
## cache settings ## cache settings
CACHE_ENABLED = True CACHE_ENABLED = True
@ -248,48 +249,19 @@ class Blockdevice:
else: else:
return False return False
def is_debian_live(self): def is_debian_live(self):
"""is the device part of the Debian Live runtime """is the device part of the Debian Live runtime
""" """
##Debian Live ("iso" or "usb-hdd" versions) uses two block
##devices as part of its runtime system. The raw boot media
##(such as a usb key or cdrom) is mounted at /live_media,
##and the root filesystem is mounted off of the live media
##using /dev/loop0.
deb_live_devs = []
for line in file("/proc/mounts"):
try:
fields = line.split(" ")
##We are looking for, for example:
##/dev/hdc /live_media iso9660 ro 0 0
##and
##/dev/loop0 /filesystem.squashfs squashfs ro 0 0
if (fields[1] == "/live_media" and
fields[3] == "ro"):
deb_live_devs.append(fields[0])
elif (fields[1] == "/filesystem.squashfs" and
fields[3] == "ro"):
deb_live_devs.append(fields[0])
except IndexError:
pass
##TODO:
##Since the lines in /proc/mounts that affect deb_live_devs
##don't change after startup, deb_live_devs could be cached here.
##
##Check whether any Debian Live devices refer to the ##Check whether any Debian Live devices refer to the
##block device we were passed ##block device we were passed
matched = False deb_live_devs = _get_debian_live_devices()
for dev in deb_live_devs: ## check for matches in self.__get_device_nodes() and deb_live_devs
for node in self.__get_device_nodes(): matching_devices = [ devnode for devnode in self.__get_device_nodes()
if (node == dev): if devnode in deb_live_devs ]
matched = True ## return True, if a match was found
return len(matching_devices) > 0
##If no nodes of the block device match the Debian Live
##devices, return False
return matched
def is_lvm_pv(self): def is_lvm_pv(self):
"""return if the device is a physical volume of a LVM """return if the device is a physical volume of a LVM
@ -1096,9 +1068,40 @@ def _load_preferences():
os.chdir(os.path.dirname(config_file)) os.chdir(os.path.dirname(config_file))
return cryptobox.core.settings.CryptoBoxSettings(config_file) return cryptobox.core.settings.CryptoBoxSettings(config_file)
else: else:
raise CBConfigUnavailableError() raise cryptobox.core.exceptions.CBConfigUnavailableError()
def _get_debian_live_devices():
##Debian Live ("iso" or "usb-hdd" versions) uses two block
##devices as part of its runtime system. The raw boot media
##(such as a usb key or cdrom) is mounted at /live_media,
##and the root filesystem is mounted off of the live media
##using /dev/loop0.
cache_link = ["debian_live_devices"]
cached = CACHE.get(cache_link)
if not cached is None:
return cached[:]
## result is not cached yet - we need to find it
deb_live_devs = []
for line in file(MOUNT_STATE_FILE):
try:
fields = line.split(" ")
##We are looking for, for example:
##/dev/hdc /live_media iso9660 ro 0 0
##and
##/dev/loop0 /filesystem.squashfs squashfs ro 0 0
if (fields[1] == "/live_media" and
fields[3] == "ro"):
deb_live_devs.append(fields[0])
elif (fields[1] == "/filesystem.squashfs" and
fields[3] == "ro"):
deb_live_devs.append(fields[0])
except IndexError:
pass
CACHE.set(cache_link, deb_live_devs)
return deb_live_devs[:]
## initialize cache ## initialize cache
CACHE = BlockdeviceCache() CACHE = BlockdeviceCache()