mirror of
https://git.deluge-torrent.org/deluge
synced 2025-04-21 03:54:50 +00:00
Get the Stats plugin working again.. sort of.. It still needs a lot of work.
This commit is contained in:
parent
520be10e4d
commit
ca7f33db1f
4 changed files with 113 additions and 127 deletions
|
@ -35,42 +35,23 @@
|
|||
# this exception statement from your version. If you delete this exception
|
||||
# statement from all source files in the program, then also delete it here.
|
||||
#
|
||||
#
|
||||
# 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 PluginInitBase
|
||||
|
||||
from deluge.plugins.init import PluginBase
|
||||
class CorePlugin(PluginInitBase):
|
||||
def __init__(self, plugin_name):
|
||||
from core import Core as _plugin_cls
|
||||
self._plugin_cls = _plugin_cls
|
||||
super(CorePlugin, self).__init__(plugin_name)
|
||||
|
||||
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 GtkUIPlugin(PluginInitBase):
|
||||
def __init__(self, plugin_name):
|
||||
from gtkui import GtkUI as _plugin_cls
|
||||
self._plugin_cls = _plugin_cls
|
||||
super(GtkUIPlugin, self).__init__(plugin_name)
|
||||
|
||||
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)
|
||||
class WebUIPlugin(PluginInitBase):
|
||||
def __init__(self, plugin_name):
|
||||
from webui import WebUI as _plugin_cls
|
||||
self._plugin_cls = _plugin_cls
|
||||
super(WebUIPlugin, self).__init__(plugin_name)
|
||||
|
|
|
@ -43,27 +43,27 @@
|
|||
# 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 twisted.internet.task import LoopingCall
|
||||
|
||||
import deluge
|
||||
from deluge.log import LOG as log
|
||||
from deluge.plugins.corepluginbase import CorePluginBase
|
||||
from deluge.plugins.pluginbase 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
|
||||
from deluge.core.rpcserver import export
|
||||
|
||||
DEFAULT_PREFS = {
|
||||
"test":"NiNiNi",
|
||||
"update_interval":2000, #2 seconds.
|
||||
"length":150, # 2 seconds * 150 --> 5 minutes.
|
||||
"test": "NiNiNi",
|
||||
"update_interval": 2, #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":{}
|
||||
"total_upload": 0,
|
||||
"total_download": 0,
|
||||
"total_payload_upload": 0,
|
||||
"total_payload_download": 0,
|
||||
"stats": {}
|
||||
}
|
||||
|
||||
class Core(CorePluginBase):
|
||||
|
@ -78,90 +78,88 @@ class Core(CorePluginBase):
|
|||
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.stats = self.saved_stats["stats"] or {}
|
||||
|
||||
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")
|
||||
self.stats_keys = [
|
||||
"payload_download_rate",
|
||||
"payload_upload_rate"
|
||||
]
|
||||
self.update_stats()
|
||||
|
||||
self.update_timer = LoopingCall(self.update_stats)
|
||||
self.update_timer.start(self.config["update_interval"])
|
||||
|
||||
self.save_timer = LoopingCall(self.save_stats)
|
||||
self.save_timer.start(60)
|
||||
|
||||
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] = []
|
||||
try:
|
||||
self.update_timer.stop()
|
||||
self.save_timer.stop()
|
||||
except:
|
||||
pass
|
||||
|
||||
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)
|
||||
status = self.core.get_session_status(self.stats_keys)
|
||||
for key, value in status.items():
|
||||
if key not in self.stats:
|
||||
self.stats[key] = []
|
||||
self.stats[key].insert(0, value)
|
||||
|
||||
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:
|
||||
for stat_list in self.stats.values():
|
||||
if len(stat_list) > self.config["length"]:
|
||||
stat_list.pop()
|
||||
except Exception,e:
|
||||
log.error(e.message)
|
||||
return True
|
||||
|
||||
except Exception, e:
|
||||
log.exception(e)
|
||||
|
||||
def save_stats(self):
|
||||
try:
|
||||
self.saved_stats.set("stats", self.stats)
|
||||
self.saved_stats.config.update(self.export_get_totals())
|
||||
self.saved_stats["stats"] = self.stats
|
||||
self.saved_stats.config.update(self.get_totals())
|
||||
self.saved_stats.save()
|
||||
except Exception,e:
|
||||
log.error(e.message)
|
||||
log.exception(e)
|
||||
return True
|
||||
|
||||
|
||||
# export:
|
||||
def export_get_stats(self, keys):
|
||||
@export()
|
||||
def get_stats(self, keys):
|
||||
stats_dict = {}
|
||||
for stat in self.stats:
|
||||
if stat not in keys:
|
||||
continue
|
||||
stats_dict[stat] = self.stats[stat]
|
||||
for key in keys:
|
||||
if key in self.stats:
|
||||
stats_dict[key] = self.stats[key]
|
||||
return stats_dict
|
||||
|
||||
def export_get_totals(self):
|
||||
@export()
|
||||
def get_totals(self):
|
||||
result = {}
|
||||
session_totals = self.export_get_session_totals()
|
||||
session_totals = self.get_session_totals()
|
||||
for key in session_totals:
|
||||
result[key] = self.totals[key] + session_totals[key]
|
||||
return result
|
||||
|
||||
def export_get_session_totals(self):
|
||||
@export()
|
||||
def 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
|
||||
"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):
|
||||
@export()
|
||||
def 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):
|
||||
@export()
|
||||
def get_config(self):
|
||||
"returns the config dictionary"
|
||||
return self.config.config
|
||||
|
|
|
@ -49,7 +49,7 @@ port of old plugin by markybob.
|
|||
import time
|
||||
import cairo
|
||||
from deluge.log import LOG as log
|
||||
from deluge.ui.client import aclient
|
||||
from deluge.ui.client import client
|
||||
|
||||
black = (0, 0, 0)
|
||||
gray = (0.75, 0.75, 0.75)
|
||||
|
@ -101,10 +101,6 @@ class Graph:
|
|||
'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
|
||||
|
||||
|
@ -115,12 +111,15 @@ class Graph:
|
|||
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()
|
||||
try:
|
||||
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()
|
||||
if self.legend_selected:
|
||||
self.draw_legend()
|
||||
except cairo.Error, e:
|
||||
log.exception(e)
|
||||
return self.ctx
|
||||
|
||||
def draw(self, width, height):
|
||||
|
@ -258,4 +257,4 @@ class Graph:
|
|||
#self.ctx.set_dash((1, 1), 0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import test
|
||||
import test
|
||||
|
|
|
@ -49,12 +49,15 @@ import gtk
|
|||
import gobject
|
||||
from gtk.glade import XML
|
||||
|
||||
from twisted.internet import defer
|
||||
|
||||
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.client import client
|
||||
from deluge.ui.gtkui.torrentdetails import Tab
|
||||
from deluge.plugins.pluginbase import GtkPluginBase
|
||||
|
||||
class GraphsTab(Tab):
|
||||
def __init__(self, glade):
|
||||
|
@ -72,8 +75,8 @@ class GraphsTab(Tab):
|
|||
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.add_stat('payload_download_rate', label='Download Rate', color=graph.green)
|
||||
self.graph.add_stat('payload_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()
|
||||
|
@ -81,21 +84,26 @@ class GraphsTab(Tab):
|
|||
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)
|
||||
|
||||
log.debug("getstat keys: %s", self.graph.stat_info.keys())
|
||||
d1 = client.stats.get_stats(self.graph.stat_info.keys())
|
||||
d1.addCallback(self.graph.set_stats)
|
||||
d2 = client.stats.get_config()
|
||||
d2.addCallback(self.graph.set_config)
|
||||
dl = defer.DeferredList([d1, d2])
|
||||
|
||||
def draw_context(result):
|
||||
self.graph.draw_to_context(context, width, height)
|
||||
dl.addCallback(draw_context)
|
||||
|
||||
return True
|
||||
|
||||
class GtkUI(object):
|
||||
def __init__(self, plugin_api, plugin_name):
|
||||
log.debug("Calling Stats UI init")
|
||||
self.plugin = plugin_api
|
||||
|
||||
class GtkUI(GtkPluginBase):
|
||||
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)
|
||||
component.get("Preferences").add_page("Stats", self.glade.get_widget("prefs_box"))
|
||||
component.get("PluginManager").register_hook("on_apply_prefs", self.on_apply_prefs)
|
||||
component.get("PluginManager").register_hook("on_show_prefs", self.on_show_prefs)
|
||||
self.on_show_prefs()
|
||||
|
||||
self.graphs_tab = GraphsTab(XML(self.get_resource("tabs.glade")))
|
||||
|
@ -103,19 +111,19 @@ class GtkUI(object):
|
|||
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)
|
||||
component.get("Preferences").remove_page("Stats")
|
||||
component.get("PluginManager").deregister_hook("on_apply_prefs", self.on_apply_prefs)
|
||||
component.get("PluginManager").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)
|
||||
client.stats.set_config(config)
|
||||
|
||||
def on_show_prefs(self):
|
||||
aclient.stats_get_config(self.cb_get_config)
|
||||
client.stats.get_config().addCallback(self.cb_get_config)
|
||||
|
||||
def cb_get_config(self, config):
|
||||
"callback for on show_prefs"
|
||||
|
|
Loading…
Add table
Reference in a new issue