mirror of https://github.com/CIRCL/AIL-framework
				
				
				
			
		
			
				
	
	
		
			185 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			185 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| #!/usr/bin/env python3
 | |
| # -*-coding:UTF-8 -*
 | |
| 
 | |
| '''
 | |
| Create statistics pie charts by tld
 | |
| 
 | |
| Default tld: lu
 | |
| '''
 | |
| 
 | |
| import matplotlib
 | |
| matplotlib.use('Agg')
 | |
| import os
 | |
| import sys
 | |
| import redis
 | |
| import argparse
 | |
| import datetime
 | |
| import heapq
 | |
| import operator
 | |
| import matplotlib.pyplot as plt
 | |
| import numpy as np
 | |
| 
 | |
| sys.path.append(os.environ['AIL_BIN'])
 | |
| 
 | |
| from Helper import Process
 | |
| 
 | |
| def create_pie_chart(country ,db_key, date, pie_title, path, save_name):
 | |
| 
 | |
|     monthly_credential_by_tld = server_statistics.hkeys(db_key + date)
 | |
| 
 | |
|     l_tld = []
 | |
|     for tld in monthly_credential_by_tld:
 | |
|         nb_tld = server_statistics.hget(db_key + date, tld)
 | |
|         if nb_tld is not None:
 | |
|             nb_tld = int(nb_tld)
 | |
|         else:
 | |
|             nb_tld = 0
 | |
|         l_tld.append( (tld, nb_tld) )
 | |
| 
 | |
|     mail_tld_top5 = heapq.nlargest(5, l_tld, key=operator.itemgetter(1))
 | |
| 
 | |
|     # Pie chart, where the slices will be ordered and plotted counter-clockwise:
 | |
|     labels = []
 | |
|     sizes = []
 | |
|     explode = []  # only "explode" the 2nd slice (i.e. 'Hogs')
 | |
|     explode_value = 0
 | |
|     for tld in mail_tld_top5:
 | |
|         labels.append(tld[0] +' ('+str(tld[1])+')')
 | |
|         sizes.append(tld[1])
 | |
|         explode.append(explode_value)
 | |
|         explode_value = explode_value +0.1
 | |
| 
 | |
|     nb_tld = server_statistics.hget(db_key + date, country)
 | |
|     if nb_tld is not None:
 | |
|         nb_tld = int(nb_tld)
 | |
|     else:
 | |
|         nb_tld = 0
 | |
|     country_label = country + ' ('+str(nb_tld)+')'
 | |
|     if country_label not in labels:
 | |
|         labels.append(country_label)
 | |
|         sizes.append(nb_tld)
 | |
|         explode.append(explode_value)
 | |
|     explode = tuple(explode)
 | |
| 
 | |
|     fig1, ax1 = plt.subplots()
 | |
|     ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
 | |
|             shadow=True, startangle=90)
 | |
|     ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
 | |
| 
 | |
|     ax1.set_title(pie_title)
 | |
|     #plt.show()
 | |
|     plt.savefig(os.path.join(path,save_name))
 | |
|     plt.close(fig1)
 | |
| 
 | |
| def create_donut_chart(db_key, date, pie_title, path, save_name):
 | |
| 
 | |
|     monthly_credential_by_tld = server_statistics.hkeys(db_key + date)
 | |
|     print()
 | |
| 
 | |
|     l_tld = []
 | |
|     for tld in monthly_credential_by_tld:
 | |
|         nb_tld = server_statistics.hget(db_key + date, tld)
 | |
|         if nb_tld is not None:
 | |
|             nb_tld = int(nb_tld)
 | |
|         else:
 | |
|             nb_tld = 0
 | |
|         l_tld.append( (tld, nb_tld) )
 | |
| 
 | |
|     mail_tld_top5 = heapq.nlargest(5, l_tld, key=operator.itemgetter(1))
 | |
| 
 | |
|     # Pie chart, where the slices will be ordered and plotted counter-clockwise:
 | |
|     recipe = []
 | |
|     data = []
 | |
|     for tld in mail_tld_top5:
 | |
|         recipe.append(tld[0])
 | |
|         data.append(tld[1])
 | |
| 
 | |
|     nb_tld = server_statistics.hget(db_key + date, country)
 | |
|     if nb_tld is not None:
 | |
|         nb_tld = int(nb_tld)
 | |
|     else:
 | |
|         nb_tld = 0
 | |
|     if country not in recipe:
 | |
|         recipe.append(country)
 | |
|         data.append(nb_tld)
 | |
| 
 | |
|     fig1, ax1 = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))
 | |
