diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/install.sh | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/lib/install.sh b/lib/install.sh index 7abb558..d10e07e 100644 --- a/lib/install.sh +++ b/lib/install.sh @@ -21,12 +21,24 @@ [ "x${_INSTALL_SM+set}" = 'xset' ] && return 0 _INSTALL_SM=1 +use dir +use profile +use fd +use pkg + +cmd_install_deps= +cmd_install_fnames= +cmd_install_md5sums= +cmd_install_sha256sums= +cmd_install_feed_url= + install_system() { local mirror="${1}" local suite="${2}" local arch="${3}" local plat="${4}" + local chroot="${5}" info "$(get_msg 'cmd_install_setting_up_chroot')" if [ -d "${chroot}" ] && ! dir_is_empty "${chroot}" 'lost+found'; then @@ -51,3 +63,191 @@ install_system() rm "${chroot}/prokit/installing" } + +cmd_install_find_pkgs() +{ + local mirror="${1}" + local suite="${2}" + local arch="${3}" + local plat="${4}" + local chroot="${5}" + local opkg_conf_fd= + local pkgs_fd= + local opt= + local feed_idx= + local feed= + local gzip= + local pkgs= + + mkdir -p "${chroot}/etc/opkg" "${chroot}/var/lib/opkg/lists" + fopen "${chroot}/etc/opkg/opkg.conf" 'w' + opkg_conf_fd=${FD} + + cmd_install_deps= + cmd_install_fnames= + cmd_install_md5sums= + cmd_install_sha256sums= + + fopen "${chroot}/.prokit/packages" 'w' + pkgs_fd=${FD} + + while read -r opt feed_idx feed; do + case "${opt}" in + 'src') gzip=false;; + 'src/gz') gzip=true;; + *) continue;; + esac + printf '%s %s %s\n' "${opt}" "${feed_idx}" "${feed%/Packages}" \ + >&${opkg_conf_fd} + feed_download "${feed}" ${gzip} \ + >"${chroot}/var/lib/opkg/lists/${feed_idx}" + cmd_install_feed_url="${feed%/*}" + feed_find_pkgs "${chroot}/var/lib/opkg/lists/${feed_idx}" \ + "$(profile_dep_fields)" profile_include_pkg \ + cmd_install_deps_cb cmd_install_fname_cb \ + cmd_install_md5sum_cb cmd_install_sha256sum_cb \ + >&${pkgs_fd} + done <<-EOF + $(profile_feeds "${mirror}" "${arch}" "${plat}" "${suite}") + EOF + + printf '\ndest root /\n' >&${opkg_conf_fd} + printf 'arch %s 1\n' 'all' "${arch}" 'src' >&${opkg_conf_fd} + fclose ${opkg_conf_fd} + fclose ${pkgs_fd} + + pkgs="$(resolve_deps "$(cat "${chroot}/.prokit/packages")" \ + "${cmd_install_deps}" | xargs printf '%s\n' | sort -u)" + printf '%s\n' "${pkgs}" >"${chroot}/.prokit/packages" +} + +cmd_install_deps_cb() +{ + local pkg="${1}" + local deps="${2}" + + cmd_install_deps="${cmd_install_deps}${pkg}: ${deps}${LF}" +} + +cmd_install_fname_cb() +{ + local pkg="${1}" + local fname="${2}" + + cmd_install_fnames="$(printf '%s\n%s %s/%s' "${cmd_install_fnames}" \ + "${pkg}" "${cmd_install_feed_url}" "${fname}")" +} + +cmd_install_md5sum_cb() +{ + local pkg="${1}" + local md5sum="${2}" + + cmd_install_md5sums="$(printf '%s\n%s %s' "${cmd_install_md5sums}" \ + "${pkg}" "${md5sum}")" +} + +cmd_install_sha256sum_cb() +{ + local pkg="${1}" + local sha256sum="${2}" + + cmd_install_sha256sums="$(printf '%s\n%s %s' \ + "${cmd_install_sha256sums}" "${pkg}" "${sha256sum}")" +} + +cmd_install_get_pkgs() +{ + local chroot="${1}" + local status_fd= + local pkg= + local fname= + local md5sum= + local sha256sum= + local file= + local control= + local field= + local printed= + + mkdir -p "${chroot}/var/cache/opkg/archives" "${chroot}/tmp/opkg" \ + "${chroot}/var/lib/opkg/info" + + fopen "${chroot}/var/lib/opkg/status" 'w' + status_fd=${FD} + + for pkg in $(cat "${chroot}/.prokit/packages"); do + info "$(get_msg 'cmd_install_downloading_pkg')" "${pkg}" + fname="$(printf '%s\n' "${cmd_install_fnames}" | \ + sed -n "s/^${pkg} //p")" + md5sum="$(printf '%s\n' "${cmd_install_md5sums}" | \ + sed -n "s/^${pkg} //p")" + sha256sum="$(printf '%s\n' "${cmd_install_sha256sums}" | \ + sed -n "s/^${pkg} //p")" + wget -q -O "${chroot}/var/cache/opkg/archives/${fname##*/}" \ + "${fname}" || \ + error 2 "$(get_msg 'cmd_install_downloading_pkg_fail')" + fname="var/cache/opkg/archives/${fname##*/}" + if [ "x${md5sum}" != 'x' ]; then + printf '%s %s\n' \ + "${md5sum}" "${chroot}/${fname}" | \ + md5sum -c >/dev/null 2>&1 || \ + error 2 "$(get_msg 'cmd_install_checksum_fail')" + fi + if [ "x${sha256sum}" != 'x' ]; then + printf '%s %s\n' \ + "${sha256sum}" "${chroot}/${fname}" | \ + sha256sum -c >/dev/null 2>&1 || \ + error 2 "$(get_msg 'cmd_install_checksum_fail')" + fi + + info "$(get_msg 'cmd_install_unpacking_pkg')" "${pkg}" + mkdir "${chroot}/tmp/opkg/${pkg}" + ( + cd "${chroot}" + tar -xzOf "${fname}" data.tar.gz \ + >"tmp/opkg/${pkg}/data.tar.gz" + tar -xzf "tmp/opkg/${pkg}/data.tar.gz" + cd "tmp/opkg/${pkg}" + tar -xzOf "../../../${fname}" control.tar.gz | \ + tar -xz + ) + tar -tzf "${chroot}/tmp/opkg/${pkg}/data.tar.gz" | \ + sed 's/^\.//' >"${chroot}/var/lib/opkg/info/${pkg}.list" + rm -f "${chroot}/tmp/opkg/${pkg}/data.tar.gz" + for file in "${chroot}/tmp/opkg/${pkg}/"*; do + mv "${file}" \ + "${chroot}/var/lib/opkg/info/${pkg}.${file##*/}" + done + rmdir "${chroot}/tmp/opkg/${pkg}" + + # Write status file. + control="${chroot}/var/lib/opkg/info/${pkg}.control" + for field in Package Version Depends Recommends Suggests \ + Provides Replaces Conflicts; do + grep "^${field}: " "${control}" >&${status_fd} + done + printf 'Status: install ok unpacked\n' >&${status_fd} + for field in Essential Architecture; do + grep "^${field}: " "${control}" >&${status_fd} + done + if [ -r "${chroot}/var/lib/opkg/info/${pkg}.conffiles" ]; then + printed=false + while read -r file; do + ${printed} || printf 'Conffiles:\n' \ + >&${status_fd} + printf ' %s %s\n' "${file}" "$(md5sum \ + "${chroot}/${file}" | cut -d' ' -f1)" \ + >&${status_fd} + printed=true + done <"${chroot}/var/lib/opkg/info/${pkg}.conffiles" + fi + printf 'Installed-Time: %s\n\n' "$(date '+%s')" >&${status_fd} + + rm -f "${chroot}/${fname}" + done + + rm "${chroot}/.prokit/packages" + rmdir "${chroot}/.prokit" + + fclose ${status_fd} +} |