mirror of
https://gitlab.manjaro.org/applications/manjaro-architect
synced 2024-11-08 01:10:26 +00:00
70fc3634dc
- for logging user selections, package lists and whatever we find useful. How about when the install was successful and the installer quits, we copy the file to target install?
341 lines
11 KiB
Bash
341 lines
11 KiB
Bash
# !/bin/bash
|
|
#
|
|
# Architect Installation Framework (version 2.3.1 - 26-Mar-2016)
|
|
#
|
|
# Written by Carl Duff for Architect Linux
|
|
#
|
|
# Modified by Chrysostomus to install manjaro instead
|
|
#
|
|
# This program is free software, provided under the GNU General Public License
|
|
# as published by the Free Software Foundation. So feel free to copy, distribute,
|
|
# or modify it as you wish.
|
|
|
|
# Header
|
|
VERSION="Manjaro Architect Installer v$version"
|
|
|
|
# Host system information
|
|
ARCHI=$(uname -m) # Display whether 32 or 64 bit system
|
|
SYSTEM="Unknown" # Display whether system is BIOS or UEFI. Default is "unknown"
|
|
H_INIT="" # Host init-sys
|
|
NW_CMD="" # command to launch the available network client
|
|
|
|
# Locale and Language
|
|
CURR_LOCALE="en_US.UTF-8" # Default Locale
|
|
FONT="" # Set new font if necessary
|
|
KEYMAP="us" # Virtual console keymap. Default is "us"
|
|
XKBMAP="us" # X11 keyboard layout. Default is "us"
|
|
ZONE="" # For time
|
|
SUBZONE="" # For time
|
|
LOCALE="en_US.UTF-8" # System locale. Default is "en_US.UTF-8"
|
|
PROFILES="" # iso-profiles path
|
|
|
|
# Menu highlighting (automated step progression)
|
|
HIGHLIGHT=0 # Highlight items for Main Menu
|
|
HIGHLIGHT_SUB=0 # Highlight items for submenus
|
|
SUB_MENU="" # Submenu to be highlighted
|
|
PARENT="" # the parent menu
|
|
|
|
# Temporary files to store menu selections
|
|
ANSWER="/tmp/.aif" # Basic menu selections
|
|
PACKAGES="/tmp/.pkgs" # Packages to install
|
|
MOUNT_OPTS="/tmp/.mnt_opts" # Filesystem Mount options
|
|
INIT="/tmp/.init" # init systemd|openrc
|
|
|
|
# Installer-Log
|
|
LOGFIlE="/var/log/m-a.log"
|
|
[[ -e $LOGFILE ]] && touch $LOGFILE
|
|
|
|
# file systems
|
|
BTRFS=0
|
|
LUKS=0
|
|
LUKS_DEV=""
|
|
LUKS_NAME=""
|
|
LUKS_OPT="" # Default or user-defined?
|
|
LUKS_UUID=""
|
|
LVM=0
|
|
LVM_LV_NAME="" # Name of LV to create or use
|
|
LVM_VG=""
|
|
LVM_VG_MB=0
|
|
VG_PARTS=""
|
|
LVM_SEP_BOOT=0 # 1 = Seperate /boot, 2 = seperate /boot & LVM
|
|
LV_SIZE_INVALID=0 # Is LVM LV size entered valid?
|
|
VG_SIZE_TYPE="" # Is VG in Gigabytes or Megabytes?
|
|
|
|
# Mounting
|
|
MOUNT="" # Installation: All other mounts branching
|
|
MOUNTPOINT="/mnt" # Installation: Root mount from Root
|
|
FS_OPTS="" # File system special mount options available
|
|
CHK_NUM=16 # Used for FS mount options checklist length
|
|
INCLUDE_PART='part\|lvm\|crypt' # Partition types to include for display and selection.
|
|
ROOT_PART="" # ROOT partition
|
|
UEFI_PART="" # UEFI partition
|
|
UEFI_MOUNT="" # UEFI mountpoint (/boot or /boot/efi)
|
|
|
|
# Edit Files
|
|
FILE="" # File(s) to be reviewed
|
|
|
|
# Installation
|
|
DM_INST="" # Which DMs have been installed?
|
|
DM_ENABLED=0 # Has a display manager been enabled?
|
|
NM_INST="" # Which NMs have been installed?
|
|
NM_ENABLED=0 # Has a network connection manager been enabled?
|
|
KERNEL="n" # Kernel(s) installed (base install); kernels for mkinitcpio
|
|
GRAPHIC_CARD="" # graphics card
|
|
INTEGRATED_GC="" # Integrated graphics card for NVIDIA
|
|
NVIDIA_INST=0 # Indicates if NVIDIA proprietary driver has been installed
|
|
NVIDIA="" # NVIDIA driver(s) to install depending on kernel(s)
|
|
VB_MOD="" # headers packages to install depending on kernel(s)
|
|
SHOW_ONCE=0 # Show de_wm information only once
|
|
COPY_PACCONF=0 # Copy over installer /etc/pacman.conf to installed system?
|
|
|
|
import(){
|
|
if [[ -r $1 ]];then
|
|
source $1
|
|
else
|
|
die "Could not import $1"
|
|
fi
|
|
}
|
|
|
|
LOG(){
|
|
echo "$(date +%D-%T%Z): $1" >> $LOGFILE
|
|
}
|
|
|
|
DIALOG() {
|
|
dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --column-separator "|" --title "$@"
|
|
}
|
|
|
|
# progress through menu entries until number $1 is reached
|
|
submenu() {
|
|
if [[ $SUB_MENU != "$PARENT" ]]; then
|
|
SUB_MENU="$PARENT"
|
|
HIGHLIGHT_SUB=1
|
|
elif [[ $HIGHLIGHT_SUB != "$1" ]]; then
|
|
HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
|
|
fi
|
|
}
|
|
|
|
# Adapted from AIS. Checks if system is made by Apple, whether the system is BIOS or UEFI,
|
|
# and for LVM and/or LUKS.
|
|
id_system() {
|
|
# Apple System Detection
|
|
if [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Inc.' ]] || [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Computer, Inc.' ]]; then
|
|
modprobe -r -q efivars || true # if MAC
|
|
else
|
|
modprobe -q efivarfs # all others
|
|
fi
|
|
|
|
# BIOS or UEFI Detection
|
|
if [[ -d "/sys/firmware/efi/" ]]; then
|
|
# Mount efivarfs if it is not already mounted
|
|
if [[ -z $(mount | grep /sys/firmware/efi/efivars) ]]; then
|
|
mount -t efivarfs efivarfs /sys/firmware/efi/efivars
|
|
fi
|
|
SYSTEM="UEFI"
|
|
else
|
|
SYSTEM="BIOS"
|
|
fi
|
|
|
|
# init system
|
|
if [ $(cat /proc/1/comm) == "systemd" ]; then
|
|
H_INIT="systemd"
|
|
else
|
|
H_INIT="openrc"
|
|
fi
|
|
|
|
## TODO: Test which nw-client is available, including if the service according to $H_INIT is running
|
|
[[ $H_INIT == "systemd" ]] && [[ $(systemctl is-active NetworkManager) == "active" ]] && NW_CMD=nmtui
|
|
}
|
|
|
|
# If there is an error, display it, move the log and then go back to the main menu (no point in continuing).
|
|
check_for_error() {
|
|
if [[ $? -eq 1 ]] && [[ $(cat /tmp/.errlog | grep -i "error") != "" ]]; then
|
|
DIALOG " $_ErrTitle " --msgbox "$(cat /tmp/.errlog)" 0 0
|
|
mv /tmp/.errlog /tmp/.errlog0
|
|
|
|
main_menu_online
|
|
fi
|
|
}
|
|
|
|
# Add locale on-the-fly and sets source translation file for installer
|
|
select_language() {
|
|
DIALOG "Select Language" --default-item '3' --menu "\n$_Lang" 0 0 11 \
|
|
"1" $"Danish|(da_DK)" \
|
|
"2" $"Dutch|(nl_NL)" \
|
|
"3" $"English|(en_**)" \
|
|
"4" $"French|(fr_FR)" \
|
|
"5" $"Hungarian|(hu_HU)" \
|
|
"6" $"Italian|(it_IT)" \
|
|
"7" $"Portuguese|(pt_PT)" \
|
|
"8" $"Portuguese [Brasil]|(pt_BR)" \
|
|
"9" $"Russian|(ru_RU)" \
|
|
"10" $"Spanish|(es_ES)" 2>${ANSWER}
|
|
|
|
# "5" $"German|(de_DE)" \
|
|
|
|
case $(cat ${ANSWER}) in
|
|
"1") source $DATADIR/translations/danish.trans
|
|
CURR_LOCALE="da_DK.UTF-8"
|
|
FONT="lat2-16.psfu"
|
|
;;
|
|
"2") source $DATADIR/translations/dutch.trans
|
|
CURR_LOCALE="nl_NL.UTF-8"
|
|
;;
|
|
"3") source $DATADIR/translations/english.trans
|
|
CURR_LOCALE="en_US.UTF-8"
|
|
;;
|
|
"4") source $DATADIR/translations/french.trans
|
|
CURR_LOCALE="fr_FR.UTF-8"
|
|
;;
|
|
# "5") source $DATADIR/translations/german.trans
|
|
# CURR_LOCALE="de_DE.UTF-8"
|
|
# ;;
|
|
"5") source $DATADIR/translations/hungarian.trans
|
|
CURR_LOCALE="hu_HU.UTF-8"
|
|
FONT="lat2-16.psfu"
|
|
;;
|
|
"6") source $DATADIR/translations/italian.trans
|
|
CURR_LOCALE="it_IT.UTF-8"
|
|
;;
|
|
"7") source $DATADIR/translations/portuguese.trans
|
|
CURR_LOCALE="pt_PT.UTF-8"
|
|
;;
|
|
"8") source $DATADIR/translations/portuguese_brasil.trans
|
|
CURR_LOCALE="pt_BR.UTF-8"
|
|
;;
|
|
"9") source $DATADIR/translations/russian.trans
|
|
CURR_LOCALE="ru_RU.UTF-8"
|
|
FONT="LatKaCyrHeb-14.psfu"
|
|
;;
|
|
"10") source $DATADIR/translations/spanish.trans
|
|
CURR_LOCALE="es_ES.UTF-8"
|
|
;;
|
|
# "") source $DATADIR/translations/turkish.trans
|
|
# CURR_LOCALE="tr_TR.UTF-8"
|
|
# FONT="LatKaCyrHeb-14.psfu"
|
|
# ;;
|
|
# "") source $DATADIR/translations/greek.trans
|
|
# CURR_LOCALE="el_GR.UTF-8"
|
|
# FONT="iso07u-16.psfu"
|
|
# ;;
|
|
# "") source $DATADIR/translations/polish.trans
|
|
# CURR_LOCALE="pl_PL.UTF-8"
|
|
# FONT="latarcyrheb-sun16"
|
|
# ;;
|
|
*) clear && exit 0
|
|
;;
|
|
esac
|
|
|
|
# Generate the chosen locale and set the language
|
|
DIALOG "$_Config" --infobox "$_ApplySet" 0 0
|
|
sleep 2
|
|
sed -i "s/#${CURR_LOCALE}/${CURR_LOCALE}/" /etc/locale.gen
|
|
locale-gen >/dev/null 2>&1
|
|
export LANG=${CURR_LOCALE}
|
|
[[ $FONT != "" ]] && setfont $FONT
|
|
}
|
|
|
|
mk_connection() {
|
|
if [[ ! $(ping -c 2 google.com) ]]; then
|
|
DIALOG "$_NoCon" --yesno "\n$_EstCon" 0 0 && $NW_CMD || clear && exit 0
|
|
fi
|
|
}
|
|
|
|
# Check user is root, and that there is an active internet connection
|
|
# Seperated the checks into seperate "if" statements for readability.
|
|
check_requirements() {
|
|
DIALOG " $_ChkTitle " --infobox "$_ChkBody" 0 0
|
|
sleep 2
|
|
|
|
if [[ `whoami` != "root" ]]; then
|
|
DIALOG " $_Erritle " --infobox "$_RtFailBody" 0 0
|
|
sleep 2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! $(ping -c 1 google.com) ]]; then
|
|
DIALOG " $_ErrTitle " --infobox "$_ConFailBody" 0 0
|
|
sleep 2
|
|
exit 1
|
|
fi
|
|
|
|
# This will only be executed where neither of the above checks are true.
|
|
# The error log is also cleared, just in case something is there from a previous use of the installer.
|
|
DIALOG " $_ReqMetTitle " --infobox "$_ReqMetBody" 0 0
|
|
sleep 2
|
|
clear
|
|
echo "" > /tmp/.errlog
|
|
pacman -Syy
|
|
}
|
|
|
|
# Greet the user when first starting the installer
|
|
greeting() {
|
|
DIALOG " $_WelTitle $VERSION " --msgbox "$_WelBody" 0 0
|
|
}
|
|
|
|
# Originally adapted from AIS. Added option to allow users to edit the mirrorlist.
|
|
configure_mirrorlist() {
|
|
rank_mirrors() {
|
|
#Choose the branch for mirrorlist
|
|
BRANCH="/tmp/.branch"
|
|
DIALOG "$_MirrorBranch" --radiolist " $_UseSpaceBar" 0 0 3 \
|
|
"stable" "-" on \
|
|
"testing" "-" off \
|
|
"unstable" "-" off 2>${BRANCH}
|
|
|
|
pacman-mirrors -gib $(cat ${BRANCH})
|
|
}
|
|
|
|
DIALOG " $_MirrorlistTitle " \
|
|
--menu "$_MirrorlistBody" 0 0 4 \
|
|
"1" "$_MirrorRankTitle" \
|
|
"2" "$_MirrorConfig" \
|
|
"3" "$_MirrorPacman" \
|
|
"4" "$_Back" 2>${ANSWER}
|
|
|
|
case $(cat ${ANSWER}) in
|
|
"1") rank_mirrors
|
|
;;
|
|
"2") nano /etc/pacman-mirrors.conf
|
|
;;
|
|
"3") nano /etc/pacman.conf
|
|
DIALOG " $_MirrorPacman " --yesno "$_MIrrorPacQ" 0 0 && COPY_PACCONF=1 || COPY_PACCONF=0
|
|
pacman -Syy
|
|
;;
|
|
*) install_base_menu
|
|
;;
|
|
esac
|
|
|
|
configure_mirrorlist
|
|
}
|
|
|
|
# Simple code to show devices / partitions.
|
|
show_devices() {
|
|
lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE,MOUNTPOINT | grep "disk\|part\|lvm\|crypt\|NAME\|MODEL\|TYPE\|FSTYPE\|SIZE\|MOUNTPOINT" > /tmp/.devlist
|
|
DIALOG " $_DevShowOpt " --textbox /tmp/.devlist 0 0
|
|
}
|
|
|
|
# Adapted from AIS. An excellent bit of code!
|
|
arch_chroot() {
|
|
manjaro-chroot $MOUNTPOINT "${1}"
|
|
}
|
|
|
|
# Ensure that a partition is mounted
|
|
check_mount() {
|
|
if [[ $(lsblk -o MOUNTPOINT | grep ${MOUNTPOINT}) == "" ]]; then
|
|
DIALOG " $_ErrTitle " --msgbox "$_ErrNoMount" 0 0
|
|
main_menu_online
|
|
fi
|
|
}
|
|
|
|
# Ensure that Manjaro has been installed
|
|
check_base() {
|
|
if [[ ! -e ${MOUNTPOINT}/etc ]]; then
|
|
DIALOG " $_ErrTitle " --msgbox "$_ErrNoBase" 0 0
|
|
main_menu_online
|
|
fi
|
|
}
|
|
|
|
inst_needed() {
|
|
[[ ! $(pacman -Q $1 2>/dev/null) ]] && pacman -Sy --noconfirm $1
|
|
}
|