summaryrefslogtreecommitdiffstats
path: root/lib/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cmd')
-rw-r--r--lib/cmd/install.sh251
-rw-r--r--lib/cmd/installer-pc.sh101
-rw-r--r--lib/cmd/local.mk3
3 files changed, 107 insertions, 248 deletions
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