| @ -0,0 +1,86 @@ | |||
| package network | |||
| import ( | |||
| "io/ioutil" | |||
| "net/http" | |||
| "strings" | |||
| ) | |||
| /** | |||
| * 自定义HTTP请求 | |||
| */ | |||
| func MethodHttp(method, url, param string, header ...map[string]string) ([]byte, error) { | |||
| httpClient := &http.Client{} | |||
| req, err := http.NewRequest(method, url, strings.NewReader(param)) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |||
| if len(header) > 0 { | |||
| for _, item := range header { | |||
| for k, v := range item { | |||
| req.Header.Set(k, v) | |||
| } | |||
| } | |||
| } | |||
| resp, err := httpClient.Do(req) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| defer resp.Body.Close() | |||
| body, err := ioutil.ReadAll(resp.Body) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| return body, nil | |||
| } | |||
| /** | |||
| * 自定义HTTP请求 | |||
| */ | |||
| func SendHttp(method, url string, param map[string]string, header ...map[string]string) ([]byte, error) { | |||
| httpClient := &http.Client{} | |||
| paramStr := "" | |||
| if len(param) > 0 { | |||
| for key, value := range param { | |||
| paramStr += key + "=" + value + "&" | |||
| } | |||
| paramStr = paramStr[0 : len(paramStr)-1] | |||
| } | |||
| req, err := http.NewRequest(method, url, strings.NewReader(paramStr)) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |||
| if len(header) > 0 { | |||
| for _, item := range header { | |||
| for k, v := range item { | |||
| req.Header.Set(k, v) | |||
| } | |||
| } | |||
| } | |||
| resp, err := httpClient.Do(req) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| defer resp.Body.Close() | |||
| body, err := ioutil.ReadAll(resp.Body) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| return body, nil | |||
| } | |||
| @ -0,0 +1,52 @@ | |||
| package network | |||
| import ( | |||
| "fmt" | |||
| "net/url" | |||
| "testing" | |||
| ) | |||
| func Test_MethodHttp(t *testing.T) { | |||
| uri := "http://Controller_Ip/SaaS/nextcloud/remote.php/webdav" | |||
| u, err := url.Parse(uri) | |||
| fmt.Println(u, err) | |||
| fmt.Println(u.Scheme, u.Host, u.Path, u.Fragment, u.RawQuery) | |||
| // url := "http://admin:123456@10.0.66.29/SaaS/nextcloud/remote.php/dav/files/admin/CZNTQK2" | |||
| // data, err := MethodHttp("DELETE", url, "") | |||
| // t.Log(string(data), err) | |||
| // url := "http://admin:123456@10.0.66.29/nextcloud/index.php/apps/files/ajax/getstoragestats.php?dir=/" | |||
| // data, err := MethodHttp("GET", url, "") | |||
| // t.Log(string(data)) | |||
| // t.Log(err) | |||
| // url = "http://admin:123456@10.0.66.29/nextcloud/remote.php/dav/files/admin/" | |||
| // data, err = MethodHttp("PROPFIND", url, "") | |||
| // t.Log(string(data)) | |||
| // t.Log(err) | |||
| // url = "http://admin:123456@10.0.66.29/nextcloud/index.php/settings/ajax/setquota.php" | |||
| // args := "username=admin"a=30GB&norequesttoken=true" | |||
| // data, err = MethodHttp("POST", url, args) | |||
| // t.Log(string(data)) | |||
| // t.Log(err) | |||
| // url = "http://admin:123456@10.0.66.29/nextcloud/index.php/apps/files/ajax/list.php?dir=/Photos" | |||
| // data, err = MethodHttp("GET", url, "") | |||
| // t.Log(string(data)) | |||
| // t.Log(err) | |||
| // url = "http://" + "raydesktop.gxycloud.com" + ":" + "8082" + "/extranet" | |||
| // args = "key=DBKHPW39" | |||
| // data, err = MethodHttp("POST", url, args) | |||
| // t.Log(string(data)) | |||
| // t.Log(err) | |||
| // url = "http://admin:123456@10.0.66.29/nextcloud/remote.php/dav/files/admin/ncikZ0fxX1gy5qV2018012504/7b531e26d2dee30271" | |||
| // data, err = MethodHttp("MKCOL", url, "") | |||
| // t.Log(string(data)) | |||
| // t.Log(err) | |||
| } | |||
| @ -0,0 +1,210 @@ | |||
| package network | |||
| import ( | |||
| "errors" | |||
| "net" | |||
| "net/http" | |||
| "strconv" | |||
| "strings" | |||
| ) | |||
| /** | |||
| * 取本地IP | |||
| */ | |||
| func GetLocalIps() []string { | |||
| addrs, err := net.InterfaceAddrs() | |||
| var list []string | |||
| if err != nil { | |||
| return list | |||
| } | |||
| for _, address := range addrs { | |||
| // 检查ip地址判断是否回环地址 | |||
| if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { | |||
| if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { | |||
| if IsPrivateIp(ipnet.IP.String()) { | |||
| list = append(list, ipnet.IP.String()) | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return list | |||
| } | |||
| /** | |||
| * 取外网IP | |||
| */ | |||
| func GetInternetIps() []string { | |||
| addrs, err := net.InterfaceAddrs() | |||
| var list []string | |||
| if err != nil { | |||
| return list | |||
| } | |||
| for _, address := range addrs { | |||
| // 检查ip地址判断是否回环地址 | |||
| if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { | |||
| if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { | |||
| if !IsPrivateIp(ipnet.IP.String()) { | |||
| list = append(list, ipnet.IP.String()) | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return list | |||
| } | |||
| /** | |||
| * 是否本地(局域网)IP | |||
| */ | |||
| func IsPrivateIp(ip string) bool { | |||
| process_ip := getIpNumber(ip) | |||
| /** | |||
| * 私有IP:A类 10.0.0.0 -10.255.255.255 | |||
| * B类 172.16.0.0 -172.31.255.255 | |||
| * C类 192.168.0.0 -192.168.255.255 | |||
| * D类 127.0.0.0 -127.255.255.255(环回地址) | |||
| */ | |||
| a_begin := getIpNumber("10.0.0.0") | |||
| a_end := getIpNumber("10.255.255.255") | |||
| if process_ip >= a_begin && process_ip <= a_end { | |||
| return true | |||
| } | |||
| b_begin := getIpNumber("172.16.0.0") | |||
| b_end := getIpNumber("172.31.255.255") | |||
| if process_ip >= b_begin && process_ip <= b_end { | |||
| return true | |||
| } | |||
| c_begin := getIpNumber("192.168.0.0") | |||
| c_end := getIpNumber("192.168.255.255") | |||
| if process_ip >= c_begin && process_ip <= c_end { | |||
| return true | |||
| } | |||
| d_begin := getIpNumber("127.0.0.0") | |||
| d_end := getIpNumber("127.255.255.255") | |||
| if process_ip >= d_begin && process_ip <= d_end { | |||
| return true | |||
| } | |||
| return false | |||
| } | |||
| func getIpNumber(ip string) int64 { | |||
| ip_segment := strings.Split(ip, ".") | |||
| if len(ip_segment) != 4 { | |||
| return -1 | |||
| } | |||
| segment_1, _ := strconv.ParseInt(ip_segment[0], 10, 64) | |||
| segment_2, _ := strconv.ParseInt(ip_segment[1], 10, 64) | |||
| segment_3, _ := strconv.ParseInt(ip_segment[2], 10, 64) | |||
| segment_4, _ := strconv.ParseInt(ip_segment[3], 10, 64) | |||
| ip_num := segment_1*256*256*256 + segment_2*256*256 + segment_3*256 + segment_4 | |||
| return ip_num | |||
| } | |||
| /** | |||
| * 取来源地址 | |||
| */ | |||
| func GetRemoteIp(req *http.Request) string { | |||
| forward_ip := req.Header.Get("X-Forwarded-For") //使用代理 | |||
| if forward_ip != "" { | |||
| forward_ips := strings.Split(forward_ip, ",") | |||
| if len(forward_ips) > 0 && forward_ips[0] != "" { | |||
| remoteIp, _, err := net.SplitHostPort(forward_ips[0]) | |||
| if err != nil { | |||
| remoteIp = forward_ips[0] | |||
| } | |||
| return remoteIp | |||
| } | |||
| } | |||
| if remoteIp, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { | |||
| return remoteIp | |||
| } | |||
| return req.RemoteAddr | |||
| } | |||
| /** | |||
| * ip是否正确 | |||
| */ | |||
| func GetNumber(ip, mask string) (string, error) { | |||
| a := net.ParseIP(ip) | |||
| if a == nil { | |||
| return "", errors.New("150057") | |||
| } | |||
| b := net.ParseIP(mask) | |||
| if b == nil { | |||
| return "", errors.New("150058") | |||
| } | |||
| ips := strings.Split(ip, ".") | |||
| a1, _ := strconv.Atoi(ips[0]) | |||
| a2, _ := strconv.Atoi(ips[1]) | |||
| a3, _ := strconv.Atoi(ips[2]) | |||
| a4, _ := strconv.Atoi(ips[3]) | |||
| masks := strings.Split(mask, ".") | |||
| m1, _ := strconv.Atoi(masks[0]) | |||
| m2, _ := strconv.Atoi(masks[1]) | |||
| m3, _ := strconv.Atoi(masks[2]) | |||
| m4, _ := strconv.Atoi(masks[3]) | |||
| n1 := a1 & m1 | |||
| n2 := a2 & m2 | |||
| n3 := a3 & m3 | |||
| n4 := a4 & m4 | |||
| return strconv.Itoa(n1) + "." + strconv.Itoa(n2) + "." + strconv.Itoa(n3) + "." + strconv.Itoa(n4), nil | |||
| } | |||
| /* | |||
| * CIDR取IP mask | |||
| * 2019/03/07 | |||
| */ | |||
| func GetIpMaskFromCIDR(ip string) (string, string, error) { | |||
| ips, ipNet, err := net.ParseCIDR(ip) | |||
| if err != nil { | |||
| return "", "", err | |||
| } | |||
| val := make([]byte, len(ipNet.Mask)) | |||
| copy(val, ipNet.Mask) | |||
| var s []string | |||
| for _, i := range val[:] { | |||
| s = append(s, strconv.Itoa(int(i))) | |||
| } | |||
| return ips.String(), strings.Join(s, "."), nil | |||
| } | |||
| /* | |||
| * net mask转换, 255.255.255.0 -> 24 | |||
| * 2019/03/07 | |||
| */ | |||
| func ChangeMask(mask string) string { | |||
| s := strings.Split(mask, ".") | |||
| s1, _ := strconv.Atoi(s[0]) | |||
| s2, _ := strconv.Atoi(s[1]) | |||
| s3, _ := strconv.Atoi(s[2]) | |||
| s4, _ := strconv.Atoi(s[3]) | |||
| ipmask := net.IPv4Mask(byte(s1), byte(s2), byte(s3), byte(s4)) | |||
| ones, _ := ipmask.Size() | |||
| return strconv.Itoa(ones) | |||
| } | |||
| @ -0,0 +1,50 @@ | |||
| package network | |||
| import ( | |||
| "fmt" | |||
| "testing" | |||
| ) | |||
| func Test_IsPrivateIp(t *testing.T) { | |||
| str := "10.1.77.54" | |||
| is := IsPrivateIp(str) | |||
| fmt.Println("is private ip", is) | |||
| } | |||
| func Test_GetLocalIps(t *testing.T) { | |||
| ips := GetLocalIps() | |||
| fmt.Println(ips) | |||
| } | |||
| func Test_GetInternetIps(t *testing.T) { | |||
| ips := GetInternetIps() | |||
| fmt.Println(ips) | |||
| } | |||
| func Test_GetNumber(t *testing.T) { | |||
| ip := "192.168.122.21" | |||
| mask := "255.255.255.0" | |||
| n, err := GetNumber(ip, mask) | |||
| t.Log(n, err) | |||
| ip = "192.168.112.253" | |||
| mask = "255.255.120.0" | |||
| n, err = GetNumber(ip, mask) | |||
| t.Log(n, err) | |||
| ip = "172.16.23.23" | |||
| mask = "255.255.255.0" | |||
| n, err = GetNumber(ip, mask) | |||
| t.Log(n, err) | |||
| } | |||
| func Test_GetIpMaskFromCIDR(t *testing.T) { | |||
| ip := "192.168.141.22/24" | |||
| ip, mask, err := GetIpMaskFromCIDR(ip) | |||
| t.Log(ip, mask, err) | |||
| } | |||
| func Test_ChangeMask(t *testing.T) { | |||
| mask := "255.255.255.0" | |||
| a := ChangeMask(mask) | |||
| t.Log(a) | |||
| } | |||
| @ -0,0 +1,46 @@ | |||
| package network | |||
| import ( | |||
| "os/exec" | |||
| "runtime" | |||
| "strings" | |||
| ) | |||
| func Ping(ip string) bool { | |||
| if ip == "" { | |||
| return false | |||
| } | |||
| var cmd *exec.Cmd | |||
| if strings.ToLower(runtime.GOOS) == "linux" { | |||
| cmd = exec.Command("ping", ip, "-c", "1") | |||
| } else { | |||
| cmd = exec.Command("ping", ip, "-n", "1") | |||
| } | |||
| out, err := cmd.Output() | |||
| cmd.Run() | |||
| str := strings.ToLower(string(out)) | |||
| if err == nil && strings.Contains(str, "ttl") { | |||
| return true | |||
| } | |||
| return false | |||
| } | |||
| func CanConnect(ip, port string) bool { | |||
| cmd := exec.Command("telnet", ip, port) | |||
| out, _ := cmd.Output() | |||
| cmd.Run() | |||
| s := string(out) | |||
| if strings.Contains(s, "Connected") && strings.Contains(s, "Escape") { | |||
| return true | |||
| } | |||
| return false | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| package network | |||
| import ( | |||
| // "fmt" | |||
| "testing" | |||
| ) | |||
| func Test_Ping(t *testing.T) { | |||
| str := "10.0.100.10" | |||
| ret := Ping(str) | |||
| fmt.Println(ret) | |||
| } | |||
| func Test_CanConnect(t *testing.T) { | |||
| ip := "10.0.106.212" | |||
| port := "" | |||
| ret := CanConnect(ip, port) | |||
| t.Log(ret) | |||
| } | |||
| @ -0,0 +1,91 @@ | |||
| package network | |||
| import ( | |||
| "crypto/rand" | |||
| "math/big" | |||
| "net" | |||
| "strconv" | |||
| ) | |||
| /** | |||
| 扫描本机空闲端口 | |||
| 参数说明: | |||
| startPort 扫描开始端口 不包含这个端口 | |||
| endPort 扫描结束端口 不包含这个端口 | |||
| count 扫描端口数量 | |||
| */ | |||
| func ScanPort(startPort, endPort int64, count int) []int64 { | |||
| usePort := make([]int64, 0) | |||
| for startPort < endPort { | |||
| startPort = startPort + 1 | |||
| udpserver, err := net.ResolveUDPAddr("udp", ":"+strconv.FormatInt(int64(startPort), 10)) | |||
| if err != nil { | |||
| continue | |||
| } | |||
| udpConn, err := net.ListenUDP("udp", udpserver) | |||
| if err != nil { | |||
| continue | |||
| } | |||
| udpConn.Close() | |||
| ln, err := net.Listen("tcp", "0.0.0.0:"+strconv.FormatInt(int64(startPort), 10)) | |||
| if err != nil { | |||
| continue | |||
| } | |||
| usePort = append(usePort, startPort) | |||
| ln.Close() | |||
| if len(usePort) >= count { | |||
| break | |||
| } | |||
| } | |||
| return usePort | |||
| } | |||
| /** | |||
| * 取随机端口 | |||
| */ | |||
| func RandPort(min, max int64) int64 { | |||
| var port int64 | |||
| for { | |||
| port = RandInt64(min, max) | |||
| udpserver, err := net.ResolveUDPAddr("udp", ":"+strconv.FormatInt(int64(port), 10)) | |||
| if err != nil { | |||
| continue | |||
| } | |||
| udpConn, err := net.ListenUDP("udp", udpserver) | |||
| if err != nil { | |||
| continue | |||
| } | |||
| udpConn.Close() | |||
| ln, err := net.Listen("tcp", "0.0.0.0:"+strconv.FormatInt(int64(port), 10)) | |||
| if err != nil { | |||
| continue | |||
| } | |||
| ln.Close() | |||
| break | |||
| } | |||
| return port | |||
| } | |||
| /** | |||
| * 取随机数 | |||
| */ | |||
| func RandInt64(min, max int64) int64 { | |||
| var randnum int64 | |||
| for { | |||
| maxBigInt := big.NewInt(max) | |||
| i, _ := rand.Int(rand.Reader, maxBigInt) | |||
| if i.Int64() > min { | |||
| randnum = i.Int64() | |||
| break | |||
| } | |||
| } | |||
| return randnum | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| package network | |||
| import ( | |||
| "fmt" | |||
| "testing" | |||
| ) | |||
| func TestScanPort(t *testing.T) { | |||
| ports := ScanPort(55000, 60000, 2) | |||
| fmt.Println(ports) | |||
| } | |||
| func TestRandPort(t *testing.T) { | |||
| port := RandPort(50000, 60000) | |||
| fmt.Println("port:", port) | |||
| } | |||
| @ -0,0 +1,166 @@ | |||
| /* | |||
| * url functions | |||
| */ | |||
| package network | |||
| import ( | |||
| "crypto/md5" | |||
| "encoding/hex" | |||
| "errors" | |||
| "io/ioutil" | |||
| "net" | |||
| "net/http" | |||
| "net/url" | |||
| "strconv" | |||
| "strings" | |||
| "time" | |||
| "git.tetele.net/tgo/crypter" | |||
| ) | |||
| /** | |||
| * post 请求 | |||
| */ | |||
| func FnPost(url, param string) ([]byte, error) { | |||
| httpClient := &http.Client{} | |||
| req, err := http.NewRequest("POST", url, strings.NewReader(param)) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| req.Header.Set("Content-Type", "application/x-www-form-urlencoded") //"application/x-www-form-urlencoded" | |||
| resp, err := httpClient.Do(req) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| defer resp.Body.Close() | |||
| body, err := ioutil.ReadAll(resp.Body) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| return body, nil | |||
| } | |||
| /** | |||
| * 取本地IP | |||
| */ | |||
| func GetLocalIp() string { | |||
| addrs, err := net.InterfaceAddrs() | |||
| if err != nil { | |||
| return "" | |||
| } | |||
| for _, address := range addrs { | |||
| // 检查ip地址判断是否回环地址 | |||
| if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { | |||
| if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { | |||
| return ipnet.IP.String() | |||
| } | |||
| } | |||
| } | |||
| return "" | |||
| } | |||
| /** | |||
| * 生成一个token | |||
| */ | |||
| func CreateTokenWithTime(sToken string) string { | |||
| now := time.Now() | |||
| iNow := now.Format("20060102150405") | |||
| sToken += iNow | |||
| h := md5.New() | |||
| h.Write([]byte(sToken)) // 需要加密的字符串 | |||
| cipher2Str := h.Sum(nil) | |||
| return hex.EncodeToString(cipher2Str) // 输出加密结果 | |||
| } | |||
| /** | |||
| * 生成一个token | |||
| */ | |||
| // func CreateToken(sToken string) string { | |||
| // now := time.Now() | |||
| // iNow := now.Format("20060102150405") | |||
| // sToken += iNow | |||
| // h := md5.New() | |||
| // h.Write([]byte(sToken)) // 需要加密的字符串 | |||
| // cipher2Str := h.Sum(nil) | |||
| // sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 | |||
| // tokenEn := crypter.DesEn(sToken, "gzyc8642") | |||
| // return sMd5 + "|" + ToString(now.Unix()) + "|" + tokenEn | |||
| // } | |||
| /** | |||
| * 验证token | |||
| */ | |||
| func CheckToken(token string) (bool, string) { | |||
| arr := strings.Split(token, "|") | |||
| if len(arr) != 3 { | |||
| return false, "" | |||
| } | |||
| tokenDes := crypter.DesDe(arr[2], "gzyc8642") | |||
| tokenTime := tokenDes[len(tokenDes)-14:] | |||
| timeInt, err := strconv.ParseInt(arr[1], 10, 64) | |||
| if err != nil { | |||
| return false, "" | |||
| } | |||
| currentTime := time.Unix(timeInt, 0).Format("20060102150405") | |||
| if currentTime != tokenTime { | |||
| return false, "" | |||
| } | |||
| h := md5.New() | |||
| h.Write([]byte(tokenDes)) // 需要加密的字符串 | |||
| cipher2Str := h.Sum(nil) | |||
| sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 | |||
| if sMd5 == arr[0] { | |||
| return true, tokenDes[0 : len(tokenDes)-14] | |||
| } | |||
| return false, "" | |||
| } | |||
| /** | |||
| * 给参数签名 | |||
| */ | |||
| func QuerySign(mQuery map[string]string) string { | |||
| sParam := "" | |||
| for k, v := range mQuery { | |||
| sParam += k + "=" + v + "&" | |||
| } | |||
| query, Err := url.ParseQuery(sParam) | |||
| if Err != nil { | |||
| return "" | |||
| } else { | |||
| return crypter.Md5Password(query.Encode(), "guzeng1") | |||
| } | |||
| } | |||
| /** | |||
| * 从url中取域名,端口 | |||
| * 2019/05/20 | |||
| */ | |||
| func GetIpPortFromUrl(sUrl string) (string, string, error) { | |||
| if sUrl == "" { | |||
| return "", "", errors.New("param error") | |||
| } | |||
| if !strings.Contains(sUrl, "http://") && !strings.Contains(sUrl, "https://") { | |||
| sUrl = "http://" + sUrl | |||
| } | |||
| u, err := url.Parse(sUrl) | |||
| if err != nil { | |||
| return "", "", err | |||
| } | |||
| return u.Hostname(), u.Port(), nil | |||
| } | |||
| @ -0,0 +1,22 @@ | |||
| package network | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_CheckToken(t *testing.T) { | |||
| code := "127328" | |||
| token := CreateToken(code) | |||
| t.Log(token) | |||
| str := "1dcfbe790d270f45ae35779afbc4072e|1532068096|90EDAA4C1E97C7517E9D10AB9157E4D0D9CC51996E3827F2" | |||
| check, user := CheckToken(str) | |||
| t.Log(check) | |||
| t.Log(user) | |||
| } | |||
| func Test_GetIpPortFromUrl(t *testing.T) { | |||
| url := "http://raydesktop.gxycloud.com:8082/getmaster" | |||
| GetIpPortFromUrl(url) | |||
| } | |||