diff --git a/blocklist.py b/blocklist.py index d9aa1af..4c79859 100644 --- a/blocklist.py +++ b/blocklist.py @@ -1,4 +1,5 @@ #!/usr/bin/python +"""Program to fetch a blocklist via HTTP""" import sys import logging @@ -17,8 +18,8 @@ class BlockList: try: self.config = ConfigParser.ConfigParser() self.config.readfp(open(config_file)) - except Exception, e: - logging.error("Could not read configuration file %s: %s" % (config_file, e)) + except (IOError, ConfigParser.MissingSectionHeaderError), error: + logging.error("Could not read configuration file %s: %s", config_file, error) raise def read(self, source): @@ -32,15 +33,16 @@ class BlockList: # Fetch the items from the input (remote_ip, forwarded_ip, useragent, cookie) = line self.add(remote_ip, forwarded_ip, useragent, cookie) - except Exception, e: - logging.error("There was an error retrieving the blocklist. %s" % e) + except csv.Error, error: + logging.error("There was an error retrieving the blocklist. %s", error) def add(self, remote_ip, forwarded_ip, useragent, cookie): - # Store the various items - if remote_ip not in self.data: - self.data[remote_ip] = { "remote_ip": remote_ip, "forwarded_ip": forwarded_ip, "useragent": useragent, "cookie": cookie } - else: - logging.debug("%s already exists in blacklist. Ignoring." % remote_ip) + """Method to store the remote_ip, forwarded_ip, useragent and cookie to the in-memory dictionary.""" + # Store the various items + if remote_ip not in self.data: + self.data[remote_ip] = { "remote_ip": remote_ip, "forwarded_ip": forwarded_ip, "useragent": useragent, "cookie": cookie } + else: + logging.debug("%s already exists in blacklist. Ignoring.", remote_ip) def cache(self, source): """Attempt to read from the source URL and store results in a cache file, otherwise use the contents of the cache. If the cache isn't usable but the data is still available, return the transient data.""" @@ -57,30 +59,30 @@ class BlockList: if not os.path.exists(cache_dir): try: os.makedirs(cache_dir) - except: - logging.warning("Could not create the caching directory. Will attempt to run without a cache.") + except OSError, error: + logging.warning("Could not create the caching directory: %s Will attempt to run without a cache.", error) # Attempt to fetch the data and store it in a cache file try: - list = urllib2.urlopen(source) - raw_data = list.read() + input_list = urllib2.urlopen(source) + raw_data = input_list.read() cache_file = open(cache_path, "w+") cache_file.write(raw_data) # Rewind the file cache_file.seek(0) - except (urllib2.URLError, urllib2.HTTPError), e: + except (urllib2.URLError, urllib2.HTTPError), error: # Network error. Warn and use the cached content. - logging.warning("Reverting to cache file. There was a problem contacting host %s: %s" % (hostname, e)) + logging.warning("Reverting to cache file. There was a problem contacting host %s: %s", hostname, error) try: cache_file = open(cache_path, "r") - except IOError, e: - logging.error("No cache file was available for %s." % hostname) + except IOError, error: + logging.error("No cache file was available for %s: %s", hostname, error) raise - except Exception, e: + except IOError, error: # Cache error, but network succeeded. Use String IO to return the data. import StringIO - logging.warning("Could not create cache file: %s. Returning transient data." % e) + logging.warning("Could not create cache file: %s. Returning transient data.", error) cache_file = StringIO.StringIO() cache_file.write(raw_data) @@ -92,11 +94,11 @@ class BlockList: def dump(self): """Dump the local datastore out to stdout.""" - for list,val in self.data.iteritems(): + for name, val in self.data.iteritems(): for address in val: - print "%s: %s" % (list, address) + print "%s: %s" % (name, address) def export(self): """Output a plaintext blocklist to stdout.""" - for key,item in self.data.iteritems(): + for item in self.data.values(): print "%s,%s,%s,%s" % (item["remote_ip"], item["forwarded_ip"], item["useragent"], item["cookie"])