From c1503d55db3b63cdfba308b7a8b20f0bc7679817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Sat, 25 Apr 2020 07:03:30 -0400 Subject: [PATCH 1/3] Add configuration for the environment pacstrap --- config.sh.in | 2 ++ configure.ac | 2 ++ scripts/Makefile.am | 10 ++++++++-- scripts/pacstrap.env.sh | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 scripts/pacstrap.env.sh diff --git a/config.sh.in b/config.sh.in index a0fd53e1..67fa390e 100644 --- a/config.sh.in +++ b/config.sh.in @@ -9,9 +9,11 @@ FAKEROOT=@FAKEROOT@ ISCHROOT=@ISCHROOT@ LDCONFIG=@LDCONFIG@ LDD=@LDD@ +MOUNT=@MOUNT@ PERL=@PERL@ POD2MAN=@POD2MAN@ PROVE=@PROVE@ SED=@SED@ SEQ=@SEQ@ SHELL=@SHELL@ +UMOUNT=@UMOUNT@ diff --git a/configure.ac b/configure.ac index f8cdb323..e8b1e1c7 100644 --- a/configure.ac +++ b/configure.ac @@ -52,6 +52,7 @@ AC_PATH_PROG([ISCHROOT], [ischroot], [/usr/bin/ischroot], [/usr/bin:/bin:/sbin:/ AC_PATH_PROG([LDCONFIG], [ldconfig], [/sbin/chroot], [/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) AC_PATH_PROG([LDD], [ldd], [/usr/bin/ldd], [/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH]) AC_PATH_PROG([LS], [ls], [/bin/ls], [/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH]) +AC_PATH_PROG([MOUNT], [mount], [/bin/mount], [/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) AC_PATH_PROG([MKFIFO], [mkfifo], [/usr/bin/mkfifo], [/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH]) AC_PATH_PROG([PERL], [perl], [/usr/bin/perl], [/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/core_perl:/usr/local/bin:/usr/local/sbin:$PATH]) AC_PATH_PROG([POD2MAN], [pod2man], [], [/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/core_perl:/usr/local/bin:/usr/local/sbin:$PATH]) @@ -60,6 +61,7 @@ AC_PATH_PROG([SEQ], [seq gseq], [], [/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bi AC_PATH_PROG([SH], [sh], [/bin/sh], [/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:$PATH]) AC_PATH_PROG([SHELL], [bash dash sh], [/bin/sh], [/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:$PATH]) AC_PATH_PROG([SYSTEMCTL], [systemctl], [/sbin/systemctl], [/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) +AC_PATH_PROG([UMOUNT], [umount], [/bin/umount], [/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) # Additional C macros AC_DEFINE([FAKECHROOT], [PACKAGE_VERSION], [FAKECHROOT]) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 51a70e8c..7624f4b6 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,12 +1,12 @@ sysconfdir = @sysconfdir@/@PACKAGE@ src_wrappers = chroot.fakechroot.sh env.fakechroot.sh fakechroot.sh ldd.fakechroot.pl -src_envs = chroot.env.sh debootstrap.env.sh rinse.env.sh +src_envs = chroot.env.sh debootstrap.env.sh pacstrap.env.sh rinse.env.sh example_scripts = relocatesymlinks.sh restoremode.sh savemode.sh bin_SCRIPTS = env.fakechroot fakechroot ldd.fakechroot sbin_SCRIPTS = chroot.fakechroot -sysconf_DATA = chroot.env debootstrap.env rinse.env +sysconf_DATA = chroot.env debootstrap.env pacstrap.env rinse.env EXTRA_DIST = $(src_wrappers) $(src_envs) $(example_scripts) CLEANFILES = $(bin_SCRIPTS) $(sbin_SCRIPTS) $(sysconf_DATA) @@ -25,10 +25,12 @@ do_subst = $(SED) -e 's,[@]bindir[@],$(bindir),g' \ -e 's,[@]LDCONFIG[@],$(LDCONFIG),g' \ -e 's,[@]LDD[@],$(LDD),g' \ -e 's,[@]MKFIFO[@],$(MKFIFO),g' \ + -e 's,[@]MOUNT[@],$(MOUNT),g' \ -e 's,[@]PERL[@],$(PERL),g' \ -e 's,[@]SEQ[@],$(SEQ),g' \ -e 's,[@]SHELL[@],$(SHELL),g' \ -e 's,[@]SYSTEMCTL[@],$(SYSTEMCTL),g' \ + -e 's,[@]UMOUNT[@],$(UMOUNT),g' \ -e 's,[@]VERSION[@],$(VERSION),g' chroot.env: $(srcdir)/chroot.env.sh @@ -43,6 +45,10 @@ debootstrap.env: $(srcdir)/debootstrap.env.sh $(do_subst) < $(srcdir)/debootstrap.env.sh > $@ chmod +x $@ +pacstrap.env: $(srcdir)/pacstrap.env.sh + $(do_subst) < $(srcdir)/pacstrap.env.sh > $@ + chmod +x $@ + env.fakechroot: $(srcdir)/env.fakechroot.sh $(do_subst) < $(srcdir)/env.fakechroot.sh > $@ chmod +x $@ diff --git a/scripts/pacstrap.env.sh b/scripts/pacstrap.env.sh new file mode 100644 index 00000000..d2bbfa5f --- /dev/null +++ b/scripts/pacstrap.env.sh @@ -0,0 +1,36 @@ +# Additional environment setting for pacstrap + +# Add /usr/sbin and /sbin to PATH if chroot command can't be found +if ! command -v chroot >/dev/null; then + PATH="${PATH:-/usr/bin:/bin}:/usr/sbin:/sbin" + export PATH +fi + +# Set a list of command substitutions needed by pacstrap +fakechroot_pacstrap_env_cmd_subst="@MOUNT@=/bin/true +@UMOUNT@=/bin/true +@CHROOT@=${fakechroot_bindir:-@sbindir@}/chroot.fakechroot +@LDCONFIG@=/bin/true +@LDD@=${fakechroot_bindir:-@bindir@}/ldd.fakechroot" + +FAKECHROOT_CMD_SUBST="${FAKECHROOT_CMD_SUBST:+$FAKECHROOT_CMD_SUBST:}`echo \"$fakechroot_pacstrap_env_cmd_subst\" | tr '\012' ':'`" +export FAKECHROOT_CMD_SUBST + +# Set the default list of directories excluded from being chrooted +FAKECHROOT_EXCLUDE_PATH="${FAKECHROOT_EXCLUDE_PATH:-/dev:/proc:/sys}" +export FAKECHROOT_EXCLUDE_PATH + +# Set the LD_LIBRARY_PATH based on host's /etc/ld.so.conf.d/* +fakechroot_pacstrap_env_paths=` + cat /etc/ld.so.conf /etc/ld.so.conf.d/* 2>/dev/null | grep ^/ | while read fakechroot_pacstrap_env_d; do + printf '%s:' "$fakechroot_pacstrap_env_d" + done +` +if [ -n "$fakechroot_pacstrap_env_paths" ]; then + LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}${fakechroot_pacstrap_env_paths%:}" + export LD_LIBRARY_PATH +fi + +# Set the effective user ID to root +EUID=0 +export EUID From 5c781d62c575f8f4d302a7c152aee6fff904abc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Sat, 25 Apr 2020 07:16:33 -0400 Subject: [PATCH 2/3] Add configuration for the environment arch-chroot --- scripts/Makefile.am | 8 ++++++-- scripts/arch-chroot.env.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 scripts/arch-chroot.env.sh diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 7624f4b6..1ca9b556 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,12 +1,12 @@ sysconfdir = @sysconfdir@/@PACKAGE@ src_wrappers = chroot.fakechroot.sh env.fakechroot.sh fakechroot.sh ldd.fakechroot.pl -src_envs = chroot.env.sh debootstrap.env.sh pacstrap.env.sh rinse.env.sh +src_envs = chroot.env.sh debootstrap.env.sh arch-chroot.env.sh pacstrap.env.sh rinse.env.sh example_scripts = relocatesymlinks.sh restoremode.sh savemode.sh bin_SCRIPTS = env.fakechroot fakechroot ldd.fakechroot sbin_SCRIPTS = chroot.fakechroot -sysconf_DATA = chroot.env debootstrap.env pacstrap.env rinse.env +sysconf_DATA = chroot.env debootstrap.env arch-chroot.env pacstrap.env rinse.env EXTRA_DIST = $(src_wrappers) $(src_envs) $(example_scripts) CLEANFILES = $(bin_SCRIPTS) $(sbin_SCRIPTS) $(sysconf_DATA) @@ -45,6 +45,10 @@ debootstrap.env: $(srcdir)/debootstrap.env.sh $(do_subst) < $(srcdir)/debootstrap.env.sh > $@ chmod +x $@ +arch-chroot.env: $(srcdir)/arch-chroot.env.sh + $(do_subst) < $(srcdir)/arch-chroot.env.sh > $@ + chmod +x $@ + pacstrap.env: $(srcdir)/pacstrap.env.sh $(do_subst) < $(srcdir)/pacstrap.env.sh > $@ chmod +x $@ diff --git a/scripts/arch-chroot.env.sh b/scripts/arch-chroot.env.sh new file mode 100644 index 00000000..3175e74b --- /dev/null +++ b/scripts/arch-chroot.env.sh @@ -0,0 +1,36 @@ +# Additional environment setting for arch-chroot + +# Add /usr/sbin and /sbin to PATH if chroot command can't be found +if ! command -v chroot >/dev/null; then + PATH="${PATH:-/usr/bin:/bin}:/usr/sbin:/sbin" + export PATH +fi + +# Set a list of command substitutions needed by arch-chroot +fakechroot_arch_chroot_env_cmd_subst="@MOUNT@=/bin/true +@UMOUNT@=/bin/true +@CHROOT@=${fakechroot_bindir:-@sbindir@}/chroot.fakechroot +@LDCONFIG@=/bin/true +@LDD@=${fakechroot_bindir:-@bindir@}/ldd.fakechroot" + +FAKECHROOT_CMD_SUBST="${FAKECHROOT_CMD_SUBST:+$FAKECHROOT_CMD_SUBST:}`echo \"$fakechroot_arch_chroot_env_cmd_subst\" | tr '\012' ':'`" +export FAKECHROOT_CMD_SUBST + +# Set the default list of directories excluded from being chrooted +FAKECHROOT_EXCLUDE_PATH="${FAKECHROOT_EXCLUDE_PATH:-/dev:/proc:/sys}" +export FAKECHROOT_EXCLUDE_PATH + +# Set the LD_LIBRARY_PATH based on host's /etc/ld.so.conf.d/* +fakechroot_arch_chroot_env_paths=` + cat /etc/ld.so.conf /etc/ld.so.conf.d/* 2>/dev/null | grep ^/ | while read fakechroot_arch_chroot_env_d; do + printf '%s:' "$fakechroot_arch_chroot_env_d" + done +` +if [ -n "$fakechroot_arch_chroot_env_paths" ]; then + LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}${fakechroot_arch_chroot_env_paths%:}" + export LD_LIBRARY_PATH +fi + +# Set the effective user ID to root +EUID=0 +export EUID From 9db6014f92aefb2bc3b951dba3e73123c67e1c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Sat, 25 Apr 2020 07:22:21 -0400 Subject: [PATCH 3/3] Add the replacement executable for unshare --- configure.ac | 1 + scripts/Makefile.am | 9 +++++++-- scripts/arch-chroot.env.sh | 1 + scripts/pacstrap.env.sh | 1 + scripts/unshare.fakechroot.sh | 25 +++++++++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100755 scripts/unshare.fakechroot.sh diff --git a/configure.ac b/configure.ac index e8b1e1c7..44a5f0c2 100644 --- a/configure.ac +++ b/configure.ac @@ -62,6 +62,7 @@ AC_PATH_PROG([SH], [sh], [/bin/sh], [/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bi AC_PATH_PROG([SHELL], [bash dash sh], [/bin/sh], [/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:$PATH]) AC_PATH_PROG([SYSTEMCTL], [systemctl], [/sbin/systemctl], [/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) AC_PATH_PROG([UMOUNT], [umount], [/bin/umount], [/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) +AC_PATH_PROG([UNSHARE], [unshare], [/usr/bin/unshare], [/usr/sbin:/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH]) # Additional C macros AC_DEFINE([FAKECHROOT], [PACKAGE_VERSION], [FAKECHROOT]) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 1ca9b556..dbb84dca 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,10 +1,10 @@ sysconfdir = @sysconfdir@/@PACKAGE@ -src_wrappers = chroot.fakechroot.sh env.fakechroot.sh fakechroot.sh ldd.fakechroot.pl +src_wrappers = chroot.fakechroot.sh env.fakechroot.sh fakechroot.sh ldd.fakechroot.pl unshare.fakechroot src_envs = chroot.env.sh debootstrap.env.sh arch-chroot.env.sh pacstrap.env.sh rinse.env.sh example_scripts = relocatesymlinks.sh restoremode.sh savemode.sh -bin_SCRIPTS = env.fakechroot fakechroot ldd.fakechroot +bin_SCRIPTS = env.fakechroot fakechroot ldd.fakechroot unshare.fakechroot sbin_SCRIPTS = chroot.fakechroot sysconf_DATA = chroot.env debootstrap.env arch-chroot.env pacstrap.env rinse.env @@ -31,6 +31,7 @@ do_subst = $(SED) -e 's,[@]bindir[@],$(bindir),g' \ -e 's,[@]SHELL[@],$(SHELL),g' \ -e 's,[@]SYSTEMCTL[@],$(SYSTEMCTL),g' \ -e 's,[@]UMOUNT[@],$(UMOUNT),g' \ + -e 's,[@]UNSHARE[@],$(UNSHARE),g' \ -e 's,[@]VERSION[@],$(VERSION),g' chroot.env: $(srcdir)/chroot.env.sh @@ -65,6 +66,10 @@ ldd.fakechroot: $(srcdir)/ldd.fakechroot.pl $(do_subst) < $(srcdir)/ldd.fakechroot.pl > $@ chmod +x $@ +unshare.fakechroot: $(srcdir)/unshare.fakechroot.sh + $(do_subst) < $(srcdir)/unshare.fakechroot.sh > $@ + chmod +x $@ + rinse.env: $(srcdir)/rinse.env.sh $(do_subst) < $(srcdir)/rinse.env.sh > $@ chmod +x $@ diff --git a/scripts/arch-chroot.env.sh b/scripts/arch-chroot.env.sh index 3175e74b..527384b1 100644 --- a/scripts/arch-chroot.env.sh +++ b/scripts/arch-chroot.env.sh @@ -10,6 +10,7 @@ fi fakechroot_arch_chroot_env_cmd_subst="@MOUNT@=/bin/true @UMOUNT@=/bin/true @CHROOT@=${fakechroot_bindir:-@sbindir@}/chroot.fakechroot +@UNSHARE@=${fakechroot_bindir:-@bindir@}/unshare.fakechroot @LDCONFIG@=/bin/true @LDD@=${fakechroot_bindir:-@bindir@}/ldd.fakechroot" diff --git a/scripts/pacstrap.env.sh b/scripts/pacstrap.env.sh index d2bbfa5f..3ac03a5e 100644 --- a/scripts/pacstrap.env.sh +++ b/scripts/pacstrap.env.sh @@ -10,6 +10,7 @@ fi fakechroot_pacstrap_env_cmd_subst="@MOUNT@=/bin/true @UMOUNT@=/bin/true @CHROOT@=${fakechroot_bindir:-@sbindir@}/chroot.fakechroot +@UNSHARE@=${fakechroot_bindir:-@bindir@}/unshare.fakechroot @LDCONFIG@=/bin/true @LDD@=${fakechroot_bindir:-@bindir@}/ldd.fakechroot" diff --git a/scripts/unshare.fakechroot.sh b/scripts/unshare.fakechroot.sh new file mode 100755 index 00000000..58a15684 --- /dev/null +++ b/scripts/unshare.fakechroot.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# unshare +# +# Replacement for unshare command that calls program directly +# +# (c) 2020 Gaƫl PORTAY , LGPL + +SHELL="${SHELL:-/bin/sh}" +while [ $# -gt 0 ]; do + case "$1" in + -*) + ;; + --) + shift + break + ;; + *) + break + ;; + esac + shift +done + +exec "${@:-$SHELL}"