11import ipaddress
22
3+ from fortilib import remove_empty_dict_values
34from fortilib .base import FortigateNamedObject
45
56
@@ -9,12 +10,24 @@ class FortigatePhase2KeylifeType:
910 BOTH = "both"
1011
1112
13+ class FortigatePhase2AddressType :
14+ IP = "ip"
15+ RANGE = "range"
16+ SUBNET = "subnet"
17+
18+
1219class FortigatePhase2Interface (FortigateNamedObject ):
1320 """Fortigate object for phase2 interfaces.
1421
1522 :ivar phase1_name: Name of phase1
23+ :ivar src_start_ip: Source address e.g. 10.0.0.10
24+ :ivar src_end_ip: Source address e.g. 10.0.0.20
1625 :ivar src_subnet: Source subnet e.g. 10.0.0.0/8
26+ :ivar src_addr_type: Source address type e.g. subnet
27+ :ivar dst_start_ip: Destination address e.g. 192.168.100.10
28+ :ivar dst_end_ip: Destination address e.g. 192.168.100.20
1729 :ivar dst_subnet: Destination subnet e.g. 192.168.100.0/24
30+ :ivar dst_addr_type: Destination address type e.g. subnet
1831 :ivar dhgrp: Diffie-Hellman group e.g. 20
1932 :ivar auto_negotiate: Auto-negotiate enable/disable (default: "disable")
2033 :ivar keepalive: Keepalive enable/disable (default: "disable")
@@ -32,6 +45,16 @@ def __init__(self):
3245 self .phase1_name : str = ""
3346 self .dst_subnet : ipaddress .IPv4Network = None
3447 self .src_subnet : ipaddress .IPv4Network = None
48+ self .dst_start_ip : ipaddress .IPv4Address = None
49+ self .dst_end_ip : ipaddress .IPv4Address = None
50+ self .src_start_ip : ipaddress .IPv4Address = None
51+ self .src_end_ip : ipaddress .IPv4Address = None
52+ self .dst_addr_type : FortigatePhase2AddressType = (
53+ FortigatePhase2AddressType .SUBNET
54+ )
55+ self .src_addr_type : FortigatePhase2AddressType = (
56+ FortigatePhase2AddressType .SUBNET
57+ )
3558 self .dhgrp : str = ""
3659 self .auto_negotiate : str = "disable"
3760 self .keepalive : str = "disable"
@@ -58,18 +81,50 @@ def populate(self, object_data: dict):
5881 super ().populate (object_data )
5982
6083 self .phase1_name = object_data .get ("phase1name" , self .phase1_name )
61- self .dst_subnet = ipaddress .ip_network (
62- "{}/{}" .format (
63- object_data .get ("dst-subnet" , "0.0.0.0/0" ).split ()[0 ],
64- object_data .get ("dst-subnet" , "0.0.0.0/0" ).split ()[1 ],
65- )
84+ self .dst_addr_type = object_data .get (
85+ "dst-addr-type" , FortigatePhase2AddressType .SUBNET
6686 )
67- self .src_subnet = ipaddress .ip_network (
68- "{}/{}" .format (
69- object_data .get ("src-subnet" , "0.0.0.0/0" ).split ()[0 ],
70- object_data .get ("src-subnet" , "0.0.0.0/0" ).split ()[1 ],
71- )
87+ self .src_addr_type = object_data .get (
88+ "src-addr-type" , FortigatePhase2AddressType .SUBNET
7289 )
90+ if self .dst_addr_type == "subnet" :
91+ self .dst_subnet = ipaddress .ip_network (
92+ "{}/{}" .format (
93+ object_data .get ("dst-subnet" , "0.0.0.0/0" ).split ()[0 ],
94+ object_data .get ("dst-subnet" , "0.0.0.0/0" ).split ()[1 ],
95+ )
96+ )
97+
98+ if self .src_addr_type == FortigatePhase2AddressType .SUBNET :
99+ self .src_subnet = ipaddress .ip_network (
100+ "{}/{}" .format (
101+ object_data .get ("src-subnet" , "0.0.0.0/0" ).split ()[0 ],
102+ object_data .get ("src-subnet" , "0.0.0.0/0" ).split ()[1 ],
103+ )
104+ )
105+ if (
106+ self .dst_addr_type == FortigatePhase2AddressType .IP
107+ or self .dst_addr_type == FortigatePhase2AddressType .RANGE
108+ ):
109+ self .dst_start_ip = ipaddress .ip_address (
110+ object_data .get ("dst-start-ip" , "0.0.0.0" )
111+ )
112+ if self .dst_addr_type == FortigatePhase2AddressType .RANGE :
113+ self .dst_end_ip = ipaddress .ip_address (
114+ object_data .get ("dst-end-ip" , "0.0.0.0" )
115+ )
116+ if (
117+ self .src_addr_type == FortigatePhase2AddressType .IP
118+ or self .src_addr_type == FortigatePhase2AddressType .RANGE
119+ ):
120+ self .src_start_ip = ipaddress .ip_address (
121+ object_data .get ("src-start-ip" , "0.0.0.0" )
122+ )
123+ if self .src_addr_type == FortigatePhase2AddressType .RANGE :
124+ self .src_end_ip = ipaddress .ip_address (
125+ object_data .get ("src-end-ip" , "0.0.0.0" )
126+ )
127+
73128 self .dhgrp = object_data .get ("dhgrp" , self .dhgrp )
74129 self .auto_negotiate = object_data .get (
75130 "auto-negotiate" , self .auto_negotiate
@@ -94,36 +149,54 @@ def render(self) -> dict:
94149 {
95150 "name": "vpn_phase2",
96151 "phase1name": "vpn_phase1",
152+ "dst-addr-type": "subnet"
97153 "dst-subnet": "192.168.100.0/24",
154+ "dst-start-ip": "192.168.100.1",
155+ "dst-end-ip": "192.168.100.128",
156+ "src-addr-type": "subnet"
98157 "src-subnet": "10.0.0.0/8",
158+ "src-start-ip": "10.0.0.1",
159+ "src-end-ip": "10.0.0.128",
99160 "dhgrp": "20",
100- "pfs":"enable",
101- "replay":"enable",
102- "keepalive":"disable",
103- "auto-negotiate":"enable",
104- "keylifeseconds":14400,
105- "keylifekbs":5120,
106- "keylife-type":"seconds",
161+ "pfs": "enable",
162+ "replay": "enable",
163+ "keepalive": "disable",
164+ "auto-negotiate": "enable",
165+ "keylifeseconds": 14400,
166+ "keylifekbs": 5120,
167+ "keylife-type": "seconds",
107168 "proposal": "chacha20poly1305 aes256-sha512 aes256gcm",
108169 "comments": "",
109170 },
110171 """
111- return {
112- "name" : self .name ,
113- "phase1name" : self .phase1_name ,
114- "dst-subnet" : str (self .dst_subnet ),
115- "src-subnet" : str (self .src_subnet ),
116- "dhgrp" : self .dhgrp ,
117- "pfs" : self .pfs ,
118- "replay" : self .replay ,
119- "keepalive" : self .keepalive ,
120- "auto-negotiate" : self .auto_negotiate ,
121- "keylifeseconds" : self .keylife_seconds ,
122- "keylifekbs" : self .keylife_kbs ,
123- "keylife-type" : self .keylife_type ,
124- "proposal" : self .proposal ,
125- "comments" : self .comment ,
126- }
172+ return remove_empty_dict_values (
173+ {
174+ "name" : self .name ,
175+ "phase1name" : self .phase1_name ,
176+ "dst-addr-type" : self .dst_addr_type ,
177+ "dst-subnet" : str (self .dst_subnet ) if self .dst_subnet else "" ,
178+ "dst-start-ip" : (
179+ str (self .dst_start_ip ) if self .dst_start_ip else ""
180+ ),
181+ "dst-end-ip" : str (self .dst_end_ip ) if self .dst_end_ip else "" ,
182+ "src-addr-type" : self .src_addr_type ,
183+ "src-subnet" : str (self .src_subnet ) if self .src_subnet else "" ,
184+ "src-start-ip" : (
185+ str (self .src_start_ip ) if self .src_start_ip else ""
186+ ),
187+ "src-end-ip" : str (self .src_end_ip ) if self .src_end_ip else "" ,
188+ "dhgrp" : self .dhgrp ,
189+ "pfs" : self .pfs ,
190+ "replay" : self .replay ,
191+ "keepalive" : self .keepalive ,
192+ "auto-negotiate" : self .auto_negotiate ,
193+ "keylifeseconds" : self .keylife_seconds ,
194+ "keylifekbs" : self .keylife_kbs ,
195+ "keylife-type" : self .keylife_type ,
196+ "proposal" : self .proposal ,
197+ "comments" : self .comment ,
198+ }
199+ )
127200
128201 def __repr__ (self ):
129- return f"{ self .__class__ .__name__ } { self .name } Phase1 Name: { self .phase1_name } SRC: { self . src_subnet } DST: { self . dst_subnet } "
202+ return f"{ self .__class__ .__name__ } { self .name } Phase1 Name: { self .phase1_name } "
0 commit comments