class Warding::Installer

Public Instance Methods

banner() click to toggle source
check() click to toggle source
# File lib/warding.rb, line 27
def check
  unless `uname -a`.include?("archiso")
    @@prompt.error("Exiting...")
    @@prompt.warn("Warding can only be installed from within the live ISO context!")
    exit!
  end

  unless `[ -d /sys/firmware/efi ] && echo true`.include?("true")
    @@prompt.error("UEFI/EFI must be enabled to install warding.")
    exit!
  end
end
finish() click to toggle source
# File lib/warding.rb, line 252
def finish
  `umount -R /mnt`
  `reboot`
end
gather() click to toggle source
# File lib/warding.rb, line 40
def gather
  locales_list = %w[en_US es_ES pt_BR ru_RU fr_FR it_IT de_DE ja_JP ko_KR zh_CN]
  keymaps_list = %w[us uk br en fr de zh ru it es]

  parsed_input = @@prompt.collect do
    key(:update_mirrors).yes?("Update mirrorlist?")
    key(:system_language).select("Pick the desired system language:", locales_list)
    key(:keyboard_keymap).select("Pick your keyboard layout:", keymaps_list)

    unless @@prompt.yes?("Set timezone automatically?", default: true)
      key(:update_timezone).ask("Enter timezone:", required: true)
    end

    key(:root_password).mask("Insert new root password:", default: "warding")

    key(:system_settings) do
      key(:boot_size).slider("Boot drive partition size (MiB):", min: 512, max: 4096, default: 1024, step: 128)
      key(:swap_size).slider("Swap partition size (MiB):", min: 1024, max: 8192, default: 2048, step: 256)

      if key(:encrypted).yes?("Enable encryption?", default: false)
        key(:encryption_settings) do
          key(:encryption_key).mask("Insert the encryption key:", required: true)
        end
      end
    end

    key(:desktop_environment).select("Select your desktop environment:", %w[plasma gnome i3 none])
  end

  parsed_input
