mirror of https://github.com/CIRCL/AIL-framework
				
				
				
			
		
			
				
	
	
		
			132 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			132 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| #!/usr/bin/env python3
 | |
| # -*-coding:UTF-8 -*
 | |
| 
 | |
| import os
 | |
| import argparse
 | |
| 
 | |
| def main():
 | |
| 
 | |
|     content = ""
 | |
|     modules = {}
 | |
|     all_modules = []
 | |
|     curr_module = ""
 | |
|     streamingPub = {}
 | |
|     streamingSub = {}
 | |
| 
 | |
|     path = os.path.join(os.environ['AIL_BIN'], 'packages/modules.cfg') # path to module config file
 | |
|     path2 = os.path.join(os.environ['AIL_HOME'], 'doc/all_modules.txt') # path and name of the output file, this file contain a list off all modules
 | |
| 
 | |
| 
 | |
|     parser = argparse.ArgumentParser(
 | |
|         description='''This script is a part of the Analysis Information Leak
 | |
|         framework. It create a graph that represent the flow between modules".''',
 | |
|         epilog='Example: ./generate_graph_data.py 0')
 | |
| 
 | |
|     parser.add_argument('type', type=int, default=0,
 | |
|                         help='''The graph type (default 0),
 | |
|                         0: module graph,
 | |
|                         1: data graph''',
 | |
|                         choices=[0, 1], action='store')
 | |
| 
 | |
|     parser.add_argument('spline', type=str, default="ortho",
 | |
|                         help='''The graph splines type, spline:default , ortho: orthogonal''',
 | |
|                         choices=["ortho", "spline"], action='store')
 | |
| 
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     with open(path, 'r') as f:
 | |
| 
 | |
|         # get all modules, subscriber and publisher for each module
 | |
|         for line in f:
 | |
|             if line[0] != '#':
 | |
|                 # module name
 | |
|                 if line[0] == '[':
 | |
|                     curr_name = line.replace('[','').replace(']','').replace('\n', '').replace(' ', '')
 | |
|                     all_modules.append(curr_name)
 | |
|                     modules[curr_name] = {'sub': [], 'pub': []}
 | |
|                     curr_module = curr_name
 | |
|                 elif curr_module != "": # searching for sub or pub
 | |
|                     # subscriber list
 | |
|                     if line.startswith("subscribe"):
 | |
|                         curr_subscribers = [w for w in line.replace('\n', '').replace(' ', '').split('=')[1].split(',')]
 | |
|                         modules[curr_module]['sub'] = curr_subscribers
 | |
|                         for sub in curr_subscribers:
 | |
|                             streamingSub[sub] = curr_module
 | |
| 
 | |
|                     # publisher list
 | |
|                     elif line.startswith("publish"):
 | |
|                         curr_publishers = [w for w in line.replace('\n', '').replace(' ', '').split('=')[1].split(',')]
 | |
|                         modules[curr_module]['pub'] = curr_publishers
 | |
|                         for pub in curr_publishers:
 | |
|                             streamingPub[pub] = curr_module
 | |
|                     else:
 | |
|                         continue
 | |
| 
 | |
|         output_set_graph = set()
 | |
|         with open(path2, 'w') as f2:
 | |
|             for e in all_modules:
 | |
|                 f2.write(e+"\n")
 | |
| 
 | |
|         output_text_graph = ""
 | |
| 
 | |
|         # flow between modules
 | |
|         if args.type == 0:
 | |
| 
 | |
|             for module in modules.keys():
 | |
|                 for stream_in in modules[module]['sub']:
 | |
|                     if stream_in not in streamingPub.keys():
 | |
|                         output_set_graph.add("\"" + stream_in + "\" [color=darkorange1] ;\n")
 | |
|                         output_set_graph.add("\"" + stream_in + "\"" + "->" + module + ";\n")
 | |
|                     else:
 | |
|                         output_set_graph.add("\"" + streamingPub[stream_in] + "\"" + "->" + module + ";\n")
 | |
| 
 | |
|                 for stream_out in modules[module]['pub']:
 | |
|                     if stream_out not in streamingSub.keys():
 | |
|                         #output_set_graph.add("\"" + stream_out + "\" [color=darkorange1] ;\n")
 | |
|                         output_set_graph.add("\"" + module + "\"" + "->" + stream_out + ";\n")
 | |
|                     else:
 | |
|                         output_set_graph.add("\"" + module + "\"" + "->" + streamingSub[stream_out] + ";\n")
 | |
| 
 | |
|             # graph head
 | |
|             output_text_graph += "digraph unix {\n"
 | |
|             output_text_graph +=  "graph [pad=\"0.5\"];\n"
 | |
|             output_text_graph += "size=\"25,25\";\n"
 | |
|             output_text_graph += "splines="
 | |
|             output_text_graph += args.spline
 | |
|             output_text_graph += ";\n"
 | |
|             output_text_graph += "node [color=lightblue2, style=filled];\n"
 | |
| 
 | |
| 
 | |
|         # flow between data
 | |
|         if args.type == 1:
 | |
| 
 | |
|             for module in modules.keys():
 | |
|                 for stream_in in modules[module]['sub']:
 | |
|                     for stream_out in modules[module]['pub']:
 | |
| 
 | |
|                         if stream_in not in streamingPub.keys():
 | |
|                             output_set_graph.add("\"" + stream_in + "\" [color=darkorange1] ;\n")
 | |
| 
 | |
|                         output_set_graph.add("\"" + stream_in + "\"" + "->" + stream_out + ";\n")
 | |
| 
 | |
|             # graph head
 | |
|             output_text_graph += "digraph unix {\n"
 | |
|             output_text_graph += "graph [pad=\"0.5\"];\n"
 | |
|             output_text_graph += "size=\"25,25\";\n"
 | |
|             output_text_graph += "splines="
 | |
|             output_text_graph += args.spline
 | |
|             output_text_graph += ";\n"
 | |
|             output_text_graph += "node [color=tan, style=filled];\n"
 | |
| 
 | |
| 
 | |
| 
 | |
|         # create final txt graph
 | |
|         for elem in output_set_graph:
 | |
|             output_text_graph += elem
 | |
| 
 | |
|         output_text_graph += "}"
 | |
|         print(output_text_graph)
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 |