Mercurial > code > home > repos > environment
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 |
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 | 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 | 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 | 20 from starlette.routing import Route |
21 from starlette.staticfiles import StaticFiles | |
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 | 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 | 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 | 64 def update(masterGraph): |
0
3c1bc3bc5a6c
pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff
changeset
|
65 |
3 | 66 def stmt(s, p, o): |
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 | 93 app = Starlette( |
94 debug=True, | |
95 routes=[ | |
96 Route('/', StaticFiles(directory='.', html=True)), | |
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 | 99 # Route('/doc', Doc), |
100 ]) | |
0
3c1bc3bc5a6c
pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff
changeset
|
101 |
3 | 102 app.add_middleware(PrometheusMiddleware, app_name='environment') |
103 app.add_route("/metrics", handle_metrics) | |
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 | 107 app = main() |