All pastes #259418 Raw Edit

Unnamed

public text v1 · immutable
#259418 ·published 2006-11-27 13:43 UTC
rendered paste body
#!/bin/sh

filtermodules="vlan-exec.sh vlan-func.sh vlan-parm.sh vlan-par2.sh vlan-par3.sh"

for module in $filtermodules ; do
    if [ -f /etc/rc.d/vlan/${module} ]; then
        . /etc/rc.d/vlan/${module}
    elif [ -f ${module} ]; then
	. ${module}
    else
	echo "${module} module not found."
        exit 99
    fi
done

for index in 0 1 2 3 ; do
    if [ -n "${IF_INTERNAL[$index]}" ]; then
	INTERNALDEVICE="${IF_INTERNAL[$index]}"
    fi
done
if [ -z "$INTERNALDEVICE" ]; then
    echo "No internal network device defined."
    exit 99
fi

for index in 0 1 2 3 ; do
    if [ -n "${IF_EXTERNAL[$index]}" ]; then
	EXTERNALDEVICE="${IF_EXTERNAL[$index]}"
    fi
done
if [ -z "$EXTERNALDEVICE" ]; then
    echo "No external network device defined."
    #exit 99
fi

if [ ! -f $INTERNAL_FILE ]; then
    echo "List file $INTERNAL_FILE not found."
    exit 98
fi

if [ ! -f $EXTERNAL_FILE ]; then
    echo "List file $EXTERNAL_FILE not found."
    #exit 98
fi

# Configured VLANs control
CVLANLISTFILE="/etc/rc.d/vlan/vlantab"
CVLANLIST="$(< $CVLANLISTFILE )"

# Created virtual interfaces control
VHOSTLISTFILE="/etc/rc.d/vlan/virtualhoststab"
#VHOSTLIST="$(< $VHOSTLISTFILE )"
VHOSTLIST="$( $SORT -r $VHOSTLISTFILE )"

VLANLIST="$( $CAT $INTERNAL_FILE | $SED -e 's/^#.*$//' | \
    $GREP -v -E "^$" | $SED -r "s/ +/|/g" )"

PUBLICIPLIST="$( $CAT $EXTERNAL_FILE | $SED -e 's/^#.*$//' | \
    $GREP -v -E "^$" | $SED -r "s/ +/|/g" )"

IF_VLANLIST=""

DHCPD_PID="/var/run/dhcpd.pid"
DHCPD_CONF="/etc/dhcpd.conf"
DHCPD_VLAN="/etc/dhcpd-vlan.conf"

publicdeviceindex=0


dhcpvlanconf () {
    local CLIENT_ID=$1
    local SUBNET=$2
    local NETMASK=$3
    local GATEWAY=$4
    local BROADCAST=$5
    local CLIENT_IP=$6
    local MASK
    case $NETMASK in
	'32')	MASK="255.255.255.255" ;;
	'31')	MASK="255.255.255.254" ;;
	'30')	MASK="255.255.255.252" ;;
	'29')	MASK="255.255.255.248" ;;
	'28')	MASK="255.255.255.240" ;;
	'27')	MASK="255.255.255.224" ;;
	'26')	MASK="255.255.255.192" ;;
	'25')	MASK="255.255.255.128" ;;
	'24')	MASK="255.255.255.0" ;;
	'23')	MASK="255.255.254.0" ;;
	'22')	MASK="255.255.252.0" ;;
	'21')	MASK="255.255.248.0" ;;
	'20')	MASK="255.255.240.0" ;;
	'19')	MASK="255.255.224.0" ;;
	'18')	MASK="255.255.192.0" ;;
	'17')	MASK="255.255.128.0" ;;
	'16')	MASK="255.255.0.0" ;;
	*)	MASK="0.0.0.0" ;;
    esac
    local LAST_IP=$( echo $BROADCAST | \
	$CUT -f1-3 -d. ).$(( $( echo $BROADCAST | $CUT -f4 -d. ) - 1 ))
    echo >> $DHCPD_VLAN
    echo "# VLAN $CLIENT_ID" >> $DHCPD_VLAN
    echo "subnet $SUBNET netmask $MASK {" >> $DHCPD_VLAN
    echo "    option routers                      ${GATEWAY};" >> $DHCPD_VLAN
    echo "    option subnet-mask                  ${MASK};" >> $DHCPD_VLAN
    echo "    option broadcast-address            ${BROADCAST};" >> $DHCPD_VLAN
    echo "    option domain-name-servers          ${GATEWAY};" >> $DHCPD_VLAN
    echo "    # option netbios-name-servers       ${GATEWAY};" >> $DHCPD_VLAN
    echo "    # option time-offset                -3;" >> $DHCPD_VLAN
    echo "    default-lease-time                  43200;" >> $DHCPD_VLAN
    echo "    max-lease-time                      86400;" >> $DHCPD_VLAN
    echo "    range dynamic-bootp                 $CLIENT_IP $LAST_IP;" >> $DHCPD_VLAN
    echo "}" >> $DHCPD_VLAN
}

startvlans () {
    if [ -z "$( $LSMOD | $GREP 8021q | $AWK {'print $1'} )" ]; then
	$MODPROBE 8021q
	echo -n > $CVLANLISTFILE
    elif [ -s $CVLANLISTFILE ]; then
	echo "$0 already started."
	echo
	exit
    fi
    $CAT $DHCPD_CONF > $DHCPD_VLAN

    echo "Configuring VLANs: "
    
    $VCONFIG set_name_type VLAN_PLUS_VID_NO_PAD > /dev/null

    for line in $VLANLIST ; do
	IF_VLANLIST="$IF_VLANLIST vlan$( echo $line | \
	{ IFS='|' read f1 f2 f3 f4 f5 f6 f7 f8; echo $f1; } )"
	echo $line | {
	    IFS='|' read CLIENT_ID NETWORK GATEWAY BROADCAST CLIENT_IP \
	    RATE CEIL INTERFACE
	    $VCONFIG add $IF_VLANDEVICE $CLIENT_ID
	    echo $NETWORK | {
		IFS='/' read SUBNET NETMASK
		$IP addr add ${GATEWAY}/${NETMASK} broadcast $BROADCAST \
		dev vlan${CLIENT_ID}
        	$IP link set dev vlan${CLIENT_ID} mtu 1500 up
		echo $line >> $CVLANLISTFILE
		dhcpvlanconf $CLIENT_ID $SUBNET \
		    $NETMASK $GATEWAY $BROADCAST $CLIENT_IP
		printf "    %s %-4s: %-19sbroadcast: %s\n" \
		VLAN $CLIENT_ID ${GATEWAY}/${NETMASK} $BROADCAST
	    }
	}
    done

    DHCPD_PID="$( $PS ax | $GREP "$DHCPD" | \
	$GREP -v "$GREP" | $AWK {'print $1'} )"
    if [ -n "$DHCPD_PID" ]; then
	$KILL $DHCPD_PID
	$SLEEP 1
    fi
    if [ "$DHCP_SERVER" = "TRUE" -a -n "$IF_DHCP" -a "$VLAN_DHCP" = "TRUE" ]; then
	$DHCPD -cf $DHCPD_VLAN -q $IF_DHCP $IF_VLANLIST
    elif [ "$VLAN_DHCP" = "TRUE" ]; then 
	$DHCPD -cf $DHCPD_VLAN -q $IF_VLANLIST
    fi
    echo
}

deletevlans () {
    if [ -z "$( $LSMOD | $GREP 8021q | $AWK {'print $1'} )" ]; then
        echo "VLAN module not loaded."
        exit
    fi
    echo "Deleting VLANs: "
    $VCONFIG set_name_type VLAN_PLUS_VID_NO_PAD > /dev/null

    DHCPD_PID="$( $PS ax | $GREP "$DHCPD" | \
	$GREP -v "$GREP" | $AWK {'print $1'} )"
    if [ -n "$DHCPD_PID" ]; then
        $KILL $DHCPD_PID
        $SLEEP 1
	if [ "$DHCP_SERVER" = "TRUE" -a -n "$IF_DHCP" ]; then
	    $DHCPD -cf $DHCPD_CONF -q $IF_DHCP
	fi
    fi

    for line in $CVLANLIST ; do
	echo $line | {
	    IFS='|' read CLIENT_ID NETWORK GATEWAY BROADCAST CLIENT_IP \
	    RATE CEIL INTERFACE
	    $IP addr show dev vlan${CLIENT_ID}
	    $IP link set dev vlan${CLIENT_ID} down
	    $VCONFIG rem vlan${CLIENT_ID}
	}
    done
    $SLEEP 1
    $RMMOD 8021q
    echo -n > $CVLANLISTFILE
    echo
}

