#!/bin/bash


# Skrypt do generowania konfigow openvna (pliki ccd/$commonname i firewall)
# skladnia pliku dostep.txt jest nastepujaca:
# {CommonName} {$user'snet} {masq|nomasq} {forward|noforward} {host[proto^service]} {host[proto^service]} {host[proto^service]} ....
    # mserafin 10.8.0.8 masq forward 192.168.10.18[tcp^22,23,83,45,600:720] 192.168.10.23[udp^all] 213.186.86.1[tcp^22]
    # jkowalski 10.8.0.12 nomasq noforward 192.168.10.21[tcp^all] 192.168.10.18[tcp^22,23,83,45,600:720] 192.168.10.23[udp^all]


VPNDIR="/usr/local/ovpn/etc"
DANE="$VPNDIR/genconfig/dostep.txt" # plik z definicjami dostepu
FWVPN="/etc/rc.d/rc.firewall-vpn"   # wynikowy plik firewalla (uwaga, inny niz glowny firwall!)

# zmienne zalezne od rc.firewall:

 SWIAT1="91.112.12.10"		    # IP z ktorego router "wychodzi" na swiat
 ethswiat1="eth0"		    # interfejs wyjsciowy routera
 ethlan="eth1"
 DNS_LAN="192.168.10.9"
 DOMAIN_SUFFIX="firma.com.pl"




if ! [ -f "$DANE" ]; then
    echo "brak pliku konfiguracyjnego: $DANE !!! - wychodze"
    exit
fi


echo 0> $FWVPN
echo -e "IPT=\`which iptables\` \n" >> $FWVPN
chmod +x $FWVPN
echo 0> $VPNDIR/ipp.txt

dodaj_wpis() {


# ustawienie IFS'a -- b. wazne

    IFS='
    '
    tablica=($1) 

WIELKOSCTAB=${#tablica[@]}  
MAXINDEX=$(($WIELKOSCTAB - 1))
ROZNICA=$(($WIELKOSCTAB - 3))
IPTSTALE="\$IPT -I FORWARD -i tun+"

	USERNAME=${tablica[0]}
	USERNET=${tablica[1]}
	BASENET=`echo $USERNET | awk -F'.' '{print $1"."$2"."$3}'`
	KONCOWKAIPHOSTA=$((`echo $USERNET |awk -F'.' '{print $4}'` + 2))
	KONCOWKAIPBRAMY=$((`echo $USERNET |awk -F'.' '{print $4}'` + 1))

echo "$USERNAME,$USERNET" >> $VPNDIR/ipp.txt

echo "ifconfig-push $BASENET.$KONCOWKAIPHOSTA $BASENET.$KONCOWKAIPBRAMY" > $VPNDIR/ccd/$USERNAME

# jesli zezwalamy na maskarade, umieszczamy odpowiedni wpis iptables.
if [ ${tablica[2]} == "masq" ] ; then
    echo "\$IPT -t nat -A POSTROUTING -o $ethswiat1 -s $USERNET/30 -j SNAT --to $SWIAT1" >> $FWVPN
fi


if [ ${tablica[3]} == "forward" ] ; then
	FORWARD="1"
	echo "push redirect-gateway" >> $VPNDIR/ccd/$USERNAME
	echo -e "push \"dhcp-option DOMAIN $DOMAIN_SUFFIX\"" >> $VPNDIR/ccd/$USERNAME
	echo -e "push \"dhcp-option DNS $DNS_LAN\"" >> $VPNDIR/ccd/$USERNAME
fi

	
for i in `seq 4 $MAXINDEX` ; do
	#echo "routujemy do ${tablica[$i]}"
	HOST=`echo ${tablica[$i]} |awk -F'[' '{print $1}'`
	KONCOWKA_SERWERA=`echo $HOST |awk -F'.' '{print $4}'`
	IPADDRESS="$BASENET.$KONCOWKAIPHOSTA"
	USERGW="$BASENET.$KONCOWKAIPBRAMY"
	PROTO=`echo ${tablica[$i]} |awk -F'[' '{print $2}' |awk -F'^' '{print $1}'`
	SERVICE=`echo ${tablica[$i]} |awk -F'[' '{print $2}' |awk -F'^' '{print $2}' |awk -F']' '{print $1}'`

	# tutaj dodajemy wpisy dotyczace routingu do CCD/$username (to wymusza dodanie trasy po stronie klienta)
	
	if [ $KONCOWKA_SERWERA == "0" ] ; then
	    echo -e "push \"route $HOST 255.255.255.0\"" >> $VPNDIR/ccd/$USERNAME
	else
	    echo -e "push \"route $HOST 255.255.255.255\"" >> $VPNDIR/ccd/$USERNAME
	fi


	if [ $KONCOWKA_SERWERA == "0" ] ; then
	    HOST="$HOST/24"
	fi

	if [ $PROTO == "tcp" ] ; then
	    if [ $SERVICE == "all" ] ; then
		echo "$IPTSTALE -p tcp -s $IPADDRESS -d $HOST -j ACCEPT" >> $FWVPN
	    else
		echo "$IPTSTALE -p tcp -s $IPADDRESS -d $HOST -m multiport --dports $SERVICE -j ACCEPT" >> $FWVPN
	    fi
	fi


	if [ $PROTO == "udp" ] ; then
	    if [ $SERVICE == "all" ] ; then
		echo "$IPTSTALE -p udp -s $IPADDRESS -d $HOST -j ACCEPT" >> $FWVPN
	    else
		echo "$IPTSTALE -p udp -s $IPADDRESS -d $HOST --dport $SERVICE -j ACCEPT" >> $FWVPN
	    fi
	fi


	if [ $PROTO == "all" ] ; then
	    if [ $SERVICE == "all" ] ; then
		echo "$IPTSTALE -p tcp -s $IPADDRESS -d $HOST -j ACCEPT" >> $FWVPN
		echo "$IPTSTALE -p udp -s $IPADDRESS -d $HOST -j ACCEPT" >> $FWVPN
	    else
		echo "$IPTSTALE -p tcp -s $IPADDRESS -d $HOST -m multiport --dports $SERVICE -j ACCEPT" >> $FWVPN
		echo "$IPTSTALE -p udp -s $IPADDRESS -d $HOST -m multiport --dports $SERVICE -j ACCEPT" >> $FWVPN
	    fi
	fi
done

}

IFS='
'

for i in `cat $DANE |grep -v '#'` ; do
    tablica=($i)
dodaj_wpis "${tablica[*]}" 
done

$FWVPN
