summaryrefslogtreecommitdiffstats
path: root/pyanaconda/storage/pyudev.py
diff options
context:
space:
mode:
authorDavid Lehman <dlehman@redhat.com>2013-01-14 13:24:23 -0600
committerDavid Lehman <dlehman@redhat.com>2013-01-28 13:15:24 -0600
commite6c6261e1d7e912103ef1618e4a84c5f70abb00a (patch)
treeba18c35505f99260ea0e425a4398ca9ff2648978 /pyanaconda/storage/pyudev.py
parent7a0ce77a4a2d68a61a82596948be4c7a38d98769 (diff)
downloadanaconda-e6c6261e1d7e912103ef1618e4a84c5f70abb00a.tar.gz
anaconda-e6c6261e1d7e912103ef1618e4a84c5f70abb00a.tar.xz
anaconda-e6c6261e1d7e912103ef1618e4a84c5f70abb00a.zip
Move tsort, platform, and baseudev into storage.
Merge baseudev into storage.udev.
Diffstat (limited to 'pyanaconda/storage/pyudev.py')
-rw-r--r--pyanaconda/storage/pyudev.py232
1 files changed, 232 insertions, 0 deletions
diff --git a/pyanaconda/storage/pyudev.py b/pyanaconda/storage/pyudev.py
new file mode 100644
index 000000000..705b93d80
--- /dev/null
+++ b/pyanaconda/storage/pyudev.py
@@ -0,0 +1,232 @@
+from __future__ import print_function
+
+import sys
+import os
+import fnmatch
+from ctypes import *
+
+
+# XXX this one may need some tweaking...
+def find_library(name, somajor=0):
+ env = os.environ.get("LD_LIBRARY_PATH")
+ common = ["/lib64", "/lib"]
+
+ if env:
+ libdirs = env.split(":") + common
+ else:
+ libdirs = common
+
+ libdirs = filter(os.path.isdir, libdirs)
+
+ for dir in libdirs:
+ files = fnmatch.filter(os.listdir(dir), "lib%s.so.%d" % (name, somajor))
+ files = [os.path.join(dir, file) for file in files]
+
+ if files:
+ break
+
+ if files:
+ return files[0]
+ else:
+ return None
+
+# find the udev library
+name = "udev"
+somajor = 1
+libudev = find_library(name=name, somajor=somajor)
+
+if not libudev or not os.path.exists(libudev):
+ raise ImportError, "No library named %s.%d" % (name, somajor)
+
+# load the udev library
+libudev = CDLL(libudev)
+
+
+# create aliases for needed functions and set the return types where needed
+libudev_udev_new = libudev.udev_new
+libudev_udev_new.argtypes = []
+libudev_udev_new.restype = c_void_p
+libudev_udev_unref = libudev.udev_unref
+libudev_udev_unref.argtypes = [ c_void_p ]
+
+libudev_udev_device_new_from_syspath = libudev.udev_device_new_from_syspath
+libudev_udev_device_new_from_syspath.restype = c_void_p
+libudev_udev_device_new_from_syspath.argtypes = [ c_void_p, c_char_p ]
+libudev_udev_device_unref = libudev.udev_device_unref
+libudev_udev_device_unref.argtypes = [ c_void_p ]
+
+libudev_udev_device_get_syspath = libudev.udev_device_get_syspath
+libudev_udev_device_get_syspath.restype = c_char_p
+libudev_udev_device_get_syspath.argtypes = [ c_void_p ]
+libudev_udev_device_get_sysname = libudev.udev_device_get_sysname
+libudev_udev_device_get_sysname.restype = c_char_p
+libudev_udev_device_get_sysname.argtypes = [ c_void_p ]
+libudev_udev_device_get_devpath = libudev.udev_device_get_devpath
+libudev_udev_device_get_devpath.restype = c_char_p
+libudev_udev_device_get_devpath.argtypes = [ c_void_p ]
+libudev_udev_device_get_devtype = libudev.udev_device_get_devtype
+libudev_udev_device_get_devtype.restype = c_char_p
+libudev_udev_device_get_devtype.argtypes = [ c_void_p ]
+libudev_udev_device_get_devnode = libudev.udev_device_get_devnode
+libudev_udev_device_get_devnode.restype = c_char_p
+libudev_udev_device_get_devnode.argtypes = [ c_void_p ]
+libudev_udev_device_get_subsystem = libudev.udev_device_get_subsystem
+libudev_udev_device_get_subsystem.restype = c_char_p
+libudev_udev_device_get_subsystem.argtypes = [ c_void_p ]
+libudev_udev_device_get_sysnum = libudev.udev_device_get_sysnum
+libudev_udev_device_get_sysnum.restype = c_char_p
+libudev_udev_device_get_sysnum.argtypes = [ c_void_p ]
+
+libudev_udev_device_get_properties_list_entry = libudev.udev_device_get_properties_list_entry
+libudev_udev_device_get_properties_list_entry.restype = c_void_p
+libudev_udev_device_get_properties_list_entry.argtypes = [ c_void_p ]
+libudev_udev_list_entry_get_next = libudev.udev_list_entry_get_next
+libudev_udev_list_entry_get_next.restype = c_void_p
+libudev_udev_list_entry_get_next.argtypes = [ c_void_p ]
+
+libudev_udev_list_entry_get_name = libudev.udev_list_entry_get_name
+libudev_udev_list_entry_get_name.restype = c_char_p
+libudev_udev_list_entry_get_name.argtypes = [ c_void_p ]
+libudev_udev_list_entry_get_value = libudev.udev_list_entry_get_value
+libudev_udev_list_entry_get_value.restype = c_char_p
+libudev_udev_list_entry_get_value.argtypes = [ c_void_p ]
+
+libudev_udev_enumerate_new = libudev.udev_enumerate_new
+libudev_udev_enumerate_new.restype = c_void_p
+libudev_udev_enumerate_new.argtypes = [ c_void_p ]
+libudev_udev_enumerate_unref = libudev.udev_enumerate_unref
+libudev_udev_enumerate_unref.argtypes = [ c_void_p ]
+
+libudev_udev_enumerate_add_match_subsystem = libudev.udev_enumerate_add_match_subsystem
+libudev_udev_enumerate_add_match_subsystem.restype = c_int
+libudev_udev_enumerate_add_match_subsystem.argtypes = [ c_void_p, c_char_p ]
+libudev_udev_enumerate_scan_devices = libudev.udev_enumerate_scan_devices
+libudev_udev_enumerate_scan_devices.restype = c_int
+libudev_udev_enumerate_scan_devices.argtypes = [ c_void_p ]
+libudev_udev_enumerate_get_list_entry = libudev.udev_enumerate_get_list_entry
+libudev_udev_enumerate_get_list_entry.restype = c_void_p
+libudev_udev_enumerate_get_list_entry.argtypes = [ c_void_p ]
+
+libudev_udev_device_get_devlinks_list_entry = libudev.udev_device_get_devlinks_list_entry
+libudev_udev_device_get_devlinks_list_entry.restype = c_void_p
+libudev_udev_device_get_devlinks_list_entry.argtypes = [ c_void_p ]
+
+
+class UdevDevice(dict):
+
+ def __init__(self, udev, sysfs_path):
+ dict.__init__(self)
+
+ # create new udev device from syspath
+ udev_device = libudev_udev_device_new_from_syspath(udev, sysfs_path)
+ if not udev_device:
+ # device does not exist
+ return
+
+ # set syspath and sysname properties
+ self.syspath = libudev_udev_device_get_syspath(udev_device)
+ self.sysname = libudev_udev_device_get_sysname(udev_device)
+
+ # get the devlinks list
+ devlinks = []
+ devlinks_entry = libudev_udev_device_get_devlinks_list_entry(udev_device)
+
+ while devlinks_entry:
+ path = libudev_udev_list_entry_get_name(devlinks_entry)
+ devlinks.append(path)
+
+ devlinks_entry = libudev_udev_list_entry_get_next(devlinks_entry)
+
+ # add devlinks list to the dictionary
+ self["symlinks"] = devlinks
+
+ # get the first property entry
+ property_entry = libudev_udev_device_get_properties_list_entry(udev_device)
+
+ while property_entry:
+ name = libudev_udev_list_entry_get_name(property_entry)
+ value = libudev_udev_list_entry_get_value(property_entry)
+
+ # lvm outputs values for multiple lvs in one line
+ # we want to split them and make a list
+ # if the first lv's value is empty we end up with a value starting
+ # with name=, prepend a space that our split does the right thing
+ if value.startswith("%s=" % name):
+ value = " " + value
+
+ if value.count(" %s=" % name):
+ value = value.split(" %s=" % name)
+
+ self[name] = value
+
+ # get next property entry
+ property_entry = libudev_udev_list_entry_get_next(property_entry)
+
+ # set additional properties
+ self.devpath = libudev_udev_device_get_devpath(udev_device)
+ self.subsystem = libudev_udev_device_get_subsystem(udev_device)
+ self.devtype = libudev_udev_device_get_devtype(udev_device)
+ self.sysnum = libudev_udev_device_get_sysnum(udev_device)
+ self.devnode = libudev_udev_device_get_devnode(udev_device)
+
+ # cleanup
+ libudev_udev_device_unref(udev_device)
+
+
+class Udev(object):
+
+ def __init__(self):
+ self.udev = libudev_udev_new()
+
+ def create_device(self, sysfs_path):
+ return UdevDevice(self.udev, sysfs_path)
+
+ def enumerate_devices(self, subsystem=None):
+ enumerate = libudev_udev_enumerate_new(self.udev)
+
+ # add the match subsystem
+ if subsystem is not None:
+ rc = libudev_udev_enumerate_add_match_subsystem(enumerate, subsystem)
+ if not rc == 0:
+ print("error: unable to add the match subsystem", file=sys.stderr)
+ libudev_udev_enumerate_unref(enumerate)
+ return []
+
+ # scan the devices
+ rc = libudev_udev_enumerate_scan_devices(enumerate)
+ if not rc == 0:
+ print("error: unable to enumerate the devices", file=sys.stderr)
+ libudev_udev_enumerate_unref(enumerate)
+ return []
+
+ # create the list of sysfs paths
+ sysfs_paths = []
+
+ # get the first list entry
+ list_entry = libudev_udev_enumerate_get_list_entry(enumerate)
+
+ while list_entry:
+ sysfs_path = libudev_udev_list_entry_get_name(list_entry)
+ sysfs_paths.append(sysfs_path)
+
+ # get next list entry
+ list_entry = libudev_udev_list_entry_get_next(list_entry)
+
+ # cleanup
+ libudev_udev_enumerate_unref(enumerate)
+
+ return sysfs_paths
+
+ def scan_devices(self, sysfs_paths=None):
+ if sysfs_paths is None:
+ sysfs_paths = self.enumerate_devices()
+
+ for sysfs_path in sysfs_paths:
+ device = self.create_device(sysfs_path)
+
+ if device:
+ yield device
+
+ def unref(self):
+ libudev_udev_unref(self.udev)
+ self.udev = None