Initial code commit
[armband.git] / patches / fuel-agent / 0004-Prevent-common-cross-debootstrap-newaliases-issue.patch
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.
4
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
9
10 For more information, see [1].
11
12 [1] https://bugs.launchpad.net/ubuntu/+source/postfix/+bug/1531299
13 ---
14  fuel_agent/manager.py     | 14 ++++++++++++++
15  fuel_agent/utils/build.py | 24 ++++++++++++++++++++++++
16  2 files changed, 38 insertions(+)
17
18 diff --git a/fuel_agent/manager.py b/fuel_agent/manager.py
19 index 6322a10..843c40b 100644
20 --- a/fuel_agent/manager.py
21 +++ b/fuel_agent/manager.py
22 @@ -836,10 +836,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',
31                        ' '.join(packages))
32              # disable hosts/resolv files
33              bu.propagate_host_resolv_conf(chroot)
34 +
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 @@ -873,6 +878,7 @@ class Manager(object):
39                              force_ipv4_file=CONF.force_ipv4_file)
40              # restore disabled hosts/resolv files
41              bu.restore_resolv_conf(chroot)
42 +            bu.restore_newaliases(chroot)
43              metadata['all_packages'] = bu.get_installed_packages(chroot)
44              # We need to recompress initramfs with new compression:
45              bu.recompress_initramfs(
46 @@ -964,6 +970,11 @@ class Manager(object):
47              self._update_metadata_with_repos(
48                  metadata, driver_os.repos)
49  
50 +            # Prevent common cross-debootstraping problem w/ newaliases & qemu
51 +            # inet_addr_local[getifaddrs]: getifaddrs: Address family not supp
52 +            LOG.debug('Preventing newaliases from running inside chroot')
53 +            bu.prevent_qemu_newaliases(chroot)
54 +
55              LOG.debug('Installing packages using apt-get: %s',
56                        ' '.join(packages))
57              bu.run_apt_get(chroot, packages=packages,
58 @@ -974,6 +985,9 @@ class Manager(object):
59                              allow_unsigned_file=CONF.allow_unsigned_file,
60                              force_ipv4_file=CONF.force_ipv4_file)
61  
62 +            LOG.debug('Restoring newaliases command inside chroot')
63 +            bu.restore_newaliases(chroot)
64 +
65              LOG.debug('Making sure there are no running processes '
66                        'inside chroot before trying to umount chroot')
67              if not bu.stop_chrooted_processes(chroot, signal=signal.SIGTERM):
68 diff --git a/fuel_agent/utils/build.py b/fuel_agent/utils/build.py
69 index abd762e..e11ceba 100644
70 --- a/fuel_agent/utils/build.py
71 +++ b/fuel_agent/utils/build.py
72 @@ -331,6 +331,30 @@ def prevent_qemu_replacement(chroot, arch):
73      utils.execute('chroot', chroot, 'ln', '-sf', '/bin/true',
74                    '/usr/sbin/update-binfmts')
75  
76 +def prevent_qemu_newaliases(chroot):
77 +    """Prevents running newaliases under qemu-user-static inside chroot.
78 +
79 +    Use dpkg-divert to prevent running newaliases binary through qemu inside
80 +    chroot which is necessary to avoid a dpkg --configure error:
81 +    inet_addr_local[getifaddrs]: getifaddrs: Address family not supported ...
82 +    """
83 +    utils.execute('chroot', chroot,
84 +                  'dpkg-divert', '--local', '--rename', '--add',
85 +                  '/usr/bin/newaliases')
86 +    utils.execute('chroot', chroot, 'ln', '-sf', '/bin/true',
87 +                  '/usr/bin/newaliases')
88 +
89 +def restore_newaliases(chroot):
90 +    """Restores newaliases inside chroot after previous dpkg-divert.
91 +
92 +    opposite to prevent_qemu_newaliases
93 +    """
94 +    utils.execute('chroot', chroot,
95 +                  'rm', '-f', '/usr/bin/newaliases')
96 +    utils.execute('chroot', chroot,
97 +                  'dpkg-divert', '--local', '--rename', '--remove',
98 +                  '/usr/bin/newaliases')
99 +
100  def create_sparse_tmp_file(dir, suffix, size=8192):
101      """Creates sparse file.
102  
103 -- 
104 1.9.1
105