startpublicvirtualhosts () {
    if [ ! -f $EXTERNAL_FILE ]; then
	exit 98
    elif [ -s $VHOSTLISTFILE ]; then
	echo "Public virtual hosts already configured."
	echo
	exit
    fi
    echo -n > $VHOSTLISTFILE
    echo "Configuring public virtual hosts: "
    for line in $PUBLICIPLIST ; do
	echo $line | {
	    IFS='|' read PUBLIC_IP GATEWAY BROADCAST INTERFACE REDIRECT_TO
	    $IP addr add $PUBLIC_IP broadcast $BROADCAST \
	    	label ${INTERFACE}:${publicdeviceindex} \
	    	scope global dev $INTERFACE 
	    printf "    %s:%-4s= %-19sbroadcast: %s\n" \
		$INTERFACE $publicdeviceindex $PUBLIC_IP $BROADCAST
	}
	echo $line >> $VHOSTLISTFILE
	publicdeviceindex=$((++publicdeviceindex))
    done
    echo
}

deletepublicvirtualhosts () {
    if [ ! -f $EXTERNAL_FILE ]; then
	exit 98
    elif [ ! -s $VHOSTLISTFILE ]; then
	echo "No public virtual host configured."
	echo
    else
        echo "Deleting public virtual hosts: "
        for line in $VHOSTLIST ; do
	    echo $line | {
	        IFS='|' read PUBLIC_IP GATEWAY BROADCAST INTERFACE REDIRECT_TO
	        LABEL="$( $IP addr show dev $INTERFACE | $GREP "$PUBLIC_IP" | \
    		    $SED -r "s/^ +inet //" | \
		    $SED -r "s/ secondary / /" | $CUT -d" " -f6 )"
	        if [ -n "$LABEL" ]; then
		    $IP addr show dev $INTERFACE label $LABEL
		    $IP addr del $PUBLIC_IP label $LABEL dev $INTERFACE
	        fi
	    }
        done
        echo
        echo -n > $VHOSTLISTFILE
    fi
}

initnamedfiles () {
    # chowned by daemon.daemon / chmoded to 600
    #CONFFILE="/etc/named-dynamic.txt"
    # chowned by daemon.daemon / chmoded to 644
    #ZONEFILE="${DYNAMICDOMAINDIR}/${DOMAINNAME}.txt"
    # chowned by daemon.daemon / chmoded to 644
    ARPAFILE=""
    if [ -f $CONFFILE ]; then
	$RM -f $CONFFILE
    fi
    if [ -f $ZONEFILE ]; then
	$RM -f $ZONEFILE
    fi
    printf "// Dynamic arpa zones\n\n" >> $CONFFILE
    $CHOWN daemon.daemon $CONFFILE
    $CHMOD 600 $CONFFILE
    printf "; dynamic extensions to $DOMAINNAME zone\n\n" >> $ZONEFILE
    $CHOWN daemon.daemon $ZONEFILE
    $CHMOD 644 $ZONEFILE
    local COUNT1=16
    while [ $((COUNT1)) -le 29 ]; do
	local COUNT2=0
	while [ $((COUNT2)) -le 255 ]; do
	    if [ -f ${DYNAMICDOMAINDIR}/172.${COUNT1}.${COUNT2} ]; then
		$RM -f ${DYNAMICDOMAINDIR}/172.${COUNT1}.${COUNT2}
	    fi
	    COUNT2=$((++COUNT2))
	done
	COUNT1=$((++COUNT1))
    done
}

