catocli 2.1.6__py3-none-any.whl → 2.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of catocli might be problematic. Click here for more details.

catocli/Utils/cliutils.py CHANGED
@@ -85,10 +85,10 @@ def load_cli_settings():
85
85
  settings_locations = [
86
86
  # Try package resource first (for installed packages)
87
87
  lambda: json.loads(get_package_resource('catocli', 'clisettings.json')),
88
- # Try repository location (for development)
89
- lambda: json.load(open(os.path.join(os.path.dirname(__file__), '../../clisettings.json'), 'r', encoding='utf-8')),
90
88
  # Try adjacent file location (for development - new location)
91
- lambda: json.load(open(os.path.join(os.path.dirname(__file__), '../clisettings.json'), 'r', encoding='utf-8'))
89
+ lambda: json.load(open(os.path.join(os.path.dirname(__file__), '../clisettings.json'), 'r', encoding='utf-8')),
90
+ # Try repository location (for development - fallback)
91
+ lambda: json.load(open(os.path.join(os.path.dirname(__file__), '../../clisettings.json'), 'r', encoding='utf-8'))
92
92
  ]
93
93
 
94
94
  for i, load_func in enumerate(settings_locations):
@@ -112,7 +112,9 @@ def get_cli_settings_path():
112
112
  str or None: Path to the settings file if found, None otherwise
