about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEmile <hanemile@protonmail.com>2020-01-27 20:08:07 +0100
committerEmile <hanemile@protonmail.com>2020-01-27 20:08:07 +0100
commit533e7b31330dbbd682ea263a98e0ef0f9f8e0375 (patch)
tree406b12d78edaa228f1f2671e836f4d480207b51f
parent065e85710c335f206e76b1cd5d1e379ff3a49164 (diff)
commented stuff
-rw-r--r--main.go39
1 files 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, "<a href='/metrics'>metrics</a>")
 }