This commit is contained in:
parent
e2f58b8aaf
commit
a011ba5dca
12 changed files with 458 additions and 0 deletions
22
.forgejo/workflows/build-freeswitch.yaml
Normal file
22
.forgejo/workflows/build-freeswitch.yaml
Normal file
|
@ -0,0 +1,22 @@
|
|||
on:
|
||||
push:
|
||||
paths:
|
||||
- containers/freeswitch/**
|
||||
- .forgejo/workflows/build-freeswitch.yaml
|
||||
jobs:
|
||||
build-freeswitch:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: library/docker:dind
|
||||
steps:
|
||||
- run: apk add --no-cache nodejs git
|
||||
- name: login to container registry
|
||||
run: echo "${{ secrets.DEPLOY_TOKEN }}" | docker login --username ${{ secrets.DEPLOY_USER }} --password-stdin git.janky.solutions
|
||||
- name: build container image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
file: Containerfile
|
||||
context: "{{defaultContext}}:containers/freeswitch"
|
||||
tags: git.janky.solutions/jankysolutions/infra/freeswitch:latest
|
||||
platforms: linux/amd64
|
||||
push: true
|
1
containers/freeswitch/.gitignore
vendored
Normal file
1
containers/freeswitch/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
sources/
|
84
containers/freeswitch/Containerfile
Normal file
84
containers/freeswitch/Containerfile
Normal file
|
@ -0,0 +1,84 @@
|
|||
FROM docker.io/library/debian:latest AS build
|
||||
RUN apt-get update && apt-get install -y \
|
||||
# build
|
||||
build-essential cmake automake autoconf 'libtool-bin|libtool' pkg-config \
|
||||
# general
|
||||
libssl-dev zlib1g-dev libdb-dev unixodbc-dev libncurses5-dev libexpat1-dev libgdbm-dev bison erlang-dev libtpl-dev libtiff5-dev uuid-dev \
|
||||
# core
|
||||
libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev nasm \
|
||||
# core codecs
|
||||
libogg-dev libspeex-dev libspeexdsp-dev \
|
||||
# mod_enum
|
||||
libldns-dev \
|
||||
# mod_python3
|
||||
python3-dev \
|
||||
# mod_av
|
||||
libavformat-dev libswscale-dev \
|
||||
# mod_lua
|
||||
liblua5.2-dev \
|
||||
# mod_opus
|
||||
libopus-dev \
|
||||
# mod_pgsql
|
||||
libpq-dev \
|
||||
# mod_sndfile
|
||||
libsndfile1-dev libflac-dev libogg-dev libvorbis-dev \
|
||||
# mod_shout
|
||||
libshout3-dev libmpg123-dev libmp3lame-dev \
|
||||
# mod_memcached
|
||||
libmemcached-dev
|
||||
|
||||
# without this git am will fail
|
||||
RUN git config --global user.name nobody && git config --global user.email nobody@localhost
|
||||
|
||||
ADD patches /patches
|
||||
|
||||
# sofia-sip
|
||||
RUN git clone https://github.com/freeswitch/sofia-sip.git /usr/src/sofia-sip && \
|
||||
cd /usr/src/sofia-sip && \
|
||||
git checkout v1.13.17 && \
|
||||
./bootstrap.sh && \
|
||||
./configure CFLAGS="-g -ggdb" --with-pic --with-glib=no --without-doxygen && \
|
||||
make && \
|
||||
make install
|
||||
|
||||
# libks
|
||||
RUN git clone https://github.com/signalwire/libks.git /usr/src/libks && \
|
||||
cd /usr/src/libks && \
|
||||
git checkout v2.0.3 && \
|
||||
cmake . -DWITH_LIBBACKTRACE=1 -DCMAKE_INSTALL_PREFIX:PATH=/usr/local && \
|
||||
make && \
|
||||
make install
|
||||
|
||||
# spandsp
|
||||
RUN git clone https://github.com/freeswitch/spandsp.git /usr/src/spandsp && \
|
||||
cd /usr/src/spandsp && \
|
||||
./bootstrap.sh && \
|
||||
./configure && \
|
||||
make && \
|
||||
make install
|
||||
|
||||
# freeswitch
|
||||
RUN git clone https://github.com/signalwire/freeswitch.git /usr/src/freeswitch && \
|
||||
cd /usr/src/freeswitch && \
|
||||
git checkout v1.10.11 && \
|
||||
git am /patches/freeswitch/* && \
|
||||
./bootstrap.sh -j && \
|
||||
./configure --enable-core-pgsql-support --disable-fhs && \
|
||||
make && \
|
||||
make install
|
||||
RUN rm -rf /usr/local/freeswitch/conf
|
||||
|
||||
|
||||
FROM library/golang:1.21 AS dynamic-xmlconfig
|
||||
ADD dynamic-xmlconfig /go/dynamic-xmlconfig
|
||||
WORKDIR /go/dynamic-xmlconfig
|
||||
RUN go build -o /dynamic-xmlconfig .
|
||||
|
||||
FROM debian:bookworm-slim
|
||||
RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y libcurl4 libsqlite3-0 libpcre3 libspeexdsp1 libspeex1 libedit2 libtpl0 libodbc2 libtiff6 liblua5.2-0 libopus0 libavformat59 libopus0 libsndfile1 libswscale6 libldns3 libpq5 && apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
COPY --from=build /usr/local/lib /usr/local/lib
|
||||
COPY --from=build /usr/local/freeswitch /usr/local/freeswitch
|
||||
COPY --from=dynamic-xmlconfig /dynamic-xmlconfig /usr/local/bin/dynamic-xmlconfig
|
||||
ADD freeswitch.xml /usr/local/freeswitch/conf/freeswitch.xml
|
||||
RUN ldconfig
|
||||
CMD ["/usr/local/freeswitch/bin/freeswitch", "-nf"]
|
7
containers/freeswitch/README.md
Normal file
7
containers/freeswitch/README.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# FreeSWITCH Container
|
||||
This is an attempt to package a minimal FreeSWITCH container.
|
||||
|
||||
* State is stored in an ODBC database. Must set environment variable `DSN`
|
||||
* Configuration can be retreived from an HTTP server by setting environment variable `CONFIG_URL`. See [mod_curl_xml](https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_xml_curl_1049001/) for details about the HTTP response format.
|
||||
*
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<configuration name="modules.conf" description="Modules">
|
||||
<modules>
|
||||
<load module="mod_console"/>
|
||||
{{ $_, $module := range .Modules }}<load module="{{ $module }}" />{{ end }}
|
||||
</modules>
|
||||
</configuration>
|
|
@ -0,0 +1,8 @@
|
|||
<configuration name="xml_curl.conf" description="cURL XML Gateway">
|
||||
<bindings>
|
||||
<binding name="all configs">
|
||||
<param name="gateway-url" value="{{ .ConfigURL }}"
|
||||
bindings="configuration|dialplan|directory|phrases" />
|
||||
</binding>
|
||||
</bindings>
|
||||
</configuration>
|
5
containers/freeswitch/dynamic-xmlconfig/go.mod
Normal file
5
containers/freeswitch/dynamic-xmlconfig/go.mod
Normal file
|
@ -0,0 +1,5 @@
|
|||
module codeberg.org/thefinn93/freeswitch-container
|
||||
|
||||
go 1.21.5
|
||||
|
||||
require github.com/kelseyhightower/envconfig v1.4.0
|
2
containers/freeswitch/dynamic-xmlconfig/go.sum
Normal file
2
containers/freeswitch/dynamic-xmlconfig/go.sum
Normal file
|
@ -0,0 +1,2 @@
|
|||
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
|
||||
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
165
containers/freeswitch/dynamic-xmlconfig/main.go
Normal file
165
containers/freeswitch/dynamic-xmlconfig/main.go
Normal file
|
@ -0,0 +1,165 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"text/template"
|
||||
|
||||
"github.com/kelseyhightower/envconfig"
|
||||
)
|
||||
|
||||
type Options struct {
|
||||
DSN string `envconfig:"DSN"`
|
||||
ConfigURL string `envconfig:"CONFIG_URL"` // URL called for configuration, see https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_xml_curl_1049001/ (dialplan|directory|phrases will be fetched from to this URL)
|
||||
CaptureServer string `envconfig:"CAPTURE_SERVER"` // if set, this server gets a copy of all SIP messages. Example: udp:homer.domain.com:5060;hep=3;capture_id=100
|
||||
LogLevel string `envconfig:"LOG_LEVEL" default:"info"`
|
||||
Gateway Gateway `envconfig:"GATEWAY"`
|
||||
Modules []string `envconfig:"MODULES" default:"mod_event_socket,mod_sofia,mod_db,mod_dialplan_xml,mod_g723_1,mod_g729,mod_amr,mod_b64,mod_opus,mod_av,mod_sndfile,mod_native_file,mod_png,mod_local_stream,mod_tone_stream,mod_lua,mod_say_en"`
|
||||
}
|
||||
|
||||
type Gateway struct {
|
||||
Name string
|
||||
Username string
|
||||
Password string
|
||||
Extra map[string]string
|
||||
}
|
||||
|
||||
var (
|
||||
//go:embed autoload_configs
|
||||
autoloadConfigsFS embed.FS
|
||||
autoloadConfigsTemplates = template.Must(template.New("autoload_configs").ParseFS(autoloadConfigsFS, "autoload_configs/*"))
|
||||
options Options
|
||||
vars = map[string]string{ // this is used to fill in what is normally in vars.xml
|
||||
"sound_prefix": "$${sounds_dir}/en/us/callie",
|
||||
"domain": "$${local_ip_v4}",
|
||||
"domain_name": "$${domain}",
|
||||
"hold_music": "local_stream://moh",
|
||||
"use_profile": "external",
|
||||
"rtp_sdes_suites": "AEAD_AES_256_GCM_8|AEAD_AES_128_GCM_8|AES_CM_256_HMAC_SHA1_80|AES_CM_192_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_80|AES_CM_256_HMAC_SHA1_32|AES_CM_192_HMAC_SHA1_32|AES_CM_128_HMAC_SHA1_32|AES_CM_128_NULL_AUTH",
|
||||
"global_codec_prefs": "OPUS,G722,PCMU,PCMA,H264,VP8",
|
||||
"outbound_codec_prefs": "OPUS,G722,PCMU,PCMA,H264,VP8",
|
||||
"xmpp_client_profile": "xmppc",
|
||||
"xmpp_server_profile": "xmpps",
|
||||
"bind_server_ip": "auto",
|
||||
"unroll_loops": "true",
|
||||
"outbound_caller_name": "FreeSWITCH",
|
||||
"outbound_caller_id": "0000000000",
|
||||
"call_debug": "false",
|
||||
"console_loglevel": "info",
|
||||
"default_areacode": "918",
|
||||
"default_country": "US",
|
||||
"presence_privacy": "false",
|
||||
"au-ring": "%(400,200,383,417);%(400,2000,383,417)",
|
||||
"be-ring": "%(1000,3000,425)",
|
||||
"ca-ring": "%(2000,4000,440,480)",
|
||||
"cn-ring": "%(1000,4000,450)",
|
||||
"cy-ring": "%(1500,3000,425)",
|
||||
"cz-ring": "%(1000,4000,425)",
|
||||
"de-ring": "%(1000,4000,425)",
|
||||
"dk-ring": "%(1000,4000,425)",
|
||||
"dz-ring": "%(1500,3500,425)",
|
||||
"eg-ring": "%(2000,1000,475,375)",
|
||||
"es-ring": "%(1500,3000,425)",
|
||||
"fi-ring": "%(1000,4000,425)",
|
||||
"fr-ring": "%(1500,3500,440)",
|
||||
"hk-ring": "%(400,200,440,480);%(400,3000,440,480)",
|
||||
"hu-ring": "%(1250,3750,425)",
|
||||
"il-ring": "%(1000,3000,400)",
|
||||
"in-ring": "%(400,200,425,375);%(400,2000,425,375)",
|
||||
"jp-ring": "%(1000,2000,420,380)",
|
||||
"ko-ring": "%(1000,2000,440,480)",
|
||||
"pk-ring": "%(1000,2000,400)",
|
||||
"pl-ring": "%(1000,4000,425)",
|
||||
"ro-ring": "%(1850,4150,475,425)",
|
||||
"rs-ring": "%(1000,4000,425)",
|
||||
"ru-ring": "%(800,3200,425)",
|
||||
"sa-ring": "%(1200,4600,425)",
|
||||
"tr-ring": "%(2000,4000,450)",
|
||||
"uk-ring": "%(400,200,400,450);%(400,2000,400,450)",
|
||||
"us-ring": "%(2000,4000,440,480)",
|
||||
"bong-ring": "v",
|
||||
"beep": "%(1000,0,640)",
|
||||
"sit": "%(274,0,913.8);%(274,0,1370.6);%(380,0,1776.7)",
|
||||
"df_us_ssn": "(?!219099999|078051120)(?!666|000|9d{2})d{3}(?!00)d{2}(?!0{4})d{4}",
|
||||
"df_luhn": "?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35d{3})d{11}",
|
||||
"default_provider": "example.com",
|
||||
"default_provider_username": "joeuser",
|
||||
"default_provider_password": "password",
|
||||
"default_provider_from_domain": "example.com",
|
||||
"default_provider_register": "false",
|
||||
"default_provider_contact": "5000",
|
||||
"sip_tls_version": "tlsv1,tlsv1.1,tlsv1.2",
|
||||
"sip_tls_ciphers": "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH",
|
||||
"internal_auth_calls": "true",
|
||||
"internal_sip_port": "5060",
|
||||
"internal_tls_port": "5061",
|
||||
"internal_ssl_enable": "false",
|
||||
"external_auth_calls": "false",
|
||||
"external_sip_port": "5080",
|
||||
"external_tls_port": "5081",
|
||||
"external_ssl_enable": "false",
|
||||
"rtp_video_max_bandwidth_in": "3mb",
|
||||
"rtp_video_max_bandwidth_out": "3mb",
|
||||
"suppress_cng": "true",
|
||||
"rtp_liberal_dtmf": "true",
|
||||
"video_mute_png": "$${images_dir}/default-mute.png",
|
||||
"video_no_avatar_png": "$${images_dir}/default-avatar.png",
|
||||
}
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := envconfig.Process("", &options); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if options.ConfigURL != "" {
|
||||
options.Modules = append(options.Modules, "mod_xml_curl")
|
||||
}
|
||||
|
||||
// autoload_configs
|
||||
for k, v := range vars {
|
||||
fmt.Printf("<X-PRE-PROCESS cmd=\"set\" data=\"%s=%s\"/>\n", k, v)
|
||||
}
|
||||
|
||||
fmt.Println("<section name=\"configuration\" description=\"Various Configuration\">")
|
||||
|
||||
configs, err := autoloadConfigsFS.ReadDir("autoload_configs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, file := range configs {
|
||||
if file.IsDir() {
|
||||
fmt.Println("skipping dir: ", file.Name())
|
||||
continue
|
||||
}
|
||||
if err := autoloadConfigsTemplates.ExecuteTemplate(os.Stdout, file.Name(), options); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println("</section>")
|
||||
}
|
||||
|
||||
func (g *Gateway) Decode(value string) error {
|
||||
u, err := url.Parse(value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
g.Name = u.Hostname()
|
||||
g.Username = u.User.Username()
|
||||
if password, ok := u.User.Password(); ok {
|
||||
g.Password = password
|
||||
}
|
||||
|
||||
g.Extra = make(map[string]string)
|
||||
for k, v := range u.Query() {
|
||||
if len(v) > 0 {
|
||||
g.Extra[k] = v[0]
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
10
containers/freeswitch/freeswitch.xml
Normal file
10
containers/freeswitch/freeswitch.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0"?>
|
||||
<document type="freeswitch/xml">
|
||||
<!--
|
||||
these two stun-sets are from the stock vars.xml and I cant quickly find documentation on them,
|
||||
so I'm leaving them for now. Everyting else is in that file is just "set"
|
||||
-->
|
||||
<X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=stun:stun.freeswitch.org"/>
|
||||
<X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=stun:stun.freeswitch.org"/>
|
||||
<X-PRE-PROCESS cmd="exec" data="/usr/local/bin/dynamic-xmlconfig" />
|
||||
</document>
|
|
@ -0,0 +1,61 @@
|
|||
From 9d91452d5a0a4a44884ff74fa2e49c51aaaa32dd Mon Sep 17 00:00:00 2001
|
||||
From: nobody <nobody@localhost>
|
||||
Date: Wed, 24 Jan 2024 21:19:50 -0800
|
||||
Subject: [PATCH 1/2] Fix mod_spandsp build
|
||||
|
||||
based on https://github.com/xrobau/freeswitch-ubuntubuilder/blob/master/patches/freeswitch/005-spandsp-updates.patch
|
||||
---
|
||||
src/mod/applications/mod_spandsp/mod_spandsp_dsp.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
|
||||
index 836808a48d..9558f42169 100644
|
||||
--- a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
|
||||
+++ b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
|
||||
@@ -156,13 +156,13 @@ static int get_v18_mode(switch_core_session_t *session)
|
||||
{
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
const char *var;
|
||||
- int r = V18_MODE_5BIT_4545;
|
||||
+ int r = V18_MODE_WEITBRECHT_5BIT_4545;
|
||||
|
||||
if ((var = switch_channel_get_variable(channel, "v18_mode"))) {
|
||||
if (!strcasecmp(var, "5BIT_45") || !strcasecmp(var, "baudot")) {
|
||||
- r = V18_MODE_5BIT_4545;
|
||||
+ r = V18_MODE_WEITBRECHT_5BIT_4545;
|
||||
} else if (!strcasecmp(var, "5BIT_50")) {
|
||||
- r = V18_MODE_5BIT_50;
|
||||
+ r = V18_MODE_WEITBRECHT_5BIT_50;
|
||||
} else if (!strcasecmp(var, "DTMF")) {
|
||||
r = V18_MODE_DTMF;
|
||||
} else if (!strcasecmp(var, "EDT")) {
|
||||
@@ -213,7 +213,7 @@ switch_status_t spandsp_tdd_send_session(switch_core_session_t *session, const c
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
- tdd_state = v18_init(NULL, TRUE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, NULL);
|
||||
+ tdd_state = v18_init(NULL, TRUE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, NULL, NULL, NULL);
|
||||
|
||||
|
||||
v18_put(tdd_state, text, -1);
|
||||
@@ -260,7 +260,7 @@ switch_status_t spandsp_tdd_encode_session(switch_core_session_t *session, const
|
||||
}
|
||||
|
||||
pvt->session = session;
|
||||
- pvt->tdd_state = v18_init(NULL, TRUE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, NULL);
|
||||
+ pvt->tdd_state = v18_init(NULL, TRUE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, NULL, NULL, NULL);
|
||||
pvt->head_lead = TDD_LEAD;
|
||||
|
||||
v18_put(pvt->tdd_state, text, -1);
|
||||
@@ -338,7 +338,7 @@ switch_status_t spandsp_tdd_decode_session(switch_core_session_t *session)
|
||||
}
|
||||
|
||||
pvt->session = session;
|
||||
- pvt->tdd_state = v18_init(NULL, FALSE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, pvt);
|
||||
+ pvt->tdd_state = v18_init(NULL, FALSE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, pvt, NULL, NULL);
|
||||
|
||||
if ((status = switch_core_media_bug_add(session, "spandsp_tdd_decode", NULL,
|
||||
tdd_decode_callback, pvt, 0, SMBF_READ_REPLACE | SMBF_NO_PAUSE, &bug)) != SWITCH_STATUS_SUCCESS) {
|
||||
--
|
||||
2.39.2
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
From 28b7f07ae806a975074e8d0087263f6965f24ae3 Mon Sep 17 00:00:00 2001
|
||||
From: nobody <nobody@localhost>
|
||||
Date: Wed, 24 Jan 2024 21:20:07 -0800
|
||||
Subject: [PATCH] disable some cloud bullshit, enable some other bullshit
|
||||
|
||||
---
|
||||
build/modules.conf.in | 19 +++++++++----------
|
||||
1 file changed, 9 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/build/modules.conf.in b/build/modules.conf.in
|
||||
index 7bf59e2acc..22ddc03845 100644
|
||||
--- a/build/modules.conf.in
|
||||
+++ b/build/modules.conf.in
|
||||
@@ -3,12 +3,12 @@ applications/mod_av
|
||||
#applications/mod_avmd
|
||||
#applications/mod_bert
|
||||
#applications/mod_blacklist
|
||||
-#applications/mod_callcenter
|
||||
-#applications/mod_cidlookup
|
||||
+applications/mod_callcenter
|
||||
+applications/mod_cidlookup
|
||||
#applications/mod_cluechoo
|
||||
applications/mod_commands
|
||||
applications/mod_conference
|
||||
-#applications/mod_curl
|
||||
+applications/mod_curl
|
||||
#applications/mod_cv
|
||||
applications/mod_db
|
||||
#applications/mod_directory
|
||||
@@ -17,7 +17,7 @@ applications/mod_dptools
|
||||
#applications/mod_easyroute
|
||||
applications/mod_enum
|
||||
applications/mod_esf
|
||||
-#applications/mod_esl
|
||||
+applications/mod_esl
|
||||
applications/mod_expr
|
||||
applications/mod_fifo
|
||||
#applications/mod_fsk
|
||||
@@ -28,7 +28,7 @@ applications/mod_httapi
|
||||
#applications/mod_http_cache
|
||||
#applications/mod_ladspa
|
||||
#applications/mod_lcr
|
||||
-#applications/mod_memcache
|
||||
+applications/mod_memcache
|
||||
#applications/mod_mongo
|
||||
#applications/mod_mp4
|
||||
#applications/mod_mp4v2
|
||||
@@ -39,7 +39,6 @@ applications/mod_httapi
|
||||
#applications/mod_rad_auth
|
||||
#applications/mod_redis
|
||||
#applications/mod_rss
|
||||
-applications/mod_signalwire
|
||||
applications/mod_sms
|
||||
#applications/mod_sms_flowroute
|
||||
#applications/mod_snapshot
|
||||
@@ -121,7 +120,7 @@ formats/mod_native_file
|
||||
formats/mod_png
|
||||
#formats/mod_portaudio_stream
|
||||
#formats/mod_shell_stream
|
||||
-#formats/mod_shout
|
||||
+formats/mod_shout
|
||||
formats/mod_sndfile
|
||||
#formats/mod_ssml
|
||||
formats/mod_tone_stream
|
||||
@@ -138,8 +137,8 @@ languages/mod_lua
|
||||
#languages/mod_yaml
|
||||
loggers/mod_console
|
||||
#loggers/mod_graylog2
|
||||
-loggers/mod_logfile
|
||||
-loggers/mod_syslog
|
||||
+#loggers/mod_logfile
|
||||
+#loggers/mod_syslog
|
||||
#loggers/mod_raven
|
||||
#say/mod_say_de
|
||||
say/mod_say_en
|
||||
@@ -162,7 +161,7 @@ say/mod_say_en
|
||||
#timers/mod_posix_timer
|
||||
#timers/mod_timerfd
|
||||
xml_int/mod_xml_cdr
|
||||
-#xml_int/mod_xml_curl
|
||||
+xml_int/mod_xml_curl
|
||||
#xml_int/mod_xml_ldap
|
||||
#xml_int/mod_xml_radius
|
||||
xml_int/mod_xml_rpc
|
||||
--
|
||||
2.39.2
|
||||
|
Loading…
Reference in a new issue