mirror of
https://github.com/bunkerity/bunkerweb
synced 2026-05-24 09:28:37 +00:00
97 lines
3.3 KiB
Python
97 lines
3.3 KiB
Python
from contextlib import suppress
|
||
from cryptography import x509
|
||
from cryptography.hazmat.backends import default_backend
|
||
from os import getenv
|
||
from socket import create_connection
|
||
from ssl import CERT_NONE, DER_cert_to_PEM_cert, create_default_context
|
||
from requests import RequestException, get
|
||
from traceback import format_exc
|
||
from time import sleep
|
||
|
||
try:
|
||
ready = False
|
||
retries = 0
|
||
while not ready:
|
||
with suppress(RequestException):
|
||
resp = get("http://www.example.com/ready", headers={"Host": "www.example.com"}, verify=False, allow_redirects=True)
|
||
status_code = resp.status_code
|
||
text = resp.text
|
||
|
||
if status_code >= 500:
|
||
print("❌ An error occurred with the server, exiting ...", flush=True)
|
||
exit(1)
|
||
|
||
ready = status_code < 400 and text == "ready"
|
||
|
||
if retries > 10:
|
||
print("❌ The service took too long to be ready, exiting ...", flush=True)
|
||
exit(1)
|
||
elif not ready:
|
||
retries += 1
|
||
print("⚠️ Waiting for the service to be ready, retrying in 5s ...", flush=True)
|
||
sleep(5)
|
||
|
||
auto_letsencrypt = getenv("AUTO_LETS_ENCRYPT", "no") == "yes"
|
||
|
||
print(
|
||
"ℹ️ Sending a request to http://www.example.com ...",
|
||
flush=True,
|
||
)
|
||
|
||
try:
|
||
req = get("http://www.example.com", headers={"Host": "www.example.com"})
|
||
req.raise_for_status()
|
||
except RequestException:
|
||
if not auto_letsencrypt:
|
||
print(
|
||
"❌ The request failed even though let's Encrypt isn't activated, exiting ...",
|
||
flush=True,
|
||
)
|
||
exit(1)
|
||
|
||
if not auto_letsencrypt:
|
||
print("✅ Let's Encrypt isn't activated, as expected ...", flush=True)
|
||
exit(0)
|
||
|
||
print(
|
||
"ℹ️ Sending a request to https://www.example.com ...",
|
||
flush=True,
|
||
)
|
||
|
||
try:
|
||
req = get("https://www.example.com", headers={"Host": "www.example.com"}, verify=False)
|
||
req.raise_for_status()
|
||
except RequestException as e:
|
||
print(
|
||
f"❌ The request failed even though let's Encrypt is activated:\n{e}\n exiting ...",
|
||
flush=True,
|
||
)
|
||
exit(1)
|
||
|
||
sleep(1)
|
||
|
||
context = create_default_context()
|
||
context.check_hostname = False
|
||
context.verify_mode = CERT_NONE
|
||
with create_connection(("www.example.com", 443)) as sock:
|
||
with context.wrap_socket(sock, server_hostname="www.example.com") as ssock:
|
||
# Retrieve the SSL certificate
|
||
pem_data = DER_cert_to_PEM_cert(ssock.getpeercert(True))
|
||
|
||
# Parse the PEM certificate
|
||
certificate = x509.load_pem_x509_certificate(pem_data.encode(), default_backend())
|
||
|
||
common_name = certificate.subject.get_attributes_for_oid(x509.oid.NameOID.COMMON_NAME)[0].value
|
||
if common_name != "www.example.org":
|
||
print(
|
||
f"❌ Let's Encrypt is activated and the Common Name (CN) is not www.example.org (fallback one) but {common_name}, exiting ...",
|
||
flush=True,
|
||
)
|
||
exit(1)
|
||
|
||
print("✅ Let's Encrypt is activated and the Common Name (CN) is the expected one (fallback), as expected ...", flush=True)
|
||
except SystemExit as e:
|
||
exit(e.code)
|
||
except:
|
||
print(f"❌ Something went wrong, exiting ...\n{format_exc()}", flush=True)
|
||
exit(1)
|