docs/py_2_xlsx.py
Ron Stone 88d7214027 Generate port referece from source
- Tidy tox.ini

Story: 2011201

Change-Id: I62ed4bd045ce49d53b863d63b3d1301fe9ab6b5b
Signed-off-by: Ron Stone <ronald.stone@windriver.com>
2024-09-10 18:21:58 +00:00

125 lines
4.0 KiB
Python
Executable File

import re
import os
import sys
import pandas as pd
from _p_columns import columns, port_index, src_index, net_index
df = pd.DataFrame(columns=columns)
def convert_to_uppercase(input_string):
return input_string.upper()
# Look up a port number assigned to a constant in another file
def find_port_number(filename, search_string):
found_port = None
with open(filename, 'r') as file:
for line in file:
match = re.search(rf'{search_string}\s*=\s*(\d+)', line)
if match:
found_port = int(match.group(1))
break
return found_port
def remove_prefix(input_string):
# Find the index of the first period
period_index = input_string.find('.')
if period_index != -1:
return input_string[period_index + 1:]
else:
# Return the original string
return input_string
def delete_file(file_path):
try:
# Check if the file exists
if os.path.exists(file_path):
# Delete the file
os.remove(file_path)
print(f"File '{file_path}' deleted successfully.")
else:
print(f"File '{file_path}' does not exist.")
except Exception as e:
print(f"An error occurred: {e}")
def is_numeric(array, index):
array = [element.strip() for element in array]
# Check if the array has an integer at the element to be tested
if len(array) > index:
return array[index].isnumeric()
else:
return False
def prepend_string(main_string, prepend_string):
return prepend_string + main_string
def append_string(*args, **kwargs):
return prepend_string(*args, **kwargs)
def extract_docu_comments(input_file, out_file):
sect = "N/A"
prot = "N/A"
with open(input_file, 'r') as file:
lines = file.readlines()
for line in lines:
match = re.search(r'^(\S+)\s*=\s*(\{|\\)', line)
if match:
sect = match.group(1).strip()
sect = append_string(',', sect)
prot = "N/A, "
match = re.search(r'("tcp":|"udp":)', line)
if match:
prot = match.group(1).strip()
prot = prot.replace(':', '').strip()
prot = convert_to_uppercase(prot)
prot = append_string(',', prot)
# Check if the line contains a comment starting with 'docu' followed by
# a colon
if '#' in line and 'docu:' in line.lstrip():
docu_line = re.sub(r',?\s*#\s*(noqa: E501)?\s+docu:\s*', ',', line).strip()
docu_line = docu_line.replace(':', ',').strip()
docu_line = prepend_string(docu_line, prot)
docu_line = prepend_string(docu_line, sect)
docu_line = docu_line.replace('"', '').strip()
column_values = docu_line.split(',')
if not is_numeric(column_values, port_index):
const = column_values[port_index]
column_values[port_index] = find_port_number(const_file, remove_prefix(column_values[port_index]))
print("Replaced " + const.strip() + " with " + str(column_values[port_index]))
if 'OAM' in column_values[src_index]:
column_values[net_index] = 'oam'
# print("Processing: " + line)
df.loc[len(df)] = column_values
ports_column_name = df.columns[port_index]
df[ports_column_name] = pd.to_numeric(df[ports_column_name], errors='coerce')
df.to_excel(excel_file, index=False)
print(f"Ports list successfully extracted to '{excel_file}'.")
if len(sys.argv) != 4:
print(f"""\
This script reads a python file to create an Excel sheet of firewall
port definitions.
Usage: {os.path.basename(__file__)} <ports_file> <constants_file> <excel_file>
Example: python ./py_2_xlsx.py platform_firewall.py constants.py FW_PORTS.xlsx
""")
sys.exit(1)
input_file = str(sys.argv[1])
const_file = str(sys.argv[2])
excel_file = str(sys.argv[3])
# Extract lines with docu comments
extract_docu_comments(input_file, excel_file)