diff options
| author | Felix Hanley <felix@userspace.com.au> | 2020-02-14 09:24:29 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2020-02-14 09:24:29 +0000 |
| commit | bd8968313b3145828822bdd7e12a6e5aa2896c15 (patch) | |
| tree | 198868c13e1e21d5cea665f87d3f3cb58d432072 | |
| parent | 729c39874d906a6312b878046ca24458af4b6a8b (diff) | |
| download | sws-bd8968313b3145828822bdd7e12a6e5aa2896c15.tar.gz sws-bd8968313b3145828822bdd7e12a6e5aa2896c15.tar.bz2 | |
Fix template loading order
| -rw-r--r-- | cmd/server/db.go | 35 | ||||
| -rw-r--r-- | cmd/server/handlers.go | 20 | ||||
| -rw-r--r-- | cmd/server/hits.go | 4 | ||||
| -rw-r--r-- | cmd/server/main.go | 48 | ||||
| -rw-r--r-- | go.mod | 4 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | templates/example.tmpl | 24 | ||||
| -rw-r--r-- | templates/gen.go | 2 | ||||
| -rw-r--r-- | templates/home.tmpl | 8 | ||||
| -rw-r--r-- | templates/partials/navMain.tmpl | 8 | ||||
| -rw-r--r-- | templates/partials/navService.tmpl | 5 | ||||
| -rw-r--r-- | templates/partials/pageFoot.tmpl | 4 | ||||
| -rw-r--r-- | templates/partials/pageHead.tmpl | 9 | ||||
| -rw-r--r-- | user_agent.go | 9 |
14 files changed, 117 insertions, 65 deletions
diff --git a/cmd/server/db.go b/cmd/server/db.go new file mode 100644 index 0000000..8fc262c --- /dev/null +++ b/cmd/server/db.go @@ -0,0 +1,35 @@ +package main + +import ( + "database/sql" + "fmt" + + "src.userspace.com.au/go-migrate" +) + +func migrateDatabase(driver, dsn string) (int64, error) { + var version int64 + db, err := sql.Open(driver, dsn) + if err != nil { + return version, err + } + defer db.Close() + + // Load migrations from generated file + ms, err := decodeMigrations(driver) + if err != nil { + return 0, err + } + debug("found", len(ms), "migrations for driver", driver) + migrator, err := migrate.NewStringMigrator(db, ms) + if err != nil { + return version, fmt.Errorf("failed to initialise: %w", err) + } + + err = migrator.Migrate() + if err != nil { + return version, fmt.Errorf("failed to migrate: %w", err) + } + + return migrator.Version() +} diff --git a/cmd/server/handlers.go b/cmd/server/handlers.go index 7ec8b24..de3bfa3 100644 --- a/cmd/server/handlers.go +++ b/cmd/server/handlers.go @@ -5,28 +5,16 @@ import ( "net/http" ) -func handleIndex() http.HandlerFunc { - tmplHome := loadTemplateMust("home") - tmplNav := loadTemplateMust("partials/navMain") - tmplLayout := loadTemplateMust("layout") - tmpl := template.Must(template.New("layout").Parse(string(tmplLayout))) - _ = template.Must(tmpl.Parse(string(tmplHome))) - _ = template.Must(tmpl.Parse(string(tmplNav))) - debug(tmpl) - +func handleIndex(tmpls *template.Template) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - tmpl.Execute(w, nil) + tmpls.ExecuteTemplate(w, "home", nil) } } -func handleExample() http.HandlerFunc { +func handleExample(tmpls *template.Template) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - b, err := loadTemplate("example") - if err != nil { - panic(err) - } - w.Write(b) + tmpls.ExecuteTemplate(w, "example", nil) } } diff --git a/cmd/server/hits.go b/cmd/server/hits.go index 64bab3b..b64efea 100644 --- a/cmd/server/hits.go +++ b/cmd/server/hits.go @@ -45,6 +45,8 @@ func handleHitCounter(db sws.CounterStore) http.HandlerFunc { //http.Error(w, err.Error(), http.StatusInternalServerError) //return } + // TODO restrict to site domains + w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "image/gif") w.Write(gifBytes) log("hit", hit) @@ -54,6 +56,8 @@ func handleHitCounter(db sws.CounterStore) http.HandlerFunc { func handleCounter(addr string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + // TODO restrict to site domains + w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/javascript") reader := strings.NewReader(counter) if _, err := io.Copy(w, reader); err != nil { diff --git a/cmd/server/main.go b/cmd/server/main.go index 2c3ab4f..44fee32 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -2,9 +2,9 @@ package main import ( "context" - "database/sql" "flag" "fmt" + "html/template" "net/http" "os" "strconv" @@ -16,7 +16,6 @@ import ( _ "github.com/jackc/pgx/stdlib" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" - "src.userspace.com.au/go-migrate" "src.userspace.com.au/sws" "src.userspace.com.au/sws/store" ) @@ -74,12 +73,12 @@ func main() { db, err := sqlx.Open(driver, *dsn) if err != nil { - fmt.Println(err) + log(err) os.Exit(1) } defer db.Close() if err := db.Ping(); err != nil { - fmt.Println(err) + log(err) os.Exit(1) } var st sws.Store @@ -89,6 +88,15 @@ func main() { st = store.NewSqlite3Store(db) } + tmpls := template.Must(loadTemplateHTML([]string{ + "home", + "example", + "partials/navMain", + "partials/pageHead", + "partials/pageFoot", + }, nil)) + debug(tmpls.DefinedTemplates()) + r := chi.NewRouter() r.Use(middleware.RequestID) r.Use(middleware.RealIP) @@ -119,10 +127,10 @@ func main() { }) }) }) - r.Get("/", handleIndex()) + r.Get("/", handleIndex(tmpls)) // Example - r.Get("/test.html", handleExample()) + r.Get("/test.html", handleExample(tmpls)) log("listening at", *addr) http.ListenAndServe(*addr, r) @@ -154,31 +162,3 @@ func getDomainCtx(db sws.DomainStore) func(http.Handler) http.Handler { // }) // } // } - -func migrateDatabase(driver, dsn string) (int64, error) { - db, err := sql.Open(driver, dsn) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - defer db.Close() - - var version int64 - // Load migrations from generated file - ms, err := decodeMigrations(driver) - if err != nil { - return 0, err - } - debug("found", len(ms), "migrations for driver", driver) - migrator, err := migrate.NewStringMigrator(db, ms) - if err != nil { - return version, fmt.Errorf("failed to initialise: %w", err) - } - - err = migrator.Migrate() - if err != nil { - return version, fmt.Errorf("failed to migrate: %w", err) - } - - return migrator.Version() -} @@ -20,9 +20,7 @@ require ( google.golang.org/appengine v1.6.5 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect src.userspace.com.au/go-migrate v0.0.0-20200208102934-cf11cf76db3f - src.userspace.com.au/templates v0.0.0-20200213053211-f58212f65bbd + src.userspace.com.au/templates v0.0.0-20200214092258-6bc0451a1d45 ) -replace src.userspace.com.au/templates => ../templates - go 1.13 @@ -52,3 +52,5 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= src.userspace.com.au/go-migrate v0.0.0-20200208102934-cf11cf76db3f h1:Vdn/5kMeLXWfkXF/wm9lioSBASBn02aA5DeVjLAYjLM= src.userspace.com.au/go-migrate v0.0.0-20200208102934-cf11cf76db3f/go.mod h1:QaSWOcvGubR8TBPs8XgLN67muYgAKnmIgHAaQk5ZR1c= +src.userspace.com.au/templates v0.0.0-20200214092258-6bc0451a1d45 h1:Zvc9Sw4WpR/4JEtQT0J29YeccKxUld+8kmqUFKf0CvQ= +src.userspace.com.au/templates v0.0.0-20200214092258-6bc0451a1d45/go.mod h1:lB6Vdw9R/8jR8CzvPxfQ8ryBwpNDni1fCdeRjj90gxA= diff --git a/templates/example.tmpl b/templates/example.tmpl index 13dd609..72b1450 100644 --- a/templates/example.tmpl +++ b/templates/example.tmpl @@ -1,14 +1,16 @@ +{{ define "example" }} <!doctype html> <html> - <head> - <meta charset="utf-8"> - <script async src="http://localhost:5000/sws.js" data-sws="http://localhost:5000/sws.gif"></script> - <title>This is the title</title> - <noscript> - <img src="http://localhost:5000/sws.gif" /> - </noscript> - </head> - <body> - <a href="?referred">test</a> - </body> + <head> + <meta charset="utf-8"> + <script async src="http://localhost:5000/sws.js" data-sws="http://localhost:5000/sws.gif"></script> + <title>This is the title</title> + <noscript> + <img src="http://localhost:5000/sws.gif" /> + </noscript> + </head> + <body> + <a href="?referred">test</a> + </body> </html> +{{ end }} diff --git a/templates/gen.go b/templates/gen.go index fb0faf7..81811a9 100644 --- a/templates/gen.go +++ b/templates/gen.go @@ -9,7 +9,7 @@ import ( ) func main() { - tmpl := templates.Must(templates.New()) + tmpl := templates.Must(templates.New(templates.EnableHTMLTemplates())) if _, err := tmpl.WriteTo(os.Stdout); err != nil { panic(err) } diff --git a/templates/home.tmpl b/templates/home.tmpl new file mode 100644 index 0000000..d95845a --- /dev/null +++ b/templates/home.tmpl @@ -0,0 +1,8 @@ +{{ define "home" }} + {{ template "pageHead" }} + {{ template "navMain" }} + <main> + home page + </main> + {{ template "pageFoot" }} +{{ end }} diff --git a/templates/partials/navMain.tmpl b/templates/partials/navMain.tmpl new file mode 100644 index 0000000..e74f015 --- /dev/null +++ b/templates/partials/navMain.tmpl @@ -0,0 +1,8 @@ +{{ define "navMain" }} +<nav> + <a href="/">Home</a> + <a href="/sites">Sites</a> + <a href="/sites/new">New site</a> + <a href="/logout">Logout</a> +</nav> +{{ end }} diff --git a/templates/partials/navService.tmpl b/templates/partials/navService.tmpl new file mode 100644 index 0000000..66ef680 --- /dev/null +++ b/templates/partials/navService.tmpl @@ -0,0 +1,5 @@ +{{ define "navService" }} +<nav> + <a href="">Stats</a> +</nav> +{{ end }} diff --git a/templates/partials/pageFoot.tmpl b/templates/partials/pageFoot.tmpl new file mode 100644 index 0000000..d054b3d --- /dev/null +++ b/templates/partials/pageFoot.tmpl @@ -0,0 +1,4 @@ +{{ define "pageFoot" }} + </body> +</html> +{{ end }} diff --git a/templates/partials/pageHead.tmpl b/templates/partials/pageHead.tmpl new file mode 100644 index 0000000..e44295d --- /dev/null +++ b/templates/partials/pageHead.tmpl @@ -0,0 +1,9 @@ +{{ define "pageHead" }} +<!DOCTYPE html> +<html lang="en-au"> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Simple Web Stats</title> + </head> + <body> +{{ end }} diff --git a/user_agent.go b/user_agent.go index cbb831b..19973b3 100644 --- a/user_agent.go +++ b/user_agent.go @@ -4,15 +4,24 @@ import ( "crypto/sha1" "fmt" "net/http" + "regexp" "time" ) +var botRegex = regexp.MustCompile("(?i)(bot|crawler|sp(i|y)der|search|worm|fetch|nutch)") +var botFromSiteRegexp = regexp.MustCompile("http[s]?://.+\\.\\w+") + type UserAgent struct { Hash string `json:"hash"` Name string `json:"name"` LastSeenAt time.Time `json:"last_seen_at"` } +func (ua UserAgent) Bot() bool { + // TODO a little naive ATM + return botRegex.MatchString(ua.Name) || botFromSiteRegexp.MatchString(ua.Name) +} + func UserAgentHash(s string) string { return fmt.Sprintf("%x", sha1.Sum([]byte(s))) } |
