refactor: unify error handling
This commit is contained in:
16
app/app.go
16
app/app.go
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
23
main.go
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user