| 
 | |
|     wedges, texts = ax1.pie(data, wedgeprops=dict(width=0.5), startangle=-40)
 | |
| 
 | |
|     bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
 | |
|     kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"),
 | |
|               bbox=bbox_props, zorder=0, va="center")
 | |
| 
 | |
|     for i, p in enumerate(wedges):
 | |
|         ang = (p.theta2 - p.theta1)/2. + p.theta1
 | |
|         y = np.sin(np.deg2rad(ang))
 | |
|         x = np.cos(np.deg2rad(ang))
 | |
|         horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
 | |
|         connectionstyle = "angle,angleA=0,angleB={}".format(ang)
 | |
|         kw["arrowprops"].update({"connectionstyle": connectionstyle})
 | |
|         ax1.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
 | |
|                      horizontalalignment=horizontalalignment, **kw)
 | |
| 
 | |
|     ax1.set_title(pie_title)
 | |
|     #plt.show()
 | |
|     plt.savefig(os.path.join(path, save_name))
 | |
|     plt.close(fig1)
 | |
| 
 | |
| if __name__ == '__main__':
 | |
| 
 | |
|     parser = argparse.ArgumentParser(
 | |
|         description='''This script is a part of the Analysis Information Leak
 | |
|         framework. Create statistics pie charts".''',
 | |
|         epilog='Example: ./create_lu_graph.py 0 lu now, create_lu_graph.py 0 lu 201807')
 | |
| 
 | |
|     parser.add_argument('type', type=int, default=0,
 | |
|                         help='''The graph type (default 0),
 | |
|                         0: all,
 | |
|                         1: credential_pie,
 | |
|                         2: mail_pie
 | |
|                         3: sqlinjection_pie,
 | |
|                         4: iban_pie,''',
 | |
|                         choices=[0, 1, 2, 3, 4], action='store')
 | |
| 
 | |
|     parser.add_argument('country', type=str, default="lu",
 | |
|                         help='''The country code, lu:default''',
 | |
|                         action='store')
 | |
| 
 | |
|     parser.add_argument('date', type=str, default="now",
 | |
|                         help='''month %Y%m, example: 201810''', action='store')
 | |
| 
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     path = os.path.join(os.environ['AIL_HOME'], 'doc', 'statistics') # save path
 | |
| 
 | |
|     config_section = 'ARDB_Statistics'
 | |
| 
 | |
|     p = Process(config_section, False)
 | |
| 
 | |
|     # ARDB #
 | |
|     server_statistics = redis.StrictRedis(
 | |
|         host=p.config.get("ARDB_Statistics", "host"),
 | |
|         port=p.config.getint("ARDB_Statistics", "port"),
 | |
|         db=p.config.getint("ARDB_Statistics", "db"),
 | |
|         decode_responses=True)
 | |
| 
 | |
|     if args.date == 'now' or len(args.date) != 6:
 | |
|         date = datetime.datetime.now().strftime("%Y%m")
 | |
|     else:
 | |
|         date = args.date
 | |
| 
 | |
|     if args.type == 0:
 | |
|         create_pie_chart(args.country, 'credential_by_tld:', date, "AIL: Credential leak by tld", path, 'AIL_credential_by_tld.png')
 | |
|         create_pie_chart(args.country, 'mail_by_tld:', date, "AIL: mail leak by tld", path, 'AIL_mail_by_tld.png')
 | |
|         create_pie_chart(args.country, 'SQLInjection_by_tld:', date, "AIL: SQLInjection by tld", path, 'AIL_SQLInjection_by_tld.png')
 | |
|         create_pie_chart(args.country.upper(), 'iban_by_country:', date, "AIL: Iban by country", path, 'AIL_iban_by_country.png')
 | |
|     elif args.type == 1:
 | |
|         create_pie_chart(args.country, 'credential_by_tld:', date, "AIL: Credential leak by tld", path, 'AIL_credential_by_tld.png')
 | |
|     elif args.type == 2:
 | |
|         create_pie_chart(args.country, 'mail_by_tld:', date, "AIL: mail leak by tld", path, 'AIL_mail_by_tld.png')
 | |
|     elif args.type == 3:
 | |
|         create_pie_chart(args.country, 'SQLInjection_by_tld:', date, "AIL: sqlInjection by tld", path, 'AIL_sqlInjectionl_by_tld.png')
 | |
|     elif args.type == 4:
 | |
|         create_pie_chart(args.country.upper(), 'iban_by_country:', date, "AIL: Iban by country", path, 'AIL_iban_by_country.png')
 |