diff --git a/ChangeLog b/ChangeLog index 72ef70b97..c06abda55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,9 @@ Deluge 1.1.0_RC2 (In Development) Core: * Fix new version check + Plugins: + * Remove Stats plugin since it wasn't intended to be in this release + Deluge 1.1.0_RC1 (23 December 2008) Core: * Implement #79 ability to change outgoing port range diff --git a/deluge/plugins/stats/create_dev_link.sh b/deluge/plugins/stats/create_dev_link.sh deleted file mode 100755 index 35e5c2a5c..000000000 --- a/deluge/plugins/stats/create_dev_link.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -mkdir temp -export PYTHONPATH=./temp -python setup.py develop --install-dir ./temp -cp ./temp/Stats.egg-link ~/.config/deluge/plugins -rm -fr ./temp diff --git a/deluge/plugins/stats/setup.py b/deluge/plugins/stats/setup.py deleted file mode 100644 index b10c305f8..000000000 --- a/deluge/plugins/stats/setup.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# setup.py -# -# Copyright (C) 2008 Martijn Voncken -# -# Basic plugin template created by: -# Copyright (C) 2008 Martijn Voncken -# Copyright (C) 2007, 2008 Andrew Resch -# -# 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 - -from setuptools import setup - -__plugin_name__ = "Stats" -__author__ = "Martijn Voncken" -__author_email__ = "mvoncken@gmail.com" -__version__ = "0.1" -__url__ = "http://deluge-torrent.org" -__license__ = "GPLv3" -__description__ = "" -__long_description__ = """""" -__pkg_data__ = {__plugin_name__.lower(): ["template/*", "data/*"]} - -setup( - name=__plugin_name__, - version=__version__, - description=__description__, - author=__author__, - author_email=__author_email__, - url=__url__, - license=__license__, - long_description=__long_description__, - - packages=[__plugin_name__.lower()], - package_data = __pkg_data__, - - entry_points=""" - [deluge.plugin.core] - %s = %s:CorePlugin - [deluge.plugin.gtkui] - %s = %s:GtkUIPlugin - [deluge.plugin.webui] - %s = %s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower())*3) -) diff --git a/deluge/plugins/stats/stats/__init__.py b/deluge/plugins/stats/stats/__init__.py deleted file mode 100644 index e2718bbb4..000000000 --- a/deluge/plugins/stats/stats/__init__.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# __init__.py -# -# Copyright (C) 2008 Martijn Voncken -# -# Basic plugin template created by: -# Copyright (C) 2008 Martijn Voncken -# Copyright (C) 2007, 2008 Andrew Resch -# -# 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 - -from deluge.log import LOG as log - -from deluge.plugins.init import PluginBase - -class CorePlugin(PluginBase): - def __init__(self, plugin_api, plugin_name): - # Load the Core portion of the plugin - try: - from core import Core - self.plugin = Core(plugin_api, plugin_name) - except Exception, e: - log.debug("Did not load a Core plugin: %s", e) - -class WebUIPlugin(PluginBase): - def __init__(self, plugin_api, plugin_name): - try: - from webui import WebUI - self.plugin = WebUI(plugin_api, plugin_name) - except Exception, e: - log.debug("Did not load a WebUI plugin: %s", e) - -class GtkUIPlugin(PluginBase): - def __init__(self, plugin_api, plugin_name): - # Load the GtkUI portion of the plugin - try: - from gtkui import GtkUI - self.plugin = GtkUI(plugin_api, plugin_name) - except Exception, e: - log.debug("Did not load a GtkUI plugin: %s", e) diff --git a/deluge/plugins/stats/stats/core.py b/deluge/plugins/stats/stats/core.py deleted file mode 100644 index 79bdb8b3b..000000000 --- a/deluge/plugins/stats/stats/core.py +++ /dev/null @@ -1,156 +0,0 @@ -# -# core.py -# -# Copyright (C) 2008 Damien Churchill -# Copyright (C) 2008 Martijn Voncken -# Copyright (C) Marcos Pinto 2007 -# -# 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 - -import deluge -from deluge.log import LOG as log -from deluge.plugins.corepluginbase import CorePluginBase -from deluge import component -from deluge import configmanager -import gobject -#from deluge.plugins.coreclient import client #1.1 and later only -#client: see http://dev.deluge-torrent.org/wiki/Development/UiClient#Remoteapi - -DEFAULT_PREFS = { - "test":"NiNiNi", - "update_interval":2000, #2 seconds. - "length":150, # 2 seconds * 150 --> 5 minutes. -} - -DEFAULT_TOTALS = { - "total_upload":0, - "total_download":0, - "total_payload_upload":0, - "total_payload_download":0, - "stats":{} -} - -class Core(CorePluginBase): - totals = {} #class var to catch only updating this once per session in enable. - - def enable(self): - self.core = component.get("Core") - self.stats ={} - - self.config = configmanager.ConfigManager("stats.conf", DEFAULT_PREFS) - self.saved_stats = configmanager.ConfigManager("stats.totals", DEFAULT_TOTALS) - if self.totals == {}: - self.totals.update(self.saved_stats.config) - - self.stats = self.saved_stats.get("stats") or {} - self.add_stats( - 'upload_rate', - 'download_rate', - 'num_connections', - 'dht_nodes', - 'dht_cache_nodes', - 'dht_torrents', - ) - - self.update_timer = gobject.timeout_add( - self.config.get("update_interval"), self.update_stats) - self.save_timer = gobject.timeout_add(60 * 1000, self.save_stats) - self.length = self.config.get("length") - - def disable(self): - self.save_stats() - gobject.source_remove(self.update_timer) - gobject.source_remove(self.save_timer) - - def add_stats(self, *stats): - for stat in stats: - if stat not in self.stats: - self.stats[stat] = [] - - def update_stats(self): - try: - stats = self.core.export_get_stats() - status = self.core.session.status() - for stat in dir(status): - if not stat.startswith('_') and stat not in stats: - stats[stat] = getattr(status, stat, None) - - for stat, stat_list in self.stats.iteritems(): - if stat in stats: - stat_list.insert(0, int(stats[stat])) - - if len(stat_list) > self.length: - stat_list.pop() - except Exception,e: - log.error(e.message) - return True - - def save_stats(self): - try: - self.saved_stats.set("stats", self.stats) - self.saved_stats.config.update(self.export_get_totals()) - self.saved_stats.save() - except Exception,e: - log.error(e.message) - return True - - - # export: - def export_get_stats(self, keys): - stats_dict = {} - for stat in self.stats: - if stat not in keys: - continue - stats_dict[stat] = self.stats[stat] - return stats_dict - - def export_get_totals(self): - result = {} - session_totals = self.export_get_session_totals() - for key in session_totals: - result[key] = self.totals[key] + session_totals[key] - return result - - def export_get_session_totals(self): - status = self.core.session.status() - return { - "total_upload":status.total_upload, - "total_download":status.total_download, - "total_payload_upload":status.total_payload_upload, - "total_payload_download":status.total_payload_download - } - - def export_set_config(self, config): - "sets the config dictionary" - for key in config.keys(): - self.config[key] = config[key] - self.config.save() - - def export_get_config(self): - "returns the config dictionary" - return self.config.config diff --git a/deluge/plugins/stats/stats/data/config.glade b/deluge/plugins/stats/stats/data/config.glade deleted file mode 100644 index e39b5204b..000000000 --- a/deluge/plugins/stats/stats/data/config.glade +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - True - - - True - Test config value: - - - - - True - True - - - 1 - - - - - - diff --git a/deluge/plugins/stats/stats/data/tabs.glade b/deluge/plugins/stats/stats/data/tabs.glade deleted file mode 100644 index c3616a6a5..000000000 --- a/deluge/plugins/stats/stats/data/tabs.glade +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - True - - - True - - - True - gtk-page-setup - - - - - True - Graphs - - - 1 - - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GTK_POS_LEFT - - - True - - - - - True - Bandwidth - - - tab - False - - - - - True - - - 1 - - - - - True - Connections - - - tab - 1 - False - - - - - True - - - 2 - - - - - True - Seeds/Peers - - - tab - 2 - False - - - - - - - 1 - - - - - - diff --git a/deluge/plugins/stats/stats/graph.py b/deluge/plugins/stats/stats/graph.py deleted file mode 100644 index 80bc53457..000000000 --- a/deluge/plugins/stats/stats/graph.py +++ /dev/null @@ -1,250 +0,0 @@ -# -# graph.py -# -# Copyright (C) 2008 Damien Churchill -# Copyright (C) 2008 Martijn Voncken -# Copyright (C) Marcos Pinto 2007 -# -# 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 - -""" -port of old plugin by markybob. -""" -import time -import cairo -from deluge.log import LOG as log -from deluge.ui.client import aclient - -black = (0, 0, 0) -gray = (0.75, 0.75, 0.75) -white = (1.0, 1.0, 1.0) -darkred = (0.65, 0, 0) -red = (1.0, 0, 0) -green = (0, 1.0, 0) -blue = (0, 0, 1.0) -orange = (1.0, 0.74, 0) - -def default_formatter(value): - return str(value) - -def change_opacity(color, opactiy): - """A method to assist in changing the opactiy of a color inorder to draw the - fills. - """ - color = list(color) - if len(color) == 4: - color[3] = opactiy - else: - color.append(opactiy) - return tuple(color) - -class Graph: - def __init__(self): - self.width = 100 - self.height = 100 - self.length = 150 - self.stat_info = {} - self.line_size = 2 - self.mean_selected = True - self.legend_selected = True - self.max_selected = True - self.black = (0, 0 , 0,) - self.interval = 2000 # 2 secs - self.text_bg = (255, 255 , 255, 128) # prototyping - self.set_left_axis() - - def set_left_axis(self, **kargs): - self.left_axis = kargs - - def add_stat(self, stat, label='', axis='left', line=True, fill=True, color=None): - self.stat_info[stat] = { - 'axis': axis, - 'label': label, - 'line': line, - 'fill': fill, - 'color': color - } - - def async_request(self): - aclient.stats_get_stats(self.set_stats, self.stat_info.keys()) - aclient.stats_get_config(self.set_config) - - def set_stats(self, stats): - self.stats = stats - - def set_config(self, config): - self.length = config["length"] - self.interval = config["update_interval"] - - def draw_to_context(self, context, width, height): - self.ctx = context - self.width, self.height = width, height - self.draw_rect(white, 0, 0, self.width, self.height) - self.draw_x_axis() - self.draw_left_axis() - - if self.legend_selected: - self.draw_legend() - return self.ctx - - def draw(self, width, height): - self.width = width - self.height = height - - self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.width, self.height) - self.ctx = cairo.Context(self.surface) - self.draw_rect(white, 0, 0, self.width, self.height) - self.draw_x_axis() - self.draw_left_axis() - - if self.legend_selected: - self.draw_legend() - return self.surface - - def draw_x_axis(self): - now = time.time() - duration = self.length * (self.interval / 1000.0) - start = now - duration - ratio = (self.width - 40) / duration - seconds_to_minute = 60 - time.localtime(start)[5] - - for i in xrange(0, 5): - text = time.strftime('%H:%M', time.localtime(start + seconds_to_minute + (60*i))) - x = int(ratio * (seconds_to_minute + (60*i))) - self.draw_text(text, x + 46, self.height - 20) - x = x + 59.5 - self.draw_dotted_line(gray, x, 20, x, self.height - 20) - - y = self.height - 22.5 - self.draw_dotted_line(gray, 60, y, int(self.width), y) - - def draw_left_axis(self): - stats = {} - max_values = [] - for stat in self.stat_info: - if self.stat_info[stat]['axis'] == 'left': - stats[stat] = self.stat_info[stat] - stats[stat]['values'] = self.stats[stat] - stats[stat]['fill_color'] = change_opacity(stats[stat]['color'], 0.5) - stats[stat]['color'] = change_opacity(stats[stat]['color'], 0.8) - stats[stat]['max_value'] = max(self.stats[stat]) - max_values.append(stats[stat]['max_value']) - if len(max_values) > 1: - max_value = max(*max_values) - else: - max_value = max_values[0] - - if max_value < self.left_axis['min']: - max_value = self.left_axis['min'] - - height = self.height - self.line_size - 22 - #max_value = float(round(max_value, len(str(max_value)) * -1)) - max_value = float(max_value) - ratio = height / max_value - - for i in xrange(1, 6): - y = int(ratio * ((max_value / 5) * i)) - 0.5 - if i < 5: - self.draw_dotted_line(gray, 60, y, self.width, y) - text = self.left_axis['formatter']((max_value / 5) * (5 - i)) - self.draw_text(text, 0, y - 6) - self.draw_dotted_line(gray, 60.5, 20, 60.5, self.height - 20) - - for stat, info in stats.iteritems(): - self.draw_value_poly(info['values'], info['color'], max_value) - self.draw_value_poly(info['values'], info['fill_color'], max_value, info['fill']) - - def draw_legend(self): - pass - - def trace_path(self, values, max_value): - height = self.height - 24 - width = self.width - line_width = self.line_size - - self.ctx.set_line_width(line_width) - self.ctx.move_to(width, height) - - self.ctx.line_to(width, - int(height - ((height - 28) * values[0] / max_value))) - - x = width - step = (width - 60) / float(self.length) - for i, value in enumerate(values): - if i == self.length - 1: - x = 62 - self.ctx.line_to(x, - int(height - 1 - ((height - 28) * value / max_value)) - ) - x -= step - - self.ctx.line_to( - int(width + 62 - (((len(values) - 1) * width) / (self.length - 1))), - height) - self.ctx.close_path() - - def draw_value_poly(self, values, color, max_value, fill=False): - self.trace_path(values, max_value) - self.ctx.set_source_rgba(*color) - - if fill: - self.ctx.fill() - else: - self.ctx.stroke() - - def draw_text(self, text, x, y): - self.ctx.set_font_size(9) - self.ctx.move_to(x, y + 9) - self.ctx.set_source_rgba(*self.black) - self.ctx.show_text(text) - - def draw_rect(self, color, x, y, height, width): - self.ctx.set_source_rgba(*color) - self.ctx.rectangle(x, y, height, width) - self.ctx.fill() - - def draw_line(self, color, x1, y1, x2, y2): - self.ctx.set_source_rgba(*color) - self.ctx.set_line_width(1) - self.ctx.move_to(x1, y1) - self.ctx.line_to(x2, y2) - self.ctx.stroke() - - def draw_dotted_line(self, color, x1, y1, x2, y2): - self.ctx.set_source_rgba(*color) - self.ctx.set_line_width(1) - self.ctx.move_to(x1, y1) - self.ctx.line_to(x2, y2) - #self.ctx.stroke_preserve() - #self.ctx.set_source_rgba(*white) - #self.ctx.set_dash((1, 1), 4) - self.ctx.stroke() - #self.ctx.set_dash((1, 1), 0) - -if __name__ == "__main__": - import test \ No newline at end of file diff --git a/deluge/plugins/stats/stats/gtkui.py b/deluge/plugins/stats/stats/gtkui.py deleted file mode 100644 index d57169a00..000000000 --- a/deluge/plugins/stats/stats/gtkui.py +++ /dev/null @@ -1,115 +0,0 @@ -# -# gtkui.py -# -# Copyright (C) 2008 Martijn Voncken -# -# Basic plugin template created by: -# Copyright (C) 2008 Martijn Voncken -# Copyright (C) 2007, 2008 Andrew Resch -# -# 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 - -import gtk -import gobject -from gtk.glade import XML - -import graph -from deluge import component -from deluge.log import LOG as log -from deluge.common import fspeed -from deluge.ui.client import aclient -from deluge.ui.gtkui.torrentdetails import Tab - -class GraphsTab(Tab): - def __init__(self, glade): - Tab.__init__(self) - self._name = 'Graphs' - self.glade = glade - self.window = self.glade.get_widget('graph_tab') - self.notebook = self.glade.get_widget('graph_notebook') - self.label = self.glade.get_widget('graph_label') - self.bandwidth_graph = self.glade.get_widget('bandwidth_graph') - self.bandwidth_graph.connect('expose_event', self.bandwidth_expose) - self.window.unparent() - self.label.unparent() - - def bandwidth_expose(self, widget, event): - self.graph_widget = self.bandwidth_graph - self.graph = graph.Graph() - self.graph.add_stat('download_rate', label='Download Rate', color=graph.green) - self.graph.add_stat('upload_rate', label='Upload Rate', color=graph.blue) - self.graph.set_left_axis(formatter=fspeed, min=10240) - self.update_timer = gobject.timeout_add(2000, self.update_graph) - self.update_graph() - - def update_graph(self): - width, height = self.graph_widget.allocation.width, self.graph_widget.allocation.height - context = self.graph_widget.window.cairo_create() - self.graph.async_request() - aclient.force_call(True) - self.graph.draw_to_context(context, width, height) - return True - -class GtkUI(object): - def __init__(self, plugin_api, plugin_name): - log.debug("Calling Stats UI init") - self.plugin = plugin_api - - def enable(self): - self.glade = XML(self.get_resource("config.glade")) - self.plugin.add_preferences_page("Stats", self.glade.get_widget("prefs_box")) - self.plugin.register_hook("on_apply_prefs", self.on_apply_prefs) - self.plugin.register_hook("on_show_prefs", self.on_show_prefs) - self.on_show_prefs() - - self.graphs_tab = GraphsTab(XML(self.get_resource("tabs.glade"))) - self.torrent_details = component.get('TorrentDetails') - self.torrent_details.notebook.append_page(self.graphs_tab.window, self.graphs_tab.label) - - def disable(self): - self.plugin.remove_preferences_page("Stats") - self.plugin.deregister_hook("on_apply_prefs", self.on_apply_prefs) - self.plugin.deregister_hook("on_show_prefs", self.on_show_prefs) - - def on_apply_prefs(self): - log.debug("applying prefs for Stats") - config = { - "test":self.glade.get_widget("txt_test").get_text() - } - aclient.stats_set_config(None, config) - - def on_show_prefs(self): - aclient.stats_get_config(self.cb_get_config) - - def cb_get_config(self, config): - "callback for on show_prefs" - self.glade.get_widget("txt_test").set_text(config["test"]) - - def get_resource(self, filename): - import pkg_resources, os - return pkg_resources.resource_filename("stats", os.path.join("data", filename)) diff --git a/deluge/plugins/stats/stats/template/graph.html b/deluge/plugins/stats/stats/template/graph.html deleted file mode 100644 index 2ff803bcb..000000000 --- a/deluge/plugins/stats/stats/template/graph.html +++ /dev/null @@ -1,12 +0,0 @@ -$:render.header(_("Network Graph"), 'graph') -$:render.admin_toolbar('graph') - -
- -
-
-
- - - -$:render.footer() diff --git a/deluge/plugins/stats/stats/test.html b/deluge/plugins/stats/stats/test.html deleted file mode 100644 index 7af5f1502..000000000 --- a/deluge/plugins/stats/stats/test.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - -
- - - diff --git a/deluge/plugins/stats/stats/test.py b/deluge/plugins/stats/stats/test.py deleted file mode 100644 index 373e97032..000000000 --- a/deluge/plugins/stats/stats/test.py +++ /dev/null @@ -1,78 +0,0 @@ -from deluge.ui.client import sclient, aclient -sclient.set_core_uri() -import graph -import deluge - -def test_sync(): - if 1: - upload = sclient.graph_get_upload() - download = sclient.graph_get_download() - print upload - print download - else: - upload = [66804, 66915, 66974, 67447, 67540, 67318, 67320, 67249, 66659, 66489, 67027, 66914, 66802, 67303, 67654, 67643, 67763, 67528, 67523, 67431, 67214, 66939, 67316, 67020, 66881, 67103, 67377, 67141, 67366, 67492, 67375, 67203, 67056, 67010, 67029, 66741, 66695, 66868, 66805, 66264, 66249, 66317, 66459, 66306, 66681, 66954, 66662, 66278, 65921, 65695, 65681, 65942, 66000, 66140, 66424, 66480, 66257, 66271, 66145, 65854, 65568, 65268, 65112, 65050, 65027, 64676, 64655, 64178, 64386, 63979, 63271, 62746, 62337, 62297, 62496, 62902, 63801, 64121, 62957, 62921, 63051, 62644, 63240, 64107, 63968, 63987, 63644, 63263, 63153, 62999, 62843, 62777, 63101, 63078, 63178, 63126, 63401, 62630, 62451, 62505, 62254, 61485, 61264, 60937, 60568, 61011, 61109, 60325, 60196, 59640, 59619, 59514, 60813, 60572, 61632, 61689, 63365, 64583, 66396, 67179, 68209, 68295, 67674, 67559, 67195, 66178, 65632, 66124, 66456, 66676, 67183, 67620, 66960, 66347, 65925, 65907, 65896, 66738, 66703, 67060, 67004, 67007, 66329, 65304, 52002, 38969, 25433, 12426, 0, 0] - download = [42926, 43853, 43157, 45470, 44254, 46272, 45083, 47344, 46716, 51963, 50112, 52334, 55525, 57545, 53691, 51637, 49574, 49836, 48295, 49843, 52878, 56014, 56966, 56938, 60065, 60461, 56542, 59526, 58678, 54424, 51862, 55109, 52132, 53783, 51687, 56567, 52182, 50758, 46714, 50511, 48161, 50920, 48694, 50528, 55074, 55420, 55882, 59268, 59958, 57938, 57115, 51424, 51180, 53184, 52879, 51177, 54417, 51097, 47901, 49870, 55865, 61118, 61476, 63498, 58878, 49630, 45975, 45632, 45892, 44855, 49495, 48304, 45829, 42152, 39403, 37574, 32384, 34933, 34901, 33492, 31953, 36271, 33826, 34515, 36408, 41106, 43054, 44110, 40810, 41383, 37267, 35881, 38660, 37525, 34857, 36718, 36842, 34281, 39528, 41854, 42952, 40021, 41722, 41045, 42917, 39287, 38672, 32824, 28765, 22686, 18490, 15714, 15268, 14793, 15305, 16354, 16720, 17502, 17857, 16622, 18447, 19929, 31138, 36965, 36158, 32795, 30445, 21997, 18100, 22491, 27227, 29317, 32436, 35700, 39140, 36258, 33697, 24751, 20354, 8211, 3836, 1560, 834, 2034, 1744, 1637, 1637, 1637, 0, 0] - - from graph import NetworkGraph - n = NetworkGraph() - n.savedUpSpeeds = upload - n.savedDownSpeeds = download - - n.draw(800,200) - n.surface.write_to_png('output_sync.png') - -def test_async(): - g = graph.Graph() - g.add_stat('download_rate', color=graph.green) - g.add_stat('upload_rate', color=graph.blue) - g.set_left_axis(formatter=deluge.common.fspeed, min=10240) - g.async_request() - aclient.force_call(True) - surface = g.draw(600, 300) - surface.write_to_png('output_async.png') - -def test_dht(): - """'boring graph, but testing if it works'""" - - g = graph.Graph() - g.add_stat('dht_nodes', color=graph.orange) - g.add_stat('dht_cache_nodes', color=graph.blue) - g.add_stat('dht_torrents', color=graph.green) - g.add_stat('num_connections', color=graph.darkred) #testing : non dht - g.set_left_axis(formatter=str, min=10) - g.async_request() - aclient.force_call(True) - surface = g.draw(600, 300) - surface.write_to_png('output_dht.png') - - -def test_write(): - """ - writing to a file-like object; need this for webui. - """ - class fake_file: - def __init__(self): - self.data = [] - def write(self, str): - self.data.append(str) - - g = graph.Graph() - g.add_stat('download_rate', color=graph.green) - g.add_stat('upload_rate', color=graph.blue) - g.set_left_axis(formatter=deluge.common.fspeed, min=10240) - g.async_request() - aclient.force_call(True) - surface = g.draw(900, 150) - - file_like = fake_file() - surface.write_to_png(file_like) - data = "".join(file_like.data) - - f = open("file_like.png","wb") - f.write(data) - f.close() - -#test_sync() -test_async() -test_dht() -#test_write() \ No newline at end of file diff --git a/deluge/plugins/stats/stats/test.sh b/deluge/plugins/stats/stats/test.sh deleted file mode 100644 index 937c39b5e..000000000 --- a/deluge/plugins/stats/stats/test.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -while true; do - python test.py - sleep 2 -done; diff --git a/deluge/plugins/stats/stats/test_total.py b/deluge/plugins/stats/stats/test_total.py deleted file mode 100644 index ff64877ca..000000000 --- a/deluge/plugins/stats/stats/test_total.py +++ /dev/null @@ -1,23 +0,0 @@ -from deluge.ui.client import sclient, aclient -from deluge.common import fsize -sclient.set_core_uri() - -def print_totals(totals): - for name, value in totals.iteritems(): - print name , fsize(value) - - print "overhead:" - print "up:", fsize(totals["total_upload"] - totals["total_payload_upload"] ) - print "down:", fsize(totals["total_download"] - totals["total_payload_download"] ) - - -print "==totals==" -print_totals(sclient.stats_get_totals()) - -print "==session totals==" -print_totals(sclient.stats_get_session_totals()) - - - - - diff --git a/deluge/plugins/stats/stats/webui.py b/deluge/plugins/stats/stats/webui.py deleted file mode 100644 index 6eb56a1b3..000000000 --- a/deluge/plugins/stats/stats/webui.py +++ /dev/null @@ -1,127 +0,0 @@ -# -# webui.py -# -# Copyright (C) 2008 Martijn Voncken -# -# Basic plugin template created by: -# Copyright (C) 2008 Martijn Voncken -# Copyright (C) 2007, 2008 Andrew Resch -# -# 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 - -import os -from deluge.common import fspeed -from deluge.log import LOG as log -from deluge.ui.client import sclient, aclient -from deluge.plugins.webuipluginbase import WebUIPluginBase -from deluge import component -import graph - -api = component.get("WebPluginApi") -forms = api.forms - -#pages: -class graph_page: - @api.deco.deluge_page - def GET(self, args): - return api.render.stats.graph() - -class network_png: - @api.deco.check_session - def GET(self, args): - aclient.force_call(True) #bug, invalid data in async queue? - self.data = '' - vars = api.web.input(width = 600, height = 150) - api.web.header("Content-Type", "image/png") - g = graph.Graph() - g.add_stat('download_rate', color=graph.green) - g.add_stat('upload_rate', color=graph.blue) - g.set_left_axis(formatter=fspeed, min=10240) - g.async_request() - aclient.force_call(True) - surface = g.draw(int(vars.width), int(vars.height)) - surface.write_to_png(self) - print self.data - - def write(self, str): #file like object for pango; write_to_png - self.data += str - -class connections_png: - @api.deco.check_session - def GET(self, args): - "testing, not a final graph" - aclient.force_call(True) #bug, invalid data in async queue? - self.data = '' - vars = api.web.input(width = 600, height = 150) - api.web.header("Content-Type", "image/png") - g = graph.Graph() - g.add_stat('dht_nodes', color=graph.orange) - g.add_stat('dht_cache_nodes', color=graph.blue) - g.add_stat('dht_torrents', color=graph.green) - g.add_stat('num_connections', color=graph.darkred) #testing : non dht - g.set_left_axis(formatter=str, min=10) - g.async_request() - aclient.force_call(True) - surface = g.draw(int(vars.width), int(vars.height)) - surface.write_to_png(self) - print self.data - - def write(self, str): #file like object for pango; write_to_png - self.data += str - -class WebUI(WebUIPluginBase): - #map url's to classes: [(url,class), ..] - urls = [ - ('/graph', graph_page), - ('/graph/network.png', network_png), - ('/graph/connections.png', connections_png) - ] - - def enable(self): - api.config_page_manager.register('plugins', 'stats' ,ConfigForm) - api.menu_manager.register_admin_page("stats", _("Stats"), "/graph") #<--top menu - - def disable(self): - api.config_page_manager.deregister('stats') - api.menu_manager.deregister_admin_page("stats") #<--top menu - - -class ConfigForm(forms.Form): - #meta: - title = _("Graph") - - #load/save: - def initial_data(self): - return sclient.graph_get_config() - - def save(self, data): - cfg = dict(data) - sclient.graph_set_config(cfg) - - #django newforms magic: define config fields: - test = forms.CharField(label=_("Test config value"))