deluge/plugins/BlocklistImport/__init__.py

150 lines
4.8 KiB
Python
Raw Normal View History

##
# Copyright 2007 Steve 'Tarka' Smith (tarka@internode.on.net)
# Distributed under the same terms as Deluge
##
plugin_name = "Blocklist Importer"
plugin_author = "Steve 'Tarka' Smith"
plugin_version = "0.3"
plugin_description = """
Downloads and import PeerGuardian blocklists.
It can parse uncompressed text-format list, and Gzip P2B version 1 and
2. It does not currently support 7zip encoded lists unfortunately.
It is suggested these are downloaded an unpacked via a cron script.
"""
def deluge_init(deluge_path):
global path
path = deluge_path
def enable(core, interface):
global path
return BlocklistImport(path, core, interface)
#################### The plugin itself ####################
import urllib, deluge.common, deluge.pref
from peerguardian import PGReader, PGException
2007-06-25 07:53:58 +00:00
from text import TextReader, GZMuleReader, PGZip
from ui import GTKConfig, GTKProgress
# List of formats supported. This is used to generate the UI list and
# specify the reader class. The last entry is for storage by the UI.
readers = {'p2bgz':["PeerGuardian P2B (GZip)", PGReader, None],
'pgtext':["PeerGuardian Text (Uncompressed)", TextReader, None],
'gzmule':["Emule IP list (GZip)", GZMuleReader, None],
'spzip':["SafePeer Text (Zipped)", PGZip, None]}
class BlocklistImport:
def __init__(self, path, core, interface):
print "Loading blocklist plugin ..."
# Save the path, interface, and core so they can be used later
self.path = path
self.core = core
self.interface = interface
self.cancelled = False
self.gtkconf = GTKConfig(self)
self.gtkprog = GTKProgress(self)
self.nimported = 0
self.blockfile = deluge.common.CONFIG_DIR + "/blocklist.cache"
conffile = deluge.common.CONFIG_DIR + "/blocklist.conf"
self.config = deluge.pref.Preferences(filename=conffile,
global_defaults=False)
self.config.load()
if not self.config.has_key('url'):
self.configure()
else:
self.loadlist(fetch=self.config.get('load_on_start'))
def _download_update(self, curr, chunksize, size):
incs = float(size) / float(chunksize)
self.gtkprog.download_prog(curr/incs)
def loadlist(self, fetch=False):
2007-06-16 05:45:22 +00:00
self.gtkprog.start()
# Attempt initial import
if fetch:
print "Fetching",self.config.get('url')
2007-06-16 05:45:22 +00:00
self.gtkprog.start_download()
2007-06-24 10:32:51 +00:00
try:
filename, headers = urllib.urlretrieve(self.config.get('url'),
filename=self.blockfile,
reporthook=self._download_update)
2007-06-24 10:32:51 +00:00
except IOError, (errno, strerr):
err = ui.GTKError("Couldn't download URL: %s"%strerr)
self.gtkprog.stop()
return
2007-06-16 05:45:22 +00:00
self.gtkprog.start_import()
self.core.reset_ip_filter()
ltype = self.config.get('listtype')
print "importing with",ltype
2007-06-24 10:32:51 +00:00
try:
reader = readers[ltype][1](self.blockfile)
2007-06-24 10:32:51 +00:00
except IOError, (errno, strerr):
err = ui.GTKError("Couldn't open blocklist file: %s"%strerr)
self.gtkprog.stop()
return
2007-06-24 10:32:51 +00:00
print "Starting import"
ips = reader.next()
curr = 0
2007-06-25 07:53:58 +00:00
try:
while ips and not self.cancelled:
self.core.add_range_to_ip_filter(*ips)
ips = reader.next()
curr += 1
if curr % 100 == 0:
self.gtkprog.import_prog(text="Imported %s IPs"%curr)
else:
2007-06-24 18:55:47 +00:00
self.gtkprog.import_prog()
2007-06-25 07:53:58 +00:00
except FormatException, (ex):
err = ui.GTKError("Format error in blocklist: %s"%ex)
self.gtkprog.stop()
reader.close()
return
reader.close()
self.nimported = curr
2007-06-16 05:45:22 +00:00
self.gtkprog.end_import()
print "Import finished"
2007-06-16 05:45:22 +00:00
self.gtkprog.stop()
self.cancelled = False
def configure(self):
self.gtkconf.start(self.config.get('listtype'),
self.config.get('url'),
self.config.get('load_on_start'))
def setconfig(self, url, load_on_start, listtype):
self.config.set('url', url)
self.config.set('load_on_start', load_on_start)
self.config.set('listtype', listtype)
self.config.save()
self.loadlist(fetch=True)
def disable(self):
self.core.reset_ip_filter()
def unload(self):
self.core.reset_ip_filter()
def update(self):
msg = "[Blocklist: %s entries]" % self.nimported
2007-06-25 23:37:44 +00:00
self.interface.statusbar_temp_msg += ' ' + msg