From 1ddefac58760574fdf49369ccaec02ae7a19723d Mon Sep 17 00:00:00 2001 From: Shubham Kumar Date: Thu, 27 Apr 2023 13:34:00 +0530 Subject: [PATCH 1/3] [FEATURE] Perform Data Analytics on Output Generated JSON #8 Analysing JSON data from 2 different ROM images in the form of Pie chart and bar graph view of various parameters. This implementation allows us to see comparative analysis of 2 binary files. With the help of pie chart and bar graphs, we can analyze various components of section types and file types. Implementation for #8 Signed-off-by: Kumar, Shubham --- docs/user_guide/analytics.md | 66 +++ docs/user_guide/bar_graph_raw_section.png | Bin 0 -> 14152 bytes docs/user_guide/filetype_piechart.png | Bin 0 -> 93789 bytes tests/analytics.py | 499 ++++++++++++++++++++++ 4 files changed, 565 insertions(+) create mode 100644 docs/user_guide/analytics.md create mode 100644 docs/user_guide/bar_graph_raw_section.png create mode 100644 docs/user_guide/filetype_piechart.png create mode 100644 tests/analytics.py diff --git a/docs/user_guide/analytics.md b/docs/user_guide/analytics.md new file mode 100644 index 0000000..648c81e --- /dev/null +++ b/docs/user_guide/analytics.md @@ -0,0 +1,66 @@ +# Analysing JSON data from 2 different ROM images + +## Pie chart and bar graph view of various parameters from 2 JSON files + +Following types of views can be seen - + +1. Pie chart view of both the images based on file type and section type +2. Bar graph view of each of the parameters of file type and section type to see the comparison in both ROM images + +Installation of ```matplotlib``` is a prerequisite. + +```python +python -m pip install matplotlib +``` + + +## Seeing Pie charts from 2 different JSON files + +Taking 2 JSON files output_1.json and output_2.json as example, we can see the pie chart representation of each of the file types in the following way - + +```python +python analytics.py output_1.json output_2.json filetype +``` + +Similarly, we can see pie chart representation of each of the section types in the following way - + +```python +python analytics.py output_1.json output_2.json section +``` +![Alt text](filetype_piechart.png?raw=true "pie chart showing file types") + +## Seeing Bar graph of various parameters in 2 different JSON files + +if we want to compare the count of FV_FILETYPE_DRIVER, we can do it in the following way - + +```python +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_DRIVER +``` +In the same way, we can compare the count of any section or file type in the 2 JSON files. + +We can compare the count of EFI_SECTION_COMPRESSION in the following way - + +```python +python analytics.py output_1.json output_2.json section EFI_SECTION_COMPRESSION +``` + +Currently, the following file types and section types can be seen in the form of bar graph - + +```python + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_DRIVER + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_APPLICATION + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_FREEFORM + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_PEIM + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_SMM + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_FIRMWARE_VOLUME_IMAGE + python analytics.py output_1.json output_2.json filetype FV_FILETYPE_RAW + + python analytics.py output_1.json output_2.json section EFI_SECTION_COMPRESSION + python analytics.py output_1.json output_2.json section EFI_SECTION_FIRMWARE_VOLUME_IMAGE + python analytics.py output_1.json output_2.json section EFI_SECTION_PEI_DEPEX + python analytics.py output_1.json output_2.json section EFI_SECTION_DXE_DEPEX + python analytics.py output_1.json output_2.json section EFI_SECTION_PE32 + python analytics.py output_1.json output_2.json section EFI_SECTION_RAW +``` + +![Alt text](bar_graph_raw_section.png?raw=true "bar graph showing raw section in 2 JSON files") \ No newline at end of file diff --git a/docs/user_guide/bar_graph_raw_section.png b/docs/user_guide/bar_graph_raw_section.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6f3476048bbf82c358e750d417702ee94d0a89 GIT binary patch literal 14152 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 Fe*rt>l&Amz literal 0 HcmV?d00001 diff --git a/docs/user_guide/filetype_piechart.png b/docs/user_guide/filetype_piechart.png new file mode 100644 index 0000000000000000000000000000000000000000..773cd6809f33ccf7226f031f53767b891d5922ab GIT binary patch literal 93789 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

ikvBB{EVjI%cmqfMZKdmHv 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 G ") + print("Currently supported types of comparison = filetype/section") + print("\n") + print("---------------Example to check pie chart view of various file types in both JSON files---------------") + print("analytics.py output_1.json output_2.json filetype") + print("---------------Example to check bar graph view of various file type parameters in both JSON files---------------") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_DRIVER") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_APPLICATION") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_FREEFORM") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_PEIM") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_SMM") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_FIRMWARE_VOLUME_IMAGE") + print("analytics.py output_1.json output_2.json filetype FV_FILETYPE_RAW") + print("---------------Example to check pie chart view of various section types in both JSON files---------------") + print("analytics.py output_1.json output_2.json section") + print("---------------Example to check bar graph view of various section type parameters in both JSON files---------------") + print("analytics.py output_1.json output_2.json section EFI_SECTION_COMPRESSION") + print("analytics.py output_1.json output_2.json section EFI_SECTION_FIRMWARE_VOLUME_IMAGE") + print("analytics.py output_1.json output_2.json section EFI_SECTION_PEI_DEPEX") + print("analytics.py output_1.json output_2.json section EFI_SECTION_DXE_DEPEX") + print("analytics.py output_1.json output_2.json section EFI_SECTION_PE32") + print("analytics.py output_1.json output_2.json section EFI_SECTION_RAW") + print("\n") + exit() + +# Opening 1st JSON file +first_file = open(sys.argv[1]) +# Opening 2nd JSON file +second_file = open(sys.argv[2]) +# returns JSON object as a dictionary +Json_data_first_file = json.load(first_file) +Json_data_second_file = json.load(second_file) + + + +# search for SectionTypes parameters +search_key_compression = 'EFI_SECTION_COMPRESSION' +search_section_key_guid_defined = 'EFI_SECTION_GUID_DEFINED' +search_section_disposable= 'EFI_SECTION_DISPOSABLE' +search_section_pe32 = 'EFI_SECTION_PE32' +search_section_pic = 'EFI_SECTION_PIC' +search_section_te = 'EFI_SECTION_TE' +search_section_dxe_depex = 'EFI_SECTION_DXE_DEPEX' +search_section_version = 'EFI_SECTION_VERSION' +search_section_user_interface = 'EFI_SECTION_USER_INTERFACE' +search_section_compatibility16 = 'EFI_SECTION_COMPATIBILITY16' +search_section_fv_image = 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE' +search_section_freeform_subtype_guid = 'EFI_SECTION_FREEFORM_SUBTYPE_GUID' +search_section_raw = 'EFI_SECTION_RAW' +search_section_pei_depex = 'EFI_SECTION_PEI_DEPEX' +search_section_mm_depex = 'EFI_SECTION_MM_DEPEX' + +#search for FileType parameters +search_key_filetype_driver = 'FV_FILETYPE_DRIVER' +search_key_filetype_application = 'FV_FILETYPE_APPLICATION' +search_key_filetype_freeform = 'FV_FILETYPE_FREEFORM' +search_key_filetype_peim = 'FV_FILETYPE_PEIM' +search_key_filetype_smm = 'FV_FILETYPE_SMM' +search_key_filetype_raw = 'FV_FILETYPE_RAW' +search_key_filetype_fv = 'FV_FILETYPE_FIRMWARE_VOLUME_IMAGE' +search_key_filetype_pad = 'FV_FILETYPE_FFS_PAD' + +def findkeys(node, kv): + if isinstance(node, list): + for i in node: + for x in findkeys(i, kv): + yield x + elif isinstance(node, dict): + if kv in node: + yield node[kv] + for j in node.values(): + for x in findkeys(j, kv): + yield x + +def plot_piechart_filetype(): + ''' + function to plot pie chart based on file type + ''' + #fetch the key first + list_file_type.append(list(findkeys(Json_data_first_file, 'Type'))) + + #fetch the desired values now + count_filetype_driver.append(list_file_type[0].count(search_key_filetype_driver)) + count_filetype_application.append(list_file_type[0].count(search_key_filetype_application)) + count_filetype_freeform.append(list_file_type[0].count(search_key_filetype_freeform)) + count_filetype_peim.append(list_file_type[0].count(search_key_filetype_peim)) + count_filetype_smm.append(list_file_type[0].count(search_key_filetype_smm)) + count_filetype_raw.append(list_file_type[0].count(search_key_filetype_raw)) + count_filetype_fv.append(list_file_type[0].count(search_key_filetype_fv)) + + if count_filetype_driver[0] > 0: + print(f'{count_filetype_driver[0]} occurences of {search_key_filetype_driver} in {sys.argv[1]}') + + if count_filetype_application[0] > 0: + print(f'{count_filetype_application[0]} occurences of {search_key_filetype_application} in {sys.argv[1]}') + + if count_filetype_freeform[0] > 0: + print(f'{count_filetype_freeform[0]} occurences of {search_key_filetype_freeform} in {sys.argv[1]}') + + if count_filetype_peim[0] > 0: + print(f'{count_filetype_peim[0]} occurences of {search_key_filetype_peim} in {sys.argv[1]}') + + if count_filetype_smm[0] > 0: + print(f'{count_filetype_smm[0]} occurences of {search_key_filetype_smm} in {sys.argv[1]}') + + if count_filetype_raw[0] > 0: + print(f'{count_filetype_raw[0]} occurences of {search_key_filetype_raw} in {sys.argv[1]}') + + if count_filetype_fv[0] > 0: + print(f'{count_filetype_fv[0]} occurences of {search_key_filetype_fv} in {sys.argv[1]}') + + #analysis of first JSON file ends here + # + #analysis of second JSON file starts now + # + #fetch the key first + list_file_type.append(list(findkeys(Json_data_second_file, 'Type'))) + + #fetch the desired values now + count_filetype_driver.append(list_file_type[1].count(search_key_filetype_driver)) + count_filetype_application.append(list_file_type[1].count(search_key_filetype_application)) + count_filetype_freeform.append(list_file_type[1].count(search_key_filetype_freeform)) + count_filetype_peim.append(list_file_type[1].count(search_key_filetype_peim)) + count_filetype_smm.append(list_file_type[1].count(search_key_filetype_smm)) + count_filetype_raw.append(list_file_type[1].count(search_key_filetype_raw)) + count_filetype_fv.append(list_file_type[1].count(search_key_filetype_fv)) + + if count_filetype_driver[1] > 0: + print(f'{count_filetype_driver[1]} occurences of {search_key_filetype_driver} in {sys.argv[2]}') + + if count_filetype_application[1] > 0: + print(f'{count_filetype_application[1]} occurences of {search_key_filetype_application} in {sys.argv[2]}') + + if count_filetype_freeform[1] > 0: + print(f'{count_filetype_freeform[1]} occurences of {search_key_filetype_freeform} in {sys.argv[2]}') + + if count_filetype_peim[1] > 0: + print(f'{count_filetype_peim[1]} occurences of {search_key_filetype_peim} in {sys.argv[2]}') + + if count_filetype_smm[1] > 0: + print(f'{count_filetype_smm[1]} occurences of {search_key_filetype_smm} in {sys.argv[2]}') + + if count_filetype_raw[1] > 0: + print(f'{count_filetype_raw[1]} occurences of {search_key_filetype_raw} in {sys.argv[2]}') + + if count_filetype_fv[1] > 0: + print(f'{count_filetype_fv[1]} occurences of {search_key_filetype_fv} in {sys.argv[2]}') + + + + # for first JSON file + + plt.figure(0) + filetypes =[search_key_filetype_driver,search_key_filetype_application,search_key_filetype_freeform,search_key_filetype_peim,search_key_filetype_smm,search_key_filetype_raw,search_key_filetype_fv] + + count = [count_filetype_driver[0],count_filetype_application[0],count_filetype_freeform[0],count_filetype_peim[0],count_filetype_smm[0],count_filetype_raw[0],count_filetype_fv[0]] + + colors = ['r', 'y', 'g', 'b' ,'violet', 'm', 'c'] + + # plotting the pie chart + plt.pie(count, labels = filetypes, colors=colors, + startangle=90, shadow = True,explode = (0, 0, 0, 0, 0, 0, 0), + radius = 1.2, autopct = '%1.1f%%') + + # plotting legend + #plt.legend(loc="lower right") + plt.title(sys.argv[1], fontsize=10, fontweight='bold', color='black') + + plt.figure(1) + filetypes =[search_key_filetype_driver,search_key_filetype_application,search_key_filetype_freeform,search_key_filetype_peim,search_key_filetype_smm,search_key_filetype_raw,search_key_filetype_fv] + + count = [count_filetype_driver[1],count_filetype_application[1],count_filetype_freeform[1],count_filetype_peim[1],count_filetype_smm[1],count_filetype_raw[1],count_filetype_fv[1]] + + colors = ['r', 'y', 'g', 'b' ,'violet', 'm', 'c'] + + # plotting the pie chart + plt.pie(count, labels = filetypes, colors=colors, + startangle=90, shadow = True,explode = (0, 0, 0, 0, 0, 0, 0), + radius = 1.2, autopct = '%1.1f%%') + + plt.title(sys.argv[2], fontsize=10, fontweight='bold', color='black') + + # showing the plot + plt.show() + + +def plot_piechart_section(): + ''' + function to plot pie chart based on section type + ''' + #fetch the key first + list_section_type.append(list(findkeys(Json_data_first_file, 'SectionType'))) + + #fetch the desired values now + count_section_compression.append(list_section_type[0].count(search_key_compression)) + count_section_guid_defined.append(list_section_type[0].count(search_section_key_guid_defined)) + count_section_disposable.append(list_section_type[0].count(search_section_disposable)) + count_section_pe32.append(list_section_type[0].count(search_section_pe32)) + count_section_pic.append(list_section_type[0].count(search_section_pic)) + count_section_te.append(list_section_type[0].count(search_section_te)) + count_section_dxe_depex.append(list_section_type[0].count(search_section_dxe_depex)) + count_section_version.append(list_section_type[0].count(search_section_version)) + count_section_user_interface.append(list_section_type[0].count(search_section_user_interface)) + count_section_compatibility16.append(list_section_type[0].count(search_section_compatibility16)) + count_section_fv_image.append(list_section_type[0].count(search_section_fv_image)) + count_section_freeform_subtype_guid.append(list_section_type[0].count(search_section_freeform_subtype_guid)) + count_section_raw.append(list_section_type[0].count(search_section_raw)) + count_section_pei_depex.append(list_section_type[0].count(search_section_pei_depex)) + count_section_mm_depex.append(list_section_type[0].count(search_section_mm_depex)) + + + if count_section_compression[0] > 0: + print(f'{count_section_compression[0]} occurences of {search_key_compression} in {sys.argv[1]}') + + if count_section_guid_defined[0] > 0: + print(f'{count_section_guid_defined[0]} occurences of {search_section_key_guid_defined} in {sys.argv[1]}') + + if count_section_disposable[0] > 0: + print(f'{count_filetype_application[0]} occurences of {search_section_disposable} in {sys.argv[1]}') + + if count_section_pe32[0] > 0: + print(f'{count_section_pe32[0]} occurences of {search_section_pe32} in {sys.argv[1]}') + + if count_section_pic[0] > 0: + print(f'{count_section_pic[0]} occurences of {search_section_pic} in {sys.argv[1]}') + + if count_section_te[0] > 0: + print(f'{count_section_te[0]} occurences of {search_section_te} in {sys.argv[1]}') + + if count_section_dxe_depex[0] > 0: + print(f'{count_section_dxe_depex[0]} occurences of {search_section_dxe_depex} in {sys.argv[1]}') + + if count_section_version[0] > 0: + print(f'{count_section_version[0]} occurences of {search_section_version} in {sys.argv[1]}') + + if count_section_user_interface[0] > 0: + print(f'{count_section_user_interface[0]} occurences of {search_section_user_interface} in {sys.argv[1]}') + + if count_section_compatibility16[0] > 0: + print(f'{count_section_compatibility16[0]} occurences of {search_section_compatibility16} in {sys.argv[1]}') + + if count_section_fv_image[0] > 0: + print(f'{count_section_fv_image[0]} occurences of {search_section_fv_image} in {sys.argv[1]}') + + if count_section_freeform_subtype_guid[0] > 0: + print(f'{count_section_freeform_subtype_guid[0]} occurences of {search_section_freeform_subtype_guid} in {sys.argv[1]}') + + if count_section_raw[0] > 0: + print(f'{count_section_raw[0]} occurences of {search_section_raw} in {sys.argv[1]}') + + if count_section_pei_depex[0] > 0: + print(f'{count_section_pei_depex[0]} occurences of {search_section_pei_depex} in {sys.argv[1]}') + + if count_section_mm_depex[0] > 0: + print(f'{count_section_mm_depex[0]} occurences of {search_section_mm_depex} in {sys.argv[1]}') + + #analysis of first JSON file ends here + # + #analysis of second JSON file starts now + # + #fetch the key first + list_section_type.append(list(findkeys(Json_data_second_file, 'SectionType'))) + + #fetch the desired values now + count_section_compression.append(list_section_type[1].count(search_key_compression)) + count_section_guid_defined.append(list_section_type[1].count(search_section_key_guid_defined)) + count_section_disposable.append(list_section_type[1].count(search_section_disposable)) + count_section_pe32.append(list_section_type[1].count(search_section_pe32)) + count_section_pic.append(list_section_type[1].count(search_section_pic)) + count_section_te.append(list_section_type[1].count(search_section_te)) + count_section_dxe_depex.append(list_section_type[1].count(search_section_dxe_depex)) + count_section_version.append(list_section_type[1].count(search_section_version)) + count_section_user_interface.append(list_section_type[1].count(search_section_user_interface)) + count_section_compatibility16.append(list_section_type[1].count(search_section_compatibility16)) + count_section_fv_image.append(list_section_type[1].count(search_section_fv_image)) + count_section_freeform_subtype_guid.append(list_section_type[1].count(search_section_freeform_subtype_guid)) + count_section_raw.append(list_section_type[1].count(search_section_raw)) + count_section_pei_depex.append(list_section_type[1].count(search_section_pei_depex)) + count_section_mm_depex.append(list_section_type[1].count(search_section_mm_depex)) + + + if count_section_compression[1] > 0: + print(f'{count_section_compression[1]} occurences of {search_key_compression} in {sys.argv[2]}') + + if count_section_guid_defined[1] > 0: + print(f'{count_section_guid_defined[1]} occurences of {search_section_key_guid_defined} in {sys.argv[2]}') + + if count_section_disposable[1] > 0: + print(f'{count_filetype_application[1]} occurences of {search_section_disposable} in {sys.argv[2]}') + + if count_section_pe32[1] > 0: + print(f'{count_section_pe32[1]} occurences of {search_section_pe32} in {sys.argv[2]}') + + if count_section_pic[1] > 0: + print(f'{count_section_pic[1]} occurences of {search_section_pic} in {sys.argv[2]}') + + if count_section_te[1] > 0: + print(f'{count_section_te[1]} occurences of {search_section_te} in {sys.argv[2]}') + + if count_section_dxe_depex[1] > 0: + print(f'{count_section_dxe_depex[1]} occurences of {search_section_dxe_depex} in {sys.argv[2]}') + + if count_section_version[1] > 0: + print(f'{count_section_version[1]} occurences of {search_section_version} in {sys.argv[2]}') + + if count_section_user_interface[1] > 0: + print(f'{count_section_user_interface[0]} occurences of {search_section_user_interface} in {sys.argv[2]}') + + if count_section_compatibility16[1] > 0: + print(f'{count_section_compatibility16[1]} occurences of {search_section_compatibility16} in {sys.argv[2]}') + + if count_section_fv_image[1] > 0: + print(f'{count_section_fv_image[1]} occurences of {search_section_fv_image} in {sys.argv[2]}') + + if count_section_freeform_subtype_guid[1] > 0: + print(f'{count_section_freeform_subtype_guid[1]} occurences of {search_section_freeform_subtype_guid} in {sys.argv[2]}') + + if count_section_raw[1] > 0: + print(f'{count_section_raw[1]} occurences of {search_section_raw} in {sys.argv[2]}') + + if count_section_pei_depex[1] > 0: + print(f'{count_section_pei_depex[1]} occurences of {search_section_pei_depex} in {sys.argv[2]}') + + if count_section_mm_depex[1] > 0: + print(f'{count_section_mm_depex[1]} occurences of {search_section_mm_depex} in {sys.argv[2]}') + + + + # for first JSON file + + plt.figure(0) + section_type =[search_key_compression,search_section_key_guid_defined,search_section_disposable,search_section_pe32,search_section_pic,search_section_te,search_section_dxe_depex,search_section_version, + search_section_user_interface,search_section_compatibility16,search_section_fv_image,search_section_freeform_subtype_guid,search_section_raw,search_section_pei_depex,search_section_mm_depex] + + count = [count_section_compression[0],count_section_guid_defined[0],count_section_disposable[0],count_section_pe32[0],count_section_pic[0],count_section_te[0],count_section_dxe_depex[0],count_section_version[0], + count_section_user_interface[0],count_section_compatibility16[0],count_section_fv_image[0],count_section_freeform_subtype_guid[0],count_section_raw[0],count_section_pei_depex[0],count_section_mm_depex[0]] + + colors = ['red', 'yellow', 'green', 'blue' ,'violet', 'magenta', 'cyan','gold', 'lightskyblue', 'purple', 'orange' ,'violet', 'crimson', 'maroon','pink'] + + # plotting the pie chart + plt.pie(count, labels = section_type, colors=colors, + startangle=90, shadow = True,explode = (0.1, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0), + radius = 1.2, autopct = '%1.1f%%') + + # plotting legend + #plt.legend(loc="lower right") + plt.title(sys.argv[1], fontsize=10, fontweight='bold', color='black') + + # for second JSON file + plt.figure(1) + + + count = [count_section_compression[1],count_section_guid_defined[1],count_section_disposable[1],count_section_pe32[1],count_section_pic[1],count_section_te[1],count_section_dxe_depex[1],count_section_version[1], + count_section_user_interface[1],count_section_compatibility16[1],count_section_fv_image[1],count_section_freeform_subtype_guid[1],count_section_raw[1],count_section_pei_depex[1],count_section_mm_depex[1]] + + + # plotting the pie chart + plt.pie(count, labels = section_type, colors=colors, + startangle=90, shadow = True,explode = (0.1, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0), + radius = 1.2, autopct = '%1.1f%%') + + plt.title(sys.argv[2], fontsize=10, fontweight='bold', color='black') + + # showing the plot + plt.show() + +def plot_bargraph_file_type(file_section_type, parameter): + ''' + function to plot bar graph of a file type parameter + : param file_section_type: Type + : param parameter: type of the file to analyse such as + : FV_FILETYPE_DRIVER, FV_FILETYPE_APPLICATION, FV_FILETYPE_FREEFORM, etc. + ''' + #first JSON file + #fetch the key first + list_file_type.append(list(findkeys(Json_data_first_file, file_section_type))) + #fetch the desired values now + count_filetype.append(list_file_type[0].count(parameter)) + if count_filetype[0] > 0: + print(f'{count_filetype[0]} occurences of {parameter} in {sys.argv[1]}') + #second JSON file + #fetch the key first + list_file_type.append(list(findkeys(Json_data_second_file, file_section_type))) + + #fetch the desired values now + count_filetype.append(list_file_type[1].count(parameter)) + if count_filetype[1] > 0: + print(f'{count_filetype[1]} occurences of {parameter} in {sys.argv[2]}') + + filetype_count = {sys.argv[1]:count_filetype[0], sys.argv[2]:count_filetype[1]} + + xAxis = [key for key, value in filetype_count.items()] + yAxis = [value for key, value in filetype_count.items()] + plt.grid(False) + ## BAR GRAPH ## + plt.bar(xAxis,yAxis, color='blue') + plt.xlabel('FileName') + plt.ylabel(parameter) + plt.show() + + +def plot_bargraph_section_type(file_section_type, parameter): + ''' + function to plot bar graph of a section type parameter + : param file_section_type: SectionType + : param parameter: type of the section to analyse such as + : EFI_SECTION_COMPRESSION, EFI_SECTION_FIRMWARE_VOLUME_IMAGE, EFI_SECTION_PE32, etc. + ''' + #first JSON file + #fetch the key first + list_file_type.append(list(findkeys(Json_data_first_file, file_section_type))) + #fetch the desired values now + count_section_type.append(list_file_type[0].count(parameter)) + if count_section_type[0] > 0: + print(f'{count_section_type[0]} occurences of {parameter} in {sys.argv[1]}') + #second JSON file + #fetch the key first + list_file_type.append(list(findkeys(Json_data_second_file, file_section_type))) + + #fetch the desired values now + count_section_type.append(list_file_type[1].count(parameter)) + if count_section_type[1] > 0: + print(f'{count_section_type[1]} occurences of {parameter} in {sys.argv[2]}') + + section_count = {sys.argv[1]:count_section_type[0], sys.argv[2]:count_section_type[1]} + + xAxis = [key for key, value in section_count.items()] + yAxis = [value for key, value in section_count.items()] + plt.grid(False) + ## BAR GRAPH ## + plt.bar(xAxis,yAxis, color='maroon') + plt.xlabel('FileName') + plt.ylabel(parameter) + plt.show() + + + +if __name__ == "__main__": + print(len(sys.argv)) + if(sys.argv[3] == "filetype" and len(sys.argv) == 4): + plot_piechart_filetype() + elif(sys.argv[3] == "section" and len(sys.argv) == 4): + plot_piechart_section() + elif(sys.argv[3] == "filetype" and len(sys.argv) == 5): + plot_bargraph_file_type('Type',sys.argv[4]) + elif(sys.argv[3] == "section" and len(sys.argv) == 5): + plot_bargraph_section_type('SectionType',sys.argv[4]) + +# Closing files +first_file.close() +second_file.close() From a8d4e581ed7b5e6e3f72e07c1162eaea32697dd1 Mon Sep 17 00:00:00 2001 From: Shubham Kumar Date: Thu, 27 Apr 2023 13:55:29 +0530 Subject: [PATCH 2/3] Updated README.md --- README.md | 1 + docs/user_guide/analytics.md | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index b0f3ad7..070738a 100644 --- a/README.md +++ b/README.md @@ -58,4 +58,5 @@ These modules are extension of core XmlCli API also shows example of how it can | [Context Menu for Windows OS](src/xmlcli/modules/winContextMenu/README.md) | Installing context menu in windows OS for frequently used APIs | | [UEFI Binary Parsing](docs/user_guide/uefi_binary_parsing.md) | Parsing UEFI BIOS Binary file as json information, extracting firmware volumes, ffs etc. | | [Customizing Logging](docs/user_guide/log_configuration.md) | Instruction guide on customizing logging | +| [Data analysis of 2 JSON outputs] (docs/user_guide/log_analytics.md) | Instructions on performing binary data analysis | diff --git a/docs/user_guide/analytics.md b/docs/user_guide/analytics.md index 648c81e..f02fc33 100644 --- a/docs/user_guide/analytics.md +++ b/docs/user_guide/analytics.md @@ -47,20 +47,20 @@ python analytics.py output_1.json output_2.json section EFI_SECTION_COMPRESSION Currently, the following file types and section types can be seen in the form of bar graph - ```python - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_DRIVER - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_APPLICATION - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_FREEFORM - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_PEIM - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_SMM - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_FIRMWARE_VOLUME_IMAGE - python analytics.py output_1.json output_2.json filetype FV_FILETYPE_RAW +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_DRIVER +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_APPLICATION +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_FREEFORM +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_PEIM +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_SMM +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_FIRMWARE_VOLUME_IMAGE +python analytics.py output_1.json output_2.json filetype FV_FILETYPE_RAW - python analytics.py output_1.json output_2.json section EFI_SECTION_COMPRESSION - python analytics.py output_1.json output_2.json section EFI_SECTION_FIRMWARE_VOLUME_IMAGE - python analytics.py output_1.json output_2.json section EFI_SECTION_PEI_DEPEX - python analytics.py output_1.json output_2.json section EFI_SECTION_DXE_DEPEX - python analytics.py output_1.json output_2.json section EFI_SECTION_PE32 - python analytics.py output_1.json output_2.json section EFI_SECTION_RAW +python analytics.py output_1.json output_2.json section EFI_SECTION_COMPRESSION +python analytics.py output_1.json output_2.json section EFI_SECTION_FIRMWARE_VOLUME_IMAGE +python analytics.py output_1.json output_2.json section EFI_SECTION_PEI_DEPEX +python analytics.py output_1.json output_2.json section EFI_SECTION_DXE_DEPEX +python analytics.py output_1.json output_2.json section EFI_SECTION_PE32 +python analytics.py output_1.json output_2.json section EFI_SECTION_RAW ``` ![Alt text](bar_graph_raw_section.png?raw=true "bar graph showing raw section in 2 JSON files") \ No newline at end of file From 58a68b1bb0534fb098ba0f656343f80f8ef359c3 Mon Sep 17 00:00:00 2001 From: Shubham Kumar Date: Thu, 27 Apr 2023 13:57:05 +0530 Subject: [PATCH 3/3] corrected path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 070738a..1cbe1f9 100644 --- a/README.md +++ b/README.md @@ -58,5 +58,5 @@ These modules are extension of core XmlCli API also shows example of how it can | [Context Menu for Windows OS](src/xmlcli/modules/winContextMenu/README.md) | Installing context menu in windows OS for frequently used APIs | | [UEFI Binary Parsing](docs/user_guide/uefi_binary_parsing.md) | Parsing UEFI BIOS Binary file as json information, extracting firmware volumes, ffs etc. | | [Customizing Logging](docs/user_guide/log_configuration.md) | Instruction guide on customizing logging | -| [Data analysis of 2 JSON outputs] (docs/user_guide/log_analytics.md) | Instructions on performing binary data analysis | +| [Data analysis of 2 JSON outputs] (docs/user_guide/analytics.md) | Instructions on performing binary data analysis |