end
install(data, encrypted = false) click to toggle source
# File lib/warding.rb, line 72
def install(data, encrypted = false)
  if @@prompt.yes?("Confirm settings and continue?")

    @@prompt.say("Installing, please wait...")

    def setup_mirrors
      # update mirrorlist
      `reflector --latest 100 --sort rate --save /etc/pacman.d/mirrorlist`
    end

    def setup_timezone(timezone = false)
      # set clock
      `timedatectl set-ntp true`
      # set timezone
      if timezone
        `timedatectl set-timezone #{timezone}`
      else
        `timedatectl set-timezone "$(curl -s https://ipapi.co/timezone)"`
      end
    end

    def setup_partitions(boot_size)
      # create partitions
      `parted -s -a optimal /dev/sda \
        mklabel gpt \
        mkpart primary fat32 0% #{boot_size}Mib \
        set 1 esp on \
        mkpart primary ext4 #{boot_size}Mib 100% \
        set 2 lvm on
      `
    end

    def setup_lvm(swap_size, key = false)
      # setup encryption
      if key
        # create an encrypted volume
        `echo "#{key}" | cryptsetup -q luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 /dev/sda2`
        # open the volume
        `echo "#{key}" | cryptsetup open /dev/sda2 cryptlvm -`
        # setup lvm
        `pvcreate /dev/mapper/cryptlvm`
        # create virtual group
        `vgcreate vg0 /dev/mapper/cryptlvm`
      else
        # create physical volume
        `pvcreate /dev/sda2`
        # create virtual group
        `vgcreate vg0 /dev/sda2`
      end
      # create logical volumes
      `lvcreate -L #{swap_size}Mib vg0 -n swap`
      `lvcreate -l 100%FREE vg0 -n root`
      # make and mount rootfs
      `mkfs.ext4 -q /dev/vg0/root`
      `mount /dev/vg0/root /mnt`
      # make and mount boot partition
      `mkfs.fat -F32 /dev/sda1`
      `mkdir /mnt/boot`
      `mount /dev/sda1 /mnt/boot`
      # setup swap
      `mkswap /dev/vg0/swap`
      `swapon /dev/vg0/swap`
    end

    def setup_packages
      # update packages list
      `pacman -Syy`
      # install base system
      `pacstrap /mnt base base-devel linux linux-firmware linux-headers lvm2 mkinitcpio dmidecode smbclient reflector networkmanager go cronie man-db nano vi fuse wget openbsd-netcat dhcpcd samba openssh openvpn unzip vim git zsh`
      # generate fstab
      `genfstab -U /mnt >> /mnt/etc/fstab`
    end

    def setup_chroot(lang, keymap, password = "warding", encrypted = false)
      # set timezone
      `arch-chroot /mnt ln -sf /usr/share/zoneinfo/"$(curl -s https://ipapi.co/timezone)" /etc/localtime`
      # update clock
      `arch-chroot /mnt hwclock --systohc`
      # set locale
      `echo "#{lang}.UTF-8 UTF-8" > /mnt/etc/locale.gen`
      `arch-chroot /mnt locale-gen`
      `echo "LANG=#{lang}.UTF-8" > /mnt/etc/locale.conf`
      # set keymap
      `echo "KEYMAP=#{keymap}" > /mnt/etc/vconsole.conf`
      # update hostname
      `echo "warding" > /mnt/etc/hostname`
      # update hosts
      `echo "127.0.0.1 localhost\n::1 localhost\n127.0.1.1 warding.localdomain warding" > /mnt/etc/hosts`
      # update root password
      `echo -e "#{password}\n#{password}" | arch-chroot /mnt passwd`
      # update hooks
      if encrypted
        `sed -i "/^HOOK/s/modconf/keyboard keymap modconf/" /mnt/etc/mkinitcpio.conf`
        `sed -i "/^HOOK/s/filesystems/encrypt lvm2 filesystems/" /mnt/etc/mkinitcpio.conf`
      else
        `sed -i "/^HOOK/s/filesystems/lvm2 filesystems/" /mnt/etc/mkinitcpio.conf`
      end
      # recompile initramfs
      `arch-chroot /mnt mkinitcpio -P`
      # add intel microcode
      `arch-chroot /mnt pacman -S amd-ucode --noconfirm`
    end

    def setup_bootloader(encrypted = false)
      # setup systemd-boot
      `arch-chroot /mnt bootctl install`
      `echo "title Warding Linux
      linux /vmlinuz-linux
      initrd /amd-ucode.img
      initrd /initramfs-linux.img" > /mnt/boot/loader/entries/warding.conf`
      if encrypted
        `echo "options cryptdevice=UUID=$(blkid -s UUID -o value /dev/sda2):cryptlvm:allow-discards root=/dev/vg0/root quiet rw" >> /mnt/boot/loader/entries/warding.conf`
      else
        `echo "options root=/dev/vg0/root rw" >> /mnt/boot/loader/entries/warding.conf`
      end
    end

    def setup_usability
      # enable internet
      `arch-chroot /mnt systemctl -q enable NetworkManager`
      # add cron jobs
      `echo "#!/bin/bash\nreflector --latest 100 --sort rate --save /etc/pacman.d/mirrorlist" > /mnt/etc/cron.weekly/mirrorlist; chmod +x /mnt/etc/cron.weekly/mirrorlist`
      `echo "#!/bin/bash\npacman -Sy" > /mnt/etc/cron.weekly/pacman-sync; chmod +x /mnt/etc/cron.weekly/pacman-sync`
      `echo "#!/bin/bash\npacman -Syu --noconfirm" > /mnt/etc/cron.monthly/system-upgrade; chmod +x /mnt/etc/cron.monthly/system-upgrade`
      # enable cron jobs
      `arch-chroot /mnt systemctl -q enable cronie`
      # change default shell
      `arch-chroot /mnt chsh -s /usr/bin/zsh`
      # setup wordlists
      `arch-chroot /mnt mkdir -p /usr/share/wordlists`
      `arch-chroot /mnt curl -s https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/raft-large-directories-lowercase.txt -O --output-dir /usr/share/wordlists`
      `arch-chroot /mnt curl -s https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/common.txt -O --output-dir /usr/share/wordlists`
      `arch-chroot /mnt curl -s https://github.com/danielmiessler/SecLists/raw/master/Passwords/Leaked-Databases/rockyou.txt.tar.gz -O --output-dir /usr/share/wordlists`
      # setup drivers
      `arch-chroot /mnt pacman -S alsa-utils alsa-plugins alsa-lib --noc`
      # update package list
      `arch-chroot /mnt pacman -Syy`
      # user creation --fix
      `arch-chroot /mnt useradd -m -g wheel -s /bin/zsh ward`
      `sed -i '85 s/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' /mnt/etc/sudoers`
      `arch-chroot /mnt sudo -u ward sh -c "cd /home/ward; git clone https://aur.archlinux.org/yay.git; cd yay; makepkg -si --noconfirm"`
      `arch-chroot /mnt sudo -u ward sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended`
      # check if on VM
      if `arch-chroot /mnt dmidecode -s system-manufacturer`.include?("VMware, Inc.")
        # install and enable VMware utils
        `arch-chroot /mnt pacman -S open-vm-tools --noconfirm`
        `arch-chroot /mnt systemctl -q enable vmtoolsd`
      end
    end

    def setup_visuals(theme)
      case theme
      when "plasma"
        # install packages
        `arch-chroot /mnt pacman -S xorg-server plasma-meta gtkmm konsole sddm kvantum-qt5 --noc -q`
        # create conf dir
        `mkdir -p /mnt/etc/sddm.conf.d`
        # fix theme
        `echo "[Theme]\nCurrent=breeze" > /mnt/etc/sddm.conf.d/theme.conf`
        # enable autologin
        `echo "[Autologin]\nUser=ward\nSession=plasma" > /mnt/etc/sddm.conf.d/autologin.conf`
        # enable sddm
        `arch-chroot /mnt systemctl -q enable sddm`
      when "gnome"
        # install packages
        `arch-chroot /mnt pacman -S gtkmm gnome gnome-tweaks --noc`
        # enable autologin
        `echo "[daemon]\nAutomaticLogin=ward\nAutomaticLoginEnable=True" > /mnt/etc/gdm/custom.conf`
        # enable gdm
        `arch-chroot /mnt systemctl -q enable gdm`
      when "i3"
        # install packages
        `arch-chroot /mnt pacman -S lightdm lightdm-gtk-greeter xorg-server xorg-apps xorg-xinit i3-wm --noc`
        # enable lightdm
        `arch-chroot /mnt systemctl -q enable lightdm`
      else
        nil
      end
    end

    def finish
      `umount -R /mnt`
      `reboot`
    end

    setup_mirrors if data[:update_mirrors]
    data[:update_timezone] ? setup_timezone(data[:update_timezone]) : setup_timezone
    setup_partitions(data[:system_settings][:boot_size])
    data[:system_settings][:encrypted] ? setup_lvm(data[:system_settings][:swap_size], data[:system_settings][:encryption_settings][:encryption_key]) : setup_lvm(data[:system_settings][:swap_size])
    setup_packages
    data[:system_settings][:encrypted] ? setup_chroot(data[:system_language], data[:keyboard_keymap], data[:root_password], true) : setup_chroot(data[:system_language], data[:keyboard_keymap], data[:root_password])
    data[:system_settings][:encrypted] ? setup_bootloader(true) : setup_bootloader
    setup_usability
    setup_visuals(data[:desktop_environment])
    finish
  end
