| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #!/usr/bin/env python3
- import csv
- import numpy
- import os
- import sys
- # Starting day: February Nth
- #N = 1
- N = 20
- # See note in readme
- JAN_31 = 2459245
- # 2021 February Nth as Julian date
- FIRST_DAY = JAN_31 + N
- TOTAL_BRIDGES = 1890
- OBFS4_EMAIL_BRIDGES = 93
- email_bridges = set()
- non_obfs4_email_bridges = set()
- other_bridges = set()
- with open ("data/obfs4-email-bridges", 'r') as f:
- for line in f:
- if line != "":
- email_bridges.add(line.strip())
- with open ("data/non-obfs4-email-bridges", 'r') as f:
- for line in f:
- if line != "":
- non_obfs4_email_bridges.add(line.strip())
- with open ("data/all-bridges", 'r') as f:
- for line in f:
- if line != "":
- bridge = line.strip()
- if not bridge in email_bridges and not bridge in non_obfs4_email_bridges:
- other_bridges.add(bridge)
- def max_counts (bridges):
- other_bridge_data = []
- other_bridge_max = []
- other_bridge_fpr = []
- for fingerprint in bridges:
- # We're going to get all the data for each bridge
- bridge_data = dict()
- begun = False
- max_count = 0
- filename = f"data/bridge_data_cleaned/{fingerprint.upper()}"
- if os.path.isfile(filename) and os.path.getsize(filename) > 0:
- with open(filename, 'r') as csvfile:
- data = csv.reader(csvfile, delimiter=',')
- for line in data:
- # Ignore 0 values until we see a non-zero value
- if not begun:
- if line[1] != "0":
- begun = True
- if begun:
- date = int(line[0][:line[0].find(' ')])
- if date > FIRST_DAY:
- break
- val = int(line[1])
- bridge_data[date] = val
- max_count = max(max_count, val)
- if begun:
- other_bridge_data.append(bridge_data)
- other_bridge_max.append(max_count)
- other_bridge_fpr.append(fingerprint)
- max_overall_count = 0
- for count in other_bridge_max:
- if count > max_overall_count:
- max_overall_count = count
- if max_overall_count == 0:
- print ("No bridges received any connections.")
- return
- # We want to count how many bridges have at least 8*i connections
- at_least_count = [0] * (max_overall_count // 8)
- # Note: We ignore index 0
- for count in other_bridge_max:
- for i in range(1, count//8):
- at_least_count[i] += 1
- last_value = at_least_count[1]
- for i in range(1, len(at_least_count)):
- count = at_least_count[i]
- if i == len(at_least_count) - 1:
- print (f"Bridges with at least {i*8} connections: {count}")
- elif i == 1:
- continue
- elif count != last_value:
- # print last number
- print (f"Bridges with at least {(i-1)*8} connections: {at_least_count[i-1]}")
- last_value = count
- non_obfs4_email_bridges = list(non_obfs4_email_bridges)
- other_bridges = list(other_bridges)
- print ("Max counts for bridges that were distributed by email but did not support obfs4:")
- max_counts (non_obfs4_email_bridges)
- print ("\nMax counts for bridges that were not distributed by email:")
- max_counts (other_bridges)
|