Created
September 6, 2024 11:40
-
-
Save Weltraumschaf/f6bdc1c8a6184b05909b7acdc24a792d to your computer and use it in GitHub Desktop.
Convert DSOMM Generated Activities to Excel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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