113
113
  """
114
114
  possible_paths = [
115
- # Repository location (for development)
115
+ # Adjacent file location (for development - new location)
116
+ os.path.join(os.path.dirname(__file__), '../clisettings.json'),
117
+ # Repository location (for development - fallback)
116
118
  os.path.join(os.path.dirname(__file__), '../../clisettings.json'),
117
119
  # Current directory
118
120
  os.path.join(os.getcwd(), 'clisettings.json'),
catocli/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "2.1.6"
1
+ __version__ = "2.1.8"
2
2
  __cato_host__ = "https://api.catonetworks.com/api/v1/graphql2"
@@ -237,7 +237,7 @@ def export_socket_site_to_json(args, configuration):
237
237
  nr_relay_group_name = nr_helper_fields.get('XXXXX', None)
238
238
  nr_gateway = nr_helper_fields.get('XXXXX', None)
239
239
  nr_translated_subnet = nr_helper_fields.get('XXXXX', None)
240
- # nr_internet_only = nr_helper_fields.get('XXXXX', None)
240
+ nr_internet_only = nr_helper_fields.get('XXXXX', None) # Default to None for JSON
241
241
  nr_local_ip = nr_helper_fields.get('XXXXX', None)
242
242
  nr_range_type = nr_helper_fields.get('XXXXX', None)
243
243
  # Adding logic to pre-populate with default value
@@ -271,8 +271,7 @@ def export_socket_site_to_json(args, configuration):
271
271
  cur_range['gateway'] = nr_gateway
272
272
  cur_range['range_type'] = nr_range_type
273
273
  cur_range['translated_subnet'] = nr_translated_subnet
274
- # # Not available to set for native_range via API today
275
- # cur_range['internet_only'] = nr_internet_only
274
+ cur_range['internet_only'] = nr_internet_only
276
275
  cur_range['local_ip'] = nr_local_ip # Use the calculated or original value
277
276
  cur_range['dhcp_settings'] = {
278
277
  'dhcp_type': nr_dhcp_type,
@@ -291,8 +290,7 @@ def export_socket_site_to_json(args, configuration):
291
290
  site_native_range['gateway'] = nr_gateway
292
291
  site_native_range['range_type'] = nr_range_type
293
292
  site_native_range['translated_subnet'] = nr_translated_subnet
294
- # # Not available to set for native_range via API today
295
- # site_native_range['internet_only'] = nr_internet_only
293
+ site_native_range['internet_only'] = nr_internet_only
296
294
  site_native_range['local_ip'] = nr_local_ip
297
295
  site_native_range['dhcp_settings'] = {
298
296
  'dhcp_type': nr_dhcp_type,
@@ -314,8 +312,7 @@ def export_socket_site_to_json(args, configuration):
314
312
  cur_range['gateway'] = nr_gateway
315
313
  cur_range['range_type'] = nr_range_type
316
314
  cur_range['translated_subnet'] = nr_translated_subnet
317
- # # Not available to set for native_range via API today
318
- # cur_range['internet_only'] = nr_internet_only
315
+ cur_range['internet_only'] = nr_internet_only
319
316
  cur_range['local_ip'] = nr_local_ip # Use the calculated or original value
320
317
  cur_range['dhcp_settings'] = {
321
318
  'dhcp_type': nr_dhcp_type,
@@ -594,6 +591,7 @@ def get_processed_site_data(args, configuration):
594
591
  nr_relay_group_name = None
595
592
  nr_gateway = None
596
593
  nr_translated_subnet = None
594
+ nr_internet_only = None # Default to None for JSON
597
595
  nr_local_ip = None
598
596
  nr_range_type = "VLAN" if nr_vlan != None else "Direct"
599
597
 
@@ -612,7 +610,7 @@ def get_processed_site_data(args, configuration):
612
610
  cur_range = {
613
611
  'id': range_id, 'name': range_name, 'subnet': nr_subnet, 'vlan': nr_vlan,
614
612
  'mdns_reflector': nr_mdns_reflector, 'gateway': nr_gateway, 'range_type': nr_range_type,
615
- 'translated_subnet': nr_translated_subnet, 'local_ip': nr_local_ip,
613
+ 'translated_subnet': nr_translated_subnet, 'internet_only': nr_internet_only, 'local_ip': nr_local_ip,
616
614
  'dhcp_settings': {
617
615
  'dhcp_type': nr_dhcp_type, 'ip_range': nr_ip_range, 'relay_group_id': None,
618
616
  'relay_group_name': nr_relay_group_name, 'dhcp_microsegmentation': nr_dhcp_microsegmentation
@@ -627,6 +625,7 @@ def get_processed_site_data(args, configuration):
627
625
  site_native_range['gateway'] = nr_gateway
628
626
  site_native_range['range_type'] = nr_range_type
629
627
  site_native_range['translated_subnet'] = nr_translated_subnet
628
+ site_native_range['internet_only'] = nr_internet_only
630
629
  site_native_range['local_ip'] = nr_local_ip
631
630
  site_native_range['dhcp_settings'] = {
632
631
  'dhcp_type': nr_dhcp_type, 'ip_range': nr_ip_range, 'relay_group_id': None,
@@ -638,7 +637,7 @@ def get_processed_site_data(args, configuration):
638
637
  cur_range = {
639
638
  'id': range_id, 'name': range_name, 'subnet': nr_subnet, 'vlan': nr_vlan,
640
639
  'mdns_reflector': nr_mdns_reflector, 'gateway': nr_gateway, 'range_type': nr_range_type,
641
- 'translated_subnet': nr_translated_subnet, 'local_ip': nr_local_ip,
640
+ 'translated_subnet': nr_translated_subnet, 'internet_only': nr_internet_only, 'local_ip': nr_local_ip,
642
641
  'dhcp_settings': {
643
642
  'dhcp_type': nr_dhcp_type, 'ip_range': nr_ip_range, 'relay_group_id': None,
644
643
  'relay_group_name': nr_relay_group_name, 'dhcp_microsegmentation': nr_dhcp_microsegmentation
@@ -857,7 +856,7 @@ def export_network_ranges_to_csv(site, args, account_id):
857
856
  'lan_interface_id', 'lan_interface_name', 'lan_interface_dest_type', 'is_native_range', 'lan_interface_index',
858
857
  # Network Range columns (populated on all rows)
859
858
  'network_range_id', 'network_range_name', 'subnet', 'vlan', 'mdns_reflector',
860
- 'gateway', 'range_type', 'translated_subnet', 'local_ip',
859
+ 'gateway', 'range_type', 'translated_subnet', 'internet_only', 'local_ip',
861
860
  'dhcp_type', 'dhcp_ip_range', 'dhcp_relay_group_id', 'dhcp_relay_group_name', 'dhcp_microsegmentation'
862
861
  ]
863
862
 
@@ -911,6 +910,7 @@ def export_network_ranges_to_csv(site, args, account_id):
911
910
  'gateway': network_range.get('gateway', ''),
912
911
  'range_type': network_range.get('range_type', ''),
913
912
  'translated_subnet': network_range.get('translated_subnet', ''),
913
+ 'internet_only': network_range.get('internet_only', ''),
914
914
  'local_ip': network_range.get('local_ip', ''),
915
915
  'dhcp_type': network_range.get('dhcp_settings', {}).get('dhcp_type', ''),
916
916
  'dhcp_ip_range': network_range.get('dhcp_settings', {}).get('ip_range', ''),
@@ -958,6 +958,7 @@ def export_network_ranges_to_csv(site, args, account_id):
958
958
  'gateway': '',
959
959
  'range_type': '',
960
960
  'translated_subnet': '',
961
+ 'internet_only': '',
961
962
  'local_ip': '',
962
963
  'dhcp_type': '',
963
964
  'dhcp_ip_range': '',
@@ -992,8 +993,9 @@ def export_network_ranges_to_csv(site, args, account_id):
992
993
  'gateway': network_range.get('gateway', ''),
993
994
  'range_type': network_range.get('range_type', ''),
994
995
  'translated_subnet': network_range.get('translated_subnet', ''),
995
- 'local_ip': network_range.get('local_ip', ''),
996
- 'dhcp_type': network_range.get('dhcp_settings', {}).get('dhcp_type', ''),
996
+ 'internet_only': network_range.get('internet_only', ''),
997
+ 'local_ip': network_range.get('local_ip', ''),
998
+ 'dhcp_type': network_range.get('dhcp_settings', {}).get('dhcp_type', ''),
997
999
  'dhcp_ip_range': network_range.get('dhcp_settings', {}).get('ip_range', ''),
998
1000
  'dhcp_relay_group_id': network_range.get('dhcp_settings', {}).get('relay_group_id', ''),
999
1001
  'dhcp_relay_group_name': network_range.get('dhcp_settings', {}).get('relay_group_name', ''),
@@ -695,23 +695,30 @@ def loadJSON(file):
695
695
  Enhanced JSON loading with better error handling and path resolution
696
696
  """
