7eb5b01169
some basic counters and gauges are now exposed
78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
// Package api implements REST API for sftpgo.
|
|
// REST API allows to manage users and quota and to get real time reports for the active connections
|
|
// with possibility of forcibly closing a connection.
|
|
// The OpenAPI 3 schema for the exposed API can be found inside the source tree:
|
|
// https://github.com/drakkan/sftpgo/tree/master/api/schema/openapi.yaml
|
|
package api
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/drakkan/sftpgo/dataprovider"
|
|
"github.com/go-chi/chi"
|
|
"github.com/go-chi/render"
|
|
)
|
|
|
|
const (
|
|
logSender = "api"
|
|
activeConnectionsPath = "/api/v1/connection"
|
|
quotaScanPath = "/api/v1/quota_scan"
|
|
userPath = "/api/v1/user"
|
|
versionPath = "/api/v1/version"
|
|
metricsPath = "/metrics"
|
|
)
|
|
|
|
var (
|
|
router *chi.Mux
|
|
dataProvider dataprovider.Provider
|
|
)
|
|
|
|
// HTTPDConf httpd daemon configuration
|
|
type HTTPDConf struct {
|
|
// The port used for serving HTTP requests. 0 disable the HTTP server. Default: 8080
|
|
BindPort int `json:"bind_port" mapstructure:"bind_port"`
|
|
// The address to listen on. A blank value means listen on all available network interfaces. Default: "127.0.0.1"
|
|
BindAddress string `json:"bind_address" mapstructure:"bind_address"`
|
|
}
|
|
|
|
type apiResponse struct {
|
|
Error string `json:"error"`
|
|
Message string `json:"message"`
|
|
HTTPStatus int `json:"status"`
|
|
}
|
|
|
|
func init() {
|
|
initializeRouter()
|
|
}
|
|
|
|
// SetDataProvider sets the data provider to use to fetch the data about users
|
|
func SetDataProvider(provider dataprovider.Provider) {
|
|
dataProvider = provider
|
|
}
|
|
|
|
func sendAPIResponse(w http.ResponseWriter, r *http.Request, err error, message string, code int) {
|
|
var errorString string
|
|
if err != nil {
|
|
errorString = err.Error()
|
|
}
|
|
resp := apiResponse{
|
|
Error: errorString,
|
|
Message: message,
|
|
HTTPStatus: code,
|
|
}
|
|
if code != http.StatusOK {
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
|
w.WriteHeader(code)
|
|
}
|
|
render.JSON(w, r, resp)
|
|
}
|
|
|
|
func getRespStatus(err error) int {
|
|
if _, ok := err.(*dataprovider.ValidationError); ok {
|
|
return http.StatusBadRequest
|
|
}
|
|
if _, ok := err.(*dataprovider.MethodDisabledError); ok {
|
|
return http.StatusForbidden
|
|
}
|
|
return http.StatusInternalServerError
|
|
}
|