From 7fb27bcfc02723ae6f6a34cbfa881af40019ea18 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Thu, 17 Oct 2019 19:29:52 +0100 Subject: [PATCH 1/7] Client: fix service file and restart order --- Drone/copter_client.py | 5 ++--- builder/assets/clever-show.service | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Drone/copter_client.py b/Drone/copter_client.py index a20d8ee..17209d5 100644 --- a/Drone/copter_client.py +++ b/Drone/copter_client.py @@ -228,11 +228,10 @@ def _response_id(*args, **kwargs): configure_motd(hostname) execute_command("hostname {}".format(hostname)) restart_service("dhcpcd") - time.sleep(0.5) restart_service("avahi-daemon") - time.sleep(0.5) - restart_service("clever") restart_service("smbd") + restart_service("roscore") + restart_service("clever") restart_service("clever-show") diff --git a/builder/assets/clever-show.service b/builder/assets/clever-show.service index e1885e5..3c8466b 100644 --- a/builder/assets/clever-show.service +++ b/builder/assets/clever-show.service @@ -1,6 +1,8 @@ [Unit] Description=Clever Show Client Service -After=clever.service +Requires=clever.service +Requires=network.target +After=network.target [Service] WorkingDirectory=/home/pi/clever-show/Drone From fc909f67dae2b7cde2f797118085740d888640ae Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Thu, 17 Oct 2019 20:12:55 +0100 Subject: [PATCH 2/7] Client: Add SO_KEEPALIVE and TCP_NODELAY options to client socket --- Drone/client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Drone/client.py b/Drone/client.py index a38570a..fc8e952 100644 --- a/Drone/client.py +++ b/Drone/client.py @@ -119,6 +119,8 @@ class Client(object): try: self.client_socket = socket.socket() self.client_socket.settimeout(timeout) + self.client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + self.client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.client_socket.connect((self.server_host, self.server_port)) except socket.error as error: if isinstance(error, OSError): From b3cd398012a4a275cf12691fed643adfadaa7568 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Fri, 18 Oct 2019 14:56:11 +0300 Subject: [PATCH 3/7] Server: Add SO_KEEPALIVE option to server socket --- Server/server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/server.py b/Server/server.py index 819f86f..8df4faf 100644 --- a/Server/server.py +++ b/Server/server.py @@ -39,6 +39,7 @@ class Server(messaging.Singleton): self.sel = selectors.DefaultSelector() self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self.server_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.host = socket.gethostname() From 2ffeec8431719c30a6cfbab6b2aba94975974107 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Fri, 18 Oct 2019 20:35:04 +0300 Subject: [PATCH 4/7] Server: Change removing copter --- Server/copter_table_models.py | 7 ++++--- Server/server.py | 2 +- Server/server_qt.py | 22 ++++++++++++---------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Server/copter_table_models.py b/Server/copter_table_models.py index 1f5c142..9b85d6b 100644 --- a/Server/copter_table_models.py +++ b/Server/copter_table_models.py @@ -202,11 +202,12 @@ class CopterDataModel(QtCore.QAbstractTableModel): if role == Qt.CheckStateRole: self.data_contents[row].states.checked = value elif role == Qt.EditRole: # For user actions with data - if col == 0 and self.on_id_changed: - self.data_contents[row][col] = "Awaiting for response" - self.data_contents[row].states.copter_id = None + if col == 0: # and self.on_id_changed: + #self.data_contents[row][col] = "Awaiting for response" + #self.data_contents[row].states.copter_id = None self.data_contents[row].client.send_message("id", {"new_id": value}) + self.data_contents[row].client.remove() else: self.data_contents[row][col] = value diff --git a/Server/server.py b/Server/server.py index 8df4faf..311b924 100644 --- a/Server/server.py +++ b/Server/server.py @@ -142,7 +142,7 @@ class Server(messaging.Singleton): while self.client_processor_thread_running.is_set(): events = self.sel.select() - logging.error('tick') + #logging.error('tick') for key, mask in events: # logging.error(mask) # logging.error(str(key.data)) diff --git a/Server/server_qt.py b/Server/server_qt.py index 77d4e90..76343a7 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -74,7 +74,7 @@ class MainWindow(QtWidgets.QMainWindow): self.show() def init_model(self): - self.model.on_id_changed = self.set_copter_id + # self.model.on_id_changed = self.set_copter_id self.proxy_model.setDynamicSortFilter(True) self.proxy_model.setSourceModel(self.model) @@ -210,16 +210,18 @@ class MainWindow(QtWidgets.QMainWindow): self.signals.update_data_signal.emit(row, col, data, ModelDataRole) - def set_copter_id(self, value, copter_data_row): - col = 0 - row = self.model.get_row_index(copter_data_row) - if row is None: - logging.error("No such client!") - return - copter_data_row.client.copter_id = value - self.signals.update_data_signal.emit(row, col, value, ModelDataRole) - self.signals.update_data_signal.emit(row, col, True, ModelStateRole) + #def set_copter_id(self, value, copter_data_row): + # col = 0 + # row = self.model.get_row_index(copter_data_row) + # if row is None: + # logging.error("No such client!") + # return + # logging.info("SET COPTER ID TO {}".format(value)) + # + # copter_data_row.client.copter_id = value + # self.signals.update_data_signal.emit(row, col, value, ModelDataRole) + # self.signals.update_data_signal.emit(row, col, True, ModelStateRole) @pyqtSlot(QtCore.QModelIndex) def selfcheck_info_dialog(self, index): From 150919c7bb607e06cd3ecfa8f131e3f88860fd00 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Thu, 17 Oct 2019 23:28:10 +0100 Subject: [PATCH 5/7] Modify to last tests with ping --- Drone/client.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Drone/client.py b/Drone/client.py index fc8e952..ced54ad 100644 --- a/Drone/client.py +++ b/Drone/client.py @@ -47,6 +47,8 @@ class Client(object): global active_client active_client = self + self._last_ping_time = 0 + def load_config(self): self.config.read(self.config_path) @@ -188,6 +190,9 @@ class Client(object): def _process_connections(self): while True: events = self.selector.select(timeout=1) + if time.time() - self._last_ping_time > 5: + self.server_connection.send_message("ping") + self._last_ping_time = time.time() # logging.debug("tick") for key, mask in events: # TODO add notifier to client! connection = key.data From 28d5d60ddf173e289c161a940f8afefee7c48d0f Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Fri, 18 Oct 2019 00:53:44 +0100 Subject: [PATCH 6/7] Client: remove ping --- Drone/client.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Drone/client.py b/Drone/client.py index ced54ad..aed8dc4 100644 --- a/Drone/client.py +++ b/Drone/client.py @@ -47,7 +47,7 @@ class Client(object): global active_client active_client = self - self._last_ping_time = 0 + # self._last_ping_time = 0 def load_config(self): self.config.read(self.config_path) @@ -190,9 +190,9 @@ class Client(object): def _process_connections(self): while True: events = self.selector.select(timeout=1) - if time.time() - self._last_ping_time > 5: - self.server_connection.send_message("ping") - self._last_ping_time = time.time() + # if time.time() - self._last_ping_time > 5: + # self.server_connection.send_message("ping") + # self._last_ping_time = time.time() # logging.debug("tick") for key, mask in events: # TODO add notifier to client! connection = key.data From 38290228c0033a2d97bee467cba430993ca855f5 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Fri, 18 Oct 2019 00:54:41 +0100 Subject: [PATCH 7/7] Client: select reboot option when change id and add execute command --- Drone/copter_client.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Drone/copter_client.py b/Drone/copter_client.py index 17209d5..62d4a73 100644 --- a/Drone/copter_client.py +++ b/Drone/copter_client.py @@ -210,6 +210,11 @@ def configure_bashrc(hostname): return True +@messaging.message_callback("execute") +def _execute(*args, **kwargs): + command = kwargs.get("command", None) + if command: + execute_command(command) @messaging.message_callback("id") def _response_id(*args, **kwargs): @@ -226,12 +231,13 @@ def _response_id(*args, **kwargs): configure_hosts(hostname) configure_bashrc(hostname) configure_motd(hostname) - execute_command("hostname {}".format(hostname)) - restart_service("dhcpcd") - restart_service("avahi-daemon") - restart_service("smbd") - restart_service("roscore") - restart_service("clever") + execute_command("reboot") + #execute_command("hostname {}".format(hostname)) + #restart_service("dhcpcd") + #restart_service("avahi-daemon") + #restart_service("smbd") + #restart_service("roscore") + #restart_service("clever") restart_service("clever-show")