mirror of https://github.com/statping/statping
signal graceful method, create service url
parent
05ff5c5e2e
commit
d9e03871f3
14
Makefile
14
Makefile
|
@ -73,13 +73,21 @@ run: build
|
||||||
|
|
||||||
# run Statping with Delve for debugging
|
# run Statping with Delve for debugging
|
||||||
rundlv:
|
rundlv:
|
||||||
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./$(BINARY_NAME)
|
lsof -ti:8080 | xargs kill
|
||||||
|
DB_CONN=sqlite DB_HOST=localhost DB_DATABASE=sqlite DB_PASS=none DB_USER=none GO_ENV=test \
|
||||||
|
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./statping
|
||||||
|
|
||||||
|
killdlv:
|
||||||
|
lsof -ti:2345 | xargs kill
|
||||||
|
|
||||||
builddlv:
|
builddlv:
|
||||||
$(GOBUILD) -gcflags "all=-N -l" -o ./$(BINARY_NAME) -v ./cmd
|
$(GOBUILD) -gcflags "all=-N -l" -o ./$(BINARY_NAME) -v ./cmd
|
||||||
|
|
||||||
watch:
|
watch:
|
||||||
reflex -v -r '\.go' -s -- sh -c 'make builddlv && make rundlv'
|
find . -print | grep -i '.*\.\(go\|gohtml\)' | justrun -v -c \
|
||||||
|
'go build -v -gcflags "all=-N -l" -o statping ./cmd && make rundlv &' \
|
||||||
|
-delay 10s -stdin \
|
||||||
|
-i="Makefile,statping,statup.db,statup.db-journal,handlers/graphql/generated.go"
|
||||||
|
|
||||||
# compile assets using SASS and Rice. compiles scss -> css, and run rice embed-go
|
# compile assets using SASS and Rice. compiles scss -> css, and run rice embed-go
|
||||||
compile: generate
|
compile: generate
|
||||||
|
@ -250,7 +258,7 @@ clean:
|
||||||
rm -rf dev/test/cypress/videos
|
rm -rf dev/test/cypress/videos
|
||||||
rm -f coverage.* sass
|
rm -f coverage.* sass
|
||||||
rm -f source/rice-box.go
|
rm -f source/rice-box.go
|
||||||
rm -f *.db-journal
|
rm -rf **/*.db-journal
|
||||||
rm -rf *.snap
|
rm -rf *.snap
|
||||||
find . -name "*.out" -type f -delete
|
find . -name "*.out" -type f -delete
|
||||||
find . -name "*.cpu" -type f -delete
|
find . -name "*.cpu" -type f -delete
|
||||||
|
|
12
cmd/main.go
12
cmd/main.go
|
@ -25,6 +25,8 @@ import (
|
||||||
"github.com/hunterlong/statping/utils"
|
"github.com/hunterlong/statping/utils"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"os"
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -61,6 +63,7 @@ func parseFlags() {
|
||||||
// main will run the Statping application
|
// main will run the Statping application
|
||||||
func main() {
|
func main() {
|
||||||
var err error
|
var err error
|
||||||
|
go sigterm()
|
||||||
parseFlags()
|
parseFlags()
|
||||||
loadDotEnvs()
|
loadDotEnvs()
|
||||||
source.Assets()
|
source.Assets()
|
||||||
|
@ -92,6 +95,15 @@ func main() {
|
||||||
mainProcess()
|
mainProcess()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sigterm will attempt to close the database connections gracefully
|
||||||
|
func sigterm() {
|
||||||
|
sigs := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL)
|
||||||
|
<-sigs
|
||||||
|
core.CloseDB()
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
// loadDotEnvs attempts to load database configs from a '.env' file in root directory
|
// loadDotEnvs attempts to load database configs from a '.env' file in root directory
|
||||||
func loadDotEnvs() error {
|
func loadDotEnvs() error {
|
||||||
err := godotenv.Load()
|
err := godotenv.Load()
|
||||||
|
|
|
@ -44,6 +44,7 @@ func InsertSampleData() error {
|
||||||
Order: 1,
|
Order: 1,
|
||||||
GroupId: 1,
|
GroupId: 1,
|
||||||
Permalink: types.NewNullString("google"),
|
Permalink: types.NewNullString("google"),
|
||||||
|
VerifySSL: types.NewNullBool(true),
|
||||||
CreatedAt: createdOn,
|
CreatedAt: createdOn,
|
||||||
})
|
})
|
||||||
s2 := ReturnService(&types.Service{
|
s2 := ReturnService(&types.Service{
|
||||||
|
@ -56,6 +57,7 @@ func InsertSampleData() error {
|
||||||
Timeout: 20,
|
Timeout: 20,
|
||||||
Order: 2,
|
Order: 2,
|
||||||
Permalink: types.NewNullString("statping_github"),
|
Permalink: types.NewNullString("statping_github"),
|
||||||
|
VerifySSL: types.NewNullBool(true),
|
||||||
CreatedAt: createdOn,
|
CreatedAt: createdOn,
|
||||||
})
|
})
|
||||||
s3 := ReturnService(&types.Service{
|
s3 := ReturnService(&types.Service{
|
||||||
|
@ -68,6 +70,7 @@ func InsertSampleData() error {
|
||||||
Timeout: 30,
|
Timeout: 30,
|
||||||
Order: 3,
|
Order: 3,
|
||||||
Public: types.NewNullBool(true),
|
Public: types.NewNullBool(true),
|
||||||
|
VerifySSL: types.NewNullBool(true),
|
||||||
GroupId: 2,
|
GroupId: 2,
|
||||||
CreatedAt: createdOn,
|
CreatedAt: createdOn,
|
||||||
})
|
})
|
||||||
|
@ -83,6 +86,7 @@ func InsertSampleData() error {
|
||||||
Timeout: 30,
|
Timeout: 30,
|
||||||
Order: 4,
|
Order: 4,
|
||||||
Public: types.NewNullBool(true),
|
Public: types.NewNullBool(true),
|
||||||
|
VerifySSL: types.NewNullBool(true),
|
||||||
GroupId: 2,
|
GroupId: 2,
|
||||||
CreatedAt: createdOn,
|
CreatedAt: createdOn,
|
||||||
})
|
})
|
||||||
|
|
|
@ -89,10 +89,10 @@ func Router() *mux.Router {
|
||||||
|
|
||||||
// SERVICE Routes
|
// SERVICE Routes
|
||||||
r.Handle("/services", authenticated(servicesHandler, true)).Methods("GET")
|
r.Handle("/services", authenticated(servicesHandler, true)).Methods("GET")
|
||||||
|
r.Handle("/service/create", authenticated(createServiceHandler, true)).Methods("GET")
|
||||||
r.Handle("/service/{id}", http.HandlerFunc(servicesViewHandler)).Methods("GET")
|
r.Handle("/service/{id}", http.HandlerFunc(servicesViewHandler)).Methods("GET")
|
||||||
r.Handle("/service/{id}/edit", authenticated(servicesViewHandler, true)).Methods("GET")
|
r.Handle("/service/{id}/edit", authenticated(servicesViewHandler, true)).Methods("GET")
|
||||||
r.Handle("/service/{id}/delete_failures", authenticated(servicesDeleteFailuresHandler, true)).Methods("GET")
|
r.Handle("/service/{id}/delete_failures", authenticated(servicesDeleteFailuresHandler, true)).Methods("GET")
|
||||||
r.Handle("/service/create", authenticated(createServiceHandler, true)).Methods("GET")
|
|
||||||
|
|
||||||
r.Handle("/group/{id}", http.HandlerFunc(groupViewHandler)).Methods("GET")
|
r.Handle("/group/{id}", http.HandlerFunc(groupViewHandler)).Methods("GET")
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
|
|
||||||
.card-body {
|
.card-body {
|
||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
padding: 0px 10px;
|
padding: 10px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lg_number {
|
.lg_number {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
{{else}}
|
{{else}}
|
||||||
<form class="ajax_form" action="/api/services" data-redirect="/services" method="POST">
|
<form class="ajax_form" action="/api/services" data-redirect="/services" method="POST">
|
||||||
{{end}}
|
{{end}}
|
||||||
|
<h4 class="mb-5 text-muted">Basic Information</h4>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="service_name" class="col-sm-4 col-form-label">Service Name</label>
|
<label for="service_name" class="col-sm-4 col-form-label">Service Name</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
@ -33,6 +34,21 @@
|
||||||
<small class="form-text text-muted">Statping will attempt to connect to this URL</small>
|
<small class="form-text text-muted">Statping will attempt to connect to this URL</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="service_type" class="col-sm-4 col-form-label">Group</label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<select name="group_id" class="form-control" id="group_id">
|
||||||
|
<option value="0" {{if eq $s.GroupId 0}}selected{{end}}>None</option>
|
||||||
|
{{range Groups false}}
|
||||||
|
<option value="{{.Id}}" {{if eq $s.GroupId .Id}}selected{{end}}>{{.Name}}</option>
|
||||||
|
{{end}}
|
||||||
|
</select>
|
||||||
|
<small class="form-text text-muted">Attach this service to a group</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="mt-5 mb-5 text-muted">Request Details</h4>
|
||||||
|
|
||||||
<div class="form-group row{{if (eq .Type "tcp") or (eq .Type "udp")}} d-none{{end}}">
|
<div class="form-group row{{if (eq .Type "tcp") or (eq .Type "udp")}} d-none{{end}}">
|
||||||
<label for="service_check_type" class="col-sm-4 col-form-label">Service Check Type</label>
|
<label for="service_check_type" class="col-sm-4 col-form-label">Service Check Type</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
@ -80,6 +96,9 @@
|
||||||
<input type="number" name="port" class="form-control" value="{{if ne .Port 0}}{{.Port}}{{end}}" id="service_port" placeholder="8080">
|
<input type="number" name="port" class="form-control" value="{{if ne .Port 0}}{{.Port}}{{end}}" id="service_port" placeholder="8080">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h4 class="mt-5 mb-5 text-muted">Additional Options</h4>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="service_interval" class="col-sm-4 col-form-label">Check Interval (Seconds)</label>
|
<label for="service_interval" class="col-sm-4 col-form-label">Check Interval (Seconds)</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
@ -138,18 +157,6 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
|
||||||
<label for="service_type" class="col-sm-4 col-form-label">Group</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select name="group_id" class="form-control" id="group_id">
|
|
||||||
<option value="0" {{if eq $s.GroupId 0}}selected{{end}}>None</option>
|
|
||||||
{{range Groups false}}
|
|
||||||
<option value="{{.Id}}" {{if eq $s.GroupId .Id}}selected{{end}}>{{.Name}}</option>
|
|
||||||
{{end}}
|
|
||||||
</select>
|
|
||||||
<small class="form-text text-muted">Attach this service to a group</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="{{if ne .Id 0}}col-6{{else}}col-12{{end}}">
|
<div class="{{if ne .Id 0}}col-6{{else}}col-12{{end}}">
|
||||||
<button type="submit" class="btn btn-success btn-block">{{if ne .Id 0}}Update Service{{else}}Create Service{{end}}</button>
|
<button type="submit" class="btn btn-success btn-block">{{if ne .Id 0}}Update Service{{else}}Create Service{{end}}</button>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
{{template "nav"}}
|
{{template "nav"}}
|
||||||
{{if .}}
|
{{if .}}
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h3>Messages</h3>
|
<h1 class="text-black-50">Messages</h1>
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if Auth}}
|
{{if Auth}}
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h3>Create Message</h3>
|
<h1 class="text-black-50 mt-5">Create Message</h1>
|
||||||
{{template "form_message" NewMessage}}
|
{{template "form_message" NewMessage}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -56,4 +56,4 @@ $(document).ready(function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
{{define "title"}}Statping | Create Service{{end}}
|
||||||
|
{{define "content"}}
|
||||||
|
<div class="container col-md-7 col-sm-12 mt-md-5 bg-light">
|
||||||
|
{{template "nav"}}
|
||||||
|
<div class="col-12">
|
||||||
|
{{template "form_service" NewService}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
|
@ -5,7 +5,9 @@
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
{{if ne (len .Services) 0}}
|
{{if ne (len .Services) 0}}
|
||||||
<h3>Services</h3>
|
<h1 class="text-black-50">Services <a href="/service/create" class="btn btn-outline-success mt-1 float-right">
|
||||||
|
<i class="fas fa-plus"></i> Create</a>
|
||||||
|
</h1>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -21,7 +23,7 @@
|
||||||
<tr id="service_{{.Id}}" data-id="{{.Id}}">
|
<tr id="service_{{.Id}}" data-id="{{.Id}}">
|
||||||
<td><span class="drag_icon d-none d-md-inline"><i class="fas fa-bars"></i></span> {{.Name}}</td>
|
<td><span class="drag_icon d-none d-md-inline"><i class="fas fa-bars"></i></span> {{.Name}}</td>
|
||||||
<td class="d-none d-md-table-cell">{{if .Online}}<span class="badge badge-success">ONLINE</span>{{else}}<span class="badge badge-danger">OFFLINE</span>{{end}}
|
<td class="d-none d-md-table-cell">{{if .Online}}<span class="badge badge-success">ONLINE</span>{{else}}<span class="badge badge-danger">OFFLINE</span>{{end}}
|
||||||
<i class="toggle-service fas {{if .IsRunning}}fa-toggle-on text-success{{else}}fa-toggle-off text-muted{{end}}" data-online="{{if .IsRunning}}true{{else}}false{{end}}" data-id="{{.Id}}"></i>
|
<i class="toggle-service fas {{if .IsRunning}}fa-toggle-on{{else}}fa-toggle-off{{end}} {{if .Online}}text-success{{else}}text-danger{{end}}" data-online="{{if .IsRunning}}true{{else}}false{{end}}" data-id="{{.Id}}"></i>
|
||||||
</td>
|
</td>
|
||||||
<td class="d-none d-md-table-cell">{{if .Public.Bool}}<span class="badge badge-primary">PUBLIC</span>{{else}}<span class="badge badge-secondary">PRIVATE</span>{{end}}</td>
|
<td class="d-none d-md-table-cell">{{if .Public.Bool}}<span class="badge badge-primary">PUBLIC</span>{{else}}<span class="badge badge-secondary">PRIVATE</span>{{end}}</td>
|
||||||
<td class="d-none d-md-table-cell">{{if ne .GroupId 0}}<span class="badge badge-secondary">{{(Group .GroupId).Name}}</span>{{end}}</td>
|
<td class="d-none d-md-table-cell">{{if ne .GroupId 0}}<span class="badge badge-secondary">{{(Group .GroupId).Name}}</span>{{end}}</td>
|
||||||
|
@ -36,14 +38,10 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if Auth}}
|
|
||||||
<h3>Create Service</h3>
|
|
||||||
{{template "form_service" NewService}}
|
|
||||||
{{end}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 mt-3">
|
<div class="col-12 mt-5">
|
||||||
<h3>Groups</h3>
|
<h1 class="text-muted">Groups</h1>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -70,7 +68,7 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{if Auth}}
|
{{if Auth}}
|
||||||
<h3>Create Group</h3>
|
<h1 class="text-muted mt-5">Create Group</h1>
|
||||||
{{template "form_group" NewGroup}}
|
{{template "form_group" NewGroup}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,13 +6,16 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 col-sm-12 mb-4 mb-md-0">
|
<div class="col-md-3 col-sm-12 mb-4 mb-md-0">
|
||||||
<div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
|
<div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
|
||||||
|
<h6 class="text-muted">Main Settings</h6>
|
||||||
<a class="nav-link active" id="v-pills-home-tab" data-toggle="pill" href="#v-pills-home" role="tab" aria-controls="v-pills-home" aria-selected="true"><i class="fa fa-cogs"></i> Settings</a>
|
<a class="nav-link active" id="v-pills-home-tab" data-toggle="pill" href="#v-pills-home" role="tab" aria-controls="v-pills-home" aria-selected="true"><i class="fa fa-cogs"></i> Settings</a>
|
||||||
<a class="nav-link" id="v-pills-notifications-tab" data-toggle="pill" href="#v-pills-notifications" role="tab" aria-controls="v-pills-notifications" aria-selected="true"><i class="fa fa-cogs"></i> Notifications</a>
|
<a class="nav-link" id="v-pills-notifications-tab" data-toggle="pill" href="#v-pills-notifications" role="tab" aria-controls="v-pills-notifications" aria-selected="true"><i class="fa fa-bell"></i> Notifications</a>
|
||||||
<h6>Notifiers</h6>
|
|
||||||
<a class="nav-link" id="v-pills-style-tab" data-toggle="pill" href="#v-pills-style" role="tab" aria-controls="v-pills-style" aria-selected="false"><i class="fa fa-image"></i> Theme Editor</a>
|
<a class="nav-link" id="v-pills-style-tab" data-toggle="pill" href="#v-pills-style" role="tab" aria-controls="v-pills-style" aria-selected="false"><i class="fa fa-image"></i> Theme Editor</a>
|
||||||
<a class="nav-link" id="v-pills-cache-tab" data-toggle="pill" href="#v-pills-cache" role="tab" aria-controls="v-pills-cache" aria-selected="false"><i class="fa fa-paperclip"></i> Cache</a>
|
<a class="nav-link" id="v-pills-cache-tab" data-toggle="pill" href="#v-pills-cache" role="tab" aria-controls="v-pills-cache" aria-selected="false"><i class="fa fa-paperclip"></i> Cache</a>
|
||||||
|
<h6 class="mt-4 text-muted">Notifiers</h6>
|
||||||
|
|
||||||
{{ range .Notifications }}
|
{{ range .Notifications }}
|
||||||
<a class="nav-link text-capitalize" id="v-pills-{{underscore .Select.Method}}-tab" data-toggle="pill" href="#v-pills-{{underscore .Select.Method}}" role="tab" aria-controls="v-pills-{{underscore .Select.Method}}" aria-selected="false"><i class="{{.Select.Icon}}"></i> {{.Select.Method}}<span class="badge badge-success float-right">4</span></a>
|
<a class="nav-link text-capitalize" id="v-pills-{{underscore .Select.Method}}-tab" data-toggle="pill" href="#v-pills-{{underscore .Select.Method}}" role="tab" aria-controls="v-pills-{{underscore .Select.Method}}" aria-selected="false"><i class="{{.Select.Icon}}"></i> {{.Select.Method}}
|
||||||
|
{{if .Select.Enabled.Bool}}<span class="badge badge-light float-right mt-1"><div class="fas fa-check text-success"></div></span>{{end}}</a>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<a class="nav-link d-none" id="v-pills-backups-tab" data-toggle="pill" href="#v-pills-backups" role="tab" aria-controls="v-pills-backups" aria-selected="false">Backups</a>
|
<a class="nav-link d-none" id="v-pills-backups-tab" data-toggle="pill" href="#v-pills-backups" role="tab" aria-controls="v-pills-backups" aria-selected="false">Backups</a>
|
||||||
{{ range .Plugins }}
|
{{ range .Plugins }}
|
||||||
|
@ -26,8 +29,6 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
<div class="tab-content" id="v-pills-tabContent">
|
<div class="tab-content" id="v-pills-tabContent">
|
||||||
<div class="tab-pane fade show active" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab">
|
<div class="tab-pane fade show active" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab">
|
||||||
<h3>Settings</h3>
|
|
||||||
|
|
||||||
<form method="POST" action="/settings">
|
<form method="POST" action="/settings">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="project">Project Name</label>
|
<label for="project">Project Name</label>
|
||||||
|
@ -125,7 +126,7 @@
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<h3 class="mt-4">Bulk Import Services</h3>
|
<h2 class="mt-5">Bulk Import Services</h2>
|
||||||
You can import multiple services based on a CSV file with the format shown on the <a href="https://github.com/hunterlong/statping/wiki/Bulk-Import-Services" target="_blank">Bulk Import Wiki</a>.
|
You can import multiple services based on a CSV file with the format shown on the <a href="https://github.com/hunterlong/statping/wiki/Bulk-Import-Services" target="_blank">Bulk Import Wiki</a>.
|
||||||
|
|
||||||
<div class="card mt-2">
|
<div class="card mt-2">
|
||||||
|
@ -141,22 +142,18 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<h3 class="mt-4">Additional Settings</h3>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
{{if .Domain}}
|
{{if .Domain}}
|
||||||
<div class="row align-content-center">
|
<h2 class="mt-5">Additional Settings</h2>
|
||||||
<img class="rounded text-center" width="300" height="300" src="https://chart.googleapis.com/chart?chs=500x500&cht=qr&chl={{ QrAuth }}">
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="row align-content-center">
|
||||||
|
<img class="rounded text-center" width="300" height="300" src="https://chart.googleapis.com/chart?chs=500x500&cht=qr&chl={{ QrAuth }}">
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-sm btn-primary" href={{safeURL QrAuth}}>Open in Statping App</a>
|
||||||
|
<a href="/settings/export" class="btn btn-sm btn-secondary">Export Settings</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a class="btn btn-sm btn-primary" href={{safeURL QrAuth}}>Open in Statping App</a>
|
|
||||||
<a href="/settings/export" class="btn btn-sm btn-secondary">Export Settings</a>
|
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane" id="v-pills-notifications" role="tabpanel" aria-labelledby="v-pills-notifications-tab">
|
<div class="tab-pane" id="v-pills-notifications" role="tabpanel" aria-labelledby="v-pills-notifications-tab">
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<div class="container col-md-7 col-sm-12 mt-md-5 bg-light">
|
<div class="container col-md-7 col-sm-12 mt-md-5 bg-light">
|
||||||
{{template "nav"}}
|
{{template "nav"}}
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h3>Users</h3>
|
<h1 class="text-black-50">Users</h1>
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{if Auth}}
|
{{if Auth}}
|
||||||
<h3>Create User</h3>
|
<h1 class="text-black-50 mt-5">Create User</h1>
|
||||||
{{template "form_user" NewUser}}
|
{{template "form_user" NewUser}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue