mirror of
https://github.com/chuot/rdio-scanner.git
synced 2026-08-14 08:53:03 -06:00
Version 6.1.16
This commit is contained in:
parent
662c5f9627
commit
c215ba37f1
|
|
@ -96,9 +96,14 @@ _v6.1.15_
|
|||
|
||||
- Fix access and downstreams order not retained.
|
||||
- Remove the self-signed certificate generator (-ssl create) as it was causing more problems than solutions.
|
||||
- Client handling and call ingestion now run on 2 different threads (Issue #135).
|
||||
- Client handling and call ingestion now run on 2 different threads (issue #135).
|
||||
- Fix downstream talkgroup select keeps reverting to all talkgroups (issue #136).
|
||||
|
||||
_v6.1.16_
|
||||
|
||||
- Fix concurrent map access for clients.
|
||||
- Some tweaks to websocket management.
|
||||
|
||||
## Version 6.0
|
||||
|
||||
- Backend server rewritten in Go for better performance and ease of installation.
|
||||
|
|
|
|||
16
COMPILING.md
16
COMPILING.md
|
|
@ -26,13 +26,13 @@ Clone the official repository on your computer and start the build process.
|
|||
|
||||
When finished, you will find the precompiled versions for various platforms in the `dist` folder.
|
||||
|
||||
rdio-scanner-darwin-amd64-v6.1.15.zip
|
||||
rdio-scanner-darwin-arm64-v6.1.15.zip
|
||||
rdio-scanner-freebsd-amd64-v6.1.15.zip
|
||||
rdio-scanner-linux-386-v6.1.15.zip
|
||||
rdio-scanner-linux-amd64-v6.1.15.zip
|
||||
rdio-scanner-linux-arm64-v6.1.15.zip
|
||||
rdio-scanner-linux-arm-v6.1.15.zip
|
||||
rdio-scanner-windows-amd64-v6.1.15.zip
|
||||
rdio-scanner-darwin-amd64-v6.1.16.zip
|
||||
rdio-scanner-darwin-arm64-v6.1.16.zip
|
||||
rdio-scanner-freebsd-amd64-v6.1.16.zip
|
||||
rdio-scanner-linux-386-v6.1.16.zip
|
||||
rdio-scanner-linux-amd64-v6.1.16.zip
|
||||
rdio-scanner-linux-arm64-v6.1.16.zip
|
||||
rdio-scanner-linux-arm-v6.1.16.zip
|
||||
rdio-scanner-windows-amd64-v6.1.16.zip
|
||||
|
||||
**Happy Rdio scanning !**
|
||||
4
Makefile
4
Makefile
|
|
@ -16,8 +16,8 @@
|
|||
################################################################################
|
||||
|
||||
app := rdio-scanner
|
||||
date := 2022/03/03
|
||||
ver := 6.1.15
|
||||
date := 2022/03/17
|
||||
ver := 6.1.16
|
||||
|
||||
client := $(wildcard client/*.json client/*.ts)
|
||||
server := $(wildcard server/*.go)
|
||||
|
|
|
|||
1360
client/package-lock.json
generated
1360
client/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,31 +1,31 @@
|
|||
{
|
||||
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
|
||||
"dependencies": {
|
||||
"@angular/animations": "^13.2.4",
|
||||
"@angular/cdk": "^13.2.4",
|
||||
"@angular/common": "~13.2.4",
|
||||
"@angular/compiler": "~13.2.4",
|
||||
"@angular/core": "~13.2.4",
|
||||
"@angular/forms": "~13.2.4",
|
||||
"@angular/material": "^13.2.4",
|
||||
"@angular/platform-browser": "~13.2.4",
|
||||
"@angular/platform-browser-dynamic": "~13.2.4",
|
||||
"@angular/router": "^13.2.4",
|
||||
"@angular/service-worker": "^13.2.4",
|
||||
"@angular/animations": "^13.2.6",
|
||||
"@angular/cdk": "^13.2.6",
|
||||
"@angular/common": "~13.2.6",
|
||||
"@angular/compiler": "~13.2.6",
|
||||
"@angular/core": "~13.2.6",
|
||||
"@angular/forms": "~13.2.6",
|
||||
"@angular/material": "^13.2.6",
|
||||
"@angular/platform-browser": "~13.2.6",
|
||||
"@angular/platform-browser-dynamic": "~13.2.6",
|
||||
"@angular/router": "^13.2.6",
|
||||
"@angular/service-worker": "^13.2.6",
|
||||
"rxjs": "~7.4.0",
|
||||
"tslib": "^2.3.1",
|
||||
"zone.js": "~0.11.4"
|
||||
"zone.js": "~0.11.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^13.2.5",
|
||||
"@angular/cli": "^13.2.5",
|
||||
"@angular/compiler-cli": "~13.2.4",
|
||||
"@angular-devkit/build-angular": "^13.2.6",
|
||||
"@angular/cli": "^13.2.6",
|
||||
"@angular/compiler-cli": "~13.2.6",
|
||||
"@types/node": "^17.0.21",
|
||||
"@typescript-eslint/eslint-plugin": "^5.12.1",
|
||||
"@typescript-eslint/parser": "^5.12.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.15.0",
|
||||
"@typescript-eslint/parser": "^5.15.0",
|
||||
"ajv-keywords": "^5.1.0",
|
||||
"eslint": "^8.10.0",
|
||||
"ts-node": "~10.5.0",
|
||||
"eslint": "^8.11.0",
|
||||
"ts-node": "~10.7.0",
|
||||
"typescript": "~4.4.4"
|
||||
},
|
||||
"engines": {
|
||||
|
|
@ -38,5 +38,5 @@
|
|||
"build": "ng build --base-href ./ --configuration production",
|
||||
"start": "ng serve"
|
||||
},
|
||||
"version": "6.1.15"
|
||||
"version": "6.1.16"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
rdio@macos ~ % mkdir rdio-scanner
|
||||
rdio@macos ~ % cd rdio-scanner
|
||||
rdio@macos rdio-scanner % unzip \
|
||||
> ~/Downloads/rdio-scanner-darwin-arm64-v6.1.15.zip
|
||||
Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.1.15.zip
|
||||
> ~/Downloads/rdio-scanner-darwin-arm64-v6.1.16.zip
|
||||
Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.1.16.zip
|
||||
inflating: rdio-scanner
|
||||
inflating: rdio-scanner.pdf
|
||||
|
||||
|
|
@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
|
||||
rdio@macos rdio-scanner % ./rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 08:38:06 server started
|
||||
2022/03/03 08:38:06 main interface at http://macos.local:3000
|
||||
2022/03/03 08:38:06 admin interface at http://macos.local:3000/admin
|
||||
2022/03/17 08:38:06 server started
|
||||
2022/03/17 08:38:06 main interface at http://macos.local:3000
|
||||
2022/03/17 08:38:06 admin interface at http://macos.local:3000/admin
|
||||
|
||||
4. Access the administrative dashboard to finalize the configuration.
|
||||
|
||||
|
|
@ -77,11 +77,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
|
|||
|
||||
rdio@macos rdio-scanner % ./rdio-scanner --listen :80
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 08:48:03 server started
|
||||
2022/03/03 08:48:03 main interface at http://macos.local
|
||||
2022/03/03 08:48:03 admin interface at http://macos.local/admin
|
||||
2022/03/17 08:48:03 server started
|
||||
2022/03/17 08:48:03 main interface at http://macos.local
|
||||
2022/03/17 08:48:03 admin interface at http://macos.local/admin
|
||||
|
||||
## Listening on a SSL port
|
||||
|
||||
|
|
@ -95,12 +95,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
|
|||
> -ssl_key_file mykey.key \
|
||||
> -ssl_listen :443
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 08:50:58 server started
|
||||
2022/03/03 08:50:58 main interface at http://macos.local
|
||||
2022/03/03 08:50:58 main interface at https://macos.local
|
||||
2022/03/03 08:50:58 admin interface at https://macos.local/admin
|
||||
2022/03/17 08:50:58 server started
|
||||
2022/03/17 08:50:58 main interface at http://macos.local
|
||||
2022/03/17 08:50:58 main interface at https://macos.local
|
||||
2022/03/17 08:50:58 admin interface at https://macos.local/admin
|
||||
|
||||
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
|
||||
|
||||
|
|
@ -118,7 +118,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
|
|||
> -ssl_auto_cert mydomain.com \
|
||||
> -ssl_listen :443 \
|
||||
> -config_save
|
||||
2022/03/03 08:52:24 rdio-scanner.ini file created
|
||||
2022/03/17 08:52:24 rdio-scanner.ini file created
|
||||
|
||||
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
|
||||
|
||||
|
|
@ -132,12 +132,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
|
|||
|
||||
rdio@macos rdio-scanner % ./rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 08:54:08 server started
|
||||
2022/03/03 08:54:08 main interface at http://macos.local
|
||||
2022/03/03 08:54:08 main interface at https://macos.local
|
||||
2022/03/03 08:54:08 admin interface at https://macos.local/admin
|
||||
2022/03/17 08:54:08 server started
|
||||
2022/03/17 08:54:08 main interface at http://macos.local
|
||||
2022/03/17 08:54:08 main interface at https://macos.local
|
||||
2022/03/17 08:54:08 admin interface at https://macos.local/admin
|
||||
|
||||
## Install Rdio Scanner as a service
|
||||
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
rdio@pc-freebsd:~ $ mkdir rdio-scanner
|
||||
rdio@pc-freebsd:~ $ cd rdio-scanner
|
||||
rdio@pc-freebsd:~/rdio-scanner $ unzip \
|
||||
> ~/rdio-scanner-freebsd-amd64-v6.1.15.zip
|
||||
Archive: ../rdio-scanner-freebsd-amd64-v6.1.15.zip
|
||||
> ~/rdio-scanner-freebsd-amd64-v6.1.16.zip
|
||||
Archive: ../rdio-scanner-freebsd-amd64-v6.1.16.zip
|
||||
extracting: rdio-scanner
|
||||
extracting: rdio-scanner.pdf
|
||||
|
||||
|
|
@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
|
||||
rdio@pc-freebsd:~/rdio-scanner $ ./rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 08:16:36 server started
|
||||
2022/03/03 08:16:36 main interface at http://pc-freebsd:3000
|
||||
2022/03/03 08:16:36 admin interface at http://pc-freebsd:3000/admin
|
||||
2022/03/17 08:16:36 server started
|
||||
2022/03/17 08:16:36 main interface at http://pc-freebsd:3000
|
||||
2022/03/17 08:16:36 admin interface at http://pc-freebsd:3000/admin
|
||||
|
||||
4. Access the administrative dashboard to finalize the configuration.
|
||||
|
||||
|
|
@ -81,11 +81,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
|
|||
Password:
|
||||
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner -listen :80
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 08:19:38 server started
|
||||
2022/03/03 08:19:38 main interface at http://pc-freebsd
|
||||
2022/03/03 08:19:38 admin interface at http://pc-freebsd/admin
|
||||
2022/03/17 08:19:38 server started
|
||||
2022/03/17 08:19:38 main interface at http://pc-freebsd
|
||||
2022/03/17 08:19:38 admin interface at http://pc-freebsd/admin
|
||||
|
||||
## Listening on a SSL port
|
||||
|
||||
|
|
@ -101,12 +101,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
|
|||
> -ssl_key_file mykey.key \
|
||||
> -ssl_listen :443
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 10:34:29 server started
|
||||
2022/03/03 10:34:29 main interface at http://pc-freebsd
|
||||
2022/03/03 10:34:29 main interface at https://pc-freebsd
|
||||
2022/03/03 10:34:29 admin interface at https://pc-freebsd/admin
|
||||
2022/03/17 10:34:29 server started
|
||||
2022/03/17 10:34:29 main interface at http://pc-freebsd
|
||||
2022/03/17 10:34:29 main interface at https://pc-freebsd
|
||||
2022/03/17 10:34:29 admin interface at https://pc-freebsd/admin
|
||||
|
||||
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
|
||||
|
||||
|
|
@ -126,7 +126,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
|
|||
> -ssl_auto_cert mydomain.com \
|
||||
> -ssl_listen :443 \
|
||||
> -config_save
|
||||
2022/03/03 10:37:00 rdio-scanner.ini file created
|
||||
2022/03/17 10:37:00 rdio-scanner.ini file created
|
||||
|
||||
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
|
||||
|
||||
|
|
@ -142,12 +142,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
|
|||
Password:
|
||||
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 10:38:28 server started
|
||||
2022/03/03 10:38:29 main interface at http://pc-freebsd
|
||||
2022/03/03 10:38:29 main interface at https://pc-freebsd
|
||||
2022/03/03 10:38:29 admin interface at https://pc-freebsd/admin
|
||||
2022/03/17 10:38:28 server started
|
||||
2022/03/17 10:38:29 main interface at http://pc-freebsd
|
||||
2022/03/17 10:38:29 main interface at https://pc-freebsd
|
||||
2022/03/17 10:38:29 admin interface at https://pc-freebsd/admin
|
||||
|
||||
## Install Rdio Scanner as a service
|
||||
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
[rdio@pc-linux ~]$ mkdir rdio-scanner
|
||||
[rdio@pc-linux ~]$ cd rdio-scanner
|
||||
[rdio@pc-linux rdio-scanner]$ unzip \
|
||||
> ~/Downloads/rdio-scanner-linux-amd64-v6.1.15.zip
|
||||
Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.1.15.zip
|
||||
> ~/Downloads/rdio-scanner-linux-amd64-v6.1.16.zip
|
||||
Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.1.16.zip
|
||||
inflating: rdio-scanner
|
||||
inflating: rdio-scanner.pdf
|
||||
|
||||
|
|
@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
|
||||
[rdio@pc-linux rdio-scanner]$ ./rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 09:11:48 server started
|
||||
2022/03/03 09:11:48 main interface at http://pc-linux:3000
|
||||
2022/03/03 09:11:48 admin interface at http://pc-linux:3000/admin
|
||||
2022/03/17 09:11:48 server started
|
||||
2022/03/17 09:11:48 main interface at http://pc-linux:3000
|
||||
2022/03/17 09:11:48 admin interface at http://pc-linux:3000/admin
|
||||
|
||||
4. Access the administrative dashboard to finalize the configuration.
|
||||
|
||||
|
|
@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
|
|||
[rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner -listen :80
|
||||
[sudo] password for rdio:
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 09:14:00 server started
|
||||
2022/03/03 09:14:00 main interface at http://pc-linux
|
||||
2022/03/03 09:14:00 admin interface at http://pc-linux/admin
|
||||
2022/03/17 09:14:00 server started
|
||||
2022/03/17 09:14:00 main interface at http://pc-linux
|
||||
2022/03/17 09:14:00 admin interface at http://pc-linux/admin
|
||||
|
||||
## Listening on a SSL port
|
||||
|
||||
|
|
@ -97,12 +97,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
|
|||
> -ssl_listen :443
|
||||
[sudo] password for rdio:
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 09:16:47 server started
|
||||
2022/03/03 09:16:47 main interface at http://pc-linux
|
||||
2022/03/03 09:16:47 main interface at https://pc-linux
|
||||
2022/03/03 09:16:47 admin interface at https://pc-linux/admin
|
||||
2022/03/17 09:16:47 server started
|
||||
2022/03/17 09:16:47 main interface at http://pc-linux
|
||||
2022/03/17 09:16:47 main interface at https://pc-linux
|
||||
2022/03/17 09:16:47 admin interface at https://pc-linux/admin
|
||||
|
||||
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
|
|||
> -ssl_auto_cert mydomain.com \
|
||||
> -ssl_listen :443 \
|
||||
> -config_save
|
||||
2022/03/03 09:19:29 rdio-scanner.ini file created
|
||||
2022/03/17 09:19:29 rdio-scanner.ini file created
|
||||
|
||||
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
|
||||
|
||||
|
|
@ -135,12 +135,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
|
|||
[rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner
|
||||
[sudo] Mot de passe de rdio :
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 09:20:40 server started
|
||||
2022/03/03 09:20:40 main interface at http://pc-linux
|
||||
2022/03/03 09:20:40 main interface at https://pc-linux
|
||||
2022/03/03 09:20:40 admin interface at https://pc-linux/admin
|
||||
2022/03/17 09:20:40 server started
|
||||
2022/03/17 09:20:40 main interface at http://pc-linux
|
||||
2022/03/17 09:20:40 main interface at https://pc-linux
|
||||
2022/03/17 09:20:40 admin interface at https://pc-linux/admin
|
||||
|
||||
## Install Rdio Scanner as a service
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
C:\Users\rdio> cd rdio-scanner
|
||||
|
||||
C:\Users\rdio\rdio-scanner> tar -xvf ^
|
||||
..\downloads\rdio-scanner-windows-amd64-v6.1.15.zip
|
||||
..\downloads\rdio-scanner-windows-amd64-v6.1.16.zip
|
||||
x rdio-scanner.exe
|
||||
x rdio-scanner.pdf
|
||||
|
||||
|
|
@ -52,11 +52,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
|
|||
|
||||
C:\Users\rdio\rdio-scanner>rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 13:48:48 server started
|
||||
2022/03/03 13:48:48 main interface at http://pc-windows:3000
|
||||
2022/03/03 13:48:48 admin interface at http://pc-windows:3000/admin
|
||||
2022/03/17 13:48:48 server started
|
||||
2022/03/17 13:48:48 main interface at http://pc-windows:3000
|
||||
2022/03/17 13:48:48 admin interface at http://pc-windows:3000/admin
|
||||
|
||||
4. Access the administrative dashboard to finalize the configuration.
|
||||
|
||||
|
|
@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
|
|||
|
||||
C:\Users\rdio\rdio-scanner>rdio-scanner -listen :80
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 10:53:31 server started
|
||||
2022/03/03 10:53:31 main interface at http://pc-windows
|
||||
2022/03/03 10:53:31 admin interface at http://pc-windows/admin
|
||||
2022/03/17 10:53:31 server started
|
||||
2022/03/17 10:53:31 main interface at http://pc-windows
|
||||
2022/03/17 10:53:31 admin interface at http://pc-windows/admin
|
||||
|
||||
## Listening on a SSL port
|
||||
|
||||
|
|
@ -96,12 +96,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
|
|||
-ssl_key_file meykey.key ^
|
||||
-ssl_listen :443
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 11:05:43 server started
|
||||
2022/03/03 11:05:43 main interface at http://pc-windows
|
||||
2022/03/03 11:05:43 main interface at https://pc-windows
|
||||
2022/03/03 11:05:43 admin interface at https://pc-windows/admin
|
||||
2022/03/17 11:05:43 server started
|
||||
2022/03/17 11:05:43 main interface at http://pc-windows
|
||||
2022/03/17 11:05:43 main interface at https://pc-windows
|
||||
2022/03/17 11:05:43 admin interface at https://pc-windows/admin
|
||||
|
||||
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
|
||||
|
||||
|
|
@ -119,7 +119,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
|
|||
-ssl_auto_cert mydomain.com ^
|
||||
-ssl_listen :443 ^
|
||||
-config_save
|
||||
2022/03/03 11:08:28 rdio-scanner.ini file created
|
||||
2022/03/17 11:08:28 rdio-scanner.ini file created
|
||||
|
||||
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
|
||||
|
||||
|
|
@ -133,12 +133,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
|
|||
|
||||
C:\Users\rdio\rdio-scanner>rdio-scanner
|
||||
|
||||
Rdio Scanner v6.1.15
|
||||
Rdio Scanner v6.1.16
|
||||
----------------------------------
|
||||
2022/03/03 11:11:28 server started
|
||||
2022/03/03 11:11:28 main interface at http://pc-windows
|
||||
2022/03/03 11:11:28 main interface at https://pc-windows
|
||||
2022/03/03 11:11:28 admin interface at https://pc-windows/admin
|
||||
2022/03/17 11:11:28 server started
|
||||
2022/03/17 11:11:28 main interface at http://pc-windows
|
||||
2022/03/17 11:11:28 main interface at https://pc-windows
|
||||
2022/03/17 11:11:28 admin interface at https://pc-windows/admin
|
||||
|
||||
\pagebreak{}
|
||||
|
||||
|
|
|
|||
145
server/client.go
145
server/client.go
|
|
@ -19,23 +19,23 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
initialized bool
|
||||
Access *Access
|
||||
AuthCount int
|
||||
Controller *Controller
|
||||
Conn *websocket.Conn
|
||||
Send chan *Message
|
||||
Systems []System
|
||||
GroupsMap GroupsMap
|
||||
TagsMap TagsMap
|
||||
Livefeed *Livefeed
|
||||
SystemsMap SystemsMap
|
||||
Access *Access
|
||||
AuthCount int
|
||||
Controller *Controller
|
||||
Conn *websocket.Conn
|
||||
Send chan *Message
|
||||
Systems []System
|
||||
GroupsMap GroupsMap
|
||||
TagsMap TagsMap
|
||||
Livefeed *Livefeed
|
||||
SystemsMap SystemsMap
|
||||
}
|
||||
|
||||
func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
|
||||
|
|
@ -43,13 +43,8 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
|
|||
pongWait = 60 * time.Second
|
||||
pingPeriod = pongWait / 10 * 9
|
||||
writeWait = 10 * time.Second
|
||||
closeWait = 10 * time.Second
|
||||
)
|
||||
|
||||
if client.initialized {
|
||||
return errors.New("client.init: already initialized")
|
||||
}
|
||||
|
||||
if conn == nil {
|
||||
return errors.New("client.init: no websocket connection")
|
||||
}
|
||||
|
|
@ -65,7 +60,6 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
|
|||
go func() {
|
||||
defer func() {
|
||||
controller.Unregister <- client
|
||||
client.Conn.Close()
|
||||
}()
|
||||
|
||||
client.Conn.SetReadDeadline(time.Now().Add(pongWait))
|
||||
|
|
@ -102,29 +96,19 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
|
|||
})
|
||||
|
||||
defer func() {
|
||||
controller.Unregister <- client
|
||||
|
||||
ticker.Stop()
|
||||
timer.Stop()
|
||||
|
||||
client.Conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||
client.Conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
|
||||
|
||||
time.Sleep(closeWait)
|
||||
|
||||
client.Conn.Close()
|
||||
}()
|
||||
|
||||
Loop:
|
||||
for {
|
||||
select {
|
||||
case message, ok := <-client.Send:
|
||||
if !ok {
|
||||
break Loop
|
||||
return
|
||||
}
|
||||
|
||||
if client.Conn == nil {
|
||||
break Loop
|
||||
return
|
||||
}
|
||||
|
||||
if message.Command == MessageCommandConfig {
|
||||
|
|
@ -139,13 +123,15 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
|
|||
client.Conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||
|
||||
if err = client.Conn.WriteMessage(websocket.TextMessage, b); err != nil {
|
||||
break Loop
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
case <-ticker.C:
|
||||
if err := client.Conn.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(writeWait)); err != nil {
|
||||
break Loop
|
||||
client.Conn.SetWriteDeadline(time.Now().Add(writeWait))
|
||||
|
||||
if err := client.Conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -153,3 +139,98 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (client *Client) SendConfig(groups *Groups, options *Options, systems *Systems, tags *Tags) {
|
||||
client.SystemsMap = systems.GetScopedSystems(client, groups, tags, options.SortTalkgroups)
|
||||
client.GroupsMap = groups.GetGroupsMap(&client.SystemsMap)
|
||||
client.TagsMap = tags.GetTagsMap(&client.SystemsMap)
|
||||
|
||||
client.Send <- &Message{
|
||||
Command: MessageCommandConfig,
|
||||
Payload: map[string]interface{}{
|
||||
"dimmerDelay": options.DimmerDelay,
|
||||
"groups": client.GroupsMap,
|
||||
"keypadBeeps": GetKeypadBeeps(options),
|
||||
"systems": client.SystemsMap,
|
||||
"tags": client.TagsMap,
|
||||
"tagsToggle": options.TagsToggle,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type Clients struct {
|
||||
Map map[*Client]bool
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
func NewClients() *Clients {
|
||||
return &Clients{
|
||||
Map: make(map[*Client]bool),
|
||||
mutex: sync.Mutex{},
|
||||
}
|
||||
}
|
||||
|
||||
func (clients *Clients) AccessCount(client *Client) int {
|
||||
clients.mutex.Lock()
|
||||
defer clients.mutex.Unlock()
|
||||
|
||||
count := 0
|
||||
|
||||
for c := range clients.Map {
|
||||
if c.Access == client.Access {
|
||||
count++
|
||||
}
|
||||
}
|
||||
|
||||
return count
|
||||
}
|
||||
|
||||
func (clients *Clients) Add(client *Client) {
|
||||
clients.mutex.Lock()
|
||||
defer clients.mutex.Unlock()
|
||||
|
||||
clients.Map[client] = true
|
||||
}
|
||||
|
||||
func (clients *Clients) Count() int {
|
||||
clients.mutex.Lock()
|
||||
defer clients.mutex.Unlock()
|
||||
|
||||
return len(clients.Map)
|
||||
}
|
||||
|
||||
func (clients *Clients) EmitCall(call *Call, restricted bool) {
|
||||
clients.mutex.Lock()
|
||||
defer clients.mutex.Unlock()
|
||||
|
||||
for c := range clients.Map {
|
||||
if (!restricted || c.Access.HasAccess(call)) && c.Livefeed.IsEnabled(call) {
|
||||
c.Send <- &Message{Command: MessageCommandCall, Payload: call}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (clients *Clients) EmitConfig(groups *Groups, options *Options, systems *Systems, tags *Tags, restricted bool) {
|
||||
clients.mutex.Lock()
|
||||
defer clients.mutex.Unlock()
|
||||
|
||||
for c := range clients.Map {
|
||||
if restricted {
|
||||
c.Send <- &Message{Command: MessageCommandPin}
|
||||
} else {
|
||||
c.SendConfig(groups, options, systems, tags)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (clients *Clients) Remove(client *Client) {
|
||||
clients.mutex.Lock()
|
||||
defer clients.mutex.Unlock()
|
||||
|
||||
delete(clients.Map, client)
|
||||
|
||||
close(client.Send)
|
||||
|
||||
client.Conn.WriteMessage(websocket.CloseMessage, []byte{})
|
||||
client.Conn.Close()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ type Controller struct {
|
|||
Scheduler *Scheduler
|
||||
Systems *Systems
|
||||
Tags *Tags
|
||||
Clients map[*Client]bool
|
||||
Clients *Clients
|
||||
Register chan *Client
|
||||
Unregister chan *Client
|
||||
Ingest chan *Call
|
||||
|
|
@ -70,7 +70,7 @@ func NewController(config *Config) *Controller {
|
|||
Options: NewOptions(),
|
||||
Systems: NewSystems(),
|
||||
Tags: NewTags(),
|
||||
Clients: make(map[*Client]bool),
|
||||
Clients: NewClients(),
|
||||
Register: make(chan *Client, 128),
|
||||
Unregister: make(chan *Client, 128),
|
||||
Ingest: make(chan *Call, 128),
|
||||
|
|
@ -140,26 +140,12 @@ func (controller *Controller) ConvertAudio(call *Call) {
|
|||
}
|
||||
|
||||
func (controller *Controller) EmitCall(call *Call) {
|
||||
for client := range controller.Clients {
|
||||
if (!controller.Accesses.IsRestricted() || client.Access.HasAccess(call)) && client.Livefeed.IsEnabled(call) {
|
||||
client.Send <- &Message{Command: MessageCommandCall, Payload: call}
|
||||
}
|
||||
}
|
||||
|
||||
controller.Clients.EmitCall(call, controller.Accesses.IsRestricted())
|
||||
controller.Downstreams.Send(controller, call)
|
||||
}
|
||||
|
||||
func (controller *Controller) EmitConfig() {
|
||||
restricted := controller.Accesses.IsRestricted()
|
||||
|
||||
for client := range controller.Clients {
|
||||
if restricted {
|
||||
client.Send <- &Message{Command: MessageCommandPin}
|
||||
} else {
|
||||
controller.SendClientConfig(client)
|
||||
}
|
||||
}
|
||||
|
||||
controller.Clients.EmitConfig(controller.Groups, controller.Options, controller.Systems, controller.Tags, controller.Accesses.IsRestricted())
|
||||
controller.Admin.BroadcastConfig()
|
||||
}
|
||||
|
||||
|
|
@ -404,7 +390,7 @@ func (controller *Controller) LogClientsCount() {
|
|||
controller.Logs.LogEvent(
|
||||
controller.Database,
|
||||
LogLevelInfo,
|
||||
fmt.Sprintf("listeners count is %v", len(controller.Clients)),
|
||||
fmt.Sprintf("listeners count is %v", controller.Clients.Count()),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -421,7 +407,7 @@ func (controller *Controller) ProcessMessage(client *Client, message *Message) e
|
|||
}
|
||||
|
||||
} else if message.Command == MessageCommandConfig {
|
||||
controller.SendClientConfig(client)
|
||||
client.SendConfig(controller.Groups, controller.Options, controller.Systems, controller.Tags)
|
||||
|
||||
} else if message.Command == MessageCommandListCall {
|
||||
if err := controller.ProcessMessageCommandListCall(client, message); err != nil {
|
||||
|
|
@ -541,13 +527,7 @@ func (controller *Controller) ProcessMessageCommandPin(client *Client, message *
|
|||
|
||||
switch v := client.Access.Limit.(type) {
|
||||
case uint:
|
||||
count := uint(0)
|
||||
for c := range controller.Clients {
|
||||
if c.Access == client.Access {
|
||||
count++
|
||||
}
|
||||
}
|
||||
if count > v {
|
||||
if controller.Clients.AccessCount(client) > int(v) {
|
||||
controller.Logs.LogEvent(
|
||||
controller.Database,
|
||||
LogLevelWarn,
|
||||
|
|
@ -561,30 +541,12 @@ func (controller *Controller) ProcessMessageCommandPin(client *Client, message *
|
|||
|
||||
client.AuthCount = 0
|
||||
|
||||
controller.SendClientConfig(client)
|
||||
client.SendConfig(controller.Groups, controller.Options, controller.Systems, controller.Tags)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (controller *Controller) SendClientConfig(client *Client) {
|
||||
client.SystemsMap = *controller.Systems.GetScopedSystems(client, controller.Groups, controller.Tags, controller.Options.SortTalkgroups)
|
||||
client.GroupsMap = *controller.Groups.GetGroupsMap(&client.SystemsMap)
|
||||
client.TagsMap = *controller.Tags.GetTagsMap(&client.SystemsMap)
|
||||
|
||||
client.Send <- &Message{
|
||||
Command: MessageCommandConfig,
|
||||
Payload: map[string]interface{}{
|
||||
"dimmerDelay": controller.Options.DimmerDelay,
|
||||
"groups": client.GroupsMap,
|
||||
"keypadBeeps": GetKeypadBeeps(controller.Options),
|
||||
"systems": client.SystemsMap,
|
||||
"tags": client.TagsMap,
|
||||
"tagsToggle": controller.Options.TagsToggle,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (controller *Controller) Start() error {
|
||||
var err error
|
||||
|
||||
|
|
@ -667,14 +629,12 @@ func (controller *Controller) Start() error {
|
|||
for {
|
||||
select {
|
||||
case client := <-controller.Register:
|
||||
controller.Clients[client] = true
|
||||
controller.Clients.Add(client)
|
||||
logClientsCount()
|
||||
|
||||
case client := <-controller.Unregister:
|
||||
if _, ok := controller.Clients[client]; ok {
|
||||
delete(controller.Clients, client)
|
||||
logClientsCount()
|
||||
}
|
||||
controller.Clients.Remove(client)
|
||||
logClientsCount()
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
|
@ -687,10 +647,6 @@ func (controller *Controller) Start() error {
|
|||
func (controller *Controller) Terminate() {
|
||||
controller.Dirwatches.Stop()
|
||||
|
||||
for c := range controller.Clients {
|
||||
c.Conn.Close()
|
||||
}
|
||||
|
||||
if err := controller.Database.Sql.Close(); err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,13 +6,13 @@ require (
|
|||
github.com/dhowden/tag v0.0.0-20201120070457-d52dcb253c63
|
||||
github.com/fsnotify/fsnotify v1.5.1
|
||||
github.com/go-sql-driver/mysql v1.6.0
|
||||
github.com/golang-jwt/jwt/v4 v4.3.0
|
||||
github.com/golang-jwt/jwt/v4 v4.4.0
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/gorilla/websocket v1.5.0
|
||||
github.com/kardianos/service v1.2.1
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292
|
||||
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd
|
||||
gopkg.in/ini.v1 v1.66.4
|
||||
modernc.org/sqlite v1.14.7
|
||||
modernc.org/sqlite v1.15.2
|
||||
)
|
||||
|
||||
require (
|
||||
|
|
@ -20,18 +20,18 @@ require (
|
|||
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
|
||||
github.com/stretchr/testify v1.7.0 // indirect
|
||||
golang.org/x/mod v0.5.1 // indirect
|
||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 // indirect
|
||||
golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/tools v0.1.9 // indirect
|
||||
golang.org/x/tools v0.1.10 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
lukechampine.com/uint128 v1.2.0 // indirect
|
||||
modernc.org/cc/v3 v3.35.22 // indirect
|
||||
modernc.org/ccgo/v3 v3.15.13 // indirect
|
||||
modernc.org/libc v1.14.5 // indirect
|
||||
modernc.org/cc/v3 v3.35.24 // indirect
|
||||
modernc.org/ccgo/v3 v3.15.17 // indirect
|
||||
modernc.org/libc v1.14.11 // indirect
|
||||
modernc.org/mathutil v1.4.1 // indirect
|
||||
modernc.org/memory v1.0.5 // indirect
|
||||
modernc.org/memory v1.0.6 // indirect
|
||||
modernc.org/opt v0.1.1 // indirect
|
||||
modernc.org/strutil v1.1.1 // indirect
|
||||
modernc.org/token v1.0.0 // indirect
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWp
|
|||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
|
||||
github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.0 h1:EmVIxB5jzbllGIjiCV5JG4VylbK3KE400tLGLI1cdfU=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo=
|
||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
|
|
@ -37,14 +37,16 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
|
|||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
|
||||
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
|
||||
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
|
||||
|
|
@ -66,8 +68,8 @@ golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 h1:BXxu8t6QN0G1uff4bzZzSkpsax8+ALqTGUtz08QrV00=
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf h1:Fm4IcnUL803i92qDlmB0obyHmosDrxZWxJL3gIeNqOw=
|
||||
golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
|
@ -78,8 +80,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8=
|
||||
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
|
||||
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
|
@ -108,8 +110,9 @@ modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g
|
|||
modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
|
||||
modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
|
||||
modernc.org/cc/v3 v3.35.20/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
|
||||
modernc.org/cc/v3 v3.35.22 h1:BzShpwCAP7TWzFppM4k2t03RhXhgYqaibROWkrWq7lE=
|
||||
modernc.org/cc/v3 v3.35.22/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
|
||||
modernc.org/cc/v3 v3.35.24 h1:vlCqjhVwX15t1uwlMPpOpNRC7JTjMZ9lT9DYHKQTFuA=
|
||||
modernc.org/cc/v3 v3.35.24/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
|
||||
modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60=
|
||||
modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw=
|
||||
modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI=
|
||||
|
|
@ -148,15 +151,17 @@ modernc.org/ccgo/v3 v3.12.86/go.mod h1:dN7S26DLTgVSni1PVA3KxxHTcykyDurf3OgUzNqTS
|
|||
modernc.org/ccgo/v3 v3.12.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko=
|
||||
modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA=
|
||||
modernc.org/ccgo/v3 v3.13.1/go.mod h1:aBYVOUfIlcSnrsRVU8VRS35y2DIfpgkmVkYZ0tpIXi4=
|
||||
modernc.org/ccgo/v3 v3.15.1/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0=
|
||||
modernc.org/ccgo/v3 v3.15.9/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0=
|
||||
modernc.org/ccgo/v3 v3.15.10/go.mod h1:wQKxoFn0ynxMuCLfFD09c8XPUCc8obfchoVR9Cn0fI8=
|
||||
modernc.org/ccgo/v3 v3.15.12/go.mod h1:VFePOWoCd8uDGRJpq/zfJ29D0EVzMSyID8LCMWYbX6I=
|
||||
modernc.org/ccgo/v3 v3.15.13 h1:hqlCzNJTXLrhS70y1PqWckrF9x1btSQRC7JFuQcBg5c=
|
||||
modernc.org/ccgo/v3 v3.15.13/go.mod h1:QHtvdpeODlXjdK3tsbpyK+7U9JV4PQsrPGIbtmc0KfY=
|
||||
modernc.org/ccgo/v3 v3.15.14/go.mod h1:144Sz2iBCKogb9OKwsu7hQEub3EVgOlyI8wMUPGKUXQ=
|
||||
modernc.org/ccgo/v3 v3.15.15/go.mod h1:z5qltXjU4PJl0pE5nhYQCvA9DhPHiWsl5GWl89+NSYE=
|
||||
modernc.org/ccgo/v3 v3.15.16/go.mod h1:XbKRMeMWMdq712Tr5ECgATYMrzJ+g9zAZEj2ktzBe24=
|
||||
modernc.org/ccgo/v3 v3.15.17 h1:svaDk4rfh7XQPBwkqzjKK8bta/vK4VVL3JP6ZLbcr0w=
|
||||
modernc.org/ccgo/v3 v3.15.17/go.mod h1:bofnFkpRFf5gLY+mBZIyTW6FEcp26xi2lgOFk2Rlvs0=
|
||||
modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
|
||||
modernc.org/ccorpus v1.11.4 h1:YOmQBBzE8GC/puUx76D5j/gJYIZQsydrh6VMJVfXF0M=
|
||||
modernc.org/ccorpus v1.11.4/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
|
||||
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
|
||||
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
|
||||
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
|
||||
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
|
||||
modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w=
|
||||
|
|
@ -200,25 +205,30 @@ modernc.org/libc v1.12.0/go.mod h1:2MH3DaF/gCU8i/UBiVE1VFRos4o523M7zipmwH8SIgQ=
|
|||
modernc.org/libc v1.14.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk=
|
||||
modernc.org/libc v1.14.2/go.mod h1:MX1GBLnRLNdvmK9azU9LCxZ5lMyhrbEMK8rG3X/Fe34=
|
||||
modernc.org/libc v1.14.3/go.mod h1:GPIvQVOVPizzlqyRX3l756/3ppsAgg1QgPxjr5Q4agQ=
|
||||
modernc.org/libc v1.14.5 h1:DAHvwGoVRDZs5iJXnX9RJrgXSsorupCWmJ2ac964Owk=
|
||||
modernc.org/libc v1.14.5/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak=
|
||||
modernc.org/libc v1.14.6/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak=
|
||||
modernc.org/libc v1.14.7/go.mod h1:f8xfWXW8LW41qb4X5+huVQo5dcfPlq7Cbny2TDheMv0=
|
||||
modernc.org/libc v1.14.8/go.mod h1:9+JCLb1MWSY23smyOpIPbd5ED+rSS/ieiDWUpdyO3mo=
|
||||
modernc.org/libc v1.14.10/go.mod h1:y1MtIWhwpJFpLYm6grAThtuXJKEsY6xkdZmXbRngIdo=
|
||||
modernc.org/libc v1.14.11 h1:ivxNmUkfp5iSGAGMIjylvx5R53s6QTJW9qUru1yrnk4=
|
||||
modernc.org/libc v1.14.11/go.mod h1:l5/Mz/GrZwOqzwRHA3abgSCnSeJzzTl+Ify0bAwKbAw=
|
||||
modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
||||
modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
||||
modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
||||
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
|
||||
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
||||
modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc=
|
||||
modernc.org/memory v1.0.5 h1:XRch8trV7GgvTec2i7jc33YlUI0RKVDBvZ5eZ5m8y14=
|
||||
modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM=
|
||||
modernc.org/memory v1.0.6 h1:5IaT/LChMrMdxLCy/a4qmb+7SzGiU8/ozPgkEOrfvFw=
|
||||
modernc.org/memory v1.0.6/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
|
||||
modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A=
|
||||
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
|
||||
modernc.org/sqlite v1.14.7 h1:A+6rGjtRQbt9SORXfV+hUyXOP3mDf7J5uz+EES/CNPE=
|
||||
modernc.org/sqlite v1.14.7/go.mod h1:yiCvMv3HblGmzENNIaNtFhfaNIwcla4u2JQEwJPzfEc=
|
||||
modernc.org/sqlite v1.15.2 h1:Es0SrEJUQHH7rt6uC/Zh2gHQ0AUhgB+F2RQqpXf3MNs=
|
||||
modernc.org/sqlite v1.15.2/go.mod h1:2P9bWfawhYMpYsBELqKREE+LFZo4uPApOuqszlZ7QX8=
|
||||
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
|
||||
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
|
||||
modernc.org/tcl v1.11.0 h1:B/zzEYjINeaki38KcIqdQRQx7W3WE7TkrlTwGnbm2II=
|
||||
modernc.org/tcl v1.11.0/go.mod h1:zsTUpbQ+NxQEjOjCUlImDLPv1sG8Ww0qp66ZvyOxCgw=
|
||||
modernc.org/tcl v1.11.2 h1:mXpsx3AZqJt83uDiFu9UYQVBjNjaWKGCF1YDSlpCL6Y=
|
||||
modernc.org/tcl v1.11.2/go.mod h1:BRzgpajcGdS2qTxniOx9c/dcxjlbA7p12eJNmiriQYo=
|
||||
modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
|
||||
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
||||
modernc.org/z v1.3.0 h1:4RWULo1Nvaq5ZBhbLe74u8p6tV4Mmm0ZrPBXYPm/xjM=
|
||||
modernc.org/z v1.3.0/go.mod h1:+mvgLH814oDjtATDdT3rs84JnUIpkvAF5B8AVkNlE2g=
|
||||
modernc.org/z v1.3.2 h1:4GWBVMa48UDC7KQ9tnaggN/yTlXg+CdCX9bhgHPQ9AM=
|
||||
modernc.org/z v1.3.2/go.mod h1:PEU2oK2OEA1CfzDTd+8E908qEXhC9s0MfyKp5LZsd+k=
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ func (groups *Groups) GetGroup(f interface{}) (group *Group, ok bool) {
|
|||
return nil, false
|
||||
}
|
||||
|
||||
func (groups *Groups) GetGroupsMap(systemsMap *SystemsMap) *GroupsMap {
|
||||
func (groups *Groups) GetGroupsMap(systemsMap *SystemsMap) GroupsMap {
|
||||
var groupsMap = GroupsMap{}
|
||||
|
||||
for _, system := range *systemsMap {
|
||||
|
|
@ -155,7 +155,7 @@ func (groups *Groups) GetGroupsMap(systemsMap *SystemsMap) *GroupsMap {
|
|||
}
|
||||
}
|
||||
|
||||
return &groupsMap
|
||||
return groupsMap
|
||||
}
|
||||
|
||||
func (groups *Groups) Read(db *Database) error {
|
||||
|
|
|
|||
|
|
@ -126,6 +126,8 @@ func main() {
|
|||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
ReadBufferSize: 1024,
|
||||
WriteBufferSize: 1024,
|
||||
}
|
||||
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
|
|
@ -189,9 +191,8 @@ func main() {
|
|||
s := &http.Server{
|
||||
Addr: addr,
|
||||
TLSConfig: tlsConfig,
|
||||
ReadTimeout: 60 * time.Second,
|
||||
WriteTimeout: 60 * time.Second,
|
||||
IdleTimeout: 120 * time.Second,
|
||||
ReadTimeout: 10 * time.Second,
|
||||
WriteTimeout: 10 * time.Second,
|
||||
ErrorLog: log.New(ioutil.Discard, "", 0),
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ func (systems *Systems) GetSystem(f interface{}) (system *System, ok bool) {
|
|||
return nil, false
|
||||
}
|
||||
|
||||
func (systems *Systems) GetScopedSystems(client *Client, groups *Groups, tags *Tags, sortTalkgroups bool) *SystemsMap {
|
||||
func (systems *Systems) GetScopedSystems(client *Client, groups *Groups, tags *Tags, sortTalkgroups bool) SystemsMap {
|
||||
var (
|
||||
rawSystems = []System{}
|
||||
systemsMap = SystemsMap{}
|
||||
|
|
@ -312,7 +312,7 @@ func (systems *Systems) GetScopedSystems(client *Client, groups *Groups, tags *T
|
|||
return false
|
||||
})
|
||||
|
||||
return &systemsMap
|
||||
return systemsMap
|
||||
}
|
||||
|
||||
func (systems *Systems) Read(db *Database) error {
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ func (tags *Tags) GetTag(f interface{}) (tag *Tag, ok bool) {
|
|||
return nil, false
|
||||
}
|
||||
|
||||
func (tags *Tags) GetTagsMap(systemsMap *SystemsMap) *TagsMap {
|
||||
func (tags *Tags) GetTagsMap(systemsMap *SystemsMap) TagsMap {
|
||||
tagsMap := TagsMap{}
|
||||
|
||||
for _, system := range *systemsMap {
|
||||
|
|
@ -155,7 +155,7 @@ func (tags *Tags) GetTagsMap(systemsMap *SystemsMap) *TagsMap {
|
|||
}
|
||||
}
|
||||
|
||||
return &tagsMap
|
||||
return tagsMap
|
||||
}
|
||||
|
||||
func (tags *Tags) Read(db *Database) error {
|
||||
|
|
|
|||
|
|
@ -15,4 +15,4 @@
|
|||
|
||||
package main
|
||||
|
||||
const Version = "6.1.15"
|
||||
const Version = "6.1.16"
|
||||
|
|
|
|||
Loading…
Reference in a new issue