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

View file

@ -1,26 +1,26 @@
{ {
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>", "author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
"dependencies": { "dependencies": {
"@angular/animations": "^10.0.9", "@angular/animations": "^10.0.10",
"@angular/cdk": "^10.1.3", "@angular/cdk": "^10.1.3",
"@angular/common": "~10.0.9", "@angular/common": "~10.0.10",
"@angular/compiler": "~10.0.9", "@angular/compiler": "~10.0.10",
"@angular/core": "~10.0.9", "@angular/core": "~10.0.10",
"@angular/flex-layout": "^10.0.0-beta.32", "@angular/flex-layout": "^10.0.0-beta.32",
"@angular/forms": "~10.0.9", "@angular/forms": "~10.0.10",
"@angular/material": "^10.1.3", "@angular/material": "^10.1.3",
"@angular/platform-browser": "~10.0.9", "@angular/platform-browser": "~10.0.10",
"@angular/platform-browser-dynamic": "~10.0.9", "@angular/platform-browser-dynamic": "~10.0.10",
"@angular/service-worker": "~10.0.9", "@angular/service-worker": "~10.0.10",
"rxjs": "~6.6.2", "rxjs": "~6.6.2",
"tslib": "^2.0.1", "tslib": "^2.0.1",
"zone.js": "~0.10.3" "zone.js": "~0.11.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "~0.1000.6", "@angular-devkit/build-angular": "~0.1000.6",
"@angular/cli": "^10.0.6", "@angular/cli": "^10.0.6",
"@angular/compiler-cli": "~10.0.9", "@angular/compiler-cli": "~10.0.10",
"@types/node": "~14.0.27", "@types/node": "~14.6.0",
"codelyzer": "^6.0.0", "codelyzer": "^6.0.0",
"ts-node": "~8.10.2", "ts-node": "~8.10.2",
"tslint": "~6.1.3", "tslint": "~6.1.3",
@ -33,5 +33,5 @@
"build": "ng build --base-href ./ --prod", "build": "ng build --base-href ./ --prod",
"start": "ng serve" "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 ``` js
{ {
"nodejs": { "nodejs": {
// (string) "development" or "production". Default is "production". // (string) "development" or "production". Default is "production".
"environment": "production", "environment": "production",
// (string) Which IP to bind to? Default is "0.0.0.0" // (string) Which IP to bind to? Default is "0.0.0.0"
"host": "0.0.0.0", "host": "0.0.0.0",
// (number) Which PORT to bind to? Default is 3000 // (number) Which PORT to bind to? Default is 3000
"port": 3000, "port": 3000,
// (string) Path to the SSL CA certificate // (string) Path to the SSL CA certificate
// See SSL certificates section below for more details // See SSL certificates section below for more details
"sslCA": null, "sslCA": null,
// (string) Path to the SSL certificate // (string) Path to the SSL certificate
// See SSL certificates section below for more details // See SSL certificates section below for more details
"sslCert": null, "sslCert": null,
// (string) Path to the SSL privat key // (string) Path to the SSL privat key
// See SSL certificates section below for more details // See SSL certificates section below for more details
"sslKey": null "sslKey": null
}, },
"rdioScanner": { "rdioScanner": {
// (multiple types) Access control for Rdio Scanner // (multiple types) Access control for Rdio Scanner
// See Access control section below for more details // See Access control section below for more details
"access": null, "access": null,
// (multiple types) API keys for upload scripts and downstreamers // (multiple types) API keys for upload scripts and downstreamers
// Default value is a random generated UUID // Default value is a random generated UUID
// See API keys section below for more details // See API keys section below for more details
"apiKeys": "<random generated uuid>", "apiKeys": "<random generated uuid>",
// (object[]) Directory monitoring for ingestion of audio files // (object[]) Directory monitoring for ingestion of audio files
// Default value is an empty array // Default value is an empty array
// See DirWatch section below for more details // See DirWatch section below for more details
"dirWatch": [] "dirWatch": []
// (object[]) Downstream audio files to other Rdio Scanner instances // (object[]) Downstream audio files to other Rdio Scanner instances
// Default value is an empty array // Default value is an empty array
// See Downstreams section below for more details // See Downstreams section below for more details
"downstreams": [], "downstreams": [],
// (object) Options definitions // (object) Options definitions
"options": { "options": {
// (boolean) Can users download archived calls. Default value is true // (boolean) Can users download archived calls. Default value is true
"allowDownload": true, "allowDownload": true,
// (boolean) Disable the audio format conversion to m4a/aac // (boolean) Disable the audio format conversion to m4a/aac
// Default value is false // Default value is false
"disableAudioConversion": false, "disableAudioConversion": false,
// (number) Clear the database for audio files older than the specified number of days // (number) Clear the database for audio files older than the specified number of days
// Default value is 7 // Default value is 7
// Specifying a value of 0 will disable this feature // Specifying a value of 0 will disable this feature
"pruneDays": 7 "pruneDays": 7
// (boolean) Turn off the screen backlight when it is inactive // (boolean) Turn off the screen backlight when it is inactive
// Default value is true // Default value is true
"useDimmer": true "useDimmer": true
// (boolean) Also toggle talkgroups based on their group assignment // (boolean) Also toggle talkgroups based on their group assignment
// Default value is true // Default value is true
// See Systems section below for more details on groups // See Systems section below for more details on groups
"useGroup": true "useGroup": true
// (boolean) Show the activity led // (boolean) Show the activity led
// Default value is true // Default value is true
"useLed": 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** **Examples**
- No access control, access to all systems/talkgroups * No access control, access to all systems/talkgroups
``` json
``` json
"access": null "access": null
``` ```
- Single unique password, access to all systems/talkgroups * Single unique password, access to all systems/talkgroups
``` json
``` json
"access": "password" "access": "password"
``` ```
or or
``` json
``` json
"access": { "access": {
"code": "password", "code": "password",
"systems": "*" "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": [ "access": [
{ {
"code": "password1", "code": "password1",
@ -246,32 +254,38 @@ apiKeys: null | string | string[] | {
} }
``` ```
Default value is an empty array `[]`. Default value is an empty array `[]` .
**Examples** **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" "apiKeys": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e"
``` ```
or or
``` json
``` json
"access": { "access": {
"key": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e", "key": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e",
"systems": "*" "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 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. API keys `cfcfa7d5-897c-4b96-b974-2fec80c3f775` and `a3ac707e-eaf9-4951-a9d5-c52186fa5093` give access to all systems/talkgroups.
``` json
``` json
"apiKeys": [ "apiKeys": [
{ {
"key": "d2079382-07df-4aa9-8940-8fb9e4ef5f2e", "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. * **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. * **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**. * **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". * **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 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. * **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: * **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*. + **#DATE** - extract the date like *20200608* or *2020-06-08*.
- **#HZ** - extract the frequency in hertz like *119100000*. + **#HZ** - extract the frequency in hertz like *119100000*.
- **#KHZ** - extract the frequency in kilohertz like *119100*. + **#KHZ** - extract the frequency in kilohertz like *119100*.
- **#MHZ** - extract the frequency in megahertz like *119.100*. + **#MHZ** - extract the frequency in megahertz like *119.100*.
- **#TIME** - extract the *local* time like *0853439* or *08:34:39*. + **#TIME** - extract the *local* time like *0853439* or *08:34:39*.
- **#SYS** - extract the system id like *11*. + **#SYS** - extract the system id like *11*.
- **#TG** - extract the talkgroup id like *54241*. + **#TG** - extract the talkgroup id like *54241*.
- **#UNIT** - extract the unit id like *4424001*. + **#UNIT** - extract the unit id like *4424001*.
- **#ZTIME** - extract the *zulu* time like *0453439* or *04:34:39*. + **#ZTIME** - extract the *zulu* time like *0453439* or *04:34:39*.
- **system** - A valid system id defined in **rdioScanner.systems**. * **system** - A valid system id defined in **rdioScanner.systems**.
- **talkgroup** - A valid talkgroup 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. * **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**. > 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** **Examples**
- Ingest audio files from **Trunk Recorder** * Ingest audio files from **Trunk Recorder**
``` json
``` json
"dirWatch": [ "dirWatch": [
{ {
"deleteAfter": true, "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": [ "dirWatch": [
{ {
"deleteAfter": true, "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": [ "dirWatch": [
{ {
"deleteAfter": true, "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. 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** **Structure of the rdioScanner.downstreams object**
@ -414,16 +434,16 @@ downstreams: {
disabled: boolean; disabled: boolean;
systems: number | number[] | { systems: number | number[] | {
id: number; id: number;
talkgroups: number | number[]; talkgroups: number | number[] | "*" | undefined;
} | { } | {
id: number; id: number;
talkgroups: number | number[]; talkgroups: number | number[];
}[] | "*"; }[] | "*" | undefined;
url: string; url: string;
}[] }[]
``` ```
Default value is an empty array `[]`. Default value is an empty array `[]` .
**Examples** **Examples**
@ -440,6 +460,13 @@ Default value is an empty array `[]`.
54125 54125
] ]
}, },
{
"id": 12
},
{
"id": 15,
"talkgroups": "*"
},
{ {
"id": 21, "id": 21,
"talkgroups": [ "talkgroups": [
@ -447,7 +474,8 @@ Default value is an empty array `[]`.
60041, 60041,
50003 50003
] ]
} },
31
], ],
"url": "http://rdio-scanner.example.com:3000/" "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 ## 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. 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. * **id** - System ID.
- **label** - System label shown on the left side of second row. * **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*. * **led** - Optional LED color for the whole system. By default the LED is *green*.
- **talkgroups** - Talkgroups for the system. * **talkgroups** - Talkgroups for the system.
- **id** - Talkgroup ID. + **id** - Talkgroup ID.
- **label** - Talkgroup label shown on the left side of third row. + **label** - Talkgroup label shown on the left side of third row.
- **name** - Talkgroup name shown on the fouth row. + **name** - Talkgroup name shown on the fouth row.
- **patches** - Array of talkgroup ID to include in this talkgroup. + **patches** - Array of talkgroup ID to include in this talkgroup.
- **tag** - Talkgroup tag shown on the right side of second row. + **tag** - Talkgroup tag shown on the right side of second row.
- **units** - Unit aliases. * **units** - Unit aliases.
- **id** - Unit ID. + **id** - Unit ID.
- **label** - Unit label shown on the right side of six sixth row. + **label** - Unit label shown on the right side of six sixth row.
## Load a system from RadioReference.com ## 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 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: See examples in the installation documents:
- [Install from the Docker Image](./install-docker.md) * [Install from the Docker Image](./install-docker.md)
- [Install from the GitHub Repository](./install-github.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. > 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", "start": "node run",
"update": "node update" "update": "node update"
}, },
"version": "4.4.2" "version": "4.4.3"
} }

View file

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

View file

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

View file

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