From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6997052726746021888 X-Received: by 2002:a05:6402:3128:: with SMTP id dd8mr21170454edb.40.1629128296342; Mon, 16 Aug 2021 08:38:16 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a17:906:d1d6:: with SMTP id bs22ls3905274ejb.3.gmail; Mon, 16 Aug 2021 08:38:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx5cdb+beomy78b16N+gcoPUtXQRTE36PPC4q81YHr7eikIz7Lxgp6N4ywKMVaRq10WzSfO X-Received: by 2002:a17:906:a08a:: with SMTP id q10mr16452118ejy.100.1629128295408; Mon, 16 Aug 2021 08:38:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629128295; cv=none; d=google.com; s=arc-20160816; b=hsHaQPaECQtymCuV5c68DRQPa9oxMnEdbwz9MIqfo6k/tV+PjBI25p23kZDGQewYBn drd7h94CtGigLbavHmLOH4owfLth7MXEvkoFBkyDnbaZLvVpRcGb91Aan+GlbbGQKTHg L3CzS0X0kmigrlBfxbPFfJhf0uN554pwXlL/Cg1CRvgZF2p6r6XBPDBp0dN/99d+pwx2 I3fzTjaoErPY2SHi+Hh4wU0IEqQ7v4YhtL0T//xBpCbSyxaqshWEwc2zKtk8/8DAuBdD dGcl7IzMdp25XyB0EH02Onj63u0R0G6XqqtjZnZYdXiNm8DTKfNV5QMsd6jMZo9s7Yin XpJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=deYHmBPJ2QcobNR2RB5qcGCdaabUzCQdB6VIxKHhKJo=; b=mXtMGuNBZeR6W4kzcMJhJu5tHuiJhbTMxCnOUW/B/YtAerJTEj3c4XaXQoLV55s78h lKNqI8wtyaU/m/DH2jMSoYQTQWezEsoBMpnlUlFpzuL+RUbM/6B4+My503tWxATVlEW7 IFd32GfamezBViFkR038h2VkGE8aUdpOD44J/JmTexdRH9ngf9GXFwm13Ije7+jx7qgV C+OEp3Z7NsDU37DjFu1rGh7kjcGDa/KVn+lfFJPeBd+ryUbT7Zx7vkdlSobM2X/LzQR+ N09rgruOS0OKksdocDTjqoVBRFrGeFdeAZ5XW8w1dt0mTcg3JAvgQFe9HEydWYQ8uBKz uptQ== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Return-Path: Received: from shymkent.ilbers.de (shymkent.ilbers.de. [85.214.156.166]) by gmr-mx.google.com with ESMTPS id 24si144139edv.4.2021.08.16.08.38.15 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 16 Aug 2021 08:38:15 -0700 (PDT) Received-SPF: pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) client-ip=85.214.156.166; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Received: from localhost.localdomain (mm-146-26-214-37.mgts.dynamic.pppoe.byfly.by [37.214.26.146] (may be forged)) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8) with ESMTPSA id 17GFc3gx004556 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 16 Aug 2021 17:38:10 +0200 From: Anton Mikanovich To: isar-users@googlegroups.com Cc: Anton Mikanovich Subject: [PATCH v4 1/5] Revert "dpkg: Make mount buildroot reliable" Date: Mon, 16 Aug 2021 18:37:52 +0300 Message-Id: <20210816153756.3549038-2-amikan@ilbers.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210816153756.3549038-1-amikan@ilbers.de> References: <20210816153756.3549038-1-amikan@ilbers.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-TUID: iFFTK6SGkBCk d21d49578e5a "dpkg: Make mount buildroot reliable" has broken API compatibility with downstream layers: all functions using dpkg_do_mounts and dpkg_undo_mounts had to be rewritten in Python. This reverts commit d21d49578e5a3b0019075d1946bd93a95914fcca to retain the possibility to call dpkg_do_mounts and dpkg_undo_mounts from shell functions. Signed-off-by: Anton Mikanovich --- meta/classes/dpkg-base.bbclass | 127 +++++++++++++-------------------- meta/classes/dpkg-gbp.bbclass | 8 ++- meta/classes/dpkg.bbclass | 14 ++-- 3 files changed, 59 insertions(+), 90 deletions(-) diff --git a/meta/classes/dpkg-base.bbclass b/meta/classes/dpkg-base.bbclass index ec8fbc1..4b189f1 100644 --- a/meta/classes/dpkg-base.bbclass +++ b/meta/classes/dpkg-base.bbclass @@ -61,7 +61,12 @@ addtask patch before do_adjust_git SRC_APT ?= "" -fetch_apt() { +do_apt_fetch() { + if [ -z "${@d.getVar("SRC_APT", True).strip()}" ]; then + return 0 + fi + dpkg_do_mounts + E="${@ isar_export_proxies(d)}" sudo -E chroot ${BUILDCHROOT_DIR} /usr/bin/apt-get update \ -o Dir::Etc::SourceList="sources.list.d/isar-apt.list" \ -o Dir::Etc::SourceParts="-" \ @@ -71,19 +76,8 @@ fetch_apt() { sudo -E chroot --userspec=$( id -u ):$( id -g ) ${BUILDCHROOT_DIR} \ sh -c 'mkdir -p /downloads/deb-src/"$1"/"$2" && cd /downloads/deb-src/"$1"/"$2" && apt-get -y --download-only --only-source source "$2"' my_script "${DISTRO}" "${uri}" done -} - -python do_apt_fetch() { - src_apt = d.getVar("SRC_APT", True) - if not src_apt: - return 0 - dpkg_do_mounts(d) - try: - isar_export_proxies(d) - bb.build.exec_func("fetch_apt", d) - finally: - dpkg_undo_mounts(d) + dpkg_undo_mounts } addtask apt_fetch after do_unpack before do_apt_unpack @@ -92,7 +86,14 @@ do_apt_fetch[lockfiles] += "${REPO_ISAR_DIR}/isar.lock" # Add dependency from the correct buildchroot: host or target do_apt_fetch[depends] = "${BUILDCHROOT_DEP}" -unpack_apt() { +do_apt_unpack() { + if [ -z "${@d.getVar("SRC_APT", True).strip()}" ]; then + return 0 + fi + rm -rf ${S} + dpkg_do_mounts + E="${@ isar_export_proxies(d)}" + for uri in "${SRC_APT}"; do sudo -E chroot --userspec=$( id -u ):$( id -g ) ${BUILDCHROOT_DIR} \ sh -c ' \ @@ -103,25 +104,8 @@ unpack_apt() { dpkg-source -x "${dscfile}" "${PPS}"' \ my_script "${DISTRO}" "${uri}" done -} -python do_apt_unpack() { - import shutil - - src_apt = d.getVar("SRC_APT", True) - if not src_apt: - return 0 - - srcsubdir = d.getVar('S', True) - if os.path.exists(srcsubdir): - shutil.rmtree(srcsubdir) - - dpkg_do_mounts(d) - try: - isar_export_proxies(d) - bb.build.exec_func("unpack_apt", d) - finally: - dpkg_undo_mounts(d) + dpkg_undo_mounts } addtask apt_unpack after do_apt_fetch before do_patch @@ -165,38 +149,25 @@ do_prepare_build[deptask] = "do_deploy_deb" BUILDROOT = "${BUILDCHROOT_DIR}/${PP}" -def ismount(path): - real = os.path.realpath(path) - with open('/proc/mounts') as f: - for line in f.readlines(): - if len(line.split()) > 2 and real == line.split()[1]: - return True - return False - -def dpkg_do_mounts(d): - buildroot = d.getVar('BUILDROOT', True) - if ismount(buildroot): - bb.warn('Path %s already mounted!' % buildroot) - return - workdir = d.getVar('WORKDIR', True) - os.makedirs(buildroot, exist_ok=True) - os.system('sudo mount --bind %s %s' % (workdir, buildroot)) - bb.build.exec_func("buildchroot_do_mounts", d) - -def dpkg_undo_mounts(d): - bb.build.exec_func("buildchroot_undo_mounts", d) - buildroot = d.getVar('BUILDROOT', True) - if not ismount(buildroot): - bb.warn('Path %s not mounted!' % buildroot) - return - for i in range(200): - if not os.system('sudo umount %s' % buildroot): - os.rmdir(buildroot) - return - if i % 100 == 0: - bb.warn("%s: Couldn't unmount, retrying..." % buildroot) - time.sleep(0.1) - bb.fatal("Couldn't unmount, exiting...") +dpkg_do_mounts() { + mkdir -p ${BUILDROOT} + sudo mount --bind ${WORKDIR} ${BUILDROOT} + + buildchroot_do_mounts +} + +dpkg_undo_mounts() { + i=1 + while ! sudo umount ${BUILDROOT}; do + sleep 0.1 + i=`expr $i + 1` + if [ $i -gt 100 ]; then + bbwarn "${BUILDROOT}: Couldn't unmount, retrying..." + i=1 + fi + done + sudo rmdir ${BUILDROOT} +} # Placeholder for actual dpkg_runbuild() implementation dpkg_runbuild() { @@ -206,12 +177,10 @@ dpkg_runbuild() { python do_dpkg_build() { lock = bb.utils.lockfile(d.getVar("REPO_ISAR_DIR") + "/isar.lock", shared=True) - dpkg_do_mounts(d) - try: - bb.build.exec_func("dpkg_runbuild", d) - finally: - dpkg_undo_mounts(d) - bb.utils.unlockfile(lock) + bb.build.exec_func("dpkg_do_mounts", d) + bb.build.exec_func("dpkg_runbuild", d) + bb.build.exec_func("dpkg_undo_mounts", d) + bb.utils.unlockfile(lock) } addtask dpkg_build before do_build @@ -255,16 +224,16 @@ python do_devshell() { oe_lib_path = os.path.join(d.getVar('LAYERDIR_core'), 'lib') sys.path.insert(0, oe_lib_path) - dpkg_do_mounts(d) - try: - isar_export_proxies(d) + bb.build.exec_func('dpkg_do_mounts', d) + + isar_export_proxies(d) + + buildchroot = d.getVar('BUILDCHROOT_DIR') + pp_pps = os.path.join(d.getVar('PP'), d.getVar('PPS')) + termcmd = "sudo -E chroot {0} sh -c 'cd {1}; $SHELL -i'" + oe_terminal(termcmd.format(buildchroot, pp_pps), "Isar devshell", d) - buildchroot = d.getVar('BUILDCHROOT_DIR') - pp_pps = os.path.join(d.getVar('PP'), d.getVar('PPS')) - termcmd = "sudo -E chroot {0} sh -c 'cd {1}; $SHELL -i'" - oe_terminal(termcmd.format(buildchroot, pp_pps), "Isar devshell", d) - finally: - dpkg_undo_mounts(d) + bb.build.exec_func('dpkg_undo_mounts', d) } addtask devshell after do_prepare_build diff --git a/meta/classes/dpkg-gbp.bbclass b/meta/classes/dpkg-gbp.bbclass index 20d2d4c..d956e8c 100644 --- a/meta/classes/dpkg-gbp.bbclass +++ b/meta/classes/dpkg-gbp.bbclass @@ -12,7 +12,12 @@ PATCHTOOL ?= "git" GBP_DEPENDS ?= "git-buildpackage pristine-tar" GBP_EXTRA_OPTIONS ?= "--git-pristine-tar" -builddeps_install_append() { +do_install_builddeps_append() { + dpkg_do_mounts + distro="${DISTRO}" + if [ ${ISAR_CROSS_COMPILE} -eq 1 ]; then + distro="${HOST_DISTRO}" + fi deb_dl_dir_import "${BUILDCHROOT_DIR}" "${distro}" sudo -E chroot ${BUILDCHROOT_DIR} \ apt-get install -y -o Debug::pkgProblemResolver=yes \ @@ -21,6 +26,7 @@ builddeps_install_append() { sudo -E chroot ${BUILDCHROOT_DIR} \ apt-get install -y -o Debug::pkgProblemResolver=yes \ --no-install-recommends ${GBP_DEPENDS} + dpkg_undo_mounts } dpkg_runbuild_prepend() { diff --git a/meta/classes/dpkg.bbclass b/meta/classes/dpkg.bbclass index 29e2b89..4e7c2f7 100644 --- a/meta/classes/dpkg.bbclass +++ b/meta/classes/dpkg.bbclass @@ -6,7 +6,9 @@ inherit dpkg-base PACKAGE_ARCH ?= "${DISTRO_ARCH}" # Install build dependencies for package -builddeps_install() { +do_install_builddeps() { + dpkg_do_mounts + E="${@ isar_export_proxies(d)}" distro="${DISTRO}" if [ ${ISAR_CROSS_COMPILE} -eq 1 ]; then distro="${HOST_DISTRO}" @@ -17,15 +19,7 @@ builddeps_install() { deb_dl_dir_export "${BUILDCHROOT_DIR}" "${distro}" sudo -E chroot ${BUILDCHROOT_DIR} /isar/deps.sh \ ${PP}/${PPS} ${PACKAGE_ARCH} -} - -python do_install_builddeps() { - dpkg_do_mounts(d) - isar_export_proxies(d) - try: - bb.build.exec_func("builddeps_install", d) - finally: - dpkg_undo_mounts(d) + dpkg_undo_mounts } addtask install_builddeps after do_prepare_build before do_dpkg_build -- 2.25.1