end
setup_bootloader(encrypted = false) click to toggle source
# File lib/warding.rb, line 175
def setup_bootloader(encrypted = false)
  # setup systemd-boot
  `arch-chroot /mnt bootctl install`
  `echo "title Warding Linux
  linux /vmlinuz-linux
  initrd /amd-ucode.img
  initrd /initramfs-linux.img" > /mnt/boot/loader/entries/warding.conf`
  if encrypted
    `echo "options cryptdevice=UUID=$(blkid -s UUID -o value /dev/sda2):cryptlvm:allow-discards root=/dev/vg0/root quiet rw" >> /mnt/boot/loader/entries/warding.conf`
  else
    `echo "options root=/dev/vg0/root rw" >> /mnt/boot/loader/entries/warding.conf`
  end
end
setup_chroot(lang, keymap, password = "warding", encrypted = false) click to toggle source
# File lib/warding.rb, line 145
def setup_chroot(lang, keymap, password = "warding", encrypted = false)
  # set timezone
  `arch-chroot /mnt ln -sf /usr/share/zoneinfo/"$(curl -s https://ipapi.co/timezone)" /etc/localtime`
  # update clock
  `arch-chroot /mnt hwclock --systohc`
  # set locale
  `echo "#{lang}.UTF-8 UTF-8" > /mnt/etc/locale.gen`
  `arch-chroot /mnt locale-gen`
  `echo "LANG=#{lang}.UTF-8" > /mnt/etc/locale.conf`
  # set keymap
  `echo "KEYMAP=#{keymap}" > /mnt/etc/vconsole.conf`
  # update hostname
  `echo "warding" > /mnt/etc/hostname`
  # update hosts
  `echo "127.0.0.1 localhost\n::1 localhost\n127.0.1.1 warding.localdomain warding" > /mnt/etc/hosts`
  # update root password
  `echo -e "#{password}\n#{password}" | arch-chroot /mnt passwd`
  # update hooks
  if encrypted
    `sed -i "/^HOOK/s/modconf/keyboard keymap modconf/" /mnt/etc/mkinitcpio.conf`
    `sed -i "/^HOOK/s/filesystems/encrypt lvm2 filesystems/" /mnt/etc/mkinitcpio.conf`
  else
    `sed -i "/^HOOK/s/filesystems/lvm2 filesystems/" /mnt/etc/mkinitcpio.conf`
  end
  # recompile initramfs
  `arch-chroot /mnt mkinitcpio -P`
  # add intel microcode
  `arch-chroot /mnt pacman -S amd-ucode --noconfirm`
