diff options
-rwxr-xr-x | bootstrap-stage2-install.sh | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/bootstrap-stage2-install.sh b/bootstrap-stage2-install.sh new file mode 100755 index 0000000..2f656d0 --- /dev/null +++ b/bootstrap-stage2-install.sh @@ -0,0 +1,154 @@ +#!/bin/sh +# +# Initial port bootstrap scripts +# bootstrap-stage2-install.sh +# Installs built stage 2 packages into a bootstrap system directory. +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +set -e + +ARCH= +PLAT= + +main() +{ + ARCH="$(cat /etc/proteanos_arch)" + PLAT="$(cat /etc/proteanos_plat)" + + cat <<-EOF + + Installing packages in stage 2... + ================================= + EOF + + install_packages + install_archplat_sysconf + configure_packages + setup_root +} + +log() +{ + local msg i + + msg="$(printf "${@}")" + printf '\n%s\n' "${msg}" + i=0 + while [ ${i} -lt ${#msg} ]; do + printf '-' + i=$(($i + 1)) + done + printf '\n\n' +} + +install_packages() +{ + local opk pkg + + rm -Rf root2 + mkdir root2 + cd root2 + + for opk in ../root1/usr/src/*_${ARCH}_${PLAT}.opk \ + ../root1/usr/src/*_${ARCH}_all.opk \ + ../root1/usr/src/*_all_${PLAT}.opk \ + ../root1/usr/src/*_all_all.opk; do + [ -f "${opk}" ] || continue + pkg="${opk#../root1/usr/src/}" + log 'Installing package %s...' "${pkg%%_*}" + tar -xzOf "${opk}" data.tar.gz | tar -xz + done + + cd .. +} + +install_archplat_sysconf() +{ + # TODO: The config-opkg package should provide these, but it isn't built + # and installed here yet. + + cd root2 + + mkdir -p etc + printf '%s\n' "${ARCH}" >etc/proteanos_arch + printf '%s\n' "${PLAT}" >etc/proteanos_plat + mkdir -p etc/opkg + printf 'arch all 1\narch %s 1\narch src 1\n' "${ARCH}" \ + >etc/opkg/opkg.conf + + cd .. +} + +configure_packages() +{ + local opk pkg entry file + + cd root2 + + info='var/lib/opkg/info' + mkdir -p "${info}" + + for opk in ../root1/usr/src/*_${ARCH}_${PLAT}.opk \ + ../root1/usr/src/*_${ARCH}_all.opk \ + ../root1/usr/src/*_all_${PLAT}.opk \ + ../root1/usr/src/*_all_all.opk; do + [ -f "${opk}" ] || continue + pkg="${opk#../root1/usr/src/}" + pkg="${pkg%%_*}" + for entry in $(tar -xzOf "${opk}" control.tar.gz | tar -tz); do + file="${entry##*/}" + case "${file}" in + preinst | postinst) + tar -xzOf "${opk}" control.tar.gz | \ + tar -xzO "${entry}" \ + >"${info}/${pkg}.${file}" + chmod a+x "${info}/${pkg}.${file}" + log 'Running %s...' "${pkg}.${file}" + sudo chroot . \ + "/${info}/${pkg}.${file}" \ + configure + ;; + esac + done + done + + sudo chroot . chmod -R a+w /var/lib/opkg/alternatives + + cd .. +} + +setup_root() +{ + cd root2 + + case "${ARCH}" in + *-linux-*) + mkdir -p proc sys dev + sudo mount -t proc proc proc + sudo mount -t sysfs sys sys + sudo mount -o bind /dev dev + ;; + esac + + # TODO: base-files will eventually handle this. + mkdir -p tmp + chmod 1775 tmp + + cd .. +} + +main "${@}" |