diff --git a/ChangeLog b/ChangeLog index 850ac6014..fa66593a4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,14 @@ -Deluge 0.5.7 (xx November 2007) +Deluge 0.5.6.2 (31 October 2007) * Set default piece size to 256-KiB in TorrentCreator plugin and add 2048KiB as a size option. + * Fix a bug in Debian package that caused the UI to completely freeze when a + torrent finished + * Find and fix another shutdown bug that mostly Gutsy users were incountering + * Fix a couple of WebUI bugs, including the "index" page erroring out + +Deluge 0.5.6.1 (28 October 2007) + * Fix invalid handle error + * Fix shutdown hang Deluge 0.5.6 (24 October 2007) * Web Interface Plugin diff --git a/libtorrent/include/libtorrent/aux_/session_impl.hpp b/libtorrent/include/libtorrent/aux_/session_impl.hpp index 3f3607191..bff8e3387 100644 --- a/libtorrent/include/libtorrent/aux_/session_impl.hpp +++ b/libtorrent/include/libtorrent/aux_/session_impl.hpp @@ -375,6 +375,12 @@ namespace libtorrent // buffers from. boost::pool<> m_send_buffers; + // this is where all active sockets are stored. + // the selector can sleep while there's no activity on + // them + io_service m_io_service; + asio::strand m_strand; + // the file pool that all storages in this session's // torrents uses. It sets a limit on the number of // open files by this session. @@ -389,12 +395,6 @@ namespace libtorrent // object. disk_io_thread m_disk_thread; - // this is where all active sockets are stored. - // the selector can sleep while there's no activity on - // them - io_service m_io_service; - asio::strand m_strand; - // this is a list of half-open tcp connections // (only outgoing connections) // this has to be one of the last @@ -646,7 +646,7 @@ namespace libtorrent void debug_log(const std::string& line) { - (*m_ses.m_logger) << time_now_string() << " " << line << "\n"; + (*m_ses.m_logger) << line << "\n"; } session_impl& m_ses; }; diff --git a/libtorrent/include/libtorrent/connection_queue.hpp b/libtorrent/include/libtorrent/connection_queue.hpp index c229ec217..b3b7cde86 100644 --- a/libtorrent/include/libtorrent/connection_queue.hpp +++ b/libtorrent/include/libtorrent/connection_queue.hpp @@ -56,7 +56,6 @@ public: void done(int ticket); void limit(int limit); int limit() const; - void close(); #ifndef NDEBUG diff --git a/libtorrent/include/libtorrent/http_tracker_connection.hpp b/libtorrent/include/libtorrent/http_tracker_connection.hpp index c0057dfa1..5b618c876 100755 --- a/libtorrent/include/libtorrent/http_tracker_connection.hpp +++ b/libtorrent/include/libtorrent/http_tracker_connection.hpp @@ -130,8 +130,6 @@ namespace libtorrent , proxy_settings const& ps , std::string const& password = ""); - void close(); - private: boost::intrusive_ptr self() diff --git a/libtorrent/include/libtorrent/intrusive_ptr_base.hpp b/libtorrent/include/libtorrent/intrusive_ptr_base.hpp index 98a1fed2e..5cccdf827 100644 --- a/libtorrent/include/libtorrent/intrusive_ptr_base.hpp +++ b/libtorrent/include/libtorrent/intrusive_ptr_base.hpp @@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_INTRUSIVE_PTR_BASE #include +#include #include "libtorrent/config.hpp" #include "libtorrent/assert.hpp" @@ -60,7 +61,7 @@ namespace libtorrent TORRENT_ASSERT(s->m_refs > 0); TORRENT_ASSERT(s != 0); if (--s->m_refs == 0) - delete static_cast(s); + boost::checked_delete(static_cast(s)); } boost::intrusive_ptr self() diff --git a/libtorrent/include/libtorrent/storage.hpp b/libtorrent/include/libtorrent/storage.hpp index 68a81c75b..8686f2afc 100755 --- a/libtorrent/include/libtorrent/storage.hpp +++ b/libtorrent/include/libtorrent/storage.hpp @@ -57,6 +57,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/peer_request.hpp" #include "libtorrent/hasher.hpp" #include "libtorrent/config.hpp" +#include "libtorrent/buffer.hpp" namespace libtorrent { @@ -344,8 +345,8 @@ namespace libtorrent // used to move pieces while expanding // the storage from compact allocation // to full allocation - std::vector m_scratch_buffer; - std::vector m_scratch_buffer2; + buffer m_scratch_buffer; + buffer m_scratch_buffer2; // the piece that is in the scratch buffer int m_scratch_piece; diff --git a/libtorrent/include/libtorrent/tracker_manager.hpp b/libtorrent/include/libtorrent/tracker_manager.hpp index 2c9ceeaef..07c377a0f 100755 --- a/libtorrent/include/libtorrent/tracker_manager.hpp +++ b/libtorrent/include/libtorrent/tracker_manager.hpp @@ -202,7 +202,7 @@ namespace libtorrent void fail(int code, char const* msg); void fail_timeout(); - virtual void close(); + void close(); address const& bind_interface() const { return m_bind_interface; } protected: diff --git a/libtorrent/include/libtorrent/udp_tracker_connection.hpp b/libtorrent/include/libtorrent/udp_tracker_connection.hpp index 4fba505a4..e5eadc144 100755 --- a/libtorrent/include/libtorrent/udp_tracker_connection.hpp +++ b/libtorrent/include/libtorrent/udp_tracker_connection.hpp @@ -74,8 +74,6 @@ namespace libtorrent , boost::weak_ptr c , session_settings const& stn); - void close(); - private: enum action_t diff --git a/libtorrent/src/broadcast_socket.cpp b/libtorrent/src/broadcast_socket.cpp index 4c2e9397c..01c6dd1c5 100644 --- a/libtorrent/src/broadcast_socket.cpp +++ b/libtorrent/src/broadcast_socket.cpp @@ -190,6 +190,8 @@ namespace libtorrent void broadcast_socket::close() { + m_on_receive.clear(); + for (std::list::iterator i = m_sockets.begin() , end(m_sockets.end()); i != end; ++i) { diff --git a/libtorrent/src/connection_queue.cpp b/libtorrent/src/connection_queue.cpp index c204b5a34..1caeb99fc 100644 --- a/libtorrent/src/connection_queue.cpp +++ b/libtorrent/src/connection_queue.cpp @@ -86,11 +86,6 @@ namespace libtorrent try_connect(); } - void connection_queue::close() - { - m_timer.cancel(); - } - void connection_queue::limit(int limit) { m_half_open_limit = limit; } diff --git a/libtorrent/src/http_tracker_connection.cpp b/libtorrent/src/http_tracker_connection.cpp index a5c542b44..ccca58226 100755 --- a/libtorrent/src/http_tracker_connection.cpp +++ b/libtorrent/src/http_tracker_connection.cpp @@ -489,9 +489,7 @@ namespace libtorrent , boost::lexical_cast(m_port)); m_name_lookup.async_resolve(q, m_strand.wrap( boost::bind(&http_tracker_connection::name_lookup, self(), _1, _2))); - set_timeout(req.event == tracker_request::stopped - ? m_settings.stop_tracker_timeout - : m_settings.tracker_completion_timeout + set_timeout(m_settings.tracker_completion_timeout , m_settings.tracker_receive_timeout); } @@ -505,17 +503,6 @@ namespace libtorrent fail_timeout(); } - void http_tracker_connection::close() - { - asio::error_code ec; - m_socket.close(ec); - m_name_lookup.cancel(); - if (m_connection_ticket > -1) m_cc.done(m_connection_ticket); - m_connection_ticket = -1; - m_timed_out = true; - tracker_connection::close(); - } - void http_tracker_connection::name_lookup(asio::error_code const& error , tcp::resolver::iterator i) try { @@ -772,6 +759,7 @@ namespace libtorrent if (m_parser.status_code() != 200) { fail(m_parser.status_code(), m_parser.message().c_str()); + close(); return; } @@ -833,7 +821,6 @@ namespace libtorrent TORRENT_ASSERT(false); } #endif - close(); } peer_entry http_tracker_connection::extract_peer_info(const entry& info) diff --git a/libtorrent/src/session_impl.cpp b/libtorrent/src/session_impl.cpp index ea3214345..31403e083 100755 --- a/libtorrent/src/session_impl.cpp +++ b/libtorrent/src/session_impl.cpp @@ -547,8 +547,8 @@ namespace detail , fingerprint const& cl_fprint , char const* listen_interface) : m_send_buffers(send_buffer_size) - , m_files(40) , m_strand(m_io_service) + , m_files(40) , m_half_open(m_io_service) , m_download_channel(m_io_service, peer_connection::download_channel) , m_upload_channel(m_io_service, peer_connection::upload_channel) @@ -675,17 +675,6 @@ namespace detail if (m_dht) m_dht->stop(); #endif m_timer.cancel(); - - // close the listen sockets - for (std::list::iterator i = m_listen_sockets.begin() - , end(m_listen_sockets.end()); i != end; ++i) - { - i->sock->close(); - } - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " aborting all torrents\n"; -#endif // abort all torrents for (torrent_map::iterator i = m_torrents.begin() , end(m_torrents.end()); i != end; ++i) @@ -693,25 +682,7 @@ namespace detail i->second->abort(); } -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " aborting all connections\n"; -#endif - // abort all connections - for (connection_map::iterator i = m_connections.begin() - , end(m_connections.end()); i != end; ++i) - { - i->second->disconnect(); - } - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " aborting all tracker requests\n"; -#endif - m_tracker_manager.abort_all_requests(); - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " shutting down connection queue\n"; -#endif - m_half_open.close(); + m_io_service.stop(); mutex::scoped_lock l2(m_checker_impl.m_mutex); // abort the checker thread @@ -1003,16 +974,16 @@ namespace detail m_alerts.post_alert(peer_blocked_alert(endp.address() , "incoming connection blocked by IP filter")); } - return; - } - - // don't allow more connections than the max setting - if (m_connections.size() > max_connections()) - { -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << "number of connections limit exceeded (conns: " - << num_connections() << ", limit: " << max_connections() - << "), connection rejected\n"; + return; + } + + // don't allow more connections than the max setting + if (m_connections.size() > max_connections()) + { +#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) + (*m_logger) << "number of connections limit exceeded (conns: " + << num_connections() << ", limit: " << max_connections() + << "), connection rejected\n"; #endif return; } @@ -1514,12 +1485,20 @@ namespace detail while (!m_abort); deadline_timer tracker_timer(m_io_service); + // this will remove the port mappings + if (m_natpmp.get()) + m_natpmp->close(); + if (m_upnp.get()) + m_upnp->close(); #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << " locking mutex\n"; #endif session_impl::mutex_t::scoped_lock l(m_mutex); +#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) + (*m_logger) << time_now_string() << " aborting all tracker requests\n"; +#endif m_tracker_manager.abort_all_requests(); #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << " sending stopped to all torrent's trackers\n"; @@ -2159,10 +2138,16 @@ namespace detail session_impl::~session_impl() { + abort(); + #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << "\n\n *** shutting down session *** \n\n"; #endif - abort(); + // lock the main thread and abort it + mutex_t::scoped_lock l(m_mutex); + m_abort = true; + m_io_service.stop(); + l.unlock(); #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << " waiting for main thread\n"; diff --git a/libtorrent/src/storage.cpp b/libtorrent/src/storage.cpp index 58791572a..47fc6d408 100755 --- a/libtorrent/src/storage.cpp +++ b/libtorrent/src/storage.cpp @@ -99,6 +99,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include "libtorrent/utf8.hpp" +#include "libtorrent/buffer.hpp" namespace libtorrent { @@ -386,7 +387,7 @@ namespace libtorrent file_pool& m_files; // temporary storage for moving pieces - std::vector m_scratch_buffer; + buffer m_scratch_buffer; }; sha1_hash storage::hash_for_slot(int slot, partial_hash& ph, int piece_size) @@ -468,14 +469,14 @@ namespace libtorrent void storage::release_files() { m_files.release(this); - std::vector().swap(m_scratch_buffer); + buffer().swap(m_scratch_buffer); } void storage::delete_files() { // make sure we don't have the files open m_files.release(this); - std::vector().swap(m_scratch_buffer); + buffer().swap(m_scratch_buffer); // delete the files from disk std::set directories; @@ -975,6 +976,7 @@ namespace libtorrent , m_storage_mode(storage_mode_sparse) , m_info(ti) , m_save_path(complete(save_path)) + , m_state(state_none) , m_current_slot(0) , m_out_of_place(false) , m_scratch_piece(-1) @@ -1622,8 +1624,8 @@ namespace libtorrent if (m_current_slot == m_info->num_pieces()) { m_state = state_create_files; - std::vector().swap(m_scratch_buffer); - std::vector().swap(m_scratch_buffer2); + buffer().swap(m_scratch_buffer); + buffer().swap(m_scratch_buffer2); if (m_storage_mode != storage_mode_compact) { std::vector().swap(m_piece_to_slot); diff --git a/libtorrent/src/torrent.cpp b/libtorrent/src/torrent.cpp index 6f764ed64..719f56853 100755 --- a/libtorrent/src/torrent.cpp +++ b/libtorrent/src/torrent.cpp @@ -3055,7 +3055,7 @@ namespace libtorrent #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) void torrent::debug_log(const std::string& line) { - (*m_ses.m_logger) << time_now_string() << " " << line << "\n"; + (*m_ses.m_logger) << line << "\n"; } #endif diff --git a/libtorrent/src/tracker_manager.cpp b/libtorrent/src/tracker_manager.cpp index 5ce539d9e..a9c0e2c2b 100755 --- a/libtorrent/src/tracker_manager.cpp +++ b/libtorrent/src/tracker_manager.cpp @@ -302,12 +302,12 @@ namespace libtorrent { m_completion_timeout = completion_timeout; m_read_timeout = read_timeout; - m_start_time = m_read_time = time_now(); + m_start_time = time_now(); + m_read_time = time_now(); m_timeout.expires_at((std::min)( m_read_time + seconds(m_read_timeout) - , m_start_time + seconds((std::min)(m_completion_timeout - , m_read_timeout)))); + , m_start_time + seconds(m_completion_timeout))); m_timeout.async_wait(m_strand.wrap(bind( &timeout_handler::timeout_callback, self(), _1))); } @@ -343,8 +343,7 @@ namespace libtorrent m_timeout.expires_at((std::min)( m_read_time + seconds(m_read_timeout) - , m_start_time + seconds((std::min)(m_completion_timeout - , m_read_timeout)))); + , m_start_time + seconds(m_completion_timeout))); m_timeout.async_wait(m_strand.wrap( bind(&timeout_handler::timeout_callback, self(), _1))); } @@ -568,24 +567,24 @@ namespace libtorrent m_abort = true; tracker_connections_t keep_connections; - while (!m_connections.empty()) - { - boost::intrusive_ptr& c = m_connections.back(); - if (!c) - { - m_connections.pop_back(); - continue; - } + while (!m_connections.empty()) + { + boost::intrusive_ptr& c = m_connections.back(); + if (!c) + { + m_connections.pop_back(); + continue; + } tracker_request const& req = c->tracker_req(); if (req.event == tracker_request::stopped) - { - keep_connections.push_back(c); - m_connections.pop_back(); - continue; - } - // close will remove the entry from m_connections - // so no need to pop - c->close(); + { + keep_connections.push_back(c); + m_connections.pop_back(); + continue; + } + // close will remove the entry from m_connections + // so no need to pop + c->close(); } std::swap(m_connections, keep_connections); diff --git a/libtorrent/src/udp_tracker_connection.cpp b/libtorrent/src/udp_tracker_connection.cpp index 6d76988d3..dd2ff10a1 100755 --- a/libtorrent/src/udp_tracker_connection.cpp +++ b/libtorrent/src/udp_tracker_connection.cpp @@ -96,9 +96,7 @@ namespace libtorrent m_name_lookup.async_resolve(q , m_strand.wrap(boost::bind( &udp_tracker_connection::name_lookup, self(), _1, _2))); - set_timeout(req.event == tracker_request::stopped - ? m_settings.stop_tracker_timeout - : m_settings.tracker_completion_timeout + set_timeout(m_settings.tracker_completion_timeout , m_settings.tracker_receive_timeout); } @@ -158,20 +156,11 @@ namespace libtorrent void udp_tracker_connection::on_timeout() { - asio::error_code ec; - m_socket.close(ec); + m_socket.close(); m_name_lookup.cancel(); fail_timeout(); } - void udp_tracker_connection::close() - { - asio::error_code ec; - m_socket.close(ec); - m_name_lookup.cancel(); - tracker_connection::close(); - } - void udp_tracker_connection::send_udp_connect() { #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) @@ -479,7 +468,6 @@ namespace libtorrent , complete, incomplete); m_man.remove_request(this); - close(); return; } catch (std::exception& e) @@ -555,7 +543,6 @@ namespace libtorrent if (!cb) { m_man.remove_request(this); - close(); return; } @@ -564,7 +551,6 @@ namespace libtorrent , complete, incomplete); m_man.remove_request(this); - close(); } catch (std::exception& e) { diff --git a/plugins/TorrentNotification/__init__.py b/plugins/TorrentNotification/__init__.py index c14f3b139..fbf93e503 100644 --- a/plugins/TorrentNotification/__init__.py +++ b/plugins/TorrentNotification/__init__.py @@ -97,19 +97,22 @@ class TorrentNotification: def show_notification(self, event): if not deluge.common.windows_check(): - import pynotify - file_info = self.interface.manager.get_torrent_file_info(event['unique_ID']) - filelist = "" - for file in file_info[:10]: - filelist += file['path'] + "\n" - if len(file_info) > 10: - filelist += '...' - - if pynotify.init("Deluge"): - n = pynotify.Notification(_("Torrent complete"), - _("Files") + ":\n" + filelist) - n.set_icon_from_pixbuf(deluge.common.get_logo(48)) - n.show() + try: + import pynotify + except: + pass + else: + file_info = self.interface.manager.get_torrent_file_info(event['unique_ID']) + filelist = "" + for file in file_info[:10]: + filelist += file['path'] + "\n" + if len(file_info) > 10: + filelist += '...' + if pynotify.init("Deluge"): + n = pynotify.Notification(_("Torrent complete"), + _("Files") + ":\n" + filelist) + n.set_icon_from_pixbuf(deluge.common.get_logo(48)) + n.show() else: pass @@ -119,11 +122,13 @@ class TorrentNotification: if deluge.common.windows_check(): self.glade.get_widget("chk_notification").set_active(False) self.glade.get_widget("chk_notification").set_sensitive(False) + self.glade.get_widget("chk_sound").set_active(False) + self.glade.get_widget("sound_path_button").set_sensitive(False) else: self.glade.get_widget("chk_notification").set_active(self.config.get("enable_notification")) - self.glade.get_widget("chk_sound").set_active(self.config.get("enable_sound")) - self.glade.get_widget("sound_path_button").set_sensitive(self.config.get("enable_sound")) - self.glade.get_widget("sound_path_button").set_filename(self.config.get("sound_path")) + self.glade.get_widget("chk_sound").set_active(self.config.get("enable_sound")) + self.glade.get_widget("sound_path_button").set_sensitive(self.config.get("enable_sound")) + self.glade.get_widget("sound_path_button").set_filename(self.config.get("sound_path")) self.dialog.set_transient_for(window) self.dialog.show() @@ -144,19 +149,23 @@ class TorrentNotification: def play_sound(self): if not deluge.common.windows_check(): - import pygame - import os.path - import sys - pygame.init() try: - name = self.config.get("sound_path") + import pygame except: - print "no file set" - try: - alert_sound = pygame.mixer.music - alert_sound.load(name) - alert_sound.play() - except pygame.error, message: - print 'Cannot load sound:' + pass + else: + import os.path + import sys + pygame.init() + try: + name = self.config.get("sound_path") + except: + print "no file set" + try: + alert_sound = pygame.mixer.music + alert_sound.load(name) + alert_sound.play() + except pygame.error, message: + print 'Cannot load sound:' else: pass diff --git a/plugins/WebUi/dbus_interface.py b/plugins/WebUi/dbus_interface.py index b253b821e..c42395f70 100644 --- a/plugins/WebUi/dbus_interface.py +++ b/plugins/WebUi/dbus_interface.py @@ -134,7 +134,7 @@ class DbusManager(dbus.service.Object): """same as 0.6 interface""" for torrent_id in torrents: torrent_id = int(torrent_id) - self.core.set_user_pause(torrent_id,True) + self.core.set_user_pause(torrent_id, True) @dbus.service.method(dbus_interface=dbus_interface, in_signature="as", out_signature="") @@ -142,7 +142,15 @@ class DbusManager(dbus.service.Object): """same as 0.6 interface""" for torrent_id in torrents: torrent_id = int(torrent_id) - self.core.set_user_pause(torrent_id,False) + self.core.set_user_pause(torrent_id, False) + + @dbus.service.method(dbus_interface=dbus_interface, + in_signature="as", out_signature="") + def force_reannounce(self, torrents): + """same as 0.6 interface""" + for torrent_id in torrents: + torrent_id = int(torrent_id) + self.core.update_tracker(torrent_id) @dbus.service.method(dbus_interface=dbus_interface, in_signature="sbb", out_signature="") diff --git a/plugins/WebUi/deluge_webserver.py b/plugins/WebUi/deluge_webserver.py index f2ccd43b5..437eac133 100644 --- a/plugins/WebUi/deluge_webserver.py +++ b/plugins/WebUi/deluge_webserver.py @@ -47,18 +47,19 @@ urls = ( "/index(.*)", "index", "/torrent/info/(.*)", "torrent_info", "/torrent/pause(.*)", "torrent_pause", + "/torrent/reannounce/(.*)", "torrent_reannounce", "/torrent/add(.*)", "torrent_add", "/torrent/delete/(.*)", "torrent_delete", "/torrent/queue/up/(.*)", "torrent_queue_up", "/torrent/queue/down/(.*)", "torrent_queue_down", - "/pause_all(.*)", "pause_all", - "/resume_all(.*)", "resume_all", + "/pause_all", "pause_all", + "/resume_all", "resume_all", "/refresh/set(.*)", "refresh_set", "/refresh/(.*)", "refresh", - "/config(.*)","config", - "/home(.*)", "home", - "/about(.*)", "about", - "/logout(.*)", "logout", + "/config","config", + "/home", "home", + "/about", "about", + "/logout", "logout", #remote-api: "/remote/torrent/add(.*)", "remote_torrent_add", #static: @@ -66,8 +67,8 @@ urls = ( "/template/static/(.*)","template_static", #"/downloads/(.*)","downloads" disabled until it can handle large downloads. #default-pages - "/(.*)", "home", - "(.*)", "home" + "/", "home", + "", "home" ) #/routing @@ -93,7 +94,7 @@ class login: class index: "page containing the torrent list." @deluge_page - @auto_refreshed + @auto_refreshed def GET(self, name): vars = web.input(sort=None, order=None) @@ -113,7 +114,7 @@ class index: class torrent_info: @deluge_page - @auto_refreshed + @auto_refreshed def GET(self, torrent_id): return ws.render.torrent_info(get_torrent_status(torrent_id)) @@ -125,7 +126,12 @@ class torrent_pause: ws.proxy.pause_torrent([vars.stop]) elif vars.start: ws.proxy.resume_torrent([vars.start]) + do_redirect() +class torrent_reannounce: + @check_session + def POST(self, torrent_id): + ws.proxy.force_reannounce([torrent_id]) do_redirect() class torrent_add: diff --git a/plugins/WebUi/revno b/plugins/WebUi/revno index ee977b5ec..5bc6609e3 100644 --- a/plugins/WebUi/revno +++ b/plugins/WebUi/revno @@ -1 +1 @@ -115 +117 diff --git a/plugins/WebUi/templates/deluge/torrent_info.html b/plugins/WebUi/templates/deluge/torrent_info.html index 663d26c87..4082ff481 100644 --- a/plugins/WebUi/templates/deluge/torrent_info.html +++ b/plugins/WebUi/templates/deluge/torrent_info.html @@ -56,7 +56,7 @@ $fspeed(torrent.download_rate) - + @@ -81,7 +81,7 @@ class="deluge_button"> $:render.part_button('GET', '/torrent/delete/' + str(torrent.id), _('Remove'), 'tango/user-trash.png') - +$:render.part_button('POST', '/torrent/reannounce/' + str(torrent.id), _('Reannounce'), 'tango/view-refresh.png')
$_('Total Size'):$fspeed(torrent.total_size)
$fsize(torrent.total_size)
$_('# Of Files'): $torrent.num_files