#!/run/current-system/profile/bin/bash # # Guix Simplified Installer # # Copyright (C) 2024 Adrien Bourmault # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set +x set -e # Définition des couleurs RED='\033[0;31m' GREEN='\033[0;32m' LIGHT_RED='\033[1;31m' LIGHT_GREEN='\033[1;32m' YELLOW='\033[1;33m' BLUE='\033[1;34m' NC='\033[0m' # No Color echo -e "${LIGHT_RED}Welcome to Guix Simplified Installer${NC}" echo -e "${NC}Copyright (C) 2024 Adrien Bourmault ${NC}" echo -e "${NC}This program is free software, released under the GNU AGPL version 3 or later.${NC}" # Chemin vers le disque DISK="$1" if [[ $DISK =~ [0-9]$ ]]; then PART_SUFFIX="p" else PART_SUFFIX="" fi # Vérification de l'existence du disque if [ ! -b "$DISK" ]; then echo -e "${RED}There is no such disk as $DISK !${NC}" exit 1 fi echo -e -n "${BLUE}Downloading configuration...${NC}" rm -f config.scm wget --quiet forge.chalec.org/neox/guix_jerome/raw/branch/master/config.scm echo -e "${GREEN}OK${NC}" echo -e -n "${BLUE}Creating disk layout...${NC}" parted -s "$DISK" mklabel gpt parted -s "$DISK" mkpart primary fat32 1MiB 5% parted -s "$DISK" mkpart primary ext4 5% 100% echo -e "${GREEN}OK${NC}" echo -e "${BLUE}Setting up root partition encryption...${NC}" cryptsetup luksFormat "${DISK}${PART_SUFFIX}2" echo -e "${GREEN}OK${NC}" echo -e "${BLUE}Unlocking root partition...${NC}" cryptsetup open "${DISK}${PART_SUFFIX}2" ROOT echo -e "${GREEN}OK${NC}" echo -e "${BLUE}Formatting disks partitions...${NC}" mkfs.vfat "${DISK}${PART_SUFFIX}1" mkfs.ext4 -L ROOT /dev/mapper/ROOT echo -e "${GREEN}OK${NC}" echo -e -n "${BLUE}Updating disk configuration...${NC}" UUID=$(blkid -o value -s UUID "${DISK}${PART_SUFFIX}2") sed -i "s/CHANGE_THIS_UUID/${UUID}/g" config.scm UUID2=$(blkid -o value -s UUID "${DISK}${PART_SUFFIX}1") sed -i "s/CHANGE_THIS_DISK/${UUID2}/g" config.scm echo -e "${GREEN}OK${NC}" echo -e -n "${BLUE}Mounting disks...${NC}" mount LABEL=ROOT /mnt mkdir -p /mnt/boot/efi mount "${DISK}${PART_SUFFIX}1" /mnt/boot/efi echo -e "${GREEN}OK${NC}" echo -e -n "${BLUE}Moving configuration to its final location...${NC}" mkdir /mnt/etc cp config.scm /mnt/etc/config.scm sed -i '66d' /mnt/etc/config.scm echo -e "${GREEN}OK${NC}" echo -e "${BLUE}Installing GNU Guix...${NC}" herd start cow-store /mnt install_guix() { tmpfile=$(mktemp) guix system init config.scm /mnt >(tee "$tmpfile") exit_code=$? output=$(tail -n 3 "$tmpfile") rm -f "$tmpfile" if [[ $exit_code -ne 0 && $output == *"died unexpectedly"* ]]; then return 1 else return 0 fi } max_retries=5 attempt=0 until install_guix; do attempt=$((attempt + 1)) if [[ $attempt -ge $max_retries ]]; then echo -e "${RED}Installation has failed${NC}" exit 1 fi echo -e "${BLUE}Trying installing GNU Guix again...${NC}" done