#!/bin/sh

set -e

export PATH=/bin
RANDOM_SEED_FILE=/var/random-seed
umask 077

machine_halt() {
    dd count=1 bs=512 if=/dev/urandom of="$RANDOM_SEED_FILE" > /dev/null 2>& 1 || true
    sync
    kill -s 15 -1 || true
    sleep 4
    kill -s 9 -1 || true
    [ -x /bin/findmnt ] && for line in $(findmnt -o SOURCE | grep /dev/loop); do umount $line ; done || true
    [ -x /bin/losetup ] && losetup -D || true
    [ -x /etc/stop_services.sh ] && /etc/stop_services.sh || true
    sync
    mount -a -o remount,ro || true
    mount / -o remount,ro || true # busybox cannot remount fstab rw/ro on -a (all) mounts, so force at least / if only busybox system
}
machine_poweroff() {
    machine_halt
    kpow p
}
machine_reboot() {
    machine_halt
    kpow r
}

mount -t proc -o nosuid,noexec,nodev proc /proc
mount -t sysfs -o nosuid,noexec,nodev sys /sys
[ -c /dev/null ] || mount -t devtmpfs -o nosuid,mode=0755 dev /dev
[ -d /sys/fs/cgroup/ ] && mount -t cgroup2 none /sys/fs/cgroup/ || true

{ # Link /dev/std{in,out,err}
    ln -s /proc/self/fd /dev/fd
    ln -s fd/0          /dev/stdin
    ln -s fd/1          /dev/stdout
    ln -s fd/2          /dev/stderr
} 2>/dev/null || true
mkdir -p /dev/pts /dev/shm /dev/mqueue # busybox mount -a cannot use X-mount.mkdir, create manually
mount -a -o remount
echo 0 > /proc/sys/kernel/printk
[ -x /etc/init/root_mounted.sh ] && /etc/init/root_mounted.sh || true
mount -a -O no_netdev || ( echo "Warning: Some mount point(s) failed to mount, sleeping for 6 sec" ; sleep 6 )

trap machine_reboot 12
trap machine_poweroff 10

if [ -x /bin/iptables ]; then
    [ -x /etc/iptables.sh ] && /etc/iptables.sh || true
fi
[ -x /bin/sysctl ] && sysctl -q -e -p /etc/sysctl.conf || true
[ -f "$RANDOM_SEED_FILE" ] && cat "$RANDOM_SEED_FILE" >> /dev/random || true
cat /etc/hostname > /proc/sys/kernel/hostname
[ -d /sys/class/net/lo ] && ip link set up dev lo || true

setsid /etc/init/services.sh &

LINE=$(grep -q 'console=tty' /proc/cmdline && echo '/dev/console' || echo 'tty1')
if [[ $LINE == 'tty1' ]]; then
    for vt in 2; do
        openvt -c $vt -- sh -c "while true; do clear ; busybox getty 0 tty$vt; done"
    done
fi

while true; do
    clear
    $(busybox getty 0 $LINE || true) &
    wait $!
done
