fs-registrator
FreeSWITCH Sofia-SIP Registry Bridge (Sync to Key/Value Store)

Summary
When run and pointed at a FreeSWITCH instance, will take note of all Sofia-SIP registrations, and propagate them to a (replicated) K/V store for lookups.
Useful for discovering which SIP registrations reside on which server/s.
We use ESL events + a semi-regular sync for reconciliation (to gracefully handle restarts and/or missed events).
Supported K/V Stores
Currently the focus is on etcd, with the intention to support others in future. Consul and redis would be the most likely next targets (both support prefix-based wildcard lookups and TTLs for the most part).
New K/V store backends can be added, see kv_etcd.go for an example implementation. As long as you satisfy the KvBackend interface and register the backend, it will be available.
Configuration
Configuration is performed via CLI arguments, and self documenting using --help
:
NAME:
fs-registrator - FreeSWITCH Sofia-SIP Registry Bridge (Sync to Key/Value Store)
USAGE:
fs-registrator [global options] command [command options] [arguments...]
VERSION:
0.1.0
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--fshost value FreeSWITCH ESL Hostname/IP (default: "localhost")
--fsport value FreeSWITCH ESL Port (default: 8021)
--fspassword value FreeSWITCH ESL Password (default: "ClueCon")
--fsprofiles value List of Sofia Profiles to watch (comma separated list) (default: "internal")
--fsadvertiseip value SIP Destination IP to store in K/V Store for FreeSWITCH
--fsadvertiseport value SIP Destination Port to store in K/V Store for FreeSWITCH
--kvbackend value Key/Value Backend (one of: etcd) (default: "etcd")
--kvhost value Key/Value Store Hostname/IP (default: "etcd")
--kvport value Key/Value Store Port (default: 2379)
--kvprefix value Key Space Prefix in K/V Store to store Registrations (default: "fs_registrations")
--syncinterval value Interval (in seconds) between full sync. A full sync is performed on initial startup also. (default: 3600)
--help, -h show help
--version, -v print the version
Building
go get -d && go build
should produce a single executable. Binary releases are also available here
Running Tests
You'll need to add sip.testserver.tld
to your /etc/hosts
file, to workaround sipsak wanting a resolveable hostname for some tests. For background, see this mailing list post. Something like the below is fine in /etc/hosts
:
127.0.0.1 sip.testserver.tld
Also, some of the tests rely on Docker containers to provide a real FreeSWITCH/etcd instances. Ensure you have Docker + Docker Compose installed, then run:
docker-compose pull
go test
Tests requiring Docker use libcompose in main_test.go