#!/usr/bin/env bash
ARCH=$(uname -m)
repo_url=https://repo.oepkgs.net/openeuler/epkg/channel/openEuler-24.03-LTS/everything/$ARCH
store_url=$repo_url/store
pkg_info_url=$repo_url/repodata/pkg-info.zst
EPKG_ROOTFS_CACHE=$HOME/.cache/epkg/rootfs
EPKG_ROOTFS_PKG_INFO_DIR=$EPKG_ROOTFS_CACHE/pkg-info
EPKG_ROOTFS_PKG_STORE=$EPKG_ROOTFS_CACHE/pkg-store
EPKG_ROOTFS_PKG_UNPACK=$EPKG_ROOTFS_CACHE/pkg-unpack
EPKG_ROOTFS_OUT=$EPKG_ROOTFS_CACHE/epkg-rootfs-${ARCH}
find_local_pkg_json() {
local pkg_name="__"$1"__"
local local_repo_dir=$2
find "$local_repo_dir" -maxdepth 2 -mindepth 1 -type f -name "*$pkg_name*"| while read -r dir; do
dir_name=$(basename "$dir")
IFS='__' read -ra parts <<< "$dir_name"
if [[ "__${parts[2]}__" == "$pkg_name" ]]; then
echo "$dir"
return
fi
done
}
download_packages() {
local local_pkg_json_dir=$1
local download_url=$2
local epkg_name=$(basename $local_pkg_json_dir)
local epkg_name=${epkg_name%.json}.epkg
local pkg_download_url=$download_url/${epkg_name:0:2}/$epkg_name
echo "Downloading ${pkg_download_url##*/}"
curl --silent -o $EPKG_ROOTFS_PKG_STORE/$epkg_name $pkg_download_url --retry 3
mkdir -p $EPKG_ROOTFS_PKG_UNPACK/${epkg_name%%.epkg}
tar --use-compress-program=zstd --no-same-owner -xf $EPKG_ROOTFS_PKG_STORE/$epkg_name -C $EPKG_ROOTFS_PKG_UNPACK/${epkg_name%%.epkg}
chmod 755 -R $EPKG_ROOTFS_PKG_UNPACK/${epkg_name%%.epkg}
}
rootfs_prep_home() {
rm -rf $EPKG_ROOTFS_CACHE
mkdir -p $EPKG_ROOTFS_PKG_STORE
mkdir -p $EPKG_ROOTFS_PKG_UNPACK
echo "Downloading $pkg_info_url"
curl -# -o $EPKG_ROOTFS_CACHE/pkg-info.zst $pkg_info_url --retry 3
tar --use-compress-program=zstd --no-same-owner -xf $EPKG_ROOTFS_CACHE/pkg-info.zst -C $EPKG_ROOTFS_CACHE/
chmod 755 -R $EPKG_ROOTFS_CACHE/pkg-info
}
rootfs_prep_pkg() {
local rootfs_package=(
coreutils tar gzip zstd jq curl grep sed gawk setup which file bash libcap file-libs fuse libpng
libstdc++ libtasn1 libtirpc libevent libxcrypt fuse-common cracklib ca-certificates
chkconfig ncurses-base pcre2 libffi libsepol basesystem newt ncurses-libs publicsuffix-list
krb5-libs glibc openEuler-gpg-keys libnghttp2 oniguruma pam gmp libunistring libidn2 readline
openEuler-release attr libselinux mpfr tzdata patchelf crypto-policies libverto audit-libs
libcurl libmount zlib p11-kit-trust cyrus-sasl-lib libcap-ng openssl-libs popt libpwquality
p11-kit ncurses bc libgcc e2fsprogs gdbm libblkid openEuler-repos libnsl2 openldap brotli keyutils-libs
libuuid filesystem findutils slang libpsl libacl libssh info libev libsigsegv
)
for pkg in "${rootfs_package[@]}"; do
local local_pkg_dir=$(find_local_pkg_json $pkg $EPKG_ROOTFS_PKG_INFO_DIR)
download_packages $local_pkg_dir $store_url
done
}
rootfs_prep_compress() {
tar -zcf ${EPKG_ROOTFS_OUT}.tar.gz -C $EPKG_ROOTFS_PKG_UNPACK .
echo "rootfs compress success: ${EPKG_ROOTFS_OUT}.tar.gz"
}
rootfs_prep_home
rootfs_prep_pkg
rootfs_prep_compress