Initial Commit

This commit is contained in:
LinuxSquare 2023-12-20 16:33:53 +01:00
commit 04d01ce4b1
14 changed files with 743 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
out/

5
Makefile Normal file
View file

@ -0,0 +1,5 @@
iso:
sudo mkteaiso -o ${PWD}/out -p ${PWD}
clean:
rm -f ${PWD}/out/*.iso

6
README.md Normal file
View file

@ -0,0 +1,6 @@
# NoveriaOS files
This are the official NoveriaOS files.
The ISO is generated using teaiso.
Within the ISO, you'll be greeted by a installation-script to guide you through the installation-process of NoveriaOS.

View file

@ -0,0 +1,3 @@
https://dl-cdn.alpinelinux.org/alpine/v3.18/main
https://dl-cdn.alpinelinux.org/alpine/v3.18/community
@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing

View file

@ -0,0 +1,5 @@
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

View file

@ -0,0 +1,5 @@
state_verbose: False
file_client: local
file_roots:
base:
- /srv/salt

View file

@ -0,0 +1,117 @@
# $OpenBSD: sshd_config,v 1.104 2021/07/02 05:11:21 dtucker Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
# Change to no to disable s/key passwords
#KbdInteractiveAuthentication yes
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the KbdInteractiveAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via KbdInteractiveAuthentication may bypass
# the setting of "PermitRootLogin prohibit-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and KbdInteractiveAuthentication to 'no'.
#UsePAM no
#AllowAgentForwarding yes
# Feel free to re-enable these if your use case requires them.
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# override default of no subsystems
Subsystem sftp internal-sftp
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server

View file

@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF2kBMGGTKYtcIC8oJSqG0BvUXabIYyttte06pGtJ3f5

4
airootfs/root/.zlogin Normal file
View file

@ -0,0 +1,4 @@
# start install.sh if local start
if [[ $(tty) == "/dev/tty1" ]]; then
/root/install.sh
fi

528
airootfs/root/install.sh Normal file
View file

@ -0,0 +1,528 @@
#!/usr/bin/env bash
###
##
## NoveriaOS Install script
##
###
###
## Definitions
###
# Checks
readonly CHECK_INTERNET_URL='www.alpinelinux.org'
# Installation
readonly INSTALLATION_LOCK_FILE='/root/.installation.lock'
readonly INSTALLATION_LOGFILE='/root/installation.log'
readonly INSTALLATION_PARTLABEL_ESP="ESP"
readonly INSTALLATION_PARTLABEL_ROOT="ROOT"
readonly INSTALLATION_ESP_PARTITION_SIZE=4
readonly INSTALLATION_MOUNTPOINT='/mnt'
readonly INSTALLATION_NOVERIA_BIN='/usr/local/noveria/bin'
readonly INSTALLATION_SECRETS_FILE="/root/installation.secrets"
readonly INSTALLATION_SALT_ROOT="srv/salt"
readonly INSTALLATION_SALT_GIT="https://git.noveria.org/NoveriaOS/salt-statetree.git"
readonly INSTALLATION_PILLAR_ROOT="srv/pillar"
readonly INSTALLATION_PILLAR_GIT="https://git.noveria.org/NoveriaOS/salt-pillartree.git"
readonly INSTALLATION_ALPINE_VERSION=$(cat /etc/os-release | grep VERSION_ID | cut -d= -f2)
# Colors
readonly RED='\033[0;31m'
readonly NC='\033[0m' # No Color
###
## Errorhandling
###
# set -e exit script when a command fails
# set -o pipefail check any command in pipeline for error, not just last one
# set -eo pipefail
# catch ^C and other signals and clean up
trap "errorHardExit 'Interrupted with CTRL+C'" SIGINT SIGHUP SIGTERM SIGABRT
###
## Helper Functions
###
##
# Installation subtask title output
# - $1: subtask title
##
function installationSubtaskTitle() {
echo -e "\n=> $1"
}
##
# Random password generator (alphanumeric)
# - $1: password length (default 11)
# - $2: avoid poorly readable characters: l/I/1, O/0 (default false)
##
function randomPasswordGen() {
# character set
if ${2:-false}; then
local character_set='a-km-zA-HJ-NP-Z2-9'
else
local character_set='a-zA-Z0-9'
fi
# https://en.wikipedia.org/wiki/randomPasswordGen#Bash
LC_ALL=C tr -dc "$character_set" </dev/urandom | head -c "${1:-11}"
echo
}
##
# Hard exit with console error message
##
function errorHardExit() {
echo -e "${RED}$1${NC} \nAborting \n"
exit 1
}
###
## Functions
###
##
# Pre checks
##
function preChecks() {
# Check if another installation is in progress
if [ -f $INSTALLATION_LOCK_FILE ]; then
dialog --stdout --clear --no-collapse --yes-label "Exit" --no-label "Start anyway" --yesno " Another installation is in progress" 6 50
case $? in
0)
clear
exit
;;
1) rm "$INSTALLATION_LOCK_FILE" ;;
255)
clear
exit
;;
esac
fi
introDialogue
}
##
# Introduction dialog
##
function introDialogue() {
local introtext="\n\n\n
Velkommen til
_ _ _
| \ | | _____ _____ _ __(_) __ _
| \| |/ _ \ \ / / _ \ '__| |/ _ |
| |\ | (_) \ V / __/ | | | (_| |
|_| \_|\___/ \_/ \___|_| |_|\__,_|
OS: NoveriaOS
Version: $(date "+%Y%m")
How do you want to continue?
"
dialog --stdout --clear --cr-wrap --no-collapse --yes-label "Graphical Guide" --no-label "Alpine shell" --yesno "$introtext" 31 93
case $? in
1)
clear
exit
;;
255)
clear
exit
;;
esac
checkInternetConnection
}
##
# Internet connection
##
function checkInternetConnection() {
dialog --no-collapse --infobox "\n Check internet connection" 5 35
# wait 5 seconds to give some more time for network initialization
sleep 5
while ! ping -c 1 "$CHECK_INTERNET_URL" >/dev/null 2>&1; do
dialog --clear --title "No internet connection" --msgbox "
Insert network cable, wait 5 seconds and press 'OK'" 7 65
done
prepareInstallation
}
##
# Installation preparation
##
function prepareInstallation() {
# disk
readonly AVAILABLE_DISKS=($(lsblk | grep -vE "p[0-9]+" | grep -vE "[s,v]d[a-z][0-9]+" | grep -v "luks" | grep -v "rom" | grep -vE "sd[a-z][0-9]+" | grep -v "/" | tail -n +2 | awk '{print $1}'))
for available_disk in ${AVAILABLE_DISKS[@]}; do
if [[ -z "$diskString" ]]; then
diskString="$available_disk /dev/$available_disk off"
else
diskString="$diskString $available_disk /dev/$available_disk off"
fi
done
INSTALLATION_DISK=$(dialog --clear --radiolist "Select Disk to install the system" 10 70 3 $(echo $diskString) 3>&1 1>&2 2>&3 3>&-)
INSTALLATION_DISK_BYID=$(lshw -class disk | grep ${INSTALLATION_DISK} | tr -d "[:space:]" | cut -d: -f2)
# root password
INSTALLATION_ROOT_PW=$(randomPasswordGen 5)
for _ in {0..2}; do
INSTALLATION_ROOT_PW="${INSTALLATION_ROOT_PW}-$(randomPasswordGen 5)"
done
# salt-master or minion
SALT_RUNNER=$(dialog --clear --radiolist "What shall this host be?" 10 70 3 "salt-master" "salt-master" "off" "salt-minion" "salt-minion" "on" 3>&1 1>&2 2>&3 3>&-)
if [[ "$SALT_RUNNER" == "salt-minion" ]]; then
dialog --clear --title "Is there a salt-master in this network?" --yes-label "Yes" --no-label "No" --yesno
case $? in
0)
dialog --clear --title "What's the IP of the salt-master?" --inputbox "Enter IP's Address" 10 70 3 >$SALT_MASTER_IP
;;
1)
SALT_MASTER_IP="127.0.0.1"
esac
fi
# show summary
summary
}
##
# Summary to confirm
##
function summary() {
dialog --stdout --clear --title "Summary" --yes-label "Confirm" --no-label "Abort" --yesno "\n
Disk: $INSTALLATION_DISK \n
Salt: $SALT_RUNNER
$([[ $SALT_RUNNER == 'salt-minion' ]] && ([[ $SALT_MASTER_IP != '127.0.0.1' ]] && echo \"\n Salt-Master IP: $SALT_MASTER_IP\"))
" 9 60
case $? in
0) installation ;;
1)
clear
errorHardExit "Abort on summary dialog"
;;
255)
clear
errorHardExit "Abort on summary dialog"
;;
esac
}
##
# Installation
##
function installation() {
# clear display
clear
# lock file
touch "$INSTALLATION_LOCK_FILE" || installationFailed
# log all output to logfile
rm -f "$INSTALLATION_LOGFILE" || installationFailed
exec &> >(tee -a "$INSTALLATION_LOGFILE")
# create boot environment timestamp
START_TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S") || installationFailed
echo ""
echo "┌──────────────────────────────────────────┐"
echo "│ Swipe and repartition disk │"
echo "└──────────────────────────────────────────┘"
installationSubtaskTitle "Wipe disk"
blkdiscard -f "${INSTALLATION_DISK_BYID}" || installationFailed
installationSubtaskTitle "Repartitioning disk"
parted -s "${INSTALLATION_DISK_BYID}" mklabel gpt || installationFailed
parted -s "${INSTALLATION_DISK_BYID}" mkpart "${INSTALLATION_PARTLABEL_ESP}" fat32 1MiB ${INSTALLATION_ESP_PARTITION_SIZE}GiB || installationFailed
parted -s "${INSTALLATION_DISK_BYID}" set 1 esp on || installationFailed
parted -s "${INSTALLATION_DISK_BYID}" mkpart "${INSTALLATION_PARTLABEL_ROOT}" btrfs ${INSTALLATION_ESP_PARTITION_SIZE}GiB 100% || installationFailed
# Informing the Kernel of the changes.
sleep 0.1
partprobe "${INSTALLATION_DISK_BYID}" || installationFailed
# loop until lsblk is updated and gives the partition back
while
sleep 0.1
ESP_PARTITION="/dev/$(lsblk "${INSTALLATION_DISK_BYID}" -o NAME,PARTLABEL | grep "${INSTALLATION_PARTLABEL_ESP}" | cut -d " " -f1 | cut -c7-)" || installationFailed
ROOT_PARTITION="/dev/$(lsblk "${INSTALLATION_DISK_BYID}" -o NAME,PARTLABEL | grep "${INSTALLATION_PARTLABEL_ROOT}" | cut -d " " -f1 | cut -c7-)" || installationFailed
[[ "${ESP_PARTITION}" == '/dev/' || "${ROOT_PARTITION}" == '/dev/' ]]
do :; done
installationSubtaskTitle "File system creation"
mkfs.vfat -F 32 -n EFI "${ESP_PARTITION}" || installationFailed
mkfs.btrfs -f -L ROOT "${ROOT_PARTITION}" || installationFailed
installationSubtaskTitle "Create btrfs subvolumes"
mount -t btrfs "${ROOT_PARTITION}" "${INSTALLATION_MOUNTPOINT}" || installationFailed
btrfs sub create "${INSTALLATION_MOUNTPOINT}/@root_${START_TIMESTAMP}" || installationFailed
btrfs sub create "${INSTALLATION_MOUNTPOINT}/@home" || installationFailed
btrfs sub create "${INSTALLATION_MOUNTPOINT}/@podman" || installationFailed
btrfs sub create "${INSTALLATION_MOUNTPOINT}/@mysql" || installationFailed
umount "${INSTALLATION_MOUNTPOINT}" || installationFailed
echo ""
echo "┌──────────────────────────────────────────┐"
echo "│ Mount filesystems │"
echo "└──────────────────────────────────────────┘"
installationSubtaskTitle "Mount btrfs subvolumes"
mount -o noatime,nodiratime,discard=async,space_cache=v2,subvol=@root_"${START_TIMESTAMP}" "${ROOT_PARTITION}" "${INSTALLATION_MOUNTPOINT}" || installationFailed
mkdir -p ${INSTALLATION_MOUNTPOINT}/{efi,home,btrfs,var/lib/mysql,opt/podman,sys/firmware/efi/efivars} || installationFailed
mount -o noatime,nodiratime,discard=async,space_cache=v2,subvol=@home "${ROOT_PARTITION}" "${INSTALLATION_MOUNTPOINT}/home" || installationFailed
mount -o noatime,nodiratime,discard=async,space_cache=v2,subvol=@podman "${ROOT_PARTITION}" "${INSTALLATION_MOUNTPOINT}/opt/podman" || installationFailed
mount -o noatime,nodiratime,discard=async,space_cache=v2,subvol=@mysql "${ROOT_PARTITION}" "${INSTALLATION_MOUNTPOINT}/var/lib/mysql" || installationFailed
mount -o noatime,nodiratime,discard=async,space_cache=v2,subvol=/ "${ROOT_PARTITION}" "${INSTALLATION_MOUNTPOINT}/btrfs" || installationFailed
installationSubtaskTitle "Mount ESP"
mount -o nodev,nosuid,noexec "${ESP_PARTITION}" "${INSTALLATION_MOUNTPOINT}/efi" || installationFailed
echo ""
echo "┌──────────────────────────────────────────┐"
echo "│ Install and configure OS │"
echo "└──────────────────────────────────────────┘"
installationSubtaskTitle "Install base packages"
wget https://raw.githubusercontent.com/alpinelinux/alpine-make-rootfs/v0.7.0/alpine-make-rootfs
chmod u+x alpine-make-rootfs
./alpine-make-rootfs --no-cleanup --branch 'v'$(echo ${INSTALLATION_ALPINE_VERSION} | rev | cut -d. -f2- | rev) --packages "apk-tools alpine-base linux-lts linux-firmware-none zsh vim btrfs-progs dialog wget git mkinitfs lsblk parted lshw shadow" ${INSTALLATION_MOUNTPOINT}
installationSubtaskTitle "Setup resolv.conf"
if [[ -f "${INSTALLATION_MOUNTPOINT}/etc/resolv.conf" ]]; then
rm -f "${INSTALLATION_MOUNTPOINT}/etc/resolv.conf"
fi
cp /etc/resolv.conf "${INSTALLATION_MOUNTPOINT}/etc/resolv.conf" || installationFailed
installationSubtaskTitle "Setup PATH"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'" || installationFailed
installationSubtaskTitle "Mount extra mounts for chroot"
mount -t proc /proc "${INSTALLATION_MOUNTPOINT}/proc" || installationFailed
mount -t sysfs /sys "${INSTALLATION_MOUNTPOINT}/sys" || installationFailed
mount -o bind /sys/firmware/efi/efivars "${INSTALLATION_MOUNTPOINT}/sys/firmware/efi/efivars/" || __installationFailed
mount -o bind /dev "${INSTALLATION_MOUNTPOINT}/dev" || installationFailed
mount -o bind /run "${INSTALLATION_MOUNTPOINT}/run" || installationFailed
installationSubtaskTitle "Install base-packages"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "apk add alpine-base --no-cache" || installationFailed
installationSubtaskTitle "Overwrite default repositories"
cp /etc/apk/repositories "${INSTALLATION_MOUNTPOINT}/etc/apk/repositories" || installationFailed
installationSubtaskTitle "Install SaltStack"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "apk add $([[ $SALT_RUNNER == 'salt-master' ]] && echo 'salt-master salt-minion' || echo 'salt-minion' ]]) envsubst" || installationFailed
installationSubtaskTitle "Setup keymap"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "setup-keymap ch ch" || installationFailed
installationSubtaskTitle "Setting localtime to Europe/Zurich"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "setup-timezone Europe/Zurich" || installationFailed
installationSubtaskTitle "Time sync"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "hwclock --systohc" || installationFailed
installationSubtaskTitle "Setup hostname"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "echo 'nov-alp1.localhost' > /etc/hostname" || installationFailed
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "hostname -F /etc/hostname" || installationFailed
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "rc-update add hostname" || installationFailed
installationSubtaskTitle "Setup hosts"
cp /etc/hosts "${INSTALLATION_MOUNTPOINT}/etc/hosts" || installationFailed
installationSubtaskTitle "Set root password"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "echo -e \"${INSTALLATION_ROOT_PW}\n${INSTALLATION_ROOT_PW}\" | passwd" || installationFailed
installationSubtaskTitle "Enable btrfs module"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "echo 'btrfs' >> /etc/modules"
echo ""
echo "┌──────────────────────────────────────────┐"
echo "│ Configure SaltStack and highstate │"
echo "└──────────────────────────────────────────┘"
installationSubtaskTitle "Clone Salt-Repo"
mkdir -p ${INSTALLATION_MOUNTPOINT}/${INSTALLATION_SALT_ROOT}
git clone ${INSTALLATION_SALT_GIT} ${INSTALLATION_MOUNTPOINT}/${INSTALLATION_SALT_ROOT}
if [[ $SALT_RUNNER == "salt-master" ]]; then
cat >"${INSTALLATION_MOUNTPOINT}/etc/salt/master" << EOT || installationFailed
---
state_verbose: False
file_client: local
file_roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar
...
EOT
cat >"${INSTALLATION_MOUNTPOINT}/etc/salt/minion" <<EOT || installationFailed
---
state_verbose: False
file_client: local
file_roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar
...
EOT
else
if [[ $SALT_MASTER_IP != "127.0.0.1" ]]; then
cat >"${INSTALLATION_MOUNTPOINT}/etc/salt/minion" << EOT || installationFailed
---
master: $SALT_MASTER_IP
state_verbose: False
file_client: remote
...
EOT
else
cat >"${INSTALLATION_MOUNTPOINT}/etc/salt/minion" <<EOT || installationFailed
---
state_verbose: False
file_client: local
file_roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar
...
EOT
fi
fi
cat >"${INSTALLATION_MOUNTPOINT}/etc/salt/grains" <<EOT || installationFailed
os: Alpine
os_family: Alpine
EOT
installationSubtaskTitle "Clone Pillar-Repo"
mkdir -p ${INSTALLATION_MOUNTPOINT}/${INSTALLATION_PILLAR_ROOT}
git clone ${INSTALLATION_PILLAR_GIT} ${INSTALLATION_MOUNTPOINT}/${INSTALLATION_PILLAR_ROOT}
cat >"${INSTALLATION_MOUNTPOINT}/${INSTALLATION_PILLAR_ROOT}/system/init.sls" << EOT
timestamp: ${START_TIMESTAMP}
EOT
installationSubtaskTitle "Salt highstate"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "salt-call state.highstate" || installationFailed
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "salt-call state.sls system.candy" || installationFailed
echo ""
echo "┌──────────────────────────────────────────┐"
echo "│ Boot │"
echo "└──────────────────────────────────────────┘"
installationSubtaskTitle "Make EFI boot image with mkinitfs"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "mkinitfs $(uname -r)" || installationFailed
installationSubtaskTitle "Installing grub to /efi"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/ash -c "grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=noveriaos" || installationFailed
installationSubtaskTitle "Generating Bootmenu entries"
chroot "${INSTALLATION_MOUNTPOINT}" /bin/bash -c "/usr/local/noveria/bin/noveriablcgen --noconfirm" || installationFailed
echo ""
echo "┌──────────────────────────────────────────┐"
echo "│ Finishing │"
echo "└──────────────────────────────────────────┘"
#installationSubtaskTitle "Unmount"
#umount -l ${INSTALLATION_MOUNTPOINT} || installationFailed
installationSubtaskTitle "End of installation"
# end log all output to logfile
exec &>"$(tty)"
# write secrets file
writeInstallationSecretsToFile
# remove installation lock file
rm -f "$INSTALLATION_LOCK_FILE"
# remove shell histories
rm -f /root/.zsh_history
dialog --stdout --clear --cr-wrap --no-collapse --yes-label "Reboot" --no-label "Alpine shell" --yesno "\n Installation finished" 7 50
case $? in
0) reboot ;;
1)
clear
exit
;;
255)
clear
exit
;;
esac
}
##
# Write installation secrets to file
##
writeInstallationSecretsToFile() {
rm -f "$INSTALLATION_SECRETS_FILE"
{
echo "# Installation secrets from $START_TIMESTAMP"
echo ""
echo "FQDN: $(cat /mnt/etc/hostname)"
echo ""
echo "root_pw: ${INSTALLATION_ROOT_PW}"
echo ""
} >>"$INSTALLATION_SECRETS_FILE"
}
##
# Installation failed
# - $1: comment
##
installationFailed() {
# log error
echo -e "\n=> ERROR"
if [ -n "$1" ]; then
echo -e "=> Comment: $1"
fi
# end log all output to logfile
exec &>"$(tty)"
# Remove lock file
rm -f $INSTALLATION_LOCK_FILE
dialog --no-collapse --ok-label "Exit" --msgbox "\n Installation failed\n\nLog: ${INSTALLATION_LOGFILE} " 9 32
clear
exit 1
}
###
## Script Start
###
preChecks
###
## Script End
###

28
customize-airootfs.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env ash
# overwrite default-hostname
echo "noveriaos-live" > /etc/hostname
hostname -F /etc/hostname
# Enable networking on boot
rc-update add networking
# Enable hostname service
rc-update add hostname
rc-update add sshd
# Set Swiss keymap
setup-keymap ch ch
# Set Swiss Timezone
setup-timezone Europe/Zurich
hwclock --systohc
# Change default shell of root from ash => zsh
sed -i 's~root:/bin/ash~root:/bin/zsh~' /etc/passwd
sed -i 's~/sbin/getty 38400~/sbin/mingetty --autologin root --noclear~' /etc/inittab
# Add btrfs module
echo "btrfs" | tee -a /etc/modules

6
grub.cfg Executable file
View file

@ -0,0 +1,6 @@
insmod all_video
insmod part_msdos
insmod part_gpt
insmod fat
set timeout=1

17
packages.x86_64 Executable file
View file

@ -0,0 +1,17 @@
linux-lts
linux-firmware-none
salt-minion
zsh
vim
btrfs-progs
mingetty
dialog
wget
syslinux
git
mkinitfs
lsblk
parted
lshw
shadow
openssh

17
profile.yaml Executable file
View file

@ -0,0 +1,17 @@
name: noveriaos
distro: alpine
publisher: Noveria Network <https://noveria.org>
label: NOVERIAOS
codename: latest-stable
application_id: Alpine Linux Live Media
airootfs_directory: airootfs
#iso_merge: iso_merge
compression: squashfs||-comp gzip
grub_cfg: grub.cfg
packages:
- packages.x86_64
file_permissions:
- /etc/shadow|0:0:400
- /root/install.sh|0:0:755
customize_airootfs:
- customize-airootfs.sh