Skip to content

Instantly share code, notes, and snippets.

@TheLie0
Last active March 26, 2023 08:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TheLie0/f1e8f441622c750672381422bf6edb88 to your computer and use it in GitHub Desktop.
Save TheLie0/f1e8f441622c750672381422bf6edb88 to your computer and use it in GitHub Desktop.
#!/bin/sh -e
if [ 0 -ne `id -u` ]; then
echo "This script needs root access" >&2
exit 1
fi
modprobe snd-aloop
aplay -l
echo "================================================================================================="
echo "Please specify the alsa device that should be read from."
echo "If you don't know which one you want, you should write:"
echo "\"hw:[number behind the word 'card' before 'Loopback' from the list above],0,0\""
echo "e.g.: \"hw:2,0,0\""
read -p "Device: " device
echo $device
root_dir="radio_root"
image_name="alpine-minirootfs-3.11.5-x86_64"
if [ ! -f "$image_name.tar.gz" ]
then
wget "http://dl-cdn.alpinelinux.org/alpine/v3.11/releases/x86_64/$image_name.tar.gz"
fi
if [ ! -d "$root_dir" ]
then
mkdir "$root_dir"
tar -xf "$image_name.tar.gz" -C "$root_dir"
fi
rm -f "$root_dir/root/inside.sh"
touch "$root_dir/root/inside.sh"
echo "adduser vlc -D -H" >> "$root_dir/root/inside.sh"
echo "apk add vlc" >> "$root_dir/root/inside.sh"
echo "apk add tor" >> "$root_dir/root/inside.sh"
echo "apk add sudo" >> "$root_dir/root/inside.sh"
echo "cd root/" >> "$root_dir/root/inside.sh"
echo "sudo -u vlc cvlc alsa://$device --sout '#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=44100}:standard{access=http{mime=audio/mpeg},mux=mp3,dst=127.0.0.1:6758}' --sout-keep &" >> "$root_dir/root/inside.sh"
echo "if [ ! -f torrc ]" >> "$root_dir/root/inside.sh"
echo "then" >> "$root_dir/root/inside.sh"
echo "touch torrc" >> "$root_dir/root/inside.sh"
echo "echo 'GeoIPFile /usr/share/tor/geoip' >> torrc" >> "$root_dir/root/inside.sh"
echo "echo 'GeoIPv6File /usr/share/tor/geoip6' >> torrc" >> "$root_dir/root/inside.sh"
echo "echo 'HiddenServiceDir /root/data/' >> torrc" >> "$root_dir/root/inside.sh"
echo "echo 'HiddenServicePort 80 127.0.0.1:6758' >> torrc" >> "$root_dir/root/inside.sh"
echo "fi" >> "$root_dir/root/inside.sh"
echo "tor -f torrc &" >> "$root_dir/root/inside.sh"
echo "sleep 20" >> "$root_dir/root/inside.sh"
echo "echo 'hosting:'" >> "$root_dir/root/inside.sh"
echo "cat data/hostname" >> "$root_dir/root/inside.sh"
chmod +x "$root_dir/root/inside.sh"
if ! [ -d "$root_dir" ] || [ x-h = x"$*" ] || [ x--help = x"$*" ]; then
echo "Usage: ${0##*/} <chroot_directory>" >&2
exit 1
fi
if [ x1 = x`sysctl -ne kernel.grsecurity.chroot_deny_chmod` ]; then
echo "Warning: can't suid/sgid inside chroot" >&2
fi
if [ x1 = x`sysctl -ne kernel.grsecurity.chroot_deny_mknod` ]; then
echo "Warning: can't mknod inside chroot" >&2
fi
if [ x1 = x`sysctl -ne kernel.grsecurity.chroot_deny_mount` ]; then
echo "Warning: can't mount inside chroot" >&2
fi
if [ x1 = x`sysctl -ne kernel.grsecurity.chroot_deny_chroot` ]; then
echo "Warning: can't chroot inside chroot" >&2
fi
cd "$root_dir"
if ! [ -d ./etc ]; then
echo "No etc directory inside $root_dir" >&2
exit 1
fi
MOUNTED=
umount_all() {
case $MOUNTED in
shm\ *) if [ -L ./dev/shm ]; then
umount ./`readlink ./dev/shm`
else
umount ./dev/shm
fi
MOUNTED=${MOUNTED#shm };;
esac
case $MOUNTED in
run\ *) umount ./run
MOUNTED=${MOUNTED#run };;
esac
case $MOUNTED in
tmp\ *) umount ./tmp
MOUNTED=${MOUNTED#tmp };;
esac
case $MOUNTED in
proc\ *) umount ./proc
MOUNTED=${MOUNTED#proc };;
esac
case $MOUNTED in
sys\ *) umount ./sys
MOUNTED=${MOUNTED#sys };;
esac
case $MOUNTED in
pts\ *) umount ./dev/pts
MOUNTED=${MOUNTED#pts };;
esac
case $MOUNTED in
dev\ *) umount ./dev
MOUNTED=${MOUNTED#dev };;
esac
}
trap 'umount_all' EXIT
mkdir -p ./etc ./dev/pts ./sys ./proc ./tmp ./run ./boot ./root
cp -iL /etc/resolv.conf ./etc/ || true # if ^C, will cancel script
mount --bind /dev ./dev
MOUNTED="dev $MOUNTED"
mount -t devpts devpts ./dev/pts -o nosuid,noexec
MOUNTED="pts $MOUNTED"
mount -t sysfs sys ./sys -o nosuid,nodev,noexec,ro
MOUNTED="sys $MOUNTED"
mount -t proc proc ./proc -o nosuid,nodev,noexec
MOUNTED="proc $MOUNTED"
mount -t tmpfs tmp ./tmp -o mode=1777,nosuid,nodev,strictatime
MOUNTED="tmp $MOUNTED"
mount -t tmpfs run ./run -o mode=0755,nosuid,nodev
MOUNTED="run $MOUNTED"
if [ -L ./dev/shm ]; then
mkdir -p ./`readlink ./dev/shm`
mount -t tmpfs shm ./`readlink ./dev/shm` -o mode=1777,nosuid,nodev
else
#mkdir -p ./dev/shm
mount -t tmpfs shm ./dev/shm -o mode=1777,nosuid,nodev
fi
MOUNTED="shm $MOUNTED"
case $1 in
-l) shift;;
-l*) one=${1#-l}; shift; set -- -"$one" "$@";;
esac
chroot . /usr/bin/env -i SHELL=/bin/sh HOME=/root TERM="$TERM" DISPLAY=:0 \
PATH=/usr/sbin:/usr/bin:/sbin:/bin PS1='chroot # ' /bin/sh /root/inside.sh -l "$@" #/root/inside.sh -l "$@"
# FIXME
# are USER and LOGNAME set automatically?
# perhaps: source /etc/profile && export PS1="chroot $PS1"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment