#!/bin/bash source $(dirname $(realpath $0))/utils.sh function unbox_outer_stage(){ echo "-----------FIRST STAGE-----------" apt install git util-linux if [ -e .repo_cache ]; then select chosen_repo in other $(cat .repo_cache | sort | uniq); do if [ "${chosen_repo}" = "other" ]; then echo -n "git repository url: " read REMOTE else REMOTE=$chosen_repo fi break done else echo -n "git repository url: " read REMOTE fi echo $REMOTE URL_CACHE=$( ( cat .repo_cache; echo $REMOTE;) ) for LINE in $URL_CACHE; do echo $LINE; done | sort | uniq > .repo_cache if [ -e repo ]; then (cd repo; git pull) else git clone "$REMOTE" repo fi if [[ ! -e repo/entry.sh ]]; then echo no entry found; exit 1; fi source repo/entry.sh mkdir -p target export TARGET=$(pwd)/target export UNBOX_ENV_FILE=$(pwd)/.env if [ -e .env ]; then rm .env fi if type -t first_stage > /dev/null; then first_stage else echo first stage not found fi if type -t chroot > /dev/null; then CHROOT=chroot else echo ERROR: no chroot found 1>&2 exit 1 fi mkdir -p target/root/unbox mount -o bind . target/root/unbox mkdir -p target/root/unbox_data mount -o bind /data target/root/unbox_data ( mount -obind /sys target/sys mount -obind /proc target/proc mount -obind /dev target/dev mount -obind /dev/pts target/dev/pts resolv_conf=target/etc/resolv.conf if [[ -L target/etc/resolv.conf ]]; then resolv_conf=$(readlink "target/etc/resolv.conf") if [[ $resolv_conf = /* ]]; then resolv_conf=target$resolv_conf else resolv_conf=target/etc/$resolv_conf fi # ensure file exists to bind mount over if [[ ! -f $resolv_conf ]]; then install -Dm644 /dev/null "$resolv_conf" || return 1 fi fi if [[ -e target/etc/resolv.conf ]]; then cp -L /etc/resolv.conf $resolv_conf fi $CHROOT target /root/unbox/unbox.sh unbox_inner_stage umount /dev/pts umount /dev /sys /proc ) umount target/root/unbox target/root/unbox_data if type -t post_install_stage > /dev/null; then post_install_stage else echo no post_install_stage found fi if [ -e ${UNBOX_ENV_FILE} ]; then rm ${UNBOX_ENV_FILE} fi exit 0 } function unbox_inner_stage(){ echo "-----------SECOND STAGE-----------" export UNBOX_ENV_FILE=$(pwd)/.env if [ -e ${UNBOX_ENV_FILE} ]; then source ${UNBOX_ENV_FILE} fi if [ -e repo/entry.sh ]; then source repo/entry.sh else echo chosen repository does not contain entry.sh file fi if type -t second_stage > /dev/null; then second_stage else echo second stage not found fi if [ -e ${UNBOX_ENV_FILE} ]; then rm ${UNBOX_ENV_FILE} fi exit 0 } cd $(dirname $(realpath $0)) if [[ $# -ge 1 ]]; then CMD=$1 shift if type -t $CMD > /dev/null; then $CMD $@ else echo command $CMD found exit 1 fi else git pull $0 unbox_outer_stage fi