--- /dev/null
+# Module used to parse osso-backup xml conf files, retrieving categories and
+# backup paths information
+
+import os.path
+import xml.dom
+import xml.dom.minidom
+
+from pcsbackuplocation import *
+
+
+class PcsBackupParser:
+ """Holds a list of Backup_location objects
+
+ Can parse .conf xml files with osso-backup format at the given path with
+ fill_locations_list, creating Backup_location objects based on type,
+ category and path of each location inside each xml file and then holding
+ all objects in the locations_list attribute.
+
+ """
+ def __init__(self):
+ self.locationsDict = {}
+
+ def getLocationsDict(self):
+ return self.locationsDict
+
+ def addLocation(self, location):
+ """Add a location to locations_list attribute of theis class.
+
+ Arguments:
+ location -- the location object to be added
+
+ """
+ category = location.category
+ if category in self.locationsDict.keys():
+ self.locationsDict[category].append(location)
+ else:
+ self.locationsDict[category] = [location]
+
+ def fillLocationsDict(self, path):
+ """Add all locations that can be found inside xml files of the given
+ path.
+
+ This method reads all .conf files inside the directory path given and
+ puts on its locations_list attribute all the Backup_location objects
+ created with the informations returned from the files parsing.
+
+ Arguments:
+ path -- Path of directory containing files to parse
+
+ """
+ for file in os.listdir(path):
+ if file.endswith(".conf"):
+ locations = self.locationsFromFile(os.path.join(path, file))
+ for location in locations:
+ self.addLocation(location)
+
+ def locationsFromFile(self, xml_file):
+ """Return a list with all locations objects inside the given file.
+
+ The file is parsed and all informations retrieved from it are used to
+ create Backup_location objects and these objects are appended to a list
+ that is returned to caller.
+
+ Arguments:
+ xml_file -- File to parse
+
+ Returns:
+ locations -- List with all Backup_location objects created from file
+
+ """
+ locations_map = self._parser(xml_file)
+ locations = []
+ number_of_locations = len(locations_map["types"])
+ for i in range(number_of_locations):
+ type = locations_map["types"][i]
+ category = locations_map["categories"][i]
+ path = locations_map["paths"][i]
+ path = self._fixPath(path)
+ new_loc = PcsBackupLocation(type, category, path)
+ locations.append(new_loc)
+ return locations
+
+
+ def _parser(self, xml_file):
+ # Parses the xml_file, divide each location element information on a
+ # dictonary with key to respective information.
+ # Dictonary format:
+ # { "types": list of types in order of location appereance,
+ # "categories": list of categories ordered like types
+ # "paths" list of install paths in the same order as the others }
+ dom = xml.dom.minidom.parse(xml_file)
+ types = []
+ categories = []
+ paths = []
+ for node in dom.getElementsByTagName("location"):
+ type = node.getAttribute("type")
+ category = node.getAttribute("category")
+ path = node.childNodes[0].data.strip()
+ types.append(type)
+ categories.append(category)
+ paths.append(path)
+
+ location_map = {"types": types, "categories": categories, "paths": paths}
+ return location_map
+
+ def _fixPath(self, path):
+ # Fix any file path containing device specific constants, modifying
+ # them to its values
+ modifications = {"$HOME":"/home/user", "$USER":"user"}
+ for key in modifications.keys():
+ path = path.replace(key, modifications[key])
+ if not path.startswith("/"):
+ path = "/".join(path)
+ return path
+