Sign inSign up

cnsoluciones/fastagi

By cnsoluciones

Updated over 4 years ago

Docker Asterisk FastAGI GO

Image
0

3.1K

cnsoluciones/fastagi repository overview

Version

  • Alpine

More info: https://github.com/lordbasex/docker

Dockerfile

##################################
# STEP 1 build executable binary
##################################
FROM alpine AS builder

LABEL maintainer="Federico Pereira <[email protected]>"
LABEL github="https://github.com/lordbasex/docker/docker-asterisk-fastagi-go"

ENV GO111MODULE=on \
    GOPATH=/home/go \
    PATH=/home/go/bin:$PATH \
    GOBIN=/home/go/bin

RUN apk update && apk add --no-cache git go bash ca-certificates
RUN mkdir -p /home/go/src /home/go/bin /home/go/src/fastagi && chmod -R 777 /home/go /home/go/src/fastagi && cp -fr /usr/bin/go /home/go/bin/
WORKDIR /home/go/src/fastagi
COPY ./fastagi.go .
RUN go mod init fastagi 
RUN go get -v
RUN go build -o /go/bin/fastagi

##################################
# STEP 2 build a small image
##################################
FROM alpine:latest

LABEL maintainer="Federico Pereira <[email protected]>"
LABEL github="https://github.com/lordbasex/docker/docker-asterisk-fastagi-go"

COPY --from=builder /go/bin/fastagi /go/bin/fastagi
COPY ./audios /audios

ENV FASTAGI_PORT=8000 \
    SERVER_MEDIA="http://fastagi:8011/" \
    SERVER_MEDIA_DIR="/audios"
    
ENTRYPOINT ["/go/bin/fastagi"]

fastagi.go

package main

import (
	"log"
	"os"

	"github.com/CyCoreSystems/agi"
	"github.com/lordbasex/servermedia"
)

/**
* Get env variables
**/
func goDotEnvVariable(key string) string {
	return os.Getenv(key)
}

var portFastAGI string
var serverMediaURL string

func main() {

	portFastAGI = goDotEnvVariable("FASTAGI_PORT")
	if portFastAGI == "" {
		portFastAGI = "8000"
	}

	serverMediaURL = goDotEnvVariable("SERVER_MEDIA")
	if serverMediaURL == "" {
		serverMediaURL = "http://fastagi:8011/"
	}

	go servermedia.Start()

	log.Println("FastAGI Server agi://0.0.0.0:" + portFastAGI + " running...")
	agi.Listen(":"+portFastAGI, handler)

}

func handler(a *agi.AGI) {
	defer a.Close()

	a.Verbose(". .: IPERFEX FASTAGI - Copyright © 2012 - 2022 iPERFEX All Rights Reserved :.", 1)
	action := a.Variables["agi_arg_1"]

	switch action {

	case "prueba1":

		a.Answer()
		a.Verbose("PRUEBA 1 - VERBOSE", 1)

	case "prueba2":

		a.Answer()
		a.Verbose("PRUEBA 2 - VERBOSE", 1)
		a.Set("__VAR_GLOBAL", "es")

	case "prueba3":

		a.Answer()
		a.Verbose("PRUEBA 3 - AGI VARIABLE", 1)
		a.Verbose("RETURN: ->"+a.Variables["agi_arg_1"]+"<-", 1)

	case "prueba4":

		a.Answer()
		a.Set("CHANNEL(language)", "es")
		a.Verbose("PRUEBA 4 - PLAYBACK AUDIO", 1)
		a.StreamFile("tt-monkeys", "#", 1)
		a.Set("__VAR_GLOBAL", a.Variables["agi_arg_1"])
		varGlobal, err := a.Get("VAR_GLOBAL")
		if err != nil {
			return
		}
		a.Verbose("RETURN: ->"+varGlobal+"<-", 1)
		a.Exec("DumpChan", "")

	case "ivrdemo1":

		IVRDemo1(a)

	default:

		a.Verbose("DEFAULT - VERBOSE", 1)

	}

	a.Hangup()
	//os.Exit(0)
}

func IVRDemo1(a *agi.AGI) {

	getLanguageChannel := a.Variables["agi_arg_2"]
	getUniqueID := a.Variables["agi_uniqueid"]

	if getLanguageChannel == "" {

		a.Set("CHANNEL(language)", "en")

	} else {

		a.Set("CHANNEL(language)", getLanguageChannel)

	}

	a.Answer()
	languageChannel, _ := a.Get("CHANNEL(language)")

	// audio1: IVR demo
	// audio1: Demo de IVR
	a.StreamFile(serverMediaURL+"audio1_"+languageChannel+".wav", "#", 1)
	log.Println("UniqueID: " + getUniqueID + " | StremFile: " + serverMediaURL + "audio1_" + languageChannel + ".wav")

	loop := true
	bye := 0
	for loop {

		if bye == 3 {
			log.Println("UniqueID: "+getUniqueID+" | Loop Final: ", bye)
			a.Verbose("Loop: Final: ", bye)
			loop = false
			break
		}

		//audio2: Please enter a number between 1 and 111
		//audio2: Por favor, ingrese un número entre el 1 y el 111
		a.StreamFile(serverMediaURL+"audio2_"+languageChannel+".wav", "#", 1)
		log.Println("UniqueID: " + getUniqueID + " | StremFile: " + serverMediaURL + "audio2_" + languageChannel + ".wav")

		result, _ := a.GetData("beep", 10000, 3)
		log.Println("UniqueID: "+getUniqueID+" | GetData DTMF: ", result)
		a.Verbose("DTMF RETURN: ->"+result+"<-", 1)

		switch result {

		case "":
			log.Println(a.Variables["agi_network_script"])

			//not_dtmf: We have not registered your entry.
			//not_dtmf: No hemos registrado su ingreso.
			a.StreamFile(serverMediaURL+"not_dtmf_"+languageChannel+".wav", "#", 1)
			bye++

		case "-1":

			log.Println("UniqueID: " + getUniqueID + " | HangUp: aborted")
			loop = false
			break

		case "111":

			//aduio4: Thank you very much for making this demo. Until next time.
			//aduio4: Muchas gracias por hacer esta demo. Hasta la próxima.
			a.StreamFile(serverMediaURL+"audio4_"+languageChannel+".wav", "#", 1)
			log.Println("UniqueID: " + getUniqueID + " | HangUp: completed")
			loop = false
			break

		default:

			//audio3: The number you entered is
			//audio3: El número que usted a ingresado es
			a.StreamFile(serverMediaURL+"audio3_"+languageChannel+".wav", "#", 1)
			a.SayDigits(result, "#")

		}

	}

}

Asterisk IAX2

user: 100

pass: 12345

port: 4569

docker-compose.yml

version: '3.6'
services:

  fastagi:
    image: cnsoluciones/fastagi
    container_name: fastagi
    hostname: fastagi
    restart: always
    ports:
      - 8000:8000
      - 8011:8011
    volumes:
      - /etc/localtime:/etc/localtime:ro

  voip:
    image: cnsoluciones/asterisk-iax2
    container_name: voip
    hostname: voip
    restart: always
    privileged: true
    ports:
      - 4569:4569/udp
    working_dir: /etc/asterisk
    depends_on:
      - fastagi 
    links:
      - fastagi

Tag summary

Content type

Image

Digest

Size

6.9 MB

Last updated

over 4 years ago

docker pull cnsoluciones/fastagi