Wait for network
authorBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 20 Jan 2021 10:10:52 +0000 (11:10 +0100)
committerBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 20 Jan 2021 10:10:52 +0000 (11:10 +0100)
controlpi.service
graphit_controlpi/websocket.py

index 0ecd8de3ed8e2a385e84ae565e2b62987e3f7b8c..535996c64cd77600bedad2ce73fd2c7832e98d35 100644 (file)
@@ -1,5 +1,7 @@
 [Unit]
 Description=Control Pi Service
+Wants=network-online.target
+After=network-online.target
 
 [Service]
 WorkingDirectory=/home/pi
index 775e8dd495f9e97629e7f17511508c36e60e5685..7ee7fee515973276e4cac1da619d85eb177ea311 100644 (file)
@@ -83,22 +83,25 @@ async def process_request(server_root, path, request_headers):
     return HTTPStatus.OK, response_headers, body
 
 
-def get_ip():
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    try:
-        s.connect(('10.255.255.255', 1))
-        ip = s.getsockname()[0]
-    except Exception:
-        ip = '127.0.0.1'
-    finally:
-        s.close()
+async def get_ip():
+    ip = None
+    while not ip:
+        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+        try:
+            s.connect(('10.255.255.255', 1))
+            ip = s.getsockname()[0]
+        except Exception:
+            ip = None
+            await asyncio.sleep(0.1)
+        finally:
+            s.close()
     return ip
 
 
 async def setup_websocket(pins, queues, server_root):
     parameterised_handler = functools.partial(handler, pins, queues)
     parameterised_process_request = functools.partial(process_request, server_root)
-    hostname = get_ip()
+    hostname = await get_ip()
     await websockets.serve(parameterised_handler, hostname, 80,
                            process_request=parameterised_process_request)
     print(f"Serving on ws://{hostname}:80")