Skip to content

Commit 4eba88d

Browse files
committed
First tutorial
Signed-off-by: Sylvain Hellegouarch <[email protected]>
1 parent 37213ef commit 4eba88d

File tree

7 files changed

+283
-0
lines changed

7 files changed

+283
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from datetime import date, datetime
2+
import os
3+
4+
from astral import Astral
5+
import cherrypy
6+
from cherrypy.process.plugins import Daemonizer, PIDFile
7+
import pytz
8+
9+
10+
class Root:
11+
@cherrypy.expose
12+
@cherrypy.tools.json_in()
13+
@cherrypy.tools.json_out()
14+
def index(self) -> str:
15+
"""
16+
Compute sunrise and sunset for the given city.
17+
"""
18+
a = Astral()
19+
a.solar_depression = 'civil'
20+
21+
params = cherrypy.request.json
22+
city_name = params["city"] or ""
23+
try:
24+
city = a[city_name]
25+
except KeyError:
26+
return {"error": "unknown city"}
27+
28+
tz = pytz.timezone(city.timezone)
29+
30+
sun = city.sun(date=date.today(), local=False)
31+
result = {}
32+
for k, v in sun.items():
33+
if isinstance(v, datetime):
34+
result[k] = v.astimezone(tz).isoformat()
35+
else:
36+
result[k] = v
37+
return result
38+
39+
40+
def run():
41+
cur_dir = os.path.abspath(os.path.dirname(__file__))
42+
43+
cherrypy.config.update({
44+
"environment": "production",
45+
"log.screen": True,
46+
"server.socket_port": 8444,
47+
"server.ssl_module": "builtin",
48+
"server.ssl_private_key": os.path.join(cur_dir, "../../key.pem"),
49+
"server.ssl_certificate": os.path.join(cur_dir, "../../cert.pem")
50+
})
51+
Daemonizer(cherrypy.engine).subscribe()
52+
PIDFile(cherrypy.engine, 'astre.pid').subscribe()
53+
cherrypy.quickstart(Root())
54+
55+
56+
if __name__ == '__main__':
57+
run()
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
{
2+
"version": "1.0.0",
3+
"title": "What is the impact of an expired certificate on our application chain?",
4+
"description": "If a certificate expires, we should gracefully deal with the issue.",
5+
"tags": ["tls"],
6+
"steady-state-hypothesis": {
7+
"title": "Application responds",
8+
"probes": [
9+
{
10+
"type": "probe",
11+
"name": "the-astre-service-must-be-running",
12+
"tolerance": true,
13+
"provider": {
14+
"type": "python",
15+
"module": "os.path",
16+
"func": "exists",
17+
"arguments": {
18+
"path": "astre.pid"
19+
}
20+
}
21+
},
22+
{
23+
"type": "probe",
24+
"name": "the-sunset-service-must-be-running",
25+
"tolerance": true,
26+
"provider": {
27+
"type": "python",
28+
"module": "os.path",
29+
"func": "exists",
30+
"arguments": {
31+
"path": "sunset.pid"
32+
}
33+
}
34+
},
35+
{
36+
"type": "probe",
37+
"name": "we-can-request-sunset",
38+
"tolerance": 200,
39+
"provider": {
40+
"type": "http",
41+
"timeout": 3,
42+
"verify_tls": false,
43+
"url": "https://localhost:8443/city/Paris"
44+
}
45+
}
46+
]
47+
},
48+
"method": [
49+
{
50+
"type": "action",
51+
"name": "swap-to-expired-cert",
52+
"provider": {
53+
"type": "process",
54+
"path": "cp",
55+
"arguments": "expired-cert.pem cert.pem"
56+
}
57+
},
58+
{
59+
"type": "probe",
60+
"name": "read-tls-cert-expiry-date",
61+
"provider": {
62+
"type": "process",
63+
"path": "openssl",
64+
"arguments": "x509 -enddate -noout -in cert.pem"
65+
}
66+
},
67+
{
68+
"type": "action",
69+
"name": "restart-astre-service-to-pick-up-certificate",
70+
"provider": {
71+
"type": "process",
72+
"path": "pkill",
73+
"arguments": "--echo -HUP -F astre.pid"
74+
}
75+
},
76+
{
77+
"type": "action",
78+
"name": "restart-sunset-service-to-pick-up-certificate",
79+
"provider": {
80+
"type": "process",
81+
"path": "pkill",
82+
"arguments": "--echo -HUP -F sunset.pid"
83+
},
84+
"pauses": {
85+
"after": 1
86+
}
87+
}
88+
],
89+
"rollbacks": [
90+
{
91+
"type": "action",
92+
"name": "swap-to-vald-cert",
93+
"provider": {
94+
"type": "process",
95+
"path": "cp",
96+
"arguments": "valid-cert.pem cert.pem"
97+
}
98+
},
99+
{
100+
"ref": "restart-astre-service-to-pick-up-certificate"
101+
},
102+
{
103+
"ref": "restart-sunset-service-to-pick-up-certificate"
104+
}
105+
]
106+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDmzCCAoOgAwIBAgIJAMeAgmoUPaRiMA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV
3+
BAYTAkZSMREwDwYDVQQIDAhCcml0dGFueTEOMAwGA1UEBwwFUGFyaXMxEDAOBgNV
4+
BAoMB0NvbXBhbnkxDDAKBgNVBAsMA09yZzESMBAGA1UEAwwJbG9jYWxob3N0MB4X
5+
DTE4MDUwNDE1MDAwMFoXDTE4MDUwNTE1MDAwMFowZDELMAkGA1UEBhMCRlIxETAP
6+
BgNVBAgMCEJyaXR0YW55MQ4wDAYDVQQHDAVQYXJpczEQMA4GA1UECgwHQ29tcGFu
7+
eTEMMAoGA1UECwwDT3JnMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3
8+
DQEBAQUAA4IBDwAwggEKAoIBAQC6+m6dLZrwhgJmGADR7uCG6pBTC13TnHRNZzRV
9+
S8AIZOxzZxV6QHHt1ysa7NTCx0WiGtJ6iRJmLMqTJ5wpw2VB6/Je+y9QwcXHXN8V
10+
SneXOfk+dRBT4IlZ+WWvIfLx6TA/fYabUsbvB/nHZblt09M7aMnROQVmIr0fqVT/
11+
oI4bk6K550I3xEZMiw9MAvn8OG1TZ4qbsOr6zYTlOTFDpH7Ss3mF1Psg93WRKSub
12+
EbBH/CK/60u2vw7eHrah3xbVEQBrKDDvrJlc3dmJA9ONzkTVue1oUpY2GkHzD2cH
13+
fKsORN46I//dC2AHWnnw+r0dkRgI9po5QOVmSJxDWKERPxk7AgMBAAGjUDBOMB0G
14+
A1UdDgQWBBQGwOwXjELeYRPjEsrawTJ5PjF0wDAfBgNVHSMEGDAWgBQGwOwXjELe
15+
YRPjEsrawTJ5PjF0wDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA+
16+
xP12Qruo3cW/c8HSmQnTe5/r/Lg9qyK9wgsXxlo/OPT8ZJN5vEgwKZEVY4/5oSYX
17+
O8LnDjslzYiZcpi9kcW/02SjpjiRQOz8UpLYsxJBgzXQzqc5Ih5q7krQtezmy4JZ
18+
uJyCuaSuXtOzHuSL2M/3wwr9lvPJ+Sk1+KIC3b+cWPpUKAnUB63PO8tY9v4xtnzi
19+
bd6Kzf9Dmzo2LId2wpPUcvZ6hEsdutq5/EYnV1CJbNJEAqnRWexaX2mR3T/Mx3/6
20+
hF90Mk/Spe8lBL7YL6OyBTISS5cTSMMtA1FtKgXLrY0SDmoDDKlmdAj77W8QtTgm
21+
ZVaHIbIgLi59xtvYu6yF
22+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC6+m6dLZrwhgJm
3+
GADR7uCG6pBTC13TnHRNZzRVS8AIZOxzZxV6QHHt1ysa7NTCx0WiGtJ6iRJmLMqT
4+
J5wpw2VB6/Je+y9QwcXHXN8VSneXOfk+dRBT4IlZ+WWvIfLx6TA/fYabUsbvB/nH
5+
Zblt09M7aMnROQVmIr0fqVT/oI4bk6K550I3xEZMiw9MAvn8OG1TZ4qbsOr6zYTl
6+
OTFDpH7Ss3mF1Psg93WRKSubEbBH/CK/60u2vw7eHrah3xbVEQBrKDDvrJlc3dmJ
7+
A9ONzkTVue1oUpY2GkHzD2cHfKsORN46I//dC2AHWnnw+r0dkRgI9po5QOVmSJxD
8+
WKERPxk7AgMBAAECggEBAIIQ9WNnNxG71u1YIzHmHtAbWXw7OvCaNBkoArKW+CWe
9+
txDsE3ewXtBZTkXzm2lHH3xNdj8BHQhwfhZxhmNS5hw+WqKRzu85bDBrvU9dNuW+
10+
0VAONOZ0Gne5Um/KiOqZERQJaNqhcXsTrEB11dC9eoIoOcPOC6Bp5++fZl5QPKqX
11+
D0P/O54oKLtibgpapP7Fobw3zvQXcbLicttiVNipnZdsRIR/J9a2oMTBQ+VcXbWG
12+
7AIJnJVqrNVqE+yCcqzf3e6SiE/9ZM6QYjEKZGzECJrPg+nrsGjLsMId/UNzKwZS
13+
A2zNgm7vrxQ8LJzKZ/l+QI0KJJkE1HOMuuSja2RqTJkCgYEA3OKlunKIIzSJJk5n
14+
zZh8Auu5F5r5hWoxA9qNgS77U1Bw4qmHPg0NKPLvCw/tLQCL/XFRsi4iZ0RZ0XyX
15+
CtwrJXqirP+w+HXo7usQYAH9wGPLZ+PE32oHdxv/7VgH/9UftGz8JL3kaLHNjUAo
16+
yEwXxenf9kdow4gX+aEC6pqltqUCgYEA2LPe4DAs9wVp+73crMnr3OMFOn7lx/HV
17+
2wG8So3zXVs+w/tGPXrjO4AOLWv1elh3S/aulioMHPeor+WvX+AnRo5W5xXfIa4d
18+
3YIfmkCMg05VyNUnSwj9FIPbz8W/FNFgz7b4OwHwtz2WlApuMGMKVoWzPpMk2Nww
19+
nD9Sj/Wgal8CgYEA0/vwcW9Zl+/jcA/vLzEYUvVHPZBNx+yR/dDR3RjpupuIuv9X
20+
/AUqjBIZt9QhGv9bWnBWp1n/Snwedx3LF3EVN3LqjH0Xqlv+oMyXeoxuqyUbISlG
21+
1+M6JuWISJAjnTM8qjuuANT9UDzTuKvKd/APILHDbug5cu45lCkiU2T3hMECgYEA
22+
wcjn7/dk3mmbAyIf6uyO3XKuREciWJDsuvJsXQdfsAZetIdJosT320eCZh/63zOp
23+
SucH7QUg2+6kjNeK4uPie3fiQrgOV2ILFwC8HgbHIMy2begfQTyChQv9T2n4nDc4
24+
qcdnZ+0uQ87xjuVc8CxBHGpnhfezpbISTkdaH555m2UCgYB/+92Ybuq+NE58vniN
25+
hkVSX5RjVF3+r5akWOkywBVZvcfa5ATabzm7eXsAzXwcM2zZC1gq9zbZJRX9sLc6
26+
tHpuLQiSPyMDXQfgy5S+FDUSu/BktbRx7nZ4PWUBrC4qcms77Qq+NCGWQ9HUEGPo
27+
bclNhHe+IWE/KDUCf+DgJji8cQ==
28+
-----END PRIVATE KEY-----
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
astral
2+
cherrypy
3+
pytz
4+
requests
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import os
2+
3+
import cherrypy
4+
from cherrypy.process.plugins import Daemonizer, PIDFile
5+
import requests
6+
7+
cur_dir = os.path.abspath(os.path.dirname(__file__))
8+
key_path = os.path.join(cur_dir, "../../key.pem")
9+
cert_path = os.path.join(cur_dir, "../../cert.pem")
10+
11+
12+
class Root:
13+
@cherrypy.expose
14+
def city(self, name):
15+
r = requests.post("https://localhost:8444/", timeout=(2, 2), json={
16+
"city": name
17+
}, verify=cert_path)
18+
19+
if r.status_code != 200:
20+
raise cherrypy.HTTPError(500, r.text)
21+
22+
cherrypy.response.headers["Content-Type"] = "text/plain"
23+
return "The sunset will occur at {} in {}".format(
24+
r.json()["sunset"], name
25+
)
26+
27+
28+
def run():
29+
30+
cherrypy.config.update({
31+
"environment": "production",
32+
"log.screen": True,
33+
"server.socket_port": 8443,
34+
"server.ssl_module": "builtin",
35+
"server.ssl_private_key": key_path,
36+
"server.ssl_certificate": cert_path
37+
})
38+
Daemonizer(cherrypy.engine).subscribe()
39+
PIDFile(cherrypy.engine, 'sunset.pid').subscribe()
40+
cherrypy.quickstart(Root())
41+
42+
43+
if __name__ == '__main__':
44+
run()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDnTCCAoWgAwIBAgIJALBVtstA2EzQMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNV
3+
BAYTAkZSMREwDwYDVQQIDAhCcml0dGFueTEPMA0GA1UEBwwGUmVubmVzMRAwDgYD
4+
VQQKDAdDb21wYW55MQwwCgYDVQQLDANPcmcxEjAQBgNVBAMMCWxvY2FsaG9zdDAe
5+
Fw0xODA1MTQxNDI2NDlaFw0yODA1MTExNDI2NDlaMGUxCzAJBgNVBAYTAkZSMREw
6+
DwYDVQQIDAhCcml0dGFueTEPMA0GA1UEBwwGUmVubmVzMRAwDgYDVQQKDAdDb21w
7+
YW55MQwwCgYDVQQLDANPcmcxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZI
8+
hvcNAQEBBQADggEPADCCAQoCggEBALr6bp0tmvCGAmYYANHu4IbqkFMLXdOcdE1n
9+
NFVLwAhk7HNnFXpAce3XKxrs1MLHRaIa0nqJEmYsypMnnCnDZUHr8l77L1DBxcdc
10+
3xVKd5c5+T51EFPgiVn5Za8h8vHpMD99hptSxu8H+cdluW3T0ztoydE5BWYivR+p
11+
VP+gjhuTornnQjfERkyLD0wC+fw4bVNnipuw6vrNhOU5MUOkftKzeYXU+yD3dZEp
12+
K5sRsEf8Ir/rS7a/Dt4etqHfFtURAGsoMO+smVzd2YkD043ORNW57WhSljYaQfMP
13+
Zwd8qw5E3joj/90LYAdaefD6vR2RGAj2mjlA5WZInENYoRE/GTsCAwEAAaNQME4w
14+
HQYDVR0OBBYEFAbA7BeMQt5hE+MSytrBMnk+MXTAMB8GA1UdIwQYMBaAFAbA7BeM
15+
Qt5hE+MSytrBMnk+MXTAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
16+
AJbF4bpngVhafhRPe5DEcDJwg3wEiFcRCCZoyQTN/GPIagZbEOr1whdXutxHlAPR
17+
Em1BxPkKbTJ7f2edq9BHgFTvw4VYkXUG1ssd8H8/GOX5K1cqActDMGiRqGi3oD6V
18+
i9A416rO0rNvpijixCPqvE3ye8PEgFL7WLvSI9p9MetAHiqFbTN974y916hhNTEV
19+
hMhPtSoPrH88VpvEsNADQrlrVQaEaxCuNvJXsXPh7Sw7r8+rvjBiCeY6J9S3SQfB
20+
VMKn7Hgc1Ct56/YLDXvjFZBx6dL7wb0TScNEqVanX6nVeUPPCe7TLkZQY/nIn4c7
21+
d/KbiuL7BIb5B7bjMkmmNq0=
22+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)