summaryrefslogtreecommitdiffstats
path: root/setup-alpine-web.in
diff options
context:
space:
mode:
Diffstat (limited to 'setup-alpine-web.in')
-rw-r--r--setup-alpine-web.in145
1 files changed, 145 insertions, 0 deletions
diff --git a/setup-alpine-web.in b/setup-alpine-web.in
new file mode 100644
index 0000000..ca98d1f
--- /dev/null
+++ b/setup-alpine-web.in
@@ -0,0 +1,145 @@
+#!/bin/sh
+
+PROGRAM=${0##*/}
+
+BRNUM=0
+CNET="10.$BRNUM.0"
+HNAME=alpine
+DOMAIN="bootstrap.invalid"
+IFACE_LIST=/tmp/interfaces
+
+get_interfaces() {
+ [ -f "$IFACE_LIST" ] || tail -n +3 /proc/net/dev \
+ | awk -F: '$1 !~ /lo/ { print $1 }' > "$IFACE_LIST"
+ cat "$IFACE_LIST"
+}
+
+make_dhcp_subnet() {
+ local num=$1
+ local iface=$2
+ local network="$CNET.$num"
+ local netmask=255.255.255.240
+ local router="$CNET.$(( $num + 1 ))"
+ local poolstart="$CNET.$(( $num + 3 ))"
+ local poolend="$CNET.$(( $num + 14 ))"
+ echo "subnet $network netmask $netmask {"
+ echo " range $poolstart $poolend;"
+ echo " option routers $router;"
+ echo "}"
+ echo ""
+ ip addr add $router/28 dev $iface || echo "Failed to set address $router/28 on $iface" >&2
+ ip link set dev $iface up
+ iptables -t nat -A PREROUTING -i $iface -j DNAT --to-destination $router
+}
+
+make_dhcp_global() {
+ echo "option domain-name \"$DOMAIN\";"
+ echo "option domain-name-servers $CNET.1;"
+ echo "ddns-update-style none;"
+ echo ""
+}
+
+do_setup() {
+ local i
+ local count
+ hostname $HNAME
+
+ # install needed packages
+ apk_add dhcp iptables "$@"
+
+ # config dhcp server
+ make_dhcp_global > /etc/dhcp/dhcpd.conf
+ count=0
+ for i in $(get_interfaces); do
+ # maximum 16 network interfaces
+ [ $count -ge 16 ] && break
+ make_dhcp_subnet $(( $count * 16 )) $i >> /etc/dhcp/dhcpd.conf
+ count=$(( $count + 1 ))
+ done
+
+ /etc/init.d/syslog start
+ /etc/init.d/dhcpd start
+ FORCE_SETUP_WEBCONF=yes setup-webconf "$@"
+
+ # set up http listener/forwarder
+ mkdir -p /var/www/redirect
+ cat <<EOF >/var/www/redirect/index.html
+<html>
+ <head>
+ <meta HTTP-EQUIV="REFRESH" content="0; url=https://$(hostname)">
+ </head>
+ <body></body>
+</html>
+EOF
+ echo "E404:/var/www/redirect/index.html" > /etc/httpd.conf
+ echo "HTTPD_OPTS=\"-h /var/www/redirect\"" > /etc/conf.d/httpd
+
+ /etc/init.d/httpd start
+
+ # dummy dns
+ echo "* $CNET.1" > /etc/dnsd.conf
+ /etc/init.d/dnsd start
+}
+
+# reconf dhcp and kill all interfaces but $1
+do_reset() {
+ local iface=$1
+ local i
+ local oldip=$(ip addr show dev $iface | awk '/inet / { print $2 } ' | head -n 1)
+
+ # setup new dhcpd.conf
+ make_dhcp_global > /etc/dhcp/dhcpd.conf
+ cat >> /etc/dhcp/dhcpd.conf <<EOF
+subnet $CNET.0 netmask 255.255.255.0 {
+ range $CNET.3 $CNET.14;
+ option routers $CNET.1;
+}
+EOF
+
+ # shut down all interfaces
+ for i in $(get_interfaces); do
+ ip addr flush dev $i
+ [ "$i" = "$iface" ] && continue
+ ip link set dev $i down
+ done
+
+ # bring interface up again and flush iptables
+ ip addr add $oldip dev $iface
+ ip addr add $CNET.1/24 dev $iface
+ iptables -t nat -F PREROUTING
+
+ /etc/init.d/dhcpd restart
+}
+
+usage() {
+ cat <<EOF
+usage: $PROGRAM [-c X.Y.Z] [-H HOSTNAME] [-R IFACE]
+options:
+ -c Use X.Y.Z as network prefix rather than $CNET
+ -H set hostname
+ -R reset previously configured initerfaces and configure IFACE
+
+EOF
+ exit 0
+}
+
+# parse args
+while getopts "b:c:d:H:hR:" opts; do
+ case "$opts" in
+ b) BRNUM="$OPTARG";;
+ c) CNET="$OPTARG";;
+ d) DOMAIN="$OPTARG";;
+ H) HNAME="$OPTARG";;
+ h) usage;;
+ R) KEEP_IFACE="$OPTARG";;
+ esac
+done
+shift $(( $OPTIND - 1 ))
+
+if [ -z "$KEEP_IFACE" ]; then
+ do_setup "$@"
+ exit 0
+fi
+
+do_reset "$KEEP_IFACE"
+