304 lines
18 KiB
Python
304 lines
18 KiB
Python
# Copyright (C) 2007 - Micah Bucy <eternalsword@gmail.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2, or (at your option)
|
|
# any later version.
|
|
#
|
|
# This program 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 this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
### Initialization ###
|
|
|
|
plugin_name = _("Event Logging")
|
|
plugin_author = "Micah Bucy"
|
|
plugin_version = "0.2"
|
|
plugin_description = _("""
|
|
Adds a tab with log of selected events.
|
|
|
|
Event messages come from libtorrent alerts.
|
|
If you want those strings translated to your locale,
|
|
you'll have to report the issue with libtorrent, not deluge.
|
|
|
|
Regarding the log files, the logs are saved in a log
|
|
directory within the deluge config directory. Event
|
|
messages for specific torrents are saved to individual
|
|
log files named the same as the associated .torrent
|
|
file. Event messages not specific to any torrent are
|
|
saved to logs named after the events
|
|
(eg peer_messages.log).
|
|
Event messages in the log files also include a timestamp.
|
|
The user is responsible to cleanout the logs.
|
|
|
|
As of v0.2
|
|
Events are now truncated in display. Log files are not.
|
|
New events are now displayed at the top.
|
|
""")
|
|
|
|
def deluge_init(deluge_path):
|
|
global path
|
|
path = deluge_path
|
|
|
|
def enable(core, interface):
|
|
global path
|
|
return EventLogging(path, core, interface)
|
|
|
|
### The Plugin ###
|
|
import deluge
|
|
import gtk
|
|
from EventLogging.tab_log import LogTabManager
|
|
|
|
class EventLogging:
|
|
|
|
def __init__(self, path, core, interface):
|
|
print "Loading LogEvents plugin..."
|
|
self.manager = core
|
|
self.parent = interface
|
|
# Create an options file and try to load existing Values
|
|
self.config_file = deluge.common.CONFIG_DIR + "/event_logging.conf"
|
|
self.config = deluge.pref.Preferences(self.config_file)
|
|
try:
|
|
self.config.load()
|
|
except IOError:
|
|
# File does not exist
|
|
pass
|
|
self.dialog_initialize = True
|
|
self.glade = gtk.glade.XML(path + "/event_logging_preferences.glade")
|
|
self.dialog = self.glade.get_widget("dialog")
|
|
self.dialog.set_position(gtk.WIN_POS_CENTER)
|
|
self.glade.signal_autoconnect({
|
|
'on_button_cancel_pressed': self.cancel_pressed,
|
|
'on_button_ok_pressed': self.ok_pressed
|
|
})
|
|
self.viewport = gtk.Viewport()
|
|
self.scrolledWindow = gtk.ScrolledWindow()
|
|
self.scrolledWindow.add(self.viewport)
|
|
self.scrolledWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
|
|
|
self.topWidget = self.scrolledWindow
|
|
|
|
self.parentNotebook = self.parent.notebook
|
|
|
|
self.parentNotebook.append_page(self.topWidget, gtk.Label(_("Event Log")))
|
|
self.viewport.show()
|
|
self.scrolledWindow.show()
|
|
self.tab_log = LogTabManager(self.viewport, self.manager)
|
|
self.tab_log.build_log_view()
|
|
if self.config.get("enable_finished"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_FINISHED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_peer_error"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_PEER_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_invalid_request"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_INVALID_REQUEST'], self.tab_log.handle_event)
|
|
if self.config.get("enable_file_error"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_FILE_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_hash_failed_error"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_HASH_FAILED_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_peer_ban_error"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_PEER_BAN_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_fastresume_rejected_error"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_FASTRESUME_REJECTED_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_announce"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_TRACKER_ANNOUNCE'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_reply"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_TRACKER_REPLY'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_alert"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_TRACKER_ALERT'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_warning"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_TRACKER_WARNING'], self.tab_log.handle_event)
|
|
if self.config.get("enable_storage_moved"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_STORAGE_MOVED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_piece_finished"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_PIECE_FINISHED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_block_downloading"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_BLOCK_DOWNLOADING'], self.tab_log.handle_event)
|
|
if self.config.get("enable_block_finished"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_BLOCK_FINISHED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_peer_blocked"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_PEER_BLOCKED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_other"):
|
|
self.manager.connect_event(self.manager.constants['EVENT_OTHER'], self.tab_log.handle_event)
|
|
if self.config.get("enable_log_files"):
|
|
self.tab_log.enable_log_files()
|
|
|
|
def unload(self):
|
|
if self.config.get("enable_finished"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_FINISHED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_peer_error"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_PEER_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_invalid_request"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_INVALID_REQUEST'], self.tab_log.handle_event)
|
|
if self.config.get("enable_file_error"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_FILE_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_hash_failed_error"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_HASH_FAILED_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_peer_ban_error"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_PEER_BAN_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_fastresume_rejected_error"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_FASTRESUME_REJECTED_ERROR'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_announce"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_TRACKER_ANNOUNCE'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_reply"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_TRACKER_REPLY'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_alert"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_TRACKER_ALERT'], self.tab_log.handle_event)
|
|
if self.config.get("enable_tracker_warning"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_TRACKER_WARNING'], self.tab_log.handle_event)
|
|
if self.config.get("enable_storage_moved"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_STORAGE_MOVED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_piece_finished"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_PIECE_FINISHED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_block_downloading"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_BLOCK_DOWNLOADING'], self.tab_log.handle_event)
|
|
if self.config.get("enable_block_finished"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_BLOCK_FINISHED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_peer_blocked"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_PEER_BLOCKED'], self.tab_log.handle_event)
|
|
if self.config.get("enable_other"):
|
|
self.manager.disconnect_event(self.manager.constants['EVENT_OTHER'], self.tab_log.handle_event)
|
|
self.tab_log.clear_log_store()
|
|
numPages = self.parentNotebook.get_n_pages()
|
|
for page in xrange(numPages):
|
|
if self.parentNotebook.get_nth_page(page) == self.topWidget:
|
|
self.parentNotebook.remove_page(page)
|
|
break
|
|
self.config.save(self.config_file)
|
|
|
|
def update(self):
|
|
pass
|
|
|
|
def configure(self, window):
|
|
self.dialog_initialize = True
|
|
try:
|
|
self.glade.get_widget("chk_finished").set_active(self.config.get("enable_finished"))
|
|
except:
|
|
self.glade.get_widget("chk_finished").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_peer_error").set_active(self.config.get("enable_peer_error"))
|
|
except:
|
|
self.glade.get_widget("chk_peer_error").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_invalid_request").set_active(self.config.get("enable_invalid_request"))
|
|
except:
|
|
self.glade.get_widget("chk_invalid_request").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_file_error").set_active(self.config.get("enable_file_error"))
|
|
except:
|
|
self.glade.get_widget("chk_file_error").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_hash_failed_error").set_active(self.config.get("enable_hash_failed_error"))
|
|
except:
|
|
self.glade.get_widget("chk_hash_failed_error").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_peer_ban_error").set_active(self.config.get("enable_peer_ban_error"))
|
|
except:
|
|
self.glade.get_widget("chk_peer_ban_error").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_fastresume_rejected_error").set_active(self.config.get("enable_fastresume_rejected_error"))
|
|
except:
|
|
self.glade.get_widget("chk_fastresume_rejected_error").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_tracker_announce").set_active(self.config.get("enable_tracker_announce"))
|
|
except:
|
|
self.glade.get_widget("chk_tracker_announce").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_tracker_reply").set_active(self.config.get("enable_tracker_reply"))
|
|
except:
|
|
self.glade.get_widget("chk_tracker_reply").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_tracker_alert").set_active(self.config.get("enable_tracker_alert"))
|
|
except:
|
|
self.glade.get_widget("chk_tracker_alert").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_tracker_warning").set_active(self.config.get("enable_tracker_warning"))
|
|
except:
|
|
self.glade.get_widget("chk_tracker_warning").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_storage_moved").set_active(self.config.get("enable_storage_moved"))
|
|
except:
|
|
self.glade.get_widget("chk_storage_moved").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_piece_finished").set_active(self.config.get("enable_piece_finished"))
|
|
except:
|
|
self.glade.get_widget("chk_piece_finished").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_block_downloading").set_active(self.config.get("enable_block_downloading"))
|
|
except:
|
|
self.glade.get_widget("chk_block_downloading").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_block_finished").set_active(self.config.get("enable_block_finished"))
|
|
except:
|
|
self.glade.get_widget("chk_block_finished").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_peer_blocked").set_active(self.config.get("enable_peer_blocked"))
|
|
except:
|
|
self.glade.get_widget("chk_peer_blocked").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_other").set_active(self.config.get("enable_other"))
|
|
except:
|
|
self.glade.get_widget("chk_other").set_active(False)
|
|
try:
|
|
self.glade.get_widget("chk_log_files").set_active(self.config.get("enable_log_files"))
|
|
except:
|
|
self.glade.get_widget("chk_log_files").set_active(False)
|
|
self.dialog_initialize = False
|
|
self.dialog.set_transient_for(window)
|
|
self.dialog.show()
|
|
|
|
def update_config(self, event_id, value):
|
|
if value:
|
|
self.manager.connect_event(event_id, self.tab_log.handle_event)
|
|
else:
|
|
self.manager.disconnect_event(event_id, self.tab_log.handle_event)
|
|
|
|
def ok_pressed(self, src):
|
|
self.dialog.hide()
|
|
self.update_config(self.manager.constants['EVENT_FINISHED'], self.glade.get_widget("chk_finished").get_active())
|
|
self.config.set("enable_finished", self.glade.get_widget("chk_finished").get_active())
|
|
self.update_config(self.manager.constants['EVENT_PEER_ERROR'], self.glade.get_widget("chk_peer_error").get_active())
|
|
self.config.set("enable_peer_error", self.glade.get_widget("chk_peer_error").get_active())
|
|
self.update_config(self.manager.constants['EVENT_INVALID_REQUEST'], self.glade.get_widget("chk_invalid_request").get_active())
|
|
self.config.set("enable_invalid_request", self.glade.get_widget("chk_invalid_request").get_active())
|
|
self.update_config(self.manager.constants['EVENT_FILE_ERROR'], self.glade.get_widget("chk_file_error").get_active())
|
|
self.config.set("enable_file_error", self.glade.get_widget("chk_file_error").get_active())
|
|
self.update_config(self.manager.constants['EVENT_HASH_FAILED_ERROR'], self.glade.get_widget("chk_hash_failed_error").get_active())
|
|
self.config.set("enable_hash_failed_error", self.glade.get_widget("chk_hash_failed_error").get_active())
|
|
self.update_config(self.manager.constants['EVENT_PEER_BAN_ERROR'], self.glade.get_widget("chk_peer_ban_error").get_active())
|
|
self.config.set("enable_peer_ban_error", self.glade.get_widget("chk_peer_ban_error").get_active())
|
|
self.update_config(self.manager.constants['EVENT_FASTRESUME_REJECTED_ERROR'], self.glade.get_widget("chk_fastresume_rejected_error").get_active())
|
|
self.config.set("enable_fastresume_rejected_error", self.glade.get_widget("chk_fastresume_rejected_error").get_active())
|
|
self.update_config(self.manager.constants['EVENT_TRACKER_ANNOUNCE'], self.glade.get_widget("chk_tracker_announce").get_active())
|
|
self.config.set("enable_tracker_announce", self.glade.get_widget("chk_tracker_announce").get_active())
|
|
self.update_config(self.manager.constants['EVENT_TRACKER_REPLY'], self.glade.get_widget("chk_tracker_reply").get_active())
|
|
self.config.set("enable_tracker_reply", self.glade.get_widget("chk_tracker_reply").get_active())
|
|
self.update_config(self.manager.constants['EVENT_TRACKER_ALERT'], self.glade.get_widget("chk_tracker_alert").get_active())
|
|
self.config.set("enable_tracker_alert", self.glade.get_widget("chk_tracker_alert").get_active())
|
|
self.update_config(self.manager.constants['EVENT_TRACKER_WARNING'], self.glade.get_widget("chk_tracker_warning").get_active())
|
|
self.config.set("enable_tracker_warning", self.glade.get_widget("chk_tracker_warning").get_active())
|
|
self.update_config(self.manager.constants['EVENT_STORAGE_MOVED'], self.glade.get_widget("chk_storage_moved").get_active())
|
|
self.config.set("enable_storage_moved", self.glade.get_widget("chk_storage_moved").get_active())
|
|
self.update_config(self.manager.constants['EVENT_PIECE_FINISHED'], self.glade.get_widget("chk_piece_finished").get_active())
|
|
self.config.set("enable_piece_finished", self.glade.get_widget("chk_piece_finished").get_active())
|
|
self.update_config(self.manager.constants['EVENT_BLOCK_DOWNLOADING'], self.glade.get_widget("chk_block_downloading").get_active())
|
|
self.config.set("enable_block_downloading", self.glade.get_widget("chk_block_downloading").get_active())
|
|
self.update_config(self.manager.constants['EVENT_BLOCK_FINISHED'], self.glade.get_widget("chk_block_finished").get_active())
|
|
self.config.set("enable_block_finished", self.glade.get_widget("chk_block_finished").get_active())
|
|
self.update_config(self.manager.constants['EVENT_PEER_BLOCKED'], self.glade.get_widget("chk_peer_blocked").get_active())
|
|
self.config.set("enable_peer_blocked", self.glade.get_widget("chk_peer_blocked").get_active())
|
|
self.update_config(self.manager.constants['EVENT_OTHER'], self.glade.get_widget("chk_other").get_active())
|
|
self.config.set("enable_other", self.glade.get_widget("chk_other").get_active())
|
|
if self.glade.get_widget("chk_log_files").get_active():
|
|
self.tab_log.enable_log_files()
|
|
else:
|
|
self.tab_log.disable_log_files()
|
|
self.config.set("enable_log_files", self.glade.get_widget("chk_log_files").get_active())
|
|
|
|
def cancel_pressed(self, src):
|
|
self.dialog.hide()
|