end
setup_lvm(swap_size, key = false) click to toggle source
# File lib/warding.rb, line 104
def setup_lvm(swap_size, key = false)
  # setup encryption
  if key
    # create an encrypted volume
    `echo "#{key}" | cryptsetup -q luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 /dev/sda2`
    # open the volume
    `echo "#{key}" | cryptsetup open /dev/sda2 cryptlvm -`
    # setup lvm
    `pvcreate /dev/mapper/cryptlvm`
    # create virtual group
    `vgcreate vg0 /dev/mapper/cryptlvm`
  else
    # create physical volume
    `pvcreate /dev/sda2`
    # create virtual group
    `vgcreate vg0 /dev/sda2`
  end
  # create logical volumes
  `lvcreate -L #{swap_size}Mib vg0 -n swap`
  `lvcreate -l 100%FREE vg0 -n root`
  # make and mount rootfs
  `mkfs.ext4 -q /dev/vg0/root`
  `mount /dev/vg0/root /mnt`
  # make and mount boot partition
  `mkfs.fat -F32 /dev/sda1`
  `mkdir /mnt/boot`
  `mount /dev/sda1 /mnt/boot`
  # setup swap
  `mkswap /dev/vg0/swap`
  `swapon /dev/vg0/swap`
end
setup_mirrors() click to toggle source
# File lib/warding.rb, line 77
def setup_mirrors
  # update mirrorlist
  `reflector --latest 100 --sort rate --save /etc/pacman.d/mirrorlist`
end
setup_packages() click to toggle source
# File lib/warding.rb, line 136
def setup_packages
  # update packages list
  `pacman -Syy`
  # install base system
  `pacstrap /mnt base base-devel linux linux-firmware linux-headers lvm2 mkinitcpio dmidecode smbclient reflector networkmanager go cronie man-db nano vi fuse wget openbsd-netcat dhcpcd samba openssh openvpn unzip vim git zsh`
  # generate fstab
  `genfstab -U /mnt >> /mnt/etc/fstab`
end
setup_partitions(boot_size) click to toggle source
# File lib/warding.rb, line 93
def setup_partitions(boot_size)
  # create partitions
  `parted -s -a optimal /dev/sda \
    mklabel gpt \
    mkpart primary fat32 0% #{boot_size}Mib \
    set 1 esp on \
    mkpart primary ext4 #{boot_size}Mib 100% \
    set 2 lvm on
  `
