#!/bin/sh

mount -t proc proc /proc
mount -t sysfs sysfs /sys

rm /dev/null; mknod -m 0666 /dev/null c 1 3
rm /dev/zero; mknod -m 0666 /dev/zero c 1 5

ln -sf ssmtp /usr/sbin/sendmail

mdev -s

# /proc/cmdline parser (from Gentoo Wiki)
cmdline() {
    local value
    value=" $(cat /proc/cmdline) "
    value="${value##* $1=}"
    value="${value%% *}"
    [ "$value" != "" ] && echo "$value"
}

# Get some command line options
USER_LOGIN=$(cmdline adlin.login)
USER_PKEY=$(cmdline adlin.key)
USER_IP=$(cmdline adlin.ip)
ROOT_PASSWORD=$(cmdline adlin.rootpasswd)

[ -f /etc/shadow_ ] && mv /etc/shadow_ /etc/shadow

[ -n "${USER_IP}" ] && echo "${USER_IP}" > /root/my_ip
[ -n "${ROOT_PASSWORD}" ] && sed -i "/^root:/s@!@${ROOT_PASSWORD}@" /etc/shadow

# Handle extra user from /etc/shadow
sed -r 's/^([^:]+):.*$/\1/' /etc/shadow | while read u; do
    grep -q "^$u" /etc/passwd || {
        i=$(($(wc -l /etc/passwd | cut -d ' ' -f 1) + 988))
        echo "$u:x:$i:$u" >> /etc/group
        echo "$u:x:$i:$i:new user:/home:/bin/ash" >> /etc/passwd
    }
done

# Define hostname
hostname adlin-${USER_LOGIN}

update-ca-certificates > /dev/null 2> /dev/null

# Launch some TTYs
for i in `seq 2 6`
do
    while true
    do
	/usr/bin/setsid /sbin/agetty -l /sbin/fakelogin 38400 "tty${i}" linux
    done &
done

# Hide us!
/bin/rm -f /init /linuxrc

# Randomize time at boot
/bin/date 0$((1 + $RANDOM % 9))0$((1 + $RANDOM % 9))0$((1 + $RANDOM % 9))$((0 + $RANDOM % 6))$((1 + $RANDOM % 9))$((70 + $RANDOM % 30)).$(($RANDOM % 6))$((1 + $RANDOM % 9)) > /dev/null
/sbin/sysctl -w kernel.panic_on_warn=1 > /dev/null
/sbin/sysctl -w net.ipv4.ip_default_ttl=4 > /dev/null

# Launch some daemons
#/usr/bin/setsid /usr/sbin/crond > /dev/null &
/usr/bin/setsid /bin/shadow-up > /dev/null 2> /var/log/sup.log &

# Prepare bonus 2
mkdir -p /mnt

/bin/dd if=/dev/zero of=/dev/blk count=1 bs=10240000 > /dev/null 2> /dev/null
cat <<EOF | fdisk /dev/blk > /dev/null 2> /dev/null
n
p
1

+5M
w
EOF
LOOPDEV=$(losetup -f)
losetup -P "${LOOPDEV}" /dev/blk > /dev/null 2> /dev/null
mdev -s
/sbin/mkfs.ext4 "${LOOPDEV}p1" > /dev/null 2> /dev/null
mount "${LOOPDEV}p1" /mnt > /dev/null 2> /dev/null
N1=$((29 - $RANDOM % 25))
N2=$((3 + $RANDOM % 25))
{
    printf %02d $N1
    printf %02d $N2
    echo -n ${USER_PKEY:$N1:$N2} | sha512sum | cut -d " " -f 1

} > /mnt/bonus2
sync
rm /mnt/bonus2
sync
umount /mnt


# Launch requested init
if grep init= /proc/cmdline > /dev/null 2> /dev/null
then
    INIT=$(cmdline init)
    [ -z "${INIT}" ]

    while true
    do
	sleep $((10 + $RANDOM % 49))
	beep -f 1000 -r 2 -n -r 5 -l 10 -n
    done &

    grep console=ttyS0 /proc/cmdline > /dev/null 2> /dev/null && /usr/bin/setsid sh -c "exec '${INIT}' </dev/ttyS0 >/dev/ttyS0 2>&1"
    exec /usr/bin/setsid sh -c "reset; exec '${INIT}' </dev/tty1 >/dev/tty1 2>&1"
else
    grep console=ttyS0 /proc/cmdline > /dev/null 2> /dev/null && /usr/bin/setsid /sbin/agetty -l /sbin/fakelogin 38400 "ttyS0" linux
    while true
    do
	/usr/bin/setsid /sbin/agetty -l /sbin/fakelogin 38400 tty1 linux
    done
fi
