#!/usr/bin/env sh # keru-install — Keru OS installer. Runs from the live ISO, walks you # through your choices, writes make.conf, then builds your system. set -eu . "$(dirname "$0")/../scripts/common.sh" OUT="${MAKE_CONF_OUT:-/tmp/keru/make.conf}" mkdir -p /tmp/keru # show a menu of options, remember the pick in $CHOICE pick() { prompt="$1"; shift default="$1"; shift CHOICE="$default" printf '%s\n' "== $prompt ==" n=0 for opt in "$@"; do n=$((n+1)) printf ' %s) %s\n' "$n" "$opt" done printf 'Select [%s]: ' "$default" read -r sel case "$sel" in ''|*[!0-9]*) CHOICE="$default" ;; *) if [ "$sel" -ge 1 ] && [ "$sel" -le "$n" ]; then i=0 for opt in "$@"; do i=$((i+1)) [ "$i" -eq "$sel" ] && { CHOICE="$opt"; break; } done else CHOICE="$default" fi ;; esac } require_network() { ok=0 for host in 1.1.1.1 github.com mirror.keru.org; do if command -v ping >/dev/null 2>&1 && ping -c1 -W2 "$host" >/dev/null 2>&1; then ok=1; break fi done if [ "$ok" = "0" ]; then if command -v nc >/dev/null 2>&1 && nc -z -w5 github.com 443 >/dev/null 2>&1; then ok=1 elif [ -e /dev/tcp ] && (exec 3<>/dev/tcp/github.com/443) >/dev/null 2>&1; then ok=1 fi fi [ "$ok" = "1" ] } configure_network() { if command -v nmtui >/dev/null 2>&1; then nmtui >/dev/null 2>&1 else warn "nmtui not available — bring up the network yourself, then continue" fi } banner "Keru OS — network required" info "the ISO only carries the installer." info "the system you choose (init, libc, fs, kernel, tools) is fetched and" info "built from the network during installation. a connection is required." while ! require_network; do warn "network: not connected" read -r -p "Connect to the network now (runs nmtui)? [Y/n] " cfg case "$cfg" in n|N|no) die "a network connection is required to install Keru" ;; *) configure_network ;; esac done msg "network: connected" banner "Keru OS — craft your system" pick "Init system" runit runit s6 openrc systemd busybox-init sysvinit dinit shepherd INIT="$CHOICE" pick "C library" glibc glibc musl uclibc-ng LIBC="$CHOICE" pick "Filesystem" ext4 ext4 ext2 ext3 btrfs xfs zfs f2fs jfs reiserfs TARGET_FS="$CHOICE" pick "Kernel" linux linux linux-lts linux-hardened linux-cachyos linux-zen KERNEL="$CHOICE" pick "Privilege elevation (sudo alternative)" doas doas sudo opendoas su SUDO="$CHOICE" pick "Network tools" nmtui nmtui networkmanager connman systemd-networkd NET="$CHOICE" warn_unstable() { unstable=0 case "$LIBC:$INIT" in uclibc-ng:*|musl:systemd) warn "$LIBC + $INIT: not yet proven to build and boot together" unstable=1 ;; esac case "$LIBC:$KERNEL" in musl:linux-zen|uclibc-ng:*) warn "$LIBC + $KERNEL: not yet proven to build and boot together" unstable=1 ;; esac case "$TARGET_FS" in zfs) warn "zfs + $LIBC: needs kernel module + ZFS userspace, not yet proven" unstable=1 ;; reiserfs) warn "reiserfs is unmaintained and has no stable future" unstable=1 ;; esac [ "$unstable" = "1" ] && warn "this combination is unstable. Keru won't stop you — build at your own risk." } warn_unstable msg "writing $OUT" cat > "$OUT" <