Advertisement
s243a

simplechroot (draft#2 - 4.31 Phoenix)

Mar 10th, 2021
1,026
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 11.30 KB | None | 0 0
  1. #!/bin/bash
  2. set -x
  3. export LC_ALL=C
  4. CWD="$(realpath "$(dirname "${0%/*}")")"
  5. cd "$CWD"
  6.  
  7. EXTRA_SFS=(../Palemoon-portable_29.0.1.sfs ../devx_430.sfs)
  8.  
  9. Cont_Root=/mnt/cont
  10. #TODO: fix spelling of CONT_NAME_SOUCE
  11. CONT_NAME_SOUCE="" #These manes must have a length greater than 1 so as to exclude "/". I'll make this more general later
  12. CONT_NAME_DEST="puppy4_palemoon"
  13.  
  14. unset CHROOT_CMD; [ -z "$CHROOT_CMD" ] && CHROOT_CMD=/init_basic #/opt/PaleMoon-portable-v29.01/LAUNCH #defaultbrowser
  15. unset EXECUTE
  16. unset NO_EXIT
  17. unset Mount_PT_to_Del #                                                                                                                                                                                       xephyr-disp
  18. 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::" -- "$@")"
  19. #eval set --"$options_str"
  20. eval set --"$options"
  21. while [ $# -gt 0 ]; do
  22.  case "$1" in
  23.  --use-unshare)
  24.    if [ $# -lt 2 ] || [[ $2 = -* ]]; then
  25.      USE_UNSHAR=":2"
  26.      shift 1
  27.    else  
  28.      USE_UNSHAR="yes"
  29.      shift 2
  30.    fi
  31.    ;;  
  32.  --xephyr-disp)
  33.    if [ $# -lt 2 ] || [[ $2 !=  :* ]]; then
  34.      XephyrDISPLAY=":2"
  35.      shift 1
  36.    else  
  37.      XephyrDISPLAY="$2"
  38.      shift 2
  39.    fi
  40.    ;;
  41.  -c|--chroot-cmd|--chroot-command)
  42.    if [ $# -lt 2 ] || [[ $2 = -* ]]; then
  43.      CHROOT_CMD=( /bin/sh )
  44.      shift 1
  45.    else
  46.      CHROOT_CMD=( $2 )
  47.      shift 2
  48.    fi
  49.    [ -z ${EXECUTE+x} ] && EXECUTE=""
  50.    ;;
  51.  -e|--cmd|--command)
  52.    if [ $# -lt 2 ] || [[ $2 = -* ]]; then
  53.      EXECUTE=( /bin/sh )
  54.      shift 1
  55.    else
  56.      EXECUTE=( $2 )
  57.      shift 2
  58.    fi
  59.    [ -z ${CHROOT_CMD+x} ] && CHROOT_CMD=""
  60.    ;;
  61.  --source-subdir)
  62.    CONT_NAME_SOUCE="$2"
  63.    shift 2    
  64.    ;;
  65.  --dest-subdir)
  66.    CONT_NAME_DEST="$2"
  67.    shift 2
  68.    ;;    
  69.  --no-exit)
  70.    if [ $# -lt 2 ] || [[ $2 = 1* ]]; then
  71.      NO_EXIT=true
  72.      shift 1
  73.    else
  74.      NO_EXIT=$2
  75.      shift 2
  76.    fi
  77.    ;;
  78.  --)
  79.    shift
  80.    break
  81.    ;;
  82.  *)
  83.    shift
  84.    ;;
  85.  esac    
  86. done
  87. export CONT_NAME_DEST="$CONT_NAME_DEST"
  88. if [ -z ${NO_EXIT+x} ]; then
  89.  NO_EXIT=false
  90. fi
  91. if [ -z ${CHROOT_CMD+x} ] && [ -z ${EXECUTE+x} ]; then
  92.  CHROOT_CMD=( /bin/sh )
  93.  EXECUTE=""
  94. fi
  95. for a_pattern in 'puppy_.*[.]sfs' '.*iron.*[.]sfs' '.*chromium.*[.]sfs' '.*firefox.*[.]sfs'; do
  96.  SFS_NAME="$(ls -1 .. | grep -E "$a_pattern" | head -n 1 | sed -r 's#^[.][.]/##g' | sed -r 's#[.]sfs##g')"
  97.  [ ! -z "$SFS_NAME" ] && break
  98. done
  99. Parent_WD="$(realpath "$PWD/..")"
  100. SFS_PATH="$Parent_WD/$SFS_NAME".sfs
  101. SFS_PATH="$(realpath "$SFS_PATH")"
  102.  
  103. Mount_PT_ID="" #Don't edit this
  104. function umountall(){
  105.  set +x
  106. read -p "umountall(): Press enter to continue"
  107.  set -x
  108.  
  109.   umount -l /${CONT_NAME_DEST}/tmp/.X11-unix   
  110.  umount -l /${CONT_NAME_DEST}/dev/pts
  111.   umount -l /${CONT_NAME_DEST}/dev
  112.   umount -l /${CONT_NAME_DEST}/proc
  113.   umount -l /${CONT_NAME_DEST}/sys
  114.   umount -l "/$CONT_NAME_DEST"
  115.   umount -l "$Cont_TMPFS"
  116.   umount -l "${BIND_Target}"
  117.  for a_mp in "${EXTRA_SFS_MPS[@]}"; do
  118.    umount -l "$a_mp"
  119.  done
  120.  if [ -z ${Mount_PT_to_Del+x} ]; then
  121.    files_to_remove=("/${CONT_NAME_DEST}" "$Cont_TMPFS" "$BIND_Target_Root")
  122.  else
  123.    files_to_remove=("/${CONT_NAME_DEST}" "$Cont_TMPFS" "$Mount_PT_to_Del" "$BIND_Target_Root")
  124.  fi
  125.  for to_remove in "${files_to_remove[@]}"; do
  126.    to_remove="$(realpath "/${to_remove}")"
  127.    if [ -z "$(cat /proc/mounts | grep "${to_remove}")" ] &&
  128.       [ ${#to_remove} -gt 1 ]; then
  129.      rm -rf ${to_remove}
  130.    fi
  131.  done
  132.  
  133.  xhost -
  134. }
  135.  
  136. trap 'umountall' 1
  137.  
  138. if [ ! -e "/${CONT_NAME_DEST}" ] && [ ! -h "/${CONT_NAME_DEST}" ] || [ -z "$(ls -A "/${CONT_NAME_DEST}")" ]; then
  139.  mkdir -p /${CONT_NAME_DEST}
  140. else
  141.  cd /
  142.  CONT_NAME_DEST=$(mktemp -d ${CONT_NAME_DEST}.XXXXXXX)
  143. fi
  144.  
  145. append_mnt_id_awk='
  146. function get_mnt_id(mnt_pt,loop){
  147.  if (length(mnt_pt) > 0 && length(loop)>0){
  148.    cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | grep " mnt_pt " | head -n 1"
  149.  } else if (length(mnt_pt) > 0){
  150.    cmd="cat /proc/self/mountinfo | sort | grep '" mnt_pt "' | head -n 1"
  151.  } else if (length(loop)>0){
  152.    cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | head -n 1"
  153.  }
  154.  while ((cmd | getline )){
  155.    mnt_id=$1
  156.    break  
  157.  }
  158.  close(cmd)
  159.  return mnt_id
  160. }
  161. {
  162.  mnt_pt=$1
  163.  loop=$2
  164.  mnt_id=get_mnt_id(mnt_pt,loop)
  165.  print mnt_id "|" mnt_pt "|" loop
  166. }'
  167.  
  168. loop=$(losetup -a | grep  "$SFS_PATH"  | sed "s/:.*$//" )
  169. if [ ! -z "$loop" ]; then
  170.  #Mount_PT=$(findmnt -o TARGET,SOURCE -D -n | grep "${loop}\$" | cut -f1 -d' ')
  171.  Mount_PT="$(findmnt -o TARGET,SOURCE -D -n | grep "${loop}\$" | awk "$append_mnt_id_awk" | sort -t '|' -k1 | cut -d'|' -f2 | head -n 1)"
  172. fi
  173. if [ -z "$Mount_PT" ] || [ -z "$loop" ]; then
  174.  Mount_PT=${CHROOT_DIR:-/mnt/cont/sfs_img}
  175.  if [ -d "$Mount_PT" ]; then
  176.    echo "Directory is empty but exists: $Mount_PT" >&2
  177.  elif [ ! -z "$(ls -A "$Mount_PT")" ]; then
  178.    Mount_PT=$(mktemp -d -p "$Cont_Root" sfs_img.XXXXXXX)
  179.    Mount_PT_ID=".${Mount_PT##*.}"
  180.    mkdir -p "${Mount_PT}"
  181.  fi
  182.  mkdir -p "${Mount_PT}"
  183.  mount -o loop "$SFS_PATH" "$Mount_PT"
  184.  Mount_PT_to_Del=$Mount_PT
  185. fi
  186. #MNTPNT=${CHROOT_DIR:-/mnt/chroot-$SFS_NAME}
  187.  
  188. if [ ${#CONT_NAME_SOUCE} -le 1 ]; then
  189.  BIND_Source="${Mount_PT}"
  190. else
  191.  BIND_Source="${Mount_PT}/${CONT_NAME_SOUCE}"
  192. fi
  193. #mkdir -p "$BIND_Source"
  194.  
  195. BIND_Target_Root="$Cont_Root"/sfs__target${Mount_PT_ID}
  196. if [ ${#Mount_PT_ID} -gt 0 ]; then
  197.  BIND_Target_Root="$Cont_Root"/sfs__target${Mount_PT_ID}
  198. elif [ -z "$(ls -A "$BIND_Target_Root")" ]; then
  199.  BIND_Target_Root="$Cont_Root"/sfs__target
  200. else
  201. BIND_Target_Root=$(mktemp -d -p "$Cont_Root" sfs__target.XXXXXXX)
  202. fi
  203. mkdir -p "$BIND_Target_Root"
  204.  
  205. if [ ${#CONT_NAME_DEST} -gt 0 ]; then
  206.  BIND_Target=$BIND_Target_Root/${CONT_NAME_DEST}
  207. else
  208.  BIND_Target=$BIND_Target_Root
  209. fi
  210. mkdir -p "$BIND_Target"
  211.  
  212. if [ ${#Mount_PT_ID} -gt 0 ]; then
  213.  Cont_TMPFS="$Cont_Root"/tmpfs${Mount_PT_ID}
  214. elif [ -z "$(ls -A "${Cont_Root}/tmpfs")" ]; then
  215.  Cont_TMPFS="$Cont_Root"/tmpfs
  216. else
  217. Cont_TMPFS=$(mktemp -d -p "$Cont_Root" tmpfs.XXXXXXX)
  218. fi
  219. mkdir -p "$Cont_TMPFS"
  220. mount -t tmpfs none "$Cont_TMPFS"
  221. #mount -t tmpfs none $BIND_Target_Root;
  222. append_mnt_id_awk='
  223. function get_mnt_id(mnt_pt,loop){
  224.  if (length(mnt_pt) > 0 && length(loop)>0){
  225.    cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | grep " mnt_pt " | head -n 1"
  226.  } else if (length(mnt_pt) > 0){
  227.    cmd="cat /proc/self/mountinfo | sort | grep '" mnt_pt "' | head -n 1"
  228.  } else if (length(loop)>0){
  229.    cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | head -n 1"
  230.  }
  231.  while ((cmd | getline )){
  232.    mnt_id=$1
  233.    break  
  234.  }
  235.  close(cmd)
  236.  return mnt_id
  237. }
  238. {
  239.  mnt_pt=$1
  240.  loop=$2
  241.  mnt_id=get_mnt_id(mnt_pt,loop)
  242.  print mnt_id "|" mnt_pt "|" loop
  243. }'
  244. EXTRA_SFS_MPS=()
  245. for a_sfs_o in "${EXTRA_SFS[@]}"; do
  246.   a_sfs="$(realpath "$a_sfs_o")"
  247.   [ -z "$a_sfs" ] && a_sfs="$(realpath "../$a_sfs_o")"
  248.   [ -z "$a_sfs" ] && a_sfs=$(cd .. ; echo `pwd`/$a_sfs_o)
  249.   [ ! -f "$a_sfs" ] && continue
  250.   a_sfs_bname="$(basename "$a_sfs")"
  251.  if [ ${#Mount_PT_ID} -gt 0 ]; then
  252.    a_sfs_MP="$Cont_Root"/"$a_sfs_bname"${Mount_PT_ID}
  253.  elif [ -z "$(ls -A "${Cont_Root}/a_sfs_bname")" ]; then
  254.    a_sfs_MP="$Cont_Root"/"$a_sfs_bname"
  255.  else
  256.    a_sfs_MP=$(mktemp -d -p "$Cont_Root" a_sfs_bname.XXXXXXX)
  257.  fi
  258.  
  259.  mkdir -p "$a_sfs_MP"
  260.  loop=$(losetup -a | grep  "${a_sfs}"  | sed "s/:.*$//" )
  261.  if [ ! -z "$loop" ]; then #
  262.    sfs_MP="$(findmnt -o TARGET,SOURCE -D -n | grep $loop\$ | awk "$append_mnt_id_awk" | sort -t '|' -k1 | cut -d'|' -f2 | head -n 1)"
  263.    mount --bind "${sfs_MP}" "${a_sfs_MP}"
  264.  else
  265.    mount -r -t squashfs "${a_sfs}" "$a_sfs_MP"
  266.  
  267.  fi
  268.  [ -d "$a_sfs_MP" ] && [ -f "$a_sfs" ] && EXTRA_SFS_MPS+=("$a_sfs_MP")
  269. done
  270.  
  271. #NEW=''
  272. #MOUNTED_PUP_RO=$(busybox df | grep -o '/initrd/pup_ro.*')
  273. ## pup_ro1 and pup_ro2 are reserved
  274. #for i in $(seq 3 99) # find free pup_roX
  275. #do
  276. #   if ! [ "$(echo "$MOUNTED_PUP_RO" | grep "pup_ro${i}$")" ] ; then
  277. #       NEW=${i}
  278. #       break
  279. #   fi
  280. #done
  281. #Cont_Layer=/initrd/pup_ro$NEW
  282.  
  283.  
  284.  
  285.  
  286. mount --bind "${BIND_Source}" "${BIND_Target}"
  287. #ln -s "$BIND_Target_Root" "$Cont_Layer"
  288. #set +x
  289. #read -p "Press enter to continue"
  290. #set -x
  291.  
  292.  
  293. BRANCHES="udba=reval,diropq=w,br:${Cont_TMPFS}=rw:${BIND_Target}=rr"
  294. for a_branch in "${EXTRA_SFS_MPS[@]}"; do
  295.  BRANCHES+=":$a_branch=ro"
  296. done
  297.  
  298. busybox mount -t aufs -o "$BRANCHES" aufs "/$CONT_NAME_DEST" || { umountall && exit 1; }
  299. #busybox mount -t aufs -o remount,append:$BIND_Target_Root=rr / || { umountall && exit 1; }
  300.  
  301. CMD_FP="/$CONT_NAME_DEST/${CHROOT_CMD}"
  302. if [ ! -e "$CMD_FP" ]; then
  303.  CMD_FP_trim="${CMD_FP%-nosb}"
  304.  if [ "$CMD_FP_trim" != "$CMD_FP" ] && [ -e "$CMD_FP_trim" ]; then
  305.    cat "$CMD_FP_trim" | sed -rn \
  306. '/run-as-spot "\$HERE\/chrome"/ {s#^(.*)$#"$HERE/chrome" --no-sandbox --user-data-dir=$HERE/PROFILE --disable-infobars "$@"#g;}
  307. /run-as-spot "\$HERE\/chrome"/! {p}' > "$CMD_FP"
  308.  chmod +x "$CMD_FP"    
  309.  fi
  310. fi
  311.  
  312. mkdir -p /${CONT_NAME_DEST}/dev
  313. mkdir -p /${CONT_NAME_DEST}/proc
  314. mkdir -p /${CONT_NAME_DEST}/sys
  315. mkdir -p /${CONT_NAME_DEST}/dev/pts
  316.  
  317. mount --bind /dev /${CONT_NAME_DEST}/dev
  318. mount --bind /proc /${CONT_NAME_DEST}/proc
  319. mount --bind /sys /${CONT_NAME_DEST}/sys
  320. mount -t devpts devpts /${CONT_NAME_DEST}/dev/pts
  321. cp /etc/resolv.conf /${CONT_NAME_DEST}/etc/resolv.conf
  322. cp /var/lib/dbus/machine-id /${CONT_NAME_DEST}/var/lib/dbus/machine-id
  323. [ -f .Xauthority ] && cp /root/.Xauthority /${CONT_NAME_DEST}/root/.Xauthority
  324. xhost +
  325. mkdir -p /${CONT_NAME_DEST}/tmp/.X11-unix
  326. mount --rbind /tmp/.X11-unix /${CONT_NAME_DEST}/tmp/.X11-unix
  327. cd /${CONT_NAME_DEST}
  328. #set +x
  329.  
  330. if [ -z ${USE_UNSHARE+x} ]; then
  331.         if [ -e /proc/1/ns/pid ] && [ -e /proc/1/ns/mnt ] && type unshare >/dev/null #&& [ -z $NO_NS ];
  332.         then
  333.             USE_UNSHARE=yes
  334.         else
  335.             USE_UNSHARE=no
  336.         fi
  337. fi
  338. if [ "$USE_UNSHARE" = yes ]; then
  339.  CHROOT_UTIL=( unshare -f -C -u -p --mount-proc="/${CONT_NAME_DEST}/proc" chroot )
  340. else
  341.  CHROOT_UTIL=(chroot)
  342. fi
  343.  
  344. if [ ! -z "${EXECUTE}" ]; then
  345.  cd /"$CONT_NAME_DEST"
  346.  set +x
  347.  echo "next cmd: \"${EXECUTE[@]}\" \"$@\""
  348.  read -p "Ready to EXECUTE Press enter to continue"
  349.  set -x
  350.  #set +x
  351.  "${EXECUTE[@]}" "$@"
  352.  
  353. elif [ ! -z "${CHROOT_CMD}" ]; then
  354.  set +x
  355.  echo "next cmd: chroot /${CONT_NAME_DEST} \"${CHROOT_CMD[@]}\" \"$@\""
  356.  read -p "Ready to chroot Press enter to continue"
  357.  set -x  
  358.  if [ -z "$XephyrDISPLAY" ]; then
  359.     #Can't XFORWARD over ssh from puppy4 to newer puppies, but can use Xephyr as a workaround.
  360.     LD_LIBRARY_PATH="/lib:/usr/lib:/usr/X11R7/lib:/root/my-applications/lib:/opt/qt4/lib" ${CHROOT_UTIL[@]} /${CONT_NAME_DEST} "${CHROOT_CMD[@]}" "$@"  
  361.  else
  362.     cd "$CWD"
  363.     source init_scripts.sh
  364.     if [ "$(ls -1 /tmp/.X11-unix | tr 'X' ':')" != "$XephyrDISPLAY" ]; then
  365.       XP="-fullscreen -title container -name Xephyr2 -dpi 144 -nolisten tcp"
  366.       Xephyr $XephyrDISPLAY ${XP} &
  367.     fi  
  368.    
  369.     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[@]}" "$@"  
  370.  fi
  371. else
  372.  LD_LIBRARY_PATH="/lib:/usr/lib:/usr/X11R7/lib:/root/my-applications/lib:/opt/qt4/lib" chroot /${CONT_NAME_DEST} /bin/sh "$@"
  373. fi
  374. set -x
  375. if [ ! NO_EXIT = true ]; then
  376.  umountall
  377. fi
  378.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement