/usr/share/rhn/up2date_client/haltree.py is in rhn-client-tools 1.8.26-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | # HalTree Purpose:
#
# HalTree is a way to organize the mess of data you get from hal. In general,
# if you want to get all the information about every device in the system, you
# end up with a list of dicts, where each dict contains the property name/values
# for a device. This list isn't very useful as the hal data is actually
# organized into a tree. For example, you have the computer as the head, then
# there may be a scsi card plugged in. That in turn will have scsi channels
# and luns, which scsi devices may be connected to. So this module will help
# you reorganize your hal data back to the way they were intended.
#
# HalTree Usage:
#
# The tree gets built one device at a time. Once you've created a HalTree
# object, devices get added to the tree with HalTree.add(hw_dev_dict). The
# devices can be added in any particular order, and the tree gets properly
# structured as the devices get added. But the tree structure isn't likely
# to be ready until all the devices have been added. Those devices without a
# parent get stuck in the no_parent_yet list.
#
# When a device gets added, it is no longer a plain dict. It is stored in a
# HalDevice. The original dict can be found in HalDevice.properties.
import types
class HalDevice:
"An object containing its udi, properties and children"
def __init__ (self, properties):
self.udi = properties['info.udi']
self.properties = properties
self.children = []
self.classification = None
if properties.has_key('info.parent'):
self.parent_udi = properties['info.parent']
else:
self.parent_udi = None
self.parent = None
def print_properties(self):
print self.udi, ":"
for property, value in self.properties.items():
print " ", property," ==> ", value
class HalTree:
def __init__ (self):
self.head = None
self.no_parent_yet = []
def add(self, hal_device):
if hal_device.parent_udi:
parent = self.__find_node(hal_device.parent_udi)
if parent:
parent.children.append(hal_device)
hal_device.parent = parent
else: #parent isn't in the main tree yet, stick it in waiting
self.no_parent_yet.append(hal_device)
else: #if it doesn't have a parent, it must be the head 'computer'
self.head = hal_device
#check to see if there are any children waiting for this dev
self.__get_lost_children(hal_device)
def __get_lost_children(self, hal_device):
found_list = []
indexes = []
no_parent_yet_copy = self.no_parent_yet[:]
for dev in no_parent_yet_copy:
if dev.parent_udi == hal_device.udi:
dev.parent = hal_device
hal_device.children.append(dev)
self.no_parent_yet.remove(dev)
def __find_node(self, udi):
"""
This takes a node in the HalDevice tree and returns the HalDevice with
the given udi.
"""
if self.head:
node = HalTree.__find_node_worker(self.head, udi)
if node:
return node
for node in self.no_parent_yet:
found_node = HalTree.__find_node_worker(node, udi)
if found_node:
return found_node
return None
@staticmethod
def __find_node_worker(node, udi):
if node.udi == udi:
return node
for device in node.children:
res = HalTree.__find_node_worker(device, udi)
if res:
return res
return None
def print_tree(self):
self.__print_dev_tree(self.head, "")
def __print_dev_tree(self, node, indent):
print indent, node.udi
print indent, "CLASS:", node.classification
for name, property in node.properties.items():
if (type(property) == types.StringType):
if property.isdigit():
print indent + " ", "%-20s ==> %s" % (name, hex(int(property)))
else:
print indent + " ", "%-20s ==> %s" % (name, property)
elif (type(property) == types.IntType):
print indent + " ", "%-20s ==> %s" % (name, hex(int(property)))
else:
print indent + " ", "%-20s ==> %s" % (name, property)
print
for child in node.children:
self.__print_dev_tree(child, indent + " ")
|