2017-06-21 15:23:33 -06:00
|
|
|
package restserver
|
|
|
|
|
|
|
|
import (
|
2020-05-04 01:28:13 +08:00
|
|
|
"fmt"
|
2017-06-21 15:23:33 -06:00
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
2020-05-04 01:28:13 +08:00
|
|
|
"path/filepath"
|
2017-06-21 15:23:33 -06:00
|
|
|
|
|
|
|
"github.com/gorilla/handlers"
|
Add Prometheus metrics
Exposes a few metrics for Prometheus under /metrics if started with --prometheus.
Example:
# HELP rest_server_blob_read_bytes_total Total number of bytes read from blobs
# TYPE rest_server_blob_read_bytes_total counter
rest_server_blob_read_bytes_total{repo="test",type="data"} 2.13557024e+09
rest_server_blob_read_bytes_total{repo="test",type="index"} 1.198653e+06
rest_server_blob_read_bytes_total{repo="test",type="keys"} 5388
rest_server_blob_read_bytes_total{repo="test",type="locks"} 1975
rest_server_blob_read_bytes_total{repo="test",type="snapshots"} 10018
# HELP rest_server_blob_read_total Total number of blobs read
# TYPE rest_server_blob_read_total counter
rest_server_blob_read_total{repo="test",type="data"} 3985
rest_server_blob_read_total{repo="test",type="index"} 21
rest_server_blob_read_total{repo="test",type="keys"} 12
rest_server_blob_read_total{repo="test",type="locks"} 12
rest_server_blob_read_total{repo="test",type="snapshots"} 32
# HELP rest_server_blob_write_bytes_total Total number of bytes written to blobs
# TYPE rest_server_blob_write_bytes_total counter
rest_server_blob_write_bytes_total{repo="test",type="data"} 1.063726179e+09
rest_server_blob_write_bytes_total{repo="test",type="index"} 395586
rest_server_blob_write_bytes_total{repo="test",type="locks"} 1975
rest_server_blob_write_bytes_total{repo="test",type="snapshots"} 1933
# HELP rest_server_blob_write_total Total number of blobs written
# TYPE rest_server_blob_write_total counter
rest_server_blob_write_total{repo="test",type="data"} 226
rest_server_blob_write_total{repo="test",type="index"} 6
rest_server_blob_write_total{repo="test",type="locks"} 12
rest_server_blob_write_total{repo="test",type="snapshots"} 6
2017-10-24 23:03:50 +08:00
|
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
2020-05-04 01:28:13 +08:00
|
|
|
"github.com/restic/rest-server/quota"
|
2017-06-21 15:23:33 -06:00
|
|
|
)
|
|
|
|
|
2020-05-31 21:36:39 +08:00
|
|
|
const (
|
|
|
|
GiB = 1024 * 1024 * 1024
|
|
|
|
)
|
|
|
|
|
2018-06-14 15:53:29 -06:00
|
|
|
func (s *Server) debugHandler(next http.Handler) http.Handler {
|
2017-06-21 15:23:33 -06:00
|
|
|
return http.HandlerFunc(
|
|
|
|
func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
log.Printf("%s %s", r.Method, r.URL)
|
|
|
|
next.ServeHTTP(w, r)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2018-06-14 15:53:29 -06:00
|
|
|
func (s *Server) logHandler(next http.Handler) http.Handler {
|
2018-04-15 08:31:50 -06:00
|
|
|
accessLog, err := os.OpenFile(s.Log, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
2017-06-21 15:23:33 -06:00
|
|
|
if err != nil {
|
2017-07-30 17:45:23 +02:00
|
|
|
log.Fatalf("error: %v", err)
|
2017-06-21 15:23:33 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
return handlers.CombinedLoggingHandler(accessLog, next)
|
|
|
|
}
|
|
|
|
|
2020-05-04 01:28:13 +08:00
|
|
|
func (s *Server) checkAuth(r *http.Request) (username string, ok bool) {
|
|
|
|
if s.NoAuth {
|
|
|
|
return username, true
|
|
|
|
}
|
|
|
|
var password string
|
|
|
|
username, password, ok = r.BasicAuth()
|
|
|
|
if !ok || !s.htpasswdFile.Validate(username, password) {
|
|
|
|
return "", false
|
|
|
|
}
|
|
|
|
return username, true
|
|
|
|
}
|
2017-06-21 15:23:33 -06:00
|
|
|
|
2020-05-04 01:28:13 +08:00
|
|
|
// NewHandler returns the master HTTP multiplexer/router.
|
|
|
|
func NewHandler(server *Server) (http.Handler, error) {
|
|
|
|
if !server.NoAuth {
|
|
|
|
var err error
|
|
|
|
server.htpasswdFile, err = NewHtpasswdFromFile(filepath.Join(server.Path, ".htpasswd"))
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("cannot load .htpasswd (use --no-auth to disable): %v", err)
|
|
|
|
}
|
2017-06-21 15:23:33 -06:00
|
|
|
}
|
|
|
|
|
2020-05-04 01:28:13 +08:00
|
|
|
if server.MaxRepoSize > 0 {
|
|
|
|
log.Printf("Initializing quota (can take a while)...")
|
|
|
|
qm, err := quota.New(server.Path, server.MaxRepoSize)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
server.quotaManager = qm
|
2021-01-04 15:29:18 +08:00
|
|
|
log.Printf("Quota initialized, currently using %.2f GiB", float64(qm.SpaceUsed())/GiB)
|
2017-06-21 15:23:33 -06:00
|
|
|
}
|
|
|
|
|
2020-05-04 01:28:13 +08:00
|
|
|
mux := http.NewServeMux()
|
2018-04-15 08:31:50 -06:00
|
|
|
if server.Prometheus {
|
2020-05-04 01:28:13 +08:00
|
|
|
// FIXME: need auth like in previous version?
|
|
|
|
mux.Handle("/metrics", promhttp.Handler())
|
Add Prometheus metrics
Exposes a few metrics for Prometheus under /metrics if started with --prometheus.
Example:
# HELP rest_server_blob_read_bytes_total Total number of bytes read from blobs
# TYPE rest_server_blob_read_bytes_total counter
rest_server_blob_read_bytes_total{repo="test",type="data"} 2.13557024e+09
rest_server_blob_read_bytes_total{repo="test",type="index"} 1.198653e+06
rest_server_blob_read_bytes_total{repo="test",type="keys"} 5388
rest_server_blob_read_bytes_total{repo="test",type="locks"} 1975
rest_server_blob_read_bytes_total{repo="test",type="snapshots"} 10018
# HELP rest_server_blob_read_total Total number of blobs read
# TYPE rest_server_blob_read_total counter
rest_server_blob_read_total{repo="test",type="data"} 3985
rest_server_blob_read_total{repo="test",type="index"} 21
rest_server_blob_read_total{repo="test",type="keys"} 12
rest_server_blob_read_total{repo="test",type="locks"} 12
rest_server_blob_read_total{repo="test",type="snapshots"} 32
# HELP rest_server_blob_write_bytes_total Total number of bytes written to blobs
# TYPE rest_server_blob_write_bytes_total counter
rest_server_blob_write_bytes_total{repo="test",type="data"} 1.063726179e+09
rest_server_blob_write_bytes_total{repo="test",type="index"} 395586
rest_server_blob_write_bytes_total{repo="test",type="locks"} 1975
rest_server_blob_write_bytes_total{repo="test",type="snapshots"} 1933
# HELP rest_server_blob_write_total Total number of blobs written
# TYPE rest_server_blob_write_total counter
rest_server_blob_write_total{repo="test",type="data"} 226
rest_server_blob_write_total{repo="test",type="index"} 6
rest_server_blob_write_total{repo="test",type="locks"} 12
rest_server_blob_write_total{repo="test",type="snapshots"} 6
2017-10-24 23:03:50 +08:00
|
|
|
}
|
2020-05-04 01:28:13 +08:00
|
|
|
mux.Handle("/", server)
|
Add Prometheus metrics
Exposes a few metrics for Prometheus under /metrics if started with --prometheus.
Example:
# HELP rest_server_blob_read_bytes_total Total number of bytes read from blobs
# TYPE rest_server_blob_read_bytes_total counter
rest_server_blob_read_bytes_total{repo="test",type="data"} 2.13557024e+09
rest_server_blob_read_bytes_total{repo="test",type="index"} 1.198653e+06
rest_server_blob_read_bytes_total{repo="test",type="keys"} 5388
rest_server_blob_read_bytes_total{repo="test",type="locks"} 1975
rest_server_blob_read_bytes_total{repo="test",type="snapshots"} 10018
# HELP rest_server_blob_read_total Total number of blobs read
# TYPE rest_server_blob_read_total counter
rest_server_blob_read_total{repo="test",type="data"} 3985
rest_server_blob_read_total{repo="test",type="index"} 21
rest_server_blob_read_total{repo="test",type="keys"} 12
rest_server_blob_read_total{repo="test",type="locks"} 12
rest_server_blob_read_total{repo="test",type="snapshots"} 32
# HELP rest_server_blob_write_bytes_total Total number of bytes written to blobs
# TYPE rest_server_blob_write_bytes_total counter
rest_server_blob_write_bytes_total{repo="test",type="data"} 1.063726179e+09
rest_server_blob_write_bytes_total{repo="test",type="index"} 395586
rest_server_blob_write_bytes_total{repo="test",type="locks"} 1975
rest_server_blob_write_bytes_total{repo="test",type="snapshots"} 1933
# HELP rest_server_blob_write_total Total number of blobs written
# TYPE rest_server_blob_write_total counter
rest_server_blob_write_total{repo="test",type="data"} 226
rest_server_blob_write_total{repo="test",type="index"} 6
rest_server_blob_write_total{repo="test",type="locks"} 12
rest_server_blob_write_total{repo="test",type="snapshots"} 6
2017-10-24 23:03:50 +08:00
|
|
|
|
2020-05-04 01:28:13 +08:00
|
|
|
var handler http.Handler = mux
|
|
|
|
if server.Debug {
|
|
|
|
handler = server.debugHandler(handler)
|
|
|
|
}
|
|
|
|
if server.Log != "" {
|
|
|
|
handler = server.logHandler(handler)
|
|
|
|
}
|
|
|
|
return handler, nil
|
2017-06-21 15:23:33 -06:00
|
|
|
}
|