end
setup_timezone(timezone = false) click to toggle source
# File lib/warding.rb, line 82
def setup_timezone(timezone = false)
  # set clock
  `timedatectl set-ntp true`
  # set timezone
  if timezone
    `timedatectl set-timezone #{timezone}`
  else
    `timedatectl set-timezone "$(curl -s https://ipapi.co/timezone)"`
  end
end
setup_usability() click to toggle source
# File lib/warding.rb, line 189
def setup_usability
  # enable internet
  `arch-chroot /mnt systemctl -q enable NetworkManager`
  # add cron jobs
  `echo "#!/bin/bash\nreflector --latest 100 --sort rate --save /etc/pacman.d/mirrorlist" > /mnt/etc/cron.weekly/mirrorlist; chmod +x /mnt/etc/cron.weekly/mirrorlist`
  `echo "#!/bin/bash\npacman -Sy" > /mnt/etc/cron.weekly/pacman-sync; chmod +x /mnt/etc/cron.weekly/pacman-sync`
  `echo "#!/bin/bash\npacman -Syu --noconfirm" > /mnt/etc/cron.monthly/system-upgrade; chmod +x /mnt/etc/cron.monthly/system-upgrade`
  # enable cron jobs
  `arch-chroot /mnt systemctl -q enable cronie`
  # change default shell
  `arch-chroot /mnt chsh -s /usr/bin/zsh`
  # setup wordlists
  `arch-chroot /mnt mkdir -p /usr/share/wordlists`
  `arch-chroot /mnt curl -s https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/raft-large-directories-lowercase.txt -O --output-dir /usr/share/wordlists`
  `arch-chroot /mnt curl -s https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/common.txt -O --output-dir /usr/share/wordlists`
  `arch-chroot /mnt curl -s https://github.com/danielmiessler/SecLists/raw/master/Passwords/Leaked-Databases/rockyou.txt.tar.gz -O --output-dir /usr/share/wordlists`
  # setup drivers
  `arch-chroot /mnt pacman -S alsa-utils alsa-plugins alsa-lib --noc`
  # update package list
  `arch-chroot /mnt pacman -Syy`
  # user creation --fix
  `arch-chroot /mnt useradd -m -g wheel -s /bin/zsh ward`
  `sed -i '85 s/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' /mnt/etc/sudoers`
  `arch-chroot /mnt sudo -u ward sh -c "cd /home/ward; git clone https://aur.archlinux.org/yay.git; cd yay; makepkg -si --noconfirm"`
  `arch-chroot /mnt sudo -u ward sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended`
  # check if on VM
  if `arch-chroot /mnt dmidecode -s system-manufacturer`.include?("VMware, Inc.")
    # install and enable VMware utils
    `arch-chroot /mnt pacman -S open-vm-tools --noconfirm`
    `arch-chroot /mnt systemctl -q enable vmtoolsd`
  end
end
setup_visuals(theme) click to toggle source
# File lib/warding.rb, line 222
def setup_visuals(theme)
  case theme
  when "plasma"
    # install packages
    `arch-chroot /mnt pacman -S xorg-server plasma-meta gtkmm konsole sddm kvantum-qt5 --noc -q`
    # create conf dir
    `mkdir -p /mnt/etc/sddm.conf.d`
    # fix theme
    `echo "[Theme]\nCurrent=breeze" > /mnt/etc/sddm.conf.d/theme.conf`
    # enable autologin
    `echo "[Autologin]\nUser=ward\nSession=plasma" > /mnt/etc/sddm.conf.d/autologin.conf`
    # enable sddm
    `arch-chroot /mnt systemctl -q enable sddm`
  when "gnome"
    # install packages
    `arch-chroot /mnt pacman -S gtkmm gnome gnome-tweaks --noc`
    # enable autologin
    `echo "[daemon]\nAutomaticLogin=ward\nAutomaticLoginEnable=True" > /mnt/etc/gdm/custom.conf`
    # enable gdm
    `arch-chroot /mnt systemctl -q enable gdm`
  when "i3"
    # install packages
    `arch-chroot /mnt pacman -S lightdm lightdm-gtk-greeter xorg-server xorg-apps xorg-xinit i3-wm --noc`
    # enable lightdm
    `arch-chroot /mnt systemctl -q enable lightdm`
  else
    nil
  end
end