697
697
  module_dir = os.path.dirname(__file__)
698
- # Navigate up two directory levels (from parsers/ to catocli/ to root)
699
- module_dir = os.path.dirname(module_dir) # Go up from parsers/
700
- module_dir = os.path.dirname(module_dir) # Go up from catocli/
701
698
 
702
- try:
699
+ # Special handling for clisettings.json - it's in catocli/ directory
700
+ if file == "clisettings.json":
701
+ # From parsers/ go up to catocli/ and look for clisettings.json
702
+ catocli_dir = os.path.dirname(module_dir) # Go up from parsers/ to catocli/
703
+ file_path = os.path.join(catocli_dir, file)
704
+ else:
705
+ # For other files (like models), navigate up two directory levels (from parsers/ to catocli/ to root)
706
+ module_dir = os.path.dirname(module_dir) # Go up from parsers/
707
+ module_dir = os.path.dirname(module_dir) # Go up from catocli/
703
708
  file_path = os.path.join(module_dir, file)
709
+
710
+ try:
704
711
  with open(file_path, 'r') as data:
705
712
  config = json.load(data)
706
713
  return config
707
714
  except FileNotFoundError:
708
- logging.error(f"File \"{os.path.join(module_dir, file)}\" not found.")
715
+ logging.error(f"File \"{file_path}\" not found.")
709
716
  raise
