Skip to content
Snippets Groups Projects
Commit fa220f42 authored by martiivGylden's avatar martiivGylden
Browse files

Parsing table finished

parent 4a0ccced
Branches
No related tags found
No related merge requests found
......@@ -20,6 +20,15 @@ textArea13 = "Text Area 13"
textArea14 = "Text Area 14"
textArea15 = "Text Area 15"
textArea16 = "Text Area 16"
textArea17 = "Text Area 17"
textArea18 = "Text Area 18"
textArea19 = "Text Area 19"
textArea20 = "Text Area 20"
textArea21 = "Text Area 21"
textArea22 = "Text Area 22"
textArea23 = "Text Area 23"
textArea24 = "Text Area 24"
textArea25 = "Text Area 25"
#Mapped fields for Threat component
......@@ -86,3 +95,28 @@ BowtieDynamicType = textArea3 # The bowtie dynamics
From = "Line Source"
To = "Line Destination"
# Table
# ? Column names
Er_ID = "ER ID"
Bowtie_ID = "Bowtie ID"
Metric_ID = "Metric ID"
Metric_Name = "Metric Name"
Value = "Value"
Measure_date = "Measure Date"
Frequency = "Frequency"
Measurement_guide = "Measurement guide"
# Column mapping
ErColumn = textArea1
BowTieColumn = textArea2
MetricColumn = textArea3
MetricNameColumn = textArea10
ValueColumn = textArea13
MeasureDateColumn = textArea16
FrequencyColumn = textArea19
MeasurementGuideColumn = textArea22
# Column locations
# ! Edge case: The first entries have irregular placement and needs specialized values
......@@ -3,33 +3,37 @@ import ERFormatConstants as const
import components as component
import dynamics as dynamic
import logging as log
import matrices as matrix
# Function will parse a csv file and extract the necessary information, this is step 1 of the parse
def parseDiagramFile(csvFile):
df = pd.read_csv(csvFile)
df.drop(["Shape Library", "Page ID", "Contained By", "Group", "Comments", "property 1"], axis=1, inplace=True) #Removing unecessary data
matrix.parseTable(df) #Parse the table
return
# List containing all threats and their descriptions
threats = {}
#threats = parseThreats(df, threats)
threats = parseThreats(df, threats)
#List containing all consequences
consequences = {}
#consequences = parseConsequences(df, consequences)
# ER components
erComponents = {}
consequences = parseConsequences(df, consequences)
# Dynamic components
dynamics = {}
#List containing all metrics
metrics = []
#List containing all attacks
attacks = []
metrics = []
parseDynamic(df, metrics, dynamics)
print("Number of threats: ", len(threats))
print("Number of consequences: ", len(consequences))
print("Number of dynamics: ", len(dynamics))
print("Number of metrics: ", len(metrics))
def parseThreats(df, threatDict):
for i in range(len(df)):
......@@ -123,8 +127,7 @@ def parseDynamic(df, metricList, dynamicsDict):
erDynamic.associatER(df)
dynamicsDict[df.Id[i]] = erDynamic
print("Number of dynamics: ", len(dynamicsDict))
return metricList, dynamicsDict
def extractMetrics(df, index, startRange):
for j in range(startRange, len(df.columns),2): # Parse all text areas to find metrics
......
Id,Name,Shape Library,Page ID,Contained By,Group,Line Source,Line Destination,Source Arrow,Destination Arrow,Status,Text Area 1,Text Area 2,Text Area 3,Text Area 4,Text Area 5,Text Area 6,Text Area 7,Text Area 8,Text Area 9,Text Area 10,Text Area 11,Text Area 12,Text Area 13,Text Area 14,Text Area 15,Text Area 16,Text Area 17,Text Area 18,Text Area 19,Text Area 20,Text Area 21,Text Area 22,Text Area 23,Text Area 24,Text Area 25,Text Area 26,Text Area 27,Text Area 28,Text Area 29,Text Area 30,Text Area 31,Text Area 32,Text Area 33,Text Area 34,Text Area 35,Text Area 36,Text Area 37,Text Area 38,Text Area 39,Text Area 40,Text Area 41,Text Area 42,Text Area 43,Text Area 44,Text Area 45,Text Area 46,Text Area 47,Text Area 48,Text Area 49,Text Area 50,Text Area 51,Text Area 52,Text Area 53,Text Area 54,Text Area 55,Text Area 56,Text Area 57,Text Area 58,Text Area 59,Text Area 60,Text Area 61,Text Area 62,Text Area 63,Text Area 64,Text Area 65,Text Area 66,Text Area 67,Text Area 68,Text Area 69,Text Area 70,Text Area 71,Text Area 72,Text Area 73,Text Area 74,Text Area 75,Text Area 76,Text Area 77,Text Area 78,Text Area 79,Text Area 80,Text Area 81,Text Area 82,Text Area 83,Text Area 84,Text Area 85,Text Area 86,Text Area 87,Text Area 88,Text Area 89,Text Area 90,Text Area 91,Text Area 92,Text Area 93,Text Area 94,Text Area 95,Text Area 96,Comments,property 1
1,Document,,,,,,,,,Draft,Thesis Bow-Tie and architecture,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
108,Table,Tables,2,,,,,,,,ER ID,Bowtie ID,Metric ID,ERID1,BowtieID1,MetricID1,ERID2,BowtieID2,MetricID2,Metric name,Name1,Name2,Value,Value1,Value2,Measure date,Date1,Date2,Frequency,Freq1,Freq2,Measurement guide,Guide1,Guide2,ERID3,EnBowtieID3,MetricID3,Name3,Value3,Date3,Freq3,Guide3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,,,,,,,,,,,,,,,,,,
This diff is collapsed.
This diff is collapsed.
......@@ -26,3 +26,8 @@ Preceeding the evaluation a new iteration of technology research will be started
The focus of the annotation will be on risks and aspects related to software supply chains.
The method will use specialized Entity relationship components to annotate the bow tie risk models and architecture diagram, this annotation will facilitate linkage between an entity relationship diagram of a software supply chain and the bow tie risk models associated with it.
All resulting in a method which can help in determine which metrics one should observe to pick up on changes in the risk landscape of the software supply chain facilitating dynamic risk management.
Tabell:
Rad 1 to og 3 Er kolonner
Rad
\ No newline at end of file
103,Table,Tables,2,,,,,,,,ID,Code sign attacks,ID,CS1,Dead account attack,H1,CS2,Phising attack,H2,CS3,Authentication exploit,H3,Build system attack,OS3,Package creation attack,,,,,OS4,Typosquat attack,,,,,OS5,Combosquat attack,,,,,,,Hijack attacks ,ID,Open source attacks,Centralized Network attack,OS1,Package injection attack,Software update attack,OS2,Legacy code attack,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ER ID Bowtie ID Metric ID
ID of the relationship containing the metric, Id of the threat or consequence in the bowtie model, ID of the metric,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Metric name,Value,Measure Date,Frequency,Measurement guide,Name of the metric,Value of the metric,When the measurement was taken,How often the measurement should be taken,How to take the measurement,,,,,,,
import dynamics as dyn
import diagramParser as parse
def main():
dynamicMetricsBowtie = [] # List of metrics for the bowtie model
dynamicMetricsArchitecture = [] # List of metrics for the architecture
parse.parseDiagramFile('diagrams/Thesis Bow-Tie and architecture - Meta model.csv') # Parse the diagram
#parse.parseDiagramFile('diagrams/Thesis Bow-Tie and architecture - Meta model-2.csv') # Parse the diagram
parse.parseDiagramFile('diagrams/TableTest2.csv') # Parse the diagram
......
import pandas as pd
import ERFormatConstants as const
def parseTable(df):
cols = [const.Er_ID, const.Bowtie_ID, const.Metric_ID, const.Metric_Name, const.Value, const.Measure_date, const.Frequency ,const.Measurement_guide]
table = df.loc[df[const.Name]=='Table'] # Defines the table
matrics = pd.DataFrame(columns=cols)
# ! Parsing the first row of the table which has a fucked structure because lucidchart is garbage : )
erID1 = table[const.textArea4].item() # Define the ER ID
BowTieID1 = table[const.textArea5].item() # Define the Bowtie ID
MetricID1 = table[const.textArea6].item() # Define the Metric ID
MetricName1 = table[const.textArea11].item() # Define the Metric Name
Value1 = table[const.textArea14].item() # Define the Value
MeasureDate1 = table[const.textArea17].item() # Define the Measure Date
Frequency1 = table[const.textArea20].item() # Define the Frequency
Guide1 = table[const.textArea23].item() # Define the Measurement guide
matrics.loc[0] = erID1, BowTieID1, MetricID1, MetricName1, Value1, MeasureDate1, Frequency1, Guide1
erID2 = table[const.textArea7].item() # Define the ER ID
BowTieID2 = table[const.textArea8].item() # Define the Bowtie ID
MetricID2 = table[const.textArea9].item() # Define the Metric ID
MetricName2 = table[const.textArea12].item() # Define the Metric Name
Value2 = table[const.textArea15].item() # Define the Value
MeasureDate2 = table[const.textArea18].item() # Define the Measure Date
Frequency2 = table[const.textArea21].item() # Define the Frequency
Guide2 = table[const.textArea24].item() # Define the Measurement guide
matrics.loc[1] = erID2, BowTieID2, MetricID2, MetricName2, Value2, MeasureDate2, Frequency2, Guide2
matricsIndex = 1
for i in range(25, len(table.columns), 8):
if pd.isnull(table["Text Area "+str(i)].item()) == True:
break
erID = table["Text Area "+str(i)].item() # Define the ER ID
BowTieID = table["Text Area "+str(i+1)].item() # Define the Bowtie ID
MetricID = table["Text Area "+str(i+2)].item() # Define the Metric ID
MetricName = table["Text Area "+str(i+3)].item() # Define the Metric Name
Value = table["Text Area "+str(i+4)].item() # Define the Value
MeasureDate = table["Text Area "+str(i+5)].item() # Define the Measure Date
Frequency = table["Text Area "+str(i+6)].item() # Define the Frequency
Guide = table["Text Area "+str(i+7)].item() # Define the Measurement guide
series = pd.Series([erID, BowTieID, MetricID, MetricName, Value, MeasureDate, Frequency, Guide])
matrics.loc[matricsIndex] = erID, BowTieID, MetricID, MetricName, Value, MeasureDate, Frequency, Guide
matricsIndex += 1
print(matrics)
class dynamicsMatrix:
def __init__(self, n) -> None:
pass
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment