annotate environment.py @ 9:145779f2d79d

wedge in an allow-origin response for tests that aren't serving on our domain
author drewp@bigasterisk.com
date Sun, 07 May 2023 16:00:19 -0700
parents b5bfd0dd69d6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
1 #!/usr/bin/python
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
2 """
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
3 return some rdf about the environment, e.g. the current time,
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
4 daytime/night, overall modes like 'maintenance mode', etc
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
5
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
6 """
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
7 import datetime
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
8 import logging
9
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
9 import os
5
b5bfd0dd69d6 upadte bg loop, patchablegraph, py version
drewp@bigasterisk.com
parents: 3
diff changeset
10
b5bfd0dd69d6 upadte bg loop, patchablegraph, py version
drewp@bigasterisk.com
parents: 3
diff changeset
11 import background_loop
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
12 from dateutil.relativedelta import FR, relativedelta
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
13 from dateutil.tz import tzlocal
5
b5bfd0dd69d6 upadte bg loop, patchablegraph, py version
drewp@bigasterisk.com
parents: 3
diff changeset
14 from patchablegraph import PatchableGraph
b5bfd0dd69d6 upadte bg loop, patchablegraph, py version
drewp@bigasterisk.com
parents: 3
diff changeset
15 from patchablegraph.handler import GraphEvents, StaticGraph
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
16 from rdflib import Literal, Namespace
9
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
17 from sse_starlette import EventSourceResponse, ServerSentEvent
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
18 from starlette.applications import Starlette
9
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
19 from starlette.requests import Request
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
20 from starlette.routing import Route
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
21 from starlette.staticfiles import StaticFiles
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
22 from starlette_exporter import PrometheusMiddleware, handle_metrics
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
23
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
24 # from rdfdoc import Doc
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
25 from twilight import isWithinTwilight
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
26
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
27 ROOM = Namespace("http://projects.bigasterisk.com/room/")
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
28 DEV = Namespace("http://projects.bigasterisk.com/device/")
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
29
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
30 logging.basicConfig(level=logging.INFO)
5
b5bfd0dd69d6 upadte bg loop, patchablegraph, py version
drewp@bigasterisk.com
parents: 3
diff changeset
31 logging.getLogger('patchablegraph').setLevel(logging.WARNING)
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
32
9
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
33 allowOrigin = os.environ.get('ALLOW_ORIGIN', '')
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
34
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
35 # factor this back into GraphEvents
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
36 def GE2(masterGraph:PatchableGraph):
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
37
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
38 async def generateEvents():
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
39 events = masterGraph.subscribeToPatches()
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
40 while True: # we'll get cancelled by EventSourceResponse when the conn drops
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
41 etype, data = await events.get()
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
42 # Are there more to get? We might throttle and combine patches here- ideally we could see how
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
43 # long the latency to the client is to make a better rate choice
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
44 yield ServerSentEvent(event=etype, data=data)
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
45
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
46 async def handle(request: Request):
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
47 """
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
48 One session with one client.
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
49
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
50 returns current graph plus future patches to keep remote version
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
51 in sync with ours.
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
52
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
53 instead of turning off buffering all over, it may work for this
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
54 response to send 'x-accel-buffering: no', per
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
55 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
56 """
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
57 headers = {}
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
58 if allowOrigin:
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
59 headers={'Access-Control-Allow-Origin':allowOrigin}
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
60 return EventSourceResponse(generateEvents(), headers=headers)
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
61
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
62 return handle
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
63
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
64 def update(masterGraph):
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
65
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
66 def stmt(s, p, o):
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
67 masterGraph.patchObject(ROOM.environment, s, p, o)
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
68
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
69 now = datetime.datetime.now(tzlocal())
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
70
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
71 stmt(DEV.environment, ROOM.localHour, Literal(now.hour))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
72 stmt(DEV.environment, ROOM.localTimeToMinute, Literal(now.strftime("%H:%M")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
73
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
74 stmt(DEV.environment, ROOM.localTimeToSecond, Literal(now.strftime("%H:%M:%S")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
75
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
76 stmt(DEV.environment, ROOM.localDayOfWeek, Literal(now.strftime("%A")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
77 stmt(DEV.environment, ROOM.localMonthDay, Literal(now.strftime("%B %e")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
78 stmt(DEV.environment, ROOM.localDate, Literal(now.strftime("%Y-%m-%d")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
79
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
80 for offset in range(-12, 7):
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
81 d = now.date() + datetime.timedelta(days=offset)
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
82 if d == d + relativedelta(day=31, weekday=FR(-1)):
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
83 stmt(DEV.calendar, ROOM.daysToLastFridayOfMonth, Literal(offset))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
84
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
85 stmt(DEV.calendar, ROOM.twilight, ROOM['withinTwilight'] if isWithinTwilight(now) else ROOM['daytime'])
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
86
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
87
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
88 def main():
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
89 masterGraph = PatchableGraph()
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
90
5
b5bfd0dd69d6 upadte bg loop, patchablegraph, py version
drewp@bigasterisk.com
parents: 3
diff changeset
91 loop = background_loop.loop_forever(lambda first_run=False: update(masterGraph), 1)
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
92
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
93 app = Starlette(
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
94 debug=True,
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
95 routes=[
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
96 Route('/', StaticFiles(directory='.', html=True)),
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
97 Route('/graph/environment', StaticGraph(masterGraph)),
9
145779f2d79d wedge in an allow-origin response for tests that aren't serving on our domain
drewp@bigasterisk.com
parents: 5
diff changeset
98 Route('/graph/environment/events', GE2(masterGraph)),
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
99 # Route('/doc', Doc),
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
100 ])
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
101
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
102 app.add_middleware(PrometheusMiddleware, app_name='environment')
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
103 app.add_route("/metrics", handle_metrics)
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
104 return app
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
105
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
106
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
107 app = main()