1 From: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
2 Date: Tue, 8 Mar 2016 00:44:05 +0100
3 Subject: [PATCH] Prevent common cross-debootstrap newaliases issue.
5 While building target images for a different arch (using qemu-user-static),
6 the following issue prevents the succesful image build:
7 newaliases: fatal: inet_addr_local[getifaddrs]:
8 getifaddrs: Address family not supported by protocol
10 For more information, see [1].
12 [1] https://bugs.launchpad.net/ubuntu/+source/postfix/+bug/1531299
14 fuel_agent/manager.py | 14 ++++++++++++++
15 fuel_agent/utils/build.py | 24 ++++++++++++++++++++++++
16 2 files changed, 38 insertions(+)
18 diff --git a/fuel_agent/manager.py b/fuel_agent/manager.py
19 index 637c99a..86f76b9 100644
20 --- a/fuel_agent/manager.py
21 +++ b/fuel_agent/manager.py
22 @@ -1037,10 +1037,15 @@ class Manager(object):
23 direct_repo_addrs=driver_os.proxies.direct_repo_addr_list)
24 self._update_metadata_with_repos(
25 metadata, driver_os.repos)
26 + # Prevent common cross-debootstraping problem w/ newaliases & qemu
27 + # inet_addr_local[getifaddrs]: getifaddrs: Address family not supp
28 + LOG.debug('Preventing newaliases from running inside chroot')
29 + bu.prevent_qemu_newaliases(chroot)
30 LOG.debug('Installing packages using apt-get: %s',
32 # disable hosts/resolv files
33 bu.propagate_host_resolv_conf(chroot)
35 if hasattr(bs_scheme, 'certs') and bs_scheme.certs:
36 bu.copy_update_certs(bs_scheme.certs, chroot)
37 bu.run_apt_get(chroot, packages=packages,
38 @@ -1084,5 +1089,6 @@ class Manager(object):
39 # restore disabled hosts/resolv files
40 bu.restore_resolv_conf(chroot)
41 + bu.restore_newaliases(chroot)
42 metadata['all_packages'] = bu.get_installed_packages(chroot)
43 # We need to recompress initramfs with new compression:
44 bu.recompress_initramfs(
45 @@ -1175,6 +1181,11 @@ class Manager(object):
46 self._update_metadata_with_repos(
47 metadata, driver_os.repos)
49 + # Prevent common cross-debootstraping problem w/ newaliases & qemu
50 + # inet_addr_local[getifaddrs]: getifaddrs: Address family not supp
51 + LOG.debug('Preventing newaliases from running inside chroot')
52 + bu.prevent_qemu_newaliases(chroot)
54 LOG.debug('Installing packages using apt-get: %s',
56 bu.run_apt_get(chroot, packages=packages,
57 @@ -1187,6 +1198,9 @@ class Manager(object):
58 allow_unsigned_file=CONF.allow_unsigned_file,
59 force_ipv4_file=CONF.force_ipv4_file)
61 + LOG.debug('Restoring newaliases command inside chroot')
62 + bu.restore_newaliases(chroot)
64 LOG.debug('Making sure there are no running processes '
65 'inside chroot before trying to umount chroot')
66 if not bu.stop_chrooted_processes(chroot, signal=signal.SIGTERM):
67 diff --git a/fuel_agent/utils/build.py b/fuel_agent/utils/build.py
68 index 1bc0a5f..5761cc5 100644
69 --- a/fuel_agent/utils/build.py
70 +++ b/fuel_agent/utils/build.py
71 @@ -339,6 +339,30 @@ def prevent_qemu_replacement(chroot, arch):
72 utils.execute('chroot', chroot, 'ln', '-sf', '/bin/true',
73 '/usr/sbin/update-binfmts')
75 +def prevent_qemu_newaliases(chroot):
76 + """Prevents running newaliases under qemu-user-static inside chroot.
78 + Use dpkg-divert to prevent running newaliases binary through qemu inside
79 + chroot which is necessary to avoid a dpkg --configure error:
80 + inet_addr_local[getifaddrs]: getifaddrs: Address family not supported ...
82 + utils.execute('chroot', chroot,
83 + 'dpkg-divert', '--local', '--rename', '--add',
84 + '/usr/bin/newaliases')
85 + utils.execute('chroot', chroot, 'ln', '-sf', '/bin/true',
86 + '/usr/bin/newaliases')
88 +def restore_newaliases(chroot):
89 + """Restores newaliases inside chroot after previous dpkg-divert.
91 + opposite to prevent_qemu_newaliases
93 + utils.execute('chroot', chroot,
94 + 'rm', '-f', '/usr/bin/newaliases')
95 + utils.execute('chroot', chroot,
96 + 'dpkg-divert', '--local', '--rename', '--remove',
97 + '/usr/bin/newaliases')
99 def create_sparse_tmp_file(dir, suffix, size=8192):
100 """Creates sparse file.