If you've spent any time configuring user authentication on... Full Story
By Manny Fernandez
April 28, 2025
Mass Create Objects in FortiGate with Python
Had a customer with over 200 static routes on their Cisco Nexus core switch. We are deploying FortiGates as Internal Segmentation Firewall (ISFW). I wanted to help them out with the creation of those static routes. From the Nexus config file, I was able to get the static routes and massage them into a CSV file. I created a template file with a sample FortiGate config object and then used the list csv as a source.
The Template File
edit 0
set dst $VAR_SUBNET
set gateway $VAR_GATEWAY
set device $VAR_INTERFACE
set comment $VAR_DESC
next
The CSV Looked something like this (but over 200 lives)
"10.32.10.0/24",10.32.43.1,inside,Static_to_Corp_CallManager "10.33.118.0/24",10.32.100.2,inside,Test_AZURE-VPN "10.34.3.0/24",10.32.121.66,inside,CUST_MX_HQ_ServerVlan "10.34.22.0/28",10.32.121.66,inside,CUST_MX_MediaSurD1 "10.34.23.16/28",10.32.121.66,inside,CUST_MX_MediaSurV1 "10.34.25.32/28",10.32.121.66,inside,CUST_MX_ABCD1 "10.34.27.48/28",10.32.121.66,inside,CUST_MX_ABCV1
Now for the python script that combines both pieces together.
#!/usr/bin/env python3 import os from string import Template IMPORT = "./source.cfg" TEMPLATE = "./template.cfg" OUTPUT = "./output/output.cfg" # check for output folder os.makedirs(os.path.dirname(OUTPUT), exist_ok=True) # Read template content once, and then create a Template object with open(TEMPLATE, 'r') as f: template_content = Template(f.read()) # Open output file for writing with open(OUTPUT, 'w') as output_file: # Read each line from import file with open(IMPORT, 'r') as import_file: for line in import_file: line = line.strip() if not line: continue # skip empty lines parts = line.split(',') if len(parts) < 4: print(f"Skipping malformed line: {line}") continue VAR_SUBNET, VAR_GATEWAY, VAR_INTERFACE, VAR_DESC = parts[:4] # Substitute template components filled_template = template_content.substitute( VAR_SUBNET=VAR_SUBNET, VAR_GATEWAY=VAR_GATEWAY, VAR_INTERFACE=VAR_INTERFACE, VAR_DESC=VAR_DESC ) # Write to output file output_file.write(filled_template)
To run the script, you will need to modify the following:
IMPORT = This will contain the name and/or path of the CSV content you want to read from.
TEMPLATE = This will contain the name and/or path of the template file. This will be part of the output but containing data from INPUT.
OUTPUT = This is the obvious output file you want to have.
Once that is complete, you can either run it with the python command and reference the .py name or you can chmod +x on the .py file and run it from the command line where you are at.
Recent posts
-
-
DNS is one of those technologies that quietly underpins... Full Story
-
BGP issues on FortiGate firewalls usually trace back to... Full Story
-
Every time your laptop talks to your router, a... Full Story
-
If you've spent any time configuring NAT on a... Full Story
-
If you have spent any time configuring firewall policies... Full Story
-
High availability on FortiGate is one of those features... Full Story
-
If you've configured SD-WAN on a FortiGate, you've almost... Full Story
-
FortiLink is the management protocol that turns a FortiSwitch... Full Story
-
FortiSwitches are pretty rock solid from Mean Time Between... Full Story
-
This is a quicky tip. Have you ever gone... Full Story
-
DNS is one of those quiet pieces of internet... Full Story
-
This article is an updated version of the previous... Full Story
-
You will add ns2 as a secondary (slave) BIND9... Full Story
-
In the process of deploying my lab, I needed... Full Story
-
RFC 8805, used to be known as Self-Correcting IP... Full Story
-
Years back, I wrote an article about certificate pinning. ... Full Story
-
FortiGates have the ability to send alerts to Microsoft... Full Story
-
In this post, I am going to walk through... Full Story
-
Troubleshooting VoIP on a FortiGate can feel like trying... Full Story
-
Prior to FortiOS 7.0, there were three commands to... Full Story
-
In this post, I am going to go over... Full Story
-
What we are going to do: We are going... Full Story
-
Choosing between FGCP (FortiGate Clustering Protocol) and FGSP (FortiGate... Full Story
-
Creating a VLAN on macOS (The "Pro" Move) A... Full Story
-
This blog post explores the logic behind how macOS... Full Story
-
Pretty Fly for a Wi-Fi Tell My Wi-Fi Love... Full Story
-
Part of my daily gig is creating BoMs (Bill-of-Materials)... Full Story
-
ICMP introduces several security risks, but careful filtering, rate... Full Story
-
The command diag debug application dhcps -1 enables full... Full Story
-
In the world of FortiOS, execute tac report is... Full Story
-
LLDP; What is it The Link Layer Discovery Protocol... Full Story
-
What it actually does When you run diagnose fdsm... Full Story
-
Monkey Bites are bite-sized, high-impact security insights designed for... Full Story
-
I have run macOS in macOS with Parallels but... Full Story
-
Don't be confused with my other FortiNAC posts where... Full Story
-
This is the third session in a multi-part article... Full Story
-
Today I was configuring key-based authentication on a FortiGate... Full Story
-
Netcat, often called the "Swiss Army knife" of networking,... Full Story
-
At its core, IEEE 802.1X is a network layer... Full Story
-
In case you did not see the previous FortiNAC... Full Story
-
This is our 5th session where we are going... Full Story
-
Now that we have Wireshark installed and somewhat configured,... Full Story
-
The Philosophy of Packet Analysis Troubleshooting isn't about looking... Full Story
-
Overview FortiOS 8.0 introduces custom tags as a first-class... Full Story
-
These are two distinct mechanisms on FortiOS, and conflating... Full Story
-
Replacement messages are the pages and text blocks that... Full Story