Skip to content

Commit 64f1b28

Browse files
authored
enhance: add functions for daemon tools to do mTLS (#67)
Signed-off-by: Grant Linville <[email protected]>
1 parent 0cebee3 commit 64f1b28

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

gptscript/daemon.py

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import base64
2+
import ssl
3+
import os
4+
import tempfile
5+
6+
7+
def start_uvicorn(app):
8+
cert, key, client_cert = save_certificates_from_env()
9+
10+
@app.on_event("shutdown")
11+
def cleanup():
12+
os.remove(cert)
13+
os.remove(key)
14+
os.remove(client_cert)
15+
16+
import uvicorn
17+
uvicorn.run(
18+
app,
19+
host="127.0.0.1",
20+
port=int(os.getenv("PORT")),
21+
ssl_certfile=cert,
22+
ssl_keyfile=key,
23+
ssl_ca_certs=client_cert,
24+
ssl_cert_reqs=ssl.CERT_REQUIRED,
25+
)
26+
27+
def save_certificates_from_env():
28+
cert = base64.b64decode(os.getenv("CERT", ""))
29+
key = base64.b64decode(os.getenv("PRIVATE_KEY", ""))
30+
client_cert = base64.b64decode(os.getenv("GPTSCRIPT_CERT", ""))
31+
32+
if cert == "":
33+
print("error: CERT env var is empty")
34+
exit(1)
35+
elif key == "":
36+
print("error: PRIVATE_KEY env var is empty")
37+
exit(1)
38+
elif client_cert == "":
39+
print("error: GPTSCRIPT_CERT env var is empty")
40+
exit(1)
41+
42+
cert_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pem")
43+
key_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pem")
44+
client_cert_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pem")
45+
46+
os.chmod(cert_file.name, 0o600)
47+
os.chmod(key_file.name, 0o600)
48+
os.chmod(client_cert_file.name, 0o600)
49+
50+
cert_file.write(cert)
51+
key_file.write(key)
52+
client_cert_file.write(client_cert)
53+
54+
cert_file.close()
55+
key_file.close()
56+
client_cert_file.close()
57+
58+
return cert_file.name, key_file.name, client_cert_file.name

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ dependencies = [
1919
"urllib3==2.2.1",
2020
"pydantic==2.9.2",
2121
"pywin32==306 ; sys_platform == 'win32'",
22+
"uvicorn==0.32.1",
2223
]
2324

2425
[project.urls]

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ build==1.1.1
1212
httpx==0.27.0
1313
pydantic==2.9.2
1414
pywin32==306; sys_platform == 'win32'
15+
uvicorn==0.32.1

0 commit comments

Comments
 (0)