Skip to content

Instantly share code, notes, and snippets.

@Weltraumschaf
Created September 6, 2024 11:40
Show Gist options
  • Save Weltraumschaf/f6bdc1c8a6184b05909b7acdc24a792d to your computer and use it in GitHub Desktop.
Save Weltraumschaf/f6bdc1c8a6184b05909b7acdc24a792d to your computer and use it in GitHub Desktop.
Convert DSOMM Generated Activities to Excel
import os
import sys
import yaml
from openpyxl import Workbook
# This script converts the given `generated.yaml` from DSOMM into an Excel file.
#
# Get the generated.yaml:
# curl https://raw.githubusercontent.com/devsecopsmaturitymodel/DevSecOps-MaturityModel-data/main/src/assets/YAML/generated/generated.yaml -o generated.yaml
#
# Requirements: pip install PyYAML openpyxl
class Activity:
def __init__(self):
self.dimension = ""
self.sub_dimension = ""
self.name = ""
self.level = 0
self.description = ""
self.risk = ""
self.measure = ""
self.time = ""
self.knowledge = ""
self.resources = ""
self.usefulness = ""
self.iso27001_2017 = ""
self.iso27001_2022 = ""
def to_list(self):
return [self.dimension,
self.sub_dimension,
self.name,
self.level,
self.description,
self.risk,
self.measure,
self.time,
self.knowledge,
self.resources,
self.usefulness,
self.iso27001_2017,
self.iso27001_2022]
def main():
if len(sys.argv) < 2:
print("Usage: python convert.py <filename>")
sys.exit(1)
filename = sys.argv[1]
if not os.path.isfile(filename):
print(f"Error: The file '{filename}' does not exist!")
sys.exit(1)
activities = read_activities_from_yaml(filename)
write_excel(activities)
def read_activities_from_yaml(filename):
with open(filename, 'r') as file:
try:
data = yaml.safe_load(file)
return extract_dimensions(data)
except yaml.YAMLError as e:
print(f"Error parsing YAML file: {e}")
def extract_dimensions(data):
activities = []
for dimension_name, dimension in data.items():
if isinstance(dimension, dict):
activities += extract_sub_dimensions(dimension_name, dimension)
else:
print(f"Unexpected value for dimension: {dimension}")
return activities
def extract_sub_dimensions(dimension_name, dimension):
activities = []
for sub_dimension_name, sub_dimension in dimension.items():
if isinstance(sub_dimension, dict):
activities += extract_activities(dimension_name, sub_dimension_name, sub_dimension)
else:
print(f"Unexpected value for sub dimension: {sub_dimension}")
return activities
def extract_activities(dimension_name, sub_dimension_name, sub_dimension):
activities = []
for activity_name, activity in sub_dimension.items():
if isinstance(activity, dict):
activities.append(extract_activity(dimension_name, sub_dimension_name, activity_name, activity))
else:
print(f"Unexpected value for activity: {activity}")
return activities
def extract_activity(dimension_name, sub_dimension_name, activity_name, activity):
current_activity = Activity()
current_activity.dimension = dimension_name
current_activity.sub_dimension = sub_dimension_name
current_activity.name = activity_name
current_activity.level = map_level_label(activity['level'])
if 'description' in activity:
current_activity.description = activity['description']
current_activity.risk = activity['risk']
current_activity.measure = activity['measure']
difficulty = activity['difficultyOfImplementation']
current_activity.time = map_general_label(difficulty['time'])
current_activity.knowledge = map_knowledge_label(difficulty['knowledge'])
current_activity.resources = map_general_label(difficulty['resources'])
current_activity.usefulness = map_general_label(activity['usefulness'])
references = activity['references']
iso_mapping = references.get('iso27001-2017', [])
iso_mapping = [str(v) for v in iso_mapping]
current_activity.iso27001_2017 = ', '.join(iso_mapping)
iso_mapping = references.get('iso27001-2022', [])
iso_mapping = [str(v) for v in iso_mapping]
current_activity.iso27001_2022 = ', '.join(iso_mapping)
return current_activity
def map_general_label(number):
# Maps 'time', 'resources', 'usefulness'
general_labels = ['Very Low', 'Low', 'Medium', 'High', 'Very High']
# The numbers start from 1, so minus one bc array starts at 0.
return general_labels[number - 1]
def map_knowledge_label(number):
# Maps 'knowledge' to strings:
knowledge_labels = [
'Very Low (one discipline)',
'Low (one discipline)',
'Medium (two disciplines)',
'High (two disciplines)',
'Very High (three or more disciplines)',
]
# The numbers start from 1, so minus one bc array starts at 0.
return knowledge_labels[number - 1]
def map_level_label(number):
# Maps 'level' to strings:
level_labels = [
'Level 1: Basic understanding of security practices',
'Level 2: Adoption of basic security practices',
'Level 3: High adoption of security practices',
'Level 4: Very high adoption of security practices',
'Level 5: Advanced deployment of security practices at scale',
]
# The numbers start from 1, so minus one bc array starts at 0.
return level_labels[number - 1]
def write_excel(activities):
column_names = ["Dimension",
"Sub Dimension",
"Name",
"Level",
"Description",
"Risk",
"Measure",
"Time",
"Knowledge",
"Resources",
"Usefulness",
"ISO27001:2017",
"ISO27001:2022"]
wb = Workbook()
ws = wb.active
ws.append(column_names)
for activity in activities:
ws.append(activity.to_list())
filename = "activities.xlsx"
wb.save(filename)
print(f"Data written to {filename}")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment