Version 6.1.16

This commit is contained in:
Chrystian Huot 2022-03-17 14:35:55 -04:00
parent 662c5f9627
commit c215ba37f1
18 changed files with 1113 additions and 792 deletions

View file

@ -96,9 +96,14 @@ _v6.1.15_
- Fix access and downstreams order not retained. - Fix access and downstreams order not retained.
- Remove the self-signed certificate generator (-ssl create) as it was causing more problems than solutions. - 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). - 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 ## Version 6.0
- Backend server rewritten in Go for better performance and ease of installation. - Backend server rewritten in Go for better performance and ease of installation.

View file

@ -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. 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-amd64-v6.1.16.zip
rdio-scanner-darwin-arm64-v6.1.15.zip rdio-scanner-darwin-arm64-v6.1.16.zip
rdio-scanner-freebsd-amd64-v6.1.15.zip rdio-scanner-freebsd-amd64-v6.1.16.zip
rdio-scanner-linux-386-v6.1.15.zip rdio-scanner-linux-386-v6.1.16.zip
rdio-scanner-linux-amd64-v6.1.15.zip rdio-scanner-linux-amd64-v6.1.16.zip
rdio-scanner-linux-arm64-v6.1.15.zip rdio-scanner-linux-arm64-v6.1.16.zip
rdio-scanner-linux-arm-v6.1.15.zip rdio-scanner-linux-arm-v6.1.16.zip
rdio-scanner-windows-amd64-v6.1.15.zip rdio-scanner-windows-amd64-v6.1.16.zip
**Happy Rdio scanning !** **Happy Rdio scanning !**

View file

@ -16,8 +16,8 @@
################################################################################ ################################################################################
app := rdio-scanner app := rdio-scanner
date := 2022/03/03 date := 2022/03/17
ver := 6.1.15 ver := 6.1.16
client := $(wildcard client/*.json client/*.ts) client := $(wildcard client/*.json client/*.ts)
server := $(wildcard server/*.go) server := $(wildcard server/*.go)

1360
client/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,31 +1,31 @@
{ {
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>", "author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
"dependencies": { "dependencies": {
"@angular/animations": "^13.2.4", "@angular/animations": "^13.2.6",
"@angular/cdk": "^13.2.4", "@angular/cdk": "^13.2.6",
"@angular/common": "~13.2.4", "@angular/common": "~13.2.6",
"@angular/compiler": "~13.2.4", "@angular/compiler": "~13.2.6",
"@angular/core": "~13.2.4", "@angular/core": "~13.2.6",
"@angular/forms": "~13.2.4", "@angular/forms": "~13.2.6",
"@angular/material": "^13.2.4", "@angular/material": "^13.2.6",
"@angular/platform-browser": "~13.2.4", "@angular/platform-browser": "~13.2.6",
"@angular/platform-browser-dynamic": "~13.2.4", "@angular/platform-browser-dynamic": "~13.2.6",
"@angular/router": "^13.2.4", "@angular/router": "^13.2.6",
"@angular/service-worker": "^13.2.4", "@angular/service-worker": "^13.2.6",
"rxjs": "~7.4.0", "rxjs": "~7.4.0",
"tslib": "^2.3.1", "tslib": "^2.3.1",
"zone.js": "~0.11.4" "zone.js": "~0.11.5"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^13.2.5", "@angular-devkit/build-angular": "^13.2.6",
"@angular/cli": "^13.2.5", "@angular/cli": "^13.2.6",
"@angular/compiler-cli": "~13.2.4", "@angular/compiler-cli": "~13.2.6",
"@types/node": "^17.0.21", "@types/node": "^17.0.21",
"@typescript-eslint/eslint-plugin": "^5.12.1", "@typescript-eslint/eslint-plugin": "^5.15.0",
"@typescript-eslint/parser": "^5.12.1", "@typescript-eslint/parser": "^5.15.0",
"ajv-keywords": "^5.1.0", "ajv-keywords": "^5.1.0",
"eslint": "^8.10.0", "eslint": "^8.11.0",
"ts-node": "~10.5.0", "ts-node": "~10.7.0",
"typescript": "~4.4.4" "typescript": "~4.4.4"
}, },
"engines": { "engines": {
@ -38,5 +38,5 @@
"build": "ng build --base-href ./ --configuration production", "build": "ng build --base-href ./ --configuration production",
"start": "ng serve" "start": "ng serve"
}, },
"version": "6.1.15" "version": "6.1.16"
} }

View file

@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
rdio@macos ~ % mkdir rdio-scanner rdio@macos ~ % mkdir rdio-scanner
rdio@macos ~ % cd rdio-scanner rdio@macos ~ % cd rdio-scanner
rdio@macos rdio-scanner % unzip \ rdio@macos rdio-scanner % unzip \
> ~/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.15.zip Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.1.16.zip
inflating: rdio-scanner inflating: rdio-scanner
inflating: rdio-scanner.pdf 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@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/17 08:38:06 server started
2022/03/03 08:38:06 main interface at http://macos.local:3000 2022/03/17 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 admin interface at http://macos.local:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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@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/17 08:48:03 server started
2022/03/03 08:48:03 main interface at http://macos.local 2022/03/17 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 admin interface at http://macos.local/admin
## Listening on a SSL port ## 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_key_file mykey.key \
> -ssl_listen :443 > -ssl_listen :443
Rdio Scanner v6.1.15 Rdio Scanner v6.1.16
---------------------------------- ----------------------------------
2022/03/03 08:50:58 server started 2022/03/17 08:50:58 server started
2022/03/03 08:50:58 main interface at http://macos.local 2022/03/17 08:50:58 main interface at http://macos.local
2022/03/03 08:50:58 main interface at https://macos.local 2022/03/17 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 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. 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_auto_cert mydomain.com \
> -ssl_listen :443 \ > -ssl_listen :443 \
> -config_save > -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. 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@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/17 08:54:08 server started
2022/03/03 08:54:08 main interface at http://macos.local 2022/03/17 08:54:08 main interface at http://macos.local
2022/03/03 08:54:08 main interface at https://macos.local 2022/03/17 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 admin interface at https://macos.local/admin
## Install Rdio Scanner as a service ## Install Rdio Scanner as a service

View file

@ -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:~ $ mkdir rdio-scanner
rdio@pc-freebsd:~ $ cd rdio-scanner rdio@pc-freebsd:~ $ cd rdio-scanner
rdio@pc-freebsd:~/rdio-scanner $ unzip \ rdio@pc-freebsd:~/rdio-scanner $ unzip \
> ~/rdio-scanner-freebsd-amd64-v6.1.15.zip > ~/rdio-scanner-freebsd-amd64-v6.1.16.zip
Archive: ../rdio-scanner-freebsd-amd64-v6.1.15.zip Archive: ../rdio-scanner-freebsd-amd64-v6.1.16.zip
extracting: rdio-scanner extracting: rdio-scanner
extracting: rdio-scanner.pdf 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@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/17 08:16:36 server started
2022/03/03 08:16:36 main interface at http://pc-freebsd:3000 2022/03/17 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 admin interface at http://pc-freebsd:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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: Password:
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner -listen :80 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/17 08:19:38 server started
2022/03/03 08:19:38 main interface at http://pc-freebsd 2022/03/17 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 admin interface at http://pc-freebsd/admin
## Listening on a SSL port ## 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_key_file mykey.key \
> -ssl_listen :443 > -ssl_listen :443
Rdio Scanner v6.1.15 Rdio Scanner v6.1.16
---------------------------------- ----------------------------------
2022/03/03 10:34:29 server started 2022/03/17 10:34:29 server started
2022/03/03 10:34:29 main interface at http://pc-freebsd 2022/03/17 10:34:29 main interface at http://pc-freebsd
2022/03/03 10:34:29 main interface at https://pc-freebsd 2022/03/17 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 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. 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_auto_cert mydomain.com \
> -ssl_listen :443 \ > -ssl_listen :443 \
> -config_save > -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. 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: Password:
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner 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/17 10:38:28 server started
2022/03/03 10:38:29 main interface at http://pc-freebsd 2022/03/17 10:38:29 main interface at http://pc-freebsd
2022/03/03 10:38:29 main interface at https://pc-freebsd 2022/03/17 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:29 admin interface at https://pc-freebsd/admin
## Install Rdio Scanner as a service ## Install Rdio Scanner as a service

View file

@ -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 ~]$ mkdir rdio-scanner
[rdio@pc-linux ~]$ cd rdio-scanner [rdio@pc-linux ~]$ cd rdio-scanner
[rdio@pc-linux rdio-scanner]$ unzip \ [rdio@pc-linux rdio-scanner]$ unzip \
> ~/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.15.zip Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.1.16.zip
inflating: rdio-scanner inflating: rdio-scanner
inflating: rdio-scanner.pdf 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@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/17 09:11:48 server started
2022/03/03 09:11:48 main interface at http://pc-linux:3000 2022/03/17 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 admin interface at http://pc-linux:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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 [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner -listen :80
[sudo] password for rdio: [sudo] password for rdio:
Rdio Scanner v6.1.15 Rdio Scanner v6.1.16
---------------------------------- ----------------------------------
2022/03/03 09:14:00 server started 2022/03/17 09:14:00 server started
2022/03/03 09:14:00 main interface at http://pc-linux 2022/03/17 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 admin interface at http://pc-linux/admin
## Listening on a SSL port ## 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 > -ssl_listen :443
[sudo] password for rdio: [sudo] password for rdio:
Rdio Scanner v6.1.15 Rdio Scanner v6.1.16
---------------------------------- ----------------------------------
2022/03/03 09:16:47 server started 2022/03/17 09:16:47 server started
2022/03/03 09:16:47 main interface at http://pc-linux 2022/03/17 09:16:47 main interface at http://pc-linux
2022/03/03 09:16:47 main interface at https://pc-linux 2022/03/17 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 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. 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_auto_cert mydomain.com \
> -ssl_listen :443 \ > -ssl_listen :443 \
> -config_save > -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. 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 [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner
[sudo] Mot de passe de rdio : [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/17 09:20:40 server started
2022/03/03 09:20:40 main interface at http://pc-linux 2022/03/17 09:20:40 main interface at http://pc-linux
2022/03/03 09:20:40 main interface at https://pc-linux 2022/03/17 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 admin interface at https://pc-linux/admin
## Install Rdio Scanner as a service ## Install Rdio Scanner as a service

View file

@ -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> cd rdio-scanner
C:\Users\rdio\rdio-scanner> tar -xvf ^ 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.exe
x rdio-scanner.pdf 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 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/17 13:48:48 server started
2022/03/03 13:48:48 main interface at http://pc-windows:3000 2022/03/17 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 admin interface at http://pc-windows:3000/admin
4. Access the administrative dashboard to finalize the configuration. 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 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/17 10:53:31 server started
2022/03/03 10:53:31 main interface at http://pc-windows 2022/03/17 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 admin interface at http://pc-windows/admin
## Listening on a SSL port ## 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_key_file meykey.key ^
-ssl_listen :443 -ssl_listen :443
Rdio Scanner v6.1.15 Rdio Scanner v6.1.16
---------------------------------- ----------------------------------
2022/03/03 11:05:43 server started 2022/03/17 11:05:43 server started
2022/03/03 11:05:43 main interface at http://pc-windows 2022/03/17 11:05:43 main interface at http://pc-windows
2022/03/03 11:05:43 main interface at https://pc-windows 2022/03/17 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 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. 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_auto_cert mydomain.com ^
-ssl_listen :443 ^ -ssl_listen :443 ^
-config_save -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. 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 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/17 11:11:28 server started
2022/03/03 11:11:28 main interface at http://pc-windows 2022/03/17 11:11:28 main interface at http://pc-windows
2022/03/03 11:11:28 main interface at https://pc-windows 2022/03/17 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 admin interface at https://pc-windows/admin
\pagebreak{} \pagebreak{}

View file

@ -19,13 +19,13 @@ import (
"errors" "errors"
"fmt" "fmt"
"log" "log"
"sync"
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
type Client struct { type Client struct {
initialized bool
Access *Access Access *Access
AuthCount int AuthCount int
Controller *Controller Controller *Controller
@ -43,13 +43,8 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
pongWait = 60 * time.Second pongWait = 60 * time.Second
pingPeriod = pongWait / 10 * 9 pingPeriod = pongWait / 10 * 9
writeWait = 10 * time.Second writeWait = 10 * time.Second
closeWait = 10 * time.Second
) )
if client.initialized {
return errors.New("client.init: already initialized")
}
if conn == nil { if conn == nil {
return errors.New("client.init: no websocket connection") return errors.New("client.init: no websocket connection")
} }
@ -65,7 +60,6 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
go func() { go func() {
defer func() { defer func() {
controller.Unregister <- client controller.Unregister <- client
client.Conn.Close()
}() }()
client.Conn.SetReadDeadline(time.Now().Add(pongWait)) client.Conn.SetReadDeadline(time.Now().Add(pongWait))
@ -102,29 +96,19 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error {
}) })
defer func() { defer func() {
controller.Unregister <- client
ticker.Stop() ticker.Stop()
timer.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 { for {
select { select {
case message, ok := <-client.Send: case message, ok := <-client.Send:
if !ok { if !ok {
break Loop return
} }
if client.Conn == nil { if client.Conn == nil {
break Loop return
} }
if message.Command == MessageCommandConfig { 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)) client.Conn.SetWriteDeadline(time.Now().Add(writeWait))
if err = client.Conn.WriteMessage(websocket.TextMessage, b); err != nil { if err = client.Conn.WriteMessage(websocket.TextMessage, b); err != nil {
break Loop return
} }
} }
case <-ticker.C: case <-ticker.C:
if err := client.Conn.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(writeWait)); err != nil { client.Conn.SetWriteDeadline(time.Now().Add(writeWait))
break Loop
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 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()
}

View file

@ -47,7 +47,7 @@ type Controller struct {
Scheduler *Scheduler Scheduler *Scheduler
Systems *Systems Systems *Systems
Tags *Tags Tags *Tags
Clients map[*Client]bool Clients *Clients
Register chan *Client Register chan *Client
Unregister chan *Client Unregister chan *Client
Ingest chan *Call Ingest chan *Call
@ -70,7 +70,7 @@ func NewController(config *Config) *Controller {
Options: NewOptions(), Options: NewOptions(),
Systems: NewSystems(), Systems: NewSystems(),
Tags: NewTags(), Tags: NewTags(),
Clients: make(map[*Client]bool), Clients: NewClients(),
Register: make(chan *Client, 128), Register: make(chan *Client, 128),
Unregister: make(chan *Client, 128), Unregister: make(chan *Client, 128),
Ingest: make(chan *Call, 128), Ingest: make(chan *Call, 128),
@ -140,26 +140,12 @@ func (controller *Controller) ConvertAudio(call *Call) {
} }
func (controller *Controller) EmitCall(call *Call) { func (controller *Controller) EmitCall(call *Call) {
for client := range controller.Clients { controller.Clients.EmitCall(call, controller.Accesses.IsRestricted())
if (!controller.Accesses.IsRestricted() || client.Access.HasAccess(call)) && client.Livefeed.IsEnabled(call) {
client.Send <- &Message{Command: MessageCommandCall, Payload: call}
}
}
controller.Downstreams.Send(controller, call) controller.Downstreams.Send(controller, call)
} }
func (controller *Controller) EmitConfig() { func (controller *Controller) EmitConfig() {
restricted := controller.Accesses.IsRestricted() controller.Clients.EmitConfig(controller.Groups, controller.Options, controller.Systems, controller.Tags, controller.Accesses.IsRestricted())
for client := range controller.Clients {
if restricted {
client.Send <- &Message{Command: MessageCommandPin}
} else {
controller.SendClientConfig(client)
}
}
controller.Admin.BroadcastConfig() controller.Admin.BroadcastConfig()
} }
@ -404,7 +390,7 @@ func (controller *Controller) LogClientsCount() {
controller.Logs.LogEvent( controller.Logs.LogEvent(
controller.Database, controller.Database,
LogLevelInfo, 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 { } else if message.Command == MessageCommandConfig {
controller.SendClientConfig(client) client.SendConfig(controller.Groups, controller.Options, controller.Systems, controller.Tags)
} else if message.Command == MessageCommandListCall { } else if message.Command == MessageCommandListCall {
if err := controller.ProcessMessageCommandListCall(client, message); err != nil { 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) { switch v := client.Access.Limit.(type) {
case uint: case uint:
count := uint(0) if controller.Clients.AccessCount(client) > int(v) {
for c := range controller.Clients {
if c.Access == client.Access {
count++
}
}
if count > v {
controller.Logs.LogEvent( controller.Logs.LogEvent(
controller.Database, controller.Database,
LogLevelWarn, LogLevelWarn,
@ -561,30 +541,12 @@ func (controller *Controller) ProcessMessageCommandPin(client *Client, message *
client.AuthCount = 0 client.AuthCount = 0
controller.SendClientConfig(client) client.SendConfig(controller.Groups, controller.Options, controller.Systems, controller.Tags)
} }
return nil 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 { func (controller *Controller) Start() error {
var err error var err error
@ -667,16 +629,14 @@ func (controller *Controller) Start() error {
for { for {
select { select {
case client := <-controller.Register: case client := <-controller.Register:
controller.Clients[client] = true controller.Clients.Add(client)
logClientsCount() logClientsCount()
case client := <-controller.Unregister: case client := <-controller.Unregister:
if _, ok := controller.Clients[client]; ok { controller.Clients.Remove(client)
delete(controller.Clients, client)
logClientsCount() logClientsCount()
} }
} }
}
}() }()
controller.Dirwatches.Start(controller) controller.Dirwatches.Start(controller)
@ -687,10 +647,6 @@ func (controller *Controller) Start() error {
func (controller *Controller) Terminate() { func (controller *Controller) Terminate() {
controller.Dirwatches.Stop() controller.Dirwatches.Stop()
for c := range controller.Clients {
c.Conn.Close()
}
if err := controller.Database.Sql.Close(); err != nil { if err := controller.Database.Sql.Close(); err != nil {
log.Println(err) log.Println(err)
} }

View file

@ -6,13 +6,13 @@ require (
github.com/dhowden/tag v0.0.0-20201120070457-d52dcb253c63 github.com/dhowden/tag v0.0.0-20201120070457-d52dcb253c63
github.com/fsnotify/fsnotify v1.5.1 github.com/fsnotify/fsnotify v1.5.1
github.com/go-sql-driver/mysql v1.6.0 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/google/uuid v1.3.0
github.com/gorilla/websocket v1.5.0 github.com/gorilla/websocket v1.5.0
github.com/kardianos/service v1.2.1 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 gopkg.in/ini.v1 v1.66.4
modernc.org/sqlite v1.14.7 modernc.org/sqlite v1.15.2
) )
require ( require (
@ -20,18 +20,18 @@ require (
github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-isatty v0.0.14 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/stretchr/testify v1.7.0 // 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/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/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 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
lukechampine.com/uint128 v1.2.0 // indirect lukechampine.com/uint128 v1.2.0 // indirect
modernc.org/cc/v3 v3.35.22 // indirect modernc.org/cc/v3 v3.35.24 // indirect
modernc.org/ccgo/v3 v3.15.13 // indirect modernc.org/ccgo/v3 v3.15.17 // indirect
modernc.org/libc v1.14.5 // indirect modernc.org/libc v1.14.11 // indirect
modernc.org/mathutil v1.4.1 // 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/opt v0.1.1 // indirect
modernc.org/strutil v1.1.1 // indirect modernc.org/strutil v1.1.1 // indirect
modernc.org/token v1.0.0 // indirect modernc.org/token v1.0.0 // indirect

View file

@ -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/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 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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.4.0 h1:EmVIxB5jzbllGIjiCV5JG4VylbK3KE400tLGLI1cdfU=
github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 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 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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= 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-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-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-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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= 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-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-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-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-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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= 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-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-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-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-20220317061510-51cd9980dadf h1:Fm4IcnUL803i92qDlmB0obyHmosDrxZWxJL3gIeNqOw=
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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= 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-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-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.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.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= 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-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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/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.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
modernc.org/cc/v3 v3.35.18/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.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.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.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60=
modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw= 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= 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.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko=
modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA= 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.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.9/go.mod h1:md59wBwDT2LznX/OTCPoVS6KIsdRgY8xqQwBV+hkTH0=
modernc.org/ccgo/v3 v3.15.10/go.mod h1:wQKxoFn0ynxMuCLfFD09c8XPUCc8obfchoVR9Cn0fI8= 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.12/go.mod h1:VFePOWoCd8uDGRJpq/zfJ29D0EVzMSyID8LCMWYbX6I=
modernc.org/ccgo/v3 v3.15.13 h1:hqlCzNJTXLrhS70y1PqWckrF9x1btSQRC7JFuQcBg5c= modernc.org/ccgo/v3 v3.15.14/go.mod h1:144Sz2iBCKogb9OKwsu7hQEub3EVgOlyI8wMUPGKUXQ=
modernc.org/ccgo/v3 v3.15.13/go.mod h1:QHtvdpeODlXjdK3tsbpyK+7U9JV4PQsrPGIbtmc0KfY= 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.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/ccorpus v1.11.4 h1:YOmQBBzE8GC/puUx76D5j/gJYIZQsydrh6VMJVfXF0M= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
modernc.org/ccorpus v1.11.4/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= 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 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= 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.1/go.mod h1:npFeGWjmZTjFeWALQLrvklVmAxv4m80jnG3+xI8FdJk=
modernc.org/libc v1.14.2/go.mod h1:MX1GBLnRLNdvmK9azU9LCxZ5lMyhrbEMK8rG3X/Fe34= 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.3/go.mod h1:GPIvQVOVPizzlqyRX3l756/3ppsAgg1QgPxjr5Q4agQ=
modernc.org/libc v1.14.5 h1:DAHvwGoVRDZs5iJXnX9RJrgXSsorupCWmJ2ac964Owk= modernc.org/libc v1.14.6/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak=
modernc.org/libc v1.14.5/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.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.2.2/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.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= 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.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.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 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A=
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= 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.15.2 h1:Es0SrEJUQHH7rt6uC/Zh2gHQ0AUhgB+F2RQqpXf3MNs=
modernc.org/sqlite v1.14.7/go.mod h1:yiCvMv3HblGmzENNIaNtFhfaNIwcla4u2JQEwJPzfEc= 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 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= 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.2 h1:mXpsx3AZqJt83uDiFu9UYQVBjNjaWKGCF1YDSlpCL6Y=
modernc.org/tcl v1.11.0/go.mod h1:zsTUpbQ+NxQEjOjCUlImDLPv1sG8Ww0qp66ZvyOxCgw= 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 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= 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.2 h1:4GWBVMa48UDC7KQ9tnaggN/yTlXg+CdCX9bhgHPQ9AM=
modernc.org/z v1.3.0/go.mod h1:+mvgLH814oDjtATDdT3rs84JnUIpkvAF5B8AVkNlE2g= modernc.org/z v1.3.2/go.mod h1:PEU2oK2OEA1CfzDTd+8E908qEXhC9s0MfyKp5LZsd+k=

View file

@ -90,7 +90,7 @@ func (groups *Groups) GetGroup(f interface{}) (group *Group, ok bool) {
return nil, false return nil, false
} }
func (groups *Groups) GetGroupsMap(systemsMap *SystemsMap) *GroupsMap { func (groups *Groups) GetGroupsMap(systemsMap *SystemsMap) GroupsMap {
var groupsMap = GroupsMap{} var groupsMap = GroupsMap{}
for _, system := range *systemsMap { 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 { func (groups *Groups) Read(db *Database) error {

View file

@ -126,6 +126,8 @@ func main() {
CheckOrigin: func(r *http.Request) bool { CheckOrigin: func(r *http.Request) bool {
return true return true
}, },
ReadBufferSize: 1024,
WriteBufferSize: 1024,
} }
conn, err := upgrader.Upgrade(w, r, nil) conn, err := upgrader.Upgrade(w, r, nil)
@ -189,9 +191,8 @@ func main() {
s := &http.Server{ s := &http.Server{
Addr: addr, Addr: addr,
TLSConfig: tlsConfig, TLSConfig: tlsConfig,
ReadTimeout: 60 * time.Second, ReadTimeout: 10 * time.Second,
WriteTimeout: 60 * time.Second, WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
ErrorLog: log.New(ioutil.Discard, "", 0), ErrorLog: log.New(ioutil.Discard, "", 0),
} }

View file

@ -158,7 +158,7 @@ func (systems *Systems) GetSystem(f interface{}) (system *System, ok bool) {
return nil, false 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 ( var (
rawSystems = []System{} rawSystems = []System{}
systemsMap = SystemsMap{} systemsMap = SystemsMap{}
@ -312,7 +312,7 @@ func (systems *Systems) GetScopedSystems(client *Client, groups *Groups, tags *T
return false return false
}) })
return &systemsMap return systemsMap
} }
func (systems *Systems) Read(db *Database) error { func (systems *Systems) Read(db *Database) error {

View file

@ -90,7 +90,7 @@ func (tags *Tags) GetTag(f interface{}) (tag *Tag, ok bool) {
return nil, false return nil, false
} }
func (tags *Tags) GetTagsMap(systemsMap *SystemsMap) *TagsMap { func (tags *Tags) GetTagsMap(systemsMap *SystemsMap) TagsMap {
tagsMap := TagsMap{} tagsMap := TagsMap{}
for _, system := range *systemsMap { 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 { func (tags *Tags) Read(db *Database) error {

View file

@ -15,4 +15,4 @@
package main package main
const Version = "6.1.15" const Version = "6.1.16"