Skip to content

Instantly share code, notes, and snippets.

@afriza
Last active April 22, 2020 17:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save afriza/036093e737bf82faa258770fd90bcc6c to your computer and use it in GitHub Desktop.
Save afriza/036093e737bf82faa258770fd90bcc6c to your computer and use it in GitHub Desktop.
Twinkle Linux SIP/VoIP auto call and auto answer via command line
package main
import (
"bufio"
"context"
"flag"
"fmt"
"log"
"os/exec"
"strings"
"time"
)
var debug = flag.Bool("debug", false, "print debug messages")
func dbgPrintln(a ...interface{}) (n int, err error) {
if *debug {
return fmt.Println(a...)
}
return 0, nil
}
func dbgPrintf(format string, a ...interface{}) (n int, err error) {
if *debug {
return fmt.Printf(format, a...)
}
return 0, nil
}
func init() {
flag.Parse()
}
func main() {
var dst string
if args := flag.Args(); len(args) > 0 {
dst = args[0]
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
cmd := exec.CommandContext(ctx, "twinkle", "-c")
op, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
ip, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
cmd.Start()
scanner := bufio.NewScanner(op)
for scanner.Scan() {
txt := scanner.Text()
dbgPrintf(">>%q\n", txt)
switch {
case txt == "":
continue
case strings.HasSuffix(txt, " incoming call"):
dbgPrintln("<< Answering call")
fmt.Fprintln(ip, "answer")
case strings.Contains(txt, " registration failed"):
time.Sleep(1 * time.Second)
dbgPrintln("<< De-Registering")
fmt.Fprintln(ip, "deregister")
case strings.Contains(txt, "de-registration failed"),
strings.Contains(txt, "de-registration succeeded"):
time.Sleep(1 * time.Second)
dbgPrintln("<< Registering")
fmt.Fprintln(ip, "register")
}
if dst != "" {
switch {
case strings.Contains(txt, " registration succeeded"),
strings.HasSuffix(txt, " call failed."),
strings.HasSuffix(txt, " ended call."):
time.Sleep(500 * time.Millisecond)
dbgPrintln("<< Calling " + dst)
fmt.Fprintln(ip, "call "+dst)
}
}
}
dbgPrintln("# Waiting Process to finish")
cmd.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment