137 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			137 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, r *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)
 | |
| 		}
 | |
| 	}
 | |
| }
 |