Script-Time: Excel2cli

CLI-Commands aus Kunden-Tabellen generieren lassen.

Script-Time: Excel2cli
Photo by Mohammad Rahmani / Unsplash

Immer wieder bekomme ich Aufträge für Firewalls als Excel-Tabelle zugeschickt. Da diese Arbeit zunehmens langweiliger wird, habe ich begonnen diese Tätigkeiten zu automatisieren. Möglicherweise stellt der Kunde bald eine JSON-API zur Verfügung, sodass die Informationen nicht aus der Tabelle in das Script kopiert werden müssen, sondern direkt abgerufen werden können.

Dieses Script, das ursprünglich ein Shellscript war, lieferte ursprünglich Konfigurationen für Barracuda-Firewalls. Da es aber so gut funktioniert hat, habe ich Fortinet und Checkpoint ebenfalls hinzugefügt. Es ist noch nicht ganz vollständig. Routen und Interfaces werden bereits angelegt. Regeln sind auf Fortigate leicht zu realisieren.

Sobald die mgmt_cli von Checkpoint stabil läuft, kann auch hier der Anteil automatisiert werden, der sich sonst nur in der Windows-Applikation klicken lässt.

Die gleiche Art der Verarbeitung funktioniert besonders gut bei Cisco Komponenten. Auch hier können die Felder leicht an entsprechender Stelle in der Konfig platziert werden, die das Script erstellt.

Vielleich ist die Bash-Variante unten für viele besser verständlich.

Manche Firmen gestatten die Erstellung von Software nur durch ihre eigene Software-Abteilung. Doch die dabei entstehenden Lösungen sind meist viel zu umständlich. Hier geht es nur um Folgendes:

In der Exceltabelle befindet sich in jeder Zeile z.B. eine Cluster-Interface-Beschreibung. So weise ich also jeder Variablen das entsprechende Feld aus jeder einzelnen Zeile zu:

Bei der Ausgabe, die man später in die CLI kopieren kann, wird auch berücksichtigt, ob es sich um IPv4 oder IPv6 handelt:

Doch hier nun die Idee:

#!/bin/bash
Help(){
    echo "
    #################################################################################
    ###                                                                          ####
    ###   wf_tool                                                                ####
    ###   ====================================================================   ####
    ###   Version  : 0.9                                                         ####
    ###   Date     : 07.04.2017                                                  ####
    ###   Modified : 22.02.2021                                                  ####
    ###   Author   : Michael Meister                                             ####
    ###   --------------------------------------------------------------------   ####
    ###   Purpose :                                                              ####
    ###   This tool provides help for fw-configuration                           ####
    ###                                                                          ####
    #################################################################################
    "
    exit 0
}
 
