summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHorus32015-02-21 14:50:00 +0100
committerHorus32015-02-21 14:50:00 +0100
commitb58e21a525e7e4aeda3ec51bfcb07390af8be465 (patch)
tree9974d885ae2c81052e881e00207677e80d9f6fc7
parentc92989a8fc738094b205094a1bdd458a40c23d9c (diff)
downloadstatuspage-b58e21a525e7e4aeda3ec51bfcb07390af8be465.tar.gz
Index page is now cached.
-rw-r--r--.gitignore2
-rw-r--r--app/.s0
-rw-r--r--app/Makefile11
-rw-r--r--app/db.go5
-rwxr-xr-xapp/env.sh2
-rw-r--r--app/fetch.go38
-rw-r--r--app/handler.go32
-rw-r--r--app/main.go4
-rw-r--r--app/struct.go7
-rw-r--r--app/test.go17
-rw-r--r--app/utilities.go12
-rw-r--r--views/footer.html16
-rw-r--r--views/header.html14
-rw-r--r--views/index.html8
-rw-r--r--views/jobs.html10
-rw-r--r--views/navbar.html26
16 files changed, 150 insertions, 54 deletions
diff --git a/.gitignore b/.gitignore
index d4c0936..36c12ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
*.swp
*.db
+*.tar
+*.gz
statuspage
import.go
diff --git a/app/.s b/app/.s
deleted file mode 100644
index e69de29..0000000
--- a/app/.s
+++ /dev/null
diff --git a/app/Makefile b/app/Makefile
index 06aed05..15da585 100644
--- a/app/Makefile
+++ b/app/Makefile
@@ -32,6 +32,8 @@ clean: kill
@rm $(IMPORT_FILE) || true
@echo "Removing sqlite3 database..."
@rm $(STATUS_DB_CREDENTIALS) || true
+ @echo "Removing tar archiv..."
+ @rm ../$(APP).tar.gz || true
@echo "Removing binary..."
@rm $(APP)
@echo "Done."
@@ -68,4 +70,11 @@ mysql: create_import
postgresql: create_import
@echo "import _ \"github.com/lib/pq\"" >> $(IMPORT_FILE)
-database_all: create_import sqlite3 mysql postgresql
+database_all: sqlite3 mysql postgresql
+ @echo "Created import file for all databases."
+
+pack:
+ @cd .. && \
+ tar czf $(APP).tar.gz app/$(APP) app/env.sh app/Makefile views static db 2>/dev/null && \
+ echo "../$(APP).tar.gz is ready." || \
+ (echo "Run \"make build\" first." && exit 1)
diff --git a/app/db.go b/app/db.go
index a4e35cb..b3cd459 100644
--- a/app/db.go
+++ b/app/db.go
@@ -12,7 +12,10 @@ func InitDB() {
if dberr != nil {
log.Panic(dberr)
}
- Db.LogMode(true)
+ logMode := os.Getenv("STATUS_DB_LOG")
+ if logMode == "true" {
+ Db.LogMode(true)
+ }
if err := Db.DB().Ping(); err != nil {
log.Panic(err)
}
diff --git a/app/env.sh b/app/env.sh
index 81b344f..05cd7ec 100755
--- a/app/env.sh
+++ b/app/env.sh
@@ -1,9 +1,11 @@
#!/bin/sh
+# Call this script with make or source it.
# Database
export STATUS_DB_DRIVER=sqlite3
export STATUS_DB_CREDENTIALS=../db/status.db
export STATUS_DB_IMPORT_DRIVER=github.com/mattn/go-sqlite3
+export STATUS_DB_LOG=true
# Redis
export STATUS_REDIS_SERVER=127.0.0.1
diff --git a/app/fetch.go b/app/fetch.go
index 898329d..c8b0376 100644
--- a/app/fetch.go
+++ b/app/fetch.go
@@ -3,7 +3,7 @@ package main
import (
"encoding/json"
"fmt"
- "strconv"
+ // "strconv"
// "time"
"log"
)
@@ -26,14 +26,26 @@ const (
func healthCheck() {
h := []Host{}
db := Db
+ //db.Where("monitored = ?", true).Find(&h)
db.Find(&h)
c := pool.Get()
defer c.Close()
for k, v := range h {
+ if !h[k].Monitored {
+ continue
+ }
+
if resp, _, err := HttpGet(v.Url); err != nil {
- fmt.Printf("Error! %v \n", err)
+ //fmt.Println(err)
+
+ h[k].Status = "Error"
+ h[k].StatusCode = 0
+ h[k].Success = false
+ h[k].Monitored = false
+ h[k].Reason = fmt.Sprintf("%v", err)
+ Db.Debug().Save(&h[k])
} else {
// fmt.Println("Health check: Okay! ", resp.Status)
@@ -41,17 +53,20 @@ func healthCheck() {
h[k].Status = resp.Status
h[k].StatusCode = int64(resp.StatusCode)
h[k].Success = true
+ h[k].Reason = ""
Db.Debug().Save(&h[k])
}
// save struct in redis as serialized json
// TODO
- j, err := json.Marshal(h[k])
- if err != nil {
- log.Println("Error: ", err)
- continue
- }
- c.Do("SET", cache_prefix+strconv.Itoa(k), j)
+ /*
+ j, err := json.Marshal(h[k])
+ if err != nil {
+ log.Println("Error: ", err)
+ continue
+ }
+ c.Do("SET", cache_prefix+strconv.Itoa(k), j)
+ */
//c.Do("SET", cache_prefix+strconv.Itoa(k), j)
//c.Do("SET", k, j)
@@ -60,4 +75,11 @@ func healthCheck() {
}
+ js, err := json.Marshal(h)
+
+ if err != nil {
+ log.Fatal(err)
+ } else {
+ c.Do("SET", cache_prefix+"database", js)
+ }
}
diff --git a/app/handler.go b/app/handler.go
index ad66657..9a3352f 100644
--- a/app/handler.go
+++ b/app/handler.go
@@ -3,19 +3,39 @@ package main
import (
"fmt"
// "html/template"
+ "encoding/json"
+ "github.com/garyburd/redigo/redis"
"log"
"net/http"
)
func IndexHandler(w http.ResponseWriter, r *http.Request) {
- fmt.Fprintf(w, "Hello World! \n")
- // w.Write()
-}
+ log.Println("Print IndexHandler")
+
+ hosts := []Host{}
+
+ c := pool.Get()
+ defer c.Close()
+
+ j, err := redis.String(c.Do("GET", cache_prefix+"database"))
+ if err == nil {
+ err = json.Unmarshal([]byte(j), &hosts)
+ if err != nil {
+ log.Println("Error JSON decoding: ", err)
+ Db.Find(&hosts)
+ }
+ } else {
+ log.Println("Redis: ", err)
+ Db.Find(&hosts)
+ }
+
+ index := mainTempl.Lookup("index.html")
-/*
-func StaticHandler(w http.ResponseWrite, r *http.Request) {
+ err = index.ExecuteTemplate(w, "index.html", hosts)
+ if err != nil {
+ log.Panic(err)
+ }
}
-*/
func RegisterHandler(w http.ResponseWriter, r *http.Request) {
log.Println("Processing registration!")
diff --git a/app/main.go b/app/main.go
index 3850a4d..d51cf20 100644
--- a/app/main.go
+++ b/app/main.go
@@ -23,15 +23,17 @@ func main() {
r := mux.NewRouter()
r.HandleFunc("/", IndexHandler)
- //r.HandleFunc("/static", StaticHandler)
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./../static"))))
r.HandleFunc("/register", RegisterHandler).Methods("POST")
r.HandleFunc("/register", PrintRegisterHandler).Methods("GET")
r.HandleFunc("/new", AddNewJobHandler).Methods("POST")
r.HandleFunc("/new", PrintNewJobHandler).Methods("GET")
r.HandleFunc("/jobs", ShowJobHandler)
+
http.Handle("/", r)
+
ip := os.Getenv("STATUS_HTTP_IP")
port := os.Getenv("STATUS_HTTP_PORT")
+
http.ListenAndServe(ip+":"+port, nil)
}
diff --git a/app/struct.go b/app/struct.go
index d7135aa..37704d7 100644
--- a/app/struct.go
+++ b/app/struct.go
@@ -7,20 +7,19 @@ import (
/* Maybe worth saving uptime history? */
type Host struct {
- Id int64
- UserId int64
- Url string
+ Id int64
+ Url string
// Protocoll string // e.g. http
Monitored bool // disable monitoring on error
Private bool
Status string
StatusCode int64
Success bool
+ Reason string // Connection failure
/*
Date time.Time
Include string // Website must include this string
Except string // Website must not include this string
- Reason string // Include, Exclude, Connection failure
Alert bool // True to send alert on failure
*/
CreatedAt time.Time
diff --git a/app/test.go b/app/test.go
index 0b56fae..3cd71bc 100644
--- a/app/test.go
+++ b/app/test.go
@@ -1,6 +1,23 @@
package main
+import (
+//"encoding/json"
+)
+
func insertHost() {
h := Host{Url: "https://mx.iamfabulous.de/", Monitored: true, Private: false}
Db.Create(&h)
+ h = Host{Url: "https://iamfabulousadsfadfdsf.de/", Monitored: true, Private: false}
+ Db.Create(&h)
+
+ c := pool.Get()
+ defer c.Close()
+
+ /*
+ host := []Host{}
+ Db.Find(&host)
+
+ js, _ := json.Marshal(host)
+ c.Do("SET", cache_prefix, js)
+ */
}
diff --git a/app/utilities.go b/app/utilities.go
index 5c665e2..3ec1b60 100644
--- a/app/utilities.go
+++ b/app/utilities.go
@@ -1,7 +1,9 @@
package main
import (
+ "bytes"
"crypto/md5"
+ "encoding/gob"
"fmt"
"github.com/garyburd/redigo/redis"
"golang.org/x/crypto/bcrypt"
@@ -95,3 +97,13 @@ func VerifyPassword(password, hash string) bool {
}
return true
}
+
+func GetBytes(key interface{}) ([]byte, error) {
+ var buf bytes.Buffer
+ enc := gob.NewEncoder(&buf)
+ err := enc.Encode(key)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
diff --git a/views/footer.html b/views/footer.html
index 408581d..7cc4a34 100644
--- a/views/footer.html
+++ b/views/footer.html
@@ -1,17 +1,17 @@
{{range .moreScripts}}
- <script src="/static/js/{{.}}" type="text/javascript" charset="utf-8"></script>
+ <script src='/static/js/{{.}}' type='text/javascript' charset='utf-8'></script>
{{end}}
-<div class="footer">
- <div class="container">
- <div class="row">
+<div class='footer'>
+ <div class='container'>
+ <div class='row'>
<footer>
- <p id="copyright-text" align='right'> Copyright 2015 <a class="footer-a" href="//www.iamfabulous.de" title="Maximilian Möhring">Maximilian M&ouml;hring</a></p>
+ <p id='copyright-text' align='right'> Copyright 2015 <a class='footer-a' href='//www.iamfabulous.de' title='Maximilian Möhring'>Maximilian M&ouml;hring</a></p>
</footer>
</div>
</div>
</div>
-<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
-<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script
-<!--script src="/static/js/bootstrap.js"></script-->
+<script src='//code.jquery.com/jquery-1.11.2.min.js'></script>
+<script src='//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js'></script>
+<!--script src='/static/js/bootstrap.js'></script-->
</body>
</html>
diff --git a/views/header.html b/views/header.html
index 2875487..694da63 100644
--- a/views/header.html
+++ b/views/header.html
@@ -2,16 +2,16 @@
<html>
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>{{.title}}</title>
- <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
- <!--link rel="stylesheet" type="text/css" href="/static/css/bootstrap.css"-->
- <link rel="stylesheet" type="text/css" href="/static/css/style.css">
- <link rel="shortcut icon" type="image/png" href="/static/img/favicon.ico">
+ <link rel='stylesheet' href='//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css'>
+ <!--link rel='stylesheet' type='text/css' href='/static/css/bootstrap.css'-->
+ <link rel='stylesheet' type='text/css' href='/static/css/style.css'>
+ <link rel='shortcut icon' type='image/png' href='/static/img/favicon.ico'>
{{range .moreStyles}}
- <link rel="stylesheet" type="text/css" href="/public/{{.}}">
+ <link rel='stylesheet' type='text/css' href='/public/{{.}}'>
{{end}}
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name='viewport' content='width=device-width, initial-scale=1.0'>
<noscript>
<style>.navbar{margin-bottom:0;}</style>
</noscript>
diff --git a/views/index.html b/views/index.html
index e69de29..31ef3f2 100644
--- a/views/index.html
+++ b/views/index.html
@@ -0,0 +1,8 @@
+{{template "header.html"}}
+{{template "navbar.html"}}
+Hello World!
+
+{{range .}}
+Hier steht die Url: {{.Url}}
+{{end}}
+{{template "footer.html"}}
diff --git a/views/jobs.html b/views/jobs.html
index c0d68ac..9fdcbf7 100644
--- a/views/jobs.html
+++ b/views/jobs.html
@@ -1,9 +1,9 @@
{{template "header.html"}}
{{template "navbar.html"}}
-<form method="post" action="/new">
- <input type="text" name="Url" placeholder="domain">
- <!--input type="text" name="name" placeholder="name">
- <input type="hidden" name="private" value="0"-->
- <input type="submit">
+<form method='post' action='/new'>
+ <input type='text' name='Url' placeholder='domain'>
+ <!--input type='text' name='name' placeholder='name'>
+ <input type='hidden' name='private' value='0'-->
+ <input type='submit'>
</form>
{{template "footer.html"}}
diff --git a/views/navbar.html b/views/navbar.html
index 6cb06b6..317b564 100644
--- a/views/navbar.html
+++ b/views/navbar.html
@@ -1,21 +1,21 @@
-<nav class="navbar navbar-default navbar-custom" role="navigation">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbarCollapse">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
+<nav class='navbar navbar-default navbar-custom' role='navigation'>
+ <div class='container'>
+ <div class='navbar-header'>
+ <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='#navbarCollapse'>
+ <span class='sr-only'>Toggle navigation</span>
+ <span class='icon-bar'></span>
+ <span class='icon-bar'></span>
+ <span class='icon-bar'></span>
</button>
- <a class="navbar-brand" href="/"><span class="glyphicon glyphicon-home"></span> Home</a>
+ <a class='navbar-brand' href='/'><span class='glyphicon glyphicon-home'></span> Home</a>
</div>
- <div class="collapse navbar-collapse" id="navbarCollapse">
- <ul class="nav navbar-nav navbar-bar-left">
+ <div class='collapse navbar-collapse' id='navbarCollapse'>
+ <ul class='nav navbar-nav navbar-bar-left'>
<li>
- <a href="#" >About</a>
+ <a href='#' >About</a>
</li>
<li>
- <a href="#" >Something</a>
+ <a href='#' >Something</a>
</li>
</ul>
</div>