Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "bytes"
  6. "fmt"
  7. "log"
  8. "math/rand"
  9. "net"
  10. "net/http"
  11. "os"
  12. "regexp"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17.  
  18. const (
  19. extensionsFile = "/home/gh/Dropbox/work/golang/projects/web-extensions/pjsip.conf"
  20. extensionsCFUFile = "/home/gh/Dropbox/work/golang/projects/web-extensions/cfu.conf"
  21. extFrom = 32000
  22. extTo = 39999
  23. passwordLen = 16
  24. asterreg1 = "asterreg1.dc.wildberries.ru"
  25. asterreg2 = "asterreg2.dc.wildberries.ru"
  26. //extensionsFile = "/home/gh/Desktop/users.conf"
  27. )
  28.  
  29. // type newExtension struct {
  30. // extension string
  31. // name string
  32. // ip string
  33. // cfu string
  34. // }
  35.  
  36. func unique(intSlice []int) []int {
  37. keys := make(map[int]bool)
  38. list := []int{}
  39. for _, entry := range intSlice {
  40. if _, value := keys[entry]; !value {
  41. keys[entry] = true
  42. list = append(list, entry)
  43. }
  44. }
  45. return list
  46. }
  47.  
  48. func checkIP(ip string) bool {
  49. ip1 := net.ParseIP("10.0.0.0")
  50. ip2 := net.ParseIP("10.255.255.254")
  51. trial := net.ParseIP(ip)
  52. if trial.To4() == nil {
  53. return false
  54. }
  55. if bytes.Compare(trial, ip1) >= 0 && bytes.Compare(trial, ip2) <= 0 {
  56. return true
  57. }
  58. return false
  59. }
  60.  
  61. func passGen() string {
  62. rand.Seed(time.Now().UnixNano())
  63. digits := "0123456789"
  64. all := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
  65. "abcdefghijklmnopqrstuvwxyz" +
  66. digits
  67. length := passwordLen
  68. buf := make([]byte, length)
  69. buf[0] = digits[rand.Intn(len(digits))]
  70. for i := 1; i < length; i++ {
  71. buf[i] = all[rand.Intn(len(all))]
  72. }
  73. rand.Shuffle(len(buf), func(i, j int) {
  74. buf[i], buf[j] = buf[j], buf[i]
  75. })
  76. str := string(buf)
  77. return str
  78. }
  79.  
  80. func getAvailExtension() int {
  81. var a []int
  82. var b []int
  83. var c int
  84. for i := extFrom; i <= extTo; i++ {
  85. a = append(a, i)
  86. }
  87.  
  88. file, err := os.Open(extensionsFile)
  89. if err != nil {
  90. log.Fatal(err)
  91. }
  92. defer file.Close()
  93. scanner := bufio.NewScanner(file)
  94.  
  95. for scanner.Scan() {
  96. r, _ := regexp.Compile(`^\[\d+\].+$`)
  97. if r.MatchString(scanner.Text()) {
  98. // s := scanner.Text()
  99. // replacer := strings.NewReplacer("[", "", "]", "")
  100. // output := replacer.Replace(s)
  101. // s2, _ := strconv.Atoi(output)
  102. // b = append(b, s2)
  103. s, _ := strconv.Atoi(strings.NewReplacer("[", "", "]", "", "(pjsip-endpoint)", "", "(pjsip-auth)", "", "(pjsip-aor)", "").Replace(scanner.Text()))
  104. b = append(b, s)
  105. }
  106. }
  107. b = unique(b)
  108. if err := scanner.Err(); err != nil {
  109. log.Fatal(err)
  110. }
  111. sm := make(map[int]struct{}, len(b))
  112. for _, n := range b {
  113. sm[n] = struct{}{}
  114. }
  115.  
  116. for _, n := range a {
  117. if _, ok := sm[n]; !ok {
  118. c = n
  119. break
  120. }
  121. }
  122. return c
  123. }
  124.  
  125. func writeExtension(extension, name, password, cfu string) {
  126. // Write new extension to pjsip.conf
  127. f, _ := os.OpenFile(extensionsFile, os.O_APPEND|os.O_WRONLY, 0644)
  128. // if err != nil {
  129. // log.Fatal(err)
  130. // }
  131. n, _ := f.WriteString("[" + extension + "](pjsip-endpoint)\n" +
  132. "auth=" + extension + "\n" +
  133. "aors=" + extension + "\n" +
  134. "outbound_auth=" + extension + "\n" +
  135. "callerid=\"" + name + "\" <" + extension + ">\n\n" +
  136.  
  137. "[" + extension + "](pjsip-auth)\n" +
  138. "username=" + extension + "\n" +
  139. "password=" + password + "\n\n" +
  140.  
  141. "[" + extension + "](pjsip-aor)\n\n")
  142. fmt.Println(n)
  143. f.Close()
  144.  
  145. if cfu != "" {
  146. // Write CFU to cfu.conf
  147. f, err := os.OpenFile(extensionsCFUFile, os.O_APPEND|os.O_WRONLY, 0644)
  148. if err != nil {
  149. log.Fatal(err)
  150. }
  151. n, _ := f.WriteString("[" + extension + "]\n" +
  152. "name=" + name + "\n" +
  153. "cfu=" + cfu + "\n\n")
  154. fmt.Println(n)
  155. f.Close()
  156. }
  157. }
  158.  
  159. func reloadPJSIP(server string) {
  160. // cmd := exec.Command("/usr/bin/ssh", "root@"+server, "asterisk", "-rx", "'module reload res_pjsip.so'")
  161. // cmd.Stdout = os.Stdout
  162. // cmd.Stderr = os.Stderr
  163. // err := cmd.Run()
  164. // if err != nil {
  165. // fmt.Println(err)
  166. // }
  167. fmt.Printf("%s reloaded\n", server)
  168. }
  169.  
  170. func newExten(w http.ResponseWriter, r *http.Request) {
  171. var name string
  172. var ip string
  173. var cfu string
  174. extension := getAvailExtension()
  175.  
  176. w.Header().Set("Content-Type", "text/html; charset=utf-8")
  177. fmt.Fprintf(w, "<!DOCTYPE HTML>"+
  178. "<html>"+
  179. "<meta charset=\"utf-8\">"+
  180. "<body>"+
  181. "<h1>New extension: %d</h1><br>"+
  182. "<form action=\"/saveExten/\" method=\"POST\">"+
  183. "Name: <input type=\"text\" name=\"name\">%s<br>"+
  184. "IP: <input type=\"text\" name=\"ip\">%s<br>"+
  185. "CFU: <input type=\"text\" name=\"cfu\">%s<br>"+
  186. "<input type=\"submit\" value=\"Save & Upload\">"+
  187. "<input type=\"hidden\" name=\"extension\" value=\"%d\">"+
  188. "</form>"+
  189. "</body>"+
  190. "</html>",
  191. extension, name, ip, cfu, extension)
  192.  
  193. }
  194.  
  195. func saveExten(w http.ResponseWriter, r *http.Request) {
  196. extension := r.FormValue("extension")
  197. name := r.FormValue("name")
  198. ip := r.FormValue("ip")
  199. cfu := r.FormValue("cfu")
  200. password := passGen()
  201. ipValidity := checkIP(ip)
  202.  
  203. // Write extension
  204. if (ipValidity == true && name != "") || (name != "" && cfu != "") {
  205. fmt.Fprintf(w, "extension: %s\n"+
  206. "name: %s\n"+
  207. "ip: %s\n"+
  208. "password: %s\n"+
  209. "CFU: %s\n",
  210. extension, name, ip, password, cfu)
  211. writeExtension(extension, name, password, cfu)
  212. reloadPJSIP(asterreg1)
  213. reloadPJSIP(asterreg2)
  214. } //else {
  215. // какая-то хуйня, давай по новой
  216. // http.Redirect(w, r, "/newExten/", http.StatusSeeOther)
  217. // }
  218. w.Header().Set("Content-Type", "text/html; charset=utf-8")
  219. fmt.Fprintf(w, "<!DOCTYPE HTML>"+
  220. "<html>"+
  221. "<meta charset=\"utf-8\">"+
  222. "<body>"+
  223. "<h1>New extension: </h1><br>"+
  224. "<form action=\"/newExten/\" method=\"GET\">"+
  225. "<input type=\"hidden\" name=\"extension\" value=\"%s\"><br>"+
  226. "<input type=\"submit\" value=\"More\"><br>"+
  227. "</form>"+
  228. "</body>"+
  229. "</html>", extension)
  230. }
  231.  
  232. func main() {
  233. http.HandleFunc("/newExten/", newExten)
  234. http.HandleFunc("/saveExten/", saveExten)
  235. http.ListenAndServe(":1488", nil)
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement