diff options
author | P. J. McDermott <pj@pehjota.net> | 2015-05-26 18:07:14 (EDT) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2015-05-26 18:07:14 (EDT) |
commit | 2cd968e982bb9942e6d044270a42de88d8d01b67 (patch) | |
tree | 4751e5a9802ce2d0b319e5a988ce723db8611660 /lib | |
parent | 78a64f4f12a28be389fdc935cdf7dcfddf386c35 (diff) | |
parent | 27abaab4e6861d60f1316349395eeff57b65c964 (diff) |
Merge branch 'feature/installer-integration'
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cmd.sh | 3 | ||||
-rw-r--r-- | lib/cmd/install.sh | 251 | ||||
-rw-r--r-- | lib/cmd/installer-pc.sh | 101 | ||||
-rw-r--r-- | lib/cmd/local.mk | 3 | ||||
-rw-r--r-- | lib/getopt.sh | 18 | ||||
-rw-r--r-- | lib/install.sh | 274 | ||||
-rw-r--r-- | lib/local.mk | 3 |
7 files changed, 398 insertions, 255 deletions
@@ -27,6 +27,7 @@ use locale CMDS='@cmds@' running_cmd= +running_cmd_clean= load_cmds() { @@ -118,8 +119,10 @@ run_cmd() tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" if is_cmd "${cmd}"; then running_cmd="${cmd}" + running_cmd_clean="${cmd_clean}" "cmd_${cmd_clean}_main" "${@}" running_cmd='' + running_cmd_clean='' else error 1 "$(get_msg 'cmd_not_found')" "${cmd}" fi diff --git a/lib/cmd/install.sh b/lib/cmd/install.sh index e63059d..d983e28 100644 --- a/lib/cmd/install.sh +++ b/lib/cmd/install.sh @@ -22,25 +22,15 @@ use getopt use feed use profile use block -use dir -use fd -use pkg +use install cmd_install_optstring='a:p:m:F' -cmd_install_deps= -cmd_install_fnames= -cmd_install_md5sums= -cmd_install_sha256sums= -cmd_install_feed_url= cmd_install_main() { local suite= local chroot= - local arch= - local plat= local profile= - local mirror= local foreign= local dev= @@ -69,32 +59,6 @@ cmd_install_main() profile_set "${profile}" suite="$(profile_normalize_suite "${suite}")" - if [ "x${cmd_install_opt_a+set}" = 'xset' ]; then - arch="${cmd_install_opt_a}" - else - arch="$(profile_detect_arch)" - fi - if [ "x${cmd_install_opt_p+set}" = 'xset' ]; then - plat="${cmd_install_opt_p}" - else - plat="$(profile_default_plat)" - fi - if [ "x${cmd_install_opt_m+set}" = 'xset' ]; then - mirror="${cmd_install_opt_m}" - else - mirror="$(profile_select_mirror)" - fi - - if ! profile_validate_archplat "${mirror}" "${arch}" "${plat}" \ - "${suite}"; then - error 2 "$(get_msg 'cmd_install_bad_archplat')" \ - "${arch}" "${plat}" - fi - - info "$(get_msg 'cmd_install_selected_arch')" "${arch}" - info "$(get_msg 'cmd_install_selected_plat')" "${plat}" - info "$(get_msg 'cmd_install_selected_mirror')" "${mirror}" - if [ "x${cmd_install_opt_F+set}" = 'xset' ]; then foreign=true else @@ -107,218 +71,11 @@ cmd_install_main() chroot="$(block_mount "${dev}")" fi - info "$(get_msg 'cmd_install_setting_up_chroot')" - if [ -d "${chroot}" ] && ! dir_is_empty "${chroot}" 'lost+found'; then - error 2 "$(get_msg 'cmd_install_chroot_dir_exists')" "${chroot}" - fi - if ! mkdir -p "${chroot}/.prokit" "${chroot}/prokit"; then - error 2 "$(get_msg 'cmd_install_mkdir_chroot_fail')" "${chroot}" - fi - >"${chroot}/prokit/installing" - - info "$(get_msg 'cmd_install_find_pkgs')" - cmd_install_find_pkgs "${mirror}" "${suite}" "${arch}" "${plat}" \ - "${chroot}" - cmd_install_get_pkgs "${chroot}" - - info "$(get_msg 'cmd_install_configuring')" - if ! ${foreign}; then - profile_configure_system_native "${chroot}" "${arch}" "${plat}" - else - profile_configure_system_foreign "${chroot}" "${arch}" "${plat}" - fi - - rm "${chroot}/prokit/installing" + install_system "${cmd_install_opt_m-}" "${suite}" \ + "${cmd_install_opt_a-}" "${cmd_install_opt_p-}" \ + "${chroot}" "${foreign}" if [ "x${dev}" != 'x' ]; then block_umount "${chroot}" fi } - -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} -} diff --git a/lib/cmd/installer-pc.sh b/lib/cmd/installer-pc.sh new file mode 100644 index 0000000..69381d0 --- /dev/null +++ b/lib/cmd/installer-pc.sh @@ -0,0 +1,101 @@ +# "installer-pc" command +# +# Copyright (C) 2014 Patrick "P. J." McDermott +# +# This file is part of the ProteanOS Development Kit. +# +# The ProteanOS Development Kit 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. +# +# The ProteanOS Development Kit 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 the ProteanOS Development Kit. If not, see +# <http://www.gnu.org/licenses/>. + +use getopt +use profile +use block +use install +use session + +cmd_installer_pc_optstring='a:p:m:' + +cmd_installer_pc_main() +{ + local suite= + local dev= + local profile= + local root= + local b4= + local b3= + local b2= + local b1= + + if ! get_options "${@}"; then + print_cmd_usage 'installer-pc' >&2 + exit 1 + fi + shift $(($OPTIND - 1)) + + if [ "x${cmd_installer_pc_opt_a-}" = 'x' ]; then + print_cmd_usage 'installer-pc' >&2 + exit 1 + fi + if [ "x${cmd_installer_pc_opt_p-}" = 'x' ]; then + print_cmd_usage 'installer-pc' >&2 + exit 1 + fi + if [ ${#} -ne 2 ]; then + print_cmd_usage 'installer-pc' >&2 + exit 1 + fi + + suite="${1}" + dev="${2}" + check_block "${dev}" + + if [ "x${suite%%:*}" != "x${suite}" ]; then + profile="${suite%%:*}" + suite="${suite#*:}" + else + profile='proteanos' + fi + profile_set "${profile}" + suite="$(profile_normalize_suite "${suite}")" + + cmd_installer_pc_make_partition_and_fs "${dev}" + root="$(block_mount "${dev}1")" + + install_system "${cmd_installer_pc_opt_m-}" "${suite}" \ + "${cmd_installer_pc_opt_a-}" "${cmd_installer_pc_opt_p-}" \ + "${root}" false + + if [ -f "${root}/sbin/lilo" ]; then + read b4 b3 b2 b1 <<-EOF + $(od -An -tx1 -v -j 440 -N 4 "${dev}") + EOF + # This ln command won't be needed once lilo 24.1-1 is uploaded. + ln "${root}/boot/vmlinuz" "${root}/boot/vmlinuz.old" + session_begin "${root}" . : false + session_exec install-lilo \ + "${dev}" "PARTUUID=${b1}${b2}${b3}${b4}-01" + session_end + fi + + block_umount "${root}" +} + +cmd_installer_pc_make_partition_and_fs() +{ + local dev="${1}" + + dd if=/dev/zero of="${dev}" bs=512 count=1 + printf 'n\np\n1\n\n\nt\n83\na\n1\nw\n' | fdisk "${dev}" + mke2fs -t ext4 "${dev}1" +} diff --git a/lib/cmd/local.mk b/lib/cmd/local.mk index 8c56946..dc6e2ae 100644 --- a/lib/cmd/local.mk +++ b/lib/cmd/local.mk @@ -4,4 +4,5 @@ pkgdatacmd_sources = \ lib/cmd/install.sh \ lib/cmd/shell.sh \ lib/cmd/opkg.sh \ - lib/cmd/build.sh + lib/cmd/build.sh \ + lib/cmd/installer-pc.sh diff --git a/lib/getopt.sh b/lib/getopt.sh index 32fb57d..b8d90fb 100644 --- a/lib/getopt.sh +++ b/lib/getopt.sh @@ -27,21 +27,27 @@ get_options() local prefix= local opt= - if [ "x${running_cmd}" = 'x' ]; then + if [ "x${running_cmd_clean}" = 'x' ]; then optstring="${OPTSTRING}" prefix='opt_' else - eval "optstring=\"\${cmd_${running_cmd}_optstring}\"" - prefix="cmd_${running_cmd}_opt_" + eval "optstring=\"\${cmd_${running_cmd_clean}_optstring}\"" + prefix="cmd_${running_cmd_clean}_opt_" fi unset OPTARG while getopts "${optstring}" opt; do - if [ "x${opt}" != 'x?' ]; then - eval "${prefix}${opt}=\"\${OPTARG:-true}\"" - else + if [ "x${opt}" = 'x?' ]; then return 1 fi + case "${optstring}" in + *"${opt}:"*) + eval "${prefix}${opt}=\"\${OPTARG}\"" + ;; + *) + eval "${prefix}${opt}=true" + ;; + esac unset OPTARG done diff --git a/lib/install.sh b/lib/install.sh new file mode 100644 index 0000000..b7ca485 --- /dev/null +++ b/lib/install.sh @@ -0,0 +1,274 @@ +# Functions for installing systems +# +# Copyright (C) 2013, 2014 Patrick "P. J." McDermott +# +# This file is part of the ProteanOS Development Kit. +# +# The ProteanOS Development Kit 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. +# +# The ProteanOS Development Kit 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 the ProteanOS Development Kit. If not, see +# <http://www.gnu.org/licenses/>. + +[ "x${_INSTALL_SM+set}" = 'xset' ] && return 0 +_INSTALL_SM=1 + +use profile +use dir +use fd +use pkg + +install_deps= +install_fnames= +install_md5sums= +install_sha256sums= +install_feed_url= + +install_system() +{ + local mirror="${1}" + local suite="${2}" + local arch="${3}" + local plat="${4}" + local chroot="${5}" + local foreign="${6}" + + if [ "x${arch}" = 'x' ]; then + arch="$(profile_detect_arch)" + fi + if [ "x${plat}" = 'x' ]; then + plat="$(profile_default_plat)" + fi + if [ "x${mirror}" = 'x' ]; then + mirror="$(profile_select_mirror)" + fi + + if ! profile_validate_archplat "${mirror}" "${arch}" "${plat}" \ + "${suite}"; then + error 2 "$(get_msg 'install_bad_archplat')" \ + "${arch}" "${plat}" + fi + + info "$(get_msg 'install_selected_arch')" "${arch}" + info "$(get_msg 'install_selected_plat')" "${plat}" + info "$(get_msg 'install_selected_mirror')" "${mirror}" + + info "$(get_msg 'install_setting_up_chroot')" + if [ -d "${chroot}" ] && ! dir_is_empty "${chroot}" 'lost+found'; then + error 2 "$(get_msg 'install_chroot_dir_exists')" "${chroot}" + fi + if ! mkdir -p "${chroot}/.prokit" "${chroot}/prokit"; then + error 2 "$(get_msg 'install_mkdir_chroot_fail')" "${chroot}" + fi + >"${chroot}/prokit/installing" + + info "$(get_msg 'install_find_pkgs')" + install_find_pkgs "${mirror}" "${suite}" "${arch}" "${plat}" \ + "${chroot}" + install_get_pkgs "${chroot}" + + info "$(get_msg 'install_configuring')" + if ! ${foreign}; then + profile_configure_system_native "${chroot}" "${arch}" "${plat}" + else + profile_configure_system_foreign "${chroot}" "${arch}" "${plat}" + fi + + rm "${chroot}/prokit/installing" +} + +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} + + install_deps= + install_fnames= + install_md5sums= + 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}" + install_feed_url="${feed%/*}" + feed_find_pkgs "${chroot}/var/lib/opkg/lists/${feed_idx}" \ + "$(profile_dep_fields)" profile_include_pkg \ + install_deps_cb install_fname_cb \ + install_md5sum_cb 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")" \ + "${install_deps}" | xargs printf '%s\n' | sort -u)" + printf '%s\n' "${pkgs}" >"${chroot}/.prokit/packages" +} + +install_deps_cb() +{ + local pkg="${1}" + local deps="${2}" + + install_deps="${install_deps}${pkg}: ${deps}${LF}" +} + +install_fname_cb() +{ + local pkg="${1}" + local fname="${2}" + + install_fnames="$(printf '%s\n%s %s/%s' "${install_fnames}" \ + "${pkg}" "${install_feed_url}" "${fname}")" +} + +install_md5sum_cb() +{ + local pkg="${1}" + local md5sum="${2}" + + install_md5sums="$(printf '%s\n%s %s' "${install_md5sums}" \ + "${pkg}" "${md5sum}")" +} + +install_sha256sum_cb() +{ + local pkg="${1}" + local sha256sum="${2}" + + install_sha256sums="$(printf '%s\n%s %s' \ + "${install_sha256sums}" "${pkg}" "${sha256sum}")" +} + +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 'install_downloading_pkg')" "${pkg}" + fname="$(printf '%s\n' "${install_fnames}" | \ + sed -n "s/^${pkg} //p")" + md5sum="$(printf '%s\n' "${install_md5sums}" | \ + sed -n "s/^${pkg} //p")" + sha256sum="$(printf '%s\n' "${install_sha256sums}" | \ + sed -n "s/^${pkg} //p")" + wget -q -O "${chroot}/var/cache/opkg/archives/${fname##*/}" \ + "${fname}" || \ + error 2 "$(get_msg '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 '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 'install_checksum_fail')" + fi + + info "$(get_msg '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} +} diff --git a/lib/local.mk b/lib/local.mk index 53b2d91..a202aad 100644 --- a/lib/local.mk +++ b/lib/local.mk @@ -18,4 +18,5 @@ pkgdata_sources = \ lib/rand.sh \ lib/cmd.sh \ lib/profile.sh \ - lib/package.sh + lib/package.sh \ + lib/install.sh |