utils.go 4.2 KB

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