diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py
index 344ed0dbb..285ce957c 100644
--- a/plinth/modules/deluge/__init__.py
+++ b/plinth/modules/deluge/__init__.py
@@ -28,6 +28,7 @@ from plinth import service as service_module
from plinth.client import web_client
from plinth.menu import main_menu
from plinth.modules.users import add_group
+from .manifest import clients
version = 2
@@ -53,6 +54,7 @@ description = [
reserved_usernames = ['debian-deluged']
+clients = clients
web_clients = [web_client(name='Deluge', url='/deluge')]
diff --git a/plinth/modules/deluge/manifest.py b/plinth/modules/deluge/manifest.py
new file mode 100644
index 000000000..3306ecb7b
--- /dev/null
+++ b/plinth/modules/deluge/manifest.py
@@ -0,0 +1,34 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Deluge'),
+ 'description': _('Bittorrent client written in Python/PyGTK '),
+ 'platforms': [
+ {
+ 'type': 'web',
+ 'relative_path': '/deluge'
+ },
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'deluge'
+ }]
+ }]
diff --git a/plinth/modules/diaspora/__init__.py b/plinth/modules/diaspora/__init__.py
index 6aed51458..7cbdeee30 100644
--- a/plinth/modules/diaspora/__init__.py
+++ b/plinth/modules/diaspora/__init__.py
@@ -24,6 +24,7 @@ from plinth import actions, action_utils, frontpage, \
service as service_module
from plinth.errors import DomainNotRegisteredError
from plinth.menu import main_menu
+from .manifest import clients
domain_name_file = "/etc/diaspora/domain_name"
lazy_domain_name = None # To avoid repeatedly reading from file
@@ -69,6 +70,8 @@ description = [
' federate with other diaspora* pods.')
]
+clients = clients
+
def init():
"""Initialize the Diaspora module."""
diff --git a/plinth/modules/diaspora/manifest.py b/plinth/modules/diaspora/manifest.py
new file mode 100644
index 000000000..86fb0ce0c
--- /dev/null
+++ b/plinth/modules/diaspora/manifest.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+from plinth.utils import format_lazy
+from . import get_configured_domain_name
+
+clients = [
+ {
+ 'name': _('dandelion*'),
+ 'description': _('It is an unofficial webview based client for the '
+ 'community-run, distributed social network diaspora*'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'os_version': '>4.2.0',
+ 'store_type': 'fdroid_store',
+ 'url': 'https://f-droid.org/repository/browse/?fdid=com'
+ '.github.dfa.diaspora_android ',
+ 'fully_qualified_name': 'com.github.dfa.diaspora_android'
+ }
+ ]
+ },
+ {
+ 'name': _('diaspora*'),
+ 'platforms': [
+ {
+ 'type': 'web',
+ 'url': format_lazy('https://diaspora.{host}',
+ host=get_configured_domain_name())
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/ejabberd/__init__.py b/plinth/modules/ejabberd/__init__.py
index b2fa81999..e877e2e99 100644
--- a/plinth/modules/ejabberd/__init__.py
+++ b/plinth/modules/ejabberd/__init__.py
@@ -34,6 +34,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.signals import pre_hostname_change, post_hostname_change
from plinth.signals import domainname_change
+from .manifest import clients
from plinth.client import web_client
@@ -64,6 +65,8 @@ web_clients = [web_client(name='JSXC', url='/plinth/apps/jsxc'),
web_client(name='XMPP client', url='http://xmpp.org/xmpp'
'-software/clients')]
+clients = clients
+
reserved_usernames = ['ejabberd']
service = None
diff --git a/plinth/modules/ejabberd/manifest.py b/plinth/modules/ejabberd/manifest.py
new file mode 100644
index 000000000..aa0e9f2ec
--- /dev/null
+++ b/plinth/modules/ejabberd/manifest.py
@@ -0,0 +1,132 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+from plinth.modules.jsxc import manifest as jsxc_manifest
+
+clients = [
+ {
+ 'name': _('yaxim'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'org.yaxim.androidclient',
+ 'url': 'https://play.google.com/store/apps/details?id=org'
+ '.yaxim.androidclient '
+ }]
+ },
+ {
+ 'name': _('Bruno'),
+ 'description': _('Bruno is a themed version of the open source '
+ 'yaxim app.'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'org.yaxim.bruno',
+ 'url': 'https://play.google.com/store/apps/details?id'
+ '=org.yaxim.bruno '
+ }
+ ]
+ },
+ {
+ 'name': _('Chat secure - Encrypted Messenger'),
+ 'description': _('ChatSecure is a free and open source '
+ 'messaging app that features OTR encryption '
+ 'over XMPP. You can connect to an existing '
+ 'Google account, create new accounts on '
+ 'public XMPP servers (including via Tor), '
+ 'or even connect to your own server for '
+ 'extra security.'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'iOS',
+ 'store_type': 'apple_store',
+ 'url': 'https://itunes.apple.com/us/app/chatsecure'
+ '/id464200063 '
+ }
+ ]
+ },
+ {
+ 'name': _('Conversations'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'url': 'https://play.google.com/store/apps/details?id'
+ '=eu.siacs.conversations ',
+ 'fully_qualified_name': 'eu.siacs.conversations'
+ }
+ ]
+ },
+ {
+ 'name': _('Dino'),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'Debian',
+ 'url': 'https://download.opensuse.org/repositories/network'
+ ':/messaging:/xmpp:/dino/Debian_9.0/amd64/dino_0.0'
+ '~git178.9d8e1e8_amd64.deb',
+ }
+ ]
+ },
+ {
+ 'name': _('Gajim'),
+ 'platforms': [
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'gajim'
+ },
+ {
+ 'type': 'download',
+ 'os': 'Windows',
+ 'url': 'https://gajim.org/downloads/0.16/gajim-0.16.8-2.exe'
+ }
+ ]
+ },
+ {
+ 'name': _('OneTeam'),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'Windows',
+ 'url': 'https://download.process-one.net/oneteam/release'
+ '-installers/OneTeam.msi'
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://download.process-one.net/oneteam/release'
+ '-installers/OneTeam.dmg '
+ },
+ {
+ 'type': 'download',
+ 'os': 'Linux',
+ 'url': 'https://download.process-one.net/oneteam/release'
+ '-installers/oneteam.tar.bz2 '
+ }
+ ]
+ }
+].append(jsxc_manifest.clients)
diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py
index 2407e0e48..9aceebe2c 100644
--- a/plinth/modules/ikiwiki/__init__.py
+++ b/plinth/modules/ikiwiki/__init__.py
@@ -29,6 +29,7 @@ from plinth import frontpage
from plinth import service as service_module
from plinth.menu import main_menu
from plinth.client import web_client
+from .manifest import clients
version = 1
@@ -58,6 +59,8 @@ description = [
'permissions or add new users.'), box_name=_(cfg.box_name))
]
+clients = clients
+
web_clients = [web_client(name='ikiwiki', url='/ikiwiki')]
def init():
diff --git a/plinth/modules/ikiwiki/manifest.py b/plinth/modules/ikiwiki/manifest.py
new file mode 100644
index 000000000..e138050bd
--- /dev/null
+++ b/plinth/modules/ikiwiki/manifest.py
@@ -0,0 +1,28 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('ikiwiki'),
+ 'platforms': [{
+ 'type': 'web',
+ 'relative_url': '/ikiwiki'
+ }]
+ }
+]
diff --git a/plinth/modules/infinoted/__init__.py b/plinth/modules/infinoted/__init__.py
index 294c8605e..d074e5bb0 100644
--- a/plinth/modules/infinoted/__init__.py
+++ b/plinth/modules/infinoted/__init__.py
@@ -30,6 +30,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.utils import format_lazy
from plinth.views import ServiceView
+from .manifest import clients
from plinth.client import desktop_client
@@ -57,6 +58,8 @@ description = [
desktop_clients = [desktop_client(name='Gobby', url='https://gobby.github.io/')]
+clients = clients
+
def init():
"""Initialize the infinoted module."""
diff --git a/plinth/modules/infinoted/manifest.py b/plinth/modules/infinoted/manifest.py
new file mode 100644
index 000000000..85d7a2207
--- /dev/null
+++ b/plinth/modules/infinoted/manifest.py
@@ -0,0 +1,43 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+from plinth.utils import format_lazy
+from plinth import cfg
+
+clients = [
+ {
+ 'name': _('Gobby'),
+ 'description': _('Gobby is a collaborative text editor'),
+ 'usage': format_lazy(_('start Gobby and select "Connect to Server" and '
+ 'enter your {box_name}\'s domain name.'),
+ box_name=_(cfg.box_name)),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'Windows',
+ 'url': 'http://releases.0x539.de/gobby/gobby-stable.exe'
+ },
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'gobby-infinote'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/jsxc/__init__.py b/plinth/modules/jsxc/__init__.py
index 0d7a8c3b6..ca1cb7559 100644
--- a/plinth/modules/jsxc/__init__.py
+++ b/plinth/modules/jsxc/__init__.py
@@ -27,6 +27,7 @@ import socket
from plinth import frontpage
from plinth import service as service_module
from plinth.menu import main_menu
+from .manifest import clients
version = 1
@@ -43,6 +44,8 @@ description = [
'server running locally.'),
]
+clients = clients
+
service = None
logger = logging.getLogger(__name__)
diff --git a/plinth/modules/jsxc/manifest.py b/plinth/modules/jsxc/manifest.py
new file mode 100644
index 000000000..313db43d0
--- /dev/null
+++ b/plinth/modules/jsxc/manifest.py
@@ -0,0 +1,31 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('JSXC'),
+ 'platforms': [
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'libjs-jsxc'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py
index 84d0cc09d..f4e96fdaf 100644
--- a/plinth/modules/matrixsynapse/__init__.py
+++ b/plinth/modules/matrixsynapse/__init__.py
@@ -32,6 +32,7 @@ from plinth import frontpage
from plinth import service as service_module
from plinth.client import desktop_client, web_client, mobile_client
from plinth.menu import main_menu
+from .manifest import clients
version = 2
@@ -79,6 +80,8 @@ logger = logging.getLogger(__name__)
SERVER_NAME_PATH = "/etc/matrix-synapse/conf.d/server_name.yaml"
CONFIG_FILE_PATH = '/etc/matrix-synapse/homeserver.yaml'
+clients = clients
+
def init():
"""Initialize the matrix-synapse module."""
diff --git a/plinth/modules/matrixsynapse/manifest.py b/plinth/modules/matrixsynapse/manifest.py
new file mode 100644
index 000000000..5964826ea
--- /dev/null
+++ b/plinth/modules/matrixsynapse/manifest.py
@@ -0,0 +1,70 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Riot'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'im.vector.alpha',
+ 'url': 'https://play.google.com/store/apps/details?id=im'
+ '.vector.alpha '
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'os_version': '>=6.0',
+ 'store_type': 'fdroid_store',
+ 'fully_qualified_name': 'im.vector.alpha',
+ 'url': 'https://f-droid.org/packages/im.vector.alpha/'
+ },
+ {
+ 'type': 'web',
+ 'url': 'https://riot.im/app/#/home'
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://riot.im/download/desktop/install/macos'
+ '/Riot-0.12.4.dmg'
+ },
+ {
+ 'type': 'download',
+ 'os': 'Windows(32 bit)',
+ 'os_version': '>=7',
+ 'url': 'https://riot.im/download/desktop/install/win32/ia32/'
+ 'Riot%20Setup%200.12.4-ia32.exe'
+ },
+ {
+ 'type': 'download',
+ 'os': 'Windows(64 bit)',
+ 'os_version': '>=7',
+ 'url': 'https://riot.im/download/desktop/install/win32/x64/Riot'
+ '%20Setup%200.12.4.exe'
+ },
+ {
+ 'type': 'download',
+ 'os': 'Debian/Ubuntu',
+ 'url': 'https://riot.im/packages/debian/'
+ }
+ ]
+ }]
diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py
index 74e04de05..7b05f5a74 100644
--- a/plinth/modules/minetest/__init__.py
+++ b/plinth/modules/minetest/__init__.py
@@ -32,6 +32,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.utils import format_lazy
from plinth.client import desktop_client, mobile_client
+from .manifest import clients
version = 2
@@ -59,6 +60,8 @@ description = [
'is needed.'), box_name=_(cfg.box_name)),
]
+clients = clients
+
desktop_clients = [desktop_client(name='Minetest',
url= 'https://www.minetest.net/downloads/')]
diff --git a/plinth/modules/minetest/manifest.py b/plinth/modules/minetest/manifest.py
new file mode 100644
index 000000000..bc637c5b9
--- /dev/null
+++ b/plinth/modules/minetest/manifest.py
@@ -0,0 +1,53 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Minetest'),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'Windows(64-bit)',
+ 'os_version': 'XP, Vista, >=7',
+ 'url': 'https://github.com/minetest/minetest/releases'
+ '/download/0.4.16/minetest-0.4.16-win64.zip '
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'net.minetest.minetest',
+ 'url': 'https://play.google.com/store/apps/details?id=net'
+ '.minetest.minetest '
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'fdroid_store',
+ 'fully_qualified_name': 'net.minetest.minetest',
+ 'url': 'https://f-droid.org/packages/net.minetest.minetest/ '
+ },
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'minetest'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py
index c618f1e30..9b1a5385d 100644
--- a/plinth/modules/mumble/__init__.py
+++ b/plinth/modules/mumble/__init__.py
@@ -29,6 +29,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.views import ServiceView
from plinth.client import desktop_client, mobile_client
+from .manifest import clients
version = 1
@@ -52,6 +53,8 @@ description = [
'from your desktop and Android devices are available.')
]
+clients = clients
+
desktop_clients = [
desktop_client(name='Mumble',url= 'https://wiki.mumble.info/wiki/Main_Page')]
diff --git a/plinth/modules/mumble/manifest.py b/plinth/modules/mumble/manifest.py
new file mode 100644
index 000000000..db211000f
--- /dev/null
+++ b/plinth/modules/mumble/manifest.py
@@ -0,0 +1,89 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Mumble'),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'Windows(32-bit)',
+ 'url': 'https://github.com/mumble-voip/mumble/releases'
+ '/download/1.2.19/mumble-1.2.19.msi '
+ },
+ {
+ 'type': 'download',
+ 'os': 'Windows(64-bit)',
+ 'url': 'https://dl.mumble.info/mumble-1.3.0~2569~gd196a4b'
+ '~snapshot.winx64.msi '
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://github.com/mumble-voip/mumble/releases'
+ '/download/1.2.19/Mumble-1.2.19.dmg '
+ },
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'mumble'
+ },
+ {
+ 'type': 'store',
+ 'os': 'iOS',
+ 'os_version': '>=8.0',
+ 'store_type': 'apple_store',
+ 'url': 'https://itunes.apple.com/us/app/mumble/id443472808'
+ }
+ ]
+ },
+ {
+ 'name': _('Plumble'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'url': 'https://play.google.com/store/apps/details?id=com'
+ '.morlunk.mumbleclient.free ',
+ 'fully_qualified_name': 'com.morlunk.mumbleclient'
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'fdroid_store',
+ 'url': 'https://play.google.com/store/apps/details?id=com'
+ '.morlunk.mumbleclient.free ',
+ 'fully_qualified_name': 'com.morlunk.mumbleclient'
+ }
+ ]
+ },
+ {
+ 'name': _('Mumblefly'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'iOS',
+ 'os_version': '>=7.0',
+ 'store_type': 'apple_store',
+ 'url': 'https://itunes.apple.com/dk/app/mumblefy/id858752232'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py
index 5aa3d69f8..ba8b510df 100644
--- a/plinth/modules/quassel/__init__.py
+++ b/plinth/modules/quassel/__init__.py
@@ -31,6 +31,7 @@ from plinth.menu import main_menu
from plinth.utils import format_lazy
from plinth.views import ServiceView
from plinth.client import mobile_client, desktop_client
+from .manifest import clients
version = 1
@@ -61,6 +62,8 @@ description = [
'are available.'),
]
+clients = clients
+
desktop_clients = [
desktop_client(name='Quassel', url='http://quassel-irc.org/downloads')]
diff --git a/plinth/modules/quassel/manifest.py b/plinth/modules/quassel/manifest.py
new file mode 100644
index 000000000..5e64a83bc
--- /dev/null
+++ b/plinth/modules/quassel/manifest.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Quassel'),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'http://quassel-irc.org/pub/QuasselClient_MacOSX'
+ '-x86_64_0.12.4.dmg '
+ },
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package_name': 'quassel-client'
+ }
+ ]
+ },
+ {
+ 'name': _('Quassseldroid'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'url': 'https://play.google.com/store/apps/details?id=com'
+ '.iskrembilen.quasseldroid',
+ 'fully_qualified_name': 'com.iskrembilen.quasseldroid'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py
index b7a75d6d2..5a8ef0777 100644
--- a/plinth/modules/radicale/__init__.py
+++ b/plinth/modules/radicale/__init__.py
@@ -31,6 +31,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.utils import format_lazy
from plinth.client import desktop_client, mobile_client
+from .manifest import clients
version = 1
@@ -54,6 +55,8 @@ description = [
'with a {box_name} login.'), box_name=_(cfg.box_name)),
]
+clients = clients
+
desktop_clients = [desktop_client(name='GNOME Calendar',
url='https://wiki.gnome.org/Apps/Calendar'),
desktop_client(name='Contacts',
diff --git a/plinth/modules/radicale/manifest.py b/plinth/modules/radicale/manifest.py
new file mode 100644
index 000000000..180ca797f
--- /dev/null
+++ b/plinth/modules/radicale/manifest.py
@@ -0,0 +1,66 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('DAVDroid'),
+ 'usage': _('Enter the URL of the Radicale server (e.g. '
+ 'http://localhost:5232) and your user name. DAVdroid will '
+ 'show all existing calendars and address books and you can '
+ 'create new.'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'url': 'https://play.google.com/store/apps/details?id=at'
+ '.bitfire.davdroid',
+ 'fully_qualified_name': 'at.bitfire.davdroid'
+ }
+ ]
+ },
+ {
+ 'name': _('GNOME Calendar'),
+ 'platforms': [
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package-name': 'gnome-calendar'
+ }
+ ]
+ },
+ {
+ 'name': _('Evolution'),
+ 'description': _('Evolution is a personal information management '
+ 'application that provides integrated mail, '
+ 'calendaring and address book functionality.'),
+ 'usage': _('In Evolution add a new calendar and address book '
+ 'respectively with WebDAV. Enter the URL of the Radicale '
+ 'server (e.g. http://localhost:5232) and your user name. '
+ 'Clicking on the search button will list the existing '
+ 'calendars and address books.'),
+ 'platforms': [
+ {
+ 'type': 'apt',
+ 'os': 'Debian',
+ 'package-name': 'gnome-calendar'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py
index 00adcfa50..4fa491e9b 100644
--- a/plinth/modules/repro/__init__.py
+++ b/plinth/modules/repro/__init__.py
@@ -29,6 +29,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.views import ServiceView
from plinth.client import desktop_client, mobile_client
+from .manifest import clients
version = 2
@@ -61,6 +62,8 @@ description = [
'service and re-enable it.'),
]
+clients = clients
+
desktop_clients = [desktop_client(name='Jitsi',url='https://jitsi.org/')]
mobile_clients = [
diff --git a/plinth/modules/repro/manifest.py b/plinth/modules/repro/manifest.py
new file mode 100644
index 000000000..3847d5fb3
--- /dev/null
+++ b/plinth/modules/repro/manifest.py
@@ -0,0 +1,89 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Jitsi Meet'),
+ 'description': _('Jitsi is a set of open-source projects that allows '
+ 'you to easily build and deploy secure '
+ 'videoconferencing solutions. At the heart of Jitsi '
+ 'are Jitsi Videobridge and Jitsi Meet, which let you '
+ 'have conferences on the internet, while other '
+ 'projects in the community enable other features '
+ 'such as audio, dial-in, recording, '
+ 'and simulcasting.'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'org.jitsi.meet',
+ 'url': 'https://play.google.com/store/apps/details?id=org'
+ '.jitsi.meet '
+ },
+ {
+ 'type': 'store',
+ 'os': 'iOS',
+ 'store_type': 'apple_store',
+ 'url': 'https://itunes.apple.com/in/app/jitsi-meet/id1165103905'
+ },
+ {
+ 'type': 'download',
+ 'os': 'Linux',
+ 'url': 'https://download.jitsi.org/jitsi/debian/'
+ },
+ {
+ 'type': 'dnf',
+ 'os': 'Linux',
+ 'package_name': 'jitsi'
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://download.jitsi.org/jitsi/macosx/jitsi-latest'
+ '.dmg '
+ },
+ {
+ 'type': 'download',
+ 'os': 'Windows',
+ 'url': 'https://download.jitsi.org/jitsi/windows/jitsi-latest'
+ '-x86.exe '
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://download.jitsi.org/jitsi/macosx/jitsi-latest'
+ '.dmg '
+ }
+ ]
+ },
+ {
+ 'name': _('CSipSimple'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'com.csipsimple',
+ 'url': 'https://play.google.com/store/apps/details?id=com'
+ '.csipsimple '
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/restore/__init__.py b/plinth/modules/restore/__init__.py
index db3e09c32..4cd8ed8b5 100644
--- a/plinth/modules/restore/__init__.py
+++ b/plinth/modules/restore/__init__.py
@@ -26,6 +26,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.utils import format_lazy
from plinth.client import web_client
+from .manifest import clients
version = 1
@@ -51,6 +52,8 @@ description = [
'reStore web-interface.')
]
+clients = clients
+
web_clients = [web_client(name='reStore web-interface', url='/restore')]
reserved_usernames = ['node-restore']
diff --git a/plinth/modules/restore/manifest.py b/plinth/modules/restore/manifest.py
new file mode 100644
index 000000000..385484751
--- /dev/null
+++ b/plinth/modules/restore/manifest.py
@@ -0,0 +1,30 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('reStore'),
+ 'platforms': [
+ {
+ 'type': 'web',
+ 'relative_url': '/restore'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py
index 015ddd7cc..5ebdfc062 100644
--- a/plinth/modules/roundcube/__init__.py
+++ b/plinth/modules/roundcube/__init__.py
@@ -27,6 +27,7 @@ from plinth import frontpage
from plinth import service as service_module
from plinth.menu import main_menu
from plinth.client import web_client
+from .manifest import clients
version = 1
@@ -59,6 +60,8 @@ description = [
'>https://www.google.com/settings/security/lesssecureapps).'),
]
+clients = clients
+
web_clients = [web_client('Roundcube', '/roundcube')]
service = None
diff --git a/plinth/modules/roundcube/manifest.py b/plinth/modules/roundcube/manifest.py
new file mode 100644
index 000000000..b17432ec7
--- /dev/null
+++ b/plinth/modules/roundcube/manifest.py
@@ -0,0 +1,30 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Roundcube'),
+ 'platforms': [
+ {
+ 'type': 'web',
+ 'relative_url': '/roundcube'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py
index 68de45cfc..814cb9ec6 100644
--- a/plinth/modules/shaarli/__init__.py
+++ b/plinth/modules/shaarli/__init__.py
@@ -27,6 +27,7 @@ from plinth import frontpage
from plinth import service as service_module
from plinth.menu import main_menu
from plinth.client import web_client
+from .manifest import clients
version = 1
@@ -46,6 +47,8 @@ description = [
'visit.'),
]
+clients = clients
+
web_clients = [web_client(name='Shaarli', url='/shaarli')]
service = None
diff --git a/plinth/modules/shaarli/manifest.py b/plinth/modules/shaarli/manifest.py
new file mode 100644
index 000000000..e65df1039
--- /dev/null
+++ b/plinth/modules/shaarli/manifest.py
@@ -0,0 +1,30 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Shaarli'),
+ 'platforms': [
+ {
+ 'type': 'web',
+ 'relative_url': '/shaarli'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/syncthing/__init__.py b/plinth/modules/syncthing/__init__.py
index fcc24c096..a905e6ab6 100644
--- a/plinth/modules/syncthing/__init__.py
+++ b/plinth/modules/syncthing/__init__.py
@@ -29,6 +29,7 @@ from plinth import service as service_module
from plinth.menu import main_menu
from plinth.utils import format_lazy
from plinth.client import desktop_client, mobile_client, web_client
+from .manifest import clients
version = 1
@@ -59,6 +60,8 @@ description = [
'also available.'),
]
+clients = clients
+
web_clients = [web_client(name='Syncthing', url='/syncthing')]
desktop_clients = [desktop_client(name='Syncthing',
diff --git a/plinth/modules/syncthing/manifest.py b/plinth/modules/syncthing/manifest.py
new file mode 100644
index 000000000..c85537dc5
--- /dev/null
+++ b/plinth/modules/syncthing/manifest.py
@@ -0,0 +1,67 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Syncthing'),
+ 'platforms': [
+ {
+ 'type': 'apt',
+ 'os': 'Debian/Ubuntu',
+ 'usage': _('For more usage information refer to Syncthing'),
+ 'package_name': 'syncthing'
+ },
+ {
+ 'type': 'download',
+ 'os': 'Windows(64-bit)',
+ 'url': 'https://github.com/syncthing/syncthing/releases'
+ '/download/v0.14.38/syncthing-windows-amd64-v0.14.38'
+ '.zip '
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://github.com/syncthing/syncthing/releases'
+ '/download/v0.14.38/syncthing-macosx-amd64-v0.14.38'
+ '.tar.gz '
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'fully_qualified_name': 'com.nutomic.syncthingandroid',
+ 'url': 'https://play.google.com/store/apps/details?id=com'
+ '.nutomic.syncthingandroid '
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_name': 'fdroid_store',
+ 'fully_qualified_name': 'com.nutomic.syncthingandroid',
+ 'url': 'https://f-droid.org/packages/com.nutomic'
+ '.syncthingandroid/ '
+ },
+ {
+ 'type': 'web',
+ 'relative_url': '/syncthing'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py
index e519763a1..5954964ab 100644
--- a/plinth/modules/tor/__init__.py
+++ b/plinth/modules/tor/__init__.py
@@ -29,6 +29,7 @@ from plinth.menu import main_menu
from plinth.modules.names import SERVICES
from plinth.signals import domain_added, domain_removed
from plinth.client import desktop_client, mobile_client
+from .manifest import clients
from . import utils
@@ -53,6 +54,8 @@ description = [
'Tor Browser.')
]
+clients = clients
+
desktop_clients = [
desktop_client(name='Tor Browser',
url='https://www.torproject.org/download/download-easy'
diff --git a/plinth/modules/tor/manifest.py b/plinth/modules/tor/manifest.py
new file mode 100644
index 000000000..6143f6068
--- /dev/null
+++ b/plinth/modules/tor/manifest.py
@@ -0,0 +1,74 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+version = '7.0.6'
+
+clients = [
+ {
+ 'name': _('Tor Browser'),
+ 'platforms': [
+ {
+ 'type': 'download',
+ 'os': 'Windows',
+ 'os_version': 'Windows XP, Vista, >=7',
+ 'url': 'https://www.torproject.org/dist/torbrowser/{v}'
+ '/torbrowser-install-{v}_en-US.exe '.format(v=version)
+ },
+ {
+ 'type': 'download',
+ 'os': 'Linux(64-bit)',
+ 'url': 'https://www.torproject.org/dist/torbrowser/{v}/tor'
+ '-browser-linux64-{v} _en-US.tar.xz'.format(v=version)
+ },
+ {
+ 'type': 'download',
+ 'os': 'Linux(32-bit)',
+ 'url': 'https://www.torproject.org/dist/torbrowser/{v}/tor'
+ '-browser-linux32-{v}_en-US.tar.xz'.format(v=version)
+ },
+ {
+ 'type': 'download',
+ 'os': 'macOS',
+ 'url': 'https://www.torproject.org/dist/torbrowser/{v}'
+ '/TorBrowser-{v}-osx64_en-US.dmg'.format(v=version)
+ }
+ ]
+ },
+ {
+ 'name': _('Orbot: Proxy with Tor'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play_store',
+ 'url': 'https://play.google.com/store/apps/details?id=org'
+ '.torproject.android',
+ 'fully_qualified_name': 'org.torproject.android'
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'fdroid_store',
+ 'url': 'https://play.google.com/store/apps/details?id=org'
+ '.torproject.android',
+ 'fully_qualified_name': 'org.torproject.android'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/transmission/__init__.py b/plinth/modules/transmission/__init__.py
index 4b25c2448..9a5b623d6 100644
--- a/plinth/modules/transmission/__init__.py
+++ b/plinth/modules/transmission/__init__.py
@@ -24,10 +24,11 @@ from django.utils.translation import ugettext_lazy as _
from plinth import service as service_module
from plinth import action_utils, actions, frontpage
-from plinth.client import web_client
from plinth.menu import main_menu
from plinth.modules.users import add_group
+from .manifest import clients
+
version = 2
managed_services = ['transmission-daemon']
@@ -45,7 +46,7 @@ description = [
_('Access the web interface at /transmission.')
]
-web_clients = [web_client(name='Transmission', url='/transmission')]
+clients = clients
reserved_usernames = ['debian-transmission']
@@ -61,14 +62,10 @@ def init():
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
- service = service_module.Service(
- managed_services[0],
- name,
- ports=['http', 'https'],
- is_external=True,
- is_enabled=is_enabled,
- enable=enable,
- disable=disable)
+ service = service_module.Service(managed_services[0], name, ports=[
+ 'http', 'https'
+ ], is_external=True, is_enabled=is_enabled, enable=enable,
+ disable=disable)
if is_enabled():
add_shortcut()
@@ -82,41 +79,32 @@ def setup(helper, old_version=None):
'rpc-whitelist-enabled': False,
'rpc-authentication-required': False
}
- helper.call(
- 'post',
- actions.superuser_run,
- 'transmission', ['merge-configuration'],
- input=json.dumps(new_configuration).encode())
+ helper.call('post', actions.superuser_run, 'transmission',
+ ['merge-configuration'],
+ input=json.dumps(new_configuration).encode())
helper.call('post', actions.superuser_run, 'transmission', ['enable'])
global service
if service is None:
- service = service_module.Service(
- managed_services[0],
- name,
- ports=['http', 'https'],
- is_external=True,
- is_enabled=is_enabled,
- enable=enable,
- disable=disable)
+ service = service_module.Service(managed_services[0], name, ports=[
+ 'http', 'https'
+ ], is_external=True, is_enabled=is_enabled, enable=enable,
+ disable=disable)
helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut)
add_group('bit-torrent')
def add_shortcut():
- frontpage.add_shortcut(
- 'transmission',
- name,
- short_description=short_description,
- url='/transmission',
- login_required=True)
+ frontpage.add_shortcut('transmission', name,
+ short_description=short_description,
+ url='/transmission', login_required=True)
def is_enabled():
"""Return whether the module is enabled."""
- return (action_utils.service_is_enabled('transmission-daemon')
- and action_utils.webserver_is_enabled('transmission-plinth'))
+ return (action_utils.service_is_enabled('transmission-daemon') and
+ action_utils.webserver_is_enabled('transmission-plinth'))
def enable():
@@ -138,7 +126,7 @@ def diagnose():
results.append(action_utils.diagnose_port_listening(9091, 'tcp4'))
results.append(action_utils.diagnose_port_listening(9091, 'tcp6'))
results.extend(
- action_utils.diagnose_url_on_all(
- 'https://{host}/transmission', check_certificate=False))
+ action_utils.diagnose_url_on_all('https://{host}/transmission',
+ check_certificate=False))
return results
diff --git a/plinth/modules/transmission/manifest.py b/plinth/modules/transmission/manifest.py
new file mode 100644
index 000000000..028b5d825
--- /dev/null
+++ b/plinth/modules/transmission/manifest.py
@@ -0,0 +1,30 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('Transmission'),
+ 'platforms': [
+ {
+ 'type': 'web',
+ 'relative_url': '/transmission'
+ }
+ ]
+ }
+]
diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py
index 0a664ac51..22df7b829 100644
--- a/plinth/modules/ttrss/__init__.py
+++ b/plinth/modules/ttrss/__init__.py
@@ -29,6 +29,7 @@ from plinth import frontpage
from plinth import service as service_module
from plinth.menu import main_menu
from plinth.client import web_client, mobile_client
+from .manifest import clients
version = 2
@@ -58,6 +59,8 @@ description = [
'the URL /tt-rss-app for connecting.'))
]
+clients = clients
+
web_clients = [web_client(name='TT-RSS', url='/tt-rss')]
mobile_clients = [
diff --git a/plinth/modules/ttrss/manifest.py b/plinth/modules/ttrss/manifest.py
new file mode 100644
index 000000000..83f53f498
--- /dev/null
+++ b/plinth/modules/ttrss/manifest.py
@@ -0,0 +1,45 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+from django.utils.translation import ugettext_lazy as _
+
+clients = [
+ {
+ 'name': _('TT-RSS Reader'),
+ 'platforms': [
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'google_play-store',
+ 'url': 'https://play.google.com/store/apps/details?id=org'
+ '.ttrssreader',
+ 'fully_qualified_name': 'org.ttrssreader'
+ },
+ {
+ 'type': 'store',
+ 'os': 'Android',
+ 'store_type': 'fdroid_store',
+ 'url': 'https://f-droid.org/packages/org.ttrssreader/',
+ 'fully_qualified_name': 'org.ttrssreader'
+ },
+ {
+ 'type': 'web',
+ 'relative_url': '/tt-rss'
+ }
+ ]
+ }
+]