nezha/pkg/utils/utils.go

117 lines
2.6 KiB
Go
Raw Normal View History

package utils
import (
2021-09-04 00:42:51 -04:00
"crypto/md5" // #nosec
"encoding/hex"
2022-06-02 21:45:11 -04:00
"io"
2022-06-02 22:16:33 -04:00
"log"
"math/rand"
"os"
2022-06-02 22:16:33 -04:00
"path/filepath"
2021-05-27 08:48:12 -04:00
"regexp"
2022-05-17 08:16:46 -04:00
"strings"
"time"
"unsafe"
jsoniter "github.com/json-iterator/go"
)
var Json = jsoniter.ConfigCompatibleWithStandardLibrary
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
func RandStringBytesMaskImprSrcUnsafe(n int) string {
var src = rand.NewSource(time.Now().UnixNano())
b := make([]byte, n)
// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
2021-09-04 00:42:51 -04:00
return *(*string)(unsafe.Pointer(&b)) //#nosec
}
func MD5(plantext string) string {
2021-09-04 00:42:51 -04:00
hash := md5.New() // #nosec
hash.Write([]byte(plantext))
return hex.EncodeToString(hash.Sum(nil))
}
func IsWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
2021-05-27 08:48:12 -04:00
var ipv4Re = regexp.MustCompile(`(\d*\.).*(\.\d*)`)
func ipv4Desensitize(ipv4Addr string) string {
return ipv4Re.ReplaceAllString(ipv4Addr, "$1****$2")
}
var ipv6Re = regexp.MustCompile(`(\w*:\w*:).*(:\w*:\w*)`)
func ipv6Desensitize(ipv6Addr string) string {
return ipv6Re.ReplaceAllString(ipv6Addr, "$1****$2")
}
func IPDesensitize(ipAddr string) string {
ipAddr = ipv4Desensitize(ipAddr)
ipAddr = ipv6Desensitize(ipAddr)
return ipAddr
}
2022-05-17 08:16:46 -04:00
// SplitIPAddr 传入/分割的v4v6混合地址返回v4和v6地址与有效地址
func SplitIPAddr(v4v6Bundle string) (string, string, string) {
ipList := strings.Split(v4v6Bundle, "/")
ipv4 := ""
ipv6 := ""
validIP := ""
if len(ipList) > 1 {
// 双栈
ipv4 = ipList[0]
ipv6 = ipList[1]
validIP = ipv4
} else if len(ipList) == 1 {
// 仅ipv4|ipv6
if strings.Contains(ipList[0], ":") {
ipv6 = ipList[0]
validIP = ipv6
} else {
ipv4 = ipList[0]
validIP = ipv4
}
}
return ipv4, ipv6, validIP
}
2022-06-02 21:45:11 -04:00
func IsDirEmpty(name string) (bool, error) {
2022-06-02 22:16:33 -04:00
f, err := os.Open(filepath.Clean(name))
2022-06-02 21:45:11 -04:00
if err != nil {
return false, err
}
2022-06-02 22:16:33 -04:00
defer func() {
if err := f.Close(); err != nil {
log.Printf("Error closing file: %s\n", err)
}
}()
2022-06-02 21:45:11 -04:00
_, err = f.Readdirnames(1)
if err == io.EOF {
return true, nil
}
return false, err
}