mirror of
				https://github.com/byReqz/probehost2.git
				synced 2025-10-31 14:41:31 +00:00 
			
		
		
		
	add nping handler, port support and fmt code
This commit is contained in:
		
							
								
								
									
										61
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								main.go
									
									
									
									
									
								
							| @@ -1,16 +1,16 @@ | |||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"net" | ||||||
|  | 	"net/http" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
|   "strings" |  | ||||||
|   "net/http" |  | ||||||
|   "net" |  | ||||||
| 	"strconv" | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	log "github.com/sirupsen/logrus" | 	log "github.com/sirupsen/logrus" | ||||||
| 	flag "github.com/spf13/pflag" | 	flag "github.com/spf13/pflag" | ||||||
|  |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var logstdout = log.New() | var logstdout = log.New() | ||||||
| @@ -92,20 +92,36 @@ func runner(remoteip string, command string, args... string) string{ | |||||||
| 	return string(cmd) | 	return string(cmd) | ||||||
| } | } | ||||||
|  |  | ||||||
| func validatehosts(hosts []string) []string{ | func validatehosts(hosts []string) ([]string, []string) { | ||||||
|   var valid []string | 	var validhosts []string | ||||||
|  | 	var validports []string | ||||||
| 	for _, host := range hosts { | 	for _, host := range hosts { | ||||||
|  | 		split := strings.Split(host, "_") | ||||||
|  | 		host = split[0] | ||||||
| 		if hostparse := net.ParseIP(host); hostparse != nil { | 		if hostparse := net.ParseIP(host); hostparse != nil { | ||||||
| 			if (net.IP.IsPrivate(hostparse) || net.IP.IsLoopback(hostparse)) && allowprivate { | 			if (net.IP.IsPrivate(hostparse) || net.IP.IsLoopback(hostparse)) && allowprivate { | ||||||
|         valid = append(valid, host) | 				validhosts = append(validhosts, host) | ||||||
| 			} else if !(net.IP.IsPrivate(hostparse) || net.IP.IsLoopback(hostparse)) { | 			} else if !(net.IP.IsPrivate(hostparse) || net.IP.IsLoopback(hostparse)) { | ||||||
|         valid = append(valid, host) | 				validhosts = append(validhosts, host) | ||||||
| 			} | 			} | ||||||
| 		} else if _, err := net.LookupIP(host); err == nil { | 		} else if _, err := net.LookupIP(host); err == nil { | ||||||
|       valid = append(valid, host) | 			validhosts = append(validhosts, host) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		var port string | ||||||
|  | 		if len(split) > 1 { | ||||||
|  | 			port = split[1] | ||||||
|  | 			_, err := strconv.Atoi(port) // validate if port is just an int | ||||||
|  | 			if err == nil { | ||||||
|  | 				validports = append(validports, port) | ||||||
|  | 			} else { | ||||||
|  | 				validports = append(validports, "0") | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			validports = append(validports, "0") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   return valid | 	return validhosts, validports | ||||||
| } | } | ||||||
|  |  | ||||||
| func parseopts(options []string, cmdopts map[string]string) []string { | func parseopts(options []string, cmdopts map[string]string) []string { | ||||||
| @@ -119,7 +135,7 @@ func parseopts(options []string, cmdopts map[string]string) []string{ | |||||||
| func prerunner(req *http.Request, cmd string, cmdopts map[string]string, defaultopts []string) string { | func prerunner(req *http.Request, cmd string, cmdopts map[string]string, defaultopts []string) string { | ||||||
| 	geturl := strings.Split(req.URL.String(), "/") | 	geturl := strings.Split(req.URL.String(), "/") | ||||||
| 	targets := strings.Split(geturl[2], ",") | 	targets := strings.Split(geturl[2], ",") | ||||||
|   hosts := validatehosts(targets) | 	hosts, ports := validatehosts(targets) | ||||||
| 	var opts []string | 	var opts []string | ||||||
| 	opts = append(opts, defaultopts...) | 	opts = append(opts, defaultopts...) | ||||||
| 	if len(geturl) > 3 && len(geturl[3]) > 0 { | 	if len(geturl) > 3 && len(geturl[3]) > 0 { | ||||||
| @@ -134,9 +150,13 @@ func prerunner(req *http.Request, cmd string, cmdopts map[string]string, default | |||||||
| 	} else { | 	} else { | ||||||
| 		remoteaddr = req.RemoteAddr | 		remoteaddr = req.RemoteAddr | ||||||
| 	} | 	} | ||||||
|   for _, host := range hosts { | 	for i, host := range hosts { | ||||||
|  | 		if ports[i] != "0" && cmd == "nping" { | ||||||
|  | 			args = append(args, "-p"+ports[i]) | ||||||
|  | 		} | ||||||
| 		args = append(args, opts...) | 		args = append(args, opts...) | ||||||
| 		args = append(args, host) | 		args = append(args, host) | ||||||
|  | 		fmt.Println(remoteaddr, cmd, args) | ||||||
| 		res = fmt.Sprint(res, runner(remoteaddr, cmd, args...), "\n") | 		res = fmt.Sprint(res, runner(remoteaddr, cmd, args...), "\n") | ||||||
| 	} | 	} | ||||||
| 	return res | 	return res | ||||||
| @@ -190,11 +210,28 @@ func traceroute(w http.ResponseWriter, req *http.Request) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func nping(w http.ResponseWriter, req *http.Request) { | ||||||
|  | 	cmd := "nping" | ||||||
|  | 	cmdopts := map[string]string{ | ||||||
|  | 		"4": "-4", "6": "-6", "u": "--udp", "t": "--tcp-connect", "v": "-v", "c1": "-c1", "c3": "-c3", "c5": "-c5", | ||||||
|  | 		"force4": "-4", "force6": "-6", "udp": "--udp", "tcp": "--tcp-connect", "verbose": "-v", "count1": "-c1", "count3": "-c3", "count5": "-c5", | ||||||
|  | 	} | ||||||
|  | 	var defaultopts []string | ||||||
|  | 	defaultopts = append(defaultopts, "-c3") | ||||||
|  | 	res := prerunner(req, cmd, cmdopts, defaultopts) | ||||||
|  | 	if strings.TrimSpace(res) == "" { | ||||||
|  | 		fmt.Fprintln(w, http.StatusInternalServerError) | ||||||
|  | 	} else { | ||||||
|  | 		fmt.Fprint(w, strings.TrimSpace(res), "\n") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| 	http.HandleFunc("/ping/", ping) | 	http.HandleFunc("/ping/", ping) | ||||||
| 	http.HandleFunc("/mtr/", mtr) | 	http.HandleFunc("/mtr/", mtr) | ||||||
| 	http.HandleFunc("/tracert/", traceroute) | 	http.HandleFunc("/tracert/", traceroute) | ||||||
| 	http.HandleFunc("/traceroute/", traceroute) | 	http.HandleFunc("/traceroute/", traceroute) | ||||||
|  | 	http.HandleFunc("/nping/", nping) | ||||||
| 	logstdout.Info("Serving on :", listenport) | 	logstdout.Info("Serving on :", listenport) | ||||||
| 	logfile.Info("Serving on :", listenport) | 	logfile.Info("Serving on :", listenport) | ||||||
| 	http.ListenAndServe(fmt.Sprint(":", listenport), nil) | 	http.ListenAndServe(fmt.Sprint(":", listenport), nil) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user