139 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
package webserver
 | 
						|
 | 
						|
import (
 | 
						|
	"net/http"
 | 
						|
	"path/filepath"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/gorilla/mux"
 | 
						|
)
 | 
						|
 | 
						|
/* This file has the methods that pass out actual content. */
 | 
						|
 | 
						|
// Returns the main index file.
 | 
						|
// If index.html becomes a template, this is where it can be compiled.
 | 
						|
func (s *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
 | 
						|
	http.ServeFile(w, r, filepath.Join(s.HTMLPath, "index.html"))
 | 
						|
}
 | 
						|
 | 
						|
// Arbitrary /health handler.
 | 
						|
func (s *Server) handleHealth(w http.ResponseWriter, _ *http.Request) {
 | 
						|
	s.handleDone(w, []byte("OK"), mimeHTML)
 | 
						|
}
 | 
						|
 | 
						|
// Returns static files from static-files path. /css, /js, /img (/images, /image).
 | 
						|
func (s *Server) handleStatic(w http.ResponseWriter, r *http.Request) {
 | 
						|
	switch v := mux.Vars(r)["sub"]; v {
 | 
						|
	case "image", "img":
 | 
						|
		dir := http.Dir(filepath.Join(s.HTMLPath, "static", "images"))
 | 
						|
		http.StripPrefix("/"+v, http.FileServer(dir)).ServeHTTP(w, r)
 | 
						|
	default: // images, js, css, etc
 | 
						|
		dir := http.Dir(filepath.Join(s.HTMLPath, "static", v))
 | 
						|
		http.StripPrefix("/"+v, http.FileServer(dir)).ServeHTTP(w, r)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Returns poller configs and/or plugins. /api/v1/config.
 | 
						|
func (s *Server) handleConfig(w http.ResponseWriter, r *http.Request) {
 | 
						|
	vars := mux.Vars(r)
 | 
						|
 | 
						|
	switch vars["sub"] {
 | 
						|
	case "":
 | 
						|
		data := map[string]any{
 | 
						|
			"inputs":  s.Collect.Inputs(),
 | 
						|
			"outputs": s.Collect.Outputs(),
 | 
						|
			"poller":  s.Collect.Poller(),
 | 
						|
			"uptime":  int(time.Since(s.start).Round(time.Second).Seconds()),
 | 
						|
		}
 | 
						|
		s.handleJSON(w, data)
 | 
						|
	case "plugins":
 | 
						|
		data := map[string][]string{
 | 
						|
			"inputs":  s.Collect.Inputs(),
 | 
						|
			"outputs": s.Collect.Outputs(),
 | 
						|
		}
 | 
						|
		s.handleJSON(w, data)
 | 
						|
	default:
 | 
						|
		s.handleMissing(w, r)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Returns an output plugin's data: /api/v1/output/{output}.
 | 
						|
func (s *Server) handleOutput(w http.ResponseWriter, r *http.Request) {
 | 
						|
	vars := mux.Vars(r)
 | 
						|
 | 
						|
	c := s.plugins.getOutput(vars["output"])
 | 
						|
	if c == nil {
 | 
						|
		s.handleMissing(w, r)
 | 
						|
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	c.RLock()
 | 
						|
	defer c.RUnlock()
 | 
						|
 | 
						|
	switch val := vars["value"]; vars["sub"] {
 | 
						|
	default:
 | 
						|
		s.handleJSON(w, c.Config)
 | 
						|
	case "eventgroups":
 | 
						|
		s.handleJSON(w, c.Events.Groups(val))
 | 
						|
	case "events":
 | 
						|
		switch events, ok := c.Events[val]; {
 | 
						|
		case val == "":
 | 
						|
			s.handleJSON(w, c.Events)
 | 
						|
		case ok:
 | 
						|
			s.handleJSON(w, events)
 | 
						|
		default:
 | 
						|
			s.handleMissing(w, r)
 | 
						|
		}
 | 
						|
	case "counters":
 | 
						|
		if val == "" {
 | 
						|
			s.handleJSON(w, c.Counter)
 | 
						|
		} else {
 | 
						|
			s.handleJSON(w, map[string]int64{val: c.Counter[val]})
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Returns an input plugin's data: /api/v1/input/{input}.
 | 
						|
func (s *Server) handleInput(w http.ResponseWriter, r *http.Request) { //nolint:cyclop
 | 
						|
	vars := mux.Vars(r)
 | 
						|
 | 
						|
	c := s.plugins.getInput(vars["input"])
 | 
						|
	if c == nil {
 | 
						|
		s.handleMissing(w, r)
 | 
						|
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	c.RLock()
 | 
						|
	defer c.RUnlock()
 | 
						|
 | 
						|
	switch val := vars["value"]; vars["sub"] {
 | 
						|
	default:
 | 
						|
		s.handleJSON(w, c.Config)
 | 
						|
	case "eventgroups":
 | 
						|
		s.handleJSON(w, c.Events.Groups(val))
 | 
						|
	case "events":
 | 
						|
		switch events, ok := c.Events[val]; {
 | 
						|
		case val == "":
 | 
						|
			s.handleJSON(w, c.Events)
 | 
						|
		case ok:
 | 
						|
			s.handleJSON(w, events)
 | 
						|
		default:
 | 
						|
			s.handleMissing(w, r)
 | 
						|
		}
 | 
						|
	case "sites":
 | 
						|
		s.handleJSON(w, c.Sites)
 | 
						|
	case "devices":
 | 
						|
		s.handleJSON(w, c.Devices.Filter(val))
 | 
						|
	case "clients":
 | 
						|
		s.handleJSON(w, c.Clients.Filter(val))
 | 
						|
	case "counters":
 | 
						|
		if val != "" {
 | 
						|
			s.handleJSON(w, map[string]int64{val: c.Counter[val]})
 | 
						|
		} else {
 | 
						|
			s.handleJSON(w, c.Counter)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |