FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Ubuntu > Kubuntu Development

 
 
LinkBack Thread Tools
 
Old 11-11-2009, 02:39 AM
 
Default Anaconda-devel-list Digest, Vol 69, Issue 24

Send Anaconda-devel-list mailing list submissions to
anaconda-devel-list@redhat.com

To subscribe or unsubscribe via the World Wide Web, visit
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
or, via email, send a message with subject or body 'help' to
anaconda-devel-list-request@redhat.com

You can reach the person managing the list at
anaconda-devel-list-owner@redhat.com

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Anaconda-devel-list digest..."


Today's Topics:

1. Re: [rhel5-branch] Adds interactive install support for NFS
options (#493052) (Chris Lumens)
2. Re: [PATCH] Added the libudev python bindings (Hans de Goede)
3. Re: [PATCH] Set boot flag for /boot on mdraid 1 array too
(#533533). (Hans de Goede)
4. [rhel5-branch] Sleep if the kickstart file read fails.
(Ales Kozumplik)


----------------------------------------------------------------------

Message: 1
Date: Tue, 10 Nov 2009 10:27:07 -0500
From: Chris Lumens <clumens@redhat.com>
Subject: Re: [rhel5-branch] Adds interactive install support for NFS
options (#493052)
To: anaconda-devel-list@redhat.com
Message-ID: <20091110152707.GH2208@localhost.localdomain>
Content-Type: text/plain; charset=us-ascii

> >This should also go onto master so we don't have a RHEL5->RHEL6
> >regression.
> >
> >- Chris
>
> I agree, I thought of that too. Unfortunately the patch there will
> be quite different. So no simple merge. Will have to wait a couple
> of days now, but I won't forget about it.

That's fine. We'll just have to add a different patch eventually -
before December if possible.

- Chris



------------------------------

Message: 2
Date: Tue, 10 Nov 2009 17:24:29 +0100
From: Hans de Goede <hdegoede@redhat.com>
Subject: Re: [PATCH] Added the libudev python bindings
To: anaconda-devel-list@redhat.com
Message-ID: <4AF993BD.7070603@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Hi,

On 11/10/2009 04:19 PM, Martin Gracik wrote:
> Also rewrote the baseudev.py to use the bindings instead of parsing
> the udev db file
> ---
> baseudev.py | 66 ++++++----------------
> pyudev.py | 180
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++
> 2 files changed, 197 insertions(+), 49 deletions(-)
> create mode 100644 pyudev.py
>
> diff --git a/baseudev.py b/baseudev.py
> index 76b14cc..978bae0 100644
> --- a/baseudev.py
> +++ b/baseudev.py
> @@ -23,6 +23,7 @@
>
> import iutil
> import os
> +import pyudev
>
> import logging
> log = logging.getLogger("storage")
> @@ -43,20 +44,24 @@ def udev_get_device(sysfs_path):
> log.debug("%s does not exist" % sysfs_path)
> return None
>
> - db_entry = sysfs_path.replace("/", "x2f")
> - db_root = "/dev/.udev/db"
> - db_path = os.path.normpath("%s/%s" % (db_root, db_entry))
> - if not os.access(db_path, os.R_OK):
> - log.debug("db entry %s does not exist" % db_path)
> - return None
> + udev = pyudev.Udev()
> + # XXX we remove the /sys part when enumerating devices,
> + # so we have to prepend it when creating the device
> + udev_device = udev.create_device("/sys" + sysfs_path)
> + udev.teardown()
> +

Not sure if I like the teardown() name, this implies that after this
things can be setup again, which is not true.

> + dev = udev_device.properties
> +
> + if dev:
> + # remove the /dev/ part from beginning of devnode and set as name
> + dev["name"] = udev_device.devnode[5:]
> +

This is not correct, this will return mapper/Volgroup-Volname for LV's where
it
should return just Volgroup-Volname, please find out which libudev function
return
the actual internal libudev name and use that instead.

> + dev["symlinks"] = dev["DEVLINKS"].split()
> + dev["sysfs_path"] = sysfs_path
>
> - entry = open(db_path).read()
> - dev = udev_parse_entry(entry)
> - if dev.has_key("name"):
> - dev['sysfs_path'] = sysfs_path
> + # now add in the contents of the uevent file since they're handy
> dev = udev_parse_uevent_file(dev)
>
> - # now add in the contents of the uevent file since they're handy
> return dev
>
> def udev_get_devices(deviceClass="block"):
> @@ -68,45 +73,8 @@ def udev_get_devices(deviceClass="block"):
> entries.append(entry)
> return entries
>
> -def udev_parse_entry(buf):
> - dev = {}
> -
> - for line in buf.splitlines():
> - line.strip()
> - (tag, sep, val) = line.partition(":")
> - if not sep:
> - continue
> -
> - if tag == "N":
> - dev['name'] = val
> - elif tag == "S":
> - if dev.has_key('symlinks'):
> - dev['symlinks'].append(val)
> - else:
> - dev['symlinks'] = [val]
> - elif tag == "E":
> - if val.count("=")> 1 and val.count(" ")> 0:
> - # eg: LVM2_LV_NAME when querying the VG for its LVs
> - vars = val.split()
> - vals = []
> - var_name = None
> - for (index, subval) in enumerate(vars):
> - (var_name, sep, var_val) = subval.partition("=")
> - if sep:
> - vals.append(var_val)
> -
> - dev[var_name] = vals
> - else:
> - (var_name, sep, var_val) = val.partition("=")
> - if not sep:
> - continue
> -
> - dev[var_name] = var_val
> -
> - return dev
> -
> def udev_parse_uevent_file(dev):
> - path = os.path.normpath("/sys/%s/uevent" % dev['sysfs_path'])
> + path = os.path.normpath("/sys/%s/uevent" % dev["sysfs_path"])

This is a meaningless change, which does not belong in this patch

> if not os.access(path, os.R_OK):
> return dev
>
> diff --git a/pyudev.py b/pyudev.py
> new file mode 100644
> index 0000000..8d5a7c2
> --- /dev/null
> +++ b/pyudev.py
> @@ -0,0 +1,180 @@
> +import sys
> +import os
> +import fnmatch
> +from ctypes import *
> +
> +
> +# XXX this one may need some tweaking...
> +def find_library(name):
> + libdirs = ("/lib64", "/lib")
> +
> + for dir in libdirs:
> + files = fnmatch.filter(os.listdir(dir), "*%s*" % name)
> + files = [os.path.join(dir, file) for file in files]
> +
> + if files:
> + break
> +
> + if files:
> + return files[0]
> + else:
> + return None
> +

Please make the matching here less flexible, we want something
mathching "lib%s.so.%d" % (name, somajor), where somajor is a
new parameter to find_library, this way we can also detect if the ABI
ever changes underneed us, as then the somajor will change and we
will no longer find the library.

> +
> +# find the udev library
> +libudev = find_library("udev")
> +
> +if not libudev or not os.path.exists(libudev):
> + raise ImportError, "No library named %s" % libudev
> +
> +# 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_unref = libudev.udev_unref
> +
> +libudev_udev_device_new_from_syspath =
libudev.udev_device_new_from_syspath
> +libudev_udev_device_unref = libudev.udev_device_unref
> +
> +libudev_udev_device_get_syspath = libudev.udev_device_get_syspath
> +libudev_udev_device_get_sysname = libudev.udev_device_get_sysname
> +libudev_udev_device_get_syspath.restype = c_char_p
> +libudev_udev_device_get_sysname.restype = c_char_p
> +
> +libudev_udev_device_get_properties_list_entry =
libudev.udev_device_get_properties_list_entry
> +libudev_udev_list_entry_get_next = libudev.udev_list_entry_get_next
> +
> +libudev_udev_list_entry_get_name = libudev.udev_list_entry_get_name
> +libudev_udev_list_entry_get_value = libudev.udev_list_entry_get_value
> +libudev_udev_list_entry_get_name.restype = c_char_p
> +libudev_udev_list_entry_get_value.restype = c_char_p
> +
> +libudev_udev_enumerate_new = libudev.udev_enumerate_new
> +libudev_udev_enumerate_unref = libudev.udev_enumerate_unref
> +
> +libudev_udev_enumerate_add_match_subsystem =
libudev.udev_enumerate_add_match_subsystem
> +libudev_udev_enumerate_scan_devices = libudev.udev_enumerate_scan_devices
> +libudev_udev_enumerate_get_list_entry =
libudev.udev_enumerate_get_list_entry
> +
> +
> +class UdevDevice(object):
> +
> + def __init__(self, udev, sysfs_path):
> + self.syspath = None
> + self.sysname = None
> + self.properties = {}
> +
> + # 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 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)
> +
> + # XXX we have to split some of the values into a list,
> + # the libudev is not so smart
> + fields = value.split()
> +
> + if len(fields)> 1:
> + value = [fields[0]]
> +
> + for item in fields[1:]:
> + (key, sep, val) = item.partition("=")
> + if sep:
> + value.append(val)
> +
> + if len(value) == 1:
> + value = value[0]
> +
> + self.properties[name] = value
> +
> + # get next property entry
> + property_entry =
libudev_udev_list_entry_get_next(property_entry)
> +
> + # set additional properties
> + libudev.udev_device_get_devpath.restype = c_char_p
> + self.devpath = libudev.udev_device_get_devpath(udev_device)
> +
> + libudev.udev_device_get_subsystem.restype = c_char_p
> + self.subsystem = libudev.udev_device_get_subsystem(udev_device)
> +
> + libudev.udev_device_get_devtype.restype = c_char_p
> + self.devtype = libudev.udev_device_get_devtype(udev_device)
> +
> + libudev.udev_device_get_sysnum.restype = c_char_p
> + self.sysnum = libudev.udev_device_get_sysnum(udev_device)
> +
> + libudev.udev_device_get_devnode.restype = c_char_p
> + self.devnode = libudev.udev_device_get_devnode(udev_device)
> +
> + # cleanup
> + libudev_udev_device_unref(udev_device)
> +
> + def __str__(self):
> + s = "SYSPATH: %s
" % self.syspath
> + s += "SYSNAME: %s" % self.sysname
> +
> + return s
> +
> +
> +class Udev(object):
> +
> + def __init__(self):
> + self.udev = libudev_udev_new()
> +
> + def create_device(self, sysfs_path):
> + return UdevDevice(self.udev, sysfs_path)
> +
> + def scan_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(enumera te,
subsystem)
> + if not rc == 0:
> + print>> sys.stderr, "error: unable to add the match
subsystem"
> + libudev_udev_enumerate_unref(enumerate)
> + return []
> +
> + # scan the devices
> + rc = libudev_udev_enumerate_scan_devices(enumerate)
> + if not rc == 0:
> + print>> sys.stderr, "error: unable to scan the devices"
> + libudev_udev_enumerate_unref(enumerate)
> + return []
> +
> + # create the list of devices
> + devices = []
> +
> + # get the first device entry
> + device_entry = libudev_udev_enumerate_get_list_entry(enumerate)
> +
> + while device_entry:
> + sysfs_path = libudev_udev_list_entry_get_name(device_entry)
> + device = self.create_device(sysfs_path)
> +
> + if device.syspath is not None:
> + devices.append(device)
> +
> + # get next device entry
> + device_entry = libudev_udev_list_entry_get_next(device_entry)
> +
> + # cleanup
> + libudev_udev_enumerate_unref(enumerate)
> +
> + return devices
> +
> + def teardown(self):
> + libudev_udev_unref(self.udev)

You will want to set self.udev to None after this, and check all other uses
for it to be not None, other
wise you may cause a segfault (referring freed memory) !

Regards,

Hana



------------------------------

Message: 3
Date: Tue, 10 Nov 2009 17:53:08 +0100
From: Hans de Goede <hdegoede@redhat.com>
Subject: Re: [PATCH] Set boot flag for /boot on mdraid 1 array too
(#533533).
To: anaconda-devel-list@redhat.com
Message-ID: <4AF99A74.7070703@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Hi,

On 11/10/2009 02:57 PM, Radek Vykydal wrote:
> ---
> storage/__init__.py | 17 ++++++++++++-----
> 1 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/storage/__init__.py b/storage/__init__.py
> index 70c3227..4e911ed 100644
> --- a/storage/__init__.py
> +++ b/storage/__init__.py
> @@ -281,13 +281,20 @@ class Storage(object):
> # now set the boot partition's flag
> try:
> boot = self.anaconda.platform.bootDevice()
> + if boot.type == "mdarray":
> + bootDevs = [self.devicetree.getDeviceByName(x) for x in
> +
self.anaconda.id.bootloader.getPhysicalDevices(boo t.name)]

Why not just use boot.parents ? The getPhysicalDevices() thingy in booty is
a leftover
from older times, which one day we should get rid of, not use more often


> + else:
> + bootDevs = [boot]
> except DeviceError:
> - boot = None
> + bootDevs = []
> else:
> - if hasattr(boot, "bootable"):
> - boot.bootable = True
> - boot.disk.setup()
> - boot.disk.format.commitToDisk()
> + for dev in bootDevs:
> + if hasattr(dev, "bootable"):
> + log.info("setting boot flag on %s" % dev.name)
> + dev.bootable = True
> + dev.disk.setup()
> + dev.disk.format.commitToDisk()
>

Other then that it looks good.

Regards,

Hans



------------------------------

Message: 4
Date: Tue, 10 Nov 2009 17:56:20 +0100
From: Ales Kozumplik <akozumpl@redhat.com>
Subject: [rhel5-branch] Sleep if the kickstart file read fails.
To: anaconda-devel-list@redhat.com
Message-ID: <1257872180-16953-1-git-send-email-akozumpl@redhat.com>

BZ #460566, if a read from a block device (like USB key) or a cdrom (USB
cdrom) fails, sleep to give the device some time to initialize. The patch
was proposed by Jeffrey Bastian <jbastian@redhat.com>.
---
loader2/cdinstall.c | 10 +++++++++-
loader2/method.c | 20 ++++++++++++++++----
2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/loader2/cdinstall.c b/loader2/cdinstall.c
index 3aeb1e1..2694e82 100644
--- a/loader2/cdinstall.c
+++ b/loader2/cdinstall.c
@@ -438,13 +438,21 @@ void setKickstartCD(struct loaderData_s * loaderData,
int argc, char ** argv) {
}

int kickstartFromCD(char *kssrc) {
- int rc, i;
+ int i = 0, rc;
char *p, *kspath;
struct device ** devices;

logMessage(INFO, "getting kickstart file from first CDROM");

devices = probeDevices(CLASS_CDROM, BUS_UNSPEC, 0);
+ /* usb can take some time to settle, even with the various hacks we
+ * have in place. some systems use portable USB CD-ROM drives, try to
+ * make sure there really isn't one before bailing */
+ while (!devices && (i++ < 10)) {
+ sleep(2);
+ logMessage(DEBUGLVL, "sleeping to wait for a USB CD-ROM");
+ devices = probeDevices(CLASS_CDROM, BUS_UNSPEC, 0);
+ }
if (!devices) {
logMessage(ERROR, "No CDROM devices found!");
return 1;
diff --git a/loader2/method.c b/loader2/method.c
index 1905f9f..a874d98 100644
--- a/loader2/method.c
+++ b/loader2/method.c
@@ -644,8 +644,11 @@ int copyFileAndLoopbackMount(int fd, char * dest,
2 - could not mount device as ext2, vfat, or iso9660
3 - file named path not there
*/
+#define TRYMOUNT(fs)
+ (doPwMount("/tmp/srcdev", "/tmp/mnt", (fs), IMOUNT_RDONLY, NULL))
+
int getFileFromBlockDevice(char *device, char *path, char * dest) {
- int rc;
+ int i = 0, s = 1, rc;
char file[4096];

logMessage(INFO, "getFileFromBlockDevice(%s, %s)", device, path);
@@ -655,9 +658,16 @@ int getFileFromBlockDevice(char *device, char *path,
char * dest) {
return 1;
}

- if (doPwMount("/tmp/srcdev", "/tmp/mnt", "vfat", IMOUNT_RDONLY, NULL)
&&
- doPwMount("/tmp/srcdev", "/tmp/mnt", "ext2", IMOUNT_RDONLY, NULL)
&&
- doPwMount("/tmp/srcdev", "/tmp/mnt", "iso9660", IMOUNT_RDONLY,
NULL)) {
+ /* some USB thumb drives and hard drives are slow to initialize */
+ /* retry up to 5 times or 31 seconds */
+ rc = TRYMOUNT("vfat") && TRYMOUNT("ext2") && TRYMOUNT("iso9660");
+ while (rc && (i++ < 5)) {
+ sleep(s);
+ s <<= 1;
+ logMessage(DEBUGLVL, "sleeping to wait for USB storage devices");
+ rc = TRYMOUNT("vfat") && TRYMOUNT("ext2") && TRYMOUNT("iso9660");
+ }
+ if (rc) {
logMessage(ERROR, "failed to mount /dev/%s: %s", device,
strerror(errno));
return 2;
@@ -680,6 +690,8 @@ int getFileFromBlockDevice(char *device, char *path,
char * dest) {
return rc;
}

+#undef TRYMOUNT
+
void setMethodFromCmdline(char * arg, struct loaderData_s * ld) {
char * c, * dup;

--
1.6.2.5



------------------------------

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

End of Anaconda-devel-list Digest, Vol 69, Issue 24
************************************************** *

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 09:30 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org