Compare commits

..

23 Commits

Author SHA1 Message Date
Calum Lind
b711cd258a Release 2.0.3 2019-06-12 18:47:11 +01:00
Calum Lind
e1c4069a72 [Gtk] Refactor presenting window
Include the correct usage for other display servers.

Still not sure how to get the proper timestamp for Wayland or Quartz but
I read that using 0 equals the GDK_CURRENT_TIME which suffices for now.
2019-06-12 16:57:48 +01:00
Calum Lind
a2dee79439 [GTK] Improve detecting X11 display server
GdkX11 still imports on Wayland so check display server is X11 before
importing.
2019-06-12 16:05:15 +01:00
Calum Lind
7a54db3179 [Docs] Fix typo and url for Windows install 2019-06-12 14:56:21 +01:00
Calum Lind
03e7952d26 [GTK] Only import wnck on X11 display
Wnck is only supported on X11 and raises errors in Wayland so only load
it when X11 present.

Fixes: #3265
2019-06-12 10:21:23 +01:00
Calum Lind
7ee8750be4 [GTK] Fix peers tab flag tooltip error
Hovering over a country flag resulted in an AttributeError.

This is due to get_tooltip_context now returning a bool value instead of
the tooltip object.

Fixes: #3219
2019-06-12 09:40:51 +01:00
Calum Lind
f61001a15d [GTK] Fix missing argument for GtkMenu.popup()
Missed while converting from pygtk to Gtk3

Fixes: #3266
2019-06-12 09:40:14 +01:00
Calum Lind
86ddadacf7 [Extractor] Fix startup error
On Python 3 need to create a copy of the dict to iterate

Fixes: #3264
2019-06-12 09:40:14 +01:00
Calum Lind
632089940c [Web] Fix unable to change password
The hashlib update method requires bytes and raised a TypeError for salt
passed as text.

Added a test for auth change_password

Fixes: #3262
2019-06-11 20:14:11 +01:00
Calum Lind
5d7db3e727 [Web] Change request.base path encoding to utf-8
A user reported a problem with setting base path resulting in this error:

    encoding with 'idna' codec failed (UnicodeError: label too long)

It is likely the base path is longer than 63 chars, which is unusual,
however the idna codec is for domain name not paths so switch to utf-8.

Fixes: #3261
2019-06-11 20:14:11 +01:00
Calum Lind
4dd1f63b8b [Web] Fix TypeError with reverse proxy x-deluge-base header
The request header needs decoded otherwise string comparisons fail.

Fixes: #3260
2019-06-11 20:14:11 +01:00
Calum Lind
fc134cdffb [Docs] Add more info to release notes 2019-06-11 20:14:11 +01:00
Calum Lind
36cb4c5a4f [Docs] Updates to release checklist 2019-06-11 20:14:11 +01:00
Calum Lind
676bdb26e0 [Docs] Remove incomplete Windows install instructions
The instructions are in-progress and missing steps so instead point to
the issue ticket for now.
2019-06-11 12:35:04 +01:00
Calum Lind
dff778ceeb [i18n] Try loading intl.dll on Windows 2019-06-11 12:35:04 +01:00
Trav Easton
bdadd2b515 Fix typo in install instructions for macOS 2019-06-11 12:35:04 +01:00
thelamer
a34543100c [Web] Fix peers tab failing to set flag location
The request.country returns bytes not a string so decode.
2019-06-11 12:35:04 +01:00
Calum Lind
b8b044f451 [lint] Fix pre-commit config key name 2019-06-10 14:24:47 +01:00
Calum Lind
2d87cde887 Make a 2.0.2 release 2019-06-08 21:34:27 +01:00
Calum Lind
212efc4f52 [Packaging] Move user out of systemd files and add to tarball
With the `deluge` user specified in the unit files it ties it to
that user and makes it unavailable for re-use by systemd user instance.

Remove the user and group from the unit files and put them in a separate
`user.conf` file that should be installed as an override file e.g. for
deluged.service this would be placed as follows:

    /etc/systemd/service/deluge.service.d/user.conf

