refactor: unify error handling

This commit is contained in:
2025-09-03 21:09:42 +02:00
parent 6db6127522
commit 863171f66b
6 changed files with 54 additions and 40 deletions

View File

@@ -7,7 +7,6 @@ import (
"io" "io"
"log" "log"
"net/http" "net/http"
"os"
"git.0x0001f346.de/andreas/ablage/config" "git.0x0001f346.de/andreas/ablage/config"
"github.com/julienschmidt/httprouter" "github.com/julienschmidt/httprouter"
@@ -25,7 +24,7 @@ var assetScriptJS []byte
//go:embed assets/style.css //go:embed assets/style.css
var assetStyleCSS []byte var assetStyleCSS []byte
func Init() { func Init() error {
router := httprouter.New() router := httprouter.New()
router.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { router.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -57,16 +56,14 @@ func Init() {
config.PrintStartupBanner() config.PrintStartupBanner()
err := http.ListenAndServe(fmt.Sprintf(":%d", config.GetPortToListenOn()), handler) err := http.ListenAndServe(fmt.Sprintf(":%d", config.GetPortToListenOn()), handler)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Ablage exited with error:\n%v\n", err) return fmt.Errorf("Webserver exited with error: %v", err)
os.Exit(1)
} }
return return nil
} }
tlsCert, err := tls.X509KeyPair(config.GetTLSCertificate(), config.GetTLSKey()) tlsCert, err := tls.X509KeyPair(config.GetTLSCertificate(), config.GetTLSKey())
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Faild to parse PEM encoded public/private key pair:\n%v\n", err) return fmt.Errorf("Faild to parse PEM encoded public/private key pair: %v", err)
os.Exit(1)
} }
server := &http.Server{ server := &http.Server{
@@ -83,9 +80,10 @@ func Init() {
err = server.ListenAndServeTLS("", "") err = server.ListenAndServeTLS("", "")
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Ablage exited with error:\n%v\n", err) return fmt.Errorf("Webserver exited with error: %v", err)
os.Exit(1)
} }
return nil
} }
func getClientIP(r *http.Request) string { func getClientIP(r *http.Request) string {

View File

@@ -50,13 +50,13 @@ func generateSelfSignedTLSCertificate() error {
derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey) derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey)
if err != nil { 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}) cert := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
key, err := x509.MarshalECPrivateKey(privateKey) key, err := x509.MarshalECPrivateKey(privateKey)
if err != nil { 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}) keyPEM := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: key})
@@ -77,17 +77,17 @@ func loadOrGenerateTLSCertificate() error {
_, err := tls.LoadX509KeyPair(pathTLSCertFile, pathTLSKeyFile) _, err := tls.LoadX509KeyPair(pathTLSCertFile, pathTLSKeyFile)
if err != nil { 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) certData, err := os.ReadFile(pathTLSCertFile)
if err != nil { 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) keyData, err := os.ReadFile(pathTLSKeyFile)
if err != nil { 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 selfSignedTLSCertificate = certData

View File

@@ -2,7 +2,6 @@ package config
import ( import (
"fmt" "fmt"
"os"
) )
const DefaultBasicAuthUsername string = "ablage" const DefaultBasicAuthUsername string = "ablage"
@@ -14,22 +13,22 @@ const VersionString string = "1.1"
var randomBasicAuthPassword string = generateRandomPassword() var randomBasicAuthPassword string = generateRandomPassword()
func Init() { func Init() error {
err := gatherDefaultPaths() err := gatherDefaultPaths()
if err != nil { if err != nil {
panic(err) return err
} }
parseFlags() parseFlags()
if GetReadonlyMode() && GetSinkholeMode() { if GetReadonlyMode() && GetSinkholeMode() {
fmt.Println("Error: Cannot enable both readonly and sinkhole modes at the same time.") return fmt.Errorf("Cannot enable both readonly and sinkhole modes at the same time.")
os.Exit(1)
} }
err = loadOrGenerateTLSCertificate() err = loadOrGenerateTLSCertificate()
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err) return err
os.Exit(1)
} }
return nil
} }

View File

@@ -12,7 +12,7 @@ var defaultPathUploadFolder string = ""
func gatherDefaultPaths() error { func gatherDefaultPaths() error {
execPath, err := os.Executable() execPath, err := os.Executable()
if err != nil { 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) defaultPathDataFolder = filepath.Join(filepath.Dir(execPath), DefaultNameDataFolder)

View File

@@ -10,18 +10,18 @@ import (
"git.0x0001f346.de/andreas/ablage/config" "git.0x0001f346.de/andreas/ablage/config"
) )
func Init() { func Init() error {
err := prepareDataFolder() err := prepareDataFolder()
if err != nil { if err != nil {
fmt.Println("err") return err
os.Exit(1)
} }
err = prepareUploadDir() err = prepareUploadDir()
if err != nil { if err != nil {
fmt.Println("err") return err
os.Exit(1)
} }
return nil
} }
func GetHumanReadableSize(bytes int64) string { func GetHumanReadableSize(bytes int64) string {
@@ -81,23 +81,23 @@ func prepareDataFolder() error {
info, err := os.Stat(config.GetPathDataFolder()) info, err := os.Stat(config.GetPathDataFolder())
if os.IsNotExist(err) { if os.IsNotExist(err) {
if err := os.Mkdir(config.GetPathDataFolder(), 0755); err != nil { 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 { } 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() { } 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") pathTestFile := filepath.Join(config.GetPathDataFolder(), ".write_test")
err = os.WriteFile(pathTestFile, []byte("test"), 0644) err = os.WriteFile(pathTestFile, []byte("test"), 0644)
if err != nil { 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) err = os.Remove(pathTestFile)
if err != nil { 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 return nil
@@ -112,25 +112,25 @@ func prepareUploadDir() error {
err = os.RemoveAll(config.GetPathUploadFolder()) err = os.RemoveAll(config.GetPathUploadFolder())
if err != nil { 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) { } 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 { 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") pathTestFile := filepath.Join(config.GetPathUploadFolder(), ".write_test")
err = os.WriteFile(pathTestFile, []byte("test"), 0644) err = os.WriteFile(pathTestFile, []byte("test"), 0644)
if err != nil { 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) err = os.Remove(pathTestFile)
if err != nil { 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 return nil

23
main.go
View File

@@ -1,13 +1,30 @@
package main package main
import ( import (
"fmt"
"os"
"git.0x0001f346.de/andreas/ablage/app" "git.0x0001f346.de/andreas/ablage/app"
"git.0x0001f346.de/andreas/ablage/config" "git.0x0001f346.de/andreas/ablage/config"
"git.0x0001f346.de/andreas/ablage/filesystem" "git.0x0001f346.de/andreas/ablage/filesystem"
) )
func main() { func main() {
config.Init() err := config.Init()
filesystem.Init() if err != nil {
app.Init() 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)
}
} }