util.go 7.5 KB

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