// Statping // Copyright (C) 2018. Hunter Long and the project contributors // Written by Hunter Long and the project contributors // // https://github.com/statping/statping // // The licenses for most software and other practical works are designed // to take away your freedom to share and change the works. By contrast, // the GNU General Public License is intended to guarantee your freedom to // share and change all versions of a program--to make sure it remains free // software for all its users. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package handlers import ( "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/statping/statping/database" "github.com/statping/statping/types/failures" "github.com/statping/statping/types/hits" "github.com/statping/statping/types/services" "github.com/statping/statping/utils" "net/http" ) type serviceOrder struct { Id int64 `json:"service"` Order int `json:"order"` } func serviceByID(r *http.Request) (*services.Service, error) { vars := mux.Vars(r) id := utils.ToInt(vars["id"]) servicer, err := services.Find(id) if err != nil { return nil, errors.Errorf("service %d not found", id) } return servicer, nil } func reorderServiceHandler(w http.ResponseWriter, r *http.Request) { r.ParseForm() var newOrder []*serviceOrder if err := DecodeJSON(r, &newOrder); err != nil { sendErrorJson(err, w, r) return } for _, s := range newOrder { service, err := services.Find(s.Id) if err != nil { sendErrorJson(errors.Errorf("service %d not found", s.Id), w, r) return } service.Order = s.Order service.Update() } returnJson(newOrder, w, r) } func apiServiceHandler(r *http.Request) interface{} { srv, err := serviceByID(r) if err != nil { return err } srv = srv.UpdateStats() return *srv } func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) { var service *services.Service if err := DecodeJSON(r, &service); err != nil { sendErrorJson(err, w, r) return } if err := service.Create(); err != nil { sendErrorJson(err, w, r) return } go services.ServiceCheckQueue(service, true) sendJsonAction(service, "create", w, r) } func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) { service, err := serviceByID(r) if err != nil { sendErrorJson(err, w, r, http.StatusNotFound) return } if err := DecodeJSON(r, &service); err != nil { sendErrorJson(err, w, r, http.StatusBadRequest) return } err = service.Update() if err != nil { sendErrorJson(err, w, r) return } go service.CheckService(true) sendJsonAction(service, "update", w, r) } func apiServiceRunningHandler(w http.ResponseWriter, r *http.Request) { service, err := serviceByID(r) if err != nil { sendErrorJson(err, w, r) return } if service.IsRunning() { service.Close() } else { service.Start() } sendJsonAction(service, "running", w, r) } func apiServiceDataHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) service, err := services.Find(utils.ToInt(vars["id"])) if err != nil { sendErrorJson(errors.New("service data not found"), w, r) return } groupQuery, err := database.ParseQueries(r, service.AllHits()) if err != nil { sendErrorJson(err, w, r) return } objs, err := groupQuery.GraphData(database.ByAverage("latency", 1000)) if err != nil { sendErrorJson(err, w, r) return } returnJson(objs, w, r) } func apiServiceFailureDataHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) service, err := services.Find(utils.ToInt(vars["id"])) if err != nil { sendErrorJson(errors.New("service data not found"), w, r) return } groupQuery, err := database.ParseQueries(r, service.AllFailures()) if err != nil { sendErrorJson(err, w, r) return } objs, err := groupQuery.GraphData(database.ByCount) if err != nil { sendErrorJson(err, w, r) return } returnJson(objs, w, r) } func apiServicePingDataHandler(w http.ResponseWriter, r *http.Request) { service, err := serviceByID(r) if err != nil { sendErrorJson(errors.New("service data not found"), w, r) return } groupQuery, err := database.ParseQueries(r, service.AllHits()) if err != nil { sendErrorJson(err, w, r) return } objs, err := groupQuery.GraphData(database.ByAverage("ping_time", 1000)) if err != nil { sendErrorJson(err, w, r) return } returnJson(objs, w, r) } func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) { service, err := serviceByID(r) if err != nil { sendErrorJson(err, w, r) return } err = service.Delete() if err != nil { sendErrorJson(err, w, r) return } sendJsonAction(service, "delete", w, r) } func apiAllServicesHandler(r *http.Request) interface{} { return services.AllInOrder() } func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) { service, err := serviceByID(r) if err != nil { sendErrorJson(err, w, r) return } err = service.DeleteFailures() if err != nil { sendErrorJson(err, w, r) return } sendJsonAction(service, "delete_failures", w, r) } func apiServiceFailuresHandler(r *http.Request) interface{} { vars := mux.Vars(r) service, err := services.Find(utils.ToInt(vars["id"])) if err != nil { return errors.New("service not found") } var fails []*failures.Failure query, err := database.ParseQueries(r, service.AllFailures()) if err != nil { return err } query.Find(&fails) return fails } func apiServiceHitsHandler(r *http.Request) interface{} { vars := mux.Vars(r) service, err := services.Find(utils.ToInt(vars["id"])) if err != nil { return errors.New("service not found") } var hts []*hits.Hit query, err := database.ParseQueries(r, service.AllHits()) if err != nil { return err } query.Find(&hts) return hts }