add
This commit is contained in:
parent
4fe3d2769d
commit
976df3963f
|
@ -0,0 +1,95 @@
|
||||||
|
|
||||||
|
|
||||||
|
plugin_name = "Blocklist Importer"
|
||||||
|
plugin_author = "Steve 'Tarka' Smith"
|
||||||
|
plugin_version = "0.1"
|
||||||
|
plugin_description = "Downloads and import PeerGuardian blocklists"
|
||||||
|
|
||||||
|
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
|
||||||
|
from ui import GTKConfig, GTKProgress
|
||||||
|
|
||||||
|
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.gtkconf = GTKConfig(self)
|
||||||
|
self.gtkprog = GTKProgress(self)
|
||||||
|
|
||||||
|
self.blockfile = deluge.common.CONFIG_DIR + "/blocklist.p2b.gzip"
|
||||||
|
|
||||||
|
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):
|
||||||
|
# FIXME
|
||||||
|
#self.gtkprog.start()
|
||||||
|
|
||||||
|
# Attempt initial import
|
||||||
|
# FIXME: Make async
|
||||||
|
if fetch:
|
||||||
|
print "Downloading blocklist..."
|
||||||
|
filename, headers = urllib.urlretrieve(self.config.get('url'),
|
||||||
|
filename=self.blockfile,
|
||||||
|
reporthook=self._download_update)
|
||||||
|
print "Done"
|
||||||
|
|
||||||
|
self.core.reset_ip_filter()
|
||||||
|
reader = PGReader(self.blockfile)
|
||||||
|
|
||||||
|
ips = reader.next()
|
||||||
|
while ips:
|
||||||
|
print "Blocking",ips
|
||||||
|
self.core.add_range_to_ip_filter(*ips)
|
||||||
|
ips = reader.next()
|
||||||
|
|
||||||
|
reader.close()
|
||||||
|
|
||||||
|
# FIXME
|
||||||
|
#self.gtkprog.stop()
|
||||||
|
|
||||||
|
def configure(self):
|
||||||
|
self.gtkconf.start()
|
||||||
|
|
||||||
|
def setconfig(self, url, load_on_start):
|
||||||
|
self.config.set('url', url)
|
||||||
|
self.config.set('load_on_start', load_on_start)
|
||||||
|
self.config.save()
|
||||||
|
|
||||||
|
self.loadlist(fetch=True)
|
||||||
|
|
||||||
|
def disable(self):
|
||||||
|
self.core.reset_ip_filter()
|
||||||
|
|
||||||
|
def unload(self):
|
||||||
|
#self.config.save_to_file(self.config_file)
|
||||||
|
self.core.reset_ip_filter()
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
pass
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
from exceptions import Exception
|
||||||
|
from struct import unpack
|
||||||
|
import gzip, socket
|
||||||
|
|
||||||
|
class PGException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Incrementally reads PeerGuardian blocklists v1 and v2.
|
||||||
|
# See http://wiki.phoenixlabs.org/wiki/P2B_Format
|
||||||
|
class PGReader:
|
||||||
|
|
||||||
|
def __init__(self, filename):
|
||||||
|
print "PGReader loading",filename
|
||||||
|
|
||||||
|
# FIXME: Catch and convert exception?
|
||||||
|
self.fd = gzip.open(filename, "rb")
|
||||||
|
|
||||||
|
# 4 bytes, should be 0xffffffff
|
||||||
|
buf = self.fd.read(4)
|
||||||
|
hdr = unpack("l", buf)[0]
|
||||||
|
if hdr != -1:
|
||||||
|
print "LEADER IS",hdr
|
||||||
|
raise PGException("Invalid leader %d"%hdr)
|
||||||
|
|
||||||
|
magic = self.fd.read(3)
|
||||||
|
if magic != "P2B":
|
||||||
|
raise PGException("Invalid magic code")
|
||||||
|
|
||||||
|
buf = self.fd.read(1)
|
||||||
|
ver = ord(buf)
|
||||||
|
if ver != 1 and ver != 2:
|
||||||
|
raise PGException("Invalid version %d" % ver)
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
|
||||||
|
# Skip over the string
|
||||||
|
buf = -1
|
||||||
|
while buf != 0:
|
||||||
|
buf = self.fd.read(1)
|
||||||
|
if buf == "": # EOF
|
||||||
|
return False
|
||||||
|
buf = ord(buf)
|
||||||
|
|
||||||
|
buf = self.fd.read(4)
|
||||||
|
start = socket.inet_ntoa(buf)
|
||||||
|
|
||||||
|
buf = self.fd.read(4)
|
||||||
|
end = socket.inet_ntoa(buf)
|
||||||
|
|
||||||
|
return (start, end)
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.fd.close()
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
|
||||||
|
import gtk
|
||||||
|
|
||||||
|
class GTKConfig(gtk.Dialog):
|
||||||
|
def __init__(self, plugin):
|
||||||
|
gtk.Dialog.__init__(self, title="Blocklist Config",
|
||||||
|
flags=gtk.DIALOG_MODAL,
|
||||||
|
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
|
||||||
|
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
self.set_border_width(12)
|
||||||
|
self.vbox.set_spacing(6)
|
||||||
|
|
||||||
|
# List source
|
||||||
|
label = gtk.Label()
|
||||||
|
label.set_markup('<b>Blocklist URL</b>')
|
||||||
|
self.url = gtk.Entry()
|
||||||
|
self.listtype = gtk.combo_box_new_text()
|
||||||
|
self.listtype.append_text("PeerGuardian (GZip)")
|
||||||
|
self.listtype.set_active(0)
|
||||||
|
|
||||||
|
hbox = gtk.HBox(False, 6)
|
||||||
|
hbox.pack_start(label)
|
||||||
|
hbox.pack_start(self.url)
|
||||||
|
hbox.pack_start(self.listtype)
|
||||||
|
|
||||||
|
self.vbox.pack_start(hbox)
|
||||||
|
|
||||||
|
# Load on start
|
||||||
|
self.load_on_start = gtk.CheckButton("Load on start")
|
||||||
|
self.vbox.pack_start(self.load_on_start)
|
||||||
|
|
||||||
|
self.connect('response', self.ok)
|
||||||
|
self.connect('close', self.cancel)
|
||||||
|
|
||||||
|
self.hide_all()
|
||||||
|
|
||||||
|
self.plugin = plugin
|
||||||
|
|
||||||
|
|
||||||
|
def ok(self, dialog, response):
|
||||||
|
self.hide_all()
|
||||||
|
|
||||||
|
if response != gtk.RESPONSE_ACCEPT:
|
||||||
|
self.cancel(dialog)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.plugin.setconfig(self.url.get_text(),
|
||||||
|
self.load_on_start.get_active())
|
||||||
|
|
||||||
|
def cancel(self, dialog, response):
|
||||||
|
self.hide_all()
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
self.show_all()
|
||||||
|
|
||||||
|
|
||||||
|
class GTKProgress(gtk.Dialog):
|
||||||
|
def __init__(self, plugin):
|
||||||
|
gtk.Dialog.__init__(self, title="Setting-Up Blocklist",
|
||||||
|
flags=gtk.DIALOG_MODAL,
|
||||||
|
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
|
||||||
|
# Setup
|
||||||
|
self.set_border_width(12)
|
||||||
|
self.vbox.set_spacing(6)
|
||||||
|
|
||||||
|
label = gtk.Label()
|
||||||
|
label.set_markup('<b>Loading and installing blocklist</b>')
|
||||||
|
self.vbox.pack_start(label)
|
||||||
|
|
||||||
|
self.progress = gtk.ProgressBar()
|
||||||
|
self.vbox.pack_start(self.progress)
|
||||||
|
|
||||||
|
self.connect('close', self.cancel)
|
||||||
|
|
||||||
|
self.hide_all()
|
||||||
|
|
||||||
|
def download_prog(self, fract):
|
||||||
|
if fract > 1.0:
|
||||||
|
fract = 1.0
|
||||||
|
self.progress.set_fraction(fract)
|
||||||
|
|
||||||
|
def cancel(self, dialog, response):
|
||||||
|
self.hide_all()
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
print "showing all"
|
||||||
|
self.show_all()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.hide_all()
|
Loading…
Reference in New Issue