Add the systemd files to the tarball for package maintainers.

Closes: #2034
2019-06-08 21:31:49 +01:00
Calum Lind
879a397215 [Packaging] Add updated launchd scripts
Copy from Trac UserGuide and updated with proper naming and deluge-web
version.

The bin location is default for brew with pip install.

Closes: #3073
2019-06-08 21:31:49 +01:00
Calum Lind
957cd5dd9c [Core] Fix SimpleNamespace on Python2 2019-06-08 21:31:49 +01:00
Calum Lind
25087d3f2d [Docs] Add release notes and update pages 2019-06-08 16:42:25 +01:00
31 changed files with 340 additions and 94 deletions

View File

@@ -1,4 +1,4 @@
default_language:
default_language_version:
python: python3
exclude: >
(?x)^(

View File

@@ -21,12 +21,15 @@ matrix:
include:
- name: Unit tests
env: TOX_ENV=py3
- name: Unit tests (libtorrent 1.2)
- name: Unit tests - libtorrent 1.2
env: TOX_ENV=py3
addons:
apt:
sources: [sourceline: "ppa:libtorrent.org/1.2-daily"]
packages: [python3-libtorrent, python3-venv]
- name: Unit tests - Python 2
env: TOX_ENV=py27
python: 2.7
- if: commit_message =~ SECURITY_TEST
env: TOX_ENV=security
- name: Code linting
@@ -44,6 +47,7 @@ addons:
- sourceline: "ppa:libtorrent.org/rc-1.1-daily"
- deadsnakes
packages:
- python-libtorrent
- python3-libtorrent
# Install py36 specifically for pre-commit to run black formatter.
- python3.6

View File

@@ -1,7 +1,42 @@
# Changelog
## 2.0.3 (2019-06-12)
### Gtk UI
- Fix errors running on Wayland (#3265).
- Fix Peers Tab tooltip and context menu errors (#3266).
### Web UI
- Fix TypeError in Peers Tab setting country flag.
- Fix reverse proxy header TypeError (#3260).
- Fix request.base 'idna' codec error (#3261).
- Fix unable to change password (#3262).
### Extractor plugin
- Fix potential error starting plugin.
### Documentation
- Fix macOS install typo.
- Fix Windows install instructions.
## 2.0.2 (2019-06-08)
### Packaging
- Add systemd deluged and deluge-web service files to package tarball (#2034)
### Core
- Fix Python 2 compatiblity issue with SimpleNamespace.
## 2.0.1 (2019-06-07)
### Packaging
- Fix setup.py build error without git installed.
## 2.0.0 (2019-06-06)
@@ -35,7 +70,7 @@
- Add Option To Specify Outgoing Connection Interface.
- Fix potential for host_id collision when creating hostlist entries.
### GtkUI
### Gtk UI
- Ported to GTK3 (3rd-party plugins will need updated).
- Allow changing ownership of torrents.
@@ -50,7 +85,7 @@
- Top: Ctrl+Alt+Shift+Up
- Bottom: Ctrl+Alt+Shift+Down
### WebUI
### Web UI
- Server (deluge-web) now daemonizes by default, use '-d' or '--do-not-daemonize' to disable.
- Fixed the '--base' option to work for regular use, not just with reverse proxies.

View File

@@ -8,6 +8,7 @@ include version.py
include gen_web_gettext.py
graft docs/man
graft packaging/systemd
include deluge/i18n/*.po
recursive-exclude deluge/i18n *.mo

View File

@@ -28,6 +28,14 @@ from deluge.common import decode_bytes
log = logging.getLogger(__name__)
try:
SimpleNamespace = types.SimpleNamespace # Python 3.3+
except AttributeError:
class SimpleNamespace(object): # Python 2.7
def __init__(self, **attr):
self.__dict__.update(attr)
class AlertManager(component.Component):
"""AlertManager fetches and processes libtorrent alerts"""
@@ -126,7 +134,7 @@ class AlertManager(component.Component):
if log.isEnabledFor(logging.DEBUG):
log.debug('Handling alert: %s', alert_type)
# Copy alert attributes
alert_copy = types.SimpleNamespace(
alert_copy = SimpleNamespace(
**{
attr: getattr(alert, attr)
for attr in dir(alert)

View File

@@ -119,7 +119,18 @@ def setup_translation():
libintl = None
if deluge.common.windows_check():
libintl = ctypes.cdll.LoadLibrary('libintl-8.dll')
for intl in ('libintl-8.dll', 'intl.dll'):
try:
libintl = ctypes.cdll.LoadLibrary(intl)
except OSError as ex:
exception = ex
else:
break
finally:
if not libintl:
log.error('Unable to initialize gettext/locale!')
log.error(exception)
setup_mock_translation()
elif deluge.common.osx_check():
libintl = ctypes.cdll.LoadLibrary('libintl.dylib')

View File

@@ -89,7 +89,7 @@ else:
# Test command exists and if not, remove.
for command in required_cmds:
if not which(command):
for k, v in EXTRACT_COMMANDS.items():
for k, v in list(EXTRACT_COMMANDS.items()):
if command in v[0]:
log.warning('%s not found, disabling support for %s', command, k)
del EXTRACT_COMMANDS[k]

View File

@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
#
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#
from __future__ import unicode_literals
from mock import patch
from twisted.trial import unittest
from deluge.ui.web import auth
class MockConfig(object):
def __init__(self, config):
self.config = config
def __getitem__(self, key):
return self.config[key]
def __setitem__(self, key, value):
self.config[key] = value
class WebAuthTestCase(unittest.TestCase):
@patch('deluge.ui.web.auth.JSONComponent.__init__', return_value=None)
def test_change_password(self, mock_json):
config = MockConfig(
{
'pwd_sha1': '8d8ff487626141d2b91025901d3ab57211180b48',
'pwd_salt': '7555d757710158655bd1646e207dee21a89e9226',
}
)
webauth = auth.Auth(config)
self.assertTrue(webauth.change_password('deluge', 'deluge_new'))

View File

@@ -34,7 +34,12 @@ from deluge.httpdownloader import download_file
from deluge.ui.client import client
from deluge.ui.common import TorrentInfo
from .common import get_clipboard_text, listview_replace_treestore, reparent_iter
from .common import (
get_clipboard_text,
listview_replace_treestore,
reparent_iter,
windowing,
)
from .dialogs import ErrorDialog
from .edittrackersdialog import trackers_tiers_from_text
from .path_chooser import PathChooser
@@ -171,14 +176,17 @@ class AddTorrentDialog(component.Component):
self.dialog.set_transient_for(None)
self.dialog.set_position(Gtk.WindowPosition.CENTER)
self.dialog.present()
if focus:
timestamp = main_window.get_timestamp()
try:
if windowing('X11'):
# Use present with X11 set_user_time since
# present_with_time is inconsistent.
self.dialog.present()
self.dialog.get_window().set_user_time(timestamp)
except AttributeError:
# Not an X11 windowing system
pass
else:
self.dialog.present_with_time(timestamp)
else:
self.dialog.present()
def hide(self):
self.dialog.hide()

View File

@@ -16,7 +16,7 @@ import shutil
import sys
import six.moves.cPickle as pickle # noqa: N813
from gi.repository.Gdk import SELECTION_CLIPBOARD
from gi.repository.Gdk import SELECTION_CLIPBOARD, Display
from gi.repository.GdkPixbuf import Colorspace, Pixbuf
from gi.repository.GLib import GError
from gi.repository.Gtk import (
@@ -389,3 +389,7 @@ def get_clipboard_text():
)
if text:
return text.strip()
def windowing(like):
return like.lower() in str(type(Display.get_default())).lower()

View File

@@ -518,7 +518,7 @@ class FilesTab(Tab):
return func(event)
def keypress_menu(self, event):
self.file_menu.popup(None, None, None, 3, event.time)
self.file_menu.popup(None, None, None, None, 3, event.time)
return True
def keypress_f2(self, event):

View File

@@ -22,7 +22,6 @@ gi.require_version('Gtk', '3.0') # NOQA: E402
gi.require_version('Gdk', '3.0') # NOQA: E402
# isort:imports-thirdparty
from gi.repository.Gdk import Display
from gi.repository.GLib import set_prgname
from gi.repository.Gtk import Builder, ResponseType
from twisted.internet import defer, gtk3reactor
@@ -55,7 +54,7 @@ from deluge.ui.tracker_icons import TrackerIcons
# isort:imports-localfolder
from .addtorrentdialog import AddTorrentDialog
from .common import associate_magnet_links
from .common import associate_magnet_links, windowing
from .connectionmanager import ConnectionManager
from .dialogs import YesNoDialog
from .filtertreeview import FilterTreeView
@@ -139,10 +138,6 @@ DEFAULT_PREFS = {
}
def windowing(like):
return like.lower() in str(type(Display.get_default())).lower()
class GtkUI(object):
def __init__(self, args):
# Setup gtkbuilder/glade translation

View File

@@ -13,6 +13,7 @@ import logging
import os.path
from hashlib import sha1 as sha
import gi
from gi.repository import Gtk
from gi.repository.Gdk import DragAction, WindowState
from twisted.internet import reactor
@@ -23,22 +24,23 @@ from deluge.common import decode_bytes, fspeed, resource_filename
from deluge.configmanager import ConfigManager
from deluge.ui.client import client
from .common import get_deluge_icon
from .common import get_deluge_icon, windowing
from .dialogs import PasswordDialog
from .ipcinterface import process_args
try:
import gi
GdkX11 = None
Wnck = None
if windowing('X11'):
try:
from gi.repository import GdkX11
except ImportError:
pass
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck
except ValueError:
Wnck = None
try:
from gi.repository import GdkX11
except ImportError:
GdkX11 = None
try:
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck
except (ImportError, ValueError):
pass
log = logging.getLogger(__name__)
@@ -176,9 +178,14 @@ class MainWindow(component.Component):
def restore():
# Restore the proper x,y coords for the window prior to showing it
component.resume(self.child_components)
self.window.present()
if GdkX11:
self.window.get_window().set_user_time(self.get_timestamp())
timestamp = self.get_timestamp()
if windowing('X11'):
# Use present with X11 set_user_time since
# present_with_time is inconsistent.
self.window.present()
self.window.get_window().set_user_time(timestamp)
else:
self.window.present_with_time(timestamp)
self.load_window_state()
if self.config['lock_tray'] and not self.visible():

View File

@@ -403,7 +403,7 @@ class StoredValuesList(ValueList):
menuitem_edit.connect('activate', on_edit_clicked, path)
menuitem_remove.connect('activate', on_remove_clicked, path)
self.path_list_popup.popup(None, None, None, event.button, time, data=path)
self.path_list_popup.popup(None, None, None, path, event.button, time)
self.path_list_popup.show_all()
def remove_selected_path(self):

View File

@@ -348,14 +348,14 @@ class PeersTab(Tab):
log.debug('on_button_press_event')
# We only care about right-clicks
if self.torrent_id and event.button == 3:
self.peer_menu.popup(None, None, None, event.button, event.time)
self.peer_menu.popup(None, None, None, None, event.button, event.time)
return True
def _on_query_tooltip(self, widget, x, y, keyboard_tip, tooltip):
tooltip, x, y, model, path, _iter = widget.get_tooltip_context(
is_tooltip, x, y, model, path, _iter = widget.get_tooltip_context(
x, y, keyboard_tip
)
if tooltip:
if is_tooltip:
country_code = model.get(_iter, 5)[0]
if country_code != ' ' and country_code in COUNTRIES:
tooltip.set_text(COUNTRIES[country_code])

View File

@@ -930,5 +930,5 @@ class TorrentView(ListView, component.Component):
return
torrentmenu = component.get('MenuBar').torrentmenu
torrentmenu.popup(None, None, None, 3, event.time)
torrentmenu.popup(None, None, None, None, 3, event.time)
return True

View File

@@ -198,7 +198,7 @@ class Auth(JSONComponent):
"""
log.debug('Changing password')
salt = hashlib.sha1(os.urandom(32)).hexdigest()
s = hashlib.sha1(salt)
s = hashlib.sha1(salt.encode('utf-8'))
s.update(new_password.encode('utf8'))
self.config['pwd_salt'] = salt
self.config['pwd_sha1'] = s.hexdigest()

View File

@@ -202,7 +202,8 @@ class Flag(resource.Resource):
return self
def render(self, request):
path = ('ui', 'data', 'pixmaps', 'flags', request.country.lower() + '.png')
flag = request.country.decode('utf-8').lower() + '.png'
path = ('ui', 'data', 'pixmaps', 'flags', flag)
filename = common.resource_filename('deluge', os.path.join(*path))
if os.path.exists(filename):
request.setHeader(
@@ -570,7 +571,7 @@ class TopLevel(resource.Resource):
def getChildWithDefault(self, path, request): # NOQA: N802
# Calculate the request base
header = request.getHeader(b'x-deluge-base')
base = header if header else component.get('DelugeWeb').base
base = header.decode('utf-8') if header else component.get('DelugeWeb').base
# validate the base parameter
if not base:
@@ -582,7 +583,7 @@ class TopLevel(resource.Resource):
if base[-1] != '/':
base += '/'
request.base = base.encode('idna')
request.base = base.encode('utf-8')
return resource.Resource.getChildWithDefault(self, path, request)

View File

@@ -5,3 +5,4 @@ This is a guide to help with developing Deluge.
- [Tutorials](tutorials/index.md)
- [How-to guides](how-to/index.md)
- [Packaging](packaging/index.md)
- [Changelog](../changelog.md)

View File

@@ -4,6 +4,7 @@
- Update [translation] `po` files from [Launchpad] account.
- Changelog is updated with relevant commits and release date is added.
- Docs [release notes] are updated.
- Tag release in git and push upstream e.g.
git tag -a deluge-2.0.0 -m "Deluge 2.0.0 Release"
@@ -18,7 +19,6 @@
twine upload dist/deluge-2.0.0.tar.gz dist/deluge-2.0.0-py3-none-any.whl
- Create packages (Ubuntu, Windows, OSX).
- Calculate `sha256sum` for each file e.g.
cd dist; sha256sum deluge-2.0.0.tar.xz > deluge-2.0.0.tar.xz.sha256
@@ -27,16 +27,17 @@
- Ensure file permissions are global readable: `0644`
- Sub-directories correspond to _major.minor_ version e.g. all `2.0.x` patch
releases are stored in `source/2.0`.
- Update latest release version in `version` files at `download.deluge-torrent.org`.
- Change release version in `version` files.
- Run `trigger-deluge` to sync OSUOSL ftp site.
- Create packages (Ubuntu, Windows, OSX).
- Ubuntu: https://code.launchpad.net/~deluge-team/+recipe/stable-releases
## Post-Release
- Update with version, hashes and release notes:
- Publish docs on [ReadTheDocs].
- ReleaseNotes (Create new version page and add link to this page)
- Forum announcement
- IRC welcome message
- Website homepage version `/var/www/deluge-torrent.org/htdocs/index.php`
- Forum announcement.
- IRC welcome message.
- [Wikipedia]
- Close Trac milestone and add new milestone version for future tickets.
- Ensure all stable branch commits are also applied to development branch.
@@ -44,4 +45,5 @@
[readthedocs]: https://deluge.readthedocs.io
[wikipedia]: http://en.wikipedia.org/wiki/Deluge_%28software%29
[launchpad]: https://translations.launchpad.net/deluge
[translation]: ../contributing/translations.md
[translation]: ../../contributing/translations.md
[release notes]: ../../release/index.md

View File

@@ -9,7 +9,7 @@ Contents
Getting started <intro/index.md>
How-to guides <how-to/index.md>
Changelog <changelog.md>
Release notes <releases/index.md>
Contributing <contributing/index.md>
Developer guide <devguide/index.md>
Reference <reference/index.rst>

View File

@@ -9,7 +9,7 @@ feel free to make suggestions for improvement.
Until the stable PPA is updated, the development version of Deluge can be used:
sudo add-apt-repository -u ppa:deluge-team/develop
sudo add-apt-repository -u ppa:deluge-team/stable
sudo apt install deluge
### <i class="icon-python"></i> PyPi
@@ -24,44 +24,32 @@ Install with pip:
## <i class="fa fa-windows"></i> Windows
There is no installer package currently for Windows, but can try Deluge as follows.
Unfortuately due to move to GTK3 and Python 3 there is no installer package currently
available for Windows.
1. Download and install [Python 3.6].
2. Download and extract [gvsbuild] tarball to `C:\`.
3. Open a terminal.
4. Run this command to add `gvsbuild` directory to `PATH`:
set PATH=C:\gvsbuild\release;%PATH%
5. Install `gvsbuild` Python wheels:
pip install C:\gvsbuild\release\python\pycairo-1.18.0-cp36-cp36m-win_amd64.whl
pip install C:\gvsbuild\release\python\PyGObject-3.32.0-cp36-cp36m-win_amd64.whl
6. Install Deluge:
pip install deluge deluge-libtorrent
Intrepid users can install Deluge from seperate packages as detailed in [issue #3201].
## <i class="fa fa-apple"></i> macOS
There is no `.app` package currently for macOS, but can try Deluge with homebrew.
1. Install [Homebrew]
2. Open a terminal.
3. Run the following to install required packages:
1. Install [Homebrew]
2. Open a terminal.
3. Run the following to install required packages:
brew install pyobject3 gtk+3 adwaita-icon-theme
brew install libtorrent-rasterbar
brew install pygobject3 gtk+3 adwaita-icon-theme
brew install libtorrent-rasterbar
4. To fix translations:
4. To fix translations:
brew link gettext --force
brew link gettext --force
5. Install Deluge:
5. Install Deluge:
pip3 install deluge
pip3 install deluge
[develop ppa]: https://launchpad.net/~deluge-team/+archive/ubuntu/develop/
[homebrew]: https://brew.sh/
[python 3.6]: https://www.python.org/downloads/release/python-368/
[gvsbuild]: https://ci.appveyor.com/api/buildjobs/b0y2sttcq3t1071q/artifacts/gvsbuild-vs14-x64.tar.gz
[issue #3201]: https://dev.deluge-torrent.org/ticket/3201#comment:9

View File

@@ -1,16 +1,38 @@
# Deluge Web UI
The Deluge web interface is intended to be a full featured interface built using
the ExtJS framework, running on top of a Twisted webserver.
The Deluge web interface is a full featured interface built using the ExtJS framework,
running on top of a Twisted webserver.
## SSL Configuration
By default the web interface will use the same private key and certificate as
the Deluge daemon. If you wish to use a different certificate/key (see
[How to Create a SSL Certificate](http://www.yatblog.com/2007/02/27/how-to-create-a-ssl-certificate/))
for information on creating one) you are able to specify which you want to use.
the Deluge daemon. You can use a different certificate/key and specify it in the Web UI
config, see below for details.
There are 2 ways to enable SSL encryption in the webserver, 1 is to specify it
in your configuration (accessible via the Preferences window). The other is to
add '--ssl' when running the webserver, which will override the configuration
value and enable SSL.
### Create SSL Certificate Examples
Sample guide: [How to Create a SSL Certificate][ssl cert]
#### Linux
openssl req -new -x509 -nodes -out deluge.cert.pem -keyout deluge.key.pem
#### Windows
C:\OpenSSL\bin\openssl.exe req -config C:\OpenSSL\bin\openssl.cnf -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem
### Enable Web UI SSL
There are two ways to enable SSL encryption in the webserver:
- Specify in your config (accessible via the Preferences window).
- Use `--ssl` when running the webserver, overriding the configuration value to enable SSL.
## Enable Development mode
Add `?dev=true` to the webui url to enable development mode, uses the source js files
(if available) rather than compressed versions:
http://127.0.0.1:8112/?dev=true
[ssl cert]: http://www.yatblog.com/2007/02/27/how-to-create-a-ssl-certificate/

View File

@@ -0,0 +1,56 @@
# Deluge 2.0 release notes
Welcome to the latest release of Deluge, a long time in the making!
## What's new
Some of the highlights since the last major release.
- Migrated to Python 3 with minimal support retained for Python 2.7.
- Shiny new logo.
- Multi-user support.
- Performance updates to handle thousands of torrents with faster loading times.
- A New Console UI which emulates GTK/Web UIs.
- GTK UI migrated to GTK3 with UI improvements and additions.
- Magnet pre-fetching to allow file selection when adding torrent.
- Fully support libtorrent 1.2 release.
- Language switching support.
- Improved documentation hosted on ReadTheDocs.
- AutoAdd plugin replaces built-in functionality.
- WebUI now daemonizes by default so service scripts will require `-d` option.
## Packaging
### PyPi
As well as the usual source tarball available for [download] we now have published
Deluge on the PyPi software repository.
- https://pypi.org/project/deluge/
### Windows and MacOS
Unfortunately there are no packages yet for [Windows] or MacOS but they are being worked
on. For now alternative [install] methods are available for testing.
## Upgrade considerations
Deluge 2.0 is not compatible with Deluge 1.x clients or daemons so these will require
upgrading too. Also third-party Python scripts may not be compatible if they directly
connect to the Deluge client and will need migrating.
Always make a backup of your [config] before a major version upgrade to guard against
data loss.
Translations may not be as up-to date so please help out, see [translations] page.
Plugins written for Deluge 1.3 will need upgrading for Deluge 2.0, due to the
requirement of Python 3 and GTK3 UI. There is a [update plugin] document to help
Plugin authors update their plugins.
[update plugin]: ../devguide/how-to/update-1.3-plugin.md
[windows]: https://dev.deluge-torrent.org/ticket/3201
[install]: https://deluge.readthedocs.io/en/latest/intro/01-install.html
[config]: https://dev.deluge-torrent.org/wiki/Faq#WheredoesDelugestoreitssettingsconfig
[translations]: ../contributing/translations.md
[download]: http://download.deluge-torrent.org/source/2.0/

View File

@@ -0,0 +1,10 @@
# Release notes
A summary of the important changes in major releases of Deluge. For more details see
the [changelog] or the [git commit log].
- [Changelog]
- [Deluge 2.0 release notes](2.0.md)
[git commit log]: http://git.deluge-torrent.org/deluge/log/?h=master
[changelog]: ../changelog.md

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.deluge-torrent.deluge-web</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/deluge-web</string>
<string>-d</string>
<string>-L</string>
<string>error</string>
<string>-l</string>
<string>/var/log/deluge-web.log</string>
</array>
<key>StandardOutPath</key>
<string>/tmp/deluge-web.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/deluge-web.stderr</string>
<!-- To enable running as 'deluge' user remove comments.
<key>UserName</key>
<string>deluge</string>
-->
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.deluge-torrent.deluged</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/deluged</string>
<string>-d</string>
<string>-L</string>
<string>error</string>
<string>-l</string>
<string>/var/log/deluged.log</string>
</array>
<key>StandardOutPath</key>
<string>/tmp/deluged.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/deluged.stderr</string>
<!-- To enable running as 'deluge' user remove comments.
<key>UserName</key>
<string>deluge</string>
-->
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

View File

@@ -6,9 +6,6 @@ Wants=deluged.service
[Service]
Type=simple
User=deluge
Group=deluge
UMask=027
ExecStart=/usr/bin/deluge-web -d

View File

@@ -5,8 +5,6 @@ After=network-online.target
[Service]
Type=simple
User=deluge
Group=deluge
UMask=007
ExecStart=/usr/bin/deluged -d

View File

@@ -0,0 +1,4 @@
# Override service user
[Service]
User=deluge
Group=deluge

View File

@@ -591,7 +591,7 @@ setup(
'Operating System :: POSIX',
'Topic :: Internet',
],
python_requires='>=3.5',
python_requires='>=2.7',
license='GPLv3+',
cmdclass=cmdclass,
setup_requires=setup_requires,