From 59de45dd2277f07bb1a8887b77850cf895862665 Mon Sep 17 00:00:00 2001 From: velvettear Date: Wed, 3 Aug 2022 12:23:39 +0200 Subject: [PATCH] complete overhaul of the whole project structure including optimizations and bug fixes --- main.go | 159 +----------------- resources/gopher.png | Bin 59559 -> 0 bytes resources/heart.png | Bin 713 -> 0 bytes {config => src/config}/config.go | 14 +- {log => src/log}/log.go | 2 +- {util => src/util}/date/date.go | 23 ++- {util => src/util}/environment/environment.go | 0 src/util/scans/scans.go | 114 +++++++++++++ src/web/contentTypes.go | 157 +++++++++++++++++ src/web/requestParameters.go | 15 ++ src/web/server.go | 77 +++++++++ {resources => static/css}/styles.css | 0 {resources => static/fonts}/firacode.ttf | Bin {resources => static/html}/index.html | 10 +- static/img/favicon.ico | Bin 0 -> 24607 bytes {resources => static/img}/hearts-fill.svg | 0 {resources => static/img}/icon.png | Bin {resources => static/js}/main.js | 0 18 files changed, 394 insertions(+), 177 deletions(-) delete mode 100644 resources/gopher.png delete mode 100644 resources/heart.png rename {config => src/config}/config.go (78%) rename {log => src/log}/log.go (97%) rename {util => src/util}/date/date.go (69%) rename {util => src/util}/environment/environment.go (100%) create mode 100644 src/util/scans/scans.go create mode 100644 src/web/contentTypes.go create mode 100644 src/web/requestParameters.go create mode 100644 src/web/server.go rename {resources => static/css}/styles.css (100%) rename {resources => static/fonts}/firacode.ttf (100%) rename {resources => static/html}/index.html (67%) create mode 100644 static/img/favicon.ico rename {resources => static/img}/hearts-fill.svg (100%) rename {resources => static/img}/icon.png (100%) rename {resources => static/js}/main.js (100%) diff --git a/main.go b/main.go index 9af1eff..780a362 100644 --- a/main.go +++ b/main.go @@ -2,162 +2,19 @@ package main import ( "embed" - _ "embed" - "encoding/json" - "fmt" - "net/http" - "os" - "os/exec" - "strconv" - "strings" - "time" - "velvettear/go-scan/config" - "velvettear/go-scan/log" - "velvettear/go-scan/util/date" + "velvettear/go-scan/src/config" + "velvettear/go-scan/src/util/scans" + "velvettear/go-scan/src/web" ) -//go:embed resources -var resources embed.FS +//go:embed static +var files embed.FS var configuration config.Config func main() { configuration = config.New() - startServer() -} - -func startServer() { - serverAddress := configuration.ServerConfig.Address + ":" + configuration.ServerConfig.Port - http.HandleFunc("/favicon.ico", serveResources) - http.HandleFunc("/resources/", serveResources) - http.HandleFunc("/", handleHTTPRequests) - log.Info("starting server '" + serverAddress + "'...") - error := http.ListenAndServe(serverAddress, nil) - if error != nil { - log.Fatal("an error occured starting the server", error.Error()) - } -} - -func serveResources(writer http.ResponseWriter, request *http.Request) { - var resource string - if strings.HasSuffix(request.URL.Path, "favicon.ico") { - resource = "resources/gopher.png" - } else { - resource = strings.TrimPrefix(request.URL.Path, "/") - } - bytes, error := resources.ReadFile(resource) - if error != nil { - log.Error("an error occured serving the resource '"+resource+"'", error.Error()) - return - } - log.Debug("serving '" + resource + "'...") - if strings.HasSuffix(resource, "svg") { - writer.Header().Set("Content-Type", "image/svg+xml") - } - writer.Write(bytes) -} - -func handleHTTPRequests(writer http.ResponseWriter, request *http.Request) { - if strings.ToLower(request.Method) == "post" { - result := handleScan(request) - writer.Header().Set("Content-Type", "application/json") - json, _ := json.Marshal(result) - writer.Write(json) - return - } - resource := "resources/index.html" - bytes, error := resources.ReadFile(resource) - if error != nil { - log.Error("an error occured serving the resource '"+resource+"'", error.Error()) - return - } - log.Debug("serving '" + resource + "'...") - writer.Write(bytes) -} - -func handleScan(request *http.Request) *result { - log.Info("starting scan...") - timestamp := date.Milliseconds() - - var parameters requestParameters - parseErr := json.NewDecoder(request.Body).Decode(¶meters) - if parseErr != nil { - log.Error("error parsing request parameters", parseErr.Error()) - } - scanName := generateScanName(parameters.Filename) - args := []string{} - if len(configuration.ScannerConfig.Scanner) > 0 { - args = append(args, "-d") - args = append(args, configuration.ScannerConfig.Scanner) - } - args = append(args, "-o") - args = append(args, scanName) - extraArgs := strings.Split(configuration.ScannerConfig.Arguments, " ") - for index := 0; index < len(extraArgs); index++ { - args = append(args, extraArgs[index]) - } - log.Debug("executing command 'scanimage'...", args...) - scanCmd := exec.Command( - "scanimage", - args..., - ) - _, err := scanCmd.Output() - if err != nil { - log.Error("an error occured executing the scan", err.Error()) - result := &result{ - State: "error", - Message: err.Error(), - } - return result - } - result := &result{ - State: "ok", - Message: scanName, - } - log.Info("finished scan after "+strconv.Itoa(date.GetTimeDifference(timestamp))+"ms", scanName) - return result -} - -func generateScanName(filename string) string { - if len(filename) == 0 { - day := fmt.Sprint(time.Now().Day()) - if len(day) < 2 { - day = "0" + day - } - month := fmt.Sprint(int(time.Now().Month())) - if len(month) < 2 { - month = "0" + month - } - hour := fmt.Sprint(time.Now().Hour()) - if len(hour) < 2 { - hour = "0" + hour - } - minute := fmt.Sprint(time.Now().Minute()) - if len(minute) < 2 { - minute = "0" + minute - } - second := fmt.Sprint(time.Now().Second()) - if len(second) < 2 { - second = "0" + second - } - filename = day + month + fmt.Sprint(time.Now().Year()) + "-" + hour + minute + second - } - if !strings.HasSuffix(filename, ".png") { - filename += ".png" - } - error := os.MkdirAll(configuration.ScannerConfig.OutputDirectory, 0755) - if error != nil { - log.Fatal("an error occurred creating the output directory", error.Error()) - } - return configuration.ScannerConfig.OutputDirectory + filename -} - -// structs -type result struct { - State string - Message string -} - -type requestParameters struct { - Filename string + scans.SetScannerConfig(configuration.ScannerConfig) + server := web.Server(configuration.ServerConfig.Address, configuration.ServerConfig.Port, files) + server.Run() } diff --git a/resources/gopher.png b/resources/gopher.png deleted file mode 100644 index 8f29b63487db32e400c2bdb10537d3bd3103ec31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59559 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 L4dpULi{SqO3x48l diff --git a/resources/heart.png b/resources/heart.png deleted file mode 100644 index 9b7f1403f80ec3a2fa58eb989407797d2368363a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmV;)0yh1LP)E2DuYnEVX>wbU z%mO!nHQ*9(8aS5R_q+dD;{RBbxC1;$B%_qG4?IFj%F8L>A+R^0e?6~125u!!mR3AI zUxB;8bO!$va2xny;a>t?dzO z`VRwJ4&^$}fkOfMx#vNyb2BvmS>T(;1?(Xow4wM}_bAu7ABumDeBbq1XBXLBn)+j8 zdpU!DW`S!+31`x^{eB0UM5-p zN*gyP!l6u;e;>*Ma&+wSWY%i>$kAIWmMd05A2^pbeAP 0 { + args = append(args, "-d") + args = append(args, scannerConfig.Scanner) + } + args = append(args, "-o") + args = append(args, scan.ScanName) + extraArgs := strings.Split(scannerConfig.Arguments, " ") + for index := 0; index < len(extraArgs); index++ { + args = append(args, extraArgs[index]) + } + log.Debug("executing command 'scanimage'...", args...) + scanCmd := exec.Command( + "scanimage", + args..., + ) + _, err := scanCmd.Output() + if err != nil { + log.Error("an error occured executing the scan", err.Error()) + result := &result{ + State: "error", + Message: err.Error(), + } + return result + } + result := &result{ + State: "ok", + Message: scan.ScanName, + } + log.Info("finished scan after "+strconv.Itoa(date.GetTimeDifference(timestamp))+"ms", scan.ScanName) + return result +} + +// unexported functions +func (scan scan) generateScanName() string { + if len(scan.FileName) == 0 { + day := fmt.Sprint(time.Now().Day()) + if len(day) < 2 { + day = "0" + day + } + month := fmt.Sprint(int(time.Now().Month())) + if len(month) < 2 { + month = "0" + month + } + hour := fmt.Sprint(time.Now().Hour()) + if len(hour) < 2 { + hour = "0" + hour + } + minute := fmt.Sprint(time.Now().Minute()) + if len(minute) < 2 { + minute = "0" + minute + } + second := fmt.Sprint(time.Now().Second()) + if len(second) < 2 { + second = "0" + second + } + scan.FileName = day + month + fmt.Sprint(time.Now().Year()) + "-" + hour + minute + second + } + if !strings.HasSuffix(scan.FileName, ".png") { + scan.FileName += ".png" + } + error := os.MkdirAll(scannerConfig.OutputDirectory, 0755) + if error != nil { + log.Fatal("an error occurred creating the output directory", error.Error()) + } + scan.ScanName = scannerConfig.OutputDirectory + scan.FileName + return scan.ScanName +} diff --git a/src/web/contentTypes.go b/src/web/contentTypes.go new file mode 100644 index 0000000..64bd162 --- /dev/null +++ b/src/web/contentTypes.go @@ -0,0 +1,157 @@ +package web + +import "strings" + +func getContentType(file string) string { + parts := strings.Split(file, ".") + extension := parts[len(parts)-1] + switch extension { + case ".aac": + return "audio/aac" + case "abw": + return "application/x-abiword" + case "arc": + return "application/x-freearc" + case "avif": + return "image/avif" + case "avi": + return "video/x-msvideo" + case "azw": + return "application/vnd.amazon.ebook" + case "bin": + return "application/octet-stream" + case "bmp": + return "image/bmp" + case "bz": + return "application/x-bzip" + case "bz2": + return "application/x-bzip2" + case "cda": + return "application/x-cdf" + case "csh": + return "application/x-csh" + case "css": + return "text/css" + case "csv": + return "text/csv" + case "doc": + return "application/msword" + case "docx": + return "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + case "eot": + return "application/vnd.ms-fontobject" + case "epub": + return "application/epub+zip" + case "gz": + return "application/gzip" + case "gif": + return "image/gif" + case "htm": + case "html": + return "text/html" + case "ico": + return "image/vnd.microsoft.icon" + case "ics": + return "text/calendar" + case "jar": + return "application/java-archive" + case "jpeg": + case "jpg": + return "image/jpeg" + case "js": + return "text/javascript" + case "json": + return "application/json" + case "jsonld": + return "application/ld+json" + case "mid": + case "midi": + return "audio/midi audio/x-midi" + case "mjs": + return "text/javascript" + case "mp3": + return "audio/mpeg" + case "mp4": + return "video/mp4" + case "mpeg": + return "video/mpeg" + case "mpkg": + return "application/vnd.apple.installer+xml" + case "odp": + return "application/vnd.oasis.opendocument.presentation" + case "ods": + return "application/vnd.oasis.opendocument.spreadsheet" + case "odt": + return "application/vnd.oasis.opendocument.text" + case "oga": + return "audio/ogg" + case "ogv": + return "video/ogg" + case "ogx": + return "application/ogg" + case "opus": + return "audio/opus" + case "otf": + return "font/otf" + case "png": + return "image/png" + case "pdf": + return "application/pdf" + case "php": + return "application/x-httpd-php" + case "ppt": + return "application/vnd.ms-powerpoint" + case "pptx": + return "application/vnd.openxmlformats-officedocument.presentationml.presentation" + case "rar": + return "application/vnd.rar" + case "rtf": + return "application/rtf" + case "sh": + return "application/x-sh" + case "svg": + return "image/svg+xml" + case "swf": + return "application/x-shockwave-flash" + case "tar": + return "application/x-tar" + case "tif": + case "tiff": + return "image/tiff" + case "ts": + return "video/mp2t" + case "ttf": + return "font/ttf" + case "txt": + return "text/plain" + case "vsd": + return "application/vnd.visio" + case "wav": + return "audio/wav" + case "weba": + return "audio/webm" + case "webm": + return "video/webm" + case "webp": + return "image/webp" + case "woff": + return "font/woff" + case "woff2": + return "font/woff2" + case "xhtml": + return "application/xhtml+xml" + case "xls": + return "application/vnd.ms-excel" + case "xlsx": + return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + case "xml": + return "application/xml" + case "xul": + return "application/vnd.mozilla.xul+xml" + case "zip": + return "application/zip" + case "7z": + return "application/x-7z-compressed" + } + return "" +} diff --git a/src/web/requestParameters.go b/src/web/requestParameters.go new file mode 100644 index 0000000..8a98cc0 --- /dev/null +++ b/src/web/requestParameters.go @@ -0,0 +1,15 @@ +package web + +import ( + "encoding/json" + "net/http" + "velvettear/go-scan/src/log" +) + +// exported functions +func ParseRequestParameters(request *http.Request, parameters struct{}) { + parseErr := json.NewDecoder(request.Body).Decode(¶meters) + if parseErr != nil { + log.Error("error parsing request parameters", parseErr.Error()) + } +} diff --git a/src/web/server.go b/src/web/server.go new file mode 100644 index 0000000..4d716e9 --- /dev/null +++ b/src/web/server.go @@ -0,0 +1,77 @@ +package web + +import ( + "embed" + "encoding/json" + "net/http" + "strings" + "velvettear/go-scan/src/log" + "velvettear/go-scan/src/util/scans" +) + +// struct +type server struct { + address string + port string + files embed.FS +} + +// "constructor" +func Server(address string, port string, files embed.FS) server { + server := server{ + address: address, + port: port, + files: files, + } + return server +} + +// exported functions +func (server server) Run() { + if len(server.address) == 0 || len(server.port) == 0 { + log.Fatal("could not start the server, address or port is not set") + } + serverAddress := server.address + ":" + server.port + http.HandleFunc("/", server.handleRequest) + log.Info("starting server '" + serverAddress + "'...") + err := http.ListenAndServe(serverAddress, nil) + if err != nil { + log.Fatal("an error occured starting the server", err.Error()) + } +} + +// unexported functions +func (server server) handleRequest(writer http.ResponseWriter, request *http.Request) { + if strings.ToLower(request.Method) == "post" { + server.handlePost(writer, request) + return + } + requestedFile := strings.TrimPrefix(request.URL.Path, "/") + switch requestedFile { + case "favicon.ico": + requestedFile = "img/" + requestedFile + case "": + requestedFile = "html/index.html" + } + requestedFile = "static/" + requestedFile + bytes, err := server.files.ReadFile(requestedFile) + if err != nil { + log.Error("an error occured serving the static file '"+requestedFile+"'", err.Error()) + writer.WriteHeader(404) + return + } + contentType := getContentType(requestedFile) + if len(contentType) > 0 { + writer.Header().Set("Content-Type", contentType) + } + log.Debug("serving file '" + requestedFile + "'...") + writer.Write(bytes) +} + +func (server server) handlePost(writer http.ResponseWriter, request *http.Request) { + scan := scans.New(request) + result := scan.Execute() + writer.Header().Set("Content-Type", "application/json") + json, _ := json.Marshal(result) + writer.Write(json) +} diff --git a/resources/styles.css b/static/css/styles.css similarity index 100% rename from resources/styles.css rename to static/css/styles.css diff --git a/resources/firacode.ttf b/static/fonts/firacode.ttf similarity index 100% rename from resources/firacode.ttf rename to static/fonts/firacode.ttf diff --git a/resources/index.html b/static/html/index.html similarity index 67% rename from resources/index.html rename to static/html/index.html index 166f4c8..4b9c505 100644 --- a/resources/index.html +++ b/static/html/index.html @@ -2,8 +2,8 @@ go-scan - - + + @@ -12,7 +12,7 @@

go-scan

- +
@@ -24,11 +24,11 @@ - + \ No newline at end of file diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ad0b1aab78f09a6e0d8b38997e152f1d0e165ec8 GIT binary patch literal 24607 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 (u_<4(pk)B@6b0by5XX3=9z)0dH9m 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 &+S-;* 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 U!2893#6L(wRp)u7vQ^0c0gL*1>Hq)$ literal 0 HcmV?d00001 diff --git a/resources/hearts-fill.svg b/static/img/hearts-fill.svg similarity index 100% rename from resources/hearts-fill.svg rename to static/img/hearts-fill.svg diff --git a/resources/icon.png b/static/img/icon.png similarity index 100% rename from resources/icon.png rename to static/img/icon.png diff --git a/resources/main.js b/static/js/main.js similarity index 100% rename from resources/main.js rename to static/js/main.js