Version 4.4.3 - Fix downstream not conforming to its configuration

This commit is contained in:
Chrystian Huot 2020-08-19 08:08:29 -04:00
parent 3c48a65ef1
commit 22cde4d08b
7 changed files with 240 additions and 201 deletions

View file

@ -1,6 +1,6 @@
{
"name": "rdio-scanner-client",
"version": "4.4.2",
"version": "4.4.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -234,9 +234,9 @@
}
},
"@angular/animations": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.9.tgz",
"integrity": "sha512-NcQOlLQNR50qIvEjR/yo28P6Nh0hf9GRuy+4iCxHiRNZyBL8AwX/y+8/NpgSRoL/U+Iq4bXz5DSOkmrtZfFHXg==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.10.tgz",
"integrity": "sha512-lIbNeLVVl9bO41orPFpKoobCvxZIZ2wdcKJBEFtQiOdw0khRQQ8k7so4TAWOZXRJR+MkOUCjU2pO8gbMXgBweQ==",
"requires": {
"tslib": "^2.0.0"
}
@ -293,25 +293,25 @@
}
},
"@angular/common": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.9.tgz",
"integrity": "sha512-zg1xtTR8LwLXfTcXX0rL30ur1GKaf3Iu8FCQpfh0804Ezn5TeovuGg2zvf/O3igwmYzrym+a0JRMe4TZsAuJxQ==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.10.tgz",
"integrity": "sha512-p6/pTk0s0Ai5uUkOHHFZwp+TjxRNPldPxTU2LVxg2xuBEQTO53BsfBKn3zi74epdb1kBC0Yjdj6yEL4dITBs7A==",
"requires": {
"tslib": "^2.0.0"
}
},
"@angular/compiler": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.9.tgz",
"integrity": "sha512-KUIRkOoZ0C7IlJ514ahyA1VDmlLrh9wBF/hm6e7fKMUAzPTwch6WQczjw/Bdt8ArL3ovYasbFungBvJ7apENtw==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.10.tgz",
"integrity": "sha512-fO7kml0HUgnMa5eviKUk+j7NACASkoMAEgvbcVdKmGsSDu9YVkaqSdLXuj2vu9glSJWDRkZJKSrt9MzbmhyB5A==",
"requires": {
"tslib": "^2.0.0"
}
},
"@angular/compiler-cli": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.9.tgz",
"integrity": "sha512-E4WxTYO4zY7ytMna5Y8Yoh58KPJKjDn3tzefLNrBEX3t69XueYmh5JTRHmNOiWcFX2QIbgqzX9mXZ9uPLDslmg==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.10.tgz",
"integrity": "sha512-XkvWdJKr6HkyzAbcmy99HyDR4z949z9nHGwHNLBQjLbkX11i03fvS3bI5kgwqtNiLWYqxiPfXnpAyLBeFghCcw==",
"dev": true,
"requires": {
"canonical-path": "1.0.0",
@ -492,9 +492,9 @@
}
},
"@angular/core": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.9.tgz",
"integrity": "sha512-sRod8RnARYmMy/uBmZyLxt5F3vYIvAkTEv48DFvCKJ6FN7zJPS7C7/dnnDv0JG7hNsX3jVXCsIRWJiCk0ycDGg==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.10.tgz",
"integrity": "sha512-PIQhLqjZayVXJoXs4WQu7orkePqFiux19y7bgBrsSAithe+g9BkrSIdX7+tkkX0zggUWKywY92YuMZCJ/S+uiw==",
"requires": {
"tslib": "^2.0.0"
}
@ -508,9 +508,9 @@
}
},
"@angular/forms": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.9.tgz",
"integrity": "sha512-t/ZjPFHz5LLj5osvNTkBibcF5Y1XrOwmgX8e6FPl2OTM/NcEyqUPWQmcGhy1Wc7jxP6JVWSWLrqI5QKkATHSBA==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.10.tgz",
"integrity": "sha512-bWjbsqMTiCNQZzXAfiEwT/tiAzSvChnqBimrJWNSHVYRkp71TkDcKXn6mA+E//YR0eZ84GKNNiVlKFxqkmeyqQ==",
"requires": {
"tslib": "^2.0.0"
}
@ -524,25 +524,25 @@
}
},
"@angular/platform-browser": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.9.tgz",
"integrity": "sha512-y6d2CLj6ZM0NpJGH5yfNBTVyMiOwUXFfVRw52MWQ4Kt2Auk0EROG6dWAVL0XcE9OGXBI/U/4wemmQ9LQy7wLSA==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.10.tgz",
"integrity": "sha512-srNGkvg9177skff7QOe3L+nGOSbrKLzFt3Z5O3oM0N0TWr8QlWEA+zQm8n0zLHI8AmdZbmFzAYYJiBvVCSc5RQ==",
"requires": {
"tslib": "^2.0.0"
}
},
"@angular/platform-browser-dynamic": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.9.tgz",
"integrity": "sha512-iRkBAErsYNG5lPglA8bZfsKQTuVBAl6IVc0TNlGNCePQM1blZ0f2BjMoqBWrbTi5xGgGu2cmJcy9M6hob2sgzw==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.10.tgz",
"integrity": "sha512-6jbn0Ldyc+80BCETGtE7pzfKlbjfa/wEPhLEGWoYtxrrJ5UB3CblGpDMOsv1ibOQijPZ/JSmIMmAxz66+pLx3g==",
"requires": {
"tslib": "^2.0.0"
}
},
"@angular/service-worker": {
"version": "10.0.9",
"resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-10.0.9.tgz",
"integrity": "sha512-hrngIkRHhMQaJ0D61kkgstLVDjOASy8j0f+z9AHO4GlILeQlCxzHb5gqd5L6zkQ7MMs8BDSP9JBKw+Tonj4e1A==",
"version": "10.0.10",
"resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-10.0.10.tgz",
"integrity": "sha512-YcblyEhTjfO7BEYK6UlAqTsgPcz16ftaeAraNwE+5p2igxeuyq7LGFTaQGM8nJkK0wWxNU42Nr/3VluwqyU8Xg==",
"requires": {
"tslib": "^2.0.0"
}
@ -1810,9 +1810,9 @@
"dev": true
},
"@types/node": {
"version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
"version": "14.6.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz",
"integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==",
"dev": true
},
"@types/q": {
@ -2951,9 +2951,9 @@
}
},
"caniuse-lite": {
"version": "1.0.30001114",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001114.tgz",
"integrity": "sha512-ml/zTsfNBM+T1+mjglWRPgVsu2L76GAaADKX5f4t0pbhttEp0WMawJsHDYlFkVZkoA+89uvBRrVrEE4oqenzXQ==",
"version": "1.0.30001116",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001116.tgz",
"integrity": "sha512-f2lcYnmAI5Mst9+g0nkMIznFGsArRmZ0qU+dnq8l91hymdc2J3SFbiPhOJEeDqC1vtE8nc1qNQyklzB8veJefQ==",
"dev": true
},
"canonical-path": {
@ -3197,6 +3197,12 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
"dev": true
},
"zone.js": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
"integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==",
"dev": true
}
}
},
@ -4302,9 +4308,9 @@
"dev": true
},
"electron-to-chromium": {
"version": "1.3.533",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz",
"integrity": "sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A==",
"version": "1.3.538",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.538.tgz",
"integrity": "sha512-rlyYXLlOoZkJuvY4AJXUpP7CHRVtwZz311HPVoEO1UHo/kqDCsP1pNas0A9paZuPEiYGdLwrjllF2hs69NEaTw==",
"dev": true
},
"elliptic": {
@ -7339,9 +7345,9 @@
}
},
"npm-registry-fetch": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.6.tgz",
"integrity": "sha512-SEp9m7fPe8FIKzhg2JS+xs+w4YY9mEwRlMcEZRELph7rdoygIQGY6B+g0+wdZqokHE8f57ZkexxYWqFO0FkfCw==",
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz",
"integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==",
"dev": true,
"requires": {
"JSONStream": "^1.3.4",
@ -12305,9 +12311,12 @@
"dev": true
},
"zone.js": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
"integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg=="
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.0.tgz",
"integrity": "sha512-Aeh31lIySDLetjIyTxk1X+j6jxWPHH99cLuOreApK0hNrEogxEO+cPhx5wQaeg7d7KcAFWrA6ZlIVTv7MTasyA==",
"requires": {
"tslib": "^2.0.0"
}
}
}
}

