From 863171f66b31ffee8630466b0e91cabb53db78ab Mon Sep 17 00:00:00 2001 From: Andreas Schulte <0x0001f346@pm.me> Date: Wed, 3 Sep 2025 21:09:42 +0200 Subject: [PATCH] refactor: unify error handling --- app/app.go | 16 +++++++--------- config/certs.go | 10 +++++----- config/config.go | 13 ++++++------- config/filesystem.go | 2 +- filesystem/filesystem.go | 30 +++++++++++++++--------------- main.go | 23 ++++++++++++++++++++--- 6 files changed, 54 insertions(+), 40 deletions(-) diff --git a/app/app.go b/app/app.go index 1e924df..e146eb1 100644 --- a/app/app.go +++ b/app/app.go @@ -7,7 +7,6 @@ import ( "io" "log" "net/http" - "os" "git.0x0001f346.de/andreas/ablage/config" "github.com/julienschmidt/httprouter" @@ -25,7 +24,7 @@ var assetScriptJS []byte //go:embed assets/style.css var assetStyleCSS []byte -func Init() { +func Init() error { router := httprouter.New() router.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -57,16 +56,14 @@ func Init() { config.PrintStartupBanner() err := http.ListenAndServe(fmt.Sprintf(":%d", config.GetPortToListenOn()), handler) if err != nil { - fmt.Fprintf(os.Stderr, "Ablage exited with error:\n%v\n", err) - os.Exit(1) + return fmt.Errorf("Webserver exited with error: %v", err) } - return + return nil } tlsCert, err := tls.X509KeyPair(config.GetTLSCertificate(), config.GetTLSKey()) if err != nil { - fmt.Fprintf(os.Stderr, "Faild to parse PEM encoded public/private key pair:\n%v\n", err) - os.Exit(1) + return fmt.Errorf("Faild to parse PEM encoded public/private key pair: %v", err) } server := &http.Server{ @@ -83,9 +80,10 @@ func Init() { err = server.ListenAndServeTLS("", "") if err != nil { - fmt.Fprintf(os.Stderr, "Ablage exited with error:\n%v\n", err) - os.Exit(1) + return fmt.Errorf("Webserver exited with error: %v", err) } + + return nil } func getClientIP(r *http.Request) string { diff --git a/config/certs.go b/config/certs.go index 1fedc06..f047c6b 100644 --- a/config/certs.go +++ b/config/certs.go @@ -50,13 +50,13 @@ func generateSelfSignedTLSCertificate() error { derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey) if err != nil { - return err + return fmt.Errorf("Failed to create new x509 certificate: %v", err) } cert := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) key, err := x509.MarshalECPrivateKey(privateKey) if err != nil { - return err + return fmt.Errorf("Failed to marshal EC private key: %v", err) } keyPEM := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: key}) @@ -77,17 +77,17 @@ func loadOrGenerateTLSCertificate() error { _, err := tls.LoadX509KeyPair(pathTLSCertFile, pathTLSKeyFile) if err != nil { - return fmt.Errorf("Error: Failed to load TLS certificate or key: %w", err) + return fmt.Errorf("Failed to load TLS certificate or key: %w", err) } certData, err := os.ReadFile(pathTLSCertFile) if err != nil { - return fmt.Errorf("Error: Failed to read TLS certificate file: %w", err) + return fmt.Errorf("Failed to read TLS certificate file: %w", err) } keyData, err := os.ReadFile(pathTLSKeyFile) if err != nil { - return fmt.Errorf("Error: Failed to read TLS key file: %w", err) + return fmt.Errorf("Failed to read TLS key file: %w", err) } selfSignedTLSCertificate = certData diff --git a/config/config.go b/config/config.go index f6b38a7..06e7c23 100644 --- a/config/config.go +++ b/config/config.go @@ -2,7 +2,6 @@ package config import ( "fmt" - "os" ) const DefaultBasicAuthUsername string = "ablage" @@ -14,22 +13,22 @@ const VersionString string = "1.1" var randomBasicAuthPassword string = generateRandomPassword() -func Init() { +func Init() error { err := gatherDefaultPaths() if err != nil { - panic(err) + return err } parseFlags() if GetReadonlyMode() && GetSinkholeMode() { - fmt.Println("Error: Cannot enable both readonly and sinkhole modes at the same time.") - os.Exit(1) + return fmt.Errorf("Cannot enable both readonly and sinkhole modes at the same time.") } err = loadOrGenerateTLSCertificate() if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) + return err } + + return nil } diff --git a/config/filesystem.go b/config/filesystem.go index 20c60af..4f64cff 100644 --- a/config/filesystem.go +++ b/config/filesystem.go @@ -12,7 +12,7 @@ var defaultPathUploadFolder string = "" func gatherDefaultPaths() error { execPath, err := os.Executable() if err != nil { - return fmt.Errorf("[Error] Could not determine binary path: %v", err) + return fmt.Errorf("Could not determine binary path: %v", err) } defaultPathDataFolder = filepath.Join(filepath.Dir(execPath), DefaultNameDataFolder) diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 4dee12c..51838c6 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -10,18 +10,18 @@ import ( "git.0x0001f346.de/andreas/ablage/config" ) -func Init() { +func Init() error { err := prepareDataFolder() if err != nil { - fmt.Println("err") - os.Exit(1) + return err } err = prepareUploadDir() if err != nil { - fmt.Println("err") - os.Exit(1) + return err } + + return nil } func GetHumanReadableSize(bytes int64) string { @@ -81,23 +81,23 @@ func prepareDataFolder() error { info, err := os.Stat(config.GetPathDataFolder()) if os.IsNotExist(err) { if err := os.Mkdir(config.GetPathDataFolder(), 0755); err != nil { - return fmt.Errorf("Error: Could not create folder '%s': %v", config.GetPathDataFolder(), err) + return fmt.Errorf("Could not create folder '%s': %v", config.GetPathDataFolder(), err) } } else if err != nil { - return fmt.Errorf("Error: Could not access '%s': %v", config.GetPathDataFolder(), err) + return fmt.Errorf("Could not access '%s': %v", config.GetPathDataFolder(), err) } else if !info.IsDir() { - return fmt.Errorf("Error: '%s' exists but is not a directory", config.GetPathDataFolder()) + return fmt.Errorf("'%s' exists but is not a directory", config.GetPathDataFolder()) } pathTestFile := filepath.Join(config.GetPathDataFolder(), ".write_test") err = os.WriteFile(pathTestFile, []byte("test"), 0644) if err != nil { - return fmt.Errorf("Error: Could not create test file '%s': %v", pathTestFile, err) + return fmt.Errorf("Could not create test file '%s': %v", pathTestFile, err) } err = os.Remove(pathTestFile) if err != nil { - return fmt.Errorf("Error: Could not delete test file '%s': %v", pathTestFile, err) + return fmt.Errorf("Could not delete test file '%s': %v", pathTestFile, err) } return nil @@ -112,25 +112,25 @@ func prepareUploadDir() error { err = os.RemoveAll(config.GetPathUploadFolder()) if err != nil { - return fmt.Errorf("Error: Could not delete upload folder '%s': %v", config.GetPathUploadFolder(), err) + return fmt.Errorf("Could not delete upload folder '%s': %v", config.GetPathUploadFolder(), err) } } else if !os.IsNotExist(err) { - return fmt.Errorf("Error: '%s' exists but is somewhat broken", config.GetPathUploadFolder()) + return fmt.Errorf("'%s' exists but is somewhat broken", config.GetPathUploadFolder()) } if err := os.MkdirAll(config.GetPathUploadFolder(), 0755); err != nil { - return fmt.Errorf("Error: Could not create upload folder '%s': %v", config.GetPathUploadFolder(), err) + return fmt.Errorf("Could not create upload folder '%s': %v", config.GetPathUploadFolder(), err) } pathTestFile := filepath.Join(config.GetPathUploadFolder(), ".write_test") err = os.WriteFile(pathTestFile, []byte("test"), 0644) if err != nil { - return fmt.Errorf("Error: Could not create test file '%s': %v", pathTestFile, err) + return fmt.Errorf("Could not create test file '%s': %v", pathTestFile, err) } err = os.Remove(pathTestFile) if err != nil { - return fmt.Errorf("Error: Could not delete test file '%s': %v", pathTestFile, err) + return fmt.Errorf("Could not delete test file '%s': %v", pathTestFile, err) } return nil diff --git a/main.go b/main.go index 4e9967d..d89c016 100644 --- a/main.go +++ b/main.go @@ -1,13 +1,30 @@ package main import ( + "fmt" + "os" + "git.0x0001f346.de/andreas/ablage/app" "git.0x0001f346.de/andreas/ablage/config" "git.0x0001f346.de/andreas/ablage/filesystem" ) func main() { - config.Init() - filesystem.Init() - app.Init() + err := config.Init() + if err != nil { + fmt.Fprintf(os.Stderr, "[Error] %v\n", err) + os.Exit(1) + } + + err = filesystem.Init() + if err != nil { + fmt.Fprintf(os.Stderr, "[Error] %v\n", err) + os.Exit(1) + } + + err = app.Init() + if err != nil { + fmt.Fprintf(os.Stderr, "[Error] %v\n", err) + os.Exit(1) + } }