From 533e7b31330dbbd682ea263a98e0ef0f9f8e0375 Mon Sep 17 00:00:00 2001 From: Emile Date: Mon, 27 Jan 2020 20:08:07 +0100 Subject: commented stuff --- main.go | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index dbf8f93..b4a660a 100644 --- a/main.go +++ b/main.go @@ -42,7 +42,11 @@ type location struct { } func main() { + + // create a map mapping a city to an amount of hits metrics_city_num = make(map[string]int) + + // create a cities map mapping a city to a location cities = make(map[string]location) // start the ssh server @@ -59,23 +63,39 @@ func main() { http.HandleFunc("/", indexHandler) http.HandleFunc("/metrics", metricsHandler) http.HandleFunc("/locations", locationHandlerEndpoint) + + // start the http server exposing the metrics and the locations listenErr := http.ListenAndServe(":8084", nil) + + // handle potential errors if listenErr != nil { log.Fatalln(listenErr.Error()) } } +// locationHandlerEndpoint handles requests to the /locations endpoint +// This is used by the grafana worldmap plugin to find out where to draw the +// fancy circles func locationHandlerEndpoint(w http.ResponseWriter, r *http.Request) { + + // set some headers w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Origin", "https://grafana.nbg1.emile.space") + + // start building json (yes, this is not a nice implementation, PRs welcome!) fmt.Fprintf(w, "%s", "[") + var i int = 0 for _, v := range cities { + + // print the "json" object containing the metrics needed fmt.Fprintf(w, "{") fmt.Fprintf(w, "\"key\": \"%s\",", v.key) fmt.Fprintf(w, "\"latitude\": %f,", v.latitude) fmt.Fprintf(w, "\"longitude\": %f,", v.longitude) fmt.Fprintf(w, "\"name\": \"%s\"", v.name) + + // close the object (this handles the trailing comma problem) if i == len(cities) - 1 { fmt.Fprintf(w, "}") } else { @@ -86,14 +106,17 @@ func locationHandlerEndpoint(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "%s", "]") } -// Handling incoming SSH conn95.216.207.95/32ections +// Handling incoming SSH connections func handlePass(ctx ssh.Context, pass string) bool { + + // increase the counter tracking the amount of passwords catched metrics_num_passwords++ log.Printf("%s@%s: '%s'", ctx.User(), ctx.RemoteAddr().String(), pass) + // get the ip of the remote user stringip := strings.Split(ctx.RemoteAddr().String(), ":")[0] - // Define the request string + // Define the request string for the geoip service requestString := fmt.Sprintf("%s%s", "http://ip-api.com/json/", stringip) // Send the GET request @@ -102,6 +125,7 @@ func handlePass(ctx ssh.Context, pass string) bool { log.Fatal(err) } + // if the response status code from the geoip service is not a 200 code, return false if resp.StatusCode != 200 { return false } @@ -120,12 +144,16 @@ func handlePass(ctx ssh.Context, pass string) bool { log.Fatal(err) } + // if an entry for the city does not exists yet, create the city + // if the city does allready exist, increase it's value by one if metrics_city_num[result.City] == 0 { metrics_city_num[result.City] = 1 } else { metrics_city_num[result.City] += 1 } + // if the actual city is not known, create the city + // this is used for the grafana worldmap plugin if (cities[result.City] == location{}) { newCity := location{ key: strings.ToLower(result.City), @@ -140,15 +168,20 @@ func handlePass(ctx ssh.Context, pass string) bool { return false } -// Handle HTTP /metrics requests +// Handle HTTP requests to the /metrics endpoint func metricsHandler(w http.ResponseWriter, req *http.Request) { + + // return the overall amount of passwords catched fmt.Fprintf(w, "num_passwords %d\n", metrics_num_passwords) + // return the amount of passwords catched from a given city for k, v := range metrics_city_num { fmt.Fprintf(w, "a_metric{city=\"%s\"} %d\n", strings.ToLower(k), v) } } +// indexHandler handles the request to the / endpoint +// It simply returns a link to the /metrics page func indexHandler(w http.ResponseWriter, req *http.Request) { _, _ = fmt.Fprintf(w, "metrics") } -- cgit 1.4.1