View file

@ -1,26 +1,26 @@
{
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
"dependencies": {
"@angular/animations": "^10.0.9",
"@angular/animations": "^10.0.10",
"@angular/cdk": "^10.1.3",
"@angular/common": "~10.0.9",
"@angular/compiler": "~10.0.9",
"@angular/core": "~10.0.9",
"@angular/common": "~10.0.10",
"@angular/compiler": "~10.0.10",
"@angular/core": "~10.0.10",
"@angular/flex-layout": "^10.0.0-beta.32",
"@angular/forms": "~10.0.9",
"@angular/forms": "~10.0.10",
"@angular/material": "^10.1.3",
"@angular/platform-browser": "~10.0.9",
"@angular/platform-browser-dynamic": "~10.0.9",
"@angular/service-worker": "~10.0.9",
"@angular/platform-browser": "~10.0.10",
"@angular/platform-browser-dynamic": "~10.0.10",
"@angular/service-worker": "~10.0.10",
"rxjs": "~6.6.2",
"tslib": "^2.0.1",
"zone.js": "~0.10.3"
"zone.js": "~0.11.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.1000.6",
"@angular/cli": "^10.0.6",
"@angular/compiler-cli": "~10.0.9",
"@types/node": "~14.0.27",
"@angular/compiler-cli": "~10.0.10",
"@types/node": "~14.6.0",
"codelyzer": "^6.0.0",
"ts-node": "~8.10.2",
"tslint": "~6.1.3",
@ -33,5 +33,5 @@
"build": "ng build --base-href ./ --prod",
"start": "ng serve"
},
"version": "4.4.2"
"version": "4.4.3"
}

