mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralgw.git
synced 2025-11-03 12:17:56 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
91fe27e973 | ||
|
|
f8d714d04b |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -29,4 +29,4 @@ helm/charts/*
|
|||||||
!helm/charts/.gitkeep
|
!helm/charts/.gitkeep
|
||||||
/portal-test/
|
/portal-test/
|
||||||
/src/ow_version.h
|
/src/ow_version.h
|
||||||
.vscode/*
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
project(owgw VERSION 4.1.1)
|
project(owgw VERSION 4.0.0)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
ARG DEBIAN_VERSION=bookworm
|
ARG DEBIAN_VERSION=11.5-slim
|
||||||
ARG POCO_VERSION=poco-tip-v4-tag
|
ARG POCO_VERSION=poco-tip-v2
|
||||||
ARG CPPKAFKA_VERSION=tip-v1
|
ARG CPPKAFKA_VERSION=tip-v1
|
||||||
ARG VALIJASON_VERSION=tip-v1.0.2
|
ARG VALIJASON_VERSION=tip-v1.0.2
|
||||||
ARG APP_NAME=owgw
|
ARG APP_NAME=owgw
|
||||||
@@ -100,7 +100,7 @@ RUN mkdir -p $APP_ROOT $APP_CONFIG && \
|
|||||||
|
|
||||||
RUN apt-get update && apt-get install --no-install-recommends -y \
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||||
librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
|
librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
|
||||||
libmariadb-dev-compat libpq5 unixodbc postgresql-client libfmt9 sqlite3
|
libmariadb-dev-compat libpq5 unixodbc postgresql-client libfmt7 sqlite3
|
||||||
|
|
||||||
COPY readiness_check /readiness_check
|
COPY readiness_check /readiness_check
|
||||||
COPY test_scripts/curl/cli /cli
|
COPY test_scripts/curl/cli /cli
|
||||||
|
|||||||
26
PROTOCOL.md
26
PROTOCOL.md
@@ -880,32 +880,6 @@ The device should answer:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Controller wants the device to perform re-enrollment
|
|
||||||
Controller sends this command to trigger re-enrollment, i.e. update of operational certificate. Extreme care must be taken.
|
|
||||||
```json
|
|
||||||
{ "jsonrpc" : "2.0" ,
|
|
||||||
"method" : "reenroll" ,
|
|
||||||
"params" : {
|
|
||||||
"serial" : <serial number>,
|
|
||||||
"when" : Optional - <UTC time when to apply this config, 0 mean immediate, this is a suggestion>
|
|
||||||
},
|
|
||||||
"id" : <some number>
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The device should answer:
|
|
||||||
```json
|
|
||||||
{ "jsonrpc" : "2.0" ,
|
|
||||||
"result" : {
|
|
||||||
"serial" : <serial number> ,
|
|
||||||
"status" : {
|
|
||||||
"error" : <0 or the value of $? from the shell running the command, 255 signifies a timeout>,
|
|
||||||
"txt" : <text describing the error or success>
|
|
||||||
},
|
|
||||||
"id" : <same number as request>
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Controller wants the device to switch to another controller
|
#### Controller wants the device to switch to another controller
|
||||||
Controller sends this when the device should change the controller it connects to without looking up a new redirector.
|
Controller sends this when the device should change the controller it connects to without looking up a new redirector.
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
|
|||||||
FILEUPLOADER_HOST_KEY_PASSWORD=${FILEUPLOADER_HOST_KEY_PASSWORD:-"mypassword"} \
|
FILEUPLOADER_HOST_KEY_PASSWORD=${FILEUPLOADER_HOST_KEY_PASSWORD:-"mypassword"} \
|
||||||
FILEUPLOADER_PATH=${FILEUPLOADER_PATH:-"\${APP_ROOT}/uploads"} \
|
FILEUPLOADER_PATH=${FILEUPLOADER_PATH:-"\${APP_ROOT}/uploads"} \
|
||||||
FILEUPLOADER_URI=${FILEUPLOADER_URI:-"https://localhost:16003"} \
|
FILEUPLOADER_URI=${FILEUPLOADER_URI:-"https://localhost:16003"} \
|
||||||
FILEUPLOADER_MAXSIZE=${FILEUPLOADER_MAXSIZE:-"10000"} \
|
|
||||||
SERVICE_KEY=${SERVICE_KEY:-"\${APP_ROOT}/certs/restapi-key.pem"} \
|
SERVICE_KEY=${SERVICE_KEY:-"\${APP_ROOT}/certs/restapi-key.pem"} \
|
||||||
SERVICE_KEY_PASSWORD=${SERVICE_KEY_PASSWORD:-"mypassword"} \
|
SERVICE_KEY_PASSWORD=${SERVICE_KEY_PASSWORD:-"mypassword"} \
|
||||||
SYSTEM_DATA=${SYSTEM_DATA:-"\${APP_ROOT}/data"} \
|
SYSTEM_DATA=${SYSTEM_DATA:-"\${APP_ROOT}/data"} \
|
||||||
@@ -77,7 +76,6 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
|
|||||||
CERTIFICATES_ALLOWMISMATCH=${CERTIFICATES_ALLOWMISMATCH:-"false"} \
|
CERTIFICATES_ALLOWMISMATCH=${CERTIFICATES_ALLOWMISMATCH:-"false"} \
|
||||||
IPINFO_DEFAULT_COUNTRY=${IPINFO_DEFAULT_COUNTRY:-"US"} \
|
IPINFO_DEFAULT_COUNTRY=${IPINFO_DEFAULT_COUNTRY:-"US"} \
|
||||||
DEVICE_SESSION_TIMEOUT=${DEVICE_SESSION_TIMEOUT:-"600"} \
|
DEVICE_SESSION_TIMEOUT=${DEVICE_SESSION_TIMEOUT:-"600"} \
|
||||||
LOGGING_LEVEL=${LOGGING_LEVEL:-"information"} \
|
|
||||||
envsubst < /"${APP_NAME}".properties.tmpl > "${APP_CONFIG}"/"${APP_NAME}".properties
|
envsubst < /"${APP_NAME}".properties.tmpl > "${APP_CONFIG}"/"${APP_NAME}".properties
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ fullnameOverride: ""
|
|||||||
images:
|
images:
|
||||||
owgw:
|
owgw:
|
||||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
|
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
|
||||||
tag: master
|
tag: v4.0.0
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
# regcred:
|
# regcred:
|
||||||
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
|
|||||||
@@ -1576,15 +1576,6 @@ components:
|
|||||||
format: base64
|
format: base64
|
||||||
description: This is a base64 encoded string of the certificate bundle (the current bundle .tar.gz file from the PKI portal)
|
description: This is a base64 encoded string of the certificate bundle (the current bundle .tar.gz file from the PKI portal)
|
||||||
|
|
||||||
ReenrollRequest:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serialNumber:
|
|
||||||
type: string
|
|
||||||
when:
|
|
||||||
type: integer
|
|
||||||
format: int64
|
|
||||||
|
|
||||||
PowerCycleRequest:
|
PowerCycleRequest:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -1609,74 +1600,6 @@ components:
|
|||||||
maximum: 60000
|
maximum: 60000
|
||||||
description: off time in milliseconds
|
description: off time in milliseconds
|
||||||
|
|
||||||
PackageGetResponse:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serial:
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
package:
|
|
||||||
type: string
|
|
||||||
text:
|
|
||||||
type: string
|
|
||||||
uuid:
|
|
||||||
type: number
|
|
||||||
|
|
||||||
|
|
||||||
PackageInstallRequest:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serialNumber:
|
|
||||||
type: string
|
|
||||||
packages:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
url:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
PackageInstallResponse:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serial:
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
error:
|
|
||||||
type: number
|
|
||||||
packages:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
result:
|
|
||||||
type: string
|
|
||||||
text:
|
|
||||||
type: string
|
|
||||||
uuid:
|
|
||||||
type: number
|
|
||||||
|
|
||||||
PackageRemoveRequest:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serialNumber:
|
|
||||||
type: string
|
|
||||||
packages:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
paths:
|
paths:
|
||||||
/devices:
|
/devices:
|
||||||
get:
|
get:
|
||||||
@@ -3133,32 +3056,6 @@ paths:
|
|||||||
404:
|
404:
|
||||||
$ref: '#/components/responses/NotFound'
|
$ref: '#/components/responses/NotFound'
|
||||||
|
|
||||||
/device/{serialNumber}/reenroll:
|
|
||||||
post:
|
|
||||||
tags:
|
|
||||||
- Commands
|
|
||||||
summary: Reenroll operational certificate for the device.
|
|
||||||
operationId: reenrollCertificate
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: serialNumber
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
required: true
|
|
||||||
requestBody:
|
|
||||||
description: Reenroll operational certificate for the device
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ReenrollRequest'
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
$ref: '#/components/responses/Success'
|
|
||||||
403:
|
|
||||||
$ref: '#/components/responses/Unauthorized'
|
|
||||||
404:
|
|
||||||
$ref: '#/components/responses/NotFound'
|
|
||||||
|
|
||||||
/device/{serialNumber}/powercycle:
|
/device/{serialNumber}/powercycle:
|
||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
@@ -3187,98 +3084,6 @@ paths:
|
|||||||
404:
|
404:
|
||||||
$ref: '#/components/responses/NotFound'
|
$ref: '#/components/responses/NotFound'
|
||||||
|
|
||||||
/device/{serialNumber}/package:
|
|
||||||
get:
|
|
||||||
tags:
|
|
||||||
- Commands
|
|
||||||
summary: Get package installed on the remote device.
|
|
||||||
operationId: getDevicePackages
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: serialNumber
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
required: true
|
|
||||||
- in: query
|
|
||||||
name: pkgName
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
required: true
|
|
||||||
description: The name or identifier of the package to retrieve.
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Successful command execution
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/PackageGetResponse'
|
|
||||||
403:
|
|
||||||
$ref: '#/components/responses/Unauthorized'
|
|
||||||
404:
|
|
||||||
$ref: '#/components/responses/NotFound'
|
|
||||||
|
|
||||||
post:
|
|
||||||
tags:
|
|
||||||
- Commands
|
|
||||||
summary: Install IPK files to remote device.
|
|
||||||
operationId: postDevicePackages
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: serialNumber
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
required: true
|
|
||||||
requestBody:
|
|
||||||
description: Packages to be installed
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/PackageInstallRequest'
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Successful command execution
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/PackageInstallResponse'
|
|
||||||
|
|
||||||
400:
|
|
||||||
$ref: '#/components/responses/BadRequest'
|
|
||||||
403:
|
|
||||||
$ref: '#/components/responses/Unauthorized'
|
|
||||||
404:
|
|
||||||
$ref: '#/components/responses/NotFound'
|
|
||||||
|
|
||||||
delete:
|
|
||||||
tags:
|
|
||||||
- Commands
|
|
||||||
summary: Remove install packages from remote device.
|
|
||||||
operationId: deleteDevicePackages
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: serialNumber
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
required: true
|
|
||||||
requestBody:
|
|
||||||
description: Packages to be removed
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/PackageRemoveRequest'
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/PackageInstallResponse'
|
|
||||||
400:
|
|
||||||
$ref: '#/components/responses/BadRequest'
|
|
||||||
403:
|
|
||||||
$ref: '#/components/responses/Unauthorized'
|
|
||||||
404:
|
|
||||||
$ref: '#/components/responses/NotFound'
|
|
||||||
|
|
||||||
/ouis:
|
/ouis:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
|
|||||||
@@ -52,8 +52,7 @@ openwifi.fileuploader.host.0.cert = ${FILEUPLOADER_HOST_CERT}
|
|||||||
openwifi.fileuploader.host.0.key = ${FILEUPLOADER_HOST_KEY}
|
openwifi.fileuploader.host.0.key = ${FILEUPLOADER_HOST_KEY}
|
||||||
openwifi.fileuploader.host.0.key.password = ${FILEUPLOADER_HOST_KEY_PASSWORD}
|
openwifi.fileuploader.host.0.key.password = ${FILEUPLOADER_HOST_KEY_PASSWORD}
|
||||||
openwifi.fileuploader.path = ${FILEUPLOADER_PATH}
|
openwifi.fileuploader.path = ${FILEUPLOADER_PATH}
|
||||||
# maxsize in KB
|
openwifi.fileuploader.maxsize = 10000
|
||||||
openwifi.fileuploader.maxsize = ${FILEUPLOADER_MAXSIZE}
|
|
||||||
openwifi.fileuploader.uri = ${FILEUPLOADER_URI}
|
openwifi.fileuploader.uri = ${FILEUPLOADER_URI}
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -183,4 +182,4 @@ archiver.db.3.keep = 7
|
|||||||
########################################################################
|
########################################################################
|
||||||
logging.type = console
|
logging.type = console
|
||||||
logging.path = $OWGW_ROOT/logs
|
logging.path = $OWGW_ROOT/logs
|
||||||
logging.level = ${LOGGING_LEVEL}
|
logging.level = information
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include <Poco/Net/Context.h>
|
#include <Poco/Net/Context.h>
|
||||||
#include <Poco/Net/HTTPServerRequestImpl.h>
|
#include <Poco/Net/HTTPServerRequestImpl.h>
|
||||||
#include <Poco/Net/HTTPServerResponseImpl.h>
|
#include <Poco/Net/HTTPServerResponseImpl.h>
|
||||||
#include <Poco/JSON/JSONException.h>
|
|
||||||
#include <Poco/Net/NetException.h>
|
#include <Poco/Net/NetException.h>
|
||||||
#include <Poco/Net/SSLException.h>
|
#include <Poco/Net/SSLException.h>
|
||||||
#include <Poco/Net/SecureStreamSocketImpl.h>
|
#include <Poco/Net/SecureStreamSocketImpl.h>
|
||||||
@@ -40,7 +39,7 @@ namespace OpenWifi {
|
|||||||
Poco::Net::HTTPServerResponse &response,
|
Poco::Net::HTTPServerResponse &response,
|
||||||
uint64_t session_id, Poco::Logger &L,
|
uint64_t session_id, Poco::Logger &L,
|
||||||
std::pair<std::shared_ptr<Poco::Net::SocketReactor>, std::shared_ptr<LockedDbSession>> R)
|
std::pair<std::shared_ptr<Poco::Net::SocketReactor>, std::shared_ptr<LockedDbSession>> R)
|
||||||
: Logger_(L), IncomingFrame_(0) {
|
: Logger_(L) {
|
||||||
|
|
||||||
Reactor_ = R.first;
|
Reactor_ = R.first;
|
||||||
DbSession_ = R.second;
|
DbSession_ = R.second;
|
||||||
@@ -55,7 +54,6 @@ namespace OpenWifi {
|
|||||||
WS_->setNoDelay(false);
|
WS_->setNoDelay(false);
|
||||||
WS_->setKeepAlive(true);
|
WS_->setKeepAlive(true);
|
||||||
WS_->setBlocking(false);
|
WS_->setBlocking(false);
|
||||||
IncomingFrame_.resize(0);
|
|
||||||
uuid_ = MicroServiceRandom(std::numeric_limits<std::uint64_t>::max()-1);
|
uuid_ = MicroServiceRandom(std::numeric_limits<std::uint64_t>::max()-1);
|
||||||
|
|
||||||
AP_WS_Server()->IncrementConnectionCount();
|
AP_WS_Server()->IncrementConnectionCount();
|
||||||
@@ -215,7 +213,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
State_.certificateExpiryDate = PeerCert.expiresOn().timestamp().epochTime();
|
State_.certificateExpiryDate = PeerCert.expiresOn().timestamp().epochTime();
|
||||||
State_.certificateIssuerName = PeerCert.issuerName();
|
|
||||||
|
|
||||||
poco_trace(Logger_,
|
poco_trace(Logger_,
|
||||||
fmt::format("TLS-CONNECTION({}): Session={} CN={} Completed. (t={})", CId_,
|
fmt::format("TLS-CONNECTION({}): Session={} CN={} Completed. (t={})", CId_,
|
||||||
@@ -602,95 +599,36 @@ namespace OpenWifi {
|
|||||||
EndConnection();
|
EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_WS_Connection::ProcessWSFinalPayload() {
|
|
||||||
auto IncomingSize = IncomingFrame_.size();
|
|
||||||
|
|
||||||
if (IncomingSize == 0) {
|
|
||||||
poco_debug(Logger_,
|
|
||||||
fmt::format("ProcessWSFrame({}): Final Acc. Frame received but empty",
|
|
||||||
CId_));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
IncomingFrame_.append(0);
|
|
||||||
|
|
||||||
poco_trace(Logger_,
|
|
||||||
fmt::format("ProcessWSFrame({}): Final Acc. Frame received (len={}, Msg={}",
|
|
||||||
CId_, IncomingSize, IncomingFrame_.begin()));
|
|
||||||
|
|
||||||
Poco::JSON::Parser parser;
|
|
||||||
auto ParsedMessage = parser.parse(IncomingFrame_.begin());
|
|
||||||
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
|
|
||||||
|
|
||||||
if (IncomingJSON->has(uCentralProtocol::JSONRPC)) {
|
|
||||||
if (IncomingJSON->has(uCentralProtocol::METHOD) &&
|
|
||||||
IncomingJSON->has(uCentralProtocol::PARAMS)) {
|
|
||||||
ProcessJSONRPCEvent(IncomingJSON);
|
|
||||||
} else if (IncomingJSON->has(uCentralProtocol::RESULT) &&
|
|
||||||
IncomingJSON->has(uCentralProtocol::ID)) {
|
|
||||||
poco_trace(Logger_, fmt::format("RPC-RESULT({}): payload: {}", CId_,
|
|
||||||
IncomingFrame_.begin()));
|
|
||||||
ProcessJSONRPCResult(IncomingJSON);
|
|
||||||
} else {
|
|
||||||
poco_warning(
|
|
||||||
Logger_,
|
|
||||||
fmt::format("INVALID-PAYLOAD({}): Payload is not JSON-RPC 2.0: {}",
|
|
||||||
CId_, IncomingFrame_.begin()));
|
|
||||||
}
|
|
||||||
} else if (IncomingJSON->has(uCentralProtocol::RADIUS)) {
|
|
||||||
ProcessIncomingRadiusData(IncomingJSON);
|
|
||||||
} else {
|
|
||||||
std::ostringstream iS;
|
|
||||||
IncomingJSON->stringify(iS);
|
|
||||||
poco_warning(
|
|
||||||
Logger_,
|
|
||||||
fmt::format("FRAME({}): illegal transaction header, missing 'jsonrpc': {}",
|
|
||||||
CId_, iS.str()));
|
|
||||||
Errors_++;
|
|
||||||
}
|
|
||||||
IncomingFrame_.clear();
|
|
||||||
IncomingFrame_.resize(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AP_WS_Connection::ProcessIncomingFrame() {
|
void AP_WS_Connection::ProcessIncomingFrame() {
|
||||||
Poco::Buffer<char> CurrentFrame(0);
|
Poco::Buffer<char> IncomingFrame(0);
|
||||||
bool KillConnection = false;
|
|
||||||
int flags = 0;
|
|
||||||
int IncomingSize = 0;
|
|
||||||
|
|
||||||
|
bool KillConnection=false;
|
||||||
try {
|
try {
|
||||||
IncomingSize = WS_->receiveFrame(CurrentFrame, flags);
|
int Op, flags;
|
||||||
int Op;
|
auto IncomingSize = WS_->receiveFrame(IncomingFrame, flags);
|
||||||
|
|
||||||
Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
||||||
|
|
||||||
if (IncomingSize < 0 && flags == 0) {
|
if (IncomingSize == 0 && flags == 0 && Op == 0) {
|
||||||
poco_trace(Logger_,
|
|
||||||
fmt::format("EMPTY({}): Non-blocking try-again empty frame (len={}, flags={})",
|
|
||||||
CId_, IncomingSize, flags));
|
|
||||||
} else if (IncomingSize == 0 && flags == 0) {
|
|
||||||
poco_information(Logger_,
|
poco_information(Logger_,
|
||||||
fmt::format("DISCONNECT({}): device has disconnected. Session={}",
|
fmt::format("DISCONNECT({}): device has disconnected. Session={}",
|
||||||
CId_, State_.sessionId));
|
CId_, State_.sessionId));
|
||||||
return EndConnection();
|
return EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IncomingSize > 0) {
|
IncomingFrame.append(0);
|
||||||
State_.RX += IncomingSize;
|
|
||||||
AP_WS_Server()->AddRX(IncomingSize);
|
State_.RX += IncomingSize;
|
||||||
IncomingFrame_.append(CurrentFrame);
|
AP_WS_Server()->AddRX(IncomingSize);
|
||||||
}
|
|
||||||
State_.MessageCount++;
|
State_.MessageCount++;
|
||||||
State_.LastContact = Utils::Now();
|
State_.LastContact = Utils::Now();
|
||||||
poco_trace(Logger_,
|
|
||||||
fmt::format("FRAME({}): Frame rx (op={} len={}, flags={}, acc.len={})",
|
|
||||||
CId_, Op, IncomingSize, flags, IncomingFrame_.size()));
|
|
||||||
|
|
||||||
switch (Op) {
|
switch (Op) {
|
||||||
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
||||||
poco_trace(Logger_, fmt::format("PING({}): received. PONG sent back.", CId_));
|
poco_trace(Logger_, fmt::format("WS-PING({}): received. PONG sent back.", CId_));
|
||||||
WS_->sendFrame("", 0,
|
WS_->sendFrame("", 0,
|
||||||
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
||||||
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
||||||
|
|
||||||
if (KafkaManager()->Enabled()) {
|
if (KafkaManager()->Enabled()) {
|
||||||
Poco::JSON::Object PingObject;
|
Poco::JSON::Object PingObject;
|
||||||
@@ -704,32 +642,49 @@ namespace OpenWifi {
|
|||||||
PingDetails.set("locale", State_.locale);
|
PingDetails.set("locale", State_.locale);
|
||||||
PingObject.set(uCentralProtocol::PING, PingDetails);
|
PingObject.set(uCentralProtocol::PING, PingDetails);
|
||||||
poco_trace(Logger_,fmt::format("Sending PING for {}", SerialNumber_));
|
poco_trace(Logger_,fmt::format("Sending PING for {}", SerialNumber_));
|
||||||
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_,
|
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_,PingObject);
|
||||||
PingObject);
|
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_PONG: {
|
case Poco::Net::WebSocket::FRAME_OP_PONG: {
|
||||||
poco_trace(Logger_, fmt::format("PONG({}): received and ignored.", CId_));
|
poco_trace(Logger_, fmt::format("PONG({}): received and ignored.", CId_));
|
||||||
return;
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_CONT: {
|
|
||||||
poco_trace(Logger_, fmt::format("CONTINUATION({}): registered.", CId_));
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_BINARY: {
|
|
||||||
poco_trace(Logger_, fmt::format("BINARY({}): Invalid frame type.", CId_));
|
|
||||||
KillConnection=true;
|
|
||||||
return;
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
||||||
poco_trace(Logger_,
|
poco_trace(Logger_,
|
||||||
fmt::format("TEXT({}): Frame received (len={}, flags={}). Msg={}",
|
fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
|
||||||
CId_, IncomingSize, flags,
|
CId_, IncomingSize, flags, IncomingFrame.begin()));
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin()));
|
|
||||||
|
Poco::JSON::Parser parser;
|
||||||
|
auto ParsedMessage = parser.parse(IncomingFrame.begin());
|
||||||
|
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
|
||||||
|
|
||||||
|
if (IncomingJSON->has(uCentralProtocol::JSONRPC)) {
|
||||||
|
if (IncomingJSON->has(uCentralProtocol::METHOD) &&
|
||||||
|
IncomingJSON->has(uCentralProtocol::PARAMS)) {
|
||||||
|
ProcessJSONRPCEvent(IncomingJSON);
|
||||||
|
} else if (IncomingJSON->has(uCentralProtocol::RESULT) &&
|
||||||
|
IncomingJSON->has(uCentralProtocol::ID)) {
|
||||||
|
poco_trace(Logger_, fmt::format("RPC-RESULT({}): payload: {}", CId_,
|
||||||
|
IncomingFrame.begin()));
|
||||||
|
ProcessJSONRPCResult(IncomingJSON);
|
||||||
|
} else {
|
||||||
|
poco_warning(
|
||||||
|
Logger_,
|
||||||
|
fmt::format("INVALID-PAYLOAD({}): Payload is not JSON-RPC 2.0: {}",
|
||||||
|
CId_, IncomingFrame.begin()));
|
||||||
|
}
|
||||||
|
} else if (IncomingJSON->has(uCentralProtocol::RADIUS)) {
|
||||||
|
ProcessIncomingRadiusData(IncomingJSON);
|
||||||
|
} else {
|
||||||
|
std::ostringstream iS;
|
||||||
|
IncomingJSON->stringify(iS);
|
||||||
|
poco_warning(
|
||||||
|
Logger_,
|
||||||
|
fmt::format("FRAME({}): illegal transaction header, missing 'jsonrpc': {}",
|
||||||
|
CId_, iS.str()));
|
||||||
|
Errors_++;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
|
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
|
||||||
@@ -745,31 +700,25 @@ namespace OpenWifi {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for final frame and process accumulated payload
|
|
||||||
if (!KillConnection && (flags & Poco::Net::WebSocket::FRAME_FLAG_FIN) != 0) {
|
|
||||||
ProcessWSFinalPayload();
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (const Poco::Net::ConnectionResetException &E) {
|
} catch (const Poco::Net::ConnectionResetException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("ConnectionResetException({}): Text:{} Payload:{} Session:{}",
|
fmt::format("ConnectionResetException({}): Text:{} Payload:{} Session:{}",
|
||||||
CId_, E.displayText(),
|
CId_, E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::JSON::JSONException &E) {
|
} catch (const Poco::JSON::JSONException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("JSONException({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("JSONException({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.displayText(),
|
E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::Net::WebSocketException &E) {
|
} catch (const Poco::Net::WebSocketException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("WebSocketException({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("WebSocketException({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.displayText(),
|
E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::Net::SSLConnectionUnexpectedlyClosedException &E) {
|
} catch (const Poco::Net::SSLConnectionUnexpectedlyClosedException &E) {
|
||||||
@@ -778,42 +727,42 @@ namespace OpenWifi {
|
|||||||
fmt::format(
|
fmt::format(
|
||||||
"SSLConnectionUnexpectedlyClosedException({}): Text:{} Payload:{} Session:{}",
|
"SSLConnectionUnexpectedlyClosedException({}): Text:{} Payload:{} Session:{}",
|
||||||
CId_, E.displayText(),
|
CId_, E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::Net::SSLException &E) {
|
} catch (const Poco::Net::SSLException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("SSLException({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("SSLException({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.displayText(),
|
E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::Net::NetException &E) {
|
} catch (const Poco::Net::NetException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("NetException({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("NetException({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.displayText(),
|
E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::IOException &E) {
|
} catch (const Poco::IOException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("IOException({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("IOException({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.displayText(),
|
E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("Exception({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("Exception({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.displayText(),
|
E.displayText(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (const std::exception &E) {
|
} catch (const std::exception &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
fmt::format("std::exception({}): Text:{} Payload:{} Session:{}", CId_,
|
fmt::format("std::exception({}): Text:{} Payload:{} Session:{}", CId_,
|
||||||
E.what(),
|
E.what(),
|
||||||
CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(),
|
IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(),
|
||||||
State_.sessionId));
|
State_.sessionId));
|
||||||
KillConnection=true;
|
KillConnection=true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
@@ -826,9 +775,7 @@ namespace OpenWifi {
|
|||||||
if (!KillConnection && Errors_ < 10)
|
if (!KillConnection && Errors_ < 10)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_, fmt::format("DISCONNECTING({}): ConnectionException: {} Errors: {}", CId_, KillConnection, Errors_ ));
|
||||||
fmt::format("DISCONNECTING({}): ConnectionException: {} Errors: {}",
|
|
||||||
CId_, KillConnection, Errors_ ));
|
|
||||||
EndConnection();
|
EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -973,4 +920,4 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
class AP_WS_Connection {
|
class AP_WS_Connection {
|
||||||
static constexpr int BufSize = 512000;
|
static constexpr int BufSize = 256000;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AP_WS_Connection(Poco::Net::HTTPServerRequest &request,
|
explicit AP_WS_Connection(Poco::Net::HTTPServerRequest &request,
|
||||||
@@ -33,7 +33,6 @@ namespace OpenWifi {
|
|||||||
void EndConnection();
|
void EndConnection();
|
||||||
void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc);
|
void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc);
|
||||||
void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc);
|
void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc);
|
||||||
void ProcessWSFinalPayload();
|
|
||||||
void ProcessIncomingFrame();
|
void ProcessIncomingFrame();
|
||||||
void ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc);
|
void ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc);
|
||||||
|
|
||||||
@@ -146,7 +145,6 @@ namespace OpenWifi {
|
|||||||
std::uint64_t uuid_=0;
|
std::uint64_t uuid_=0;
|
||||||
bool Simulated_=false;
|
bool Simulated_=false;
|
||||||
std::atomic_uint64_t LastContact_=0;
|
std::atomic_uint64_t LastContact_=0;
|
||||||
Poco::Buffer<char> IncomingFrame_;
|
|
||||||
|
|
||||||
static inline std::atomic_uint64_t ConcurrentStartingDevices_ = 0;
|
static inline std::atomic_uint64_t ConcurrentStartingDevices_ = 0;
|
||||||
|
|
||||||
@@ -177,4 +175,4 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -105,7 +105,7 @@ namespace OpenWifi {
|
|||||||
Restrictions_.developer = Capabilities->getValue<bool>("developer");
|
Restrictions_.developer = Capabilities->getValue<bool>("developer");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Capabilities->has("secure-rtty")) {
|
if(Capabilities->has("secure-rtty")) {
|
||||||
RTTYMustBeSecure_ = Capabilities->getValue<bool>("secure-rtty");
|
RTTYMustBeSecure_ = Capabilities->getValue<bool>("secure-rtty");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ namespace OpenWifi {
|
|||||||
P.verificationDepth = 9;
|
P.verificationDepth = 9;
|
||||||
P.loadDefaultCAs = Svr.RootCA().empty();
|
P.loadDefaultCAs = Svr.RootCA().empty();
|
||||||
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
|
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
|
||||||
|
P.dhUse2048Bits = true;
|
||||||
P.caLocation = Svr.Cas();
|
P.caLocation = Svr.Cas();
|
||||||
|
|
||||||
auto Context = Poco::AutoPtr<Poco::Net::Context>(
|
auto Context = Poco::AutoPtr<Poco::Net::Context>(
|
||||||
@@ -794,4 +795,4 @@ namespace OpenWifi {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -315,4 +315,4 @@ namespace OpenWifi {
|
|||||||
poco_notice(Logger(), "Stopped...");
|
poco_notice(Logger(), "Stopped...");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -91,31 +91,6 @@ namespace OpenWifi {
|
|||||||
TransactionId_, UUID, RPC, Poco::Thread::current()->id()));
|
TransactionId_, UUID, RPC, Poco::Thread::current()->id()));
|
||||||
return Rtty(UUID, RPC, 60000ms, Restrictions);
|
return Rtty(UUID, RPC, 60000ms, Restrictions);
|
||||||
};
|
};
|
||||||
case APCommands::Commands::package:{
|
|
||||||
GWObjects::DeviceRestrictions Restrictions;
|
|
||||||
std::string pkg_name = "";
|
|
||||||
if (!AP_WS_Server()->Connected(SerialNumberInt_, Restrictions)) {
|
|
||||||
CallCanceled(Command_.c_str(), RESTAPI::Errors::DeviceNotConnected);
|
|
||||||
return BadRequest(RESTAPI::Errors::DeviceNotConnected);
|
|
||||||
}
|
|
||||||
Poco::URI uri(Request->getURI());
|
|
||||||
for (const auto ¶m : uri.getQueryParameters()) {
|
|
||||||
if (param.first == "pkgName") {
|
|
||||||
pkg_name = param.second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pkg_name.empty()) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
auto UUID = MicroServiceCreateUUID();
|
|
||||||
auto RPC = CommandManager()->Next_RPC_ID();
|
|
||||||
poco_debug(
|
|
||||||
Logger_,
|
|
||||||
fmt::format(
|
|
||||||
"Command Package TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}",
|
|
||||||
TransactionId_, UUID, RPC, Poco::Thread::current()->id()));
|
|
||||||
return GetPackages(UUID, RPC, pkg_name, 300000ms, Restrictions);
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return BadRequest(RESTAPI::Errors::InvalidCommand);
|
return BadRequest(RESTAPI::Errors::InvalidCommand);
|
||||||
}
|
}
|
||||||
@@ -153,21 +128,6 @@ namespace OpenWifi {
|
|||||||
return DeleteChecks();
|
return DeleteChecks();
|
||||||
case APCommands::Commands::statistics:
|
case APCommands::Commands::statistics:
|
||||||
return DeleteStatistics();
|
return DeleteStatistics();
|
||||||
case APCommands::Commands::package: {
|
|
||||||
GWObjects::DeviceRestrictions Restrictions;
|
|
||||||
if (!AP_WS_Server()->Connected(SerialNumberInt_, Restrictions)) {
|
|
||||||
CallCanceled(Command_.c_str(), RESTAPI::Errors::DeviceNotConnected);
|
|
||||||
return BadRequest(RESTAPI::Errors::DeviceNotConnected);
|
|
||||||
}
|
|
||||||
auto UUID = MicroServiceCreateUUID();
|
|
||||||
auto RPC = CommandManager()->Next_RPC_ID();
|
|
||||||
poco_debug(
|
|
||||||
Logger_,
|
|
||||||
fmt::format(
|
|
||||||
"Command RTTY TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}",
|
|
||||||
TransactionId_, UUID, RPC, Poco::Thread::current()->id()));
|
|
||||||
return DeletePackages(UUID, RPC, 300000ms, Restrictions);
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return BadRequest(RESTAPI::Errors::InvalidCommand);
|
return BadRequest(RESTAPI::Errors::InvalidCommand);
|
||||||
}
|
}
|
||||||
@@ -210,8 +170,7 @@ namespace OpenWifi {
|
|||||||
{APCommands::Commands::powercycle, false, true, &RESTAPI_device_commandHandler::PowerCycle, 60000ms},
|
{APCommands::Commands::powercycle, false, true, &RESTAPI_device_commandHandler::PowerCycle, 60000ms},
|
||||||
{APCommands::Commands::fixedconfig, false, true, &RESTAPI_device_commandHandler::FixedConfig, 120000ms},
|
{APCommands::Commands::fixedconfig, false, true, &RESTAPI_device_commandHandler::FixedConfig, 120000ms},
|
||||||
{APCommands::Commands::cablediagnostics, false, true, &RESTAPI_device_commandHandler::CableDiagnostics, 120000ms},
|
{APCommands::Commands::cablediagnostics, false, true, &RESTAPI_device_commandHandler::CableDiagnostics, 120000ms},
|
||||||
{APCommands::Commands::reenroll, false, true, &RESTAPI_device_commandHandler::ReEnroll, 120000ms},
|
|
||||||
{APCommands::Commands::package, false, true, &RESTAPI_device_commandHandler::PackageInstall, 120000ms},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::DoPost() {
|
void RESTAPI_device_commandHandler::DoPost() {
|
||||||
@@ -449,210 +408,6 @@ namespace OpenWifi {
|
|||||||
BadRequest(RESTAPI::Errors::NoRecordsDeleted);
|
BadRequest(RESTAPI::Errors::NoRecordsDeleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::GetPackages(const std::string &CMD_UUID, uint64_t CMD_RPC,
|
|
||||||
const std::string pkg_name,
|
|
||||||
[[maybe_unused]] std::chrono::milliseconds timeout,
|
|
||||||
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
|
||||||
poco_debug(Logger_, fmt::format("GET-PACKAGES: TID={}, user={} serial={}. thr_id={}",
|
|
||||||
TransactionId_, Requester(), SerialNumber_,
|
|
||||||
Poco::Thread::current()->id()));
|
|
||||||
|
|
||||||
if (IsDeviceSimulated(SerialNumber_)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::JSON::Object Params;
|
|
||||||
Params.set(uCentralProtocol::OPERATION, "list");
|
|
||||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
|
||||||
Params.set(uCentralProtocol::PACKAGE, pkg_name);
|
|
||||||
|
|
||||||
std::stringstream ParamStream;
|
|
||||||
Params.stringify(ParamStream);
|
|
||||||
|
|
||||||
GWObjects::CommandDetails Cmd;
|
|
||||||
Cmd.SerialNumber = SerialNumber_;
|
|
||||||
Cmd.UUID = CMD_UUID;
|
|
||||||
Cmd.SubmittedBy = Requester();
|
|
||||||
Cmd.Command = uCentralProtocol::PACKAGE;
|
|
||||||
Cmd.RunAt = 0;
|
|
||||||
Cmd.Details = ParamStream.str();
|
|
||||||
|
|
||||||
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::package, false, Cmd, Params,
|
|
||||||
*Request, *Response, timeout, nullptr, nullptr, Logger_);
|
|
||||||
|
|
||||||
Poco::JSON::Object O, P;
|
|
||||||
Cmd.to_json(O);
|
|
||||||
|
|
||||||
Poco::Dynamic::Var resultsVar = O.get("results");
|
|
||||||
Poco::JSON::Object::Ptr resultsObj = resultsVar.extract<Poco::JSON::Object::Ptr>();
|
|
||||||
|
|
||||||
return ReturnObject(*resultsObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::PackageInstall(
|
|
||||||
const std::string &CMD_UUID, uint64_t CMD_RPC,
|
|
||||||
[[maybe_unused]] std::chrono::milliseconds timeout,
|
|
||||||
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
|
||||||
|
|
||||||
if (UserInfo_.userinfo.userRole != SecurityObjects::ROOT &&
|
|
||||||
UserInfo_.userinfo.userRole != SecurityObjects::ADMIN) {
|
|
||||||
CallCanceled("INSTALLPACKAGE", CMD_UUID, CMD_RPC, RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
}
|
|
||||||
|
|
||||||
poco_debug(Logger_, fmt::format("INSTALL-PACKAGES({},{}): TID={} user={} serial={}", CMD_UUID,
|
|
||||||
CMD_RPC, TransactionId_, Requester(), SerialNumber_));
|
|
||||||
|
|
||||||
if (IsDeviceSimulated(SerialNumber_)) {
|
|
||||||
CallCanceled("INSTALL-PACKAGES", CMD_UUID, CMD_RPC, RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
return BadRequest(RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto &Obj = ParsedBody_;
|
|
||||||
if (!Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
|
||||||
if (SerialNumber_ != SNum) {
|
|
||||||
CallCanceled("INSTALL-PACKAGES", CMD_UUID, CMD_RPC, RESTAPI::Errors::SerialNumberMismatch);
|
|
||||||
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostringstream os;
|
|
||||||
ParsedBody_->stringify(os);
|
|
||||||
|
|
||||||
poco_information(Logger_, fmt::format("INSTALL_OBJECT: {} for device {}", os.str(), SerialNumber_));
|
|
||||||
|
|
||||||
GWObjects::PackageInstall PI;
|
|
||||||
if (!PI.from_json(ParsedBody_)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::JSON::Array::Ptr ArrayObj = Poco::SharedPtr<Poco::JSON::Array>(new Poco::JSON::Array);
|
|
||||||
for (const auto &i : PI.pkgs) {
|
|
||||||
Poco::JSON::Object::Ptr Obj =
|
|
||||||
Poco::SharedPtr<Poco::JSON::Object>(new Poco::JSON::Object);
|
|
||||||
i.to_json(*Obj);
|
|
||||||
ArrayObj->add(Obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::JSON::Object Params;
|
|
||||||
Params.set(uCentralProtocol::OPERATION, "install");
|
|
||||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
|
||||||
Params.set(uCentralProtocol::PACKAGES, ArrayObj);
|
|
||||||
|
|
||||||
std::ostringstream os2;
|
|
||||||
Params.stringify(os2);
|
|
||||||
|
|
||||||
poco_information(Logger_, fmt::format("INSTALL_OBJECT2: {} for device {}", os2.str(), SerialNumber_));
|
|
||||||
|
|
||||||
|
|
||||||
std::stringstream ParamStream;
|
|
||||||
Params.stringify(ParamStream);
|
|
||||||
|
|
||||||
GWObjects::CommandDetails Cmd;
|
|
||||||
Cmd.SerialNumber = SerialNumber_;
|
|
||||||
Cmd.UUID = CMD_UUID;
|
|
||||||
Cmd.SubmittedBy = Requester();
|
|
||||||
Cmd.Command = uCentralProtocol::PACKAGE;
|
|
||||||
Cmd.RunAt = 0;
|
|
||||||
Cmd.Details = ParamStream.str();
|
|
||||||
|
|
||||||
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::package, false, Cmd, Params,
|
|
||||||
*Request, *Response, timeout, nullptr, nullptr, Logger_);
|
|
||||||
|
|
||||||
Poco::JSON::Object O, P;
|
|
||||||
Cmd.to_json(O);
|
|
||||||
|
|
||||||
Poco::Dynamic::Var resultsVar = O.get("results");
|
|
||||||
Poco::JSON::Object::Ptr resultsObj = resultsVar.extract<Poco::JSON::Object::Ptr>();
|
|
||||||
|
|
||||||
return ReturnObject(*resultsObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::DeletePackages(
|
|
||||||
const std::string &CMD_UUID, uint64_t CMD_RPC,
|
|
||||||
[[maybe_unused]] std::chrono::milliseconds timeout,
|
|
||||||
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
|
||||||
|
|
||||||
if (UserInfo_.userinfo.userRole != SecurityObjects::ROOT &&
|
|
||||||
UserInfo_.userinfo.userRole != SecurityObjects::ADMIN) {
|
|
||||||
CallCanceled("DELETE-PACKAGES", CMD_UUID, CMD_RPC, RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
}
|
|
||||||
|
|
||||||
poco_debug(Logger_, fmt::format("DELETE-PACKAGES({},{}): TID={} user={} serial={}", CMD_UUID,
|
|
||||||
CMD_RPC, TransactionId_, Requester(), SerialNumber_));
|
|
||||||
|
|
||||||
if (IsDeviceSimulated(SerialNumber_)) {
|
|
||||||
CallCanceled("DELETE-PACKAGES", CMD_UUID, CMD_RPC, RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
return BadRequest(RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto &Obj = ParsedBody_;
|
|
||||||
if (!Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
|
||||||
if (SerialNumber_ != SNum) {
|
|
||||||
CallCanceled("DELETE-PACKAGES", CMD_UUID, CMD_RPC, RESTAPI::Errors::SerialNumberMismatch);
|
|
||||||
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostringstream os;
|
|
||||||
ParsedBody_->stringify(os);
|
|
||||||
|
|
||||||
poco_information(Logger_, fmt::format("DELETE_OBJECT: {} for device {}", os.str(), SerialNumber_));
|
|
||||||
|
|
||||||
GWObjects::PackageRemove PR;
|
|
||||||
if (!PR.from_json(ParsedBody_)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::JSON::Array::Ptr ArrayObj = Poco::SharedPtr<Poco::JSON::Array>(new Poco::JSON::Array);
|
|
||||||
for (const auto &i : PR.pkgs) {
|
|
||||||
Poco::JSON::Object::Ptr Obj =
|
|
||||||
Poco::SharedPtr<Poco::JSON::Object>(new Poco::JSON::Object);
|
|
||||||
i.to_json(*Obj);
|
|
||||||
ArrayObj->add(Obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::JSON::Object Params;
|
|
||||||
Params.set(uCentralProtocol::OPERATION, "delete");
|
|
||||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
|
||||||
Params.set(uCentralProtocol::PACKAGES, ArrayObj);
|
|
||||||
|
|
||||||
std::ostringstream os2;
|
|
||||||
Params.stringify(os2);
|
|
||||||
|
|
||||||
poco_information(Logger_, fmt::format("DELETE_OBJECT2: {} for device {}", os2.str(), SerialNumber_));
|
|
||||||
|
|
||||||
|
|
||||||
std::stringstream ParamStream;
|
|
||||||
Params.stringify(ParamStream);
|
|
||||||
|
|
||||||
GWObjects::CommandDetails Cmd;
|
|
||||||
Cmd.SerialNumber = SerialNumber_;
|
|
||||||
Cmd.UUID = CMD_UUID;
|
|
||||||
Cmd.SubmittedBy = Requester();
|
|
||||||
Cmd.Command = uCentralProtocol::PACKAGE;
|
|
||||||
Cmd.RunAt = 0;
|
|
||||||
Cmd.Details = ParamStream.str();
|
|
||||||
|
|
||||||
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::package, false, Cmd, Params,
|
|
||||||
*Request, *Response, timeout, nullptr, nullptr, Logger_);
|
|
||||||
|
|
||||||
Poco::JSON::Object O, P;
|
|
||||||
Cmd.to_json(O);
|
|
||||||
|
|
||||||
Poco::Dynamic::Var resultsVar = O.get("results");
|
|
||||||
Poco::JSON::Object::Ptr resultsObj = resultsVar.extract<Poco::JSON::Object::Ptr>();
|
|
||||||
|
|
||||||
return ReturnObject(*resultsObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::Ping(
|
void RESTAPI_device_commandHandler::Ping(
|
||||||
const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout,
|
const std::string &CMD_UUID, uint64_t CMD_RPC, std::chrono::milliseconds timeout,
|
||||||
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
||||||
@@ -1896,45 +1651,4 @@ namespace OpenWifi {
|
|||||||
*ParsedBody_, *Request, *Response, timeout, nullptr, this,
|
*ParsedBody_, *Request, *Response, timeout, nullptr, this,
|
||||||
Logger_);
|
Logger_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::ReEnroll(
|
|
||||||
const std::string &CMD_UUID, uint64_t CMD_RPC,
|
|
||||||
[[maybe_unused]] std::chrono::milliseconds timeout,
|
|
||||||
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
|
||||||
|
|
||||||
if(UserInfo_.userinfo.userRole != SecurityObjects::ROOT &&
|
|
||||||
UserInfo_.userinfo.userRole != SecurityObjects::ADMIN) {
|
|
||||||
CallCanceled("REENROLL", CMD_UUID, CMD_RPC, RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
}
|
|
||||||
|
|
||||||
poco_debug(Logger_, fmt::format("REENROLL({},{}): TID={} user={} serial={}", CMD_UUID,
|
|
||||||
CMD_RPC, TransactionId_, Requester(), SerialNumber_));
|
|
||||||
|
|
||||||
if(IsDeviceSimulated(SerialNumber_)) {
|
|
||||||
CallCanceled("REENROLL", CMD_UUID, CMD_RPC, RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
return BadRequest(RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
GWObjects::ReEnroll PR;
|
|
||||||
if(!PR.from_json(ParsedBody_)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
GWObjects::CommandDetails Cmd;
|
|
||||||
Cmd.SerialNumber = SerialNumber_;
|
|
||||||
Cmd.SubmittedBy = Requester();
|
|
||||||
Cmd.UUID = CMD_UUID;
|
|
||||||
Cmd.Command = uCentralProtocol::REENROLL;
|
|
||||||
std::ostringstream os;
|
|
||||||
ParsedBody_->stringify(os);
|
|
||||||
Cmd.Details = os.str();
|
|
||||||
Cmd.RunAt = PR.when;
|
|
||||||
Cmd.ErrorCode = 0;
|
|
||||||
Cmd.WaitingForFile = 0;
|
|
||||||
|
|
||||||
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::reenroll, false, Cmd,
|
|
||||||
*ParsedBody_, *Request, *Response, timeout, nullptr, this,
|
|
||||||
Logger_);
|
|
||||||
}
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
|
|||||||
@@ -33,13 +33,6 @@ namespace OpenWifi {
|
|||||||
void GetStatus();
|
void GetStatus();
|
||||||
void GetChecks();
|
void GetChecks();
|
||||||
void DeleteChecks();
|
void DeleteChecks();
|
||||||
void GetPackages(const std::string &UUID, uint64_t RPC,
|
|
||||||
std::string pkg_name,
|
|
||||||
std::chrono::milliseconds timeout,
|
|
||||||
const GWObjects::DeviceRestrictions &R);
|
|
||||||
void DeletePackages(const std::string &UUID, uint64_t RPC,
|
|
||||||
std::chrono::milliseconds timeout,
|
|
||||||
const GWObjects::DeviceRestrictions &R);
|
|
||||||
|
|
||||||
bool IsDeviceSimulated(std::string &Serial);
|
bool IsDeviceSimulated(std::string &Serial);
|
||||||
|
|
||||||
@@ -81,10 +74,6 @@ namespace OpenWifi {
|
|||||||
const GWObjects::DeviceRestrictions &R);
|
const GWObjects::DeviceRestrictions &R);
|
||||||
void CableDiagnostics(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
void CableDiagnostics(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
||||||
const GWObjects::DeviceRestrictions &R);
|
const GWObjects::DeviceRestrictions &R);
|
||||||
void ReEnroll(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
|
||||||
const GWObjects::DeviceRestrictions &R);
|
|
||||||
void PackageInstall(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
|
||||||
const GWObjects::DeviceRestrictions &R);
|
|
||||||
|
|
||||||
static auto PathName() {
|
static auto PathName() {
|
||||||
return std::list<std::string>{"/api/v1/device/{serialNumber}/{command}"};
|
return std::list<std::string>{"/api/v1/device/{serialNumber}/{command}"};
|
||||||
|
|||||||
@@ -12,9 +12,9 @@
|
|||||||
#include "Daemon.h"
|
#include "Daemon.h"
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
#include "AP_WS_Server.h"
|
#include "AP_WS_Server.h"
|
||||||
|
#include "StorageService.h"
|
||||||
#include "CapabilitiesCache.h"
|
#include "CapabilitiesCache.h"
|
||||||
#include "RADIUSSessionTracker.h"
|
#include "RADIUSSessionTracker.h"
|
||||||
#include "StorageService.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "RESTAPI_GWobjects.h"
|
#include "RESTAPI_GWobjects.h"
|
||||||
@@ -31,8 +31,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "serialNumber", SerialNumber);
|
field_to_json(Obj, "serialNumber", SerialNumber);
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
field_to_json(Obj, "deviceType", StorageService()->GetPlatform(SerialNumber));
|
field_to_json(Obj, "deviceType", StorageService()->GetPlatform(SerialNumber));
|
||||||
field_to_json(Obj, "blackListed",
|
field_to_json(Obj, "blackListed", StorageService()->IsBlackListed(Utils::MACToInt(SerialNumber)));
|
||||||
StorageService()->IsBlackListed(Utils::MACToInt(SerialNumber)));
|
|
||||||
#endif
|
#endif
|
||||||
field_to_json(Obj, "macAddress", MACAddress);
|
field_to_json(Obj, "macAddress", MACAddress);
|
||||||
field_to_json(Obj, "manufacturer", Manufacturer);
|
field_to_json(Obj, "manufacturer", Manufacturer);
|
||||||
@@ -71,12 +70,12 @@ namespace OpenWifi::GWObjects {
|
|||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
ConnectionState ConState;
|
ConnectionState ConState;
|
||||||
#ifdef USE_MEDUSA_CLIENT
|
#ifdef USE_MEDUSA_CLIENT
|
||||||
auto Res = GS()->GetState(SerialNumber);
|
auto Res = GS()->GetState(SerialNumber);
|
||||||
if (Res.has_value()) {
|
if (Res.has_value()) {
|
||||||
Res.value().to_json(SerialNumber, Obj);
|
Res.value().to_json(SerialNumber,Obj);
|
||||||
#else
|
#else
|
||||||
if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
|
if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
|
||||||
ConState.to_json(SerialNumber, Obj);
|
ConState.to_json(SerialNumber,Obj);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
field_to_json(Obj, "ipAddress", "");
|
field_to_json(Obj, "ipAddress", "");
|
||||||
@@ -173,16 +172,17 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "recorded", Recorded);
|
field_to_json(Obj, "recorded", Recorded);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HealthCheck::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool HealthCheck::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "UUID", UUID);
|
field_from_json(Obj, "UUID", UUID);
|
||||||
field_from_json(Obj, "sanity", Sanity);
|
field_from_json(Obj, "sanity", Sanity);
|
||||||
field_from_json(Obj, "recorded", Recorded);
|
field_from_json(Obj, "recorded", Recorded);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch(...) {
|
||||||
}
|
|
||||||
return false;
|
}
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void DefaultFirmware::to_json(Poco::JSON::Object &Obj) const {
|
void DefaultFirmware::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "deviceType", deviceType);
|
field_to_json(Obj, "deviceType", deviceType);
|
||||||
@@ -275,8 +275,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionState::to_json([[maybe_unused]] const std::string &SerialNumber,
|
void ConnectionState::to_json([[maybe_unused]] const std::string &SerialNumber, Poco::JSON::Object &Obj) {
|
||||||
Poco::JSON::Object &Obj) {
|
|
||||||
field_to_json(Obj, "ipAddress", Address);
|
field_to_json(Obj, "ipAddress", Address);
|
||||||
field_to_json(Obj, "txBytes", TX);
|
field_to_json(Obj, "txBytes", TX);
|
||||||
field_to_json(Obj, "rxBytes", RX);
|
field_to_json(Obj, "rxBytes", RX);
|
||||||
@@ -298,15 +297,14 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
||||||
field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
|
field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
|
||||||
field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
||||||
field_to_json(Obj, "certificateIssuerName", certificateIssuerName);
|
|
||||||
field_to_json(Obj, "connectReason", connectReason);
|
field_to_json(Obj, "connectReason", connectReason);
|
||||||
field_to_json(Obj, "uptime", uptime);
|
field_to_json(Obj, "uptime", uptime);
|
||||||
field_to_json(Obj, "compatible", Compatible);
|
field_to_json(Obj, "compatible", Compatible);
|
||||||
|
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
|
hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
|
||||||
#endif
|
#endif
|
||||||
field_to_json(Obj, "hasRADIUSSessions", hasRADIUSSessions);
|
field_to_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
|
||||||
field_to_json(Obj, "hasGPS", hasGPS);
|
field_to_json(Obj, "hasGPS", hasGPS);
|
||||||
field_to_json(Obj, "sanity", sanity);
|
field_to_json(Obj, "sanity", sanity);
|
||||||
field_to_json(Obj, "memoryUsed", memoryUsed);
|
field_to_json(Obj, "memoryUsed", memoryUsed);
|
||||||
@@ -336,45 +334,44 @@ namespace OpenWifi::GWObjects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConnectionState::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ConnectionState::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "compatible", Compatible);
|
field_from_json(Obj, "compatible", Compatible);
|
||||||
field_from_json(Obj, "ipAddress", Address);
|
field_from_json(Obj, "ipAddress", Address);
|
||||||
field_from_json(Obj, "txBytes", TX);
|
field_from_json(Obj, "txBytes", TX);
|
||||||
field_from_json(Obj, "rxBytes", RX);
|
field_from_json(Obj, "rxBytes", RX);
|
||||||
field_from_json(Obj, "messageCount", MessageCount);
|
field_from_json(Obj, "messageCount", MessageCount);
|
||||||
field_from_json(Obj, "UUID", UUID);
|
field_from_json(Obj, "UUID", UUID);
|
||||||
field_from_json(Obj, "connected", Connected);
|
field_from_json(Obj, "connected", Connected);
|
||||||
field_from_json(Obj, "firmware", Firmware);
|
field_from_json(Obj, "firmware", Firmware);
|
||||||
field_from_json(Obj, "lastContact", LastContact);
|
field_from_json(Obj, "lastContact", LastContact);
|
||||||
field_from_json(Obj, "associations_2G", Associations_2G);
|
field_from_json(Obj, "associations_2G", Associations_2G);
|
||||||
field_from_json(Obj, "associations_5G", Associations_5G);
|
field_from_json(Obj, "associations_5G", Associations_5G);
|
||||||
field_from_json(Obj, "associations_6G", Associations_6G);
|
field_from_json(Obj, "associations_6G", Associations_6G);
|
||||||
field_from_json(Obj, "webSocketClients", webSocketClients);
|
field_from_json(Obj, "webSocketClients", webSocketClients);
|
||||||
field_from_json(Obj, "websocketPackets", websocketPackets);
|
field_from_json(Obj, "websocketPackets", websocketPackets);
|
||||||
field_from_json(Obj, "kafkaClients", kafkaClients);
|
field_from_json(Obj, "kafkaClients", kafkaClients);
|
||||||
field_from_json(Obj, "kafkaPackets", kafkaPackets);
|
field_from_json(Obj, "kafkaPackets", kafkaPackets);
|
||||||
field_from_json(Obj, "locale", locale);
|
field_from_json(Obj, "locale", locale);
|
||||||
field_from_json(Obj, "started", started);
|
field_from_json(Obj, "started", started);
|
||||||
field_from_json(Obj, "sessionId", sessionId);
|
field_from_json(Obj, "sessionId", sessionId);
|
||||||
field_from_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
field_from_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
||||||
field_from_json(Obj, "totalConnectionTime", totalConnectionTime);
|
field_from_json(Obj, "totalConnectionTime", totalConnectionTime);
|
||||||
field_from_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
field_from_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
||||||
field_from_json(Obj, "certificateIssuerName", certificateIssuerName);
|
field_from_json(Obj, "connectReason", connectReason);
|
||||||
field_from_json(Obj, "connectReason", connectReason);
|
field_from_json(Obj, "uptime", uptime);
|
||||||
field_from_json(Obj, "uptime", uptime);
|
field_from_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
|
||||||
field_from_json(Obj, "hasRADIUSSessions", hasRADIUSSessions);
|
field_from_json(Obj, "hasGPS", hasGPS);
|
||||||
field_from_json(Obj, "hasGPS", hasGPS);
|
field_from_json(Obj, "sanity", sanity);
|
||||||
field_from_json(Obj, "sanity", sanity);
|
field_from_json(Obj, "memoryUsed", memoryUsed);
|
||||||
field_from_json(Obj, "memoryUsed", memoryUsed);
|
field_from_json(Obj, "sanity", sanity);
|
||||||
field_from_json(Obj, "sanity", sanity);
|
field_from_json(Obj, "load", load);
|
||||||
field_from_json(Obj, "load", load);
|
field_from_json(Obj, "temperature", temperature);
|
||||||
field_from_json(Obj, "temperature", temperature);
|
return true;
|
||||||
return true;
|
} catch(const Poco::Exception &E) {
|
||||||
} catch (const Poco::Exception &E) {
|
}
|
||||||
}
|
return false;
|
||||||
return false;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceConnectionStatistics::to_json(Poco::JSON::Object &Obj) const {
|
void DeviceConnectionStatistics::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "averageConnectionTime", averageConnectionTime);
|
field_to_json(Obj, "averageConnectionTime", averageConnectionTime);
|
||||||
@@ -822,103 +819,4 @@ namespace OpenWifi::GWObjects {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReEnroll::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "serial", serialNumber);
|
|
||||||
field_from_json(Obj, "when", when);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PackageInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
field_from_json(Obj, "version", version);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PackageInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "name", name);
|
|
||||||
field_to_json(Obj, "version", version);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PackageList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
Obj.set("serialNumber", serialNumber);
|
|
||||||
|
|
||||||
Poco::JSON::Array packageJsonArray;
|
|
||||||
for (const auto &pkg : packageArray) {
|
|
||||||
Poco::JSON::Object pkgObj;
|
|
||||||
pkg.to_json(pkgObj);
|
|
||||||
packageJsonArray.add(pkgObj);
|
|
||||||
}
|
|
||||||
Obj.set("packageArray", packageJsonArray);
|
|
||||||
|
|
||||||
Obj.set("FirstUpdate", Poco::UInt64(FirstUpdate));
|
|
||||||
Obj.set("LastUpdate", Poco::UInt64(LastUpdate));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ToBeInstalled::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
field_from_json(Obj, "url", url);
|
|
||||||
|
|
||||||
Poco::URI uri(url);
|
|
||||||
std::string scheme = uri.getScheme();
|
|
||||||
if (scheme != "http" && scheme != "https") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToBeInstalled::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
Obj.set("name", name);
|
|
||||||
Obj.set("url", url);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PackageInstall::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "serialNumber", serialNumber);
|
|
||||||
field_from_json(Obj, "when", when);
|
|
||||||
field_from_json(Obj, "packages", pkgs);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ToBeRemoved::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToBeRemoved::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
Obj.set("name", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PackageRemove::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "serialNumber", serialNumber);
|
|
||||||
field_from_json(Obj, "packages", pkgs);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} // namespace OpenWifi::GWObjects
|
} // namespace OpenWifi::GWObjects
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
uint64_t sessionId = 0;
|
uint64_t sessionId = 0;
|
||||||
double connectionCompletionTime = 0.0;
|
double connectionCompletionTime = 0.0;
|
||||||
std::uint64_t certificateExpiryDate = 0;
|
std::uint64_t certificateExpiryDate = 0;
|
||||||
std::string certificateIssuerName;
|
|
||||||
std::uint64_t hasRADIUSSessions = 0;
|
std::uint64_t hasRADIUSSessions = 0;
|
||||||
bool hasGPS = false;
|
bool hasGPS = false;
|
||||||
std::uint64_t sanity=0;
|
std::uint64_t sanity=0;
|
||||||
@@ -546,57 +545,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::uint64_t when;
|
std::uint64_t when;
|
||||||
std::vector<std::string> ports;
|
std::vector<std::string> ports;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
struct ReEnroll {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::uint64_t when;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
struct PackageInfo {
|
|
||||||
std::string name;
|
|
||||||
std::string version;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
struct PackageList {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::vector<PackageInfo> packageArray;
|
|
||||||
uint64_t FirstUpdate = 0;
|
|
||||||
uint64_t LastUpdate = 0;
|
|
||||||
std::string packageStringArray;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Array::Ptr &Obj);
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
struct ToBeInstalled {
|
|
||||||
std::string name;
|
|
||||||
std::string url;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
struct PackageInstall {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::uint64_t when;
|
|
||||||
std::vector<ToBeInstalled> pkgs;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
struct ToBeRemoved {
|
|
||||||
std::string name;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
struct PackageRemove {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::uint64_t when;
|
|
||||||
std::vector<ToBeRemoved> pkgs;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
} // namespace OpenWifi::GWObjects
|
} // namespace OpenWifi::GWObjects
|
||||||
|
|||||||
@@ -120,16 +120,14 @@ namespace OpenWifi {
|
|||||||
Poco::Buffer<char> IncomingFrame(0);
|
Poco::Buffer<char> IncomingFrame(0);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
int Op, flags, IncomingSize;
|
int Op, flags;
|
||||||
|
int IncomingSize;
|
||||||
IncomingSize = WS_->receiveFrame(IncomingFrame, flags);
|
IncomingSize = WS_->receiveFrame(IncomingFrame, flags);
|
||||||
Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
||||||
|
|
||||||
if (IncomingSize == -1) {
|
if (IncomingSize == 0 && flags == 0 && Op == 0) {
|
||||||
poco_trace(Logger(),
|
poco_information(
|
||||||
fmt::format("TELEMETRY-EMPTY({}): Empty frame, non-blocking try-again.", CId_));
|
Logger(),
|
||||||
} else if (IncomingSize == 0 && flags == 0 && Op == 0) {
|
|
||||||
poco_information(Logger(),
|
|
||||||
fmt::format("TELEMETRY-DISCONNECT({}): device has disconnected.", CId_));
|
fmt::format("TELEMETRY-DISCONNECT({}): device has disconnected.", CId_));
|
||||||
MustDisconnect = true;
|
MustDisconnect = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -138,14 +136,12 @@ namespace OpenWifi {
|
|||||||
fmt::format("TELEMETRY-WS-PING({}): received. PONG sent back.", CId_));
|
fmt::format("TELEMETRY-WS-PING({}): received. PONG sent back.", CId_));
|
||||||
WS_->sendFrame("", 0,
|
WS_->sendFrame("", 0,
|
||||||
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
||||||
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
||||||
} else if (Op == Poco::Net::WebSocket::FRAME_OP_CLOSE) {
|
} else if (Op == Poco::Net::WebSocket::FRAME_OP_CLOSE) {
|
||||||
poco_information(Logger(),
|
poco_information(
|
||||||
|
Logger(),
|
||||||
fmt::format("TELEMETRY-DISCONNECT({}): device wants to disconnect.", CId_));
|
fmt::format("TELEMETRY-DISCONNECT({}): device wants to disconnect.", CId_));
|
||||||
MustDisconnect = true;
|
MustDisconnect = true;
|
||||||
} else if (Op == Poco::Net::WebSocket::FRAME_OP_CONT) {
|
|
||||||
poco_information(Logger(),
|
|
||||||
fmt::format("TELEMETRY-CONT({}): rx {} bytes.", CId_, IncomingSize));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
@@ -158,4 +154,4 @@ namespace OpenWifi {
|
|||||||
SendTelemetryShutdown();
|
SendTelemetryShutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -276,8 +276,7 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"sae-mixed",
|
"sae-mixed",
|
||||||
"wpa3",
|
"wpa3",
|
||||||
"wpa3-192",
|
"wpa3-192",
|
||||||
"wpa3-mixed",
|
"wpa3-mixed"
|
||||||
"mpsk-radius"
|
|
||||||
],
|
],
|
||||||
"examples": [
|
"examples": [
|
||||||
"psk2"
|
"psk2"
|
||||||
@@ -553,8 +552,7 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"5G",
|
"5G",
|
||||||
"5G-lower",
|
"5G-lower",
|
||||||
"5G-upper",
|
"5G-upper",
|
||||||
"6G",
|
"6G"
|
||||||
"HaLow"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"bandwidth": {
|
"bandwidth": {
|
||||||
@@ -627,10 +625,6 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
],
|
],
|
||||||
"default": 80
|
"default": 80
|
||||||
},
|
},
|
||||||
"enable": {
|
|
||||||
"description": "Specifies radio is enabled/disabled.",
|
|
||||||
"type": "boolean"
|
|
||||||
},
|
|
||||||
"require-mode": {
|
"require-mode": {
|
||||||
"description": "Stations that do no fulfill these HT modes will be rejected.",
|
"description": "Stations that do no fulfill these HT modes will be rejected.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@@ -2315,8 +2309,7 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"5G",
|
"5G",
|
||||||
"5G-lower",
|
"5G-lower",
|
||||||
"5G-upper",
|
"5G-upper",
|
||||||
"6G",
|
"6G"
|
||||||
"HaLow"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2420,11 +2413,6 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"encryption": {
|
"encryption": {
|
||||||
"$ref": "#/$defs/interface.ssid.encryption"
|
"$ref": "#/$defs/interface.ssid.encryption"
|
||||||
},
|
},
|
||||||
"enhanced-mpsk": {
|
|
||||||
"description": "Optionally disable MPSK",
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true
|
|
||||||
},
|
|
||||||
"multi-psk": {
|
"multi-psk": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
@@ -3754,8 +3742,7 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"5G",
|
"5G",
|
||||||
"5G-lower",
|
"5G-lower",
|
||||||
"5G-upper",
|
"5G-upper",
|
||||||
"6G",
|
"6G"
|
||||||
"HaLow"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -3965,10 +3952,8 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"inactive-deauth",
|
"inactive-deauth",
|
||||||
"key-mismatch",
|
"key-mismatch",
|
||||||
"beacon-report",
|
"beacon-report",
|
||||||
"radar-detected",
|
"radar-detected"
|
||||||
"ft-finish",
|
]
|
||||||
"sta-authorized"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4456,8 +4441,7 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"sae-mixed",
|
"sae-mixed",
|
||||||
"wpa3",
|
"wpa3",
|
||||||
"wpa3-192",
|
"wpa3-192",
|
||||||
"wpa3-mixed",
|
"wpa3-mixed"
|
||||||
"mpsk-radius"
|
|
||||||
],
|
],
|
||||||
"examples": [
|
"examples": [
|
||||||
"psk2"
|
"psk2"
|
||||||
@@ -4906,8 +4890,7 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"5G",
|
"5G",
|
||||||
"5G-lower",
|
"5G-lower",
|
||||||
"5G-upper",
|
"5G-upper",
|
||||||
"6G",
|
"6G"
|
||||||
"HaLow"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"bandwidth": {
|
"bandwidth": {
|
||||||
@@ -4973,10 +4956,6 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
],
|
],
|
||||||
"default": 80
|
"default": 80
|
||||||
},
|
},
|
||||||
"enable": {
|
|
||||||
"description": "Specifies radio is enabled/disabled.",
|
|
||||||
"type": "boolean"
|
|
||||||
},
|
|
||||||
"require-mode": {
|
"require-mode": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
@@ -6549,8 +6528,7 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"5G",
|
"5G",
|
||||||
"5G-lower",
|
"5G-lower",
|
||||||
"5G-upper",
|
"5G-upper",
|
||||||
"6G",
|
"6G"
|
||||||
"HaLow"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -6640,11 +6618,6 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"encryption": {
|
"encryption": {
|
||||||
"$ref": "#/$defs/interface.ssid.encryption"
|
"$ref": "#/$defs/interface.ssid.encryption"
|
||||||
},
|
},
|
||||||
"enhanced-mpsk": {
|
|
||||||
"description": "Optionally disable MPSK",
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true
|
|
||||||
},
|
|
||||||
"multi-psk": {
|
"multi-psk": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
@@ -7778,8 +7751,7 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"5G",
|
"5G",
|
||||||
"5G-lower",
|
"5G-lower",
|
||||||
"5G-upper",
|
"5G-upper",
|
||||||
"6G",
|
"6G"
|
||||||
"HaLow"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -7948,9 +7920,7 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"inactive-deauth",
|
"inactive-deauth",
|
||||||
"key-mismatch",
|
"key-mismatch",
|
||||||
"beacon-report",
|
"beacon-report",
|
||||||
"radar-detected",
|
"radar-detected"
|
||||||
"ft-finish",
|
|
||||||
"sta-authorized"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -845,4 +845,4 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -14,7 +14,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <optional>
|
|
||||||
|
|
||||||
// This must be defined for poco_debug and poco_trace macros to function.
|
// This must be defined for poco_debug and poco_trace macros to function.
|
||||||
|
|
||||||
@@ -41,7 +40,6 @@ namespace OpenWifi {
|
|||||||
#include "Poco/Util/OptionSet.h"
|
#include "Poco/Util/OptionSet.h"
|
||||||
#include "Poco/Util/PropertyFileConfiguration.h"
|
#include "Poco/Util/PropertyFileConfiguration.h"
|
||||||
#include "Poco/Util/ServerApplication.h"
|
#include "Poco/Util/ServerApplication.h"
|
||||||
#include "Poco/ThreadPool.h"
|
|
||||||
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <optional>
|
|
||||||
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ namespace OpenWifi {
|
|||||||
P.verificationDepth = 9;
|
P.verificationDepth = 9;
|
||||||
P.loadDefaultCAs = root_ca_.empty();
|
P.loadDefaultCAs = root_ca_.empty();
|
||||||
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
|
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
|
||||||
|
P.dhUse2048Bits = true;
|
||||||
P.caLocation = cas_;
|
P.caLocation = cas_;
|
||||||
// P.securityLevel =
|
// P.securityLevel =
|
||||||
|
|
||||||
@@ -343,4 +344,4 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -210,16 +210,10 @@ namespace OpenWifi {
|
|||||||
n = Client->second->WS_->receiveFrame(IncomingFrame, flags);
|
n = Client->second->WS_->receiveFrame(IncomingFrame, flags);
|
||||||
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
||||||
|
|
||||||
if (n == -1) {
|
|
||||||
poco_warning(Logger(),
|
|
||||||
fmt::format("UI-EMPTY({}): {} Empty Frame flags {}.",
|
|
||||||
Client->second->Id_, Client->second->UserName_, flags));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
poco_debug(Logger(),
|
poco_debug(Logger(),
|
||||||
fmt::format("CLOSE({}): {} UI Client is closing WS connection.",
|
fmt::format("CLOSE({}): {} UI Client is closing WS connection.",
|
||||||
Client->second->Id_, Client->second->UserName_));
|
Client->second->Id_, Client->second->UserName_));
|
||||||
return EndConnection(Client);
|
return EndConnection(Client);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,7 +221,7 @@ namespace OpenWifi {
|
|||||||
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
||||||
Client->second->WS_->sendFrame("", 0,
|
Client->second->WS_->sendFrame("", 0,
|
||||||
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
||||||
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
||||||
} break;
|
} break;
|
||||||
case Poco::Net::WebSocket::FRAME_OP_PONG: {
|
case Poco::Net::WebSocket::FRAME_OP_PONG: {
|
||||||
} break;
|
} break;
|
||||||
@@ -237,11 +231,6 @@ namespace OpenWifi {
|
|||||||
Client->second->Id_, Client->second->UserName_));
|
Client->second->Id_, Client->second->UserName_));
|
||||||
return EndConnection(Client);
|
return EndConnection(Client);
|
||||||
} break;
|
} break;
|
||||||
case Poco::Net::WebSocket::FRAME_OP_CONT: {
|
|
||||||
poco_warning(Logger(),
|
|
||||||
fmt::format("CONT({}): {} Unexpected CONT Frame - Ignoring.",
|
|
||||||
Client->second->Id_, Client->second->UserName_));
|
|
||||||
} break;
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
||||||
constexpr const char *DropMessagesCommand = "drop-notifications";
|
constexpr const char *DropMessagesCommand = "drop-notifications";
|
||||||
IncomingFrame.append(0);
|
IncomingFrame.append(0);
|
||||||
@@ -330,4 +319,4 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -433,10 +433,6 @@ namespace OpenWifi::RESTAPI::Errors {
|
|||||||
|
|
||||||
static const struct msg InvalidRRMAction { 1192, "Invalid RRM Action." };
|
static const struct msg InvalidRRMAction { 1192, "Invalid RRM Action." };
|
||||||
|
|
||||||
static const struct msg InvalidPackageURL { 1193, "Invalid URL, must start with http:// or https://." };
|
|
||||||
static const struct msg FailedToDownload { 1194, "Failed to download package." };
|
|
||||||
static const struct msg FailedToDecompress { 1195, "Failed to decompress package data."};
|
|
||||||
|
|
||||||
static const struct msg SimulationDoesNotExist {
|
static const struct msg SimulationDoesNotExist {
|
||||||
7000, "Simulation Instance ID does not exist."
|
7000, "Simulation Instance ID does not exist."
|
||||||
};
|
};
|
||||||
@@ -554,10 +550,6 @@ namespace OpenWifi::RESTAPI::Protocol {
|
|||||||
static const char *DEBUG = "debug";
|
static const char *DEBUG = "debug";
|
||||||
static const char *SCRIPT = "script";
|
static const char *SCRIPT = "script";
|
||||||
static const char *TIMEOUT = "timeout";
|
static const char *TIMEOUT = "timeout";
|
||||||
static const char *PACKAGE = "package";
|
|
||||||
static const char *PACKAGES = "packages";
|
|
||||||
static const char *PACKAGEINST = "packageInstall";
|
|
||||||
static const char *PACKAGEDEL = "packageDelete";
|
|
||||||
|
|
||||||
static const char *NEWPASSWORD = "newPassword";
|
static const char *NEWPASSWORD = "newPassword";
|
||||||
static const char *USERS = "users";
|
static const char *USERS = "users";
|
||||||
@@ -591,7 +583,6 @@ namespace OpenWifi::RESTAPI::Protocol {
|
|||||||
|
|
||||||
static const char *FIXEDCONFIG = "fixedconfig";
|
static const char *FIXEDCONFIG = "fixedconfig";
|
||||||
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
||||||
static const char *REENROLL = "reenroll";
|
|
||||||
} // namespace OpenWifi::RESTAPI::Protocol
|
} // namespace OpenWifi::RESTAPI::Protocol
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol {
|
namespace OpenWifi::uCentralProtocol {
|
||||||
@@ -677,9 +668,6 @@ namespace OpenWifi::uCentralProtocol {
|
|||||||
static const char *SIGNATURE = "signature";
|
static const char *SIGNATURE = "signature";
|
||||||
static const char *INFO = "info";
|
static const char *INFO = "info";
|
||||||
static const char *DATE = "date";
|
static const char *DATE = "date";
|
||||||
static const char *PACKAGE = "package";
|
|
||||||
static const char *PACKAGES = "packages";
|
|
||||||
static const char *CATEGORY = "category";
|
|
||||||
|
|
||||||
static const char *SERIALNUMBER = "serialNumber";
|
static const char *SERIALNUMBER = "serialNumber";
|
||||||
static const char *COMPATIBLE = "compatible";
|
static const char *COMPATIBLE = "compatible";
|
||||||
@@ -710,9 +698,7 @@ namespace OpenWifi::uCentralProtocol {
|
|||||||
|
|
||||||
static const char *FIXEDCONFIG = "fixedconfig";
|
static const char *FIXEDCONFIG = "fixedconfig";
|
||||||
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
||||||
static const char *REENROLL = "reenroll";
|
|
||||||
|
|
||||||
static const char *OPERATION = "op";
|
|
||||||
} // namespace OpenWifi::uCentralProtocol
|
} // namespace OpenWifi::uCentralProtocol
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol::Events {
|
namespace OpenWifi::uCentralProtocol::Events {
|
||||||
@@ -747,7 +733,7 @@ namespace OpenWifi::uCentralProtocol::Events {
|
|||||||
ET_EVENT,
|
ET_EVENT,
|
||||||
ET_WIFISCAN,
|
ET_WIFISCAN,
|
||||||
ET_ALARM,
|
ET_ALARM,
|
||||||
ET_REBOOTLOG,
|
ET_REBOOTLOG
|
||||||
};
|
};
|
||||||
|
|
||||||
inline EVENT_MSG EventFromString(const std::string &Method) {
|
inline EVENT_MSG EventFromString(const std::string &Method) {
|
||||||
@@ -811,8 +797,6 @@ namespace OpenWifi::APCommands {
|
|||||||
powercycle,
|
powercycle,
|
||||||
fixedconfig,
|
fixedconfig,
|
||||||
cablediagnostics,
|
cablediagnostics,
|
||||||
reenroll,
|
|
||||||
package,
|
|
||||||
unknown
|
unknown
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -828,8 +812,7 @@ namespace OpenWifi::APCommands {
|
|||||||
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT,
|
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT,
|
||||||
RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE,
|
RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE,
|
||||||
RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE,
|
RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE,
|
||||||
RESTAPI::Protocol::FIXEDCONFIG, RESTAPI::Protocol::CABLEDIAGNOSTICS,
|
RESTAPI::Protocol::FIXEDCONFIG, RESTAPI::Protocol::CABLEDIAGNOSTICS
|
||||||
RESTAPI::Protocol::REENROLL, RESTAPI::Protocol::PACKAGE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }
|
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }
|
||||||
|
|||||||
@@ -888,15 +888,78 @@ namespace OpenWifi::Utils {
|
|||||||
return password;
|
return password;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Function to query NAPTR records for a domain and return them in a vector
|
||||||
Note that these 2 functions aren't used. They have been removed due to this deprecation warning:
|
std::vector<NAPTRRecord> getNAPTRRecords(const std::string& domain) {
|
||||||
// Function to query NAPTR records for a domain and return them in a vector
|
std::vector<NAPTRRecord> naptrRecords;
|
||||||
#47 3.825 /owgw/src/framework/utils.cpp: In function 'std::vector<OpenWifi::Utils::NAPTRRecord> OpenWifi::Utils::getNAPTRRecords(const std::string&)':
|
|
||||||
#47 3.825 /owgw/src/framework/utils.cpp:915:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations]
|
unsigned char buf[4096];
|
||||||
|
ns_msg handle;
|
||||||
|
ns_initparse(buf, NS_PACKETSZ, &handle);
|
||||||
|
|
||||||
|
// Query NAPTR records for the given domain
|
||||||
|
int response = res_query(domain.c_str(), ns_c_in, ns_t_naptr, buf, sizeof(buf));
|
||||||
|
if (response < 0) {
|
||||||
|
return naptrRecords;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ns_initparse(buf, response, &handle) < 0) {
|
||||||
|
return naptrRecords;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate through the DNS response and extract NAPTR records
|
||||||
|
int count = ns_msg_count(handle, ns_s_an);
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
ns_rr rr;
|
||||||
|
if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) {
|
||||||
|
char rdata[256];
|
||||||
|
ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata));
|
||||||
|
NAPTRRecord record;
|
||||||
|
std::istringstream os(rdata);
|
||||||
|
os >> record.name >> record.ttl >> record.rclass >> record.rtype >> record.order >> record.preference >> record.flags
|
||||||
|
>> record.service >> record.regexp >> record.replacement;
|
||||||
|
naptrRecords.push_back(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return naptrRecords;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<SrvRecord> getSRVRecords(const std::string& domain) {
|
std::vector<SrvRecord> getSRVRecords(const std::string& domain) {
|
||||||
#47 3.833 /owgw/src/framework/utils.cpp: In function 'std::vector<OpenWifi::Utils::SrvRecord> OpenWifi::Utils::getSRVRecords(const std::string&)':
|
std::vector<SrvRecord> srvRecords;
|
||||||
#47 3.833 /owgw/src/framework/utils.cpp:952:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations]
|
|
||||||
*/
|
// Buffer to hold the DNS response
|
||||||
|
unsigned char buf[4096];
|
||||||
|
ns_msg handle;
|
||||||
|
ns_initparse(buf, NS_PACKETSZ, &handle);
|
||||||
|
|
||||||
|
// Query NAPTR records for the given domain
|
||||||
|
int response = res_query(domain.c_str(), ns_c_in, ns_t_srv, buf, sizeof(buf));
|
||||||
|
if (response < 0) {
|
||||||
|
std::cerr << "DNS query failed for " << domain << ": " << hstrerror(h_errno) << std::endl;
|
||||||
|
return srvRecords;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ns_initparse(buf, response, &handle) < 0) {
|
||||||
|
return srvRecords;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate through the DNS response and extract NAPTR records
|
||||||
|
int count = ns_msg_count(handle, ns_s_an);
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
ns_rr rr;
|
||||||
|
if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) {
|
||||||
|
char rdata[256];
|
||||||
|
ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata));
|
||||||
|
SrvRecord record;
|
||||||
|
std::istringstream os(rdata);
|
||||||
|
os >> record.name >> record.ttl >> record.rclass >> record.rtype >> record.pref >> record.weight >>
|
||||||
|
record.port >> record.srvname ;
|
||||||
|
srvRecords.push_back(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return srvRecords;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace OpenWifi::Utils
|
} // namespace OpenWifi::Utils
|
||||||
|
|||||||
@@ -298,10 +298,8 @@ namespace OpenWifi::Utils {
|
|||||||
std::string replacement;
|
std::string replacement;
|
||||||
};
|
};
|
||||||
|
|
||||||
// removed due to deprecation: see utils.cpp
|
// Function to query NAPTR records for a domain and return them in a vector
|
||||||
// Function to query NAPTR records for a domain and return them in a vector
|
std::vector<NAPTRRecord> getNAPTRRecords(const std::string& domain);
|
||||||
//std::vector<NAPTRRecord> getNAPTRRecords(const std::string& domain);
|
|
||||||
|
|
||||||
struct SrvRecord {
|
struct SrvRecord {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string ttl;
|
std::string ttl;
|
||||||
@@ -313,8 +311,7 @@ namespace OpenWifi::Utils {
|
|||||||
std::string srvname;
|
std::string srvname;
|
||||||
};
|
};
|
||||||
|
|
||||||
// removed due to deprecation: see utils.cpp
|
std::vector<SrvRecord> getSRVRecords(const std::string& domain);
|
||||||
// std::vector<SrvRecord> getSRVRecords(const std::string& domain);
|
|
||||||
|
|
||||||
struct HostNameServerResult{
|
struct HostNameServerResult{
|
||||||
std::string Hostname;
|
std::string Hostname;
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include "nlohmann/json.hpp"
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
#include "Poco/NObserver.h"
|
#include "Poco/NObserver.h"
|
||||||
#include <Poco/Net/Context.h>
|
|
||||||
#include "Poco/Net/SocketNotification.h"
|
#include "Poco/Net/SocketNotification.h"
|
||||||
#include "Poco/Net/NetException.h"
|
#include "Poco/Net/NetException.h"
|
||||||
#include "Poco/Net/WebSocketImpl.h"
|
#include "Poco/Net/WebSocketImpl.h"
|
||||||
@@ -72,7 +71,6 @@ namespace OpenWifi {
|
|||||||
const auto &RootCas =
|
const auto &RootCas =
|
||||||
MicroServiceConfigPath("ucentral.websocket.host.0.rootca", "");
|
MicroServiceConfigPath("ucentral.websocket.host.0.rootca", "");
|
||||||
const auto &Cas = MicroServiceConfigPath("ucentral.websocket.host.0.cas", "");
|
const auto &Cas = MicroServiceConfigPath("ucentral.websocket.host.0.cas", "");
|
||||||
const auto &ClientCasFile = MicroServiceConfigPath("ucentral.websocket.host.0.clientcas", "");
|
|
||||||
|
|
||||||
Poco::Net::Context::Params P;
|
Poco::Net::Context::Params P;
|
||||||
|
|
||||||
@@ -88,7 +86,6 @@ namespace OpenWifi {
|
|||||||
Poco::Crypto::X509Certificate Cert(CertFileName);
|
Poco::Crypto::X509Certificate Cert(CertFileName);
|
||||||
Poco::Crypto::X509Certificate Root(RootCaFileName);
|
Poco::Crypto::X509Certificate Root(RootCaFileName);
|
||||||
Poco::Crypto::X509Certificate Issuing(IssuerFileName);
|
Poco::Crypto::X509Certificate Issuing(IssuerFileName);
|
||||||
std::vector<Poco::Crypto::X509Certificate> ClientCasCerts;
|
|
||||||
Poco::Crypto::RSAKey Key("", KeyFileName, KeyPassword);
|
Poco::Crypto::RSAKey Key("", KeyFileName, KeyPassword);
|
||||||
|
|
||||||
DeviceSecureContext->useCertificate(Cert);
|
DeviceSecureContext->useCertificate(Cert);
|
||||||
@@ -96,11 +93,7 @@ namespace OpenWifi {
|
|||||||
DeviceSecureContext->addCertificateAuthority(Root);
|
DeviceSecureContext->addCertificateAuthority(Root);
|
||||||
DeviceSecureContext->addChainCertificate(Issuing);
|
DeviceSecureContext->addChainCertificate(Issuing);
|
||||||
DeviceSecureContext->addCertificateAuthority(Issuing);
|
DeviceSecureContext->addCertificateAuthority(Issuing);
|
||||||
ClientCasCerts = Poco::Net::X509Certificate::readPEM(ClientCasFile);
|
DeviceSecureContext->addCertificateAuthority(Root);
|
||||||
for (const auto &cert : ClientCasCerts) {
|
|
||||||
DeviceSecureContext->addChainCertificate(cert);
|
|
||||||
DeviceSecureContext->addCertificateAuthority(cert);
|
|
||||||
}
|
|
||||||
DeviceSecureContext->enableSessionCache(true);
|
DeviceSecureContext->enableSessionCache(true);
|
||||||
DeviceSecureContext->setSessionCacheSize(0);
|
DeviceSecureContext->setSessionCacheSize(0);
|
||||||
DeviceSecureContext->setSessionTimeout(120);
|
DeviceSecureContext->setSessionTimeout(120);
|
||||||
@@ -580,16 +573,14 @@ namespace OpenWifi {
|
|||||||
try {
|
try {
|
||||||
Client = Clients_.find(pNf->socket().impl()->sockfd());
|
Client = Clients_.find(pNf->socket().impl()->sockfd());
|
||||||
if (Client == end(Clients_)) {
|
if (Client == end(Clients_)) {
|
||||||
poco_warning(Logger(),
|
poco_warning(Logger(), fmt::format("Cannot find client socket: {}",
|
||||||
fmt::format("Cannot find client socket: {}",
|
pNf->socket().impl()->sockfd()));
|
||||||
pNf->socket().impl()->sockfd()));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Connection = Client->second;
|
Connection = Client->second;
|
||||||
if(Connection->WSSocket_==nullptr || Connection->WSSocket_->impl()==nullptr) {
|
if(Connection->WSSocket_==nullptr || Connection->WSSocket_->impl()==nullptr) {
|
||||||
poco_warning(Logger(),
|
poco_warning(Logger(), fmt::format("WebSocket is no valid: {}",
|
||||||
fmt::format("WebSocket is not valid: {}",
|
Connection->SerialNumber_));
|
||||||
Connection->SerialNumber_));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -598,25 +589,15 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
auto ReceivedBytes = Connection->WSSocket_->receiveFrame(FrameBuffer, sizeof(FrameBuffer), flags);
|
auto ReceivedBytes = Connection->WSSocket_->receiveFrame(FrameBuffer, sizeof(FrameBuffer), flags);
|
||||||
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
||||||
|
|
||||||
if (ReceivedBytes == -1) {
|
|
||||||
poco_trace(Logger(),
|
|
||||||
fmt::format("WS-EMPTY{}: Non-blocking try-again empty Frame: flags {}",
|
|
||||||
Connection->SerialNumber_, flags));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (Op) {
|
switch (Op) {
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
||||||
Connection->WSSocket_->sendFrame("", 0,
|
Connection->WSSocket_->sendFrame("", 0,
|
||||||
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
|
||||||
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_PONG: {
|
case Poco::Net::WebSocket::FRAME_OP_PONG: {
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
||||||
if (ReceivedBytes == 0) {
|
if (ReceivedBytes == 0) {
|
||||||
EndConnection(Connection,__func__,__LINE__);
|
EndConnection(Connection,__func__,__LINE__);
|
||||||
@@ -643,29 +624,19 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_BINARY: {
|
case Poco::Net::WebSocket::FRAME_OP_BINARY: {
|
||||||
if (ReceivedBytes == 0) {
|
if (ReceivedBytes == 0) {
|
||||||
EndConnection(Connection,__func__,__LINE__);
|
EndConnection(Connection,__func__,__LINE__);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
poco_trace(Logger(),
|
poco_trace(Logger(),
|
||||||
fmt::format("Sending {} key strokes to device.", ReceivedBytes));
|
fmt::format("Sending {} key strokes to device.", ReceivedBytes));
|
||||||
if (!RTTYS_server().KeyStrokes(Connection, FrameBuffer, ReceivedBytes)) {
|
if (!RTTYS_server().KeyStrokes(Connection, FrameBuffer, ReceivedBytes)) {
|
||||||
EndConnection(Connection,__func__,__LINE__);
|
EndConnection(Connection,__func__,__LINE__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_CONT: {
|
|
||||||
// may have to handle this, but not sure whether it's a continuation for text or
|
|
||||||
// binary, seems to be a hole in the protocol.
|
|
||||||
poco_warning(Logger(),
|
|
||||||
fmt::format("CONT Frame {} received, ignoring for now.",
|
|
||||||
ReceivedBytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
|
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
|
||||||
EndConnection(Connection,__func__,__LINE__);
|
EndConnection(Connection,__func__,__LINE__);
|
||||||
return;
|
return;
|
||||||
@@ -711,8 +682,8 @@ namespace OpenWifi {
|
|||||||
if (Connection->WSSocket_ != nullptr && Connection->WSSocket_->impl()!= nullptr) {
|
if (Connection->WSSocket_ != nullptr && Connection->WSSocket_->impl()!= nullptr) {
|
||||||
try {
|
try {
|
||||||
Connection->WSSocket_->sendFrame(Buf, len,
|
Connection->WSSocket_->sendFrame(Buf, len,
|
||||||
(int) Poco::Net::WebSocket::FRAME_FLAG_FIN |
|
Poco::Net::WebSocket::FRAME_FLAG_FIN |
|
||||||
(int) Poco::Net::WebSocket::FRAME_OP_BINARY);
|
Poco::Net::WebSocket::FRAME_OP_BINARY);
|
||||||
return;
|
return;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
poco_error(Logger(), "SendData shutdown.");
|
poco_error(Logger(), "SendData shutdown.");
|
||||||
@@ -1014,9 +985,8 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool RTTYS_server::SendToClient(Poco::Net::WebSocket &WebSocket, const u_char *Buf, int len) {
|
bool RTTYS_server::SendToClient(Poco::Net::WebSocket &WebSocket, const u_char *Buf, int len) {
|
||||||
WebSocket.sendFrame(Buf, len,
|
WebSocket.sendFrame(
|
||||||
(int) Poco::Net::WebSocket::FRAME_FLAG_FIN |
|
Buf, len, Poco::Net::WebSocket::FRAME_FLAG_FIN | Poco::Net::WebSocket::FRAME_OP_BINARY);
|
||||||
(int) Poco::Net::WebSocket::FRAME_OP_BINARY);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1147,4 +1117,4 @@ namespace OpenWifi {
|
|||||||
RTTYS_EndPoint::~RTTYS_EndPoint() {
|
RTTYS_EndPoint::~RTTYS_EndPoint() {
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
@@ -664,14 +664,12 @@ namespace OpenWifi {
|
|||||||
Insert.execute();
|
Insert.execute();
|
||||||
Sess.commit();
|
Sess.commit();
|
||||||
} else {
|
} else {
|
||||||
poco_warning(Logger(),
|
poco_warning(Logger(), fmt::format("File {} is too large.", UUID));
|
||||||
fmt::format("File {} is too large ({} >= {} max bytes).",
|
|
||||||
UUID, Size, FileUploader()->MaxSize()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update CommandList here to ensure that file us uploaded
|
// update CommandList here to ensure that file us uploaded
|
||||||
Sess.begin();
|
Sess.begin();
|
||||||
Poco::Data::Statement Statement(Sess);
|
Poco::Data::Statement Statement(Sess);
|
||||||
std::string StatementStr;
|
std::string StatementStr;
|
||||||
StatementStr =
|
StatementStr =
|
||||||
"UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?";
|
"UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?";
|
||||||
|
|||||||
@@ -202,14 +202,15 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
std::string st;
|
std::string st;
|
||||||
std::string whereClause = "";
|
std::string whereClause = "";
|
||||||
if (!platform.empty()) {
|
if(!platform.empty()) {
|
||||||
if (includeProvisioned == false) {
|
if (includeProvisioned == false) {
|
||||||
//whereClause = fmt::format("WHERE entity='' and venue='' and DeviceType='" + platform + "'");
|
|
||||||
whereClause = fmt::format("WHERE entity='' and venue='' and DeviceType='{}'", platform);
|
whereClause = fmt::format("WHERE entity='' and venue='' and DeviceType='" + platform + "'");
|
||||||
} else {
|
} else {
|
||||||
//whereClause = fmt::format("WHERE DeviceType='" + platform + "'");
|
whereClause = fmt::format("WHERE DeviceType='" + platform + "'");
|
||||||
whereClause = fmt::format("WHERE DeviceType='{}'", platform);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//st = "SELECT SerialNumber From Devices WHERE DeviceType='" + platform + "' ";
|
//st = "SELECT SerialNumber From Devices WHERE DeviceType='" + platform + "' ";
|
||||||
} else {
|
} else {
|
||||||
if (includeProvisioned == false) {
|
if (includeProvisioned == false) {
|
||||||
@@ -217,7 +218,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
//st = "SELECT SerialNumber From Devices ";
|
//st = "SELECT SerialNumber From Devices ";
|
||||||
}
|
}
|
||||||
|
|
||||||
st = fmt::format("SELECT SerialNumber From Devices {}", whereClause);
|
st = fmt::format("SELECT SerialNumber From Devices {}", whereClause);
|
||||||
|
|
||||||
if (orderBy.empty())
|
if (orderBy.empty())
|
||||||
@@ -895,9 +896,9 @@ namespace OpenWifi {
|
|||||||
if (includeProvisioned == false) {
|
if (includeProvisioned == false) {
|
||||||
whereClause = fmt::format("WHERE DeviceType='{}' and entity='' and venue=''",platform);
|
whereClause = fmt::format("WHERE DeviceType='{}' and entity='' and venue=''",platform);
|
||||||
} else {
|
} else {
|
||||||
whereClause = fmt::format("WHERE DeviceType='{}'", platform);
|
whereClause = fmt::format("WHERE DeviceType='{}'", platform);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
st =
|
st =
|
||||||
@@ -906,7 +907,7 @@ namespace OpenWifi {
|
|||||||
ComputeRange(From, HowMany));
|
ComputeRange(From, HowMany));
|
||||||
|
|
||||||
//Logger().information(fmt::format(" GetDevices st is {} ", st));
|
//Logger().information(fmt::format(" GetDevices st is {} ", st));
|
||||||
|
|
||||||
Select << ConvertParams(st), Poco::Data::Keywords::into(Records);
|
Select << ConvertParams(st), Poco::Data::Keywords::into(Records);
|
||||||
Select.execute();
|
Select.execute();
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ namespace OpenWifi {
|
|||||||
"Data TEXT, "
|
"Data TEXT, "
|
||||||
"Recorded BIGINT, "
|
"Recorded BIGINT, "
|
||||||
"INDEX StatSerial0 (SerialNumber)), ",
|
"INDEX StatSerial0 (SerialNumber)), ",
|
||||||
"INDEX StatSerial (SerialNumber ASC, Recorded ASC))", Poco::Data::Keywords::now;
|
"INDEX StatSerial (SerialNumber ASC, Recorded ASC))",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
@@ -153,7 +154,8 @@ namespace OpenWifi {
|
|||||||
"alter table devices add column lastRecordedContact bigint",
|
"alter table devices add column lastRecordedContact bigint",
|
||||||
"alter table devices add column simulated boolean",
|
"alter table devices add column simulated boolean",
|
||||||
"alter table devices add column certificateExpiryDate bigint",
|
"alter table devices add column certificateExpiryDate bigint",
|
||||||
"alter table devices add column connectReason TEXT"};
|
"alter table devices add column connectReason TEXT"
|
||||||
|
};
|
||||||
|
|
||||||
for (const auto &i : Script) {
|
for (const auto &i : Script) {
|
||||||
try {
|
try {
|
||||||
@@ -277,7 +279,9 @@ namespace OpenWifi {
|
|||||||
Poco::Data::Keywords::now;
|
Poco::Data::Keywords::now;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> Script{"alter table DefaultConfigs add column Platform text"};
|
std::vector<std::string> Script{
|
||||||
|
"alter table DefaultConfigs add column Platform text"
|
||||||
|
};
|
||||||
|
|
||||||
for (const auto &i : Script) {
|
for (const auto &i : Script) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user