Menu Close

Generera adressobjekt

I många projekt kommer det tillfällen då man behöver skapa väldigt mycket kod och ett bra sätt att göra detta är att ha ett eller ett par bra script tillgängliga som kan hjälpa dig med detta. Jag har skrivit ihop ett väldigt enkelt script som utgår från en textfil och skapar adressobjekt i en fil som du sedan enkelt klistrar in i ditt CLI eller laddar upp som en cli-fil till din Fortigate.

Det finns fortfarande mycket att förbättra i scriptet och i skrivande stund stund så klarar inte scriptet av csv filer eller namn med mellanrum i. Men det är något att börja med i alla fall och det gör jobbet i 99 fall av 100 för egen del så detta underlättar för mig.

Nedan ser du koden i skrivande stund (2020-06-22).

#!/usr/bin/env python3

#Variables:
#filename/path:
f_input = 'addresslist.txt'
f_output = 'addresslist.conf'

#Open a file with access mode 'a+'
output = open(f_output, 'a+')

with open(f_input,) as f:
    addresslist = f.read()

for line in addresslist.splitlines():
    fields = line.split()
    name = fields[0]
    addrtype = fields[1]
    address = fields[2]
    netmask = fields[3]
    associatedinterface = fields[4]
    output.write('\n')
    output.write('config firewall address\n')
    output.write('edit "')
    output.write(name)
    output.write('"\n')
    output.write('set type ')
    output.write(addrtype)
    output.write('\n')
    output.write('set subnet ')
    output.write(address)
    output.write(' ')
    output.write(netmask)
    output.write('\n')
    output.write('set associated-interface ')
    output.write(associatedinterface)
    output.write('\n')
    output.write('end\n')
    
#close the file
output.close()


För att kunna genera detta behöver du en in-fil där du beskriver vad som ska skapas. Avgränsaren mellan de olika värdena i detta script är ‘whitespace’ och så här ser min in-fil ut.

#addresslist.txt

name     type    address     netmask         associated-interface
clients1 ipmask  10.0.1.0    255.255.255.0   vlan11
clients2 ipmask  10.0.2.0    255.255.255.0   vlan12
clients3 ipmask  10.0.3.0    255.255.255.0   vlan13
clients4 ipmask  10.0.4.0    255.255.255.0   vlan14
clients5 ipmask  10.0.5.0    255.255.255.0   vlan15
clients6 ipmask  10.0.6.0    255.255.255.0   vlan16
clients7 ipmask  10.0.7.0    255.255.255.0   vlan17

Med denna in-fil genereras följande ut-fil:

#addresslist.conf

config firewall address
edit "name"
set type type
set subnet address netmask
set associated-interface associated-interface
end

config firewall address
edit "clients1"
set type ipmask
set subnet 10.0.1.0 255.255.255.0
set associated-interface vlan11
end

config firewall address
edit "clients2"
set type ipmask
set subnet 10.0.2.0 255.255.255.0
set associated-interface vlan12
end

config firewall address
edit "clients3"
set type ipmask
set subnet 10.0.3.0 255.255.255.0
set associated-interface vlan13
end

config firewall address
edit "clients4"
set type ipmask
set subnet 10.0.4.0 255.255.255.0
set associated-interface vlan14
end

config firewall address
edit "clients5"
set type ipmask
set subnet 10.0.5.0 255.255.255.0
set associated-interface vlan15
end

config firewall address
edit "clients6"
set type ipmask
set subnet 10.0.6.0 255.255.255.0
set associated-interface vlan16
end

config firewall address
edit "clients7"
set type ipmask
set subnet 10.0.7.0 255.255.255.0
set associated-interface vlan17
end

Som du ser i ut-filen ovan så är även första raden med i scriptet. Det är enkelt att helt enkelt ta bort denna innan du kör scriptet för att inte skapa koden eller så går du in efteråt och tar bort avsnittet i ut-filen.

I nästa generation av scriptet kommer det innehålla stöd för csv-filer och outputen kommer att vara optimerad och komprimerad.

Håll utkik efter nästa generation av scriptet här: https://github.com/perrosenlind/NSE8/tree/master/Tools/Addressobject%20script

Strax efter publiceringen av detta inlägg skrev jag ihop ett nytt script som hanterar csv. Det finns på samma ställe som scriptet ovan och fungerar på samma sätt.