summaryrefslogtreecommitdiffstats
path: root/pacstrap.in
diff options
context:
space:
mode:
Diffstat (limited to 'pacstrap.in')
-rw-r--r--pacstrap.in119
1 files changed, 119 insertions, 0 deletions
diff --git a/pacstrap.in b/pacstrap.in
new file mode 100644
index 0000000..72f2809
--- /dev/null
+++ b/pacstrap.in
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+#
+# Assumptions:
+# 1) User has partitioned, formatted, and mounted partitions on /mnt
+# 2) Network is functional
+# 3) Arguments passed to the script are valid pacman targets
+# 4) A valid mirror appears in /etc/pacman.d/mirrorlist
+#
+
+shopt -s extglob
+
+m4_include(common)
+
+hostcache=0
+copykeyring=1
+copymirrorlist=1
+
+usage() {
+ cat <<EOF
+usage: ${0##*/} [options] root [packages...]
+
+ Options:
+ -C config Use an alternate config file for pacman
+ -c Use the package cache on the host, rather than the target
+ -G Avoid copying the host's pacman keyring to the target
+ -i Avoid auto-confirmation of package selections
+ -M Avoid copying the host's mirrorlist to the target
+
+ -h Print this help message
+
+pacstrap installs packages to the specified new root directory. If no packages
+are given, pacstrap defaults to the "base" group.
+
+EOF
+}
+
+if [[ -z $1 || $1 = @(-h|--help) ]]; then
+ usage
+ exit $(( $# ? 0 : 1 ))
+fi
+
+(( EUID == 0 )) || die 'This script must be run with root privileges'
+
+while getopts ':C:cdGiM' flag; do
+ case $flag in
+ C)
+ pacman_config=$OPTARG
+ ;;
+ d)
+ # retired flag. does nothing.
+ ;;
+ c)
+ hostcache=1
+ ;;
+ i)
+ interactive=1
+ ;;
+ G)
+ copykeyring=0
+ ;;
+ M)
+ copymirrorlist=0
+ ;;
+ :)
+ die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG"
+ ;;
+ ?)
+ die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG"
+ ;;
+ esac
+done
+shift $(( OPTIND - 1 ))
+
+(( $# )) || die "No root directory specified"
+newroot=$1; shift
+pacman_args=("${@:-base}")
+
+if (( ! hostcache )); then
+ pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
+fi
+
+if (( ! interactive )); then
+ pacman_args+=(--noconfirm)
+fi
+
+if [[ $pacman_config ]]; then
+ pacman_args+=(--config="$pacman_config")
+fi
+
+[[ -d $newroot ]] || die "%s is not a directory" "$newroot"
+
+# create obligatory directories
+msg 'Creating install root at %s' "$newroot"
+mkdir -m 0755 -p "$newroot"/var/{cache/pacman/pkg,lib/pacman,log} "$newroot"/{dev,run,etc}
+mkdir -m 1777 -p "$newroot"/tmp
+mkdir -m 0555 -p "$newroot"/{sys,proc}
+
+# mount API filesystems
+chroot_setup "$newroot" || die "failed to setup chroot %s" "$newroot"
+
+msg 'Installing packages to %s' "$newroot"
+if ! pacman -r "$newroot" -Sy "${pacman_args[@]}"; then
+ die 'Failed to install packages to new root'
+fi
+
+if (( copykeyring )); then
+ # if there's a keyring on the host, copy it into the new root, unless it exists already
+ if [[ -d /etc/pacman.d/gnupg && ! -d $newroot/etc/pacman.d/gnupg ]]; then
+ cp -a /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"
+ fi
+fi
+
+if (( copymirrorlist )); then
+ # install the host's mirrorlist onto the new root
+ cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"
+fi
+
+# vim: et ts=2 sw=2 ft=sh: