On 07/11/2012 02:59 PM, Lucas Meneghel Rodrigues wrote:
> On Wed, 2012-07-11 at 14:45 -0300, Cleber Rosa wrote:
>> Signed-off-by: Cleber Rosa <[email protected]>
>> ---
>> client/tools/boottool.py | 154
>> ++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 154 insertions(+)
>>
>> diff --git a/client/tools/boottool.py b/client/tools/boottool.py
>> index 5f5db67..d50553d 100755
>> --- a/client/tools/boottool.py
>> +++ b/client/tools/boottool.py
>> @@ -488,6 +488,149 @@ def parse_entry(entry_str, separator='='):
>> return entry
>>
>>
>> +def detect_distro_type():
>> + '''
>> + Simple distro detection based on release/version files
>> + '''
>> + if os.path.exists('/etc/redhat-release'):
>> + return 'redhat'
>> + elif os.path.exists('/etc/debian_version'):
>> + return 'debian'
>> + else:
>> + return None
>> +
>> +
>> +class DebianBuildDeps(object):
>> + '''
>> + Checks and install grubby build dependencies on Debian (like) systems
>> +
>> + Tested on:
>> + * Debian Squeeze (6.0)
>> + * Ubuntu 12.04 LTS
>> + '''
>> +
>> +
>> + PKGS = ['gcc', 'make', 'libpopt-dev', 'libblkid-dev']
>> +
>> +
>> + def check(self):
>> + '''
>> + Checks if necessary packages are already installed
>> + '''
>> + result = True
>> + for p in self.PKGS:
>> + args = ['dpkg-query', '--show', '--showformat=${Status}', p]
>> + output = subprocess.Popen(args, shell=False,
>> + stdin=subprocess.PIPE,
>> + stdout=subprocess.PIPE,
>> + stderr=subprocess.PIPE,
>> + close_fds=True).stdout.read()
>> + if not output == 'install ok installed':
>> + result = False
>> + return result
>> +
>> +
>> + def install(self):
>> + '''
>> + Attempt to install the build dependencies via a package manager
>> + '''
>> + if self.check():
>> + return True
>> + else:
>> + try:
>> + args = ['apt-get', 'update', '-qq']
>> + subprocess.call(args,
>> + stdout=subprocess.PIPE,
>> + stderr=subprocess.PIPE)
>> +
>> + args = ['apt-get', 'install', '-qq'] + self.PKGS
>> + subprocess.call(args,
>> + stdout=subprocess.PIPE,
>> + stderr=subprocess.PIPE)
>> + except OSError:
>> + pass
>> + return self.check()
>> +
>> +
>> +class RPMBuildDeps(object):
>> + '''
>> + Base class for RPM based systems
>> + '''
>> + def check(self):
>> + '''
>> + Checks if necessary packages are already installed
>> + '''
>> + result = True
>> + for p in self.PKGS:
>> + args = ['rpm', '-q', '--qf=%{NAME}', p]
>> + output = subprocess.Popen(args, shell=False,
>> + stdin=subprocess.PIPE,
>> + stdout=subprocess.PIPE,
>> + stderr=subprocess.PIPE,
>> + close_fds=True).stdout.read()
>> + if not output.startswith(p):
>> + result = False
>> +
>> + return result
>> +
>> +
>> +class RedHatBuildDeps(RPMBuildDeps):
>> + '''
>> + Checks and install grubby build dependencies on RedHat (like) systems
>> +
>> + Tested on:
>> + * Fedora 17
>> + * RHEL 5
>> + * RHEL 6
>> + '''
>> +
>> +
>> + PKGS = ['gcc', 'make']
>> + REDHAT_RELEASE_RE = re.compile('.*\srelease\s(\d)\.(\d)\s.*')
>> +
>> +
>> + def __init__(self):
>> + '''
>> + Initializes a new dep installer, taking into account RHEL version
>> + '''
>> + match =
>> self.REDHAT_RELEASE_RE.match(open('/etc/redhat-release').read())
>> + if match:
>> + major, minor = match.groups()
>> + if int(major) <= 5:
>> + self.PKGS += ['popt', 'e2fsprogs-devel']
>> + else:
>> + self.PKGS += ['popt-devel', 'libblkid-devel']
>> +
>> +
>> + def install(self):
>> + '''
>> + Attempt to install the build dependencies via a package manager
>> + '''
>> + if self.check():
>> + return True
>> + else:
>> + try:
>> + args = ['yum', 'install', '-q', '-y'] + self.PKGS
>> +
>> + # This is an extra safety step, to install the needed header
>> + # in case the blkid headers package could not be detected
>> + args += ['/usr/include/popt.h',
>> + '/usr/include/blkid/blkid.h']
>> +
>> + result = subprocess.call(args,
>> + stdout=subprocess.PIPE,
>> + stderr=subprocess.PIPE)
>> + except OSError:
>> + pass
>> + return self.check()
>> +
>> +
>> +DISTRO_DEPS_MAPPING = {
>> + 'debian' : DebianBuildDeps,
>> + 'redhat' : RedHatBuildDeps
>> + }
> Ok, the implementation looks clean and nice. It's too bad that we
> already have client/shared/software_manager.py that can handle this
> package manager install logic, but since this has to be standalone, it's
> better to have this here than putting code to guess the 1 milion
> different paths software_manager.py can be installed.
Yeah, that was reason for re-writing this. I did try to keep it as
simple as possible though.
>
>> +
>> def install_grubby_if_necessary(path=None):
>> '''
>> Installs grubby if it's necessary on this system
>> @@ -1329,6 +1472,17 @@ class Grubby(object):
>>
>> topdir = tempfile.mkdtemp()
>>
>> + deps_klass = DISTRO_DEPS_MAPPING.get(detect_distro_type(), None)
>> + if deps_klass is not None:
>> + deps = deps_klass()
>> + if not deps.check():
>> + self.log.warn('Installing distro build deps for grubby.
>> This '
>> + 'may take a while, depending on bandwidth and
>> '
>> + 'actual number of packages to install')
>> + if not deps.install():
>> + self.log.error('Failed to install distro build deps for
>> '
>> + 'grubby')
>> +
>> tarball = self.grubby_install_fetch_tarball(topdir)
>> if tarball is None:
>> raise GrubbyInstallException('Failed to fetch grubby tarball')
> This looks good to me.
>
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest