# Copyright (c) 2020 The Regents of the University of California.
# SPDX-License-Identifier: BSD 3-Clause

# Choosing keyboard layout
d-i debian-installer/locale string en_US
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select us

# Choosing network interface
d-i netcfg/choose_interface select auto

# Assigning hostname and domain
d-i netcfg/get_hostname string gem5-host
d-i netcfg/get_domain string gem5-domain

d-i netcfg/wireless_wep string

# https://unix.stackexchange.com/q/216348
# The above link says there's no way to not to set a mirror
# Should choose a local minor
d-i mirror/country string manual
d-i mirror/http/hostname string archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

# Setting up `root` password
d-i passwd/root-login boolean false

# Creating a normal user account. This account has sudo permission.
d-i passwd/user-fullname string gem5
d-i passwd/username string gem5
d-i passwd/user-password password 12345
d-i passwd/user-password-again password 12345
d-i user-setup/allow-password-weak boolean true

# No home folder encryption
d-i user-setup/encrypt-home boolean false

# Choosing the clock timezone
d-i clock-setup/utc boolean true
d-i time/zone string US/Eastern
d-i clock-setup/ntp boolean true

# Choosing partition scheme
# This setting should result in MBR
# gem5 doesn't work with logical volumes
d-i partman-auto/method string regular
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# Ignoring an option to set the home folder in another partition
d-i partman-auto/choose_recipe select atomic

# Finishing disk partition settings
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# Installing standard packages and ubuntu-server packages
# More details about ubuntu standard packages:
# https://packages.ubuntu.com/bionic/ubuntu-standard
# More details about ubuntu-server packages:
# https://packages.ubuntu.com/bionic/ubuntu-server
tasksel tasksel/first multiselect standard, ubuntu-server

# openssh-server is required for communicating with Packer
# build-essential has standard compiling tools, could be removed
d-i pkgsel/include string openssh-server build-essential
# No package upgrade
d-i pkgsel/upgrade select none

# Updating packages automatically is unnecessary
d-i pkgsel/update-policy select none

# Choosing not to report installed software to some servers
popularity-contest popularity-contest/participate boolean false

# Installing grub
d-i grub-installer/only_debian boolean true

# Specifying which partition to boot
d-i grub-installer/bootdev  string /dev/sda

# Install to the above partition
d-i grub-installer/bootdev  string default

# Answering the prompt saying the installation is finished
d-i finish-install/reboot_in_progress note

# Answering the prompt saying no bootloader is installed
# This will appear if grub is not installed
nobootloader nobootloader/confirmation_common note
