util.go 7.5 KB

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