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