#!/bin/bash
set -e
umask 022
if [[ $UID -ne 0 ]] ; then
    echo "You must be root!"
    exit 1
fi
repo="$REPO"
if [[ "$repo" == "" ]] ; then
    repo='https://gitlab.com/turkman/packages/binary-repo/-/raw/master/$uri'
fi
export PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
output="$1"
if [[ "$output" == "" ]] ; then
    echo "Usage: ympstrap <target-path> (extra packages)"
    exit 1
fi
shift
output=$(realpath $output)
basepkgs=(busybox base-files glibc)
ympdep=(acl attr bzip2 curl glib libarchive libcap-ng libffi libidn2 libnghttp2
        libpcre2 libpsl libssh libunistring libxml2 lz4 lzo ncurses openssl openssl-1.1 readline
        util-linux xz-utils ymp zlib bash file libseccomp gnupg
)
arch=$(uname -m)
function get_uri(){
    cat "$output"/var/lib/ymp/index/main | grep "uri: .*/$1_.*$arch.ymp" | cut -f2 -d":" | tr -d " " | head -n 1
}
function fetch_pkg(){
    for arg in $@ ; do
            uri=$(get_uri $arg)
            pkg="$output"/var/lib/ymp/packages/"$(basename $uri)"
            mkdir -p "$output"/var/lib/ymp/sysconf/"$arg"
            echo "Download: $arg" >/dev/stderr
            wget -c ${repo/\$uri/$uri} -O "$pkg" -q
            pkginst "$pkg"
            chmod 755 -R "$output"
    done
}

function pkginst(){
    mkdir "$output"/tmp/ -p
    cd "$output"/tmp/
    unzip "$1" >/dev/null
    cd "$output"
    tar -xf "$output"/tmp/data.tar.*
    rm -rf "$output"/tmp
}
# Stage 1 download repo
mkdir "$output"/var/lib/ymp/{index,packages,sources.list.d,gpg}/ -p
mkdir "$output"/tmp/ -p
chmod 1777 "$output"/tmp/
echo "$repo" > "$output"/var/lib/ymp/sources.list.d/main
wget -O "$output"/tmp/main.asc "${repo/\$uri/ymp-index.yaml.asc}"
gpg --dearmor "$output"/tmp/main.asc
mv "$output"/tmp/main.asc.gpg "$output"/var/lib/ymp/gpg/main.gpg
rm "$output"/tmp/main.asc
wget -O - ${repo/\$uri/ymp-index.yaml} | grep "uri: " > "$output"/var/lib/ymp/index/main
# Stage 2 install base
fetch_pkg ${basepkgs[@]}
mkdir -p "$output"/var/lib/ymp/sysconf/{glibc,busybox,base-files}
chroot "$output" /etc/sysconf.d/busybox
chroot "$output" /etc/sysconf.d/glibc
chroot "$output" /etc/sysconf.d/base-files
# Stage 3 install ymp
fetch_pkg ${ympdep[@]}
chroot "$output" /sbin/ldconfig
# Stage 4 bind rootfs
mkdir "$output"/{dev,sys,proc,run} -p
mount -t proc proc "$output"/proc
mount -t devtmpfs devtmpfs "$output"/dev
mount -t sysfs sysfs "$output"/sys
cat /etc/resolv.conf > "$output"/etc/resolv.conf
# Stage 5 install ymp from ymp
chroot "$output" ymp repo --update --allow-oem --ignore-gpg
chroot "$output" ymp it ${basepkgs[@]} ${ympdep[@]} $@ --ignore-quarantine --no-emerge --allow-oem
chroot "$output" ymp clean --no-emerge --allow-oem
# Stage 6 unbind
while umount "$output"/{dev,sys,proc} ; do : ; done
