managed_services = ['transmission-daemon'] managed_packages = ['transmission-daemon'] name = _('Transmission') short_description = _('BitTorrent') description = [ _('BitTorrent is a peer-to-peer file sharing protocol. ' 'Transmission daemon handles Bitorrent file sharing. Note that ' 'BitTorrent is not anonymous.'), _('Access the web interface at <a href="/transmission">/transmission</a>.') ] web_clients = [web_client(name='Transmission', url='/transmission')] reserved_usernames = ['debian-transmission'] service = None def init(): """Intialize the Transmission module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-save', 'transmission:index', short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup':
description = [ _('<a href="https://matrix.org/docs/guides/faq.html">Matrix</a> is an new ' 'ecosystem for open, federated instant messaging and VoIP. Synapse is a ' 'server implementing the Matrix protocol. It provides chat groups, ' 'audio/video calls, end-to-end encryption, multiple device ' 'synchronization and does not require phone numbers to work. Users on a ' 'given Matrix server can converse with users on all other Matrix ' 'servers via federation.'), _('To communicate, you can use the ' '<a href="https://matrix.org/docs/projects/">available clients</a> ' 'for mobile, desktop and the web. <a href="https://riot.im/">Riot</a> ' 'client is recommended.') ] web_clients = [web_client(name='Riot', url='https://riot.im/app/#/home')] desktop_clients = [desktop_client(name='Riot', url='https://riot.im/desktop.html'), desktop_client(name='WeeChat CLI', url='https://weechat.org/')] mobile_clients = [mobile_client(name='Riot', fully_qualified_name='im.vector.alpha', play_store_url='https://play.google.com/store/apps/' 'details?id=im.vector.alpha', fdroid_url='https://f-droid.org/packages/' 'im.vector.alpha/')] service = None
short_description = _('Chat Server') description = [ _('XMPP is an open and standardized communication protocol. Here ' 'you can run and configure your XMPP server, called ejabberd.'), format_lazy(_( 'To actually communicate, you can use the <a href="/plinth/apps/' 'jsxc">web client</a> or any other <a href=\'http://xmpp.org/xmpp-' 'software/clients/\' target=\'_blank\'>XMPP client</a>. ' 'When enabled, ejabberd can be accessed by any <a href="/plinth/sys' '/users">user with a {box_name} login</a>.'), box_name=_(cfg.box_name)) ] web_clients = [ web_client(name='JSXC', url='/plinth/apps/jsxc'), web_client(name='XMPP client', url='http://xmpp.org/xmpp' '-software/clients') ] reserved_usernames = ['ejabberd'] service = None logger = logging.getLogger(__name__) def init(): """Initialize the ejabberd module""" menu = main_menu.get('apps')
'replicated on all other devices that also run Syncthing.'), format_lazy(_( 'Running Syncthing on {box_name} provides an extra synchronization ' 'point for your data that is available most of the time, allowing ' 'your devices to synchronize more often. {box_name} runs a single ' 'instance of Syncthing that may be used by multiple users. Each ' 'user\'s set of devices may be synchronized with a distinct set of ' 'folders. The web interface on {box_name} is only available for ' 'users belonging to the "admin" group.'), box_name=_(cfg.box_name)), _('When enabled, Syncthing\'s web interface will be available from ' '<a href="/syncthing/">/syncthing</a>. Desktop and mobile clients are ' 'also <a href="https://syncthing.net/">available</a>.'), ] web_clients = [web_client(name='Syncthing', url='/syncthing')] desktop_clients = [ desktop_client(name='Syncthing', url='https://syncthing.net/') ] mobile_clients = [ mobile_client( name='Syncthing', fully_qualified_name='com.nutomic.syncthingandroid', fdroid_url='https://f-droid.org/packages/com.nutomic.syncthingandroid/', play_store_url= 'https://play.google.com/store/apps/details?id=com.nutomic' '.syncthingandroid') ]
name = _('Deluge') short_description = _('BitTorrent Web Client') description = [ _('Deluge is a BitTorrent client that features a Web UI.'), _('When enabled, the Deluge web client will be available from ' '<a href="/deluge">/deluge</a> path on the web server. The ' 'default password is \'deluge\', but you should log in and change ' 'it immediately after enabling this service.') ] reserved_usernames = ['debian-deluged'] web_clients = [web_client(name='Deluge', url='/deluge')] def init(): """Initialize the Deluge module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-magnet', 'deluge:index', short_description) 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,
_('Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, ' 'designed to allow reading news from any location, while feeling as ' 'close to a real desktop application as possible.'), format_lazy( _('When enabled, Tiny Tiny RSS will be available from <a href="/tt-' 'rss">/tt-rss</a> path on the web server. It can be accessed by ' 'any <a href="/plinth/sys/users">user with a {box_name} login</a>.'), box_name=_(cfg.box_name)), format_lazy( _('When using a mobile or desktop application for Tiny Tiny RSS, use ' 'the URL <a href="/tt-rss-app/">/tt-rss-app</a> for connecting.')) ] web_clients = [web_client(name='TT-RSS', url='/tt-rss')] mobile_clients = [ mobile_client(name='TTRSS-Reader', fully_qualified_name='org.ttrssreader', play_store_url='https://play.google.com/store/apps/details' '?id=org.ttrssreader', fdroid_url='https://f-droid.org/packages/org.ttrssreader/')] service = None def init(): """Intialize the module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-envelope', 'ttrss:index',
_('You can access Roundcube from <a href="/roundcube">' '/roundcube</a>. Provide the username and password of the email ' 'account you wish to access followed by the domain name of the ' 'IMAP server for your email provider, like <code>imap.example.com' '</code>. For IMAP over SSL (recommended), fill the server field ' 'like <code>imaps://imap.example.com</code>.'), _('For Gmail, username will be your Gmail address, password will be ' 'your Google account password and server will be ' '<code>imaps://imap.gmail.com</code>. Note that you will also need ' 'to enable "Less secure apps" in your Google account settings ' '(<a href="https://www.google.com/settings/security/lesssecureapps"' '>https://www.google.com/settings/security/lesssecureapps</a>).'), ] web_clients = [web_client('Roundcube', '/roundcube')] service = None def init(): """Intialize the module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-envelope', 'roundcube:index', short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': service = service_module.Service( 'roundcube', name, ports=['http', 'https'], is_external=True, is_enabled=is_enabled, enable=enable, disable=disable)
managed_packages = ['shaarli'] name = _('Shaarli') short_description = _('Bookmarks') description = [ _('Shaarli allows you to save and share bookmarks.'), _('When enabled, Shaarli will be available from <a href="/shaarli">' '/shaarli</a> path on the web server. Note that Shaarli only supports a ' 'single user account, which you will need to setup on the initial ' 'visit.'), ] web_clients = [web_client(name='Shaarli', url='/shaarli')] service = None def init(): """Initialize the module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-bookmark', 'shaarli:index', short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': service = service_module.Service( 'shaarli', name, ports=['http', 'https'], is_external=True, is_enabled=is_enabled, enable=enable, disable=disable)
short_description = _('Unhosted Storage') description = [ format_lazy( _('reStore is a server for <a href=\'https://unhosted.org/\'>' 'unhosted</a> web applications. The idea is to uncouple web ' 'applications from data. No matter where a web application is ' 'served from, the data can be stored on an unhosted storage ' 'server of user\'s choice. With reStore, your {box_name} becomes ' 'your unhosted storage server.'), box_name=_(cfg.box_name)), _('You can create and edit accounts in the ' '<a href=\'/restore/\'>reStore web-interface</a>.') ] web_clients = [web_client(name='reStore web-interface', url='/restore')] reserved_usernames = ['node-restore'] service = None def init(): """Initialize the reStore module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-hdd', 'restore:index', short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': service = service_module.Service(
description = [ _('ikiwiki is a simple wiki and blog application. It supports ' 'several lightweight markup languages, including Markdown, and ' 'common blogging functionality such as comments and RSS feeds. ' 'When enabled, the blogs and wikis will be available ' 'at <a href="/ikiwiki">/ikiwiki</a> (once created).'), format_lazy(_( 'Only {box_name} users in the <b>admin</b> group can <i>create</i> ' 'and <i>manage</i> blogs and wikis, but any user in the <b>wiki</b> ' 'group can <i>edit</i> existing ones. In the <a href="/plinth/sys/' 'users">User Configuration</a> you can change these ' 'permissions or add new users.'), box_name=_(cfg.box_name)) ] web_clients = [web_client(name='ikiwiki', url='/ikiwiki')] def init(): """Initialize the ikiwiki module.""" menu = main_menu.get('apps') menu.add_urlname(name, 'glyphicon-edit', 'ikiwiki:index', short_description) global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': service = service_module.Service('ikiwiki', name, ports=['http', 'https'], is_external=True,