diff --git a/cmd/stfs/cmd/root.go b/cmd/stfs/cmd/root.go index ec3047c..9f7e32d 100644 --- a/cmd/stfs/cmd/root.go +++ b/cmd/stfs/cmd/root.go @@ -55,11 +55,11 @@ https://github.com/pojntfx/stfs`, }, } -func Execute() { +func Execute() error { // Get default working dir home, err := os.UserHomeDir() if err != nil { - panic(err) + return err } metadataPath := filepath.Join(home, ".local", "share", "stfs", "var", "lib", "stfs", "metadata.sqlite") @@ -71,12 +71,10 @@ func Execute() { rootCmd.PersistentFlags().StringP(signatureFlag, "s", config.NoneKey, fmt.Sprintf("Signature format to use (default %v, available are %v)", config.NoneKey, config.KnownSignatureFormats)) if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil { - panic(err) + return err } viper.AutomaticEnv() - if err := rootCmd.Execute(); err != nil { - panic(err) - } + return rootCmd.Execute() } diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index c9637e7..ceecba7 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -236,7 +236,7 @@ var serveFTPCmd = &cobra.Command{ ) if viper.GetBool(verboseFlag) { - srv.Logger = &logging.JSONLogger{} + srv.Logger = jsonLogger } jsonLogger.Info("FTP server listening", map[string]interface{}{ diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index 68e1332..b6283d1 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -158,6 +158,7 @@ var serveHTTPCmd = &cobra.Command{ http.FileServer( afero.NewHttpFs(fs), ), + jsonLogger, ), ) }, diff --git a/cmd/stfs/main.go b/cmd/stfs/main.go index d246164..f8a6e80 100644 --- a/cmd/stfs/main.go +++ b/cmd/stfs/main.go @@ -3,5 +3,7 @@ package main import "github.com/pojntfx/stfs/cmd/stfs/cmd" func main() { - cmd.Execute() + if err := cmd.Execute(); err != nil { + panic(err) + } } diff --git a/internal/fs/file.go b/internal/fs/file.go index e3e8635..b57c889 100644 --- a/internal/fs/file.go +++ b/internal/fs/file.go @@ -136,13 +136,14 @@ func (f *File) syncWithoutLocking() error { return config.FileConfig{}, err } - f.info = &FileInfo{ - name: f.info.Name(), - size: size, - mode: f.info.Mode(), - modTime: f.info.ModTime(), - isDir: f.info.IsDir(), - } + f.info = NewFileInfo( + f.info.Name(), + size, + f.info.Mode(), + f.info.ModTime(), + f.info.IsDir(), + f.log, + ) return config.FileConfig{ GetFile: func() (io.ReadSeekCloser, error) { @@ -392,7 +393,7 @@ func (f *File) Readdir(count int) ([]os.FileInfo, error) { fileInfos := []os.FileInfo{} for _, hdr := range hdrs { - fileInfos = append(fileInfos, NewFileInfo(hdr, f.log)) + fileInfos = append(fileInfos, NewFileInfoFromTarHeader(hdr, f.log)) } return fileInfos, nil diff --git a/internal/fs/fileinfo.go b/internal/fs/fileinfo.go index 1e0ad21..110b349 100644 --- a/internal/fs/fileinfo.go +++ b/internal/fs/fileinfo.go @@ -22,6 +22,26 @@ type FileInfo struct { } func NewFileInfo( + name string, + size int64, + mode fs.FileMode, + modTime time.Time, + isDir bool, + + log *logging.JSONLogger, +) *FileInfo { + return &FileInfo{ + name: name, + size: size, + mode: mode, + modTime: modTime, + isDir: isDir, + + log: log, + } +} + +func NewFileInfoFromTarHeader( hdr *tar.Header, log *logging.JSONLogger, diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index 5734bf3..b405d78 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -285,7 +285,7 @@ func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.Fi f.getFileBuffer, path.Base(hdr.Name), - NewFileInfo(hdr, f.log), + NewFileInfoFromTarHeader(hdr, f.log), f.onHeader, f.log, @@ -334,10 +334,10 @@ func (f *FileSystem) Stat(name string) (os.FileInfo, error) { return nil, os.ErrNotExist } - panic(err) + return nil, err } - return NewFileInfo(hdr, f.log), nil + return NewFileInfoFromTarHeader(hdr, f.log), nil } func (f *FileSystem) updateMetadata(hdr *tar.Header) error { @@ -384,7 +384,7 @@ func (f *FileSystem) Chmod(name string, mode os.FileMode) error { return os.ErrNotExist } - panic(err) + return err } hdr.Mode = int64(mode) @@ -411,7 +411,7 @@ func (f *FileSystem) Chown(name string, uid, gid int) error { return os.ErrNotExist } - panic(err) + return err } hdr.Uid = uid @@ -439,7 +439,7 @@ func (f *FileSystem) Chtimes(name string, atime time.Time, mtime time.Time) erro return os.ErrNotExist } - panic(err) + return err } hdr.AccessTime = atime @@ -453,7 +453,7 @@ func (f *FileSystem) LstatIfPossible(name string) (os.FileInfo, bool, error) { "name": name, }) - panic(ErrNotImplemented) + return nil, false, ErrNotImplemented } func (f *FileSystem) SymlinkIfPossible(oldname, newname string) error { @@ -462,7 +462,7 @@ func (f *FileSystem) SymlinkIfPossible(oldname, newname string) error { "newname": newname, }) - panic(ErrNotImplemented) + return ErrNotImplemented } func (f *FileSystem) ReadlinkIfPossible(name string) (string, error) { @@ -470,5 +470,5 @@ func (f *FileSystem) ReadlinkIfPossible(name string) (string, error) { "name": name, }) - panic(ErrNotImplemented) + return "", ErrNotImplemented } diff --git a/internal/handlers/panic.go b/internal/handlers/panic.go index eedd204..0d6ef53 100644 --- a/internal/handlers/panic.go +++ b/internal/handlers/panic.go @@ -2,18 +2,20 @@ package handlers import ( "fmt" - "log" "net/http" - "runtime/debug" + + "github.com/pojntfx/stfs/internal/logging" ) -func PanicHandler(h http.Handler) http.Handler { +func PanicHandler(h http.Handler, log *logging.JSONLogger) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { - if r := recover(); r != nil { - http.Error(w, fmt.Sprintf("%v", r), http.StatusInternalServerError) + if err := recover(); err != nil { + http.Error(w, fmt.Sprintf("%v", err), http.StatusInternalServerError) - log.Println("Error:", r, "\nStack:", string(debug.Stack())) + log.Error("Error during HTTP request", map[string]interface{}{ + "err": err, + }) } }()