Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bufio"
- "bytes"
- "fmt"
- "log"
- "math/rand"
- "net"
- "net/http"
- "os"
- "regexp"
- "strconv"
- "strings"
- "time"
- )
- const (
- extensionsFile = "/home/gh/Dropbox/work/golang/projects/web-extensions/pjsip.conf"
- extensionsCFUFile = "/home/gh/Dropbox/work/golang/projects/web-extensions/cfu.conf"
- extFrom = 32000
- extTo = 39999
- passwordLen = 16
- asterreg1 = "asterreg1.dc.wildberries.ru"
- asterreg2 = "asterreg2.dc.wildberries.ru"
- //extensionsFile = "/home/gh/Desktop/users.conf"
- )
- // type newExtension struct {
- // extension string
- // name string
- // ip string
- // cfu string
- // }
- func unique(intSlice []int) []int {
- keys := make(map[int]bool)
- list := []int{}
- for _, entry := range intSlice {
- if _, value := keys[entry]; !value {
- keys[entry] = true
- list = append(list, entry)
- }
- }
- return list
- }
- func checkIP(ip string) bool {
- ip1 := net.ParseIP("10.0.0.0")
- ip2 := net.ParseIP("10.255.255.254")
- trial := net.ParseIP(ip)
- if trial.To4() == nil {
- return false
- }
- if bytes.Compare(trial, ip1) >= 0 && bytes.Compare(trial, ip2) <= 0 {
- return true
- }
- return false
- }
- func passGen() string {
- rand.Seed(time.Now().UnixNano())
- digits := "0123456789"
- all := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
- "abcdefghijklmnopqrstuvwxyz" +
- digits
- length := passwordLen
- buf := make([]byte, length)
- buf[0] = digits[rand.Intn(len(digits))]
- for i := 1; i < length; i++ {
- buf[i] = all[rand.Intn(len(all))]
- }
- rand.Shuffle(len(buf), func(i, j int) {
- buf[i], buf[j] = buf[j], buf[i]
- })
- str := string(buf)
- return str
- }
- func getAvailExtension() int {
- var a []int
- var b []int
- var c int
- for i := extFrom; i <= extTo; i++ {
- a = append(a, i)
- }
- file, err := os.Open(extensionsFile)
- if err != nil {
- log.Fatal(err)
- }
- defer file.Close()
- scanner := bufio.NewScanner(file)
- for scanner.Scan() {
- r, _ := regexp.Compile(`^\[\d+\].+$`)
- if r.MatchString(scanner.Text()) {
- // s := scanner.Text()
- // replacer := strings.NewReplacer("[", "", "]", "")
- // output := replacer.Replace(s)
- // s2, _ := strconv.Atoi(output)
- // b = append(b, s2)
- s, _ := strconv.Atoi(strings.NewReplacer("[", "", "]", "", "(pjsip-endpoint)", "", "(pjsip-auth)", "", "(pjsip-aor)", "").Replace(scanner.Text()))
- b = append(b, s)
- }
- }
- b = unique(b)
- if err := scanner.Err(); err != nil {
- log.Fatal(err)
- }
- sm := make(map[int]struct{}, len(b))
- for _, n := range b {
- sm[n] = struct{}{}
- }
- for _, n := range a {
- if _, ok := sm[n]; !ok {
- c = n
- break
- }
- }
- return c
- }
- func writeExtension(extension, name, password, cfu string) {
- // Write new extension to pjsip.conf
- f, _ := os.OpenFile(extensionsFile, os.O_APPEND|os.O_WRONLY, 0644)
- // if err != nil {
- // log.Fatal(err)
- // }
- n, _ := f.WriteString("[" + extension + "](pjsip-endpoint)\n" +
- "auth=" + extension + "\n" +
- "aors=" + extension + "\n" +
- "outbound_auth=" + extension + "\n" +
- "callerid=\"" + name + "\" <" + extension + ">\n\n" +
- "[" + extension + "](pjsip-auth)\n" +
- "username=" + extension + "\n" +
- "password=" + password + "\n\n" +
- "[" + extension + "](pjsip-aor)\n\n")
- fmt.Println(n)
- f.Close()
- if cfu != "" {
- // Write CFU to cfu.conf
- f, err := os.OpenFile(extensionsCFUFile, os.O_APPEND|os.O_WRONLY, 0644)
- if err != nil {
- log.Fatal(err)
- }
- n, _ := f.WriteString("[" + extension + "]\n" +
- "name=" + name + "\n" +
- "cfu=" + cfu + "\n\n")
- fmt.Println(n)
- f.Close()
- }
- }
- func reloadPJSIP(server string) {
- // cmd := exec.Command("/usr/bin/ssh", "root@"+server, "asterisk", "-rx", "'module reload res_pjsip.so'")
- // cmd.Stdout = os.Stdout
- // cmd.Stderr = os.Stderr
- // err := cmd.Run()
- // if err != nil {
- // fmt.Println(err)
- // }
- fmt.Printf("%s reloaded\n", server)
- }
- func newExten(w http.ResponseWriter, r *http.Request) {
- var name string
- var ip string
- var cfu string
- extension := getAvailExtension()
- w.Header().Set("Content-Type", "text/html; charset=utf-8")
- fmt.Fprintf(w, "<!DOCTYPE HTML>"+
- "<html>"+
- "<meta charset=\"utf-8\">"+
- "<body>"+
- "<h1>New extension: %d</h1><br>"+
- "<form action=\"/saveExten/\" method=\"POST\">"+
- "Name: <input type=\"text\" name=\"name\">%s<br>"+
- "IP: <input type=\"text\" name=\"ip\">%s<br>"+
- "CFU: <input type=\"text\" name=\"cfu\">%s<br>"+
- "<input type=\"submit\" value=\"Save & Upload\">"+
- "<input type=\"hidden\" name=\"extension\" value=\"%d\">"+
- "</form>"+
- "</body>"+
- "</html>",
- extension, name, ip, cfu, extension)
- }
- func saveExten(w http.ResponseWriter, r *http.Request) {
- extension := r.FormValue("extension")
- name := r.FormValue("name")
- ip := r.FormValue("ip")
- cfu := r.FormValue("cfu")
- password := passGen()
- ipValidity := checkIP(ip)
- // Write extension
- if (ipValidity == true && name != "") || (name != "" && cfu != "") {
- fmt.Fprintf(w, "extension: %s\n"+
- "name: %s\n"+
- "ip: %s\n"+
- "password: %s\n"+
- "CFU: %s\n",
- extension, name, ip, password, cfu)
- writeExtension(extension, name, password, cfu)
- reloadPJSIP(asterreg1)
- reloadPJSIP(asterreg2)
- } //else {
- // какая-то хуйня, давай по новой
- // http.Redirect(w, r, "/newExten/", http.StatusSeeOther)
- // }
- w.Header().Set("Content-Type", "text/html; charset=utf-8")
- fmt.Fprintf(w, "<!DOCTYPE HTML>"+
- "<html>"+
- "<meta charset=\"utf-8\">"+
- "<body>"+
- "<h1>New extension: </h1><br>"+
- "<form action=\"/newExten/\" method=\"GET\">"+
- "<input type=\"hidden\" name=\"extension\" value=\"%s\"><br>"+
- "<input type=\"submit\" value=\"More\"><br>"+
- "</form>"+
- "</body>"+
- "</html>", extension)
- }
- func main() {
- http.HandleFunc("/newExten/", newExten)
- http.HandleFunc("/saveExten/", saveExten)
- http.ListenAndServe(":1488", nil)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement