Extend readme with setup documentation
This commit is contained in:
parent
548f6beb9f
commit
4253a39684
394
README.md
394
README.md
@ -2,9 +2,401 @@
|
|||||||
|
|
||||||
A simple to use, good enough phone system for medium sized DECT networks.
|
A simple to use, good enough phone system for medium sized DECT networks.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
FieldPOC requires a Mitel SIP DECT phone system, i.e. RFP L43 WLAN.
|
||||||
|
Make sure you have the equipment, else this software is quit useless.
|
||||||
|
|
||||||
|
Get a computer, i.e. an APU Board, and install Archlinux on it.
|
||||||
|
This can be a VM too, but you have to adapt stuff.
|
||||||
|
|
||||||
|
### Config
|
||||||
|
|
||||||
|
Create a file `fieldpoc_config.json`.
|
||||||
|
This is your FieldPOC config in JSON format.
|
||||||
|
You will add details to it with each step.
|
||||||
|
|
||||||
|
### Networking
|
||||||
|
|
||||||
|
We assume you use two network interfaces `enp2s0` and `enp3s0`.
|
||||||
|
Configuration examples are for systemd-networkd.
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl enable --now systemd-networkd.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Your FieldPOC box will act as a normal DHCP Client on `enp2s0`.
|
||||||
|
This is the interface you connect to the internet and where you may connect to the box via SSH.
|
||||||
|
|
||||||
|
`/etc/systemd/network/20-wired.network`
|
||||||
|
```
|
||||||
|
[Match]
|
||||||
|
Name=enp2s0
|
||||||
|
|
||||||
|
[Network]
|
||||||
|
DHCP=yes
|
||||||
|
```
|
||||||
|
|
||||||
|
The other interface `enp3s0` will be the DECT network.
|
||||||
|
This is the network where you connect your RFPs.
|
||||||
|
We will run a dedicated DHCP Server on this network.
|
||||||
|
|
||||||
|
`/etc/systemd/network/30-dect.network`
|
||||||
|
```
|
||||||
|
[Match]
|
||||||
|
Name=enp3s0
|
||||||
|
|
||||||
|
[Network]
|
||||||
|
Address=10.222.222.1/24
|
||||||
|
```
|
||||||
|
|
||||||
|
As the DHCP Server for this network we use `kea`.
|
||||||
|
|
||||||
|
```
|
||||||
|
pacman -S kea
|
||||||
|
```
|
||||||
|
|
||||||
|
`/etc/kea/kea-dhcp4.conf`
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"Dhcp4": {
|
||||||
|
"interfaces-config": {
|
||||||
|
"interfaces": [
|
||||||
|
"enp3s0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"lease-database": {
|
||||||
|
"name": "/var/lib/kea/dhcp4.leases",
|
||||||
|
"persist": true,
|
||||||
|
"type": "memfile"
|
||||||
|
},
|
||||||
|
"option-def": [
|
||||||
|
{
|
||||||
|
"code": 43,
|
||||||
|
"encapsulate": "sipdect",
|
||||||
|
"name": "vendor-encapsulated-options",
|
||||||
|
"space": "dhcp4",
|
||||||
|
"type": "empty"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": 10,
|
||||||
|
"name": "ommip1",
|
||||||
|
"space": "sipdect",
|
||||||
|
"type": "ipv4-address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": 19,
|
||||||
|
"name": "ommip2",
|
||||||
|
"space": "sipdect",
|
||||||
|
"type": "ipv4-address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": 14,
|
||||||
|
"name": "syslogip",
|
||||||
|
"space": "sipdect",
|
||||||
|
"type": "ipv4-address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": 15,
|
||||||
|
"name": "syslogport",
|
||||||
|
"space": "sipdect",
|
||||||
|
"type": "int16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": 224,
|
||||||
|
"name": "magic_str",
|
||||||
|
"space": "dhcp4",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"subnet4": [
|
||||||
|
{
|
||||||
|
"option-data": [
|
||||||
|
{
|
||||||
|
"data": "10.222.222.1",
|
||||||
|
"name": "routers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"pool": "10.222.222.100 - 10.222.222.200"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reservations": [
|
||||||
|
{
|
||||||
|
"hostname": "<name of your oom>",
|
||||||
|
"hw-address": "<mac address of your oom>",
|
||||||
|
"ip-address": "10.222.222.11",
|
||||||
|
"option-data": [
|
||||||
|
{
|
||||||
|
"data": "<name of your oom>",
|
||||||
|
"name": "host-name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vendor-encapsulated-options"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "10.222.222.11",
|
||||||
|
"name": "ommip1",
|
||||||
|
"space": "sipdect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "OpenMobilitySIP-DECT",
|
||||||
|
"name": "magic_str"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"subnet": "10.222.222.0/24"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Start the service.
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl enable --now kea-dhcp4
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
```
|
||||||
|
pacman -S postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
Init database.
|
||||||
|
|
||||||
|
```
|
||||||
|
su - postgres -c "initdb --locale en_US.UTF-8 -D '/var/lib/postgres/data'"
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl enable --now postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
Open SQL shell
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo -u postgres psql
|
||||||
|
```
|
||||||
|
|
||||||
|
Create database and user for routing engine.
|
||||||
|
Change the password.
|
||||||
|
|
||||||
|
```
|
||||||
|
CREATE USER fieldpoc WITH PASSWORD 'fieldpoc';
|
||||||
|
CREATE DATABASE fieldpoc WITH OWNER fieldpoc;
|
||||||
|
```
|
||||||
|
|
||||||
|
Add the database credetials to your `fieldpoc_config.json`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"database": {
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"username": "fieldpoc",
|
||||||
|
"password": "fieldpoc",
|
||||||
|
"database": "fieldpoc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Phone Server
|
||||||
|
|
||||||
|
```
|
||||||
|
pacman -S yate
|
||||||
|
```
|
||||||
|
|
||||||
|
Remove all files in `/etc/yate/` and add the following instead:
|
||||||
|
|
||||||
|
#### Dialout SIP connection
|
||||||
|
|
||||||
|
`accfile.conf`
|
||||||
|
```
|
||||||
|
[dialout]
|
||||||
|
enabled=yes
|
||||||
|
protocol=sip
|
||||||
|
registrar=10.222.222.254
|
||||||
|
username=dialout
|
||||||
|
password=xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Call deduplication
|
||||||
|
|
||||||
|
`cdrbuild.conf`
|
||||||
|
```
|
||||||
|
[parameters]
|
||||||
|
X-Eventphone-Id=false
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Yate remote control socket
|
||||||
|
|
||||||
|
`extmodule.conf`
|
||||||
|
```
|
||||||
|
[listener fieldpoc]
|
||||||
|
type=tcp
|
||||||
|
addr=127.0.0.1
|
||||||
|
port=5039
|
||||||
|
```
|
||||||
|
|
||||||
|
Add the information for the remote control socket to `fieldpoc_config.json`:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"yate": {
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 5039
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Database connection
|
||||||
|
|
||||||
|
Replace credentials with the ones you have choosen.
|
||||||
|
|
||||||
|
`pgsqldb.conf`
|
||||||
|
```
|
||||||
|
[default]
|
||||||
|
host=127.0.0.1
|
||||||
|
database=fieldpoc
|
||||||
|
user=fieldpoc
|
||||||
|
password=fieldpoc
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Call routing
|
||||||
|
|
||||||
|
`regexroute.conf`
|
||||||
|
```
|
||||||
|
[default]
|
||||||
|
${username}^$=-;error=noauth
|
||||||
|
^iocaste$=goto dialin
|
||||||
|
^99991001$=tone/dial
|
||||||
|
^99991002$=tone/busy
|
||||||
|
^99991003$=tone/ring
|
||||||
|
^99991004$=tone/specdial
|
||||||
|
^99991005$=tone/congestion
|
||||||
|
^99991006$=tone/outoforder
|
||||||
|
^99991007$=tone/milliwatt
|
||||||
|
^99991008$=tone/info
|
||||||
|
^.*$=line/\0;line=dialout
|
||||||
|
|
||||||
|
[dialin]
|
||||||
|
${sip_x-called}^.*$=lateroute/\1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### User registration
|
||||||
|
|
||||||
|
`register.conf`
|
||||||
|
```
|
||||||
|
[general]
|
||||||
|
expires=30
|
||||||
|
|
||||||
|
user.auth=yes
|
||||||
|
user.register=yes
|
||||||
|
user.unregister=yes
|
||||||
|
engine.timer=yes
|
||||||
|
;call.preroute=no
|
||||||
|
call.cdr=yes
|
||||||
|
linetracker=yes
|
||||||
|
|
||||||
|
[default]
|
||||||
|
priority=10
|
||||||
|
account=default
|
||||||
|
|
||||||
|
[user.auth]
|
||||||
|
query=SELECT password FROM users WHERE username='${username}' AND password IS NOT NULL AND password<>'' AND type='user' LIMIT 1;
|
||||||
|
result=password
|
||||||
|
|
||||||
|
[user.register]
|
||||||
|
query=INSERT INTO registrations (username, location, oconnection_id, expires) VALUES ('${username}', '${data}', '${oconnection_id}', NOW() + INTERVAL '${expires} s') ON CONFLICT ON CONSTRAINT uniq_registrations DO UPDATE SET expires = NOW() + INTERVAL '${expires} s'
|
||||||
|
|
||||||
|
[user.unregister]
|
||||||
|
query=DELETE FROM registrations WHERE (username = '${username}' AND location = '${data}' AND oconnection_id = '${connection_id}') OR ('${username}' = '' AND '${data}' = '' AND oconnection_id = '${connection_id}')
|
||||||
|
|
||||||
|
[engine.timer]
|
||||||
|
query=DELETE FROM registrations WHERE expires<=CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
|
[call.cdr]
|
||||||
|
critical=no
|
||||||
|
|
||||||
|
[linetracker]
|
||||||
|
critical=yes
|
||||||
|
initquery=UPDATE users SET inuse=0 WHERE inuse is not NULL;DELETE from active_calls;
|
||||||
|
cdr_initialize=UPDATE users SET inuse=inuse+1 WHERE username='${external}';INSERT INTO active_calls SELECT username, x_eventphone_id FROM (SELECT '${external}' as username, '${X-Eventphone-Id}' as x_eventphone_id, '${direction}' as direction) as active_call WHERE x_eventphone_id != '' AND x_eventphone_id IS NOT NULL and direction = 'outgoing';
|
||||||
|
cdr_finalize=UPDATE users SET inuse=(CASE WHEN inuse>0 THEN inuse-1 ELSE 0 END) WHERE username='${external}';DELETE FROM active_calls WHERE username = '${external}' AND x_eventphone_id = '${X-Eventphone-Id}' AND '${direction}' = 'outgoing';
|
||||||
|
```
|
||||||
|
|
||||||
|
### DECT
|
||||||
|
|
||||||
|
Just choose one of your RFPs as your OMM.
|
||||||
|
Find out the MAC address and fill it in the according fields in the kea config before.
|
||||||
|
|
||||||
|
Create a privileged user account and add the credentials to `fieldpoc_config.json`:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"omm": {
|
||||||
|
"host": "10.222.222.11",
|
||||||
|
"username": "omm",
|
||||||
|
"password": "<password>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### FieldPOC
|
||||||
|
|
||||||
|
Make sure Python is installed.
|
||||||
|
|
||||||
|
```
|
||||||
|
pacman -S python
|
||||||
|
```
|
||||||
|
|
||||||
|
Install FieldPOC:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip install git+https://git.clerie.de/clerie/fieldpoc@main
|
||||||
|
```
|
||||||
|
|
||||||
|
FieldPOC provides a telnet socket for debugging and state mangement, add config for this to `fieldpoc_config.json` too:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"controller": {
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 9437
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Init
|
||||||
|
|
||||||
|
Some datastructures have get prepared once:
|
||||||
|
|
||||||
|
```
|
||||||
|
fieldpoc -c /path/to/fieldpoc_config.json -e /path/to/fieldpoc_extensions.json --init
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run
|
||||||
|
|
||||||
|
```
|
||||||
|
fieldpoc -c /path/to/fieldpoc_config.json -e /path/to/fieldpoc_extensions.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Debug
|
||||||
|
|
||||||
|
Show log messages:
|
||||||
|
|
||||||
|
```
|
||||||
|
fieldpoc -c /path/to/fieldpoc_config.json -e /path/to/fieldpoc_extensions.json --debug
|
||||||
|
```
|
||||||
|
|
||||||
## Development setup
|
## Development setup
|
||||||
|
|
||||||
Make sure you have [mitel_ommclient2]() in your Python modules path.
|
Make sure you have [mitel_ommclient2](https://git.clerie.de/clerie/mitel_ommclient2) in your Python modules path.
|
||||||
|
|
||||||
Add user credentials to your OMM to `fieldpoc_config.json`.
|
Add user credentials to your OMM to `fieldpoc_config.json`.
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"port": 9437
|
"port": 9437
|
||||||
},
|
},
|
||||||
"dect": {
|
"dect": {
|
||||||
"host": "192.168.0.100",
|
"host": "10.222.222.11",
|
||||||
"username": "omm",
|
"username": "omm",
|
||||||
"password": "xxx"
|
"password": "xxx"
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user