mirror of https://github.com/statping/statping
changes
parent
1490d11c8e
commit
6441b325ff
|
@ -7,3 +7,7 @@ Use the [Statup Docker Image](https://hub.docker.com/r/hunterlong/statup) to cre
|
||||||
docker run -it -p 8080:8080 hunterlong/statup
|
docker run -it -p 8080:8080 hunterlong/statup
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Install on Linux
|
||||||
|
```
|
||||||
|
bash <(curl -s https://statup.io/install.sh)
|
||||||
|
```
|
|
@ -9,7 +9,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func CheckServices() {
|
func CheckServices() {
|
||||||
services := SelectAllServices()
|
services = SelectAllServices()
|
||||||
for _, v := range services {
|
for _, v := range services {
|
||||||
obj := v
|
obj := v
|
||||||
go obj.CheckQueue()
|
go obj.CheckQueue()
|
||||||
|
@ -32,7 +32,6 @@ func (s *Service) Check() {
|
||||||
s.Failure(response, fmt.Sprintf("HTTP Error %v", err))
|
s.Failure(response, fmt.Sprintf("HTTP Error %v", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.Expected != "" {
|
if s.Expected != "" {
|
||||||
contents, _ := ioutil.ReadAll(response.Body)
|
contents, _ := ioutil.ReadAll(response.Body)
|
||||||
match, _ := regexp.MatchString(s.Expected, string(contents))
|
match, _ := regexp.MatchString(s.Expected, string(contents))
|
||||||
|
@ -45,12 +44,12 @@ func (s *Service) Check() {
|
||||||
s.Failure(response, fmt.Sprintf("HTTP Status Code %v did not match %v", response.StatusCode, s.ExpectedStatus))
|
s.Failure(response, fmt.Sprintf("HTTP Status Code %v did not match %v", response.StatusCode, s.ExpectedStatus))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
s.Online = true
|
||||||
s.Record(response)
|
s.Record(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) Record(response *http.Response) {
|
func (s *Service) Record(response *http.Response) {
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
s.Online = true
|
|
||||||
db.QueryRow("INSERT INTO hits(service,latency,created_at) VALUES($1,$2,NOW()) returning id;", s.Id, s.Latency).Scan()
|
db.QueryRow("INSERT INTO hits(service,latency,created_at) VALUES($1,$2,NOW()) returning id;", s.Id, s.Latency).Scan()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3
core.go
3
core.go
|
@ -1,5 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
import "github.com/gorilla/sessions"
|
||||||
|
|
||||||
type Core struct {
|
type Core struct {
|
||||||
Name string
|
Name string
|
||||||
Config string
|
Config string
|
||||||
|
@ -20,5 +22,6 @@ func SelectCore() (*Core, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
store = sessions.NewCookieStore([]byte(core.Secret))
|
||||||
return &core, err
|
return &core, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,3 +31,11 @@ func (s *Service) TotalFailures() int {
|
||||||
db.QueryRow("SELECT COUNT(id) FROM failures WHERE service=$1;", s.Id).Scan(&amount)
|
db.QueryRow("SELECT COUNT(id) FROM failures WHERE service=$1;", s.Id).Scan(&amount)
|
||||||
return amount
|
return amount
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) TotalFailures24Hours() int {
|
||||||
|
var amount int
|
||||||
|
t := time.Now()
|
||||||
|
x := t.AddDate(0, 0, -1)
|
||||||
|
db.QueryRow("SELECT COUNT(id) FROM failures WHERE service=$1 AND created_at>=$2 AND created_at<$3;", s.Id, t, x).Scan(&amount)
|
||||||
|
return amount
|
||||||
|
}
|
||||||
|
|
|
@ -12,7 +12,8 @@ HTML,BODY {
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
margin-left: -50px;
|
margin-left: -50px;
|
||||||
width: 720px;
|
margin-top: -50px;
|
||||||
|
width: 790px;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
|
|
||||||
<title>Fusioner | Dashboard</title>
|
<title>Statup | Dashboard</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
<a class="navbar-brand" href="#">Fusioner</a>
|
<a class="navbar-brand" href="#">Statup</a>
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -25,13 +25,13 @@
|
||||||
<a class="nav-link" href="/dashboard">Dashboard</a>
|
<a class="nav-link" href="/dashboard">Dashboard</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/tokens">Tokens</a>
|
<a class="nav-link" href="/services">Services</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/users">Users</a>
|
<a class="nav-link" href="/users">Users</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/permissions">Permissions</a>
|
<a class="nav-link" href="/plguins">Plugins</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<span class="navbar-text">
|
<span class="navbar-text">
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
<script src="/js/Chart.bundle.min.js"></script>
|
<script src="/js/Chart.bundle.min.js"></script>
|
||||||
|
|
||||||
<title>Fusioner | Dashboard</title>
|
<title>Statup | Dashboard</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
<div class="row stats_area mt-3 mb-3">
|
<div class="row stats_area mt-3 mb-3">
|
||||||
|
|
||||||
|
{{.Online}}
|
||||||
|
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
<span class="lg_number">{{.Online24Hours}}%</span>
|
<span class="lg_number">{{.Online24Hours}}%</span>
|
||||||
Online last 24 Hours
|
Online last 24 Hours
|
||||||
|
|
|
@ -7,13 +7,11 @@
|
||||||
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
|
|
||||||
<title>Hello, world!</title>
|
<title>Statup | Login</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
|
@ -7,7 +7,7 @@
|
||||||
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
|
|
||||||
<title>Fusioner | Permissions</title>
|
<title>Statup | Permissions</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
|
|
||||||
<title>Fusioner | Tokens</title>
|
<title>Statup | Services</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@ -15,54 +15,58 @@
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
<a class="navbar-brand" href="#">Fusioner</a>
|
<a class="navbar-brand" href="#">Statup</a>
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
</button>
|
</button>
|
||||||
<div class="collapse navbar-collapse" id="navbarText">
|
<div class="collapse navbar-collapse" id="navbarText">
|
||||||
<ul class="navbar-nav mr-auto">
|
<ul class="navbar-nav mr-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/dashboard">Dashboard</a>
|
<a class="nav-link" href="/dashboard">Dashboard</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item active">
|
<li class="nav-item active">
|
||||||
<a class="nav-link" href="/tokens">Tokens</a>
|
<a class="nav-link" href="/services">Services</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/users">Users</a>
|
<a class="nav-link" href="/users">Users</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/permissions">Permissions</a>
|
<a class="nav-link" href="/plguins">Plugins</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<span class="navbar-text">
|
<span class="navbar-text">
|
||||||
<a class="nav-link" href="/logout">Logout</a>
|
<a class="nav-link" href="/logout">Logout</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|
||||||
<h3>Tokens</h3>
|
<h3>Services</h3>
|
||||||
|
|
||||||
<a href="/token/create" class="btn btn-primary">Create New Token</a>
|
|
||||||
|
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">#</th>
|
<th scope="col">#</th>
|
||||||
<th scope="col">Key</th>
|
<th scope="col">Name</th>
|
||||||
<th scope="col">Secret</th>
|
<th scope="col">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{range .}}
|
{{range .}}
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">{{.Id}}</th>
|
<th scope="row">{{.Id}}</th>
|
||||||
<td>{{.Key}}</td>
|
<td>{{.Name}}</td>
|
||||||
<td>{{.Secret}}</td>
|
<td>
|
||||||
|
<div class="btn-group" data-toggle="buttons">
|
||||||
|
<button class="btn btn-primary" type="submit">View</button>
|
||||||
|
<button class="btn btn-primary" type="submit">Edit</button>
|
||||||
|
<button class="btn btn-primary" type="submit">Delete</button>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -71,6 +75,56 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-12">
|
||||||
|
|
||||||
|
<h3>Create Service</h3>
|
||||||
|
|
||||||
|
<form action="/services/create" method="POST">
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputEmail3" class="col-sm-2 col-form-label">Name</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" name="name" class="form-control" id="inputEmail3" placeholder="Name">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputPassword3" class="col-sm-4 col-form-label">Application Endpoint (URL)</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input type="text" name="domain" class="form-control" id="inputPassword3" placeholder="https://google.com">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputPassword3" class="col-sm-4 col-form-label">Expected Response (Regex)</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input type="text" name="expected" class="form-control" id="inputPassword3" placeholder="string">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputPassword3" class="col-sm-4 col-form-label">Expected Status Code</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input type="number" name="expected_status" class="form-control" id="inputPassword3" placeholder="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputPassword3" class="col-sm-4 col-form-label">HTTP Method</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input type="text" name="method" class="form-control" id="inputPassword3" placeholder="GET">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputPassword3" class="col-sm-4 col-form-label">Check Interval</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input type="number" name="interval" class="form-control" id="inputPassword3" placeholder="10">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<button type="submit" class="btn btn-primary">Create</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
<script src="/js/Chart.bundle.min.js"></script>
|
<script src="/js/Chart.bundle.min.js"></script>
|
||||||
|
|
||||||
<title>Fusioner | Setup</title>
|
<title>Statup | Setup</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
|
|
||||||
<title>Fusioner | Users</title>
|
<title>Statup | Users</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@ -15,31 +15,31 @@
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
<a class="navbar-brand" href="#">Fusioner</a>
|
<a class="navbar-brand" href="#">Statup</a>
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
</button>
|
</button>
|
||||||
<div class="collapse navbar-collapse" id="navbarText">
|
<div class="collapse navbar-collapse" id="navbarText">
|
||||||
<ul class="navbar-nav mr-auto">
|
<ul class="navbar-nav mr-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/dashboard">Dashboard</a>
|
<a class="nav-link" href="/dashboard">Dashboard</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/tokens">Tokens</a>
|
<a class="nav-link" href="/services">Services</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item active">
|
<li class="nav-item active">
|
||||||
<a class="nav-link" href="/users">Users</a>
|
<a class="nav-link" href="/users">Users</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/permissions">Permissions</a>
|
<a class="nav-link" href="/plguins">Plugins</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<span class="navbar-text">
|
<span class="navbar-text">
|
||||||
<a class="nav-link" href="/logout">Logout</a>
|
<a class="nav-link" href="/logout">Logout</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
|
@ -64,7 +64,9 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<form action="/user/create" method="POST">
|
<h3>Create User</h3>
|
||||||
|
|
||||||
|
<form action="/users/create" method="POST">
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="inputEmail3" class="col-sm-2 col-form-label">Username</label>
|
<label for="inputEmail3" class="col-sm-2 col-form-label">Username</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
|
|
1
main.go
1
main.go
|
@ -73,7 +73,6 @@ func LoadConfig() *Config {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
yaml.Unmarshal(file, &config)
|
yaml.Unmarshal(file, &config)
|
||||||
store = sessions.NewCookieStore([]byte(config.Secret))
|
|
||||||
return &config
|
return &config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
25
services.go
25
services.go
|
@ -8,6 +8,10 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
services []Service
|
||||||
|
)
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
Id int64
|
Id int64
|
||||||
Name string
|
Name string
|
||||||
|
@ -62,6 +66,7 @@ func SelectAllServices() []Service {
|
||||||
func (s *Service) FormatData() *Service {
|
func (s *Service) FormatData() *Service {
|
||||||
s.GraphData()
|
s.GraphData()
|
||||||
s.AvgUptime()
|
s.AvgUptime()
|
||||||
|
s.Online24()
|
||||||
s.AvgTime()
|
s.AvgTime()
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
@ -74,6 +79,18 @@ func (s *Service) AvgTime() float64 {
|
||||||
return avg
|
return avg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) Online24() float64 {
|
||||||
|
total := s.TotalHits()
|
||||||
|
failed := s.TotalFailures24Hours()
|
||||||
|
if failed == 0 {
|
||||||
|
s.Online24Hours = 100.00
|
||||||
|
return s.Online24Hours
|
||||||
|
}
|
||||||
|
avg := float64(failed) / float64(total) * 100
|
||||||
|
s.Online24Hours = avg
|
||||||
|
return avg
|
||||||
|
}
|
||||||
|
|
||||||
type GraphJson struct {
|
type GraphJson struct {
|
||||||
X string `json:"x"`
|
X string `json:"x"`
|
||||||
Y float64 `json:"y"`
|
Y float64 `json:"y"`
|
||||||
|
@ -103,19 +120,19 @@ func (s *Service) AvgUptime() float64 {
|
||||||
return s.TotalUptime
|
return s.TotalUptime
|
||||||
}
|
}
|
||||||
percent := float64(failed) / float64(total) * 100
|
percent := float64(failed) / float64(total) * 100
|
||||||
fmt.Println(failed, total, percent)
|
|
||||||
s.TotalUptime = percent
|
s.TotalUptime = percent
|
||||||
return percent
|
return percent
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *Service) Create() int {
|
func (u *Service) Create() int {
|
||||||
var lastInsertId int
|
var lastInsertId int
|
||||||
db.QueryRow("INSERT INTO services(name, domain, expected, expected_status, created_at) VALUES($1,$2,$3,$4,NOW()) returning id;", u.Name, u.Domain, u.Expected, u.ExpectedStatus).Scan(&lastInsertId)
|
err := db.QueryRow("INSERT INTO services(name, domain, method, port, expected, expected_status, interval, created_at) VALUES($1,$2,$3,$4,$5,$6,$7,NOW()) returning id;", u.Name, u.Domain, u.Method, u.Port, u.Expected, u.ExpectedStatus, u.Interval).Scan(&lastInsertId)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
return lastInsertId
|
return lastInsertId
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSHA1Hash generates a new SHA1 hash based on
|
|
||||||
// a random number of characters.
|
|
||||||
func NewSHA1Hash(n ...int) string {
|
func NewSHA1Hash(n ...int) string {
|
||||||
noRandomCharacters := 32
|
noRandomCharacters := 32
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ CREATE INDEX idx_failures ON failures(service);
|
||||||
|
|
||||||
INSERT INTO users (id, username, password, created_at) VALUES (1, 'admin', '$2a$14$sBO5VDKiGPNUa3IUSMRX.OJNIbw/VM5dXOzTjlsjvG6qA987Lfzga', NOW());
|
INSERT INTO users (id, username, password, created_at) VALUES (1, 'admin', '$2a$14$sBO5VDKiGPNUa3IUSMRX.OJNIbw/VM5dXOzTjlsjvG6qA987Lfzga', NOW());
|
||||||
|
|
||||||
INSERT INTO services (id, name, domain, method, port, expected, expected_status, interval, created_at) VALUES (1, 'Google', 'https://www.google.com', 'https', 0, '', 200, 5, NOW());
|
INSERT INTO services (id, name, domain, method, port, expected, expected_status, interval, created_at) VALUES (1, 'Statup Demo', 'https://demo.statup.io', 'https', 0, '', 200, 5, NOW());
|
||||||
|
|
||||||
INSERT INTO services (id, name, domain, method, port, expected, expected_status, interval, created_at) VALUES (2, 'Github', 'https://github.com', 'https', 0, '', 200, 10, NOW());
|
INSERT INTO services (id, name, domain, method, port, expected, expected_status, interval, created_at) VALUES (2, 'Github', 'https://github.com', 'https', 0, '', 200, 10, NOW());
|
||||||
|
|
||||||
|
|
73
web.go
73
web.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
type dashboard struct {
|
type dashboard struct {
|
||||||
|
@ -25,9 +26,9 @@ func RunHTTPServer() {
|
||||||
http.Handle("/login", http.HandlerFunc(LoginHandler))
|
http.Handle("/login", http.HandlerFunc(LoginHandler))
|
||||||
http.Handle("/logout", http.HandlerFunc(LogoutHandler))
|
http.Handle("/logout", http.HandlerFunc(LogoutHandler))
|
||||||
//http.Handle("/auth", http.HandlerFunc(AuthenticateHandler))
|
//http.Handle("/auth", http.HandlerFunc(AuthenticateHandler))
|
||||||
http.Handle("/user/create", http.HandlerFunc(CreateUserHandler))
|
http.Handle("/users/create", http.HandlerFunc(CreateUserHandler))
|
||||||
http.Handle("/token/create", http.HandlerFunc(CreateServiceHandler))
|
http.Handle("/services/create", http.HandlerFunc(CreateServiceHandler))
|
||||||
http.Handle("/tokens", http.HandlerFunc(ServicesHandler))
|
http.Handle("/services", http.HandlerFunc(ServicesHandler))
|
||||||
http.Handle("/users", http.HandlerFunc(UsersHandler))
|
http.Handle("/users", http.HandlerFunc(UsersHandler))
|
||||||
http.ListenAndServe(":8080", nil)
|
http.ListenAndServe(":8080", nil)
|
||||||
}
|
}
|
||||||
|
@ -44,7 +45,9 @@ func LoginHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
r.ParseForm()
|
r.ParseForm()
|
||||||
username := r.PostForm.Get("username")
|
username := r.PostForm.Get("username")
|
||||||
password := r.PostForm.Get("password")
|
password := r.PostForm.Get("password")
|
||||||
_, auth := AuthUser(username, password)
|
user, auth := AuthUser(username, password)
|
||||||
|
fmt.Println(user)
|
||||||
|
fmt.Println(auth)
|
||||||
if auth {
|
if auth {
|
||||||
session.Values["authenticated"] = true
|
session.Values["authenticated"] = true
|
||||||
session.Save(r, w)
|
session.Save(r, w)
|
||||||
|
@ -86,8 +89,26 @@ func CreateUserHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateServiceHandler(w http.ResponseWriter, r *http.Request) {
|
func CreateServiceHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
token := &Service{}
|
r.ParseForm()
|
||||||
token.Create()
|
name := r.PostForm.Get("name")
|
||||||
|
domain := r.PostForm.Get("domain")
|
||||||
|
method := r.PostForm.Get("method")
|
||||||
|
expected := r.PostForm.Get("expected")
|
||||||
|
status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
|
||||||
|
interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
|
||||||
|
|
||||||
|
service := &Service{
|
||||||
|
Name: name,
|
||||||
|
Domain: domain,
|
||||||
|
Method: method,
|
||||||
|
Expected: expected,
|
||||||
|
ExpectedStatus: status,
|
||||||
|
Interval: interval,
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(service)
|
||||||
|
|
||||||
|
service.Create()
|
||||||
http.Redirect(w, r, "/services", http.StatusSeeOther)
|
http.Redirect(w, r, "/services", http.StatusSeeOther)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,29 +144,35 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return template.JS(html)
|
return template.JS(html)
|
||||||
},
|
},
|
||||||
}).Parse(indexFile)
|
}).Parse(indexFile)
|
||||||
out := index{SelectAllServices()}
|
out := index{services}
|
||||||
indexTmpl.Execute(w, out)
|
indexTmpl.Execute(w, out)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DashboardHandler(w http.ResponseWriter, r *http.Request) {
|
func DashboardHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
//session, _ := store.Get(r, "apizer_auth")
|
session, _ := store.Get(r, "apizer_auth")
|
||||||
//if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
|
if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
|
||||||
// http.Redirect(w, r, "/", http.StatusSeeOther)
|
loginFile, err := tmplBox.String("login.html")
|
||||||
// return
|
if err != nil {
|
||||||
//}
|
panic(err)
|
||||||
|
}
|
||||||
dashboardFile, err := tmplBox.String("dashboard.html")
|
loginTmpl, err := template.New("message").Parse(loginFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
dashboardTmpl, err := template.New("message").Parse(dashboardFile)
|
loginTmpl.Execute(w, nil)
|
||||||
if err != nil {
|
} else {
|
||||||
panic(err)
|
dashboardFile, err := tmplBox.String("dashboard.html")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
dashboardTmpl, err := template.New("message").Parse(dashboardFile)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
out := dashboard{SelectAllServices(), SelectAllUsers(), core}
|
||||||
|
dashboardTmpl.Execute(w, out)
|
||||||
}
|
}
|
||||||
|
|
||||||
out := dashboard{SelectAllServices(), SelectAllUsers(), core}
|
|
||||||
|
|
||||||
dashboardTmpl.Execute(w, out)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ServicesHandler(w http.ResponseWriter, r *http.Request) {
|
func ServicesHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
Loading…
Reference in New Issue