111 lines
3.1 KiB
Bash
111 lines
3.1 KiB
Bash
#!/bin/sh
|
|
|
|
# SPDX-FileCopyrightText: Copyright 2022-2023, macmpi
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
## collection of few code snippets as sample unnatteded actions some may find usefull
|
|
|
|
## will run encapusated within headless_unattended OpenRC service
|
|
|
|
# To prevent headless bootstrap script from starting sshd
|
|
# only keep a single starting # on the line below
|
|
##NO_SSH
|
|
|
|
# Uncomment to enable stdout and errors redirection to console (service won't show messages)
|
|
# exec 1>/dev/console 2>&1
|
|
|
|
# shellcheck disable=SC2142 # known special case
|
|
alias _logger='logger -st "${0##*/}"'
|
|
|
|
## Obvious one; reminder: is run as background service
|
|
_logger "hello world !!"
|
|
sleep 60
|
|
_logger "Finished script"
|
|
########################################################
|
|
|
|
|
|
## This snippet removes apkovl file on volume after initial boot
|
|
# grab used ovl filename from dmesg
|
|
ovl="$( dmesg | grep -o 'Loading user settings from .*:' | awk '{print $5}' | sed 's/:.*$//' )"
|
|
if [ -f "${ovl}" ]; then
|
|
ovlpath="$( dirname "$ovl" )"
|
|
else
|
|
# search path again as mountpoint have been changed later in the boot process...
|
|
ovl="$( basename "${ovl}" )"
|
|
ovlpath=$( find /media -maxdepth 2 -type d -path '*/.*' -prune -o -type f -name "${ovl}" -exec dirname {} \; | head -1 )
|
|
ovl="${ovlpath}/${ovl}"
|
|
fi
|
|
|
|
# also works in case volume is mounted read-only
|
|
grep -q "${ovlpath}.*[[:space:]]ro[[:space:],]" /proc/mounts; is_ro=$?
|
|
_is_ro() { return "$is_ro"; }
|
|
_is_ro && mount -o remount,rw "${ovlpath}"
|
|
rm -f "${ovl}"
|
|
_is_ro && mount -o remount,ro "${ovlpath}"
|
|
|
|
########################################################
|
|
|
|
|
|
## This snippet configures Minimal diskless environment
|
|
# note: with INTERFACESOPTS=none, no networking will be setup so it won't work after reboot!
|
|
# Change it or run setup-interfaces in interractive mode afterwards (and lbu commit -d thenafter)
|
|
|
|
_logger "Setting-up minimal environment"
|
|
|
|
cat <<-EOF > /tmp/ANSWERFILE
|
|
# base answer file for setup-alpine script
|
|
|
|
# Do not set keyboard layout
|
|
KEYMAPOPTS=none
|
|
|
|
# Keep hostname
|
|
HOSTNAMEOPTS="$(hostname)"
|
|
|
|
# Set device manager to mdev
|
|
DEVDOPTS=mdev
|
|
|
|
# Contents of /etc/network/interfaces
|
|
INTERFACESOPTS=none
|
|
|
|
# Set Public nameserver
|
|
DNSOPTS="-n 208.67.222.222"
|
|
|
|
# Set timezone to UTC
|
|
TIMEZONEOPTS="UTC"
|
|
|
|
# set http/ftp proxy
|
|
PROXYOPTS=none
|
|
|
|
# Add first mirror (CDN)
|
|
APKREPOSOPTS="-1"
|
|
|
|
# Do not create any user
|
|
USEROPTS=none
|
|
|
|
# No Openssh
|
|
SSHDOPTS=none
|
|
|
|
# Use openntpd
|
|
NTPOPTS="chrony"
|
|
|
|
# No disk install (diskless)
|
|
DISKOPTS=none
|
|
|
|
# Setup storage for diskless (find boot directory in /media/xxxx/apk/.boot_repository)
|
|
LBUOPTS="$( find /media -maxdepth 3 -type d -path '*/.*' -prune -o -type f -name '.boot_repository' -exec dirname {} \; | head -1 | xargs dirname )"
|
|
APKCACHEOPTS="\$LBUOPTS/cache"
|
|
|
|
EOF
|
|
|
|
# trick setup-alpine to pretend existing SSH connection
|
|
# and therefore keep (do not reset) network interfaces while running in background
|
|
# requires alpine-conf 3.15.1 and later, available from Alpine 3.17
|
|
SSH_CONNECTION="FAKE" setup-alpine -ef /tmp/ANSWERFILE
|
|
lbu commit -d
|
|
|
|
########################################################
|
|
|
|
|
|
_logger "Finished unattended script"
|
|
|