#!/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