Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- set -x
- export LC_ALL=C
- CWD="$(realpath "$(dirname "${0%/*}")")"
- cd "$CWD"
- EXTRA_SFS=(../Palemoon-portable_29.0.1.sfs ../devx_430.sfs)
- Cont_Root=/mnt/cont
- #TODO: fix spelling of CONT_NAME_SOUCE
- CONT_NAME_SOUCE="" #These manes must have a length greater than 1 so as to exclude "/". I'll make this more general later
- CONT_NAME_DEST="puppy4_palemoon"
- unset CHROOT_CMD; [ -z "$CHROOT_CMD" ] && CHROOT_CMD=/init_basic #/opt/PaleMoon-portable-v29.01/LAUNCH #defaultbrowser
- unset EXECUTE
- unset NO_EXIT
- unset Mount_PT_to_Del # xephyr-disp
- declare -a options="$(busybox getopt -o c:,e:,n: -l "chroot-command::,chroot-cmd::,cmd::,command::,no-exit::,source-subdir:,dest-subdir:,xephyr-disp::,use-unshare::" -- "$@")"
- #eval set --"$options_str"
- eval set --"$options"
- while [ $# -gt 0 ]; do
- case "$1" in
- --use-unshare)
- if [ $# -lt 2 ] || [[ $2 = -* ]]; then
- USE_UNSHAR=":2"
- shift 1
- else
- USE_UNSHAR="yes"
- shift 2
- fi
- ;;
- --xephyr-disp)
- if [ $# -lt 2 ] || [[ $2 != :* ]]; then
- XephyrDISPLAY=":2"
- shift 1
- else
- XephyrDISPLAY="$2"
- shift 2
- fi
- ;;
- -c|--chroot-cmd|--chroot-command)
- if [ $# -lt 2 ] || [[ $2 = -* ]]; then
- CHROOT_CMD=( /bin/sh )
- shift 1
- else
- CHROOT_CMD=( $2 )
- shift 2
- fi
- [ -z ${EXECUTE+x} ] && EXECUTE=""
- ;;
- -e|--cmd|--command)
- if [ $# -lt 2 ] || [[ $2 = -* ]]; then
- EXECUTE=( /bin/sh )
- shift 1
- else
- EXECUTE=( $2 )
- shift 2
- fi
- [ -z ${CHROOT_CMD+x} ] && CHROOT_CMD=""
- ;;
- --source-subdir)
- CONT_NAME_SOUCE="$2"
- shift 2
- ;;
- --dest-subdir)
- CONT_NAME_DEST="$2"
- shift 2
- ;;
- --no-exit)
- if [ $# -lt 2 ] || [[ $2 = 1* ]]; then
- NO_EXIT=true
- shift 1
- else
- NO_EXIT=$2
- shift 2
- fi
- ;;
- --)
- shift
- break
- ;;
- *)
- shift
- ;;
- esac
- done
- export CONT_NAME_DEST="$CONT_NAME_DEST"
- if [ -z ${NO_EXIT+x} ]; then
- NO_EXIT=false
- fi
- if [ -z ${CHROOT_CMD+x} ] && [ -z ${EXECUTE+x} ]; then
- CHROOT_CMD=( /bin/sh )
- EXECUTE=""
- fi
- for a_pattern in 'puppy_.*[.]sfs' '.*iron.*[.]sfs' '.*chromium.*[.]sfs' '.*firefox.*[.]sfs'; do
- SFS_NAME="$(ls -1 .. | grep -E "$a_pattern" | head -n 1 | sed -r 's#^[.][.]/##g' | sed -r 's#[.]sfs##g')"
- [ ! -z "$SFS_NAME" ] && break
- done
- Parent_WD="$(realpath "$PWD/..")"
- SFS_PATH="$Parent_WD/$SFS_NAME".sfs
- SFS_PATH="$(realpath "$SFS_PATH")"
- Mount_PT_ID="" #Don't edit this
- function umountall(){
- set +x
- read -p "umountall(): Press enter to continue"
- set -x
- umount -l /${CONT_NAME_DEST}/tmp/.X11-unix
- umount -l /${CONT_NAME_DEST}/dev/pts
- umount -l /${CONT_NAME_DEST}/dev
- umount -l /${CONT_NAME_DEST}/proc
- umount -l /${CONT_NAME_DEST}/sys
- umount -l "/$CONT_NAME_DEST"
- umount -l "$Cont_TMPFS"
- umount -l "${BIND_Target}"
- for a_mp in "${EXTRA_SFS_MPS[@]}"; do
- umount -l "$a_mp"
- done
- if [ -z ${Mount_PT_to_Del+x} ]; then
- files_to_remove=("/${CONT_NAME_DEST}" "$Cont_TMPFS" "$BIND_Target_Root")
- else
- files_to_remove=("/${CONT_NAME_DEST}" "$Cont_TMPFS" "$Mount_PT_to_Del" "$BIND_Target_Root")
- fi
- for to_remove in "${files_to_remove[@]}"; do
- to_remove="$(realpath "/${to_remove}")"
- if [ -z "$(cat /proc/mounts | grep "${to_remove}")" ] &&
- [ ${#to_remove} -gt 1 ]; then
- rm -rf ${to_remove}
- fi
- done
- xhost -
- }
- trap 'umountall' 1
- if [ ! -e "/${CONT_NAME_DEST}" ] && [ ! -h "/${CONT_NAME_DEST}" ] || [ -z "$(ls -A "/${CONT_NAME_DEST}")" ]; then
- mkdir -p /${CONT_NAME_DEST}
- else
- cd /
- CONT_NAME_DEST=$(mktemp -d ${CONT_NAME_DEST}.XXXXXXX)
- fi
- append_mnt_id_awk='
- function get_mnt_id(mnt_pt,loop){
- if (length(mnt_pt) > 0 && length(loop)>0){
- cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | grep " mnt_pt " | head -n 1"
- } else if (length(mnt_pt) > 0){
- cmd="cat /proc/self/mountinfo | sort | grep '" mnt_pt "' | head -n 1"
- } else if (length(loop)>0){
- cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | head -n 1"
- }
- while ((cmd | getline )){
- mnt_id=$1
- break
- }
- close(cmd)
- return mnt_id
- }
- {
- mnt_pt=$1
- loop=$2
- mnt_id=get_mnt_id(mnt_pt,loop)
- print mnt_id "|" mnt_pt "|" loop
- }'
- loop=$(losetup -a | grep "$SFS_PATH" | sed "s/:.*$//" )
- if [ ! -z "$loop" ]; then
- #Mount_PT=$(findmnt -o TARGET,SOURCE -D -n | grep "${loop}\$" | cut -f1 -d' ')
- Mount_PT="$(findmnt -o TARGET,SOURCE -D -n | grep "${loop}\$" | awk "$append_mnt_id_awk" | sort -t '|' -k1 | cut -d'|' -f2 | head -n 1)"
- fi
- if [ -z "$Mount_PT" ] || [ -z "$loop" ]; then
- Mount_PT=${CHROOT_DIR:-/mnt/cont/sfs_img}
- if [ -d "$Mount_PT" ]; then
- echo "Directory is empty but exists: $Mount_PT" >&2
- elif [ ! -z "$(ls -A "$Mount_PT")" ]; then
- Mount_PT=$(mktemp -d -p "$Cont_Root" sfs_img.XXXXXXX)
- Mount_PT_ID=".${Mount_PT##*.}"
- mkdir -p "${Mount_PT}"
- fi
- mkdir -p "${Mount_PT}"
- mount -o loop "$SFS_PATH" "$Mount_PT"
- Mount_PT_to_Del=$Mount_PT
- fi
- #MNTPNT=${CHROOT_DIR:-/mnt/chroot-$SFS_NAME}
- if [ ${#CONT_NAME_SOUCE} -le 1 ]; then
- BIND_Source="${Mount_PT}"
- else
- BIND_Source="${Mount_PT}/${CONT_NAME_SOUCE}"
- fi
- #mkdir -p "$BIND_Source"
- BIND_Target_Root="$Cont_Root"/sfs__target${Mount_PT_ID}
- if [ ${#Mount_PT_ID} -gt 0 ]; then
- BIND_Target_Root="$Cont_Root"/sfs__target${Mount_PT_ID}
- elif [ -z "$(ls -A "$BIND_Target_Root")" ]; then
- BIND_Target_Root="$Cont_Root"/sfs__target
- else
- BIND_Target_Root=$(mktemp -d -p "$Cont_Root" sfs__target.XXXXXXX)
- fi
- mkdir -p "$BIND_Target_Root"
- if [ ${#CONT_NAME_DEST} -gt 0 ]; then
- BIND_Target=$BIND_Target_Root/${CONT_NAME_DEST}
- else
- BIND_Target=$BIND_Target_Root
- fi
- mkdir -p "$BIND_Target"
- if [ ${#Mount_PT_ID} -gt 0 ]; then
- Cont_TMPFS="$Cont_Root"/tmpfs${Mount_PT_ID}
- elif [ -z "$(ls -A "${Cont_Root}/tmpfs")" ]; then
- Cont_TMPFS="$Cont_Root"/tmpfs
- else
- Cont_TMPFS=$(mktemp -d -p "$Cont_Root" tmpfs.XXXXXXX)
- fi
- mkdir -p "$Cont_TMPFS"
- mount -t tmpfs none "$Cont_TMPFS"
- #mount -t tmpfs none $BIND_Target_Root;
- append_mnt_id_awk='
- function get_mnt_id(mnt_pt,loop){
- if (length(mnt_pt) > 0 && length(loop)>0){
- cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | grep " mnt_pt " | head -n 1"
- } else if (length(mnt_pt) > 0){
- cmd="cat /proc/self/mountinfo | sort | grep '" mnt_pt "' | head -n 1"
- } else if (length(loop)>0){
- cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | head -n 1"
- }
- while ((cmd | getline )){
- mnt_id=$1
- break
- }
- close(cmd)
- return mnt_id
- }
- {
- mnt_pt=$1
- loop=$2
- mnt_id=get_mnt_id(mnt_pt,loop)
- print mnt_id "|" mnt_pt "|" loop
- }'
- EXTRA_SFS_MPS=()
- for a_sfs_o in "${EXTRA_SFS[@]}"; do
- a_sfs="$(realpath "$a_sfs_o")"
- [ -z "$a_sfs" ] && a_sfs="$(realpath "../$a_sfs_o")"
- [ -z "$a_sfs" ] && a_sfs=$(cd .. ; echo `pwd`/$a_sfs_o)
- [ ! -f "$a_sfs" ] && continue
- a_sfs_bname="$(basename "$a_sfs")"
- if [ ${#Mount_PT_ID} -gt 0 ]; then
- a_sfs_MP="$Cont_Root"/"$a_sfs_bname"${Mount_PT_ID}
- elif [ -z "$(ls -A "${Cont_Root}/a_sfs_bname")" ]; then
- a_sfs_MP="$Cont_Root"/"$a_sfs_bname"
- else
- a_sfs_MP=$(mktemp -d -p "$Cont_Root" a_sfs_bname.XXXXXXX)
- fi
- mkdir -p "$a_sfs_MP"
- loop=$(losetup -a | grep "${a_sfs}" | sed "s/:.*$//" )
- if [ ! -z "$loop" ]; then #
- sfs_MP="$(findmnt -o TARGET,SOURCE -D -n | grep $loop\$ | awk "$append_mnt_id_awk" | sort -t '|' -k1 | cut -d'|' -f2 | head -n 1)"
- mount --bind "${sfs_MP}" "${a_sfs_MP}"
- else
- mount -r -t squashfs "${a_sfs}" "$a_sfs_MP"
- fi
- [ -d "$a_sfs_MP" ] && [ -f "$a_sfs" ] && EXTRA_SFS_MPS+=("$a_sfs_MP")
- done
- #NEW=''
- #MOUNTED_PUP_RO=$(busybox df | grep -o '/initrd/pup_ro.*')
- ## pup_ro1 and pup_ro2 are reserved
- #for i in $(seq 3 99) # find free pup_roX
- #do
- # if ! [ "$(echo "$MOUNTED_PUP_RO" | grep "pup_ro${i}$")" ] ; then
- # NEW=${i}
- # break
- # fi
- #done
- #Cont_Layer=/initrd/pup_ro$NEW
- mount --bind "${BIND_Source}" "${BIND_Target}"
- #ln -s "$BIND_Target_Root" "$Cont_Layer"
- #set +x
- #read -p "Press enter to continue"
- #set -x
- BRANCHES="udba=reval,diropq=w,br:${Cont_TMPFS}=rw:${BIND_Target}=rr"
- for a_branch in "${EXTRA_SFS_MPS[@]}"; do
- BRANCHES+=":$a_branch=ro"
- done
- busybox mount -t aufs -o "$BRANCHES" aufs "/$CONT_NAME_DEST" || { umountall && exit 1; }
- #busybox mount -t aufs -o remount,append:$BIND_Target_Root=rr / || { umountall && exit 1; }
- CMD_FP="/$CONT_NAME_DEST/${CHROOT_CMD}"
- if [ ! -e "$CMD_FP" ]; then
- CMD_FP_trim="${CMD_FP%-nosb}"
- if [ "$CMD_FP_trim" != "$CMD_FP" ] && [ -e "$CMD_FP_trim" ]; then
- cat "$CMD_FP_trim" | sed -rn \
- '/run-as-spot "\$HERE\/chrome"/ {s#^(.*)$#"$HERE/chrome" --no-sandbox --user-data-dir=$HERE/PROFILE --disable-infobars "$@"#g;}
- /run-as-spot "\$HERE\/chrome"/! {p}' > "$CMD_FP"
- chmod +x "$CMD_FP"
- fi
- fi
- mkdir -p /${CONT_NAME_DEST}/dev
- mkdir -p /${CONT_NAME_DEST}/proc
- mkdir -p /${CONT_NAME_DEST}/sys
- mkdir -p /${CONT_NAME_DEST}/dev/pts
- mount --bind /dev /${CONT_NAME_DEST}/dev
- mount --bind /proc /${CONT_NAME_DEST}/proc
- mount --bind /sys /${CONT_NAME_DEST}/sys
- mount -t devpts devpts /${CONT_NAME_DEST}/dev/pts
- cp /etc/resolv.conf /${CONT_NAME_DEST}/etc/resolv.conf
- cp /var/lib/dbus/machine-id /${CONT_NAME_DEST}/var/lib/dbus/machine-id
- [ -f .Xauthority ] && cp /root/.Xauthority /${CONT_NAME_DEST}/root/.Xauthority
- xhost +
- mkdir -p /${CONT_NAME_DEST}/tmp/.X11-unix
- mount --rbind /tmp/.X11-unix /${CONT_NAME_DEST}/tmp/.X11-unix
- cd /${CONT_NAME_DEST}
- #set +x
- if [ -z ${USE_UNSHARE+x} ]; then
- if [ -e /proc/1/ns/pid ] && [ -e /proc/1/ns/mnt ] && type unshare >/dev/null #&& [ -z $NO_NS ];
- then
- USE_UNSHARE=yes
- else
- USE_UNSHARE=no
- fi
- fi
- if [ "$USE_UNSHARE" = yes ]; then
- CHROOT_UTIL=( unshare -f -C -u -p --mount-proc="/${CONT_NAME_DEST}/proc" chroot )
- else
- CHROOT_UTIL=(chroot)
- fi
- if [ ! -z "${EXECUTE}" ]; then
- cd /"$CONT_NAME_DEST"
- set +x
- echo "next cmd: \"${EXECUTE[@]}\" \"$@\""
- read -p "Ready to EXECUTE Press enter to continue"
- set -x
- #set +x
- "${EXECUTE[@]}" "$@"
- elif [ ! -z "${CHROOT_CMD}" ]; then
- set +x
- echo "next cmd: chroot /${CONT_NAME_DEST} \"${CHROOT_CMD[@]}\" \"$@\""
- read -p "Ready to chroot Press enter to continue"
- set -x
- if [ -z "$XephyrDISPLAY" ]; then
- #Can't XFORWARD over ssh from puppy4 to newer puppies, but can use Xephyr as a workaround.
- LD_LIBRARY_PATH="/lib:/usr/lib:/usr/X11R7/lib:/root/my-applications/lib:/opt/qt4/lib" ${CHROOT_UTIL[@]} /${CONT_NAME_DEST} "${CHROOT_CMD[@]}" "$@"
- else
- cd "$CWD"
- source init_scripts.sh
- if [ "$(ls -1 /tmp/.X11-unix | tr 'X' ':')" != "$XephyrDISPLAY" ]; then
- XP="-fullscreen -title container -name Xephyr2 -dpi 144 -nolisten tcp"
- Xephyr $XephyrDISPLAY ${XP} &
- fi
- LD_LIBRARY_PATH="/lib:/usr/lib:/usr/X11R7/lib:/root/my-applications/lib:/opt/qt4/lib" DISPLAY=$XephyrDISPLAY ${CHROOT_UTIL[@]} /${CONT_NAME_DEST} "${CHROOT_CMD[@]}" "$@"
- fi
- else
- LD_LIBRARY_PATH="/lib:/usr/lib:/usr/X11R7/lib:/root/my-applications/lib:/opt/qt4/lib" chroot /${CONT_NAME_DEST} /bin/sh "$@"
- fi
- set -x
- if [ ! NO_EXIT = true ]; then
- umountall
- fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement