util.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. package common
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/binary"
  6. "github.com/cnlh/nps/lib/crypt"
  7. "github.com/cnlh/nps/lib/pool"
  8. "html/template"
  9. "io"
  10. "io/ioutil"
  11. "net"
  12. "net/http"
  13. "os"
  14. "regexp"
  15. "strconv"
  16. "strings"
  17. "sync"
  18. )
  19. //Get the corresponding IP address through domain name
  20. func GetHostByName(hostname string) string {
  21. if !DomainCheck(hostname) {
  22. return hostname
  23. }
  24. ips, _ := net.LookupIP(hostname)
  25. if ips != nil {
  26. for _, v := range ips {
  27. if v.To4() != nil {
  28. return v.String()
  29. }
  30. }
  31. }
  32. return ""
  33. }
  34. //Check the legality of domain
  35. func DomainCheck(domain string) bool {
  36. var match bool
  37. IsLine := "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/)"
  38. NotLine := "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}"
  39. match, _ = regexp.MatchString(IsLine, domain)
  40. if !match {
  41. match, _ = regexp.MatchString(NotLine, domain)
  42. }
  43. return match
  44. }
  45. //Check if the Request request is validated
  46. func CheckAuth(r *http.Request, user, passwd string) bool {
  47. s := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
  48. if len(s) != 2 {
  49. return false
  50. }
  51. b, err := base64.StdEncoding.DecodeString(s[1])
  52. if err != nil {
  53. return false
  54. }
  55. pair := strings.SplitN(string(b), ":", 2)
  56. if len(pair) != 2 {
  57. return false
  58. }
  59. return pair[0] == user && pair[1] == passwd
  60. }
  61. //get bool by str
  62. func GetBoolByStr(s string) bool {
  63. switch s {
  64. case "1", "true":
  65. return true
  66. }
  67. return false
  68. }
  69. //get str by bool
  70. func GetStrByBool(b bool) string {
  71. if b {
  72. return "1"
  73. }
  74. return "0"
  75. }
  76. //int
  77. func GetIntNoErrByStr(str string) int {
  78. i, _ := strconv.Atoi(strings.TrimSpace(str))
  79. return i
  80. }
  81. //Get verify value
  82. func Getverifyval(vkey string) string {
  83. return crypt.Md5(vkey)
  84. }
  85. //Change headers and host of request
  86. func ChangeHostAndHeader(r *http.Request, host string, header string, addr string) {
  87. if host != "" {
  88. r.Host = host
  89. }
  90. if header != "" {
  91. h := strings.Split(header, "\n")
  92. for _, v := range h {
  93. hd := strings.Split(v, ":")
  94. if len(hd) == 2 {
  95. r.Header.Set(hd[0], hd[1])
  96. }
  97. }
  98. }
  99. addr = strings.Split(addr, ":")[0]
  100. r.Header.Set("X-Forwarded-For", addr)
  101. r.Header.Set("X-Real-IP", addr)
  102. }
  103. //Read file content by file path
  104. func ReadAllFromFile(filePath string) ([]byte, error) {
  105. f, err := os.Open(filePath)
  106. if err != nil {
  107. return nil, err
  108. }
  109. return ioutil.ReadAll(f)
  110. }
  111. // FileExists reports whether the named file or directory exists.
  112. func FileExists(name string) bool {
  113. if _, err := os.Stat(name); err != nil {
  114. if os.IsNotExist(err) {
  115. return false
  116. }
  117. }
  118. return true
  119. }
  120. //Judge whether the TCP port can open normally
  121. func TestTcpPort(port int) bool {
  122. l, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), port, ""})
  123. defer func() {
  124. if l != nil {
  125. l.Close()
  126. }
  127. }()
  128. if err != nil {
  129. return false
  130. }
  131. return true
  132. }
  133. //Judge whether the UDP port can open normally
  134. func TestUdpPort(port int) bool {
  135. l, err := net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), port, ""})
  136. defer func() {
  137. if l != nil {
  138. l.Close()
  139. }
  140. }()
  141. if err != nil {
  142. return false
  143. }
  144. return true
  145. }
  146. //Write length and individual byte data
  147. //Length prevents sticking
  148. //# Characters are used to separate data
  149. func BinaryWrite(raw *bytes.Buffer, v ...string) {
  150. buffer := new(bytes.Buffer)
  151. var l int32
  152. for _, v := range v {
  153. l += int32(len([]byte(v))) + int32(len([]byte(CONN_DATA_SEQ)))
  154. binary.Write(buffer, binary.LittleEndian, []byte(v))
  155. binary.Write(buffer, binary.LittleEndian, []byte(CONN_DATA_SEQ))
  156. }
  157. binary.Write(raw, binary.LittleEndian, l)
  158. binary.Write(raw, binary.LittleEndian, buffer.Bytes())
  159. }
  160. //inArray str interface
  161. func InStrArr(arr []string, val string) bool {
  162. for _, v := range arr {
  163. if v == val {
  164. return true
  165. }
  166. }
  167. return false
  168. }
  169. //inArray int interface
  170. func InIntArr(arr []int, val int) bool {
  171. for _, v := range arr {
  172. if v == val {
  173. return true
  174. }
  175. }
  176. return false
  177. }
  178. //format ports str to a int array
  179. func GetPorts(p string) []int {
  180. var ps []int
  181. arr := strings.Split(p, ",")
  182. for _, v := range arr {
  183. fw := strings.Split(v, "-")
  184. if len(fw) == 2 {
  185. if IsPort(fw[0]) && IsPort(fw[1]) {
  186. start, _ := strconv.Atoi(fw[0])
  187. end, _ := strconv.Atoi(fw[1])
  188. for i := start; i <= end; i++ {
  189. ps = append(ps, i)
  190. }
  191. } else {
  192. continue
  193. }
  194. } else if IsPort(v) {
  195. p, _ := strconv.Atoi(v)
  196. ps = append(ps, p)
  197. }
  198. }
  199. return ps
  200. }
  201. //is the string a port
  202. func IsPort(p string) bool {
  203. pi, err := strconv.Atoi(p)
  204. if err != nil {
  205. return false
  206. }
  207. if pi > 65536 || pi < 1 {
  208. return false
  209. }
  210. return true
  211. }
  212. //if the s is just a port,return 127.0.0.1:s
  213. func FormatAddress(s string) string {
  214. if strings.Contains(s, ":") {
  215. return s
  216. }
  217. return "127.0.0.1:" + s
  218. }
  219. //get address from the complete address
  220. func GetIpByAddr(addr string) string {
  221. arr := strings.Split(addr, ":")
  222. return arr[0]
  223. }
  224. func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
  225. buf := pool.GetBufPoolCopy()
  226. defer pool.PutBufPoolCopy(buf)
  227. for {
  228. nr, er := src.Read(buf)
  229. if nr > 0 {
  230. nw, ew := dst.Write(buf[0:nr])
  231. if nw > 0 {
  232. written += int64(nw)
  233. }
  234. if ew != nil {
  235. err = ew
  236. break
  237. }
  238. if nr != nw {
  239. err = io.ErrShortWrite
  240. break
  241. }
  242. }
  243. if er != nil {
  244. if er != io.EOF {
  245. err = er
  246. }
  247. break
  248. }
  249. }
  250. return written, err
  251. }
  252. //send this ip forget to get a local udp port
  253. func GetLocalUdpAddr() (net.Conn, error) {
  254. tmpConn, err := net.Dial("udp", "114.114.114.114:53")
  255. if err != nil {
  256. return nil, err
  257. }
  258. return tmpConn, tmpConn.Close()
  259. }
  260. //parse template
  261. func ParseStr(str string) (string, error) {
  262. tmp := template.New("npc")
  263. var err error
  264. w := new(bytes.Buffer)
  265. if tmp, err = tmp.Parse(str); err != nil {
  266. return "", err
  267. }
  268. if err = tmp.Execute(w, GetEnvMap()); err != nil {
  269. return "", err
  270. }
  271. return w.String(), nil
  272. }
  273. //get env
  274. func GetEnvMap() map[string]string {
  275. m := make(map[string]string)
  276. environ := os.Environ()
  277. for i := range environ {
  278. tmp := strings.Split(environ[i], "=")
  279. if len(tmp) == 2 {
  280. m[tmp[0]] = tmp[1]
  281. }
  282. }
  283. return m
  284. }
  285. //throw the empty element of the string array
  286. func TrimArr(arr []string) []string {
  287. newArr := make([]string, 0)
  288. for _, v := range arr {
  289. if v != "" {
  290. newArr = append(newArr, v)
  291. }
  292. }
  293. return newArr
  294. }
  295. //
  296. func IsArrContains(arr []string, val string) bool {
  297. if arr == nil {
  298. return false
  299. }
  300. for _, v := range arr {
  301. if v == val {
  302. return true
  303. }
  304. }
  305. return false
  306. }
  307. //remove value from string array
  308. func RemoveArrVal(arr []string, val string) []string {
  309. for k, v := range arr {
  310. if v == val {
  311. arr = append(arr[:k], arr[k+1:]...)
  312. return arr
  313. }
  314. }
  315. return arr
  316. }
  317. //convert bytes to num
  318. func BytesToNum(b []byte) int {
  319. var str string
  320. for i := 0; i < len(b); i++ {
  321. str += strconv.Itoa(int(b[i]))
  322. }
  323. x, _ := strconv.Atoi(str)
  324. return int(x)
  325. }
  326. //get the length of the sync map
  327. func GeSynctMapLen(m sync.Map) int {
  328. var c int
  329. m.Range(func(key, value interface{}) bool {
  330. c++
  331. return true
  332. })
  333. return c
  334. }
  335. func GetExtFromPath(path string) string {
  336. s := strings.Split(path, ".")
  337. re, err := regexp.Compile(`(\w+)`)
  338. if err != nil {
  339. return ""
  340. }
  341. return string(re.Find([]byte(s[0])))
  342. }