dynamicnamed () {
    initnamedfiles
    for line in $VLANLIST ; do
	echo $line | {
	    IFS='|' read CLIENT_ID NETWORK GATEWAY BROADCAST CLIENT_IP \
	    RATE CEIL INTERFACE
	    VLANID=$CLIENT_ID
	    MASK=$( echo $NETWORK | { IFS='/' read f1 f2; echo $f2; } )
	    N2=$( echo $GATEWAY | { IFS='.' read f1 f2 f3 f4; echo $f2; } )
	    N3=$( echo $GATEWAY | { IFS='.' read f1 f2 f3 f4; echo $f3; } )
	    N4=$( echo $GATEWAY | { IFS='.' read f1 f2 f3 f4; echo $f4; } )
	    N3MAX=$( echo $BROADCAST | { IFS='.' read f1 f2 f3 f4; echo $f3; } )
	    N4MAX=$(( $( echo $BROADCAST | \
		{ IFS='.' read f1 f2 f3 f4; echo $f4; } ) - 1 ))
	    if [ $(( MASK )) -ge 24 ]; then
		ARPAFILE="${DYNAMICDOMAINDIR}/172.${N2}.${N3}"
	    else
		ARPAFILE="${DYNAMICDOMAINDIR}/172.${N2}"
	    fi
	    if [ ! -f $ARPAFILE ]; then
		if [ $(( MASK )) -ge 24 ]; then
		    printf "\$ORIGIN ${N3}.${N2}.172.in-addr.arpa.\n\n" \
		    >> $ARPAFILE
		else
		    printf "\$ORIGIN ${N2}.172.in-addr.arpa.\n\n" \
		    >> $ARPAFILE
		fi
		printf "\$TTL    86400\n\n" >> $ARPAFILE
		printf "@       IN     SOA     %s %s (\n" \
		    "ns.${DOMAINNAME}." "root.${DOMAINNAME}.local." \
		    >> $ARPAFILE
		printf "%33s ; Serial\n" $( $DATE +%G%m%d%H ) >> $ARPAFILE
		printf "%23s28800      ; Refresh\n" >> $ARPAFILE
		printf "%23s14400      ; Retry\n" >> $ARPAFILE
		printf "%23s3600000    ; Expire\n" >> $ARPAFILE
		printf "%23s86400 )    ; Minimum\n\n" >> $ARPAFILE
		printf "%8sIN%5sNS%6sns.${DOMAINNAME}.\n\n" \
		    >> $ARPAFILE
		$CHOWN daemon.daemon $ARPAFILE
		$CHMOD 644 $ARPAFILE
		# named.conf extension file
		if [ $(( MASK )) -ge 24 ]; then
		    printf "zone \"${N3}.${N2}.172.in-addr.arpa\" IN {\n" \
		    >> $CONFFILE
		else
		    printf "zone \"${N2}.172.in-addr.arpa\" IN {\n" \
		    >> $CONFFILE
		fi
		printf "%4stype master;\n" >> $CONFFILE
		printf "%4snotify no;\n" >> $CONFFILE
		if [ $(( MASK )) -ge 24 ]; then
		    printf "%4sfile \"${DOMAINSUBDIR}/${DYNAMICDOMAINSUBDIR}/172.${N2}.${N3}\";\n" \
		    >> $CONFFILE
		    printf "%4sallow-query { 172.${N2}.${N3}.0/24; 127.0.0.1; };\n" \
		    >> $CONFFILE
		else
		    printf "%4sfile \"${DOMAINSUBDIR}/${DYNAMICDOMAINSUBDIR}/172.${N2}\";\n" \
		    >> $CONFFILE
		    printf "%4sallow-query { 172.${N2}.${N3}.0/${MASK}; 127.0.0.1; };\n" \
		    >> $CONFFILE
		fi
		printf "};\n\n" >> $CONFFILE
	    fi
	    printf "%-8sIN     PTR     %s\n" \
		$N4 gateway${VLANID}.${DOMAINNAME}. >> $ARPAFILE
	    printf "%-24s1D IN A         %s\n" \
		gateway${VLANID} "172.${N2}.${N3}.${N4}" >> $ZONEFILE
	    N4=$((++N4))
	    printf "%-8sIN     PTR     %s\n" \
		$N4 cliente${VLANID}.${DOMAINNAME}. >> $ARPAFILE
	    printf "%-24s1D IN A         %s\n" \
		cliente${VLANID} "172.${N2}.${N3}.${N4}" >> $ZONEFILE
	    N4=$((++N4))
	    INDEX=2	    
	    while [ $(( N3 )) -le $(( N3MAX )) ]; do
		if [ $(( N3 )) -eq $(( N3MAX )) ]; then
		    MAXCOUNT=$(( N4MAX ))
		else
		    MAXCOUNT=255
		fi
		while [ $(( N4 )) -le $(( MAXCOUNT )) ]; do
		    NAME="cliente${VLANID}-${INDEX}"
		    printf "%-8sIN     PTR     %s\n" \
			$N4 ${NAME}.${DOMAINNAME}. >> $ARPAFILE
		    printf "%-24s1D IN A         %s\n" \
			$NAME "172.${N2}.${N3}.${N4}" >> $ZONEFILE
		    INDEX=$((++INDEX))
		    N4=$((++N4))
		done
		N4=0
		N3=$((++N3))
	    done
	    echo >> $ARPAFILE
	    echo >> $ZONEFILE
	}
    done
    $RNDC reload
}

resetdynamicnamed () {
    initnamedfiles
    $RNDC reload
}

vhoststatus() {
    if [ ! -s $VHOSTLISTFILE ]; then
	echo "No public virtual hosts configured."
    else
	echo "Configured public virtual hosts:"
	for line in $VHOSTLIST ; do
	    echo $line | {
	    IFS='|' read PUBLIC_IP GATEWAY BROADCAST INTERFACE REDIRECT_TO
	    LABEL="$( $IP addr show dev $INTERFACE | $GREP "$PUBLIC_IP" | \
    		$SED -r "s/^ +inet //" | \
		$SED -r "s/ secondary / /" | $CUT -d" " -f6 )"
	    if [ -n "$LABEL" ]; then
		$IP addr show dev $INTERFACE label $LABEL
		if [ -n "$REDIRECT_TO" ]; then
		    echo "        Redirected to $REDIRECT_TO"
		fi
	    fi
	}
	done
    fi
    echo
}

vlanstatus() {
    if [ -z "$( $LSMOD | $GREP 8021q | $AWK {'print $1'} )" ]; then
        echo "VLAN module not loaded."
    elif [ ! -s $CVLANLISTFILE ]; then
        echo "No VLAN configured."
    else
	echo "Configured VLANs:"
	for line in $CVLANLIST ; do
	    echo $line | {
	    IFS='|' read CLIENT_ID NETWORK GATEWAY BROADCAST CLIENT_IP \
	    RATE CEIL INTERFACE
	    $IP addr show dev vlan${CLIENT_ID}
	    }
	done
	if [ -s $VHOSTLISTFILE ]; then
	    echo
	    vhoststatus
	fi
    fi
    echo
}

echo

case "$0" in
    'rc.virtualhosts')			VIRTUALHOST="TRUE" ;;
    '/etc/rc.d/rc.virtualhosts')	VIRTUALHOST="TRUE" ;;
    '/etc/rc.d/vlan/rc.virtualhosts')	VIRTUALHOST="TRUE" ;;
    './rc.virtualhosts')		VIRTUALHOST="TRUE" ;;
esac

if [ "$VIRTUALHOST" = "TRUE" ]; then
    case "$1" in
	'start')
	    startpublicvirtualhosts
	;;
	'stop')
	    deletepublicvirtualhosts
	;;
	'restart')
	    deletepublicvirtualhosts
	    startpublicvirtualhosts
	;;
	'status')
	    vhoststatus
	;;
	*)
	    echo "usage: $0  start | stop | restart | status"
	;;
    esac
    exit
fi

case "$1" in
    'start')
	startvlans
	dynamicnamed
    ;;
    'stop')
	deletevlans
	resetdynamicnamed
    ;;
    'restart')
	deletevlans
	startvlans
	dynamicnamed
    ;;
    'startpublic')
	startpublicvirtualhosts
    ;;
    'stoppublic')
    	deletepublicvirtualhosts
    ;;
    'restartpublic')
	deletepublicvirtualhosts
	startpublicvirtualhosts
    ;;
    'startall')
	startvlans
	startpublicvirtualhosts
	dynamicnamed
    ;;
    'stopall')
	deletevlans
	deletepublicvirtualhosts
	resetdynamicnamed
    ;;
    'restartall')
	deletevlans
	deletepublicvirtualhosts
	startvlans
	startpublicvirtualhosts
	dynamicnamed
    ;;
    'status')
	vlanstatus
    ;;
    *)
    echo "usage: $0 \\"
    echo "       start | stop | restart | startall | stopall | restartall | status"
    ;;
esac