summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/grub/grub.py42
-rw-r--r--plugins/grub/grubUtils.py32
2 files changed, 51 insertions, 23 deletions
diff --git a/plugins/grub/grub.py b/plugins/grub/grub.py
index 1935056..6da6fd9 100644
--- a/plugins/grub/grub.py
+++ b/plugins/grub/grub.py
@@ -34,6 +34,7 @@ class Grub(Plugin):
name = "Grub"
version = "0.0.1"
author = "Joel Andres Granados"
+ description = "Plugin to recover lost grub bootloader functionality"
@classmethod
def getDeps(cls):
@@ -82,9 +83,10 @@ class Grub(Plugin):
self.install_grub_devs = []
# Initialize our list of related issues.
- self.issue_grub_dir = SimpleIssue(self.name, "Missing grub dir or " \
- "dir files.")
- self.issue_grub_image = SimpleIssue(self.name, "Bad grub stage1 image.")
+ self.issue_grub_dir = SimpleIssue(self.name+"_DIR", "Missing grub " \
+ "dir or dir files.")
+ self.issue_grub_image = SimpleIssue(self.name+"_IMAGE", "Bad grub " \
+ "stage1 image.")
# Initialize the backup space.
self.backupSpace = self._backups.getBackup( \
@@ -186,16 +188,18 @@ class Grub(Plugin):
if not grubUtils.other_bootloader_present(Dname(part)):
self._reporting.info("Found no other bootloader " \
"in %s partition." % Dname.asPath(part), \
- origin = self)
+ origin = self)
self.install_grub_parts.append(Dname(part))
else:
# If not arguments where specified the right thing to do is to
# leave everything alone:)
self.install_grub_parts = []
self.install_grub_devs = []
- self._reporting.info("Grub will modify any drive. " \
+ self._reporting.info("Grub wont modify any drive. " \
"If you want grub to take action you must specify: " \
- "--install-to, --install-all or --install-auto.")
+ "--installto-devs, --installto-parts, " \
+ "--install-all or --install-auto.", \
+ origin = self)
self._result = ReturnSuccess
except Exception, e:
@@ -247,14 +251,26 @@ class Grub(Plugin):
# Since we are going to install the stage1 grub image in all the
# devices in self.install_grub_devs, we will backup all of them.
# FIXME: We have to modify the plugin to consider partitions.
- self._reporting.info("Going to backup all the first 446 bytes of " \
- "all storage devices in the system.", origin = self)
firstblockdict = {}
+
+ if len(self.install_grub_devs) > 0:
+ self._reporting.info("Going to backup all the first 446 bytes of " \
+ "%s." % self.install_grub_devs, origin = self)
for device in self.install_grub_devs:
fd = os.open(device.path(), os.O_RDONLY)
first446btemp = os.read(fd, 446)
os.close(fd)
firstblockdict[device.name()] = [first446btemp, device]
+
+ if len(self.install_grub_parts) > 0:
+ self._reporting.info("Going to backup all the first 446 bytes of " \
+ "%s." % self.install_grub_parts, origin = self)
+ for part in self.install_grub_parts:
+ fd = os.open(part.path(), os.O_RDONLY)
+ first446btemp = os.read(fd, 446)
+ os.close(fd)
+ firstblockdict[part.name()] = [first446btemp, part]
+
self.backupSpace.backupValue( firstblockdict, "firstblockdict")
self._result = ReturnSuccess
@@ -263,9 +279,17 @@ class Grub(Plugin):
if len(self.grub_dir_parts) == 0:
self._reporting.error("No grub directories where found... exiting.",
origin = self)
- self.issue_grub_image.set(fixed = False, \
+ self.issue_grub_dir.set(fixed = False, \
reporting = self._reporting, origin = self)
+ self._result = ReturnFailure
+ return
+ # We are to fail if there are no devs or parts to install to.
+ if len(self.install_grub_devs) + len(self.install_grub_parts) == 0:
+ self._reporting.error("No devices or partitions to install to.",
+ origin = self)
+ self.issue_grub_image.set(fixed = False, \
+ reporting = self._reporting, origin = self)
self._result = ReturnFailure
return
diff --git a/plugins/grub/grubUtils.py b/plugins/grub/grubUtils.py
index 7d1a286..7488b87 100644
--- a/plugins/grub/grubUtils.py
+++ b/plugins/grub/grubUtils.py
@@ -67,20 +67,24 @@ def get_all_devs():
continue
else:
- # parted will provide us with all the partitions.
- partitions = []
- parteddev = parted.PedDevice.get(device["device"])
- disk = parted.PedDisk.new(parteddev)
- part = disk.next_partition()
- while part:
- if part.num > 0:
- partitions.append(
- Dname("%s%s"%(device["device"],part.num)))
- part = disk.next_partition(part)
- # The key will be the device name and it will contain a list of
- # parts. This is very unfortunate as the object would be better
- # sutied as a key.
- retval[Dname.asName(device["device"])] = partitions
+ try:
+ # parted will provide us with all the partitions.
+ partitions = []
+ parteddev = parted.PedDevice.get(device["device"])
+ disk = parted.PedDisk.new(parteddev)
+ part = disk.next_partition()
+ while part:
+ if part.num > 0:
+ partitions.append(
+ Dname("%s%s"%(device["device"],part.num)))
+ part = disk.next_partition(part)
+ # The key will be the device name and it will contain a list of
+ # parts. This is very unfortunate as the object would be better
+ # sutied as a key.
+ retval[Dname.asName(device["device"])] = partitions
+ except:
+ # If there is a problem with this dev... jus continue.
+ continue
return retval