@ -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) | |||
} |