| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #!/usr/bin/env python3
- import csv
- import os
- # If abs is True, we need to have observed more than 32 connections on
- # some day to be considered blocked.
- def is_blocked (harshness, bridge_ips_max, bridge_ips_today, abs, no_min):
- if bridge_ips_max is None:
- return False
- threshold = 8 * harshness
- if abs:
- # absolute threshold
- return bridge_ips_today <= threshold and (no_min or bridge_ips_max > 32)
- else:
- # relative threshold based on prior connection counts
- return bridge_ips_today <= threshold and (no_min or bridge_ips_today <= bridge_ips_max - 32 + threshold)
- def evaluate (harshness, fingerprint, abs=True, no_min=False):
- fingerprint = fingerprint.upper()
- bridge_ips_max = None
- with open (f"data/bridge_data_cleaned/{fingerprint}", 'r') as file:
- bridge_data = csv.reader(file, delimiter=',')
- for row in bridge_data:
- bridge_ips_today = int(row[1])
- if not bridge_ips_max is None:
- if is_blocked (harshness, bridge_ips_max, bridge_ips_today, abs, no_min):
- return row[0]
- # Start bridge_ips_max only when we have a non-zero
- # connection count
- elif bridge_ips_today > 0:
- bridge_ips_max = bridge_ips_today
- # If we got here, the bridge is not blocked
- return None
- # Remove any previous blocked_* files, start over
- for i in range(5):
- if os.path.exists (f"data/blocked_{i}"):
- os.remove (f"data/blocked_{i}")
- if os.path.exists (f"data/blocked_{i}_abs"):
- os.remove (f"data/blocked_{i}_abs")
- if os.path.exists (f"data/blocked_{i}_nomin"):
- os.remove (f"data/blocked_{i}_nomin")
- with open ("data/all-bridges", 'r') as all_bridges:
- for fingerprint in all_bridges:
- fingerprint = fingerprint.strip()
- if fingerprint:
- # Go through all harshness values
- for harshness in range(5):
- blocked = evaluate (harshness, fingerprint, False)
- # If the bridge is blocked add its fingerprint and
- # blocked date to the list for that harshness level
- if not blocked is None:
- with open (f"data/blocked_{harshness}", 'a') as f:
- f.write(f"{fingerprint},{blocked}\n")
- blocked = evaluate (harshness, fingerprint, True)
- if not blocked is None:
- with open (f"data/blocked_{harshness}_abs", 'a') as f:
- f.write(f"{fingerprint},{blocked}\n")
- blocked = evaluate (harshness, fingerprint, False, True)
- if not blocked is None:
- with open (f"data/blocked_{harshness}_nomin", 'a') as f:
- f.write(f"{fingerprint},{blocked}\n")
|