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..44a5f0c2 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,8 @@ 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]) +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 51a70e8c..dbb84dca 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_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 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) @@ -25,10 +25,13 @@ 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,[@]UNSHARE[@],$(UNSHARE),g' \ -e 's,[@]VERSION[@],$(VERSION),g' chroot.env: $(srcdir)/chroot.env.sh @@ -43,6 +46,14 @@ 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 $@ + env.fakechroot: $(srcdir)/env.fakechroot.sh $(do_subst) < $(srcdir)/env.fakechroot.sh > $@ chmod +x $@ @@ -55,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 new file mode 100644 index 00000000..527384b1 --- /dev/null +++ b/scripts/arch-chroot.env.sh @@ -0,0 +1,37 @@ +# 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 +@UNSHARE@=${fakechroot_bindir:-@bindir@}/unshare.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 diff --git a/scripts/pacstrap.env.sh b/scripts/pacstrap.env.sh new file mode 100644 index 00000000..3ac03a5e --- /dev/null +++ b/scripts/pacstrap.env.sh @@ -0,0 +1,37 @@ +# 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 +@UNSHARE@=${fakechroot_bindir:-@bindir@}/unshare.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 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}"