[ "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ] && Help

####################################################################################################
####################################################################################################
# Export Rules, Interfaces and Routing to Excel, switch to read/write in Excel and paste the
# full lines below:
#
RULES='
0	FALSCH	1	Add	fgt-rbm-01	rz-ber-1, rz-ber-2	10.232.17.11/24,10.232.17.12/24	keines	kein		10.232.92.2/25-10.232.92.3/25		RZ-TEST BER	NTP	udp/123	Ja					CLOCK/NTP für TFDPS_DB
0	FALSCH	2	Add	fgt-rbm-01	rz-ber-1, rz-ber-2	10.226.17.11/24,10.226.17.12/24	keines	kein		10.232.92.2/25-10.232.92.3/25		RZ-TEST BER	NTP	udp/123	Ja					CLOCK/NTP für TFDPS_DP
'

INTERFACES='
0	FALSCH	1	port4	fgt-rbm-01			10.237.27.144/29	10.237.27.145	1337 (RZ_BER_MUC)	RZ-BER-MUC-Transit
0	FALSCH	1	eth3.s01	ckp-rmm-17			10.237.27.152/29	10.237.27.153	1337 (RZ_BER_MUC)	RZ-BER-MUC-Transit
'

ROUTING='
0	FALSCH	1	port4.1337	fgt-rbm-01	10.10.27.150	10.224.0.0/16	StdWo0113-Berlin113
0	FALSCH	2	port4.1337	fgt-rbm-01	10.10.27.150	10.231.83.0/24	StdWo0022-Berlin022
0	FALSCH	3	eth2.1337	ckp-rmm-17	10.10.25.30	172.17.201.128/25	RZ_MUC
'


####################################################################################################
####################################################################################################

# functions() here:

cdr2mask(){
   # Number of args to shift, 255..255, first non-255 byte, zeroes
   set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
   [ $1 -gt 1 ] && shift $1 || shift
   echo ${1-0}.${2-0}.${3-0}.${4-0}
}

mask2cdr ()
{
   # Assumes there's no "255." after a non-255 byte in the mask
   local x=${1##*255.}
   set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) ${x%%.*}
   x=${1%%$3*}
   echo $(( $2 + (${#x}/4) ))
}


cprules(){
#                             _____ _____    _____  _    _ _      ______  _____
#                            / ____|  __ \  |  __ \| |  | | |    |  ____|/ ____|
#                           | |    | |__) | | |__) | |  | | |    | |__  | (___
#                           | |    |  ___/  |  _  /| |  | | |    |  __|  \___ \
#                           | |____| |      | | \ \| |__| | |____| |____ ____) |
#                            \_____|_|      |_|  \_\\____/|______|______|_____/

# Rules first as they can be done without OPSPLAN
#


for MASCHINE in ${MASCHINES}
do
echo
echo
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom Rules
figlet -w 140 -f doom ${MASCHINE}

echo "$RULES" |
grep "${MASCHINE}" |
sed -e 's/\t/\|/g' |

while read line
	do
	RULENR=$(echo $line | cut -d '|' -f3)
	FIREWALL=$(echo $line | cut -d '|' -f5)
	TODO=$(echo $line | cut -d '|' -f4)
	SOURCEIP=$(echo $line | cut -d '|' -f7 | sed -e 's/[;,]/ /g')
	SNAT=$(echo $line | cut -d '|' -f8)
	SRCHOSTNAMES=$(echo $line | cut -d '|' -f6 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
	DIRECTION="--->" #$(echo $line | cut -d '|' -f X)
	DESTIP=$(echo $line | cut -d '|' -f11 | sed -e 's/[;,]/ /g')
	DNAT=$(echo $line | cut -d '|' -f12)
	DESTHOSTNAMES=$(echo $line | cut -d '|' -f13 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
	PROTONAME=$(echo $line | cut -d '|' -f14 | sed -e 's/[;,]/ /g')
	PORTS=$(echo $line | cut -d '|' -f15 | sed -e 's/[;,]/ /g')
	PAT=$(echo $line | cut -d '|' -f17)
	OPS=$(echo $line | cut -d '|' -f16)
	SECTION=$(echo $line | cut -d '|' -f19)
	RULENAME=$(echo $line | cut -d '|' -f18)
	COMMENT="${AUFTRAG} $( (echo $OPS | grep -qi "ja") && echo OPS-Relevant) $(echo $line | cut -d '|' -f21 | sed -e 's/[;]/ /g;s/ */ /g')"

	# if [[ ${RULENR} > 0 ]]
	# then
		declare -a SOURCEIPS=($SOURCEIP)
		declare -a SOURCENAMES=($SRCHOSTNAMES)
		declare -a DESTIPS=($DESTIP)
		declare -a DESTNAMES=($DESTHOSTNAMES)

		if (echo ${TODO} | grep -q "Add")
			then
				echo
				echo "---------------------------------------------------------------"
				echo "Neue Regel erstellen"
				echo "Regelnummer im Auftrag : ${RULENR}"
				echo "==========================="
				echo
				echo "Firewall     : ${FIREWALL}"
				echo "Section      : ${SECTION}"
				echo "Rulename     : ${RULENAME}"
				echo "Kommentar    : ${COMMENT}"
				echo "Sources      : "
				echo

                [[ $(echo "$SOURCEIP" | wc -w) == $(echo "$SRCHOSTNAMES" | wc -w) ]] || echo Fehler im Auftrag
				for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
					do 
					echo -e "  $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
				done
				echo
				[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
				echo "Direction      ${DIRECTION}"
				echo "Protokoll    : ${PROTONAME}"
				echo "Ports        : ${PORTS}"
				[ "${PAT}" ] && echo "PAT          : ${PAT}"
				echo "Direction      ${DIRECTION}"
				echo
				echo "Destinations : "
				echo
                [[ $(echo "$DESTIPS" | wc -w) == $(echo "$DESTNAMES" | wc -w) ]] || echo Fehler im Auftrag
				for (( i=0; i<${#DESTIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
				done
				echo
				[ "${DNAT}" ] && echo "DNAT         : ${DNAT}" && echo
				echo "OPS Relevant : ${OPS}"
				echo "Kommentar    : ${COMMENT}"
		fi
		if (echo ${TODO} | grep -q "Delete")
			then
				echo
				echo "---------------------------------------------------------------"
				echo -e "[1;91mRegel LÖSCHEN!!!\033[0m"
				echo "Regelnummer im Auftrag : ${RULENR}"
				echo "==========================="
				echo
				echo "Firewall     : ${FIREWALL}"
				echo "Section      : ${SECTION}"
				echo "Rulename     : ${RULENAME}"
				echo "Kommentar    : ${COMMENT}"
				echo "Sources      : "
				echo
                [[ $(echo "$SOURCEIPS" | wc -w) == $(echo "$SOURCENAMES" | wc -w) ]] || echo Fehler im Auftrag
				for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
				done
				echo
				[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
				echo "Direction      ${DIRECTION}"
				echo "Protokoll    : ${PROTONAME}"
				echo "Ports        : ${PORTS}"
				[ "${PAT}" ] && echo "PAT          : ${PAT}"
				echo "Direction      ${DIRECTION}"
				echo
				echo "Destinations : "
				echo
                [[ $(echo "$DESTIPS" | wc -w) == $(echo "$DESTNAMES" | wc -w) ]] || echo Fehler im Auftrag
				for (( i=0; i<${#DESTIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
				done
				echo
				[ "${DNAT}" ] && echo "DNAT         : ${DNAT}" && echo
				echo "OPS Relevant : ${OPS}"
				echo "Kommentar    : ${COMMENT}"
		fi
		if (echo ${TODO} | grep -q "Change")
			then
				echo
				echo "---------------------------------------------------------------"
				echo "Regel ändern"
				echo "Regelnummer im Auftrag : ${RULENR}"
				echo "==========================="
				echo
				echo "Firewall     : ${FIREWALL}"
				echo "Section      : ${SECTION}"
				echo "Rulename     : ${RULENAME}"
				echo "Kommentar    : ${COMMENT}"
				echo "Sources      : "
				echo
				for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
				done
				echo
				[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
				echo "Direction      ${DIRECTION}"
				echo "Protokoll    : ${PROTONAME}"
				echo "Ports        : ${PORTS}"
				[ "${PAT}" ] && echo "PAT          : ${PAT}"
				echo "Direction      ${DIRECTION}"
				echo
				echo "Destinations : "
				echo
				for (( i=0; i<${#DESTIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
				done
				echo
				[ "${DNAT}" ] && echo "DNAT         : ${DNAT}" && echo
				echo "OPS Relevant : ${OPS}"
				echo -e "Kommentar    : \033[1;31m${COMMENT}\033[0m"
		fi
	# fi
done | sed -e 's/ \//\//g;s/\/\//\//g'

done

}

fortirules(){
#                    ______ ____  _____ _______ _____   _____  _    _ _      ______  _____
#                   |  ____/ __ \|  __ \__   __|_   _| |  __ \| |  | | |    |  ____|/ ____|
#                   | |__ | |  | | |__) | | |    | |   | |__) | |  | | |    | |__  | (___
#                   |  __|| |  | |  _  /  | |    | |   |  _  /| |  | | |    |  __|  \___ \
#                   | |   | |__| | | \ \  | |   _| |_  | | \ \| |__| | |____| |____ ____) |
#                   |_|    \____/|_|  \_\ |_|  |_____| |_|  \_\\____/|______|______|_____/

# Rules first as they can be done without OPSPLAN
#


for MASCHINE in ${MASCHINES}
do
echo
echo
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom Rules
figlet -w 140 -f doom ${MASCHINE}

echo "$RULES" |
grep "${MASCHINE}" |
sed -e 's/\t/\|/g' |

while read line
	do
	RULENR=$(echo $line | cut -d '|' -f3)
	FIREWALL=$(echo $line | cut -d '|' -f5)
	TODO=$(echo $line | cut -d '|' -f4)
	SOURCEIP=$(echo $line | cut -d '|' -f7 | sed -e 's/[;,]/ /g')
	SNAT=$(echo $line | cut -d '|' -f8)
	SRCHOSTNAMES=$(echo $line | cut -d '|' -f6 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
	DIRECTION="--->" #$(echo $line | cut -d '|' -f X)
	DESTIP=$(echo $line | cut -d '|' -f11 | sed -e 's/[;,]/ /g')
	DNAT=$(echo $line | cut -d '|' -f12)
	DESTHOSTNAMES=$(echo $line | cut -d '|' -f13 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
	PROTONAME=$(echo $line | cut -d '|' -f14 | sed -e 's/[;,]/ /g')
	PORTS=$(echo $line | cut -d '|' -f15 | sed -e 's/[;,]/ /g')
	PAT=$(echo $line | cut -d '|' -f17)
	OPS=$(echo $line | cut -d '|' -f16)
	SECTION=$(echo $line | cut -d '|' -f19)
	RULENAME=$(echo $line | cut -d '|' -f18)
	COMMENT="${AUFTRAG} $( (echo $OPS | grep -qi "ja") && echo OPS-Relevant) $(echo $line | cut -d '|' -f21 | sed -e 's/[;,/]/ /g;s/ */ /g')"

	# if [[ ${RULENR} > 0 ]]
	# then
		declare -a SOURCEIPS=($SOURCEIP)
		declare -a SOURCENAMES=($SRCHOSTNAMES)
		declare -a DESTIPS=($DESTIP)
		declare -a DESTNAMES=($DESTHOSTNAMES)

		if (echo ${TODO} | grep -q "Add")
			then
				echo
				echo "---------------------------------------------------------------"
				echo "Neue Regel erstellen"
				echo "Regelnummer im Auftrag : ${RULENR}"
				echo "==========================="
				echo
				echo "Firewall     : ${FIREWALL}"
				echo "Section      : ${SECTION}"
				echo "Rulename     : ${RULENAME}"
                echo
				# ip=1.1.1.128/25
				# (echo $ip | grep -q "/") && [[ "$( echo $ip | sed -e 's/\/.*//')" == "$(ipcalc $ip | sed -ne '/Network:/{s/Network: *//;s/\/.*//p}')" ]] && echo ist ein Netz || echo ist ein Host
                echo edit
                echo set name \"${RULENAME}\"
                echo set srcintf \"any\"
                echo set dstintf \"any\"
                echo set action accept
                echo -n set srcaddr
                for (( i=0; i<${#SOURCENAMES[@]}; i++ ))
					do 
					echo -n " "\"${SOURCENAMES[$i]}\"
				done
                echo
                echo -n set dstaddr
                for (( i=0; i<${#DESTNAMES[@]}; i++ ))
					do 
					echo -n " "\"${DESTNAMES[$i]}\"
				done
                echo
                echo set schedule \"always\"
                echo set service \"$(echo $PORTS | sed -e 's/\//_/g;s/ /\" \"/g' )\"
                echo set utm-status enable
                echo set inspection-mode proxy
                echo set av-profile \"DS-AV\"
                echo set ips-sensor \"DS-IPS\"
                echo set logtraffic-start enable
                echo set comments \"${COMMENT}\"
                echo next
		fi
		if (echo ${TODO} | grep -q "Delete")
			then
				echo
				echo "---------------------------------------------------------------"
				echo -e "[1;91mRegel LÖSCHEN!!!\033[0m"
				echo "Regelnummer im Auftrag : ${RULENR}"
				echo "==========================="
				echo
				echo "Firewall     : ${FIREWALL}"
				echo "Section      : ${SECTION}"
				echo "Rulename     : ${RULENAME}"
				echo "Sources      : "
				echo
                [[ $(echo "$SOURCEIPS" | wc -w) == $(echo "$SOURCENAMES" | wc -w) ]] || echo Fehler im Auftrag
				for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
				done
				echo
				[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
				echo "Direction      ${DIRECTION}"
				echo "Protokoll    : ${PROTONAME}"
				echo "Ports        : ${PORTS}"
				[ "${PAT}" ] && echo "PAT          : ${PAT}"
				echo "Direction      ${DIRECTION}"
				echo
				echo "Destinations : "
				echo
                [[ $(echo "$DESTIPS" | wc -w) == $(echo "$DESTNAMES" | wc -w) ]] || echo Fehler im Auftrag
				for (( i=0; i<${#DESTIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
				done
				echo
				[ "${DNAT}" ] && echo "DNAT         : ${DNAT}" && echo
				echo "OPS Relevant : ${OPS}"
				echo "Kommentar    : ${COMMENT}"
		fi
		if (echo ${TODO} | grep -q "Change")
			then
				echo
				echo "---------------------------------------------------------------"
				echo "Regel ändern"
				echo "Regelnummer im Auftrag : ${RULENR}"
				echo "==========================="
				echo
				echo "Firewall     : ${FIREWALL}"
				echo "Section      : ${SECTION}"
				echo "Rulename     : ${RULENAME}"
				echo "Sources      : "
				echo
				for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
				done
				echo
				[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
				echo "Direction      ${DIRECTION}"
				echo "Protokoll    : ${PROTONAME}"
				echo "Ports        : ${PORTS}"
				[ "${PAT}" ] && echo "PAT          : ${PAT}"
				echo "Direction      ${DIRECTION}"
				echo
				echo "Destinations : "
				echo
				for (( i=0; i<${#DESTIPS[@]}; i++ ))
					do echo -e "  $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
				done
				echo
				[ "${DNAT}" ] && echo "DNAT         : ${DNAT}" && echo
				echo "OPS Relevant : ${OPS}"
				echo -e "Kommentar    : \033[1;31m${COMMENT}\033[0m"
		fi
	# fi
done | sed -e 's/ \//\//g;s/\/\//\//g'

done
}

cpinterfaces(){
#             _____ _____    _____ _   _ _______ ______ _____  ______      _____ ______  _____
#            / ____|  __ \  |_   _| \ | |__   __|  ____|  __ \|  ____/\   / ____|  ____|/ ____|
#           | |    | |__) |   | | |  \| |  | |  | |__  | |__) | |__ /  \ | |    | |__  | (___
#           | |    |  ___/    | | | . ` |  | |  |  __| |  _  /|  __/ /\ \| |    |  __|  \___ \
#           | |____| |       _| |_| |\  |  | |  | |____| | \ \| | / ____ \ |____| |____ ____) |
#            \_____|_|      |_____|_| \_|  |_|  |______|_|  \_\_|/_/    \_\_____|______|_____/
#           

for MASCHINE in $MASCHINES
do
echo
echo '############################################################################'
echo '############################################################################'
figlet -w 140 -f doom Interfaces
figlet -w 140 -f doom ${MASCHINE}1
echo

echo -e "$INTERFACES" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
	do
	firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
	interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
	vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g;s/^0*//')
	clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
	cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
	cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
	cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
    # mask=$(cdr2mask $cdr)
	kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')

	if (echo $line | grep -qi "löschen")
		then
            echo "# ${firewall}2 - $interface.$vlan löschen:"
			echo delete interface $interface.$vlan ipv4-address $cp1 mask-length $cdr
		else
            echo '#'
            echo "# ${firewall}2 - $interface.$vlan anlegen:"
            echo add interface $interface vlan $vlan
            echo set interface $interface.$vlan comments \"$kommentar\"
            ( echo "$cp1" | grep -q "." ) && echo set interface $interface.$vlan ipv4-address $cp1 mask-length $cdr
            ( echo "$cp1" | grep -q ":" ) && echo set interface $interface.$vlan ipv6-address $cp1 mask-length $cdr
            echo set interface $interface.$vlan mtu 1500
            echo set interface $interface.$vlan state on
	fi
done | sed -e 's/ \//\//;s/\/\//\//'

echo
echo '############################################################################'
echo '############################################################################'
figlet -w 140 -f doom Interfaces
figlet -w 140 -f doom ${MASCHINE}2
echo

echo -e "$INTERFACES" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
	do
	firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
	interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
	vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g')
	clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
	cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
	cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
	cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
    # mask=$(cdr2mask $cdr)
	kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')

	if (echo $line | grep -qi "löschen")
		then
            echo "# ${firewall}2 - $interface.$vlan löschen:"
			echo delete interface $interface.$vlan ipv4-address $cp2 mask-length $cdr
		else
            echo '#'
            echo "# ${firewall}2 - $interface.$vlan anlegen:"
            echo add interface $interface vlan $vlan
            echo set interface $interface.$vlan comments \"$kommentar\"
            ( echo "$cp2" | grep -q "." ) && echo set interface $interface.$vlan ipv4-address $cp2 mask-length $cdr
            ( echo "$cp2" | grep -q ":" ) && echo set interface $interface.$vlan ipv6-address $cp2 mask-length $cdr
            echo set interface $interface.$vlan mtu 1500
            echo set interface $interface.$vlan state on
	fi
done | sed -e 's/ \//\//;s/\/\//\//'

done
}


fortiinterfaces(){
#      ______ ____  _____ _______ _____   _____ _   _ _______ ______ _____  ______      _____ ______  _____
#     |  ____/ __ \|  __ \__   __|_   _| |_   _| \ | |__   __|  ____|  __ \|  ____/\   / ____|  ____|/ ____|
#     | |__ | |  | | |__) | | |    | |     | | |  \| |  | |  | |__  | |__) | |__ /  \ | |    | |__  | (___
#     |  __|| |  | |  _  /  | |    | |     | | | . ` |  | |  |  __| |  _  /|  __/ /\ \| |    |  __|  \___ \
#     | |   | |__| | | \ \  | |   _| |_   _| |_| |\  |  | |  | |____| | \ \| | / ____ \ |____| |____ ____) |
#     |_|    \____/|_|  \_\ |_|  |_____| |_____|_| \_|  |_|  |______|_|  \_\_|/_/    \_\_____|______|_____/
#     
for MASCHINE in $MASCHINES
do
echo
echo '############################################################################'
echo '############################################################################'
figlet -w 140 -f doom Interfaces
figlet -w 140 -f doom ${MASCHINE}
echo

echo -e "$INTERFACES" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
	do
	firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
	interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
	vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g;s/^0*//')
	clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
	cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
	cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
	cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
    # mask=$(cdr2mask $cdr)
	kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')

	if  ( echo $firewall | grep -Eiq '.*-.*-f' )
	then
		if (echo $line | grep -qi "löschen")
			then
                echo "# ${firewall} - $interface.$vlan löschen:"
				echo delete interface $interface.$vlan ipv4-address $cp1 mask-length $cdr
			else
                echo '#'
                echo "# ${firewall} - $interface.$vlan anlegen:"
                echo config system interface
                echo edit \"$interface.$vlan\"
                echo set vdom \"root\"
                echo set description \"$kommentar\"
                echo set device-identification enable
                echo set role lan
                echo set ip $clusterip/$cdr
                echo set allowaccess ping
                echo set interface \"$interface\"
                echo set vlanid $vlan
                echo next
                echo end
		fi
	fi
done | sed -e 's/ \//\//;s/\/\//\//'

done
}

cprouting(){
#               _____ _____    _____   ____  _    _ _______ _____ _   _  _____
#              / ____|  __ \  |  __ \ / __ \| |  | |__   __|_   _| \ | |/ ____|
#             | |    | |__) | | |__) | |  | | |  | |  | |    | | |  \| | |  __
#             | |    |  ___/  |  _  /| |  | | |  | |  | |    | | | . ` | | |_ |
#             | |____| |      | | \ \| |__| | |__| |  | |   _| |_| |\  | |__| |
#              \_____|_|      |_|  \_\\____/ \____/   |_|  |_____|_| \_|\_____|
#             
for MASCHINE in $MASCHINES
do
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom ROUTING
figlet -w 140 -f doom ${MASCHINE}1 u. ${MASCHINE}2

echo -e "$ROUTING" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
	do
	firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
	netz=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/\/.*//')
	maske=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/.*\///')
	gateway=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
	interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g')
	kommentar=$(echo $line | cut -d ';' -f8)

	if [[ $netz ]]
	then
		if (echo $line | grep -qi "löschen")
			then
                echo "# $firewall - ${netz}/${maske}"
				echo set static-route ${netz}/${maske} off
			else
                echo "# $firewall - ${netz}/${maske}"
				echo set static-route ${netz}/${maske} comment \"${kommentar}\"
				echo set static-route ${netz}/${maske} nexthop gateway address ${gateway} on

		fi
	fi
done | sed -e 's/ \//\//;s/\/\//\//'

done

}

fortirouting(){
#       ______ ____  _____ _______ _____   _____   ____  _    _ _______ _____ _   _  _____
#      |  ____/ __ \|  __ \__   __|_   _| |  __ \ / __ \| |  | |__   __|_   _| \ | |/ ____|
#      | |__ | |  | | |__) | | |    | |   | |__) | |  | | |  | |  | |    | | |  \| | |  __
#      |  __|| |  | |  _  /  | |    | |   |  _  /| |  | | |  | |  | |    | | | . ` | | |_ |
#      | |   | |__| | | \ \  | |   _| |_  | | \ \| |__| | |__| |  | |   _| |_| |\  | |__| |
#      |_|    \____/|_|  \_\ |_|  |_____| |_|  \_\\____/ \____/   |_|  |_____|_| \_|\_____|
#      
for MASCHINE in $MASCHINES
do
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom ROUTING
figlet -w 140 -f doom ${MASCHINE}

echo -e "$ROUTING" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
	do
	firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
	netz=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/\/.*//')
	maske=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/.*\///')
	gateway=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
	interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g')
	kommentar=$(echo $line | cut -d ';' -f8)


   	if (echo $line | grep -qi "löschen")
   		then
            echo "# $firewall - ${netz}/${maske}"
   			echo keine Ahnung, wie man ${netz}/${maske} über das cli löscht
   		else
            echo "# $firewall - ${netz}/${maske}"
            echo config router static
            echo edit
            echo set dst ${netz}/${maske}
            echo set gateway $gateway
            echo set device \"$interface\"
            echo set comment \"$kommentar\"
            echo next
            echo end
   	fi
   done | sed -e 's/ \//\//;s/\/\//\//'
done
}

antispoofing(){
#                _   _ _______ _____  _____ _____   ____   ____  ______ _____ _   _  _____
#          /\   | \ | |__   __|_   _|/ ____|  __ \ / __ \ / __ \|  ____|_   _| \ | |/ ____|
#         /  \  |  \| |  | |    | | | (___ | |__) | |  | | |  | | |__    | | |  \| | |  __
#        / /\ \ | . ` |  | |    | |  \___ \|  ___/| |  | | |  | |  __|   | | | . ` | | |_ |
#       / ____ \| |\  |  | |   _| |_ ____) | |    | |__| | |__| | |     _| |_| |\  | |__| |
#      /_/    \_\_| \_|  |_|  |_____|_____/|_|     \____/ \____/|_|    |_____|_| \_|\_____|
#      
echo
echo '############################################################################'
echo '#'
echo "#  In der Netzwerktopologie Antispoofing anlegen:"
for MASCHINE in ${ROUTINGFW}
do

echo -e "$INTERFACES" |
grep "$MASCHINE" |
sed -e 's/\t/;/g' |
while read line
	do
	firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
	interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
	vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g')
	clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
	cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
	cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
	cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
    # mask=$(cdr2mask $cdr)
	kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')

	if  ( echo $firewall | grep -Eiq '.*-.*-c' )
	then
		figlet -w 140 -f doom ${MASCHINE}
		if (echo $line | grep -qi "löschen")
			then
                echo "# ${firewall}1 - $interface.$vlan löschen:"
				echo "# delete interface $interface.$vlan ipv4-address $clusterip mask-length $cdr"
			else
                echo '#'
                echo "#      Auf ${firewall} [ add Interface ]"
                echo "#        Object-Name: $interface.$vlan"
                echo "#               Type: Cluster"
                echo "#               IPv4: $clusterip/$cdr"
                echo "#            Member1: $cp1/$cdr"
                echo "#            Member2: $cp2/$cdr"
                echo "#       Antispoofing: as-ng.${firewall//fw-/}-$interface.$vlan"
				echo "#                       * fw-n.$(echo $firewall | sed -e 's/fw-//;s/-.*//')-$(echo $kommentar | sed 's/.*/\L&/;s/ /_/g') - $(ipcalc $clusterip/$cdr | sed -ne '/Network/{s/\/.*//;s/.* //p}')/$(ipcalc $clusterip/$cdr | sed -ne '/Netmask/{s/ =.*//;s/.* //p}')"
				

				echo -e "$ROUTING" |
				sed -e 's/\t/;/g' |
				while read line
					do
					netz=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/\/.*//')
					maske=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/.*\///')
					cpif=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g')
					netname=$(echo $line | cut -d ';' -f8 | sed 's/.*/\L&/;s/ /_/g')
					
					if [[ "$cpif" == "$interface.$vlan" ]]
					then
						echo "#                       * $netname - ${netz}/$(cdr2mask ${maske})"
					fi
				done | sed -e 's/ \//\//;s/\/\//\//'




		fi
	fi
done | sed -e 's/ \//\//;s/\/\//\//'

done

echo '#'
echo '############################################################################'
echo

}

#           _____ _______       _____ _______   _    _ ______ _____  ______
#          / ____|__   __|/\   |  __ \__   __| | |  | |  ____|  __ \|  ____|
#         | (___    | |  /  \  | |__) | | |    | |__| | |__  | |__) | |__
#          \___ \   | | / /\ \ |  _  /  | |    |  __  |  __| |  _  /|  __|
#          ____) |  | |/ ____ \| | \ \  | |    | |  | | |____| | \ \| |____
#         |_____/   |_/_/    \_\_|  \_\ |_|    |_|  |_|______|_|  \_\______|
#         
####################################################################################################
####################################################################################################

AUFTRAG=$1
INTERFACEFW=$(echo "$INTERFACES" | sed -e 's/\t/\|/g' | cut -d '|' -f5 | grep -vEi "^$" | sort -u)
ROUTINGFW=$(echo "$ROUTING" | sed -e 's/\t/\|/g' | cut -d '|' -f5 | grep -vEi "^$" | sort -u)
RULEFW=$(echo "$RULES" | sed -e 's/\t/\|/g' | cut -d '|' -f5 | grep -vEi "^$" | sort -u)

####################################################################################################
####################################################################################################
#         _____ _    _ ______ _____ _  _______   ____ _____ _   _ _______
#        / ____| |  | |  ____/ ____| |/ /  __ \ / __ \_   _| \ | |__   __|
#       | |    | |__| | |__ | |    | ' /| |__) | |  | || | |  \| |  | |
#       | |    |  __  |  __|| |    |  < |  ___/| |  | || | | . ` |  | |
#       | |____| |  | | |___| |____| . \| |    | |__| || |_| |\  |  | |
#        \_____|_|  |_|______\_____|_|\_\_|     \____/_____|_| \_|  |_|
#       


MASCHINES=$( echo "$RULEFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && cprules

MASCHINES=$( echo "$INTERFACEFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && cpinterfaces

MASCHINES=$( echo "$ROUTINGFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && cprouting

MASCHINES=$( echo "$ROUTINGFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && antispoofing

####################################################################################################
#            ______ ____  _____ _______ _____ _   _ ______ _______
#           |  ____/ __ \|  __ \__   __|_   _| \ | |  ____|__   __|
#           | |__ | |  | | |__) | | |    | | |  \| | |__     | |
#           |  __|| |  | |  _  /  | |    | | | . ` |  __|    | |
#           | |   | |__| | | \ \  | |   _| |_| |\  | |____   | |
#           |_|    \____/|_|  \_\ |_|  |_____|_| \_|______|  |_|
#           
MASCHINES=$( echo "$RULEFW" | grep -Ei 'fgt-.*-.*' )
[ "${MASCHINES}" ] && fortirules

MASCHINES=$( echo "$INTERFACEFW" | grep -Ei 'fgt-.*-.*' )
[ "${MASCHINES}" ] && fortiinterfaces

MASCHINES=$( echo "$ROUTINGFW" | grep -Ei 'fgt-.*-.*' )
[ "${MASCHINES}" ] && fortirouting

Ausgabe

Lässt man das Script laufen, erzeugt es eine Ausgabe, wie z.B. diese:

set interface eth16 link-speed 1000M/full
set interface eth16 auto-negotiation on
set interface eth16 mtu 1500
set interface eth16 state on

add interface eth16 vlan 11
set interface eth16.11 comments "RZ_BER_MUC"
set interface eth16.11 mtu 1500
set interface eth16.11 ipv4-address 10.21.17.202 mask-length 29
set interface eth16.11 state on

Man kann das nun leicht in die Konsole der entsprechenden Maschine kopieren, und muss sich nicht mühsam durch langsame Webfrontends quälen.

Fazit

Wenn man die entsprechende Erfahrung mitbringt, kann man sich viele umständliche Abläufe ersparen. Es setzt jedoch voraus, dass man in seiner Umgebung einen Linux-Rechner zur Verfügung hat, auf dem es gestattet ist, Pakete nachzuinstallieren. Sollte der Arbeitgeber einem dies nicht gestatten, muss man wohl oder übel entsprechend langsam arbeiten. Aber: Man wird ja auch nach Zeit bezahlt.