subiquity/bin/console-conf-wrapper

110 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
set -e
trap true HUP INT QUIT TSTP
echo_on () { stty echo; }
trap echo_on EXIT
# agetty only sets ICRNL if it has read the username and seen whether
# it was terminated by CR or NL. We pass -n to agetty so that hasn't
# happened and need to force it on. Yay UNIX!
stty icrnl -echo
if [ -e /run/snapd-recovery-chooser-triggered ]; then
# make sure the chooser binary is there to avoid getting into an awkward
# state and locking out the user
if [ -x /usr/lib/snapd/snap-recovery-chooser ]; then
# when recovery chooser is invoked it takes over the terminal
exec /usr/lib/snapd/snap-recovery-chooser
fi
if [ -e /var/lib/console-conf/complete ]; then
exit 0
fi
fi
# always prefer to use modeevn if it is available
if [ -e "/var/lib/snapd/modeenv" ]; then
mode="$(sed -n 's/mode=\([^[:space:]]*\)/\1/p' /var/lib/snapd/modeenv)"
else
mode="$(sed 's/.*snapd_recovery_mode=\([^[:space:]]*\)[[:space:]].*/\1/' /proc/cmdline)"
fi
if [ "${mode}" = "install" ]; then
echo "Installing the system, please wait for reboot"
# XXX: replace with something more user friendly after the beta?
journalctl -u snapd.service -f
sleep infinity
fi
if [ "$(snap managed)" = "true" ]; then
# check if we have extrausers that have no password set
if grep -qE '^[-a-z0-9+.-_]+:x:' /var/lib/extrausers/passwd && ! grep -qE '^[-a-z0-9+.-_]+:\$[0-9]+\$.*:' /var/lib/extrausers/shadow; then
tty=$(tty)
tty=$(echo ${tty#/dev/} | tr '/' '-')
readargs=()
filepath="/run/console-conf/login-details-${tty}.txt"
if [ ! -f ${filepath} ]; then
mkdir -p /run/console-conf
set +e
/usr/share/subiquity/console-conf-write-login-details > ${filepath}.tmp
rval=$?
set -e
# A exit code of 2 from console-conf-write-login-details
# means there are no scope global IP addresses. It will
# have printed a message saying that you can't log in
# until the device gets an IP address so we display that
# but check every 5 seconds if an ip address has appeared.
if [ $rval -eq 0 ]; then
mv ${filepath}.tmp ${filepath}
elif [ $rval -eq 2 ]; then
mv ${filepath}.tmp ${filepath}.noip
filepath=${filepath}.noip
readargs=(-t 5)
else
exit $rval
fi
fi
cat $filepath
set +e
while :; do
read "${readargs[@]}" REPLY
if [ $? -le 128 ]; then
# If we didn't time out, re-display everything.
exit 0
fi
if ip addr show | grep -qE "scope global"; then
# If we timed out, but it appears that we may now have
# an IP address, re-display everything.
exit 0
fi
done
else
touch /var/lib/console-conf/complete
fi
exit 0
fi
# if there is NOT console-conf snap, exit gracefully
if [ ! -e "/snap/console-conf" ]; then
touch /var/lib/console-conf/complete
exit 0
fi
snap run console-conf.wait
read REPLY
# start the console-conf routine in snapd to delay any new refreshes, and wait
# for current refreshes to complete, this will print off messages if there are
# on-going refreshes
if snap routine console-conf-start --help >/dev/null 2>/dev/null; then
snap routine console-conf-start
fi
# preapre host finger prints for console-conf as it cannot access sshd or host keys
mkdir -p /run/console-conf
/usr/share/subiquity/console-conf-write-login-details --host-fingerprints > /run/console-conf/host-fingerprints.txt
snap run console-conf "$@"
rval=$?
if [ ! ${rval} -eq 0 ]; then
echo "console-conf exited with: ${rval}"
exit ${rval}
fi