From daadd34be6be0233023f97773e254e845c4b6601 Mon Sep 17 00:00:00 2001 From: Oren Lederman Date: Fri, 11 May 2018 22:07:26 -0400 Subject: [PATCH 1/3] Fixed warning for wrong broadcast ids --- src/badge_hub.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/badge_hub.py b/src/badge_hub.py index a59e218..34270e8 100755 --- a/src/badge_hub.py +++ b/src/badge_hub.py @@ -452,8 +452,8 @@ def pull_devices(mgr, mgrb, start_recording): observed_project_id = device['device_info']['adv_payload']['project_id'] if b.observed_id != b.badge_id or b.project_id != observed_project_id: logger.debug("Warning! Observed IDs do not match server settings. " - "member_id:{} observed id:{}. project_id: {} observed id:{}" - .format(b.observed_id,b.badge_id,b.project_id,observed_project_id)) + "Observed: member_id:{}, project_id:{}. Expected: member_id:{}. project_id: {}" + .format(b.observed_id,observed_project_id,b.badge_id,b.project_id)) b.last_seen_ts = time.time() @@ -486,8 +486,8 @@ def pull_devices(mgr, mgrb, start_recording): observed_project_id = device['device_info']['adv_payload']['project_id'] if bcn.observed_id != bcn.badge_id or bcn.project_id != observed_project_id: logger.debug("Warning! Observed IDs do not match server settings. " - "beacon_id:{} observed id:{}. project_id: {} observed id:{}" - .format(bcn.observed_id,bcn.badge_id,bcn.project_id,observed_project_id)) + "Observed: beacon_id:{}, project_id:{}. Expected: beacon_id:{}. project_id: {}" + .format(bcn.observed_id,observed_project_id,bcn.badge_id,bcn.project_id)) bcn.last_seen_ts = time.time() From 923c81d1f6a7bf22fa17e6e9f84facf04ff3899c Mon Sep 17 00:00:00 2001 From: Oren Lederman Date: Sun, 13 May 2018 11:04:05 -0400 Subject: [PATCH 2/3] Random sort the list of devices. Fixes #30. --- src/badge_hub.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/badge_hub.py b/src/badge_hub.py index 34270e8..6c6174d 100755 --- a/src/badge_hub.py +++ b/src/badge_hub.py @@ -16,6 +16,7 @@ from requests.exceptions import RequestException import glob import traceback +import random from badge import * from badge_discoverer import BadgeDiscoverer, BeaconDiscoverer @@ -440,6 +441,9 @@ def pull_devices(mgr, mgrb, start_recording): logger.info("Scanning for members...") scanned_devices = scan_for_devices(mgr.badges.keys()) + # Randomly shuffle devices + random.shuffle(scanned_devices) + # iterate before the actual data collection loop just to offload # voltages to the server (and update heartbeat on server) for device in scanned_devices: @@ -472,10 +476,12 @@ def pull_devices(mgr, mgrb, start_recording): time.sleep(2) # requires sleep between devices - logger.info("Scanning for beacons...") scanned_beacons = scan_for_bc_devices(mgrb.beacons.keys()) + # Randomly shuffle devices + random.shuffle(scanned_beacons) + # iterate before the actual data collection loop just to offload # voltages to the server (and update heartbeat on server) for device in scanned_beacons: From 6b0b94288516c9d0bad42f78485d05cd0021c450 Mon Sep 17 00:00:00 2001 From: Oren Lederman Date: Sun, 13 May 2018 11:22:07 -0400 Subject: [PATCH 3/3] Added timeout for requests. Fixes #31 --- src/badge_manager_server.py | 12 ++++++++---- src/beacon_manager_server.py | 12 ++++++++---- src/hub_manager.py | 11 ++++++----- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/badge_manager_server.py b/src/badge_manager_server.py index 0c20d8f..21813d6 100644 --- a/src/badge_manager_server.py +++ b/src/badge_manager_server.py @@ -8,6 +8,8 @@ import traceback class BadgeManagerServer: + DEFAULT_TIMEOUT = (9.05, 15) + def __init__(self, logger): self._badges = None self.logger = logger @@ -40,7 +42,7 @@ def _read_badges_list_from_server(self, retry=True, retry_delay_sec=5): while not done: try: self.logger.info("Requesting devices from server...") - response = requests.get(BADGES_ENDPOINT, headers=request_headers()) + response = requests.get(BADGES_ENDPOINT, headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok: self.logger.info("Updating devices list ({})...".format(len(response.json()))) for d in response.json(): @@ -73,7 +75,7 @@ def _read_badge_from_server(self, badge_key, retry=False, retry_delay_sec=5): while not done: try: self.logger.info("Requesting device {} from server...".format(badge_key)) - response = requests.get(BADGE_ENDPOINT(badge_key), headers=request_headers()) + response = requests.get(BADGE_ENDPOINT(badge_key), headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok: #self.logger.debug("Received ({})...".format(response.json())) return self._jason_badge_to_object(response.json()) @@ -191,7 +193,8 @@ def send_badge(self, mac): } self.logger.debug("Sending update badge data to server, badge {} : {}".format(badge.key, data)) - response = requests.patch(BADGE_ENDPOINT(badge.key), data=data, headers=request_headers()) + response = requests.patch( + BADGE_ENDPOINT(badge.key), data=data, headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok is False: if response.status_code == 400: self.logger.debug("Server had more recent date, badge {} : {}".format(badge.key, response.text)) @@ -217,7 +220,8 @@ def create_badge(self, name, email, mac ): } self.logger.info("Creating new badge : {}".format(data)) - response = requests.post(BADGES_ENDPOINT, data=data, headers=request_headers()) + response = requests.post( + BADGES_ENDPOINT, data=data, headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok is False: s = traceback.format_exc() raise Exception('Error creating badge {}. Status: {}, Error: {}, {}'.format(data, response.status_code, diff --git a/src/beacon_manager_server.py b/src/beacon_manager_server.py index 96ee6d9..34ba5ec 100644 --- a/src/beacon_manager_server.py +++ b/src/beacon_manager_server.py @@ -9,6 +9,7 @@ class BeaconManagerServer: + DEFAULT_TIMEOUT = (9.05, 15) def __init__(self, logger): self._beacons = None @@ -37,7 +38,7 @@ def _read_beacons_list_from_server(self, retry=True, retry_delay_sec=5): while not done: try: self.logger.info("Requesting devices from server...") - response = requests.get(BEACONS_ENDPOINT, headers=request_headers()) + response = requests.get(BEACONS_ENDPOINT, headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok: self.logger.info("Updating beacons list ({})...".format(len(response.json()))) for d in response.json(): @@ -69,7 +70,8 @@ def _read_beacon_from_server(self, beacon_key, retry=False, retry_delay_sec=5): while not done: try: self.logger.info("Requesting device {} from server...".format(beacon_key)) - response = requests.get(BEACON_ENDPOINT(beacon_key), headers=request_headers()) + response = requests.get( + BEACON_ENDPOINT(beacon_key), headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok: #self.logger.debug("Received ({})...".format(response.json())) return self._jason_beacon_to_object(response.json()) @@ -143,7 +145,8 @@ def send_beacon(self, mac): } self.logger.debug("Sending update beacon data to server, beacon {} : {}".format(beacon.key, data)) - response = requests.patch(BEACON_ENDPOINT(beacon.key), data=data, headers=request_headers()) + response = requests.patch( + BEACON_ENDPOINT(beacon.key), data=data, headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok is False: if response.status_code == 400: self.logger.debug("Server had more recent date, beacon {} : {}".format(beacon.key, response.text)) @@ -171,7 +174,8 @@ def create_beacon(self, name, mac , beacon_id ,project_id): } self.logger.info("Creating new beacon : {}".format(data)) - response = requests.post(BEACONS_ENDPOINT, data=data, headers=request_headers()) + response = requests.post( + BEACONS_ENDPOINT, data=data, headers=request_headers(), timeout=self.DEFAULT_TIMEOUT) if response.ok is False: s = traceback.format_exc() raise Exception('Error creating beacon {}. Status: {}, Error: {}, {}'.format(data, response.status_code, diff --git a/src/hub_manager.py b/src/hub_manager.py index d89c6ac..6f647ac 100755 --- a/src/hub_manager.py +++ b/src/hub_manager.py @@ -15,7 +15,8 @@ from urllib import quote_plus SLEEP_WAIT_SEC = 60 # 1 minute - +LONG_TIMEOUT = (9.05, 900) +DEFAULT_TIMEOUT = (9.05, 15) def get_uuid(): """ @@ -54,7 +55,7 @@ def send_hub_ip(): } logger.debug("Sending update to server: {}".format(data)) - response = requests.patch(HUB_ENDPOINT(encoded_hostname), data=data) + response = requests.patch(HUB_ENDPOINT(encoded_hostname), data=data, timeout=DEFAULT_TIMEOUT) if response.ok is False: raise Exception('Server sent a {} status code instead of 200: {}'.format(response.status_code, response.text)) @@ -86,7 +87,7 @@ def _read_hubs_list_from_server(logger, retry=True, retry_delay_sec=5): while not done: try: logger.info("Requesting devices from server...") - response = requests.get(HUBS_ENDPOINT) + response = requests.get(HUBS_ENDPOINT, timeout=DEFAULT_TIMEOUT) if response.ok: logger.info("Updating hubs list ({})...".format(len(response.json()))) for d in response.json(): @@ -113,7 +114,7 @@ def pull_hubs_list(logger): def _get_project_id(logger): - resp = requests.request("GET", PROJECTS_ENDPOINT, headers=request_headers()) + resp = requests.request("GET", PROJECTS_ENDPOINT, headers=request_headers(), timeout=DEFAULT_TIMEOUT) if resp.status_code == 200: return resp.json()["key"] else: @@ -143,7 +144,7 @@ def send_data_to_server(logger, data_type, data): "chunks": data } url = DATA_ENDPOINT(project_id) - response = requests.request("POST", url, data=json.dumps(payload), headers=headers) + response = requests.request("POST", url, data=json.dumps(payload), headers=headers, timeout=LONG_TIMEOUT) response.raise_for_status() return response.json()["chunks_written"]