View file

@ -10,94 +10,94 @@ This file is at the heart of [Rdio Scanner](https://github.com/chuot/rdio-scanne
``` js
{
"nodejs": {
// (string) "development" or "production". Default is "production".
"environment": "production",
"nodejs": {
// (string) "development" or "production". Default is "production".
"environment": "production",
// (string) Which IP to bind to? Default is "0.0.0.0"
"host": "0.0.0.0",
// (string) Which IP to bind to? Default is "0.0.0.0"
"host": "0.0.0.0",
// (number) Which PORT to bind to? Default is 3000
"port": 3000,
// (number) Which PORT to bind to? Default is 3000
"port": 3000,
// (string) Path to the SSL CA certificate
// See SSL certificates section below for more details
"sslCA": null,
// (string) Path to the SSL CA certificate
// See SSL certificates section below for more details
"sslCA": null,
// (string) Path to the SSL certificate
// See SSL certificates section below for more details
"sslCert": null,
// (string) Path to the SSL certificate
// See SSL certificates section below for more details
"sslCert": null,
// (string) Path to the SSL privat key
// See SSL certificates section below for more details
"sslKey": null
},
// (string) Path to the SSL privat key
// See SSL certificates section below for more details
"sslKey": null
},
"rdioScanner": {
// (multiple types) Access control for Rdio Scanner
// See Access control section below for more details
"access": null,
"rdioScanner": {
// (multiple types) Access control for Rdio Scanner
// See Access control section below for more details
"access": null,
// (multiple types) API keys for upload scripts and downstreamers
// Default value is a random generated UUID
// See API keys section below for more details
"apiKeys": "<random generated uuid>",
// (multiple types) API keys for upload scripts and downstreamers
// Default value is a random generated UUID
// See API keys section below for more details
"apiKeys": "<random generated uuid>",
// (object[]) Directory monitoring for ingestion of audio files
// Default value is an empty array
// See DirWatch section below for more details
"dirWatch": []
// (object[]) Directory monitoring for ingestion of audio files
// Default value is an empty array
// See DirWatch section below for more details
"dirWatch": []
// (object[]) Downstream audio files to other Rdio Scanner instances
// Default value is an empty array
// See Downstreams section below for more details
"downstreams": [],
// (object[]) Downstream audio files to other Rdio Scanner instances
// Default value is an empty array
// See Downstreams section below for more details
"downstreams": [],
// (object) Options definitions
"options": {
// (boolean) Can users download archived calls. Default value is true
"allowDownload": true,
// (object) Options definitions
"options": {
// (boolean) Can users download archived calls. Default value is true
"allowDownload": true,
// (boolean) Disable the audio format conversion to m4a/aac
// Default value is false
"disableAudioConversion": false,
// (boolean) Disable the audio format conversion to m4a/aac
// Default value is false
"disableAudioConversion": false,
// (number) Clear the database for audio files older than the specified number of days
// Default value is 7
// Specifying a value of 0 will disable this feature
"pruneDays": 7
// (number) Clear the database for audio files older than the specified number of days
// Default value is 7
// Specifying a value of 0 will disable this feature
"pruneDays": 7
// (boolean) Turn off the screen backlight when it is inactive
// Default value is true
"useDimmer": true
// (boolean) Turn off the screen backlight when it is inactive
// Default value is true
"useDimmer": true
// (boolean) Also toggle talkgroups based on their group assignment
// Default value is true
// See Systems section below for more details on groups
"useGroup": true
// (boolean) Also toggle talkgroups based on their group assignment
// Default value is true
// See Systems section below for more details on groups
"useGroup": true
// (boolean) Show the activity led
// Default value is true
"useLed": true
// (boolean) Show the activity led
// Default value is true
"useLed": true
}
// (object[]) Systems definitions
// See Systems section below for more details
"systems": []
},
// Radio Scanner uses sqlite for its default database
// It is recommended to stick to sqlite as it works very well
// Refer to https://sequelize.org/v5/manual/dialects.html for more details
"sequelize": {
"database": null,
"dialect": "sqlite",
"host": null,
"password": null,
"port": null,
"storage": "database.sqlite",
"username": null
}
// (object[]) Systems definitions
// See Systems section below for more details
"systems": []
},
// Radio Scanner uses sqlite for its default database
// It is recommended to stick to sqlite as it works very well
// Refer to https://sequelize.org/v5/manual/dialects.html for more details
"sequelize": {
"database": null,
"dialect": "sqlite",
"host": null,
"password": null,
"port": null,
"storage": "database.sqlite",
"username": null
}
}
```
@ -162,38 +162,46 @@ access: null | string | string[] | {
}
```
Default value is `null`.
Default value is `null` .
**Examples**
- No access control, access to all systems/talkgroups
* No access control, access to all systems/talkgroups
``` json
``` json
"access": null
```
- Single unique password, access to all systems/talkgroups
* Single unique password, access to all systems/talkgroups
``` json
``` json
"access": "password"
```
or
``` json
``` json
"access": {
"code": "password",
"systems": "*"
}
```
- Complex access control
* Complex access control
`password1` gives access to system 11 / talkgroups 54241, 54125 and system 21 / talkgroups 60040, 60041, 50003.
`password1` gives access to system 11 / talkgroups 54241, 54125 and system 21 / talkgroups 60040, 60041, 50003.
`password2` and `password3` give access to all systems/talkgroups.
`password2` and `password3` give access to all systems/talkgroups.
``` json
``` json
"access": [
{
"code": "password1",
@ -246,32 +254,38 @@ apiKeys: null | string | string[] | {
}
```
Default value is an empty array `[]`.
Default value is an empty array `[]` .
**Examples**
- Single API key which allows upload to any systems/talkgroups
* Single API key which allows upload to any systems/talkgroups
``` json
``` json
"apiKeys": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e"
```
or
``` json
``` json
"access": {
"key": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e",
"systems": "*"
}
```
- Complex API keys definition
* Complex API keys definition
API key `d2079382-07df-4aa9-8940-8fb9e4ef5f2e` gives access to system 11 / talkgroups 54241, 54125 and system 21 / talkgroups 60040, 60041, 50003.
API keys `cfcfa7d5-897c-4b96-b974-2fec80c3f775` and `a3ac707e-eaf9-4951-a9d5-c52186fa5093` give access to all systems/talkgroups.
``` json
``` json
"apiKeys": [
{
"key": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e",
@ -322,35 +336,37 @@ dirWatch: {
}[]
```
- **delay** - Depending on the recorder, audio files can be ingested too soon after the recorder has created the file. You can set a timeout value in *milliseconds* for the audio file to settle before ingesting it.
- **deleteAfter** - You may want the audio file to be deleted after being ingested. If this value is *true*, all pre-existing audio files will be ingested and deleted as soon as [Rdio Scanner](https://github.com/chuot/rdio-scanner) starts. When this parameter is *false*, pre-existing audio files are neither ingested nor deleted.
- **directory** - Absolute or relatives to [Rdio Scanner](https://github.com/chuot/rdio-scanner)'s. Path of the directory to be monitored. **This value must be unique**.
- **extension** - The audio call extension to monitor without the period. Ex.: "mp3", "wav".
- **frequency** - You may want to fake the frequency which will be displayed on *Rdio Scanner*. Let say that you are recording an AM frequency from *RTLSDR-Airband*, here you would put that frequency.
- **frequency** - You may want to simulate the frequency that will be displayed. Say you are recording an AM frequency from *RTLSDR-Airband*, here you would put that frequency.
- **mask** - Some metadata can be extracted from the file name of the audio file using specific META tags. Here is the list:
- **#DATE** - extract the date like *20200608* or *2020-06-08*.
- **#HZ** - extract the frequency in hertz like *119100000*.
- **#KHZ** - extract the frequency in kilohertz like *119100*.
- **#MHZ** - extract the frequency in megahertz like *119.100*.
- **#TIME** - extract the *local* time like *0853439* or *08:34:39*.
- **#SYS** - extract the system id like *11*.
- **#TG** - extract the talkgroup id like *54241*.
- **#UNIT** - extract the unit id like *4424001*.
- **#ZTIME** - extract the *zulu* time like *0453439* or *04:34:39*.
- **system** - A valid system id defined in **rdioScanner.systems**.
- **talkgroup** - A valid talkgroup id defined in **rdioScanner.systems**.
- **type** - In case of *Trunk Recorder*, the metadata of the *JSON file* will be used.
* **delay** - Depending on the recorder, audio files can be ingested too soon after the recorder has created the file. You can set a timeout value in *milliseconds* for the audio file to settle before ingesting it.
* **deleteAfter** - You may want the audio file to be deleted after being ingested. If this value is *true*, all pre-existing audio files will be ingested and deleted as soon as [Rdio Scanner](https://github.com/chuot/rdio-scanner) starts. When this parameter is *false*, pre-existing audio files are neither ingested nor deleted.
* **directory** - Absolute or relatives to [Rdio Scanner](https://github.com/chuot/rdio-scanner)'s. Path of the directory to be monitored. **This value must be unique**.
* **extension** - The audio call extension to monitor without the period. Ex.: "mp3", "wav".
* **frequency** - You may want to fake the frequency which will be displayed on *Rdio Scanner*. Let say that you are recording an AM frequency from *RTLSDR-Airband*, here you would put that frequency.
* **frequency** - You may want to simulate the frequency that will be displayed. Say you are recording an AM frequency from *RTLSDR-Airband*, here you would put that frequency.
* **mask** - Some metadata can be extracted from the file name of the audio file using specific META tags. Here is the list:
+ **#DATE** - extract the date like *20200608* or *2020-06-08*.
+ **#HZ** - extract the frequency in hertz like *119100000*.
+ **#KHZ** - extract the frequency in kilohertz like *119100*.
+ **#MHZ** - extract the frequency in megahertz like *119.100*.
+ **#TIME** - extract the *local* time like *0853439* or *08:34:39*.
+ **#SYS** - extract the system id like *11*.
+ **#TG** - extract the talkgroup id like *54241*.
+ **#UNIT** - extract the unit id like *4424001*.
+ **#ZTIME** - extract the *zulu* time like *0453439* or *04:34:39*.
* **system** - A valid system id defined in **rdioScanner.systems**.
* **talkgroup** - A valid talkgroup id defined in **rdioScanner.systems**.
* **type** - In case of *Trunk Recorder*, the metadata of the *JSON file* will be used.
> Note that [Rdio Scanner](https://github.com/chuot/rdio-scanner) must know the **system id** and the **talkgroup id** for the call to be ingested. These two values must be specified either by **dirWatch.system**, **dirWatch.talkgroup**, **dirWatch.mask** or a mix of them. **dirWatch.system** and **dirWatch.talkgroup** have priority over **dirWatch.mask**.
Default value is an empty array `[]`.
Default value is an empty array `[]` .
**Examples**
- Ingest audio files from **Trunk Recorder**
* Ingest audio files from **Trunk Recorder**
``` json
``` json
"dirWatch": [
{
"deleteAfter": true,
@ -369,9 +385,11 @@ Default value is an empty array `[]`.
]
```
- Ingest audio files from **RTLSDR-Airband**
* Ingest audio files from **RTLSDR-Airband**
``` json
``` json
"dirWatch": [
{
"deleteAfter": true,
@ -385,9 +403,11 @@ Default value is an empty array `[]`.
]
```
- Ingest audio files from **SDRTrunk**
* Ingest audio files from **SDRTrunk**
``` json
``` json
"dirWatch": [
{
"deleteAfter": true,
@ -404,7 +424,7 @@ Ingested audio calls can be sent downstream to other [Rdio Scanner](https://gith
This is handy if you want to build a mesh of [Rdio Scanner](https://github.com/chuot/rdio-scanner). Let's say you want to exchange audio files with your friend who lives in another city. Or you want to ingest audio files from a Digital Logger through an internal instance and transfer these audio files to your public instance.
> Remember that the API key you will use must be correctly configured on the receiving host as for the system and the talkgroup.
> Remember that the API key you will use must be correctly configured on the receiving host.
**Structure of the rdioScanner.downstreams object**
@ -414,16 +434,16 @@ downstreams: {
disabled: boolean;
systems: number | number[] | {
id: number;
talkgroups: number | number[];
talkgroups: number | number[] | "*" | undefined;
} | {
id: number;
talkgroups: number | number[];
}[] | "*";
}[] | "*" | undefined;
url: string;
}[]
```
Default value is an empty array `[]`.
Default value is an empty array `[]` .
**Examples**
@ -440,6 +460,13 @@ Default value is an empty array `[]`.
54125
]
},
{
"id": 12
},
{
"id": 15,
"talkgroups": "*"
},
{
"id": 21,
"talkgroups": [
@ -447,7 +474,8 @@ Default value is an empty array `[]`.
60041,
50003
]
}
},
31
],
"url": "http://rdio-scanner.example.com:3000/"
},
@ -460,6 +488,8 @@ Default value is an empty array `[]`.
]
```
> Note in this example for API key `d2079382-07df-4aa9-8940-8fb9e4ef5f2e` that systems 12, 15 and 31 will downstream all of their talkgroups, unlike systems 11 and 21 which will only downstream some of their talkgroups.
## Systems - rdioScanner.systems
The heart of [Rdio Scanner](https://github.com/chuot/rdio-scanner) where all your systems and talkgroups are defined. Audio files to unknown systems / talkgroups will not be ingested.
@ -487,29 +517,29 @@ systems: {
}[]
```
- **id** - System ID.
- **label** - System label shown on the left side of second row.
- **led** - Optional LED color for the whole system. By default the LED is *green*.
- **talkgroups** - Talkgroups for the system.
- **id** - Talkgroup ID.
- **label** - Talkgroup label shown on the left side of third row.
- **name** - Talkgroup name shown on the fouth row.
- **patches** - Array of talkgroup ID to include in this talkgroup.
- **tag** - Talkgroup tag shown on the right side of second row.
- **units** - Unit aliases.
- **id** - Unit ID.
- **label** - Unit label shown on the right side of six sixth row.
* **id** - System ID.
* **label** - System label shown on the left side of second row.
* **led** - Optional LED color for the whole system. By default the LED is *green*.
* **talkgroups** - Talkgroups for the system.
+ **id** - Talkgroup ID.
+ **label** - Talkgroup label shown on the left side of third row.
+ **name** - Talkgroup name shown on the fouth row.
+ **patches** - Array of talkgroup ID to include in this talkgroup.
+ **tag** - Talkgroup tag shown on the right side of second row.
* **units** - Unit aliases.
+ **id** - Unit ID.
+ **label** - Unit label shown on the right side of six sixth row.
## Load a system from RadioReference.com
You may want to load your `server/config.json` with some systems from [RadioReference.com](https://radioreference.com/).
You can choose any `system_id` you want to refer to this system. If you choose an existing `system_id` in `config.json`, you will replace it with the new one.
You can choose any `system_id` you want to refer to this system. If you choose an existing `system_id` in `config.json` , you will replace it with the new one.
See examples in the installation documents:
- [Install from the Docker Image](./install-docker.md)
- [Install from the GitHub Repository](./install-github.md)
* [Install from the Docker Image](./install-docker.md)
* [Install from the GitHub Repository](./install-github.md)
> Note that [Rdio Scanner](https://github.com/chuot/rdio-scanner) has been designed to resemble old school radio scanners where each talkgroup has its own toggle button on the **SELECT TG** panel. Loading too many systems/talkgroups will make the web application very slow. Depending on your use case, you may want to have no more than 400 talkgroups.

View file

@ -11,5 +11,5 @@
"start": "node run",
"update": "node update"
},
"version": "4.4.2"
"version": "4.4.3"
}

View file

@ -67,7 +67,7 @@ class Downstream {
return talkgroup === call.talkgroup;
} else {
return talkgroup === '*';
return talkgroup === undefined || talkgroup === '*';
}
};
@ -84,7 +84,7 @@ class Downstream {
return system === '*';
} else {
return true;
return false;
}
};

View file

@ -1,6 +1,6 @@
{
"name": "rdio-scanner-server",
"version": "4.4.2",
"version": "4.4.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -4438,9 +4438,9 @@
"optional": true
},
"pg": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/pg/-/pg-8.3.0.tgz",
"integrity": "sha512-jQPKWHWxbI09s/Z9aUvoTbvGgoj98AU7FDCcQ7kdejupn/TcNpx56v2gaOTzXkzOajmOEJEdi9eTh9cA2RVAjQ==",
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/pg/-/pg-8.3.2.tgz",
"integrity": "sha512-hOoRCTriXS+VWwyXHchRjWb9yv3Koq8irlwwXniqhdgK0AbfWvEnybGS2HIUE+UdCSTuYAM4WGPujFpPg9Vcaw==",
"requires": {
"buffer-writer": "2.0.0",
"packet-reader": "1.0.0",
@ -6081,9 +6081,9 @@
"optional": true
},
"update-notifier": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz",
"integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz",
"integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==",
"requires": {
"boxen": "^4.2.0",
"chalk": "^3.0.0",

View file

@ -12,7 +12,7 @@
"multer": "^1.4.2",
"mysql2": "^2.1.0",
"nodemon": "^2.0.4",
"pg": "^8.3.0",
"pg": "^8.3.2",
"sequelize": "^6.3.4",
"sqlite3": "^5.0.0",
"umzug": "^2.3.0",
@ -39,5 +39,5 @@
"build": "webpack",
"start": "nodemon"
},
"version": "4.4.2"
"version": "4.4.3"
}