mirror of https://gitlab.com/openlp/openlp.git
Merge branch 'Remove-zero' into 'master'
Remove ZeroConf as not used See merge request openlp/openlp!481
This commit is contained in:
commit
18261b4352
|
@ -188,11 +188,6 @@ class ApiTab(SettingsTab):
|
||||||
self.server_websocket_state = QtWidgets.QLabel(self.server_state_group_box)
|
self.server_websocket_state = QtWidgets.QLabel(self.server_state_group_box)
|
||||||
self.server_websocket_state.setObjectName('server_websocket_state')
|
self.server_websocket_state.setObjectName('server_websocket_state')
|
||||||
self.server_state_layout.addRow(self.server_websocket_state_title, self.server_websocket_state)
|
self.server_state_layout.addRow(self.server_websocket_state_title, self.server_websocket_state)
|
||||||
self.server_zeroconf_state_title = QtWidgets.QLabel(self.server_state_group_box)
|
|
||||||
self.server_zeroconf_state_title.setObjectName('server_zeroconf_state_title')
|
|
||||||
self.server_zeroconf_state = QtWidgets.QLabel(self.server_state_group_box)
|
|
||||||
self.server_zeroconf_state.setObjectName('server_zeroconf_state')
|
|
||||||
self.server_state_layout.addRow(self.server_zeroconf_state_title, self.server_zeroconf_state)
|
|
||||||
self.left_layout.addStretch()
|
self.left_layout.addStretch()
|
||||||
self.right_layout.addStretch()
|
self.right_layout.addStretch()
|
||||||
|
|
||||||
|
@ -233,7 +228,6 @@ class ApiTab(SettingsTab):
|
||||||
self.server_state_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'Server Status'))
|
self.server_state_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'Server Status'))
|
||||||
self.server_http_state_title.setText(translate('RemotePlugin.RemoteTab', 'HTTP Server:'))
|
self.server_http_state_title.setText(translate('RemotePlugin.RemoteTab', 'HTTP Server:'))
|
||||||
self.server_websocket_state_title.setText(translate('RemotePlugin.RemoteTab', 'Websocket Server:'))
|
self.server_websocket_state_title.setText(translate('RemotePlugin.RemoteTab', 'Websocket Server:'))
|
||||||
self.server_zeroconf_state_title.setText(translate('RemotePlugin.RemoteTab', 'Zeroconf Server:'))
|
|
||||||
self._server_up = translate('RemotePlugin.RemoteTab', 'Active', 'Server is active')
|
self._server_up = translate('RemotePlugin.RemoteTab', 'Active', 'Server is active')
|
||||||
self._server_down = translate('RemotePlugin.RemoteTab', 'Failed', 'Server failed')
|
self._server_down = translate('RemotePlugin.RemoteTab', 'Failed', 'Server failed')
|
||||||
self._server_disabled = translate('RemotePlugin.RemoteTab', 'Disabled', 'Server is disabled')
|
self._server_disabled = translate('RemotePlugin.RemoteTab', 'Disabled', 'Server is disabled')
|
||||||
|
@ -316,13 +310,6 @@ class ApiTab(SettingsTab):
|
||||||
else:
|
else:
|
||||||
self.server_websocket_state.setText(self._server_down)
|
self.server_websocket_state.setText(self._server_down)
|
||||||
|
|
||||||
if not is_thread_finished('api_zeroconf'):
|
|
||||||
self.server_zeroconf_state.setText(self._server_up)
|
|
||||||
elif Registry().get_flag('no_web_server'):
|
|
||||||
self.server_zeroconf_state.setText(self._server_disabled)
|
|
||||||
else:
|
|
||||||
self.server_zeroconf_state.setText(self._server_down)
|
|
||||||
|
|
||||||
def get_ip_address(self, ip_address):
|
def get_ip_address(self, ip_address):
|
||||||
"""
|
"""
|
||||||
returns the IP address in dependency of the passed address
|
returns the IP address in dependency of the passed address
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##########################################################################
|
|
||||||
# OpenLP - Open Source Lyrics Projection #
|
|
||||||
# ---------------------------------------------------------------------- #
|
|
||||||
# Copyright (c) 2008-2022 OpenLP Developers #
|
|
||||||
# ---------------------------------------------------------------------- #
|
|
||||||
# This program is free software: you can redistribute it and/or modify #
|
|
||||||
# it under the terms of the GNU General Public License as published by #
|
|
||||||
# the Free Software Foundation, either version 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 General Public License for more details. #
|
|
||||||
# #
|
|
||||||
# You should have received a copy of the GNU General Public License #
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
|
||||||
##########################################################################
|
|
||||||
"""
|
|
||||||
The :mod:`~openlp.core.api.zeroconf` module runs a Zerconf server so that OpenLP can advertise the
|
|
||||||
RESTful API for devices on the network to discover.
|
|
||||||
"""
|
|
||||||
import socket
|
|
||||||
from time import sleep
|
|
||||||
|
|
||||||
from zeroconf import ServiceInfo, Zeroconf, Error, NonUniqueNameException
|
|
||||||
|
|
||||||
from openlp.core.common import get_network_interfaces
|
|
||||||
from openlp.core.common.i18n import UiStrings
|
|
||||||
from openlp.core.common.registry import Registry
|
|
||||||
from openlp.core.threading import ThreadWorker, run_thread
|
|
||||||
|
|
||||||
|
|
||||||
def _get_error_message(exc):
|
|
||||||
"""
|
|
||||||
Zeroconf doesn't have error messages, so we have to make up our own
|
|
||||||
"""
|
|
||||||
error_message = UiStrings().ZeroconfErrorIntro + '\n\n'
|
|
||||||
if isinstance(exc, NonUniqueNameException):
|
|
||||||
error_message += UiStrings().ZeroconfNonUniqueError
|
|
||||||
else:
|
|
||||||
error_message += UiStrings().ZeroconfGenericError
|
|
||||||
return error_message
|
|
||||||
|
|
||||||
|
|
||||||
class ZeroconfWorker(ThreadWorker):
|
|
||||||
"""
|
|
||||||
This thread worker runs a Zeroconf service
|
|
||||||
"""
|
|
||||||
ip_address = None
|
|
||||||
http_port = 4316
|
|
||||||
ws_port = 4317
|
|
||||||
_can_run = False
|
|
||||||
|
|
||||||
def __init__(self, addresses, http_port=4316, ws_port=4317):
|
|
||||||
"""
|
|
||||||
Create the worker for the Zeroconf service
|
|
||||||
"""
|
|
||||||
super().__init__()
|
|
||||||
self.addresses = addresses
|
|
||||||
self.http_port = http_port
|
|
||||||
self.ws_port = ws_port
|
|
||||||
|
|
||||||
def can_run(self):
|
|
||||||
"""
|
|
||||||
Check if the worker can continue to run. This is mostly so that we can override this method
|
|
||||||
and test the class.
|
|
||||||
"""
|
|
||||||
return self._can_run
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
"""
|
|
||||||
Start the service
|
|
||||||
"""
|
|
||||||
addresses = [socket.inet_aton(addr) for addr in self.addresses]
|
|
||||||
http_info = ServiceInfo('_http._tcp.local.', 'OpenLP._http._tcp.local.',
|
|
||||||
addresses=addresses, port=self.http_port, properties={})
|
|
||||||
ws_info = ServiceInfo('_ws._tcp.local.', 'OpenLP._ws._tcp.local.',
|
|
||||||
addresses=addresses, port=self.ws_port, properties={})
|
|
||||||
zc = None
|
|
||||||
try:
|
|
||||||
zc = Zeroconf()
|
|
||||||
zc.register_service(http_info)
|
|
||||||
zc.register_service(ws_info)
|
|
||||||
self._can_run = True
|
|
||||||
while self.can_run():
|
|
||||||
sleep(0.1)
|
|
||||||
except Error as e:
|
|
||||||
self.error.emit('Cannot start Zeroconf service', _get_error_message(e))
|
|
||||||
except OSError as e:
|
|
||||||
self.error.emit('Cannot start Zeroconf service', str(e))
|
|
||||||
finally:
|
|
||||||
if zc is not None:
|
|
||||||
zc.unregister_all_services()
|
|
||||||
zc.close()
|
|
||||||
self.quit.emit()
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
"""
|
|
||||||
Stop the service
|
|
||||||
"""
|
|
||||||
self._can_run = False
|
|
||||||
|
|
||||||
|
|
||||||
def start_zeroconf():
|
|
||||||
"""
|
|
||||||
Start the Zeroconf service
|
|
||||||
"""
|
|
||||||
# When we're running tests, just skip this set up if this flag is set
|
|
||||||
if Registry().get_flag('no_web_server'):
|
|
||||||
return
|
|
||||||
http_port = Registry().get('settings_thread').value('api/port')
|
|
||||||
ws_port = Registry().get('settings_thread').value('api/websocket port')
|
|
||||||
worker = ZeroconfWorker([iface['ip'] for iface in get_network_interfaces().values()], http_port, ws_port)
|
|
||||||
run_thread(worker, 'api_zeroconf')
|
|
|
@ -30,7 +30,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from openlp.core.api.http.server import HttpServer
|
from openlp.core.api.http.server import HttpServer
|
||||||
from openlp.core.api.websockets import WebSocketServer
|
from openlp.core.api.websockets import WebSocketServer
|
||||||
from openlp.core.api.zeroconf import start_zeroconf
|
|
||||||
from openlp.core.common import add_actions
|
from openlp.core.common import add_actions
|
||||||
from openlp.core.common.actions import ActionList, CategoryOrder
|
from openlp.core.common.actions import ActionList, CategoryOrder
|
||||||
from openlp.core.common.applocation import AppLocation
|
from openlp.core.common.applocation import AppLocation
|
||||||
|
@ -484,7 +483,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, LogMixin, RegistryPropert
|
||||||
self.ws_server = WebSocketServer()
|
self.ws_server = WebSocketServer()
|
||||||
self.ws_server.start()
|
self.ws_server.start()
|
||||||
self.http_server = HttpServer(self)
|
self.http_server = HttpServer(self)
|
||||||
start_zeroconf()
|
|
||||||
SettingsForm(self)
|
SettingsForm(self)
|
||||||
self.formatting_tag_form = FormattingTagForm(self)
|
self.formatting_tag_form = FormattingTagForm(self)
|
||||||
self.shortcut_form = ShortcutListForm(self)
|
self.shortcut_form = ShortcutListForm(self)
|
||||||
|
|
|
@ -243,7 +243,6 @@ def test_set_server_states_up(mock_is_thread_finished, registry, settings, api_t
|
||||||
# THEN: The servers should all be "up"
|
# THEN: The servers should all be "up"
|
||||||
assert api_tab.server_http_state.text() == 'Active'
|
assert api_tab.server_http_state.text() == 'Active'
|
||||||
assert api_tab.server_websocket_state.text() == 'Active'
|
assert api_tab.server_websocket_state.text() == 'Active'
|
||||||
assert api_tab.server_zeroconf_state.text() == 'Active'
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.api.tab.is_thread_finished')
|
@patch('openlp.core.api.tab.is_thread_finished')
|
||||||
|
@ -259,7 +258,6 @@ def test_set_server_states_disabled(mock_is_thread_finished, registry, settings,
|
||||||
# THEN: The servers should all be "up"
|
# THEN: The servers should all be "up"
|
||||||
assert api_tab.server_http_state.text() == 'Disabled'
|
assert api_tab.server_http_state.text() == 'Disabled'
|
||||||
assert api_tab.server_websocket_state.text() == 'Disabled'
|
assert api_tab.server_websocket_state.text() == 'Disabled'
|
||||||
assert api_tab.server_zeroconf_state.text() == 'Disabled'
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.api.tab.is_thread_finished')
|
@patch('openlp.core.api.tab.is_thread_finished')
|
||||||
|
@ -275,7 +273,6 @@ def test_set_server_states_down(mock_is_thread_finished, registry, settings, api
|
||||||
# THEN: The servers should all be "up"
|
# THEN: The servers should all be "up"
|
||||||
assert api_tab.server_http_state.text() == 'Failed'
|
assert api_tab.server_http_state.text() == 'Failed'
|
||||||
assert api_tab.server_websocket_state.text() == 'Failed'
|
assert api_tab.server_websocket_state.text() == 'Failed'
|
||||||
assert api_tab.server_zeroconf_state.text() == 'Failed'
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.api.tab.download_version_info')
|
@patch('openlp.core.api.tab.download_version_info')
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
##########################################################################
|
|
||||||
# OpenLP - Open Source Lyrics Projection #
|
|
||||||
# ---------------------------------------------------------------------- #
|
|
||||||
# Copyright (c) 2008-2022 OpenLP Developers #
|
|
||||||
# ---------------------------------------------------------------------- #
|
|
||||||
# This program is free software: you can redistribute it and/or modify #
|
|
||||||
# it under the terms of the GNU General Public License as published by #
|
|
||||||
# the Free Software Foundation, either version 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 General Public License for more details. #
|
|
||||||
# #
|
|
||||||
# You should have received a copy of the GNU General Public License #
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
|
||||||
##########################################################################
|
|
||||||
from unittest.mock import MagicMock, call, patch
|
|
||||||
|
|
||||||
from openlp.core.api.zeroconf import ZeroconfWorker, start_zeroconf
|
|
||||||
|
|
||||||
|
|
||||||
def test_zeroconf_worker_constructor():
|
|
||||||
"""Test creating the Zeroconf worker object"""
|
|
||||||
# GIVEN: A ZeroconfWorker class
|
|
||||||
# WHEN: An instance of the ZeroconfWorker is created
|
|
||||||
worker = ZeroconfWorker(['127.0.0.1'], 8000, 8001)
|
|
||||||
|
|
||||||
# THEN: The inet_aton function should have been called and the attrs should be set
|
|
||||||
assert worker.addresses == ['127.0.0.1']
|
|
||||||
assert worker.http_port == 8000
|
|
||||||
assert worker.ws_port == 8001
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.api.zeroconf.ServiceInfo')
|
|
||||||
@patch('openlp.core.api.zeroconf.Zeroconf')
|
|
||||||
def test_zeroconf_worker_start(MockedZeroconf, MockedServiceInfo):
|
|
||||||
"""Test the start() method of ZeroconfWorker"""
|
|
||||||
# GIVEN: A few mocks and a ZeroconfWorker instance with a mocked can_run method
|
|
||||||
mocked_http_info = MagicMock()
|
|
||||||
mocked_ws_info = MagicMock()
|
|
||||||
mocked_zc = MagicMock()
|
|
||||||
MockedServiceInfo.side_effect = [mocked_http_info, mocked_ws_info]
|
|
||||||
MockedZeroconf.return_value = mocked_zc
|
|
||||||
worker = ZeroconfWorker(['127.0.0.1'], 8000, 8001)
|
|
||||||
|
|
||||||
# WHEN: The start() method is called
|
|
||||||
with patch.object(worker, 'can_run') as mocked_can_run:
|
|
||||||
mocked_can_run.side_effect = [True, False]
|
|
||||||
worker.start()
|
|
||||||
|
|
||||||
# THEN: The correct calls are made
|
|
||||||
assert MockedServiceInfo.call_args_list == [
|
|
||||||
call('_http._tcp.local.', 'OpenLP._http._tcp.local.', addresses=[b'\x7f\x00\x00\x01'], port=8000,
|
|
||||||
properties={}),
|
|
||||||
call('_ws._tcp.local.', 'OpenLP._ws._tcp.local.', addresses=[b'\x7f\x00\x00\x01'], port=8001,
|
|
||||||
properties={})
|
|
||||||
]
|
|
||||||
assert MockedZeroconf.call_count == 1
|
|
||||||
assert mocked_zc.register_service.call_args_list == [call(mocked_http_info), call(mocked_ws_info)]
|
|
||||||
assert mocked_can_run.call_count == 2
|
|
||||||
mocked_zc.unregister_all_services.assert_called_once_with()
|
|
||||||
mocked_zc.close.assert_called_once_with()
|
|
||||||
|
|
||||||
|
|
||||||
def test_zeroconf_worker_stop():
|
|
||||||
"""Test that the ZeroconfWorker.stop() method correctly stops the service"""
|
|
||||||
# GIVEN: A worker object with _can_run set to True
|
|
||||||
worker = ZeroconfWorker(['127.0.0.1'], 8000, 8001)
|
|
||||||
worker._can_run = True
|
|
||||||
|
|
||||||
# WHEN: stop() is called
|
|
||||||
worker.stop()
|
|
||||||
|
|
||||||
# THEN: _can_run should be False
|
|
||||||
assert worker.can_run() is False
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.api.zeroconf.get_network_interfaces')
|
|
||||||
@patch('openlp.core.api.zeroconf.Registry')
|
|
||||||
@patch('openlp.core.api.zeroconf.ZeroconfWorker')
|
|
||||||
@patch('openlp.core.api.zeroconf.run_thread')
|
|
||||||
def test_start_zeroconf(mocked_run_thread, MockedZeroconfWorker, MockedRegistry, mocked_get_network_interfaces):
|
|
||||||
"""Test the start_zeroconf() function"""
|
|
||||||
# GIVEN: A whole bunch of stuff that's mocked out
|
|
||||||
mocked_get_network_interfaces.return_value = {
|
|
||||||
'eth0': {
|
|
||||||
'ip': '192.168.1.191',
|
|
||||||
'broadcast': '192.168.1.255',
|
|
||||||
'netmask': '255.255.255.0',
|
|
||||||
'prefix': 24,
|
|
||||||
'localnet': '192.168.1.0'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MockedRegistry.return_value.get_flag.return_value = False
|
|
||||||
MockedRegistry.settings.return_value.value.side_effect = [8000, 8001]
|
|
||||||
mocked_worker = MagicMock()
|
|
||||||
MockedZeroconfWorker.return_value = mocked_worker
|
|
||||||
|
|
||||||
# WHEN: start_zeroconf() is called
|
|
||||||
start_zeroconf()
|
|
||||||
|
|
||||||
# THEN: A worker is added to the list of threads
|
|
||||||
mocked_run_thread.assert_called_once_with(mocked_worker, 'api_zeroconf')
|
|
|
@ -99,7 +99,6 @@ def main_window_reduced(settings, state):
|
||||||
patch('openlp.core.ui.mainwindow.ProjectorManager'), \
|
patch('openlp.core.ui.mainwindow.ProjectorManager'), \
|
||||||
patch('openlp.core.ui.mainwindow.HttpServer'), \
|
patch('openlp.core.ui.mainwindow.HttpServer'), \
|
||||||
patch('openlp.core.ui.mainwindow.WebSocketServer'), \
|
patch('openlp.core.ui.mainwindow.WebSocketServer'), \
|
||||||
patch('openlp.core.ui.mainwindow.start_zeroconf'), \
|
|
||||||
patch('openlp.core.ui.mainwindow.PluginForm'):
|
patch('openlp.core.ui.mainwindow.PluginForm'):
|
||||||
return MainWindow()
|
return MainWindow()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue