blob: 3cfcb16a904f101b9dc9c2fd55ea053485112132 [file] [log] [blame]
package main
import (
"errors"
"fmt"
"log"
"net/url"
"os"
"regexp"
"strconv"
"time"
hguclient "gomodules.avm99963.com/hgu-sipsettings-reverter/client"
)
var (
obProxyAddrRe = regexp.MustCompile(`oa0 = "([\d\.]*)";`)
obProxyPortRe = regexp.MustCompile(`op0 = "(\d*)";`)
ipInterfaceRe = regexp.MustCompile(`var ifn = '([^']*)';`)
)
type OutboundProxySettings struct {
Address string
Port int
IpInterface string
}
func GetOutboundProxySettings(client *hguclient.Client) (*OutboundProxySettings, error) {
loggedIn, err := client.IsLoggedIn()
if err != nil {
return nil, err
}
if !loggedIn {
log.Println("Not logged in, logging in...")
err := client.LogIn()
if err != nil {
return nil, err
}
}
body, err := client.Get(hguclient.URL_SIPBASIC, false)
if err != nil {
return nil, err
}
addrMatches := obProxyAddrRe.FindStringSubmatch(body)
if len(addrMatches) < 2 {
return nil, errors.New("Can't find outbound proxy address in settings.")
}
addr := addrMatches[1]
portMatches := obProxyPortRe.FindStringSubmatch(body)
if len(portMatches) < 2 {
return nil, errors.New("Can't find oubound proxy port in settings.")
}
port, err := strconv.Atoi(portMatches[1])
if err != nil {
return nil, err
}
ipMatches := ipInterfaceRe.FindStringSubmatch(body)
if len(ipMatches) < 2 {
return nil, errors.New("Can't find IP interface in settings.")
}
ip := ipMatches[1]
return &OutboundProxySettings{
Address: addr,
Port: port,
IpInterface: ip,
}, nil
}
func check(client *hguclient.Client, correctSettings *OutboundProxySettings) error {
currentSettings, err := GetOutboundProxySettings(client)
if err != nil {
log.Fatalln(err)
}
if *currentSettings == *correctSettings {
log.Println("Settings are ok.")
return nil
}
log.Println(fmt.Sprintf("Settings are incorrect! Current settings: %v. Correct settings: %v.", currentSettings, correctSettings))
_, err = client.Get("/voicesipstop.cmd", false)
if err != nil {
return errors.New(fmt.Sprintf("Couldn't stop SIP: %v", err))
}
eAddr := url.QueryEscape(correctSettings.Address)
ePort := url.QueryEscape(strconv.Itoa(correctSettings.Port))
eInt := url.QueryEscape(correctSettings.IpInterface)
startUrl := "/voicesipstart.cmd?currentview=basic&ifName=" + eInt + "&obProxyAddr0=" + eAddr + "&obProxyPort0=" + ePort
_, err = client.Get(startUrl, false)
if err != nil {
return errors.New(fmt.Sprintf("Couldn't start SIP: %v", err))
}
log.Println("Settings have been fixed")
return nil
}
func mustGetEnv(name string) string {
env, ok := os.LookupEnv(name)
if !ok {
log.Fatalln(fmt.Sprintf("%v environment variable must be set.", name))
}
return env
}
func main() {
log.Println("Starting sip_reverter")
endpoint := mustGetEnv("SIPREVERTER_HGU_ENDPOINT")
password := mustGetEnv("SIPREVERTER_HGU_PASSWORD")
address := mustGetEnv("SIPREVERTER_CONF_ADDRESS")
portString := mustGetEnv("SIPREVERTER_CONF_PORT")
port, err := strconv.Atoi(portString)
if err != nil {
log.Fatalln(fmt.Sprintf("Can't parse port: %v", err))
}
ipInterface := mustGetEnv("SIPREVERTER_CONF_INTERFACE")
correctObProxySettings := &OutboundProxySettings{
Address: address,
Port: port,
IpInterface: ipInterface,
}
client, err := hguclient.New(endpoint, password)
if err != nil {
log.Fatalln(err)
}
for {
err := check(client, correctObProxySettings)
if err != nil {
log.Println(fmt.Sprintf("Error while checking: %v", err))
}
time.Sleep(90 * time.Second)
}
}