Author: johnnyg
Revision: 5478
Log:
Removed type combo box from gtkui (will be auto-detecting type).
Removed old format readers.
Added new format readers and decompressers.
Diff:
Modified: trunk/deluge/plugins/blocklist/blocklist/core.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/core.py 2009-07-12 23:33:54 UTC
(rev 5477)
+++ trunk/deluge/plugins/blocklist/blocklist/core.py 2009-07-13 05:12:26 UTC
(rev 5478)
@@ -49,28 +49,18 @@
from deluge.core.rpcserver import export
from deluge.httpdownloader import download_file
-from peerguardian import PGReader, PGException
-from text import TextReader, GZMuleReader, PGZip, PGTextReaderGzip
-
DEFAULT_PREFS = {
"url": "http://deluge-torrent.org/blocklist/nipfilter.dat.gz",
"load_on_start": False,
"check_after_days": 4,
- "list_type": "gzmule",
+ "list_compression": "",
+ "list_type": "",
"last_update": "",
"list_size": 0,
"timeout": 180,
"try_times": 3,
}
-FORMATS = {
- 'gzmule': ["Emule IP list (GZip)", GZMuleReader],
- 'spzip': ["SafePeer Text (Zipped)", PGZip],
- 'pgtext': ["PeerGuardian Text (Uncompressed)", TextReader],
- 'p2bgz': ["PeerGuardian P2B (GZip)", PGReader],
- 'pgtextgz': ["PeerGuardian Text (GZip)", PGTextReaderGzip]
-}
-
class Core(CorePluginBase):
def enable(self):
log.debug('Blocklist: Plugin enabled..')
@@ -81,6 +71,7 @@
self.up_to_date = False
self.num_blocked = 0
self.file_progress = 0.0
+ self.reader = None
self.core = component.get("Core")
@@ -153,13 +144,19 @@
else:
status["state"] = "Idle"
+ if self.config["list_compression"]:
+ status["file_type"] = self.config["list_compression"] + " "
+ + self.config["list_type"]
+
status["up_to_date"] = self.up_to_date
status["num_blocked"] = self.num_blocked
status["file_progress"] = self.file_progress
- status["file_type"] = self.config["list_type"]
status["file_url"] = self.config["url"]
status["file_size"] = self.config["list_size"]
status["file_date"] = self.config["last_update"]
+ status["file_type"] = self.config["list_type"]
+ if self.config["list_compression"]:
+ status["file_type"] += " (%s)" % self.config["list_compression"]
return status
@@ -237,6 +234,10 @@
def import_list(self, force=False):
"""Imports the downloaded blocklist into the session"""
+ def on_read_ip_range(ip_range):
+ # TODO: add to lt session
+ self.num_blocked += 1
+
if self.use_cache and self.has_imported:
log.debug("Latest blocklist is already imported")
return True
@@ -244,9 +245,10 @@
self.is_importing = True
self.num_blocked = 0
- # TODO: Open blocklist with appropriate reader
- # TODO: Import ranges
+ if not self.reader:
+ # TODO: auto-detect reader
+ #return threads.deferToThread(self.reader.read(on_read_ip_range))
return defer.succeed(None)
def on_import_complete(self, result):
Modified: trunk/deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade
2009-07-12 23:33:54 UTC (rev 5477)
+++ trunk/deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade
2009-07-13 05:12:26 UTC (rev 5478)
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.5 on Sat Feb 14 14:23:56 2009 -->
+<?xml version="1.0"?>
<glade-interface>
+ <!-- interface-requires gtk+ 2.12 -->
+ <!-- interface-naming-policy toplevel-contextual -->
<widget class="GtkWindow" id="window1">
<child>
<widget class="GtkVBox" id="blocklist_prefs_box">
@@ -11,68 +11,31 @@
<widget class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="label_xalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="shadow_type">none</property>
<child>
<widget class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="left_padding">12</property>
<child>
- <widget class="GtkVBox" id="vbox2">
+ <widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="spacing">5</property>
<child>
- <widget class="GtkHBox" id="hbox1">
+ <widget class="GtkLabel" id="label3">
<property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label"
translatable="yes">Type:</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkComboBox" id="combobox_types">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
+ <property name="label"
translatable="yes">URL:</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox2">
+ <widget class="GtkEntry" id="entry_url">
<property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label"
translatable="yes">URL:</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkEntry" id="entry_url">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
</widget>
<packing>
<property name="position">1</property>
@@ -96,13 +59,14 @@
</widget>
<packing>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkFrame" id="frame2">
<property name="visible">True</property>
<property name="label_xalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="shadow_type">none</property>
<child>
<widget class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
@@ -158,14 +122,15 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="chk_import_on_start">
+ <property name="label" translatable="yes">Import
blocklist on startup</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="label" translatable="yes">Import
blocklist on startup</property>
- <property name="response_id">0</property>
+ <property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
@@ -199,7 +164,7 @@
<widget class="GtkFrame" id="frame3">
<property name="visible">True</property>
<property name="label_xalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="shadow_type">none</property>
<child>
<widget class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
@@ -218,7 +183,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip"
translatable="yes">Download the blocklist file if necessary and import the
file.</property>
- <property name="response_id">0</property>
<signal name="clicked"
handler="on_button_check_download_clicked"/>
<child>
<widget class="GtkHBox" id="hbox4">
@@ -232,6 +196,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
@@ -251,6 +216,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
@@ -259,7 +225,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip"
translatable="yes">Download a new blocklist file and import it.</property>
- <property name="response_id">0</property>
<signal name="clicked"
handler="on_button_force_download_clicked"/>
<child>
<widget class="GtkHBox" id="hbox5">
@@ -273,6 +238,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
@@ -296,6 +262,9 @@
</packing>
</child>
</widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
</child>
<child>
<widget class="GtkImage" id="image_up_to_date">
@@ -333,7 +302,7 @@
<widget class="GtkFrame" id="frame4">
<property name="visible">True</property>
<property name="label_xalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="shadow_type">none</property>
<child>
<widget class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
@@ -346,6 +315,9 @@
<widget class="GtkProgressBar" id="progressbar">
<property name="visible">True</property>
</widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
</child>
<child>
<widget class="GtkTable" id="table_info">
Added: trunk/deluge/plugins/blocklist/blocklist/decompressers.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/decompressers.py
(rev 0)
+++ trunk/deluge/plugins/blocklist/blocklist/decompressers.py 2009-07-13
05:12:26 UTC (rev 5478)
@@ -0,0 +1,59 @@
+#
+# decompressers.py
+#
+# Copyright (C) 2009 John Garland <[email protected]>
+#
+# Deluge is free software.
+#
+# You may redistribute it and/or modify it under the terms of the
+# GNU General Public License, as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option)
+# any later version.
+#
+# deluge is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with deluge. If not, write to:
+# The Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor
+# Boston, MA 02110-1301, USA.
+#
+# In addition, as a special exception, the copyright holders give
+# permission to link the code of portions of this program with the OpenSSL
+# library.
+# You must obey the GNU General Public License in all respects for all of
+# the code used other than OpenSSL. If you modify file(s) with this
+# exception, you may extend this exception to your version of the file(s),
+# but you are not obligated to do so. If you do not wish to do so, delete
+# this exception statement from your version. If you delete this exception
+# statement from all source files in the program, then also delete it here.
+#
+#
+
+import gzip, zipfile, bz2
+import new
+
+def Zip(reader):
+ """Blocklist reader for zipped blocklists"""
+ def open(self):
+ z = zipfile.ZipFile(self.file)
+ return z.open(z.namelist()[0])
+ setattr(reader, "open", new.instancemethod(open, reader))
+ return reader
+
+def GZip(reader):
+ """Blocklist reader for gzipped blocklists"""
+ def open(self):
+ return gzip.open(self.file)
+ setattr(reader, "open", new.instancemethod(open, reader))
+ return reader
+
+def BZip2(reader):
+ """Blocklist reader for bzipped2 blocklists"""
+ def open(self):
+ return bz2.BZ2File(self.file)
+ setattr(reader, "open", new.instancemethod(open, reader))
+ return reader
Modified: trunk/deluge/plugins/blocklist/blocklist/gtkui.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/gtkui.py 2009-07-12 23:33:54 UTC
(rev 5477)
+++ trunk/deluge/plugins/blocklist/blocklist/gtkui.py 2009-07-13 05:12:26 UTC
(rev 5478)
@@ -42,8 +42,6 @@
from deluge.plugins.pluginbase import GtkPluginBase
import common
-from core import FORMATS
-
class GtkUI(GtkPluginBase):
def enable(self):
log.debug("Blocklist GtkUI enable..")
@@ -118,11 +116,6 @@
deluge.common.fsize(status["file_size"]))
self.glade.get_widget("label_modified").set_text(
str(status["file_date"]))
- try:
- self.glade.get_widget("label_type").set_text(
- FORMATS[status["file_type"]][0])
- except KeyError:
- self.glade.get_widget("label_type").set_text("")
self.glade.get_widget("label_url").set_text(
status["file_url"])
@@ -131,11 +124,6 @@
def _on_show_prefs(self):
def _on_get_config(config):
- # Update the combo box. It's ugly, get over it.
- self.glade.get_widget("combobox_types").set_active_iter(
- self.glade.get_widget("combobox_types").get_model().\
- get_iter(FORMATS[config["list_type"]][1]))
-
self.glade.get_widget("entry_url").set_text(
config["url"])
@@ -149,8 +137,6 @@
def _on_apply_prefs(self):
config = {}
- config["list_type"] = self.glade.get_widget("combobox_types").\
-
get_model()[self.glade.get_widget("combobox_types").get_active()][1]
config["url"] = self.glade.get_widget("entry_url").get_text()
config["check_after_days"] =
self.glade.get_widget("spin_check_days").get_value_as_int()
config["load_on_start"] =
self.glade.get_widget("chk_import_on_start").get_active()
@@ -184,20 +170,6 @@
"on_button_force_download_clicked":
self._on_button_force_download_clicked
})
- # Setup types combobox
- combo = self.glade.get_widget("combobox_types")
- combo_list = gtk.ListStore(str, str)
- combo.set_model(combo_list)
- cell = gtk.CellRendererText()
- combo.pack_start(cell, False)
- combo.add_attribute(cell, "text", 0)
-
- for k in FORMATS.keys():
- i = combo_list.append([FORMATS[k][0], k])
- FORMATS[k][1] = combo_list.get_path(i)
-
- combo.set_active(0)
-
# Set button icons
self.glade.get_widget("image_download").set_from_file(
common.get_resource("blocklist_download24.png"))
Added: trunk/deluge/plugins/blocklist/blocklist/readers.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/readers.py
(rev 0)
+++ trunk/deluge/plugins/blocklist/blocklist/readers.py 2009-07-13 05:12:26 UTC
(rev 5478)
@@ -0,0 +1,80 @@
+#
+# readers.py
+#
+# Copyright (C) 2009 John Garland <[email protected]>
+#
+# Deluge is free software.
+#
+# You may redistribute it and/or modify it under the terms of the
+# GNU General Public License, as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option)
+# any later version.
+#
+# deluge is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with deluge. If not, write to:
+# The Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor
+# Boston, MA 02110-1301, USA.
+#
+# In addition, as a special exception, the copyright holders give
+# permission to link the code of portions of this program with the OpenSSL
+# library.
+# You must obey the GNU General Public License in all respects for all of
+# the code used other than OpenSSL. If you modify file(s) with this
+# exception, you may extend this exception to your version of the file(s),
+# but you are not obligated to do so. If you do not wish to do so, delete
+# this exception statement from your version. If you delete this exception
+# statement from all source files in the program, then also delete it here.
+#
+#
+
+from deluge.log import LOG as log
+
+class BaseReader(object):
+ """Base reader for blocklist files"""
+ def __init__(self, file):
+ """Creates a new BaseReader given a file"""
+ self.file = file
+
+ def open(self):
+ """Opens the associated file for reading"""
+ return open(self.file)
+
+ def parse(self, line):
+ """Extracts ip range from given line"""
+ raise NotYetImplemented
+
+ def read(self, callback):
+ """Calls callback on each ip range in the file"""
+ for ip_range in self.readranges():
+ callback(ip_range)
+
+ def is_valid(self, line):
+ return not line.startswith('#') and line.strip() != ""
+
+ def readranges(self):
+ """Yields each ip range from the file"""
+ blocklist = self.open()
+ for line in blocklist:
+ if self.is_valid(line):
+ yield self.parse(line)
+ blocklist.close()
+
+class EmuleReader(BaseReader):
+ """Blocklist reader for emule style blocklists"""
+ def parse(self, line):
+ return line.strip().split(" , ")[0].split(" - ")
+
+class SafePeerReader(BaseReader):
+ """Blocklist reader for SafePeer style blocklists"""
+ def parse(self, line):
+ return line.strip().split(":")[1].split("-")
+
+class PeerGuardianReader(SafePeerReader):
+ """Blocklist reader for PeerGuardian style blocklists"""
+ pass
Deleted: trunk/deluge/plugins/blocklist/blocklist/text.py
===================================================================
--- trunk/deluge/plugins/blocklist/blocklist/text.py 2009-07-12 23:33:54 UTC
(rev 5477)
+++ trunk/deluge/plugins/blocklist/blocklist/text.py 2009-07-13 05:12:26 UTC
(rev 5478)
@@ -1,151 +0,0 @@
-##
-# Copyright 2007 Steve 'Tarka' Smith ([email protected])
-# Distributed under the same terms as Deluge
-##
-
-
-from exceptions import Exception
-import re, gzip, os
-from socket import inet_aton
-from struct import unpack
-from zipfile import ZipFile
-
-from deluge.log import LOG as log
-
-class TextException(Exception):
- pass
-
-class FormatException(TextException):
- pass
-
-class TextBase:
-
- def __init__(self, fd, regexp):
- log.debug("TextBase loading")
- self.count = 0
- self.fd = fd
- self.re = re.compile(regexp)
-
- def next(self):
- self.count += 1
-
- txt = self.fd.readline()
- if txt == "":
- return False
-
- match = self.re.search(txt)
- if not match:
- log.debug("Blocklist: TextBase: Wrong file type or corrupted
blocklist file.")
-
- try:
- g = match.groups()
- except AttributeError:
- pass
- else:
- start = ".".join(g[0:4])
- end = ".".join(g[4:8])
-
- return (start, end)
-
- def close(self):
- self.fd.close()
-
-
-# This reads PeerGuardian text-formatted block-lists
-class PGTextReader(TextBase):
-
- def __init__(self, fd):
- log.debug("PGTextReader loading")
- regexp = ':(\d+)\.(\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$'
- TextBase.__init__(self, fd, regexp)
-
-class PGTextReaderGzip(PGTextReader):
- def __init__(self, filename):
- log.debug("PGTextReaderGzip loading")
- try:
- PGTextReader.__init__(self, gzip.open(filename, "r"))
- except:
- log.debug("Wrong file type or corrupted blocklist file.")
-
-# This reads uncompressed PG text list
-class TextReader(PGTextReader):
-
- def __init__(self, filename):
- log.debug("TextReader loading: %s", filename)
- try:
- PGTextReader.__init__(self, open(filename, 'r'))
- except:
- log.debug("Wrong file type or corrupted blocklist file.")
-
-
-# Reads Emule style blocklists (aka nipfilter)
-class MuleReader(TextBase):
-
- def __init__(self, fd):
- log.debug("MuleReader loading")
- regexp =
'0*(\d+)\.0*(\d+)\.0*(\d+)\.0*(\d+)\s*-\s*0*(\d+)\.0*(\d+)\.0*(\d+)\.0*(\d+)\s*,'
- TextBase.__init__(self, fd, regexp)
-
-class GZMuleReader(MuleReader):
-
- def __init__(self, filename):
- log.debug("GZMuleReader loading: %s", filename)
- try:
- MuleReader.__init__(self, gzip.open(filename, "r"))
- except:
- log.debug("Wrong file type or corrupted blocklist file.")
-
-
-# Reads zip files from SafePeer style files
-class PGZip(TextBase):
-
- def __init__(self, filename):
- # Open zip and extract first file
- try:
- self.zfd = ZipFile(filename, 'r')
- except:
- log.debug("Blocklist: PGZip: Wrong file type or corrupted
blocklist file.")
- else:
- self.files = self.zfd.namelist()
- self.opennext()
-
- def opennext(self):
- self.tmp = os.tmpfile()
- f = self.files.pop()
- log.debug("Loading file: %s", f)
- self.tmp.write(self.zfd.read(f))
- self.tmp.seek(0)
- self.reader = PGTextReader(self.tmp)
-
- def next(self):
- try:
- ret = self.reader.next()
- if not ret:
- # This bit is repeated below and could be moved into a
- # new procedure. However I'm not clear on how this
- # would effect tail recursion, so it remains
- # broken-out for now.
- if len(self.files) > 0:
- self.opennext()
- return self.next()
- else:
- # End of zip
- return False
- return ret
-
- except FormatException, e:
- log.debug("Blocklist: PGZip: Got format exception for zipfile")
- # Just skip
- if len(self.files) > 0:
- self.opennext()
- return self.next()
- else:
- return False
- except AttributeError:
- pass
-
- def close(self):
- try:
- self.zfd.close()
- except AttributeError:
- pass
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---