Last active
March 26, 2023 08:34
-
-
Save TheLie0/f1e8f441622c750672381422bf6edb88 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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