From f7e1c2550b40974ed776d6c18dec408b61f1e322 Mon Sep 17 00:00:00 2001 From: Andrey Ivanov Date: Thu, 8 Oct 2020 12:30:19 +0300 Subject: [PATCH] Skeleton --- Makefile | 6 +-- go.mod | 11 +++++- previewer/application/application.go | 59 ++++++++++++++++++++++++++-- previewer/logger/logger.go | 15 ++++--- previewer/main.go | 28 +++++++++++-- previewer/models/models.go | 2 +- previewer/webserver/webserver.go | 54 ------------------------- 7 files changed, 101 insertions(+), 74 deletions(-) delete mode 100644 previewer/webserver/webserver.go diff --git a/Makefile b/Makefile index b8b70bf..7b60646 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ build: - go build -o bin ./src/main.go + go build -o bin ./previewer/main.go test: - go test -race ./src/... + go test -race ./previewer/... lint: install-lint-deps - golangci-lint run ./src/... + golangci-lint run ./previewer/... install-lint-deps: (which golangci-lint > /dev/null) || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.31.0 diff --git a/go.mod b/go.mod index c413313..16c3c6c 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,10 @@ -module main - +module github.com/tiburon-777/OTUS_Project go 1.14 + +require ( + github.com/BurntSushi/toml v0.3.1 + github.com/amitrai48/logger v0.0.0-20190214092904-448001c055ec + github.com/pkg/errors v0.9.1 // indirect + github.com/stretchr/testify v1.6.1 + gopkg.in/yaml.v2 v2.3.0 // indirect +) diff --git a/previewer/application/application.go b/previewer/application/application.go index 577402e..774fb25 100644 --- a/previewer/application/application.go +++ b/previewer/application/application.go @@ -1,11 +1,62 @@ package application +import ( + "github.com/tiburon-777/OTUS_Project/previewer/config" + "github.com/tiburon-777/OTUS_Project/previewer/logger" + oslog "log" + "net" + "net/http" + "time" +) type App struct { - Server - Log logger.Interface + *http.Server + Log logger.Interface } -func New(logger logger.Interface) *App { - return &App{Log: logger} +func New(conf config.Config) *App { + loger, err := logger.New(conf.Log) + if err != nil { + oslog.Fatal("не удалось прикрутить логгер") + } + return &App{Server: &http.Server{Addr: net.JoinHostPort(conf.Server.Address, conf.Server.Port), Handler: LoggingMiddleware(Handler, loger)}, Log: loger} +} + +func Handler(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) + _, _ = w.Write([]byte("Hello! I'm calendar app!")) +} + +func LoggingMiddleware(next http.HandlerFunc, l logger.Interface) http.HandlerFunc { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + defer func() { + var path, useragent string + if r.URL != nil { + path = r.URL.Path + } + if len(r.UserAgent()) > 0 { + useragent = r.UserAgent() + } + latency := time.Since(start) + l.Infof("receive %s request from IP: %s on path: %s, duration: %s useragent: %s ", r.Method, r.RemoteAddr, path, latency, useragent) + }() + next.ServeHTTP(w, r) + }) +} + +func (s *App) Start() error { + if err := s.ListenAndServe(); err != nil { + return err + } + s.Log.Infof("Server starting") + return nil +} + +func (s *App) Stop() error { + if err := s.Close(); err != nil { + return err + } + s.Log.Infof("Server stoped") + return nil } diff --git a/previewer/logger/logger.go b/previewer/logger/logger.go index 9b9bd02..f2322c8 100644 --- a/previewer/logger/logger.go +++ b/previewer/logger/logger.go @@ -2,13 +2,14 @@ package logger import ( "errors" + amitralog "github.com/amitrai48/logger" "log" "os" "strings" - - amitralog "github.com/amitrai48/logger" ) +type Fields map[string]interface{} + type Interface interface { Debugf(format string, args ...interface{}) Infof(format string, args ...interface{}) @@ -18,13 +19,15 @@ type Interface interface { } type Logger struct { - Logger amitralog.Logger + amitralog.Logger } + type Config struct { - File string - Level string - MuteStdout bool + File string + Level string + MuteStdout bool } + var validLevel = map[string]bool{"debug": true, "info": true, "warn": true, "error": true, "fatal": true} func New(conf Config) (Interface, error) { diff --git a/previewer/main.go b/previewer/main.go index 18350ed..2b7b00d 100644 --- a/previewer/main.go +++ b/previewer/main.go @@ -1,8 +1,12 @@ package main + import ( "flag" + "github.com/tiburon-777/OTUS_Project/previewer/application" + "github.com/tiburon-777/OTUS_Project/previewer/config" oslog "log" - "github/tiburon-777/OTUS_Project/previewer/application" + "os" + "os/signal" ) var ConfigFile = flag.String("config", "/etc/previewer.conf", "Path to configuration file") @@ -14,6 +18,22 @@ func main() { oslog.Fatal("не удалось открыть файл конфигурации:", err.Error()) } - app := application.New(&conf) - app.Run() -} \ No newline at end of file + app := application.New(conf) + + go func() { + signals := make(chan os.Signal, 1) + signal.Notify(signals) + + <-signals + signal.Stop(signals) + + if err := app.Stop(); err != nil { + app.Log.Errorf("failed to close application: " + err.Error()) + } + }() + + if err := app.Start(); err != nil { + app.Log.Errorf("failed to start application: " + err.Error()) + os.Exit(1) + } +} diff --git a/previewer/models/models.go b/previewer/models/models.go index 83d43a5..b612c76 100644 --- a/previewer/models/models.go +++ b/previewer/models/models.go @@ -1,5 +1,5 @@ package models type Config struct { - LruCapasity int + LruCapasity int } diff --git a/previewer/webserver/webserver.go b/previewer/webserver/webserver.go deleted file mode 100644 index 80c75a2..0000000 --- a/previewer/webserver/webserver.go +++ /dev/null @@ -1,54 +0,0 @@ -package webserver - -import ( - "net" - "net/http" - "time" -) - -type Server struct { - *http.Server -} - -func NewServer(address string, port string) http.Server { - return http.Server{Addr: net.JoinHostPort(address, port), Handler: LoggingMiddleware(Handler)} -} - -func Handler(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(200) - _, _ = w.Write([]byte("Hello! I'm calendar app!")) -} - -func LoggingMiddleware(next http.HandlerFunc) http.HandlerFunc { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - start := time.Now() - defer func() { - var path, useragent string - if r.URL != nil { - path = r.URL.Path - } - if len(r.UserAgent()) > 0 { - useragent = r.UserAgent() - } - latency := time.Since(start) - a.Logger.Infof("receive %s request from IP: %s on path: %s, duration: %s useragent: %s ", r.Method, r.RemoteAddr, path, latency, useragent) - }() - next.ServeHTTP(w, r) - }) -} - -func (s *Server) Start() error { - if err := s.ListenAndServe(); err != nil { - return err - } - s.app.Logger.Infof("Server starting") - return nil -} - -func (s *Server) Stop() error { - if err := s.Close(); err != nil { - return err - } - s.app.Logger.Infof("Server stoped") - return nil -}