diff --git a/python/mine/ri_data.py b/python/mine/ri_data.py new file mode 100644 index 0000000..8ad4b59 --- /dev/null +++ b/python/mine/ri_data.py @@ -0,0 +1,354 @@ +#!/usr/bin/python + +import re +import commands + +class SerialNumber: + ''' serial number ''' + value = '' + @staticmethod + def init_from_xml(node): + ''' set value based on xml node ''' + SerialNumber.value = node.firstChild.data.encode('ascii') + + @staticmethod + def to_xml(doc, p_node): + ''' write SerialNumber into xml +doc - xml document instance +p_node - xml node (parent node)''' + sn = doc.createElement('serial-number') + data = doc.createTextNode(SerialNumber.value) + sn.appendChild(data) + p_node.appendChild(sn) + +class Partition: + ''' disk partition ''' + unit='' + list=[] + def __init__(self, dev, st, sz, id): + ''' Partition init function ''' + self.device = dev + self.start = st + self.size = sz + self.id = id + Partition.list.append(self) + + @staticmethod + def init_from_os(): + ''' create a Partition instance from hardware info''' +# cmd = 'sfdisk -d' + cmd = 'cat /home/zhi/work/new_install/python/mine/sfdisk.txt' + st, o = commands.getstatusoutput(cmd) + if st: + return + p0 = re.compile(r'unit:\s*(\w+)') + p = re.compile(r''' +\s*(\w+)\s*: # device +\s*start=\s*(\d+)\s*, # start +\s*size=\s*(\d+)\s*, # size +\s*Id=\s*(\d+) # id +''', re.VERBOSE) + for s in o.splitlines(): + res0 = p0.search(s) + if res0: + Partition.unit = res0.groups()[0] + res = p.search(s) + if res: + dev, start, size, id = res.groups() + Partition(dev.split('/')[-1], start, size, id) + + @staticmethod + def init_from_xml(node): + ''' create Partition instances from xml node ''' + Partition.unit = node.attributes['unit'].value.encode('ascii') + for p in node.childNodes: + if p.nodeType == node.ELEMENT_NODE and p.nodeName == 'partition': + Partition(p.attributes['device'].value.encode('ascii'),\ + p.attributes['start'].value.encode('ascii'), \ + p.attributes['size'].value.encode('ascii'), \ + p.attributes['id'].value.encode('ascii')) + + @staticmethod + def to_xml(doc, p_node): + ''' write all Partition instance into xml +doc - xml document instance +p_node - xml node (parent node)''' + pts = doc.createElement("partitions") + unit_attr = doc.createAttribute('unit') + unit_attr.value = Partition.unit + pts.setAttributeNode(unit_attr) + for p in Partition.list: + pt = doc.createElement('partition') + dev_attr = doc.createAttribute('device') + start_attr = doc.createAttribute('start') + size_attr = doc.createAttribute('size') + id_attr = doc.createAttribute('id') + dev_attr.value = p.device + start_attr.value = p.start + size_attr.value = p.size + id_attr.value = p.id + pt.setAttributeNode(dev_attr) + pt.setAttributeNode(start_attr) + pt.setAttributeNode(size_attr) + pt.setAttributeNode(id_attr) + pts.appendChild(pt) + p_node.appendChild(pts) + +class Raid: + ''' raid information ''' + list = [] + def __init__(self, raid_dev, raid_type, raw_devs): + ''' Raid init function ''' + self.raid_device = raid_dev + self.raid_type = raid_type + self.raw_devices = raw_devs + Raid.list.append(self) + + @staticmethod + def init_from_os(): + #cmd = 'cat /proc/mdstat' + cmd = 'cat /home/zhi/work/new_install/python/mine/raid.txt' + st, o = commands.getstatusoutput(cmd) + if st: + return + dev_p = re.compile(r''' +^(md\d+)\s*: # md device +\s*active\s* # "active" +(\w+)\s* # raid type +''', re.VERBOSE) + + for s in o.splitlines(): + dev_res = dev_p.split(s) + if len(dev_res)>1: # matched + # dev_res[0] is '' + raid_dev = dev_res[1] + raid_type = dev_res[2] + raw_devs =[] + for ss in dev_res[3].split(): + raw_devs.append(ss[:ss.index('[')]) + Raid(raid_dev, raid_type, raw_devs) + + @staticmethod + def init_from_xml(node): + ''' create Raid instances from xml node ''' + for e in node.childNodes: + if e.nodeType == e.ELEMENT_NODE and e.nodeName == 'raid': + raid_dev = e.attributes['raid-device'].value + raid_type = e.attributes['raid-type'].value + raw_devs = [] + for sub_e in e.childNodes: + if sub_e.nodeType == sub_e.ELEMENT_NODE and sub_e.nodeName == 'raw-device': + raw_devs.append(sub_e.firstChild.data.encode('ascii')) + Raid(raid_dev, raid_type, raw_devs) + + @staticmethod + def to_xml(doc, p_node): + ''' write all raid instance into xml +doc - xml document instance +p_node - xml node (parent node) ''' + raids = doc.createElement('raids') + for r in Raid.list: + rd = doc.createElement('raid') + + rd_dev_attr = doc.createAttribute('raid-device') + rd_dev_attr.value = r.raid_device + rd.setAttributeNode(rd_dev_attr) + + rd_type_attr = doc.createAttribute('raid-type') + rd_type_attr.value = r.raid_type + rd.setAttributeNode(rd_type_attr) + + for raw_dev in r.raw_devices: + raw_dev_e = doc.createElement('raw-device') + raw_dev_tn = doc.createTextNode(raw_dev) + raw_dev_e.appendChild(raw_dev_tn) + rd.appendChild(raw_dev_e) + + raids.appendChild(rd) + + p_node.appendChild(raids) + +class MountPoint: + ''' mount-points ''' + list=[] + def __init__(self, dev, dir, fs): + self.device = dev + self.directory = dir + self.filesystem = fs + MountPoint.list.append(self) + + @staticmethod + def init_from_internal(): + ''' init MountPoint from internal class Partition and class Raid ''' + devs = [ p.device for p in Partition.list ] + for r in Raid.list: + for raw_d in r.raw_devices: + if raw_d in devs: + devs.remove(raw_d) + if not r.raid_device in devs: + devs.append(r.raid_device) + + for dev in devs: + MountPoint(dev, '', '') + + @staticmethod + def init_from_xml(node): + ''' create MountPoint instances from xml node ''' + for m in node.childNodes: + if m.nodeType == node.ELEMENT_NODE and m.nodeName == 'mount-point': + MountPoint(m.attributes['device'].value.encode('ascii'), \ + m.attributes['directory'].value.encode('ascii'), \ + m.attributes['file-system'].value.encode('ascii')) + + @staticmethod + def to_xml(doc, p_node): + ''' write all MountPoint instance into xml +doc - xml document instance +p_node - xml node (parent node)''' + mps = doc.createElement('mount-points') + for m in MountPoint.list: + mp = doc.createElement('mount-points') + dev_attr = doc.createAttribute('device') + dir_attr = doc.createAttribute('directory') + fs_attr = doc.createAttribute('file-system') + dev_attr.value = m.device + dir_attr.value = m.directory + fs_attr.value = m.filesystem + mp.setAttributeNode(dev_attr) + mp.setAttributeNode(dir_attr) + mp.setAttributeNode(fs_attr) + mps.appendChild(mp) + p_node.appendChild(mps) + +class Network: + ''' network ''' + hostname ='' + configuration ='' + ip = '' + mask = '' + gateway = '' + primary_dns = '' + secondary_dns = '' + domain = '' + + @staticmethod + def init_from_xml(node): + ''' init Network from xml node ''' + for k in node.attributes.keys(): + setattr(Network, k, node.attributes[k].value.encode('ascii')) + + @staticmethod + def to_xml_attr(doc, node, name): + ''' This method is called by to_xml. Its function is to create an attribute, and set its value based on Network data member + doc - xml document + node - xml node + name - attribute name''' + attr = doc.createAttribute(name) + attr.value = getattr(Network, name) + node.setAttributeNode(attr) + + @staticmethod + def to_xml(doc, p_node): + ''' write Network into xml +doc - xml document instance +p_node - xml node (parent node)''' + ntwk = doc.createElement('network') + for nm in ('hostname', 'configuration', 'ip', 'mask', 'gateway', 'primary_dns', 'secondary_dns', 'domain'): + Network.to_xml_attr(doc, ntwk, nm) + p_node.appendChild(ntwk) + +class Group: + ''' software package group ''' + dict = {} + def __init__(self, n, i): + self.name = n + self.install = i + self.description = '' + self.mandatory = [] + self.selection = 'manual' + self.optional = [] + Group.dict[n] = self + + @staticmethod + def handle_release_node(r_node): + ''' This method is called by init_from_config_xml +r_node - release node ''' + for i in r_node.childNodes: + if i.nodeType == i.ELEMENT_NODE and i.nodeName == 'including': + Group(i.attributes['group'].value, \ + i.attributes['install'].value == 'mandatory' and 'yes' or 'no') + + @staticmethod + def handle_group_node(g_node): + ''' This method is called by init_from_config_xml +g_node - group node ''' + g = Group.dict[g_node.attributes['name'].value] + for n in g_node.childNodes: + if n.nodeType == n.ELEMENT_NODE: + if n.nodeName == 'description': + g.description = n.firstChild.data + elif n.nodeName == 'including': + if n.attributes['install'].value == 'mandatory': + g.mandatory.append(n.attributes['package'].value.encode('ascii')) + else: + g.optional.append(n.attributes['package'].value.encode('ascii')) + + @staticmethod + def init_from_config_xml(node): + ''' init Group instance from config xml + node - root node of config xml''' + rls_list = [r for r in node.childNodes + if r.nodeType == r.ELEMENT_NODE and r.nodeName == 'release'] + grp_list = [g for g in node.childNodes + if g.nodeType == g.ELEMENT_NODE and g.nodeName == 'group'] + handle_release_node(rls_list[0]) + for g in grp_list: + handle_group_node(g) + + @staticmethod + def to_xml(doc, p_node): + ''' write Group instances into xml +doc - xml document instance +p_node - xml node (parent node)''' + grps = doc.createElement('groups') + for g in Group.dict.values(): + grp = doc.createElement('group') + name_attr = doc.createAttribute('name') + name_attr.value = g.name + grp.setAttributeNode(name_attr) + + inst_attr = doc.createAttribute('install') + inst_attr.value = g.install + grp.setAttributeNode(inst_attr) + + if g.description: + dscp = doc.createElement('description') + dscp_data = doc.createTextNode(g.description) + dscp.appendChild(dscp_data) + grp.appendChild(dscp) + + if g.mandatory: + mndt = doc.createElement('mandatory') + for m in g.mandatory: + pkg = doc.createElement('package') + pname_attr = doc.createAttribute('name') + pname_attr = m + pkg.setAttributeNode(pname_attr) + + mndt.appendChild(pkg) + grp.appendChild(mndt) + + if g.optional: + optl = doc.createElement('optional') + for o in g.optional: + pkg = doc.createElement('package') + pname_attr = doc.createAttribute('name') + pname_attr = o + pkg.setAttributeNode(pname_attr) + pinst_attr = doc.createAttribute('install') + pinst_attr = 'no' + pkg.setAttributeNode(pinst_attr) + optl.appendChild(pkg) + grp.appendChild(optl) + grps.append(grp) + p_node.appendChild(grps) diff --git a/python/mine/test_data.py b/python/mine/test_data.py new file mode 100644 index 0000000..6f4e405 --- /dev/null +++ b/python/mine/test_data.py @@ -0,0 +1,38 @@ +#!/usr/bin/python + +from ri_data import * +from xml.dom import minidom +from xml.dom.ext import PrettyPrint + +xmldoc = minidom.parse('./i.xml') +root = xmldoc.firstChild + +for e in root.childNodes: + if e.nodeType == e.ELEMENT_NODE: + if e.nodeName == 'serial-number': + SerialNumber.init_from_xml(e) + elif e.nodeName == 'partitions': + Partition.init_from_xml(e) + elif e.nodeName == 'raids': + Raid.init_from_xml(e) + elif e.nodeName == 'mount-points': + MountPoint.init_from_xml(e) + elif e.nodeName == 'network': + Network.init_from_xml(e) + +xmldoc2 = minidom.Document() +root2 = xmldoc2.createElement('install') +xmldoc2.appendChild(root2) + +SerialNumber.to_xml(xmldoc2, root2) +Partition.to_xml(xmldoc2, root2) +Raid.to_xml(xmldoc2, root2) +# test MountPoint.init_from_internal +MountPoint.list=[] +MountPoint.init_from_internal() +MountPoint.to_xml(xmldoc2, root2) +Network.to_xml(xmldoc2, root2) + + +PrettyPrint(xmldoc2) + diff --git a/xml/install.xml b/xml/install.xml index 35f3887..9c78e68 100644 --- a/xml/install.xml +++ b/xml/install.xml @@ -7,26 +7,40 @@ - - /dev/hda1 - /dev/hda2 - + + + /dev/hda1 + /dev/hda2 + - - /dev/hda3 - /dev/hda5 - /dev/hda6 - + + /dev/hda3 + /dev/hda5 + /dev/hda6 + + - - + + + + - + + + base software packages + + + + + + + + + + + + - - base software packages - - diff --git a/xml/install_ng.xml b/xml/install_ng.xml index 988de60..b06db93 100644 --- a/xml/install_ng.xml +++ b/xml/install_ng.xml @@ -5,11 +5,15 @@ - + + + - + + + @@ -34,33 +38,37 @@ - - - - - - RAID0 - RAID1 - RAID5 - - - - - - - - - + + + + + + + raid0 + raid1 + raid5 + + + + + + + + + + - - - - - - - + + + + + + + + + @@ -85,32 +93,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + all + none + manual + + + + + + + + @@ -119,19 +132,17 @@ - - - - - - mandatory - optional - - - - - - + + + + + + + + + + + @@ -140,4 +151,19 @@ no + + + + + + + + + + + + + + +