def load(cfg, splitter, clear=False): """Read all the bridge files from cfg, and pass them into a splitter object. """ countryblock = Bridges.CountryBlock() if clear: logging.info("Clearing old bridges") splitter.clear() logging.info("Clearing old blocked bridges") countryblock.clear() logging.info("Loading bridges") status = {} if hasattr(cfg, "STATUS_FILE"): f = open(cfg.STATUS_FILE, 'r') for ID, running, stable in Bridges.parseStatusFile(f): status[ID] = running, stable f.close() if hasattr(cfg, "COUNTRY_BLOCK_FILE"): f = open(cfg.COUNTRY_BLOCK_FILE, 'r') for fingerprint, countryCode in Bridges.parseCountryBlockFile(f): countryblock.insert(fingerprint, countryCode) f.close() for fname in cfg.BRIDGE_FILES: f = open(fname, 'r') for bridge in Bridges.parseDescFile(f, cfg.BRIDGE_PURPOSE): s = status.get(bridge.getID()) if s is not None: running, stable = s bridge.setStatus(running=running, stable=stable) bridge.setBlockingCountries( countryblock.getBlockingCountries(bridge.fingerprint)) splitter.insert(bridge) f.close()
def load(cfg, splitter, clear=False): """Read all the bridge files from cfg, and pass them into a splitter object. """ if clear: logging.info("Clearing old bridges") splitter.clear() logging.info("Loading bridges") status = {} if hasattr(cfg, "STATUS_FILE"): f = open(cfg.STATUS_FILE, 'r') for ID, running, stable in Bridges.parseStatusFile(f): status[ID] = running, stable for fname in cfg.BRIDGE_FILES: f = open(fname, 'r') for bridge in Bridges.parseDescFile(f, cfg.BRIDGE_PURPOSE): s = status.get(bridge.getID()) if s is not None: running, stable = s bridge.setStatus(running=running, stable=stable) splitter.insert(bridge) f.close()
def load(cfg, splitter, clear=False): """Read all the bridge files from cfg, and pass them into a splitter object. """ if clear: logging.info("Clearing old bridges") splitter.clear() logging.info("Loading bridges") status = {} addresses = {} timestamps = {} if hasattr(cfg, "STATUS_FILE"): logging.info("Opening Network Status document %s", os.path.abspath(cfg.STATUS_FILE)) f = open(cfg.STATUS_FILE, "r") for ID, running, stable, or_addresses, timestamp in Bridges.parseStatusFile(f): status[ID] = running, stable addresses[ID] = or_addresses if ID in timestamps.keys(): timestamps[ID].append(timestamp) else: timestamps[ID] = [timestamp] # transports[ID] = transports logging.debug("Closing status document") f.close() bridges = {} db = bridgedb.Storage.getDB() for fname in cfg.BRIDGE_FILES: logging.info("Opening cached Descriptor document %s", fname) logging.debug("Parsing document for purpose=%s", cfg.BRIDGE_PURPOSE) f = open(fname, "r") for bridge in Bridges.parseDescFile(f, cfg.BRIDGE_PURPOSE): if bridge.getID() in bridges: logging.warn("Parsed bridge that we've already added. Skipping.") logging.debug(" Bridge: %s" % bridge.getID()) continue else: bridges[bridge.getID()] = bridge s = status.get(bridge.getID()) if s is not None: running, stable = s bridge.setStatus(running=running, stable=stable) bridge.or_addresses = addresses.get(bridge.getID()) splitter.insert(bridge) # add or update BridgeHistory entries into the database # XXX: what do we do with all these or_addresses? # The bridge stability metrics are only concerned with a single ip:port # So for now, we will only consider the bridges primary IP:port if bridge.getID() in timestamps.keys(): ts = timestamps[bridge.getID()][:] ts.sort() for timestamp in ts: bridgedb.Stability.addOrUpdateBridgeHistory(bridge, timestamp) logging.debug("Closing descriptor document") f.close() # read pluggable transports from extra-info document # XXX: should read from networkstatus after bridge-authority # does a reachability test if hasattr(cfg, "EXTRA_INFO_FILE"): logging.info("Opening Extra Info document %s", os.path.abspath(cfg.EXTRA_INFO_FILE)) f = open(cfg.EXTRA_INFO_FILE, "r") for transport in Bridges.parseExtraInfoFile(f): ID, method_name, address, port, argdict = transport if bridges[ID].running: logging.debug(" Appending transport to running bridge") bridges[ID].transports.append( Bridges.PluggableTransport(bridges[ID], method_name, address, port, argdict) ) assert bridges[ID].transports, "We added a transport but it disappeared!" logging.debug("Closing extra-info document") f.close() if hasattr(cfg, "COUNTRY_BLOCK_FILE"): logging.info("Opening Blocking Countries file %s", os.path.abspath(cfg.COUNTRY_BLOCK_FILE)) f = open(cfg.COUNTRY_BLOCK_FILE, "r") for ID, address, portlist, countries in Bridges.parseCountryBlockFile(f): if ID in bridges.keys() and bridges[ID].running: for port in portlist: logging.debug(":.( Tears! %s blocked %s %s:%s", countries, bridges[ID].fingerprint, address, port) try: bridges[ID].blockingCountries["%s:%s" % (address, port)].update(countries) except KeyError: bridges[ID].blockingCountries["%s:%s" % (address, port)] = set(countries) logging.debug("Closing blocking-countries document") f.close() bridges = None
def load(cfg, splitter, clear=False): """Read all the bridge files from cfg, and pass them into a splitter object. """ if clear: logging.info("Clearing old bridges") splitter.clear() logging.info("Loading bridges") status = {} addresses = {} timestamps = {} if hasattr(cfg, "STATUS_FILE"): logging.info("Opening Network Status document %s", os.path.abspath(cfg.STATUS_FILE)) f = open(cfg.STATUS_FILE, 'r') for ID, running, stable, or_addresses, timestamp in Bridges.parseStatusFile( f): status[ID] = running, stable addresses[ID] = or_addresses if ID in timestamps.keys(): timestamps[ID].append(timestamp) else: timestamps[ID] = [timestamp] #transports[ID] = transports logging.debug("Closing status document") f.close() bridges = {} db = bridgedb.Storage.getDB() for fname in cfg.BRIDGE_FILES: logging.info("Opening cached Descriptor document %s", fname) logging.debug("Parsing document for purpose=%s", cfg.BRIDGE_PURPOSE) f = open(fname, 'r') for bridge in Bridges.parseDescFile(f, cfg.BRIDGE_PURPOSE): if bridge.getID() in bridges: logging.warn( "Parsed bridge that we've already added. Skipping.") logging.debug(" Bridge: %s" % bridge.getID()) continue else: bridges[bridge.getID()] = bridge s = status.get(bridge.getID()) if s is not None: running, stable = s bridge.setStatus(running=running, stable=stable) bridge.or_addresses = addresses.get(bridge.getID()) splitter.insert(bridge) # add or update BridgeHistory entries into the database # XXX: what do we do with all these or_addresses? # The bridge stability metrics are only concerned with a single ip:port # So for now, we will only consider the bridges primary IP:port if bridge.getID() in timestamps.keys(): ts = timestamps[bridge.getID()][:] ts.sort() for timestamp in ts: bridgedb.Stability.addOrUpdateBridgeHistory( bridge, timestamp) logging.debug("Closing descriptor document") f.close() # read pluggable transports from extra-info document # XXX: should read from networkstatus after bridge-authority # does a reachability test if hasattr(cfg, "EXTRA_INFO_FILE"): logging.info("Opening Extra Info document %s", os.path.abspath(cfg.EXTRA_INFO_FILE)) f = open(cfg.EXTRA_INFO_FILE, 'r') for transport in Bridges.parseExtraInfoFile(f): ID, method_name, address, port, argdict = transport if bridges[ID].running: logging.debug(" Appending transport to running bridge") bridges[ID].transports.append( Bridges.PluggableTransport(bridges[ID], method_name, address, port, argdict)) assert bridges[ ID].transports, "We added a transport but it disappeared!" logging.debug("Closing extra-info document") f.close() if hasattr(cfg, "COUNTRY_BLOCK_FILE"): logging.info("Opening Blocking Countries file %s", os.path.abspath(cfg.COUNTRY_BLOCK_FILE)) f = open(cfg.COUNTRY_BLOCK_FILE, 'r') for ID, address, portlist, countries in Bridges.parseCountryBlockFile( f): if ID in bridges.keys() and bridges[ID].running: for port in portlist: logging.debug(":.( Tears! %s blocked %s %s:%s", countries, bridges[ID].fingerprint, address, port) try: bridges[ID].blockingCountries["%s:%s" % \ (address, port)].update(countries) except KeyError: bridges[ID].blockingCountries["%s:%s" % \ (address, port)] = set(countries) logging.debug("Closing blocking-countries document") f.close() bridges = None