710
717
  except json.JSONDecodeError as e:
711
- logging.error(f"Invalid JSON in file \"{os.path.join(module_dir, file)}\": {e}")
718
+ logging.error(f"Invalid JSON in file \"{file_path}\": {e}")
712
719
  raise
713
720
  except Exception as e:
714
- logging.error(f"Error loading file \"{os.path.join(module_dir, file)}\": {e}")
721
+ logging.error(f"Error loading file \"{file_path}\": {e}")
715
722
  raise
716
723
 
717
724
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: catocli
3
- Version: 2.1.6
3
+ Version: 2.1.8
4
4
  Summary: Cato Networks cli wrapper for the GraphQL API.
5
5
  Home-page: https://github.com/Cato-Networks/cato-cli
6
6
  Author: Cato Networks
@@ -1,12 +1,12 @@
1
- catocli/__init__.py,sha256=VG2jsKAa0bPnfVUC7WJE8-vjFBVX26ASFCoPra0SxJU,84
1
+ catocli/__init__.py,sha256=ZhBcDUk-7qfuMgqngq1dhNqPKdjTBzu15-UjAJQxl8I,84
2
2
  catocli/__main__.py,sha256=6Z0ns_k_kUcz1Qtrn1u7UyUnqB-3e85jM_nppOwFsv4,217
3
3
  catocli/clisettings.json,sha256=Xxdm9qaeKQaK2hk35PeV5OljSYOJylqJfsgPzaj0D2s,1029
4
4
  catocli/Utils/clidriver.py,sha256=29H5qNLW6JUi4jJbGvdr06QihC4n7yr0s7fGpLY8S4c,15965
5
- catocli/Utils/cliutils.py,sha256=ulXjQJHVHH-JFAAN7q6HkAa1EH8vvKX2IGp6dZKwUtQ,6784
5
+ catocli/Utils/cliutils.py,sha256=SxKaqjn2eU0NDh-bJF8WMQx3W4jBFXEDDk6eGzGlbio,6944
6
6
  catocli/Utils/csv_formatter.py,sha256=4MnFlsau-KfeflJGTBAZ98wFt0QKWpAKsIPNeFV3rzk,23038
7
7
  catocli/Utils/profile_manager.py,sha256=Stch-cU2rLA7r07hETIRsvG_JxpQx3Q42QwpfD7Qd2I,6379
8
8
  catocli/Utils/version_checker.py,sha256=tCtsCn7xxMIxOm6cWJSA_yPt0j4mNMK4iWSJej0yM6A,6696
9
- catocli/parsers/customParserApiClient.py,sha256=Xpiv9wh3bkZgz6bzmcGJZ099LE4TXdIefBnZEsyMEgk,69387
9
+ catocli/parsers/customParserApiClient.py,sha256=21McO4QYY7_jLgqLEug1fnVf-P9XdFNBIVsZEVyxep8,69699
10
10
  catocli/parsers/configure/__init__.py,sha256=Kq4OYGq_MXOQBHm8vxNkzJqCXp7zremYBfQ4Ai3_Lb4,3286
11
11
  catocli/parsers/configure/configure.py,sha256=GyaOeuf0ZK3-wsZaczmO1OsKVJiPK04h6iI1u-EaKQc,12217
12
12
  catocli/parsers/custom/README.md,sha256=UvCWAtF3Yh0UsvADb0ve1qJupgYHeyGu6V3Z0O5HEvo,8180
@@ -15,7 +15,7 @@ catocli/parsers/custom/customLib.py,sha256=Nv-agL_ewpe1x6GbwWCRb_Ey-NVW_w9L6qWwE
15
15
  catocli/parsers/custom/export_rules/__init__.py,sha256=vst8auriTCLwy5AT2_ySM2puq3PIg920ZWa5yy03K_8,1813
16
16
  catocli/parsers/custom/export_rules/export_rules.py,sha256=gXig4NC29yC5nW48ri-j0FEnaTz_kxKiuLF5y-5fZ_4,15646
17
17
  catocli/parsers/custom/export_sites/__init__.py,sha256=z8K5IIq2N-muOTuDfEEE4pUiOaITEvhfKCLzB9e5Rok,2140
18
- catocli/parsers/custom/export_sites/export_sites.py,sha256=OR2rJ7a75ks1FX1ZcKLf9NACZOujIoEV1zUlaXiJh8U,66583
18
+ catocli/parsers/custom/export_sites/export_sites.py,sha256=61rqH_QBNvYEvX-x7QkMxvD33d7BG96pXpRP-7FrzEQ,66771
19
19
  catocli/parsers/custom/import_rules_to_tf/__init__.py,sha256=jFCFceFv8zDW7nGLZOXkFE6NXAMPYRwKQwTbhSawYdM,3908
20
20
  catocli/parsers/custom/import_rules_to_tf/import_rules_to_tf.py,sha256=WlyTDxUtWchu9CDs73ILHDfNXCAh7jFARBEKk5WWhwM,18714
21
21
  catocli/parsers/custom/import_sites_to_tf/__init__.py,sha256=1ayoaaKIxWf5JBN62CO9F7-yaP9MqizTBCedqCyEc4k,4339
@@ -366,7 +366,7 @@ catocli/parsers/query_xdr_stories/README.md,sha256=eQJ81YiergQEhABkxi1yyzE_UXtS0
366
366
  catocli/parsers/query_xdr_story/README.md,sha256=_JYyMJ8GYOZ1dv61QqLyhVoEubXAm2p3QqFKdfohQOE,813
367
367
  catocli/parsers/raw/README.md,sha256=qvDLcg7U12yqacIQStOPtkqTsTLltJ06SSVmbqvlZhY,739
368
368
  catocli/parsers/raw/__init__.py,sha256=fiSzQzNSG3vje-eEXuOcdhuL8pyavkufocOJumjdFXs,1356
369
- catocli-2.1.6.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
369
+ catocli-2.1.8.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
370
370
  graphql_client/__init__.py,sha256=2nxD4YsWoOnALXi5cXbmtIN_i0NL_eyDTQRTxs52mkI,315
371
371
  graphql_client/api_client.py,sha256=2Rc1Zo1xH9Jnk1AO68kLSofTShkZwSVF-WkVtczfIc4,5786
372
372
  graphql_client/api_client_types.py,sha256=dM3zl6FA5SSp6nR6KmLfTL1BKaXX9uPMCZAm4v_FiUs,11569
@@ -640,7 +640,7 @@ models/query.socketPortMetricsTimeSeries.json,sha256=PHT_x1YaP8NQpaHXA4VWsZ4kC7W
640
640
  models/query.subDomains.json,sha256=BkReQmylHZMv1iIakX984na9EKd_m0sPC0a-COsCxRI,7036
641
641
  models/query.xdr.stories.json,sha256=a3rQ9j8Ru-iidGztB1yFnYSTTlJpPcDkhoI3phMdByk,714509
642
642
  models/query.xdr.story.json,sha256=A3M-_cBIfup6vxG5nvAEH0EGRdEwkg_-G2lQR6eveB8,152375
643
- schema/catolib.py,sha256=7Yw_hiOIi5zAm-2vfsp32hNHp-Ut1nHn4_VJ64qDsHE,74779
643
+ schema/catolib.py,sha256=D2uCN6tTBbtHuIxdQBJQR5NodxiIgnhemrTpkaU4hlo,74803
644
644
  schema/importSchema.py,sha256=LvXjylxsOWDcdceDE8nazOG1xcstxLGwyoVWSzW2Eg4,2508
645
645
  scripts/catolib.py,sha256=6QaGZaHj1waZuta8gUFsfXmyoDiLabpU9gwnyq7pSXg,2145
646
646
  scripts/export_if_rules_to_json.py,sha256=sTYzUbAtiFTy9vKpnyO8Sljshvg0qKd2gadanpeRVAM,10076
@@ -688,8 +688,8 @@ vendor/urllib3/util/timeout.py,sha256=4eT1FVeZZU7h7mYD1Jq2OXNe4fxekdNvhoWUkZusRp
688
688
  vendor/urllib3/util/url.py,sha256=wHORhp80RAXyTlAIkTqLFzSrkU7J34ZDxX-tN65MBZk,15213
689
689
  vendor/urllib3/util/util.py,sha256=j3lbZK1jPyiwD34T8IgJzdWEZVT-4E-0vYIJi9UjeNA,1146
690
690
  vendor/urllib3/util/wait.py,sha256=_ph8IrUR3sqPqi0OopQgJUlH4wzkGeM5CiyA7XGGtmI,4423
691
- catocli-2.1.6.dist-info/METADATA,sha256=aSGkRqhkRgpLCvfxMZJoFECo8I3e9LtATzUfAPC0lEw,1286
692
- catocli-2.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
693
- catocli-2.1.6.dist-info/entry_points.txt,sha256=p4k9Orre6aWcqVrNmBbckmCs39h-1naMxRo2AjWmWZ4,50
694
- catocli-2.1.6.dist-info/top_level.txt,sha256=F4qSgcjcW5wR9EFrO8Ud06F7ZQGFr04a9qALNQDyVxU,52
695
- catocli-2.1.6.dist-info/RECORD,,
691
+ catocli-2.1.8.dist-info/METADATA,sha256=QFHIdGnW6t8YqVLR6iPbXEtG8MyLYXlIPuEN1lvwDJw,1286
692
+ catocli-2.1.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
693
+ catocli-2.1.8.dist-info/entry_points.txt,sha256=p4k9Orre6aWcqVrNmBbckmCs39h-1naMxRo2AjWmWZ4,50
694
+ catocli-2.1.8.dist-info/top_level.txt,sha256=F4qSgcjcW5wR9EFrO8Ud06F7ZQGFr04a9qALNQDyVxU,52
695
+ catocli-2.1.8.dist-info/RECORD,,
schema/catolib.py CHANGED
@@ -94,7 +94,7 @@ def parseSchema(schema):
94
94
  print(" - Loading settings and initializing...")
95
95
 
96
96
  # Load settings to get childOperationParent and childOperationObjects configuration
97
- settings = loadJSON("../clisettings.json")
97
+ settings = loadJSON("../catocli/clisettings.json")
98
98
  childOperationParent = settings.get("childOperationParent", {})
99
99
  childOperationObjects = settings.get("childOperationObjects", {})
100
100
 
@@ -968,7 +968,7 @@ def writeOperationParsers(catoApiSchema):
968
968
  parserMapping = {"query":{},"mutation":{}}
969
969
 
970
970
  # Load settings to get CSV-supported operations
971
- settings = loadJSON("../clisettings.json")
971
+ settings = loadJSON("../catocli/clisettings.json")
972
972
  csv_supported_operations = settings.get("queryOperationCsvOutput", {})
973
973
 
974
974
  ## Write the raw query parser ##
@@ -1363,7 +1363,7 @@ def renderSubParser(subParser, parentParserPath):
1363
1363
  if not isinstance(subParser, dict):
1364
1364
  return ""
1365
1365
 
1366
- settings = loadJSON("../clisettings.json")
1366
+ settings = loadJSON("../catocli/clisettings.json")
1367
1367
  csv_supported_operations = settings.get("queryOperationCsvOutput", {})
1368
1368
 
1369
1369
  cliDriverStr = f"""