diff --git a/bumper/__init__.py b/bumper/__init__.py index 98c410a..8ddbf4f 100644 --- a/bumper/__init__.py +++ b/bumper/__init__.py @@ -26,19 +26,20 @@ def strtobool(strbool): bumper_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) # Set defaults from environment variables first # Certs -ca_cert = os.environ.get("BUMPER_CA") or os.path.join(bumper_dir, "certs/ca.crt") +ca_cert = os.environ.get("BUMPER_CA") or os.path.join(bumper_dir, "certs", "ca.crt") server_cert = os.environ.get("BUMPER_CERT") or os.path.join( - bumper_dir, "certs/bumper.crt" + bumper_dir, "certs", "bumper.crt" ) server_key = os.environ.get("BUMPER_KEY") or os.path.join( - bumper_dir, "certs/bumper.key" + bumper_dir, "certs", "bumper.key" ) if not ( - os.path.exists(ca_cert) or os.path.exists(server_cert) or os.path.exists(server_key) + os.path.exists(ca_cert) + and os.path.exists(server_cert) + and os.path.exists(server_key) ): logging.log(logging.FATAL, "Certificate(s) don't exist at paths specified") - os._exit(1) # Folders logs_dir = os.environ.get("BUMPER_LOGS") or os.path.join(bumper_dir, "logs") @@ -141,6 +142,14 @@ async def start(): format="[%(asctime)s] :: %(levelname)s :: %(name)s :: %(message)s", ) + if not ( + os.path.exists(ca_cert) + and os.path.exists(server_cert) + and os.path.exists(server_key) + ): + logging.log(logging.FATAL, "Certificate(s) don't exist at paths specified") + os._exit(1) + bumperlog.info("Starting Bumper") global mqtt_server mqtt_server = MQTTServer((bumper_listen, 8883)) diff --git a/create_certs/create_certs_linux b/create_certs/create_certs_linux index 4c9c212..e809faa 100755 Binary files a/create_certs/create_certs_linux and b/create_certs/create_certs_linux differ diff --git a/create_certs/create_certs_osx b/create_certs/create_certs_osx index 740b3cd..c985f63 100755 Binary files a/create_certs/create_certs_osx and b/create_certs/create_certs_osx differ diff --git a/create_certs/create_certs_rpi b/create_certs/create_certs_rpi index 2a67fe1..c678ef0 100755 Binary files a/create_certs/create_certs_rpi and b/create_certs/create_certs_rpi differ diff --git a/create_certs/create_certs_windows.exe b/create_certs/create_certs_windows.exe index 0b758d4..18bfa69 100755 Binary files a/create_certs/create_certs_windows.exe and b/create_certs/create_certs_windows.exe differ diff --git a/create_certs/src/create_certs.go b/create_certs/src/create_certs.go index d8e6341..5eaa1a8 100644 --- a/create_certs/src/create_certs.go +++ b/create_certs/src/create_certs.go @@ -52,12 +52,18 @@ func make_CA() { // Public key certOut, err := os.Create("ca.crt") + if err != nil { + log.Fatal("create ca.crt failed", err) + } pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: ca_b}) certOut.Close() log.Print("ca.crt created\n") // Private key keyOut, err := os.OpenFile("ca.key", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + log.Fatal("create ca.key failed", err) + } pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}) keyOut.Close() log.Print("ca.key created\n") @@ -68,11 +74,12 @@ func signCert() { // Load CA catls, err := tls.LoadX509KeyPair("ca.crt", "ca.key") if err != nil { - panic(err) + log.Fatal("error loading ca cert", err) } + ca, err := x509.ParseCertificate(catls.Certificate[0]) if err != nil { - panic(err) + log.Fatal("error parsing ca cert", err) } hostname, _ := os.Hostname() @@ -131,19 +138,25 @@ func signCert() { } // Sign the certificate - cert_b, err := x509.CreateCertificate(rand.Reader, &template, ca, pubKey, catls.PrivateKey) + cert_b, err := x509.CreateCertificate(rand.Reader, &template, ca, pubKey, catls.PrivateKey) // Public key certOut, err := os.Create("bumper.crt") + if err != nil { + log.Fatal("create bumper.crt failed", err) + } pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: cert_b}) certOut.Close() log.Print("bumper.crt created\n") // Private key keyOut, err := os.OpenFile("bumper.key", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + log.Fatal("create bumper.key failed", err) + } pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)}) keyOut.Close() - log.Print("bumper.key create\n") + log.Print("bumper.key created\n") } func bigIntHash(n *big.Int) []byte { diff --git a/start_bumper.py b/start_bumper.py index 8a6c019..d7dca21 100644 --- a/start_bumper.py +++ b/start_bumper.py @@ -3,13 +3,71 @@ import bumper import argparse import asyncio +import platform +import os +import subprocess +import sys -if __name__ == "__main__": + +def first_run(): + yes = {"yes", "y", "ye", ""} + print("") + create_cert = input( + "No certificates found, would you like to create them automatically? (y/n): " + ).lower() + if create_cert in yes: + print("Creating certificates") + odir = os.path.dirname(os.path.realpath(__file__)) + os.chdir("certs") + if platform.system().lower() == "windows": + # run for win + subprocess.run( + [os.path.join("..", "create_certs", "create_certs_windows.exe")] + ) + elif platform.system().lower() == "darwin": + # run on mac + subprocess.run([os.path.join("..", "create_certs", "create_certs_osx")]) + elif platform.system().lower() == "linux": + if "arm" in platform.machine().lower(): + # run for pi + subprocess.run([os.path.join("..", "create_certs", "create_certs_rpi")]) + else: + # run for linux + subprocess.run( + [os.path.join("..", "create_certs", "create_certs_linux")] + ) + else: + print("Can't determine platform. Create certs manually and try again.") + exit(1) + + print("Certificates created") + os.chdir(odir) + os.execv(sys.executable, ["python"] + sys.argv) # Start again + + else: + print("Can't continue without certificates, please create some then try again.") + exit(1) + + +def main(): try: + + if not ( + os.path.exists(bumper.ca_cert) + and os.path.exists(bumper.server_cert) + and os.path.exists(bumper.server_key) + ): + first_run() + parser = argparse.ArgumentParser() - parser.add_argument("--listen", type=str, default=None, help="start serving on address") parser.add_argument( - "--announce", type=str, default=None, help="announce address to bots on checkin" + "--listen", type=str, default=None, help="start serving on address" + ) + parser.add_argument( + "--announce", + type=str, + default=None, + help="announce address to bots on checkin", ) parser.add_argument("--debug", action="store_true", help="enable debug logs") args = parser.parse_args() @@ -30,8 +88,13 @@ if __name__ == "__main__": pass except Exception as e: - bumper.bumperlog.Exception(e) + bumper.bumperlog.exception(e) pass finally: asyncio.run(bumper.shutdown()) + + +if __name__ == "__main__": + main() +