From 43de5a1e0030b64adfda15bd9a59961fad834d72 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Tue, 10 Jul 2012 15:29:36 -0400 Subject: Initial commit. --- (limited to 'src/opkbootstrap.sh') diff --git a/src/opkbootstrap.sh b/src/opkbootstrap.sh new file mode 100755 index 0000000..3ad3c27 --- /dev/null +++ b/src/opkbootstrap.sh @@ -0,0 +1,285 @@ +#!@@SHELL@@ +# +# opkbootstrap +# src/opkbootstrap.sh +# Main program script. +# +# Copyright (C) 2012 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 3 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 . + +TARGET= # set in main +LISTS_DIR=/var/lib/opkg/lists +PKGS_DIR=/var/cache/opkg/archives + +ARCH_MACHINE= # set in main +ARCH_SYSTEM= # set in main +PLAT_SYSTEM= # set in main + +PKGS_ESSENTIAL= # set in find_essential +PKGS_ALL= # set in find_essential and find_depends +PKGS_INCLUDE= # set in main +PKGS_EXCLUDE= # set in main + +# main []... +main() +{ + SCRIPT_NAME="${0}" + + while getopts 'hVi:x:' opt; do + case "${opt}" in + h) + print_help + exit + ;; + V) + print_version + exit + ;; + i) + PKGS_INCLUDE="${PKGS_INCLUDE},${OPTARG}" + ;; + x) + PKGS_EXCLUDE="${PKGS_EXCLUDE},${OPTARG}" + ;; + ?) + print_usage >&2 + exit 1 + ;; + esac + done + shift $(($OPTIND - 1)) + + if [ ${#} -lt 4 ]; then + print_usage >&2 + exit 1 + fi + + TARGET="${1}" + ARCH_MACHINE="${2%:*}" + ARCH_SYSTEM="${2#*:}" + PLAT_SYSTEM="${3}" + shift 3 + + set_paths + + # Find packages. + for src; do + get_src_list ${src} + done + find_essential + find_depends + + # Download packages. + get_pkgs + + # Unpack packages ("first stage" installation in debootstrap terms). + unpack_pkgs + + # Configure packages ("second stage" installation in debootstrap terms). + if [ "${ARCH_MACHINE}" = "${ARCH_SYSTEM}" ]; then + setup_chroot + configure_pkgs + else + printf 'Cross installation currently not supported. Exiting...\n' + exit + fi +} + +# print_usage +print_usage() +{ + cat < []... +EOF +} + +# print_help +print_help() +{ + print_usage + + cat <. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Written by P. J. McDermott. +EOF +} + +# error []... +error() +{ + _msg="${1}" + shift + printf "Error: ${_msg}\n" ${@} + exit 2 +} + +# set_paths +set_paths() +{ + TARGET=$(cd "${TARGET}" && pwd) + LISTS_DIR="${TARGET}/${LISTS_DIR}" + PKGS_DIR="${TARGET}/${PKGS_DIR}" +} + +# get_src_list src|src/gz [] +# get_src_list dist|dist/gz []... +get_src_list() +{ + case "${1}" in + src) + shift + get_pkg_src_list false ${@} + ;; + src/gz) + shift + get_pkg_src_list true ${@} + ;; + dist) + shift + get_dist_src_list false ${@} + ;; + dist/gz) + shift + get_dist_src_list true ${@} + ;; + *) + error 'Invalid source type "%s"' "${1}" + ;; + esac +} + +# get_pkg_src_list [] +get_pkg_src_list() +{ + if [ ${#} -ne 3 -a ${#} -ne 4 ]; then + error 'Malformed src configuration' + fi + + _gzip=${1} + _name="${2}" + _value="${3}" + _comp="${4}" + + _url="${_value}/${_comp}/Packages" + + if ${_gzip}; then + wget -q -O - "${_url}.gz" | gzcat > "${LISTS_DIR}/${_name}" + else + wget -q -O "${LISTS_DIR}/${_name}" "${_url}" + fi +} + +# get_dist_src_list []... +get_dist_src_list() +{ + : +} + +# find_essential +find_essential() +{ + for _list in "${LISTS_DIR}/"*; do + _pkg= + _essential=false + while read _line; do + if [ -z "${line}" ]; then + if ${_essential}; then + PKGS_ESSENTIAL="${PKGS_ESSENTIAL} ${_pkg}" + PKGS_ALL="${PKGS_ALL} ${_pkg}" + fi + _pkg= + _essential=false + continue + fi + if [ "${_line#Package: }" != "${_line}" ]; then + _pkg="${_line#Package: }" + continue + fi + if [ "${_line}" = 'Essential: yes' ]; then + _essential=true + continue + fi + # TODO: Make sure Architecture is one of: + # all, ${ARCH_SYSTEM}, or ${PLAT_SYSTEM} + done < "${_list}" + done +} + +# find_depends +find_depends() +{ + : +} + +# get_pkgs +get_pkgs() +{ + : +} + +# unpack_pkgs +unpack_pkgs() +{ + cd "${TARGET}" + + for _opk in "${PKGS_DIR}"/*; do + _pkg="${opk##*/}" + _pkg="${pkg%%_*}" + + tar -xzOf "${_opk}" data.tar.gz | tar -xz + + mkdir -p tmp/control + (cd tmp/control; tar -xzf "${_opk}" control.tar.gz) + for _script in conffiles md5sums preinst postinst prerm postrm; do + if [ -e tmp/control/${_file} ]; then + mv tmp/control/${_script} "${INFO_DIR}/${_pkg}.${_file}" + fi + done + # TODO: Generate pkg.list + rm -Rf tmp/control + done +} + +# setup_chroot +setup_chroot() +{ + : +} + +# configure_pkgs +configure_pkgs() +{ + : +} + +main ${@} -- cgit v0.9.1