Skip to content

Commit 956c2d2

Browse files
authored
Merge pull request #84 from labthings/improved-dns-sd
Improved DNS-SD
2 parents d08d42b + 66be1d7 commit 956c2d2

File tree

6 files changed

+56
-21
lines changed

6 files changed

+56
-21
lines changed

examples/simple_extensions.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ def get(self):
168168
# Create LabThings Flask app
169169
app, labthing = create_app(
170170
__name__,
171-
prefix="/api",
172171
title="My Lab Device API",
173172
description="Test LabThing-based API",
174173
version="0.1.0",

examples/static/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<h1>Hello world</h1>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<h1>Hello subfolder</h1>

src/labthings/server/extensions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ def __init__(
5454
self.add_view(
5555
self.static_view_class, f"{static_url_path}/<path:path>", endpoint="static"
5656
)
57+
self.add_view(
58+
self.static_view_class, f"{static_url_path}", endpoint="static_root"
59+
)
5760

5861
@property
5962
def views(self):

src/labthings/server/view/builder.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
from . import View, ActionView, PropertyView
88
from ..spec.utilities import compile_view_spec
99

10-
from flask import send_from_directory
10+
import os
11+
import glob
12+
from flask import send_file, abort
1113
import uuid
1214

1315

@@ -124,8 +126,19 @@ def static_from(static_folder: str, name=None):
124126
name = f"static-{uid}"
125127

126128
# Create inner functions
127-
def _get(self, path):
128-
return send_from_directory(static_folder, path)
129+
def _get(self, path=""):
130+
full_path = os.path.join(static_folder, path)
131+
if not os.path.exists(full_path):
132+
return abort(404)
133+
134+
if os.path.isfile(full_path):
135+
return send_file(full_path)
136+
137+
if os.path.isdir(full_path):
138+
indexes = glob.glob(os.path.join(full_path, "index.*"))
139+
if not indexes:
140+
return abort(404)
141+
return send_file(indexes[0])
129142

130143
# Generate a basic property class
131144
generated_class = type(name, (View, object), {"get": _get})

src/labthings/server/wsgi/gevent.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,35 +37,53 @@ def __init__(
3737
self.wsgi_server = None
3838
self.zeroconf_server = None
3939
self.service_info = None
40+
self.service_infos = []
4041

4142
# Events
4243
self.started_event = gevent.event.Event()
4344

4445
def register_zeroconf(self):
4546
if self.labthing:
46-
self.service_info = ServiceInfo(
47-
"_labthings._tcp.local.",
48-
f"{self.labthing.safe_title}._labthings._tcp.local.",
49-
port=self.port,
50-
properties={
51-
"path": self.labthing.url_prefix,
52-
"title": self.labthing.title,
53-
"description": self.labthing.description,
54-
"types": ";".join(self.labthing.types),
55-
},
56-
addresses={
57-
socket.inet_aton(i)
58-
for i in get_all_addresses()
59-
if i not in ("127.0.0.1", "0.0.0.0")
60-
},
47+
# Get list of host addresses
48+
mdns_addresses = {
49+
socket.inet_aton(i)
50+
for i in get_all_addresses()
51+
if i not in ("127.0.0.1", "0.0.0.0")
52+
}
53+
# LabThing service
54+
self.service_infos.append(
55+
ServiceInfo(
56+
"_labthing._tcp.local.",
57+
f"{self.labthing.safe_title}._labthing._tcp.local.",
58+
port=self.port,
59+
properties={
60+
"path": self.labthing.url_prefix,
61+
"title": self.labthing.title,
62+
"description": self.labthing.description,
63+
"types": ";".join(self.labthing.types),
64+
},
65+
addresses=mdns_addresses,
66+
)
67+
)
68+
# Mozilla WebThing service
69+
self.service_infos.append(
70+
ServiceInfo(
71+
"_webthing._tcp.local.",
72+
f"{self.labthing.safe_title}._webthing._tcp.local.",
73+
port=self.port,
74+
properties={"path": self.labthing.url_prefix},
75+
addresses=mdns_addresses,
76+
)
6177
)
6278
self.zeroconf_server = Zeroconf(ip_version=IPVersion.V4Only)
63-
self.zeroconf_server.register_service(self.service_info)
79+
for service in self.service_infos:
80+
self.zeroconf_server.register_service(service)
6481

6582
def stop(self, timeout=1):
6683
# Unregister zeroconf service
6784
if self.zeroconf_server:
68-
self.zeroconf_server.unregister_service(self.service_info)
85+
for service in self.service_infos:
86+
self.zeroconf_server.unregister_service(service)
6987
self.zeroconf_server.close()
7088
self.zeroconf_server = None
7189
# Stop WSGI server with timeout

0 commit comments

Comments
 (0)