Files
icecast/entrypoint.sh

95 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
set -eu
CONFIG=/etc/icecast.xml
BEGIN_MARKER="<!-- BEGIN COOP-CLOUD MOUNTS -->"
END_MARKER="<!-- END COOP-CLOUD MOUNTS -->"
xml_escape() {
printf '%s' "$1" | sed \
-e 's/&/\&amp;/g' \
-e 's/</\&lt;/g' \
-e 's/>/\&gt;/g' \
-e 's/"/\&quot;/g' \
-e "s/'/\&apos;/g"
}
# Remove mounts generated by a previous run.
awk '
/<!-- BEGIN COOP-CLOUD MOUNTS -->/ { skip=1; next }
/<!-- END COOP-CLOUD MOUNTS -->/ { skip=0; next }
!skip { print }
' "$CONFIG" > /tmp/icecast.xml
cat /tmp/icecast.xml > "$CONFIG"
if [ -n "${ICECAST_MOUNTS:-}" ]; then
MOUNTS=/tmp/icecast-mounts.xml
printf '%s\n' "$BEGIN_MARKER" > "$MOUNTS"
printf '%s\n' "$ICECAST_MOUNTS" |
while IFS='|' read -r mount username password max_listeners; do
[ -z "$mount" ] && continue
case "$mount" in
\#*) continue ;;
/*) ;;
*)
echo "Invalid Icecast mount: $mount must start with /" >&2
exit 1
;;
esac
if [ -z "$username" ]; then
echo "Invalid Icecast mount $mount: username is required" >&2
exit 1
fi
if [ -z "$password" ]; then
echo "Invalid Icecast mount $mount: password is required" >&2
exit 1
fi
case "$max_listeners" in
''|*[!0-9]*)
echo "Invalid max-listeners for $mount: $max_listeners" >&2
exit 1
;;
esac
mount=$(xml_escape "$mount")
username=$(xml_escape "$username")
password=$(xml_escape "$password")
max_listeners=$(xml_escape "$max_listeners")
cat >> "$MOUNTS" <<MOUNT
<mount>
<mount-name>${mount}</mount-name>
<username>${username}</username>
<password>${password}</password>
<max-listeners>${max_listeners}</max-listeners>
<authentication>
<role type="anonymous" match-method="source,put" deny-all="*" />
</authentication>
</mount>
MOUNT
done
printf '%s\n' "$END_MARKER" >> "$MOUNTS"
awk '
/<\/icecast>/ {
while ((getline line < "/tmp/icecast-mounts.xml") > 0)
print line
close("/tmp/icecast-mounts.xml")
}
{ print }
' "$CONFIG" > /tmp/icecast.xml
cat /tmp/icecast.xml > "$CONFIG"
fi
exec /usr/local/bin/docker-entrypoint "$@"