utils.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package utils
  2. import (
  3. "flag"
  4. "fmt"
  5. "math/rand"
  6. "net"
  7. "os"
  8. "strings"
  9. "time"
  10. )
  11. // IsFlagPassed 判断是否设置了指定 flag
  12. func IsFlagPassed(name string) bool {
  13. found := false
  14. flag.Visit(func(f *flag.Flag) {
  15. if f.Name == name {
  16. found = true
  17. }
  18. })
  19. return found
  20. }
  21. // NumberOrStringToBool 字符串 1, yes 返回 true 否则 false
  22. func NumberOrStringToBool(input string) bool {
  23. if input == "1" {
  24. return true
  25. }
  26. if input == "yes" {
  27. return true
  28. }
  29. return false
  30. }
  31. // NumberToBool 大于0 返回 true 否则 false
  32. func NumberToBool(input int64) bool {
  33. if input > 0 {
  34. return true
  35. } else {
  36. return false
  37. }
  38. }
  39. // Bool to int true 返回 1 否则 0
  40. func BoolToInt(input bool) int64 {
  41. var output int64
  42. if input {
  43. output = 1
  44. } else {
  45. output = 0
  46. }
  47. return output
  48. }
  49. // BoolToNumber true 返回 "1" false 返回 "0"
  50. func BoolToNumber(input bool) string {
  51. if input {
  52. return "1"
  53. }
  54. return "0"
  55. }
  56. // BoolToString true 返回 "yes" false 返回 "no"
  57. func BoolToString(input bool) string {
  58. if input {
  59. return "yes"
  60. }
  61. return "no"
  62. }
  63. // YesToOn Yes 或 yes 返回 "on" 否则返回 "off"
  64. // 会议 Muted 的值可能是 By admin
  65. func YesToOn(input string) string {
  66. if input == "Yes" || input == "yes" || strings.Contains(input, "By") {
  67. return "on"
  68. }
  69. return "off"
  70. }
  71. // GetRandStr 生成随机密码
  72. func GetRandStr(baseStr string, length int) string {
  73. r := rand.New(rand.NewSource(time.Now().UnixNano() + rand.Int63()))
  74. bytes := make([]byte, length)
  75. l := len(baseStr)
  76. for i := 0; i < length; i++ {
  77. bytes[i] = baseStr[r.Intn(l)]
  78. }
  79. return string(bytes)
  80. }
  81. // SqlLike sql like 头尾添加 %%
  82. func SqlLike(input string) string {
  83. return fmt.Sprintf("%%%s%%", input)
  84. }
  85. // IsChannel 判断输入是否是 Channel
  86. func IsChannel(input string) bool {
  87. if strings.Contains(input, "SIP") {
  88. return true
  89. }
  90. if strings.Contains(input, "Local") {
  91. return true
  92. }
  93. if strings.Contains(input, "DAHDI") {
  94. return true
  95. }
  96. return false
  97. }
  98. // 判断是否是广播分机
  99. func IsPAIU(input string) bool {
  100. if len(input) == 4 {
  101. return input[:2] == "24"
  102. }
  103. return false
  104. }
  105. // 判断是否是广播分机
  106. func IsPACU(input string) bool {
  107. if len(input) == 4 {
  108. return input[:2] == "21"
  109. }
  110. return false
  111. }
  112. // 判断是否是司机控制盒
  113. func IsIO(input string) bool {
  114. if len(input) == 4 {
  115. return input[:2] == "14"
  116. }
  117. return false
  118. }
  119. // 判断是否是司机控制盒
  120. func IsICP(input string) bool {
  121. if len(input) == 4 {
  122. return input[:2] == "23"
  123. }
  124. return false
  125. }
  126. // 根据PAD号码获取PACU号码
  127. func GetPacuByPad(input string) string {
  128. if len(input) == 4 && input[:2] == "24" {
  129. return fmt.Sprintf("21%c1", input[2])
  130. } else {
  131. return ""
  132. }
  133. }
  134. // 判断文件是否存在
  135. func PathExists(path string) bool {
  136. _, err := os.Stat(path)
  137. if err == nil {
  138. return true
  139. }
  140. if os.IsNotExist(err) {
  141. return false
  142. }
  143. return false
  144. }
  145. func IndexOf(sliceID []string, value string) int {
  146. for i, v := range sliceID {
  147. if v == value {
  148. return i
  149. }
  150. }
  151. return -1
  152. }
  153. func CheckAsterisk() bool {
  154. target := "127.0.0.1:5060"
  155. conn, err := net.DialTimeout("udp", target, 1*time.Second)
  156. if err != nil {
  157. return false
  158. }
  159. defer conn.Close()
  160. // 构造最小 SIP OPTIONS 请求(RFC 3261)
  161. req := "OPTIONS sip:test@" + target + " SIP/2.0\r\n" +
  162. "Via: SIP/2.0/UDP 127.0.0.1:5061;branch=z9hG4bK123456\r\n" +
  163. "Max-Forwards: 70\r\n" +
  164. "To: <sip:test@" + target + ">\r\n" +
  165. "From: <sip:probe@127.0.0.1>;tag=abc123\r\n" +
  166. "Call-ID: 123456789@127.0.0.1\r\n" +
  167. "CSeq: 1 OPTIONS\r\n" +
  168. "Contact: <sip:probe@127.0.0.1:5061>\r\n" +
  169. "Accept: application/sdp\r\n" +
  170. "Content-Length: 0\r\n\r\n"
  171. _, err = conn.Write([]byte(req))
  172. if err != nil {
  173. time.Sleep(time.Second)
  174. _, err = conn.Write([]byte(req))
  175. if err != nil {
  176. return false
  177. }
  178. }
  179. //lfshook.NewLogger().Logger.Infof("=====CheckAsterisk req====:%+v ", string(req))
  180. conn.SetReadDeadline(time.Now().Add(1 * time.Second))
  181. buf := make([]byte, 2048)
  182. n, err := conn.Read(buf)
  183. if err != nil || n == 0 {
  184. return false
  185. }
  186. resp := string(buf[:n])
  187. //lfshook.NewLogger().Logger.Infof("=====CheckAsterisk response====:%+v ", resp)
  188. return strings.HasPrefix(resp, "SIP/2.0")
  189. }