mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralfms.git
synced 2025-10-30 18:27:54 +00:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4031e50aed | ||
|
|
d4f4f45ec1 | ||
|
|
183914dae7 | ||
|
|
0178b5e5d0 | ||
|
|
c020e702df | ||
|
|
7e72cc7ac7 | ||
|
|
a283f31d7f | ||
|
|
13d2d39aed | ||
|
|
7d5c130d5c | ||
|
|
bc4da0aaeb | ||
|
|
e4787839f0 | ||
|
|
bf3a689249 | ||
|
|
dea5bb96e5 | ||
|
|
381006b9f5 | ||
|
|
92bc511ec5 | ||
|
|
73686f8a6c | ||
|
|
48b8705fc6 | ||
|
|
0ba38c8736 | ||
|
|
b018dc70ef | ||
|
|
42d44b056e | ||
|
|
7d9d5b4d15 | ||
|
|
7fc77e529b | ||
|
|
e8986d84b4 | ||
|
|
f54fd2b411 | ||
|
|
86f3754c7e | ||
|
|
260927a3eb | ||
|
|
bb571ad11a | ||
|
|
bd0fbfd6d2 | ||
|
|
33ba7b2323 | ||
|
|
28cbc79890 | ||
|
|
0137d8ee66 | ||
|
|
1ca77de37e |
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
project(owfms VERSION 2.10.0)
|
project(owfms VERSION 3.0.0)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ include_directories(/usr/local/include /usr/local/opt/openssl/include src inclu
|
|||||||
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
|
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
|
||||||
|
|
||||||
add_compile_options(-Wall -Wextra)
|
add_compile_options(-Wall -Wextra)
|
||||||
add_definitions(-DPOCO_LOG_DEBUG="1")
|
add_definitions(-DPOCO_LOG_DEBUG="1" -DBOOST_NO_CXX98_FUNCTION_BASE=1)
|
||||||
|
|
||||||
if(ASAN)
|
if(ASAN)
|
||||||
add_compile_options(-fsanitize=address)
|
add_compile_options(-fsanitize=address)
|
||||||
@@ -157,6 +157,7 @@ target_link_libraries( owfms PUBLIC
|
|||||||
${ZLIB_LIBRARIES}
|
${ZLIB_LIBRARIES}
|
||||||
${AWSSDK_LINK_LIBRARIES}
|
${AWSSDK_LINK_LIBRARIES}
|
||||||
fmt::fmt
|
fmt::fmt
|
||||||
|
resolv
|
||||||
CppKafka::cppkafka
|
CppKafka::cppkafka
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
49
Dockerfile
49
Dockerfile
@@ -1,6 +1,9 @@
|
|||||||
ARG DEBIAN_VERSION=11.5-slim
|
ARG DEBIAN_VERSION=11.5-slim
|
||||||
ARG POCO_VERSION=poco-tip-v2
|
ARG POCO_VERSION=poco-tip-v2
|
||||||
ARG CPPKAFKA_VERSION=tip-v1
|
ARG CPPKAFKA_VERSION=tip-v1
|
||||||
|
ARG VALIJASON_VERSION=tip-v1
|
||||||
|
ARG APP_NAME=owfms
|
||||||
|
ARG APP_HOME_DIR=/openwifi
|
||||||
|
|
||||||
FROM debian:$DEBIAN_VERSION AS build-base
|
FROM debian:$DEBIAN_VERSION AS build-base
|
||||||
|
|
||||||
@@ -38,14 +41,17 @@ RUN cmake ..
|
|||||||
RUN cmake --build . --config Release -j8
|
RUN cmake --build . --config Release -j8
|
||||||
RUN cmake --build . --target install
|
RUN cmake --build . --target install
|
||||||
|
|
||||||
FROM build-base AS owfms-build
|
FROM build-base AS app-build
|
||||||
|
|
||||||
ADD CMakeLists.txt build /owfms/
|
ARG APP_NAME
|
||||||
ADD overlays /owfms/overlays
|
|
||||||
ADD cmake /owfms/cmake
|
ADD CMakeLists.txt build /${APP_NAME}/
|
||||||
ADD src /owfms/src
|
ADD overlays /${APP_NAME}/overlays
|
||||||
ADD .git /owfms/.git
|
ADD cmake /${APP_NAME}/cmake
|
||||||
|
ADD src /${APP_NAME}/src
|
||||||
|
ADD .git /${APP_NAME}/.git
|
||||||
ARG VCPKG_VERSION=2022.11.14
|
ARG VCPKG_VERSION=2022.11.14
|
||||||
|
|
||||||
RUN git clone --depth 1 --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg && \
|
RUN git clone --depth 1 --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg && \
|
||||||
./vcpkg/bootstrap-vcpkg.sh && \
|
./vcpkg/bootstrap-vcpkg.sh && \
|
||||||
mkdir /vcpkg/custom-triplets && \
|
mkdir /vcpkg/custom-triplets && \
|
||||||
@@ -58,23 +64,28 @@ COPY --from=poco-build /usr/local/lib /usr/local/lib
|
|||||||
COPY --from=cppkafka-build /usr/local/include /usr/local/include
|
COPY --from=cppkafka-build /usr/local/include /usr/local/include
|
||||||
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
|
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
|
||||||
|
|
||||||
WORKDIR /owfms
|
WORKDIR /${APP_NAME}
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
WORKDIR /owfms/cmake-build
|
WORKDIR /${APP_NAME}/cmake-build
|
||||||
RUN cmake -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
RUN cmake -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
||||||
RUN cmake --build . --config Release -j8
|
RUN cmake --build . --config Release -j8
|
||||||
|
|
||||||
FROM debian:$DEBIAN_VERSION
|
FROM debian:$DEBIAN_VERSION
|
||||||
|
|
||||||
ENV OWFMS_USER=owfms \
|
ARG APP_NAME
|
||||||
OWFMS_ROOT=/owfms-data \
|
ARG APP_HOME_DIR
|
||||||
OWFMS_CONFIG=/owfms-data
|
|
||||||
|
|
||||||
RUN useradd "$OWFMS_USER"
|
ENV APP_NAME=$APP_NAME \
|
||||||
|
APP_USER=$APP_NAME \
|
||||||
|
APP_ROOT=/$APP_NAME-data \
|
||||||
|
APP_CONFIG=/$APP_NAME-data \
|
||||||
|
APP_HOME_DIR=$APP_HOME_DIR
|
||||||
|
|
||||||
RUN mkdir /openwifi
|
RUN useradd $APP_USER
|
||||||
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
|
|
||||||
chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
RUN mkdir $APP_HOME_DIR
|
||||||
|
RUN mkdir -p "$APP_ROOT" "$APP_CONFIG" && \
|
||||||
|
chown "$APP_USER": "$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 \
|
||||||
@@ -83,14 +94,14 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
|
|||||||
COPY readiness_check /readiness_check
|
COPY readiness_check /readiness_check
|
||||||
COPY test_scripts/curl/cli /cli
|
COPY test_scripts/curl/cli /cli
|
||||||
|
|
||||||
COPY owfms.properties.tmpl /
|
COPY $APP_NAME.properties.tmpl /
|
||||||
COPY docker-entrypoint.sh /
|
COPY docker-entrypoint.sh /
|
||||||
COPY wait-for-postgres.sh /
|
COPY wait-for-postgres.sh /
|
||||||
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
|
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
|
||||||
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
|
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
|
||||||
|
|
||||||
COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms
|
COPY --from=app-build /$APP_NAME/cmake-build/$APP_NAME $APP_HOME_DIR/$APP_NAME
|
||||||
COPY --from=owfms-build /vcpkg/installed/x64-linux/lib/ /usr/local/lib/
|
COPY --from=app-build /vcpkg/installed/x64-linux/lib/ /usr/local/lib/
|
||||||
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/ /usr/local/lib/
|
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/ /usr/local/lib/
|
||||||
COPY --from=poco-build /poco/cmake-build/lib/ /usr/local/lib/
|
COPY --from=poco-build /poco/cmake-build/lib/ /usr/local/lib/
|
||||||
|
|
||||||
@@ -99,4 +110,4 @@ RUN ldconfig
|
|||||||
EXPOSE 16004 17004 16104
|
EXPOSE 16004 17004 16104
|
||||||
|
|
||||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
CMD ["/openwifi/owfms"]
|
CMD ${APP_HOME_DIR}/${APP_NAME}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ fullnameOverride: ""
|
|||||||
images:
|
images:
|
||||||
owfms:
|
owfms:
|
||||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
|
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
|
||||||
tag: main
|
tag: v3.0.0
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
# regcred:
|
# regcred:
|
||||||
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
|
|||||||
@@ -353,6 +353,33 @@ components:
|
|||||||
type: integer
|
type: integer
|
||||||
format: int64
|
format: int64
|
||||||
|
|
||||||
|
SystemResources:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
numberOfFileDescriptors:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
currRealMem:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
peakRealMem:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
currVirtMem:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
peakVirtMem:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
|
||||||
|
SystemCommandResults:
|
||||||
|
type: object
|
||||||
|
oneOf:
|
||||||
|
- $ref: '#/components/schemas/SystemResources'
|
||||||
|
- $ref: '#/components/schemas/SystemInfoResults'
|
||||||
|
- $ref: '#/components/schemas/StringList'
|
||||||
|
- $ref: '#/components/schemas/TagValuePairList'
|
||||||
|
|
||||||
SystemCommandSetLogLevel:
|
SystemCommandSetLogLevel:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -743,19 +770,19 @@ paths:
|
|||||||
operationId: getFirmwareAge
|
operationId: getFirmwareAge
|
||||||
parameters:
|
parameters:
|
||||||
- in: query
|
- in: query
|
||||||
description: The exact current verion of the firmware on that device.
|
description: The exact current version of the firmware on that device.
|
||||||
name: revision
|
name: revision
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
required: true
|
required: true
|
||||||
- in: query
|
- in: query
|
||||||
description: The exact current verion of the firmware on that device.
|
description: The exact current version of the firmware on that device.
|
||||||
name: deviceType
|
name: deviceType
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
required: true
|
required: true
|
||||||
- in: query
|
- in: query
|
||||||
description: Specify lits of serial numbers to retrive age for
|
description: Specify list of serial numbers to retrieve age for
|
||||||
name: select
|
name: select
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
@@ -925,16 +952,12 @@ paths:
|
|||||||
type: string
|
type: string
|
||||||
enum:
|
enum:
|
||||||
- info
|
- info
|
||||||
|
- extraConfiguration
|
||||||
|
- resources
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
description: Successfull command execution
|
$ref: '#/components/schemas/SystemCommandResults'
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
oneOf:
|
|
||||||
- $ref: '#/components/schemas/SystemInfoResults'
|
|
||||||
403:
|
403:
|
||||||
$ref: '#/components/responses/Unauthorized'
|
$ref: '#/components/responses/Unauthorized'
|
||||||
404:
|
404:
|
||||||
|
|||||||
@@ -171,6 +171,31 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "lastModified", LastModified);
|
field_to_json(Obj, "lastModified", LastModified);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DefaultFirmware::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "deviceType", deviceType);
|
||||||
|
field_to_json(Obj, "description", Description);
|
||||||
|
field_to_json(Obj, "uri", uri);
|
||||||
|
field_to_json(Obj, "revision", revision);
|
||||||
|
field_to_json(Obj, "imageCreationDate", imageCreationDate);
|
||||||
|
field_to_json(Obj, "created", Created);
|
||||||
|
field_to_json(Obj, "lastModified", LastModified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DefaultFirmware::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "deviceType", deviceType);
|
||||||
|
field_from_json(Obj, "description", Description);
|
||||||
|
field_from_json(Obj, "uri", uri);
|
||||||
|
field_from_json(Obj, "revision", revision);
|
||||||
|
field_from_json(Obj, "imageCreationDate", imageCreationDate);
|
||||||
|
field_from_json(Obj, "created", Created);
|
||||||
|
field_from_json(Obj, "lastModified", LastModified);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CommandDetails::to_json(Poco::JSON::Object &Obj) const {
|
void CommandDetails::to_json(Poco::JSON::Object &Obj) const {
|
||||||
EmbedDocument("details", Obj, Details);
|
EmbedDocument("details", Obj, Details);
|
||||||
EmbedDocument("results", Obj, Results);
|
EmbedDocument("results", Obj, Results);
|
||||||
@@ -246,6 +271,8 @@ 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, "connectReason", connectReason);
|
||||||
|
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
|
hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
|
||||||
AP_WS_Server()->ExtendedAttributes(SerialNumber, hasGPS, sanity,
|
AP_WS_Server()->ExtendedAttributes(SerialNumber, hasGPS, sanity,
|
||||||
@@ -403,6 +430,10 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "acctConfig", acctConfig);
|
field_to_json(Obj, "acctConfig", acctConfig);
|
||||||
field_to_json(Obj, "coaConfig", coaConfig);
|
field_to_json(Obj, "coaConfig", coaConfig);
|
||||||
field_to_json(Obj, "useByDefault", useByDefault);
|
field_to_json(Obj, "useByDefault", useByDefault);
|
||||||
|
field_to_json(Obj, "radsecKeepAlive", radsecKeepAlive);
|
||||||
|
field_to_json(Obj, "poolProxyIp", poolProxyIp);
|
||||||
|
field_to_json(Obj, "radsecPoolType", radsecPoolType);
|
||||||
|
field_to_json(Obj, "enabled", enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -413,6 +444,10 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_from_json(Obj, "acctConfig", acctConfig);
|
field_from_json(Obj, "acctConfig", acctConfig);
|
||||||
field_from_json(Obj, "coaConfig", coaConfig);
|
field_from_json(Obj, "coaConfig", coaConfig);
|
||||||
field_from_json(Obj, "useByDefault", useByDefault);
|
field_from_json(Obj, "useByDefault", useByDefault);
|
||||||
|
field_from_json(Obj, "radsecKeepAlive", radsecKeepAlive);
|
||||||
|
field_from_json(Obj, "poolProxyIp", poolProxyIp);
|
||||||
|
field_from_json(Obj, "radsecPoolType", radsecPoolType);
|
||||||
|
field_from_json(Obj, "enabled", enabled);
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
}
|
}
|
||||||
@@ -630,18 +665,50 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
|
field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
|
||||||
field_to_json(Obj, "interface", interface);
|
field_to_json(Obj, "interface", interface);
|
||||||
field_to_json(Obj, "secret", secret);
|
field_to_json(Obj, "secret", secret);
|
||||||
|
field_to_json(Obj, "nasId", nasId);
|
||||||
|
field_to_json(Obj, "calledStationId", calledStationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RADIUSSessionList::to_json(Poco::JSON::Object &Obj) const {
|
void RADIUSSessionList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "sessions", sessions);
|
field_to_json(Obj, "sessions", sessions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RadiusCoADMParameters::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "accountingSessionId", accountingSessionId);
|
||||||
|
field_to_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
|
||||||
|
field_to_json(Obj, "callingStationId", callingStationId);
|
||||||
|
field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
|
||||||
|
field_to_json(Obj, "userName", userName);
|
||||||
|
}
|
||||||
|
|
||||||
bool RadiusCoADMParameters::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool RadiusCoADMParameters::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "accountingSessionId", accountingSessionId);
|
field_from_json(Obj, "accountingSessionId", accountingSessionId);
|
||||||
field_from_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
|
field_from_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
|
||||||
field_from_json(Obj, "callingStationId", callingStationId);
|
field_from_json(Obj, "callingStationId", callingStationId);
|
||||||
field_from_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
|
field_from_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
|
||||||
|
field_from_json(Obj, "userName", userName);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceTransferRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "serialNumber", serialNumber);
|
||||||
|
field_from_json(Obj, "server", server);
|
||||||
|
field_from_json(Obj, "port", port);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceCertificateUpdateRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "serialNumber", serialNumber);
|
||||||
|
field_from_json(Obj, "encodedCertificate", encodedCertificate);
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,12 +42,13 @@ 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;
|
||||||
bool hasRADIUSSessions = false;
|
std::uint64_t hasRADIUSSessions = 0;
|
||||||
bool hasGPS = false;
|
bool hasGPS = false;
|
||||||
std::uint64_t sanity=0;
|
std::uint64_t sanity=0;
|
||||||
std::double_t memoryUsed=0.0;
|
std::double_t memoryUsed=0.0;
|
||||||
std::double_t load=0.0;
|
std::double_t load=0.0;
|
||||||
std::double_t temperature=0.0;
|
std::double_t temperature=0.0;
|
||||||
|
std::string connectReason;
|
||||||
|
|
||||||
void to_json(const std::string &SerialNumber, Poco::JSON::Object &Obj) ;
|
void to_json(const std::string &SerialNumber, Poco::JSON::Object &Obj) ;
|
||||||
};
|
};
|
||||||
@@ -181,6 +182,26 @@ namespace OpenWifi::GWObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DefaultFirmware {
|
||||||
|
std::string deviceType;
|
||||||
|
std::string Description;
|
||||||
|
std::string uri;
|
||||||
|
std::string revision;
|
||||||
|
uint64_t imageCreationDate;
|
||||||
|
uint64_t Created;
|
||||||
|
uint64_t LastModified;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DefaultFirmwareList {
|
||||||
|
std::vector<DefaultFirmware> firmwares;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct CommandDetails {
|
struct CommandDetails {
|
||||||
std::string UUID;
|
std::string UUID;
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
@@ -339,6 +360,10 @@ namespace OpenWifi::GWObjects {
|
|||||||
RadiusProxyServerConfig acctConfig;
|
RadiusProxyServerConfig acctConfig;
|
||||||
RadiusProxyServerConfig coaConfig;
|
RadiusProxyServerConfig coaConfig;
|
||||||
bool useByDefault = false;
|
bool useByDefault = false;
|
||||||
|
std::string radsecPoolType;
|
||||||
|
std::string poolProxyIp;
|
||||||
|
std::uint64_t radsecKeepAlive=25;
|
||||||
|
bool enabled=true;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
@@ -393,7 +418,8 @@ namespace OpenWifi::GWObjects {
|
|||||||
callingStationId,
|
callingStationId,
|
||||||
chargeableUserIdentity,
|
chargeableUserIdentity,
|
||||||
secret,
|
secret,
|
||||||
interface;
|
interface,
|
||||||
|
nasId;
|
||||||
std::uint64_t inputPackets = 0,
|
std::uint64_t inputPackets = 0,
|
||||||
outputPackets = 0,
|
outputPackets = 0,
|
||||||
inputOctets = 0,
|
inputOctets = 0,
|
||||||
@@ -401,6 +427,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
inputGigaWords = 0,
|
inputGigaWords = 0,
|
||||||
outputGigaWords = 0;
|
outputGigaWords = 0;
|
||||||
std::uint32_t sessionTime = 0;
|
std::uint32_t sessionTime = 0;
|
||||||
|
std::string calledStationId;
|
||||||
|
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
RADIUS::RadiusPacket accountingPacket;
|
RADIUS::RadiusPacket accountingPacket;
|
||||||
@@ -418,7 +445,68 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string accountingSessionId,
|
std::string accountingSessionId,
|
||||||
accountingMultiSessionId,
|
accountingMultiSessionId,
|
||||||
callingStationId,
|
callingStationId,
|
||||||
chargeableUserIdentity;
|
chargeableUserIdentity,
|
||||||
|
userName;
|
||||||
|
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class RadiusPoolStrategy {
|
||||||
|
round_robin, random, weighted, unknown
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class RadiusEndpointType {
|
||||||
|
generic, radsec, globalreach, orion, unknown
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline RadiusEndpointType RadiusEndpointType(const std::string &T) {
|
||||||
|
if(T=="generic") return RadiusEndpointType::generic;
|
||||||
|
if(T=="radsec") return RadiusEndpointType::radsec;
|
||||||
|
if(T=="globalreach") return RadiusEndpointType::globalreach;
|
||||||
|
if(T=="orion") return RadiusEndpointType::orion;
|
||||||
|
return RadiusEndpointType::unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline RadiusPoolStrategy RadiusPoolStrategy(const std::string &T) {
|
||||||
|
if(T=="round_robin") return RadiusPoolStrategy::round_robin;
|
||||||
|
if(T=="random") return RadiusPoolStrategy::random;
|
||||||
|
if(T=="weighted") return RadiusPoolStrategy::weighted;
|
||||||
|
return RadiusPoolStrategy::unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline std::string to_string(enum RadiusEndpointType T) {
|
||||||
|
switch(T) {
|
||||||
|
case RadiusEndpointType::generic: return "generic";
|
||||||
|
case RadiusEndpointType::radsec: return "radsec";
|
||||||
|
case RadiusEndpointType::globalreach: return "globalreach";
|
||||||
|
case RadiusEndpointType::orion: return "orion";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline std::string to_string(enum RadiusPoolStrategy T) {
|
||||||
|
switch(T) {
|
||||||
|
case RadiusPoolStrategy::round_robin: return "round_robin";
|
||||||
|
case RadiusPoolStrategy::random: return "random";
|
||||||
|
case RadiusPoolStrategy::weighted: return "weighted";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DeviceTransferRequest {
|
||||||
|
std::string serialNumber;
|
||||||
|
std::string server;
|
||||||
|
std::uint64_t port;
|
||||||
|
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceCertificateUpdateRequest {
|
||||||
|
std::string serialNumber;
|
||||||
|
std::string encodedCertificate;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ namespace OpenWifi::OWLSObjects {
|
|||||||
field_to_json(Obj, "endTime", endTime);
|
field_to_json(Obj, "endTime", endTime);
|
||||||
field_to_json(Obj, "errorDevices", errorDevices);
|
field_to_json(Obj, "errorDevices", errorDevices);
|
||||||
field_to_json(Obj, "owner", owner);
|
field_to_json(Obj, "owner", owner);
|
||||||
|
field_to_json(Obj, "expectedDevices", expectedDevices);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dashboard::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {}
|
void Dashboard::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ namespace OpenWifi::OWLSObjects {
|
|||||||
uint64_t endTime;
|
uint64_t endTime;
|
||||||
uint64_t errorDevices;
|
uint64_t errorDevices;
|
||||||
std::string owner;
|
std::string owner;
|
||||||
|
uint64_t expectedDevices;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1194,4 +1194,243 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLBLRAccountInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json(Obj, "privateKey", privateKey);
|
||||||
|
field_to_json(Obj, "country", country);
|
||||||
|
field_to_json(Obj, "province", province);
|
||||||
|
field_to_json(Obj, "city", city);
|
||||||
|
field_to_json(Obj, "organization", organization);
|
||||||
|
field_to_json(Obj, "commonName", commonName);
|
||||||
|
field_to_json(Obj, "CSR", CSR);
|
||||||
|
field_to_json(Obj, "CSRPrivateKey", CSRPrivateKey);
|
||||||
|
field_to_json(Obj, "CSRPublicKey", CSRPublicKey);
|
||||||
|
field_to_json(Obj, "GlobalReachAcctId", GlobalReachAcctId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GLBLRAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json(Obj, "privateKey", privateKey);
|
||||||
|
field_from_json(Obj, "country", country);
|
||||||
|
field_from_json(Obj, "province", province);
|
||||||
|
field_from_json(Obj, "city", city);
|
||||||
|
field_from_json(Obj, "organization", organization);
|
||||||
|
field_from_json(Obj, "commonName", commonName);
|
||||||
|
field_from_json(Obj, "CSR", CSR);
|
||||||
|
field_from_json(Obj, "CSRPrivateKey", CSRPrivateKey);
|
||||||
|
field_from_json(Obj, "CSRPublicKey", CSRPublicKey);
|
||||||
|
field_from_json(Obj, "GlobalReachAcctId", GlobalReachAcctId);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLBLRCertificateInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "id", id);
|
||||||
|
field_to_json(Obj, "name", name);
|
||||||
|
field_to_json(Obj, "accountId", accountId);
|
||||||
|
field_to_json(Obj, "csr", csr);
|
||||||
|
field_to_json(Obj, "certificate", certificate);
|
||||||
|
field_to_json(Obj, "certificateChain", certificateChain);
|
||||||
|
field_to_json(Obj, "certificateId", certificateId);
|
||||||
|
field_to_json(Obj, "expiresAt", expiresAt);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GLBLRCertificateInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "id", id);
|
||||||
|
field_from_json(Obj, "name", name);
|
||||||
|
field_from_json(Obj, "accountId", accountId);
|
||||||
|
field_from_json(Obj, "csr", csr);
|
||||||
|
field_from_json(Obj, "certificate", certificate);
|
||||||
|
field_from_json(Obj, "certificateChain", certificateChain);
|
||||||
|
field_from_json(Obj, "certificateId", certificateId);
|
||||||
|
field_from_json(Obj, "expiresAt", expiresAt);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GooglOrionAccountInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json(Obj, "privateKey", privateKey);
|
||||||
|
field_to_json(Obj, "certificate", certificate);
|
||||||
|
field_to_json(Obj, "cacerts", cacerts);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GooglOrionAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json(Obj, "privateKey", privateKey);
|
||||||
|
field_from_json(Obj, "certificate", certificate);
|
||||||
|
field_from_json(Obj, "cacerts", cacerts);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RADIUSServer::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "Hostname", Hostname);
|
||||||
|
field_to_json(Obj, "IP", IP);
|
||||||
|
field_to_json(Obj, "Port", Port);
|
||||||
|
field_to_json(Obj, "Secret", Secret);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSServer::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "Hostname", Hostname);
|
||||||
|
field_from_json(Obj, "IP", IP);
|
||||||
|
field_from_json(Obj, "Port", Port);
|
||||||
|
field_from_json(Obj, "Secret", Secret);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RADIUSEndPointRadiusType::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "Authentication", Authentication);
|
||||||
|
field_to_json(Obj, "Accounting", Accounting);
|
||||||
|
field_to_json(Obj, "CoA", CoA);
|
||||||
|
field_to_json(Obj, "AccountingInterval", AccountingInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndPointRadiusType::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "Authentication", Authentication);
|
||||||
|
field_from_json(Obj, "Accounting", Accounting);
|
||||||
|
field_from_json(Obj, "CoA", CoA);
|
||||||
|
field_from_json(Obj, "AccountingInterval", AccountingInterval);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RADIUSEndPointRadsecType::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "Hostname", Hostname);
|
||||||
|
field_to_json(Obj, "IP", IP);
|
||||||
|
field_to_json(Obj, "Port", Port);
|
||||||
|
field_to_json(Obj, "Secret", Secret);
|
||||||
|
field_to_json(Obj, "OpenRoamingType", OpenRoamingType);
|
||||||
|
field_to_json(Obj, "UseOpenRoamingAccount", UseOpenRoamingAccount);
|
||||||
|
field_to_json(Obj, "Weight", Weight);
|
||||||
|
field_to_json(Obj, "Certificate", Certificate);
|
||||||
|
field_to_json(Obj, "PrivateKey", PrivateKey);
|
||||||
|
field_to_json(Obj, "CaCerts", CaCerts);
|
||||||
|
field_to_json(Obj, "AllowSelfSigned", AllowSelfSigned);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndPointRadsecType::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "Hostname", Hostname);
|
||||||
|
field_from_json(Obj, "IP", IP);
|
||||||
|
field_from_json(Obj, "Port", Port);
|
||||||
|
field_from_json(Obj, "Secret", Secret);
|
||||||
|
field_from_json(Obj, "OpenRoamingType", OpenRoamingType);
|
||||||
|
field_from_json(Obj, "UseOpenRoamingAccount", UseOpenRoamingAccount);
|
||||||
|
field_from_json(Obj, "Weight", Weight);
|
||||||
|
field_from_json(Obj, "Certificate", Certificate);
|
||||||
|
field_from_json(Obj, "PrivateKey", PrivateKey);
|
||||||
|
field_from_json(Obj, "CaCerts", CaCerts);
|
||||||
|
field_from_json(Obj, "AllowSelfSigned", AllowSelfSigned);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RADIUSEndPoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json(Obj, "Type", Type);
|
||||||
|
field_to_json(Obj, "RadsecServers", RadsecServers);
|
||||||
|
field_to_json(Obj, "RadiusServers", RadiusServers);
|
||||||
|
field_to_json(Obj, "PoolStrategy", PoolStrategy);
|
||||||
|
field_to_json(Obj, "Index", Index);
|
||||||
|
field_to_json(Obj, "UsedBy", UsedBy);
|
||||||
|
field_to_json(Obj, "UseGWProxy", UseGWProxy);
|
||||||
|
field_to_json(Obj, "NasIdentifier", NasIdentifier);
|
||||||
|
field_to_json(Obj, "AccountingInterval", AccountingInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndPoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json(Obj, "Type", Type);
|
||||||
|
field_from_json(Obj, "RadsecServers", RadsecServers);
|
||||||
|
field_from_json(Obj, "RadiusServers", RadiusServers);
|
||||||
|
field_from_json(Obj, "PoolStrategy", PoolStrategy);
|
||||||
|
field_from_json(Obj, "Index", Index);
|
||||||
|
field_from_json(Obj, "UsedBy", UsedBy);
|
||||||
|
field_from_json(Obj, "UseGWProxy", UseGWProxy);
|
||||||
|
field_from_json(Obj, "NasIdentifier", NasIdentifier);
|
||||||
|
field_from_json(Obj, "AccountingInterval", AccountingInterval);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RADIUSEndpointUpdateStatus::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "lastUpdate", lastUpdate);
|
||||||
|
field_to_json(Obj, "lastConfigurationChange", lastConfigurationChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndpointUpdateStatus::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "lastUpdate", lastUpdate);
|
||||||
|
field_from_json(Obj, "lastConfigurationChange", lastConfigurationChange);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndpointUpdateStatus::Read() {
|
||||||
|
Poco::File F(OpenWifi::MicroServiceDataDirectory()+"/RADIUSEndpointUpdateStatus.json");
|
||||||
|
try {
|
||||||
|
if (F.exists()) {
|
||||||
|
Poco::JSON::Parser P;
|
||||||
|
std::ifstream ifs(F.path(), std::ios_base::in | std::ios_base::binary);
|
||||||
|
auto Obj = P.parse(ifs);
|
||||||
|
return from_json(Obj.extract<Poco::JSON::Object::Ptr>());
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndpointUpdateStatus::Save() {
|
||||||
|
Poco::File F(OpenWifi::MicroServiceDataDirectory()+"/RADIUSEndpointUpdateStatus.json");
|
||||||
|
try {
|
||||||
|
Poco::JSON::Object Obj;
|
||||||
|
to_json(Obj);
|
||||||
|
std::ofstream O(F.path(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
|
||||||
|
Poco::JSON::Stringifier::stringify(Obj, O);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RADIUSEndpointUpdateStatus::ChangeConfiguration() {
|
||||||
|
Read();
|
||||||
|
lastConfigurationChange = Utils::Now();
|
||||||
|
return Save();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi::ProvObjects
|
} // namespace OpenWifi::ProvObjects
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::TagList tags;
|
Types::TagList tags;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -36,6 +37,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t serialNumbers;
|
Types::UUIDvec_t serialNumbers;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -46,6 +48,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string policy;
|
std::string policy;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -57,14 +60,18 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t venue;
|
Types::UUID_t venue;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<ManagementPolicy> ManagementPolicyVec;
|
typedef std::vector<ManagementPolicy> ManagementPolicyVec;
|
||||||
|
|
||||||
struct RRMAlgorithmDetails {
|
struct RRMAlgorithmDetails {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string parameters;
|
std::string parameters;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -72,7 +79,9 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string vendor;
|
std::string vendor;
|
||||||
std::string schedule;
|
std::string schedule;
|
||||||
std::vector<RRMAlgorithmDetails> algorithms;
|
std::vector<RRMAlgorithmDetails> algorithms;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -82,6 +91,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string firmwareUpgrade{"inherit"};
|
std::string firmwareUpgrade{"inherit"};
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -104,8 +114,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t configurations;
|
Types::UUIDvec_t configurations;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Entity> EntityVec;
|
typedef std::vector<Entity> EntityVec;
|
||||||
|
|
||||||
struct DiGraphEntry {
|
struct DiGraphEntry {
|
||||||
@@ -113,6 +125,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t child;
|
Types::UUID_t child;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -140,8 +153,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t boards;
|
Types::UUIDvec_t boards;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Venue> VenueVec;
|
typedef std::vector<Venue> VenueVec;
|
||||||
|
|
||||||
struct UserInfoDigest {
|
struct UserInfoDigest {
|
||||||
@@ -150,6 +165,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string userType;
|
std::string userType;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -162,8 +178,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t venue;
|
Types::UUID_t venue;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<ManagementRole> ManagementRoleVec;
|
typedef std::vector<ManagementRole> ManagementRoleVec;
|
||||||
|
|
||||||
enum LocationType {
|
enum LocationType {
|
||||||
@@ -232,8 +250,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Location> LocationVec;
|
typedef std::vector<Location> LocationVec;
|
||||||
|
|
||||||
struct OperatorLocation {
|
struct OperatorLocation {
|
||||||
@@ -253,8 +273,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Location> LocationVec;
|
typedef std::vector<Location> LocationVec;
|
||||||
|
|
||||||
struct SubLocation {
|
struct SubLocation {
|
||||||
@@ -270,6 +292,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string geoCode;
|
std::string geoCode;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -277,6 +300,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<OperatorLocation> locations;
|
std::vector<OperatorLocation> locations;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -356,8 +380,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Contact> ContactVec;
|
typedef std::vector<Contact> ContactVec;
|
||||||
|
|
||||||
struct OperatorContact {
|
struct OperatorContact {
|
||||||
@@ -379,6 +405,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -397,6 +424,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string accessPIN;
|
std::string accessPIN;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -404,6 +432,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<OperatorContact> contacts;
|
std::vector<OperatorContact> contacts;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -416,8 +445,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string configuration;
|
std::string configuration;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec;
|
typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec;
|
||||||
|
|
||||||
struct DeviceConfiguration {
|
struct DeviceConfiguration {
|
||||||
@@ -434,8 +465,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string subscriber;
|
std::string subscriber;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<DeviceConfiguration> DeviceConfigurationVec;
|
typedef std::vector<DeviceConfiguration> DeviceConfigurationVec;
|
||||||
|
|
||||||
struct InventoryTag {
|
struct InventoryTag {
|
||||||
@@ -459,6 +492,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool doNotAllowOverrides = false;
|
bool doNotAllowOverrides = false;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -468,6 +502,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
InventoryTagVec taglist;
|
InventoryTagVec taglist;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -478,6 +513,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
uint64_t errorCode;
|
uint64_t errorCode;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -486,6 +522,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::CountedMap tenants;
|
Types::CountedMap tenants;
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -495,6 +532,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string description;
|
std::string description;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -503,6 +541,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ExpandedUseEntry> entries;
|
std::vector<ExpandedUseEntry> entries;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -510,6 +549,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ExpandedUseEntryList> entries;
|
std::vector<ExpandedUseEntryList> entries;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -517,10 +557,13 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t list;
|
Types::UUIDvec_t list;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ACLACCESS { NONE = 0, READ = 1, MODIFY = 2, CREATE = 3, DELETE = 4 };
|
enum ACLACCESS {
|
||||||
|
NONE = 0, READ = 1, MODIFY = 2, CREATE = 3, DELETE = 4
|
||||||
|
};
|
||||||
|
|
||||||
struct ObjectACL {
|
struct ObjectACL {
|
||||||
UuidList users;
|
UuidList users;
|
||||||
@@ -528,6 +571,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
uint64_t access = (uint64_t) NONE;
|
uint64_t access = (uint64_t) NONE;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -535,6 +579,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ObjectACL> list;
|
std::vector<ObjectACL> list;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -549,6 +594,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string venue;
|
std::string venue;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -556,6 +602,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<Map> list;
|
std::vector<Map> list;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -585,6 +632,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string operatorId;
|
std::string operatorId;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -595,6 +643,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string value;
|
std::string value;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -602,6 +651,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<Variable> variables;
|
std::vector<Variable> variables;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -616,6 +666,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -623,6 +674,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<VariableBlock> variableBlocks;
|
std::vector<VariableBlock> variableBlocks;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -637,6 +689,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string registrationId;
|
std::string registrationId;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -644,6 +697,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<Operator> operators;
|
std::vector<Operator> operators;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -654,6 +708,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t devices;
|
Types::UUIDvec_t devices;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -669,6 +724,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool defaultService = false;
|
bool defaultService = false;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -676,6 +732,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ServiceClass> serviceClasses;
|
std::vector<ServiceClass> serviceClasses;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -686,6 +743,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string firmwareRCOnly{"inherit"};
|
std::string firmwareRCOnly{"inherit"};
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -710,6 +768,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string realMacAddress;
|
std::string realMacAddress;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -717,6 +776,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<SubscriberDevice> subscriberDevices;
|
std::vector<SubscriberDevice> subscriberDevices;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -729,6 +789,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::uint64_t modified;
|
std::uint64_t modified;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -738,12 +799,119 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ConfigurationOverride> overrides;
|
std::vector<ConfigurationOverride> overrides;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U,
|
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U,
|
||||||
ObjectInfo &I);
|
ObjectInfo &I);
|
||||||
|
|
||||||
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U,
|
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U,
|
||||||
ObjectInfo &I);
|
ObjectInfo &I);
|
||||||
|
|
||||||
bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
||||||
|
|
||||||
|
struct GLBLRAccountInfo {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string privateKey;
|
||||||
|
std::string country, province, city, organization, commonName;
|
||||||
|
std::string CSR, CSRPrivateKey, CSRPublicKey;
|
||||||
|
std::string GlobalReachAcctId;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GLBLRCertificateInfo {
|
||||||
|
std::string id;
|
||||||
|
std::string name;
|
||||||
|
std::string accountId;
|
||||||
|
std::string csr;
|
||||||
|
std::string certificate;
|
||||||
|
std::string certificateChain;
|
||||||
|
std::string certificateId;
|
||||||
|
std::uint64_t expiresAt = 0;
|
||||||
|
std::uint64_t created = 0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GooglOrionAccountInfo {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string privateKey;
|
||||||
|
std::string certificate;
|
||||||
|
std::vector<std::string> cacerts;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RADIUSServer {
|
||||||
|
std::string Hostname;
|
||||||
|
std::string IP;
|
||||||
|
std::uint64_t Port=0;
|
||||||
|
std::string Secret;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RADIUSEndPointRadiusType {
|
||||||
|
std::vector<RADIUSServer> Authentication;
|
||||||
|
std::vector<RADIUSServer> Accounting;
|
||||||
|
std::vector<RADIUSServer> CoA;
|
||||||
|
std::uint64_t AccountingInterval = 60;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RADIUSEndPointRadsecType {
|
||||||
|
std::string Hostname;
|
||||||
|
std::string IP;
|
||||||
|
std::uint64_t Port=2083;
|
||||||
|
std::string Secret{"radsec"};
|
||||||
|
std::string OpenRoamingType;
|
||||||
|
std::string UseOpenRoamingAccount;
|
||||||
|
std::uint64_t Weight=0;
|
||||||
|
std::string Certificate;
|
||||||
|
std::string PrivateKey;
|
||||||
|
std::vector<std::string> CaCerts;
|
||||||
|
bool AllowSelfSigned=false;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RADIUSEndPoint {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string Type{"radius"};
|
||||||
|
std::string PoolStrategy{"none"};
|
||||||
|
bool UseGWProxy=true;
|
||||||
|
std::string Index;
|
||||||
|
std::vector<std::string> UsedBy;
|
||||||
|
std::vector<RADIUSEndPointRadiusType> RadiusServers;
|
||||||
|
std::vector<RADIUSEndPointRadsecType> RadsecServers;
|
||||||
|
std::string NasIdentifier;
|
||||||
|
std::uint64_t AccountingInterval=600;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RADIUSEndpointUpdateStatus {
|
||||||
|
std::uint64_t lastUpdate=0;
|
||||||
|
std::uint64_t lastConfigurationChange=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
bool Read();
|
||||||
|
bool Save();
|
||||||
|
bool ChangeConfiguration();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
}; // namespace OpenWifi::ProvObjects
|
}; // namespace OpenWifi::ProvObjects
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace OpenWifi {
|
|||||||
Response.set("Connection", "keep-alive");
|
Response.set("Connection", "keep-alive");
|
||||||
Response.setVersion(Poco::Net::HTTPMessage::HTTP_1_1);
|
Response.setVersion(Poco::Net::HTTPMessage::HTTP_1_1);
|
||||||
std::ostream &Answer = Response.send();
|
std::ostream &Answer = Response.send();
|
||||||
Answer << "process Alive and kicking!";
|
Answer << ALBHealthCheckServer()->CallbackText();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ namespace OpenWifi {
|
|||||||
inline static std::atomic_uint64_t req_id_ = 1;
|
inline static std::atomic_uint64_t req_id_ = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef std::string ALBHealthMessageCallback();
|
||||||
|
|
||||||
class ALBHealthCheckServer : public SubSystemServer {
|
class ALBHealthCheckServer : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
ALBHealthCheckServer();
|
ALBHealthCheckServer();
|
||||||
@@ -48,10 +50,22 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
int Start() override;
|
int Start() override;
|
||||||
void Stop() override;
|
void Stop() override;
|
||||||
|
inline void RegisterExtendedHealthMessage(ALBHealthMessageCallback *F) {
|
||||||
|
Callback_=F;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline std::string CallbackText() {
|
||||||
|
if(Callback_== nullptr) {
|
||||||
|
return "process Alive and kicking!";
|
||||||
|
} else {
|
||||||
|
return Callback_();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<Poco::Net::HTTPServer> Server_;
|
std::unique_ptr<Poco::Net::HTTPServer> Server_;
|
||||||
std::unique_ptr<Poco::Net::ServerSocket> Socket_;
|
std::unique_ptr<Poco::Net::ServerSocket> Socket_;
|
||||||
|
ALBHealthMessageCallback *Callback_= nullptr;
|
||||||
int Port_ = 0;
|
int Port_ = 0;
|
||||||
mutable std::atomic_bool Running_ = false;
|
mutable std::atomic_bool Running_ = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,10 +11,12 @@
|
|||||||
|
|
||||||
#include "Poco/File.h"
|
#include "Poco/File.h"
|
||||||
#include "Poco/StreamCopier.h"
|
#include "Poco/StreamCopier.h"
|
||||||
|
#include "Poco/JSON/Object.h"
|
||||||
|
#include "Poco/JSON/Parser.h"
|
||||||
|
|
||||||
#include "framework/MicroServiceFuncs.h"
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
|
||||||
#include "nlohmann/json.hpp"
|
// #include "nlohmann/json.hpp"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -28,11 +30,11 @@ namespace OpenWifi {
|
|||||||
if (F.exists()) {
|
if (F.exists()) {
|
||||||
std::ostringstream OS;
|
std::ostringstream OS;
|
||||||
std::ifstream IF(FileName);
|
std::ifstream IF(FileName);
|
||||||
Poco::StreamCopier::copyStream(IF, OS);
|
Poco::JSON::Parser P;
|
||||||
Registry_ = nlohmann::json::parse(OS.str());
|
Registry_ = P.parse(IF).extract<Poco::JSON::Object::Ptr>();
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
Registry_ = nlohmann::json::parse("{}");
|
Registry_ = Poco::makeShared<Poco::JSON::Object>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,46 +46,39 @@ namespace OpenWifi {
|
|||||||
inline ~AppServiceRegistry() { Save(); }
|
inline ~AppServiceRegistry() { Save(); }
|
||||||
|
|
||||||
inline void Save() {
|
inline void Save() {
|
||||||
std::istringstream IS(to_string(Registry_));
|
|
||||||
std::ofstream OF;
|
std::ofstream OF;
|
||||||
OF.open(FileName, std::ios::binary | std::ios::trunc);
|
OF.open(FileName, std::ios::binary | std::ios::trunc);
|
||||||
Poco::StreamCopier::copyStream(IS, OF);
|
Registry_->stringify(OF);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Set(const char *Key, uint64_t Value) {
|
void Set(const char *key, const std::vector<std::string> &V) {
|
||||||
Registry_[Key] = Value;
|
Poco::JSON::Array Arr;
|
||||||
|
for(const auto &s:V) {
|
||||||
|
Arr.add(s);
|
||||||
|
}
|
||||||
|
Registry_->set(key,Arr);
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Set(const char *Key, const std::string &Value) {
|
template<class T> void Set(const char *key, const T &Value) {
|
||||||
Registry_[Key] = Value;
|
Registry_->set(key,Value);
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Set(const char *Key, bool Value) {
|
bool Get(const char *key, std::vector<std::string> &Value) {
|
||||||
Registry_[Key] = Value;
|
if(Registry_->has(key) && !Registry_->isNull(key) && Registry_->isArray(key)) {
|
||||||
Save();
|
auto Arr = Registry_->get(key);
|
||||||
|
for(const auto &v:Arr) {
|
||||||
|
Value.emplace_back(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Get(const char *Key, bool &Value) {
|
|
||||||
if (Registry_[Key].is_boolean()) {
|
|
||||||
Value = Registry_[Key].get<bool>();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Get(const char *Key, uint64_t &Value) {
|
template<class T> bool Get(const char *key, T &Value) {
|
||||||
if (Registry_[Key].is_number_unsigned()) {
|
if(Registry_->has(key) && !Registry_->isNull(key)) {
|
||||||
Value = Registry_[Key].get<uint64_t>();
|
Value = Registry_->getValue<T>(key);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool Get(const char *Key, std::string &Value) {
|
|
||||||
if (Registry_[Key].is_string()) {
|
|
||||||
Value = Registry_[Key].get<std::string>();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -91,7 +86,7 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::string FileName;
|
std::string FileName;
|
||||||
nlohmann::json Registry_;
|
Poco::JSON::Object::Ptr Registry_;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto AppServiceRegistry() { return AppServiceRegistry::instance(); }
|
inline auto AppServiceRegistry() { return AppServiceRegistry::instance(); }
|
||||||
|
|||||||
@@ -34,9 +34,17 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"strict": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"uuid": {
|
"uuid": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"public_ip_lookup": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-fqdn"
|
||||||
|
},
|
||||||
"unit": {
|
"unit": {
|
||||||
"$ref": "#/$defs/unit"
|
"$ref": "#/$defs/unit"
|
||||||
},
|
},
|
||||||
@@ -110,6 +118,20 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"random-password": {
|
"random-password": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
|
},
|
||||||
|
"beacon-advertisement": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"device-name": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"device-serial": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"network-id": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -218,6 +240,52 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"interface.ssid.encryption": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"proto": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"none",
|
||||||
|
"owe",
|
||||||
|
"owe-transition",
|
||||||
|
"psk",
|
||||||
|
"psk2",
|
||||||
|
"psk-mixed",
|
||||||
|
"psk2-radius",
|
||||||
|
"wpa",
|
||||||
|
"wpa2",
|
||||||
|
"wpa-mixed",
|
||||||
|
"sae",
|
||||||
|
"sae-mixed",
|
||||||
|
"wpa3",
|
||||||
|
"wpa3-192",
|
||||||
|
"wpa3-mixed"
|
||||||
|
],
|
||||||
|
"examples": [
|
||||||
|
"psk2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 63,
|
||||||
|
"minLength": 8
|
||||||
|
},
|
||||||
|
"ieee80211w": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"disabled",
|
||||||
|
"optional",
|
||||||
|
"required"
|
||||||
|
],
|
||||||
|
"default": "disabled"
|
||||||
|
},
|
||||||
|
"key-caching": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -634,26 +702,6 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uc-timeout",
|
"format": "uc-timeout",
|
||||||
"default": "6h"
|
"default": "6h"
|
||||||
},
|
|
||||||
"relay-server": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "ipv4",
|
|
||||||
"example": "192.168.2.1"
|
|
||||||
},
|
|
||||||
"circuit-id-format": {
|
|
||||||
"type": "string",
|
|
||||||
"example": [
|
|
||||||
"\\{Interface\\}:\\{VLAN-Id\\}:\\{SSID\\}:\\{Model\\}:\\{Name\\}:\\{AP-MAC\\}:\\{Location\\}",
|
|
||||||
"\\{AP-MAC\\};\\{SSID\\};\\{Crypto\\}",
|
|
||||||
"\\{Name\\} \\{ESSID\\}"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"remote-id-format": {
|
|
||||||
"type": "string",
|
|
||||||
"example": [
|
|
||||||
"\\{Client-MAC-hex\\} \\{SSID\\}",
|
|
||||||
"\\{AP-MAC-hex\\} \\{SSID\\}"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -732,7 +780,8 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"dynamic",
|
"dynamic",
|
||||||
"static"
|
"static",
|
||||||
|
"none"
|
||||||
],
|
],
|
||||||
"examples": [
|
"examples": [
|
||||||
"static"
|
"static"
|
||||||
@@ -1022,52 +1071,6 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"interface.ssid.encryption": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"proto": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"none",
|
|
||||||
"owe",
|
|
||||||
"owe-transition",
|
|
||||||
"psk",
|
|
||||||
"psk2",
|
|
||||||
"psk-mixed",
|
|
||||||
"psk2-radius",
|
|
||||||
"wpa",
|
|
||||||
"wpa2",
|
|
||||||
"wpa-mixed",
|
|
||||||
"sae",
|
|
||||||
"sae-mixed",
|
|
||||||
"wpa3",
|
|
||||||
"wpa3-192",
|
|
||||||
"wpa3-mixed"
|
|
||||||
],
|
|
||||||
"examples": [
|
|
||||||
"psk2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"key": {
|
|
||||||
"type": "string",
|
|
||||||
"maxLength": 63,
|
|
||||||
"minLength": 8
|
|
||||||
},
|
|
||||||
"ieee80211w": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"disabled",
|
|
||||||
"optional",
|
|
||||||
"required"
|
|
||||||
],
|
|
||||||
"default": "disabled"
|
|
||||||
},
|
|
||||||
"key-caching": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"interface.ssid.multi-psk": {
|
"interface.ssid.multi-psk": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -1232,6 +1235,32 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"secret"
|
"secret"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"secondary": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"host": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"examples": [
|
||||||
|
1812
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"request-attribute": {
|
"request-attribute": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@@ -1309,6 +1338,25 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"value": "Example Operator"
|
"value": "Example Operator"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 255,
|
||||||
|
"minimum": 1
|
||||||
|
},
|
||||||
|
"hex-value": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"id": 32,
|
||||||
|
"value": "0a0b0c0d"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1658,6 +1706,236 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"service.captive.click": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"auth-mode": {
|
||||||
|
"type": "string",
|
||||||
|
"const": "click-to-continue"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"service.captive.radius": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"auth-mode": {
|
||||||
|
"type": "string",
|
||||||
|
"const": "radius"
|
||||||
|
},
|
||||||
|
"auth-server": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"auth-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"default": 1812
|
||||||
|
},
|
||||||
|
"auth-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-server": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"default": 1812
|
||||||
|
},
|
||||||
|
"acct-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-interval": {
|
||||||
|
"type": "integer",
|
||||||
|
"default": 600
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"service.captive.credentials": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"auth-mode": {
|
||||||
|
"type": "string",
|
||||||
|
"const": "credentials"
|
||||||
|
},
|
||||||
|
"credentials": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"username": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"service.captive.uam": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"auth-mode": {
|
||||||
|
"type": "string",
|
||||||
|
"const": "uam"
|
||||||
|
},
|
||||||
|
"uam-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"default": 3990
|
||||||
|
},
|
||||||
|
"uam-secret": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uam-server": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"nasid": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"nasmac": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"auth-server": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"auth-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"default": 1812
|
||||||
|
},
|
||||||
|
"auth-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-server": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"default": 1812
|
||||||
|
},
|
||||||
|
"acct-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-interval": {
|
||||||
|
"type": "integer",
|
||||||
|
"default": 600
|
||||||
|
},
|
||||||
|
"ssid": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"mac-format": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"aabbccddeeff",
|
||||||
|
"aa-bb-cc-dd-ee-ff",
|
||||||
|
"aa:bb:cc:dd:ee:ff",
|
||||||
|
"AABBCCDDEEFF",
|
||||||
|
"AA:BB:CC:DD:EE:FF",
|
||||||
|
"AA-BB-CC-DD-EE-FF"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"final-redirect-url": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"default",
|
||||||
|
"uam"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mac-auth": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": "default"
|
||||||
|
},
|
||||||
|
"radius-gw-proxy": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"service.captive": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/$defs/service.captive.click"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$ref": "#/$defs/service.captive.radius"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$ref": "#/$defs/service.captive.credentials"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$ref": "#/$defs/service.captive.uam"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"walled-garden-fqdn": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"walled-garden-ipaddr": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-ip"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"web-root": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-base64"
|
||||||
|
},
|
||||||
|
"idle-timeout": {
|
||||||
|
"type": "integer",
|
||||||
|
"default": 600
|
||||||
|
},
|
||||||
|
"session-timeout": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"interface.ssid": {
|
"interface.ssid": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -1710,6 +1988,10 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"isolate-clients": {
|
"isolate-clients": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
"strict-forwarding": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"power-save": {
|
"power-save": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
@@ -1757,6 +2039,11 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
|
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"tip-information-element": {
|
||||||
|
"decription": "The device will broadcast the TIP vendor IE inside its beacons if this option is enabled.",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
"fils-discovery-interval": {
|
"fils-discovery-interval": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"default": 20,
|
"default": 20,
|
||||||
@@ -1778,8 +2065,15 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"$ref": "#/$defs/interface.ssid.rate-limit"
|
"$ref": "#/$defs/interface.ssid.rate-limit"
|
||||||
},
|
},
|
||||||
"roaming": {
|
"roaming": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
"$ref": "#/$defs/interface.ssid.roaming"
|
"$ref": "#/$defs/interface.ssid.roaming"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"radius": {
|
"radius": {
|
||||||
"$ref": "#/$defs/interface.ssid.radius"
|
"$ref": "#/$defs/interface.ssid.radius"
|
||||||
},
|
},
|
||||||
@@ -1795,6 +2089,9 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"access-control-list": {
|
"access-control-list": {
|
||||||
"$ref": "#/$defs/interface.ssid.acl"
|
"$ref": "#/$defs/interface.ssid.acl"
|
||||||
},
|
},
|
||||||
|
"captive": {
|
||||||
|
"$ref": "#/$defs/service.captive"
|
||||||
|
},
|
||||||
"hostapd-bss-raw": {
|
"hostapd-bss-raw": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@@ -1962,6 +2259,17 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vlan-awareness": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"first": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"last": {
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"vlan": {
|
"vlan": {
|
||||||
"$ref": "#/$defs/interface.vlan"
|
"$ref": "#/$defs/interface.vlan"
|
||||||
},
|
},
|
||||||
@@ -2084,6 +2392,10 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"examples": [
|
"examples": [
|
||||||
"01234567890123456789012345678901"
|
"01234567890123456789012345678901"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"mutual-tls": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2155,6 +2467,24 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
|
"mode": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"radius",
|
||||||
|
"user"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"port-filter": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
{
|
||||||
|
"LAN1": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"server-certificate": {
|
"server-certificate": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
@@ -2166,6 +2496,77 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/$defs/interface.ssid.radius.local-user"
|
"$ref": "#/$defs/interface.ssid.radius.local-user"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"radius": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"nas-identifier": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"auth-server-addr": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"auth-server-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"examples": [
|
||||||
|
1812
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"auth-server-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-server-addr": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-server-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"examples": [
|
||||||
|
1813
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"acct-server-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"coa-server-addr": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-host",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"coa-server-port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"examples": [
|
||||||
|
1814
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"coa-server-secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2489,6 +2890,12 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"services": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
"classifier": {
|
"classifier": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@@ -2693,236 +3100,6 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"service.captive.click": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"auth-mode": {
|
|
||||||
"type": "string",
|
|
||||||
"const": "click-to-continue"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"service.captive.radius": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"auth-mode": {
|
|
||||||
"type": "string",
|
|
||||||
"const": "radius"
|
|
||||||
},
|
|
||||||
"auth-server": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uc-host",
|
|
||||||
"examples": [
|
|
||||||
"192.168.1.10"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"auth-port": {
|
|
||||||
"type": "integer",
|
|
||||||
"maximum": 65535,
|
|
||||||
"minimum": 1024,
|
|
||||||
"default": 1812
|
|
||||||
},
|
|
||||||
"auth-secret": {
|
|
||||||
"type": "string",
|
|
||||||
"examples": [
|
|
||||||
"secret"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"acct-server": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uc-host",
|
|
||||||
"examples": [
|
|
||||||
"192.168.1.10"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"acct-port": {
|
|
||||||
"type": "integer",
|
|
||||||
"maximum": 65535,
|
|
||||||
"minimum": 1024,
|
|
||||||
"default": 1812
|
|
||||||
},
|
|
||||||
"acct-secret": {
|
|
||||||
"type": "string",
|
|
||||||
"examples": [
|
|
||||||
"secret"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"acct-interval": {
|
|
||||||
"type": "integer",
|
|
||||||
"default": 600
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"service.captive.credentials": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"auth-mode": {
|
|
||||||
"type": "string",
|
|
||||||
"const": "credentials"
|
|
||||||
},
|
|
||||||
"credentials": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"username": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"password": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"service.captive.uam": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"auth-mode": {
|
|
||||||
"type": "string",
|
|
||||||
"const": "uam"
|
|
||||||
},
|
|
||||||
"uam-port": {
|
|
||||||
"type": "integer",
|
|
||||||
"maximum": 65535,
|
|
||||||
"minimum": 1024,
|
|
||||||
"default": 3990
|
|
||||||
},
|
|
||||||
"uam-secret": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"uam-server": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"nasid": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"nasmac": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"auth-server": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uc-host",
|
|
||||||
"examples": [
|
|
||||||
"192.168.1.10"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"auth-port": {
|
|
||||||
"type": "integer",
|
|
||||||
"maximum": 65535,
|
|
||||||
"minimum": 1024,
|
|
||||||
"default": 1812
|
|
||||||
},
|
|
||||||
"auth-secret": {
|
|
||||||
"type": "string",
|
|
||||||
"examples": [
|
|
||||||
"secret"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"acct-server": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uc-host",
|
|
||||||
"examples": [
|
|
||||||
"192.168.1.10"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"acct-port": {
|
|
||||||
"type": "integer",
|
|
||||||
"maximum": 65535,
|
|
||||||
"minimum": 1024,
|
|
||||||
"default": 1812
|
|
||||||
},
|
|
||||||
"acct-secret": {
|
|
||||||
"type": "string",
|
|
||||||
"examples": [
|
|
||||||
"secret"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"acct-interval": {
|
|
||||||
"type": "integer",
|
|
||||||
"default": 600
|
|
||||||
},
|
|
||||||
"ssid": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"mac-format": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"aabbccddeeff",
|
|
||||||
"aa-bb-cc-dd-ee-ff",
|
|
||||||
"aa:bb:cc:dd:ee:ff",
|
|
||||||
"AABBCCDDEEFF",
|
|
||||||
"AA:BB:CC:DD:EE:FF",
|
|
||||||
"AA-BB-CC-DD-EE-FF"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"final-redirect-url": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"default",
|
|
||||||
"uam"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"mac-auth": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": "default"
|
|
||||||
},
|
|
||||||
"radius-gw-proxy": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"service.captive": {
|
|
||||||
"allOf": [
|
|
||||||
{
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"$ref": "#/$defs/service.captive.click"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "#/$defs/service.captive.radius"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "#/$defs/service.captive.credentials"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "#/$defs/service.captive.uam"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"walled-garden-fqdn": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walled-garden-ipaddr": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uc-ip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"web-root": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "uc-base64"
|
|
||||||
},
|
|
||||||
"idle-timeout": {
|
|
||||||
"type": "integer",
|
|
||||||
"default": 600
|
|
||||||
},
|
|
||||||
"session-timeout": {
|
|
||||||
"type": "integer"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"service.gps": {
|
"service.gps": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -2941,6 +3118,50 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"service.dhcp-relay": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"select-ports": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"vlans": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"vlan": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"relay-server": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-ip"
|
||||||
|
},
|
||||||
|
"circuit-id-format": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"vlan-id",
|
||||||
|
"ap-mac",
|
||||||
|
"ssid"
|
||||||
|
],
|
||||||
|
"default": "vlan-id"
|
||||||
|
},
|
||||||
|
"remote-id-format": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"vlan-id",
|
||||||
|
"ap-mac",
|
||||||
|
"ssid"
|
||||||
|
],
|
||||||
|
"default": "ap-mac"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"service": {
|
"service": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -3000,6 +3221,9 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
},
|
},
|
||||||
"gps": {
|
"gps": {
|
||||||
"$ref": "#/$defs/service.gps"
|
"$ref": "#/$defs/service.gps"
|
||||||
|
},
|
||||||
|
"dhcp-relay": {
|
||||||
|
"$ref": "#/$defs/service.dhcp-relay"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,23 +9,21 @@
|
|||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
EventBusManager::EventBusManager(Poco::Logger &L) : Logger_(L) {}
|
|
||||||
|
|
||||||
void EventBusManager::run() {
|
void EventBusManager::run() {
|
||||||
Running_ = true;
|
Running_ = true;
|
||||||
Utils::SetThreadName("fmwk:EventMgr");
|
Utils::SetThreadName("fmwk:EventMgr");
|
||||||
auto Msg = std::make_shared<std::string>(MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN));
|
auto Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN));
|
||||||
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
|
||||||
false);
|
false);
|
||||||
while (Running_) {
|
while (Running_) {
|
||||||
Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer());
|
Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer());
|
||||||
if (!Running_)
|
if (!Running_)
|
||||||
break;
|
break;
|
||||||
Msg = std::make_shared<std::string>(MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE));
|
Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE));
|
||||||
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(),
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(),
|
||||||
Msg, false);
|
Msg, false);
|
||||||
}
|
}
|
||||||
Msg = std::make_shared<std::string>(MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE));
|
Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE));
|
||||||
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
|
||||||
false);
|
false);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,6 +12,16 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class EventBusManager : public Poco::Runnable {
|
class EventBusManager : public Poco::Runnable {
|
||||||
public:
|
public:
|
||||||
|
EventBusManager() :
|
||||||
|
Logger_(Poco::Logger::create(
|
||||||
|
"EventBusManager", Poco::Logger::root().getChannel(), Poco::Logger::root().getLevel())) {
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto instance() {
|
||||||
|
static auto instance_ = new EventBusManager;
|
||||||
|
return instance_;
|
||||||
|
}
|
||||||
|
|
||||||
explicit EventBusManager(Poco::Logger &L);
|
explicit EventBusManager(Poco::Logger &L);
|
||||||
void run() final;
|
void run() final;
|
||||||
void Start();
|
void Start();
|
||||||
@@ -24,4 +34,6 @@ namespace OpenWifi {
|
|||||||
Poco::Logger &Logger_;
|
Poco::Logger &Logger_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline auto EventBusManager() { return EventBusManager::instance(); }
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "fmt/format.h"
|
#include "fmt/format.h"
|
||||||
#include "framework/MicroServiceFuncs.h"
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
#include "cppkafka/utils/consumer_dispatcher.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -99,9 +100,12 @@ namespace OpenWifi {
|
|||||||
try {
|
try {
|
||||||
auto Msg = dynamic_cast<KafkaMessage *>(Note.get());
|
auto Msg = dynamic_cast<KafkaMessage *>(Note.get());
|
||||||
if (Msg != nullptr) {
|
if (Msg != nullptr) {
|
||||||
Producer.produce(cppkafka::MessageBuilder(Msg->Topic())
|
auto NewMessage = cppkafka::MessageBuilder(Msg->Topic());
|
||||||
.key(Msg->Key())
|
NewMessage.key(Msg->Key());
|
||||||
.payload(Msg->Payload()));
|
NewMessage.partition(0);
|
||||||
|
NewMessage.payload(Msg->Payload());
|
||||||
|
Producer.produce(NewMessage);
|
||||||
|
Producer.flush();
|
||||||
}
|
}
|
||||||
} catch (const cppkafka::HandleException &E) {
|
} catch (const cppkafka::HandleException &E) {
|
||||||
poco_warning(Logger_,
|
poco_warning(Logger_,
|
||||||
@@ -156,43 +160,49 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
bool AutoCommit = MicroServiceConfigGetBool("openwifi.kafka.auto.commit", false);
|
// bool AutoCommit = MicroServiceConfigGetBool("openwifi.kafka.auto.commit", false);
|
||||||
auto BatchSize = MicroServiceConfigGetInt("openwifi.kafka.consumer.batchsize", 20);
|
// auto BatchSize = MicroServiceConfigGetInt("openwifi.kafka.consumer.batchsize", 100);
|
||||||
|
|
||||||
Types::StringVec Topics;
|
Types::StringVec Topics;
|
||||||
KafkaManager()->Topics(Topics);
|
std::for_each(Topics_.begin(),Topics_.end(),
|
||||||
|
[&](const std::string & T) { Topics.emplace_back(T); });
|
||||||
Consumer.subscribe(Topics);
|
Consumer.subscribe(Topics);
|
||||||
|
|
||||||
Running_ = true;
|
Running_ = true;
|
||||||
while (Running_) {
|
std::vector<cppkafka::Message> MsgVec;
|
||||||
|
|
||||||
|
Dispatcher_ = std::make_unique<cppkafka::ConsumerDispatcher>(Consumer);
|
||||||
|
|
||||||
|
Dispatcher_->run(
|
||||||
|
// Callback executed whenever a new message is consumed
|
||||||
|
[&](cppkafka::Message msg) {
|
||||||
|
// Print the key (if any)
|
||||||
|
std::lock_guard G(ConsumerMutex_);
|
||||||
|
auto It = Notifiers_.find(msg.get_topic());
|
||||||
|
if (It != Notifiers_.end()) {
|
||||||
|
const auto &FL = It->second;
|
||||||
|
for (const auto &[CallbackFunc, _] : FL) {
|
||||||
try {
|
try {
|
||||||
std::vector<cppkafka::Message> MsgVec =
|
CallbackFunc(msg.get_key(), msg.get_payload());
|
||||||
Consumer.poll_batch(BatchSize, std::chrono::milliseconds(100));
|
|
||||||
for (auto const &Msg : MsgVec) {
|
|
||||||
if (!Msg)
|
|
||||||
continue;
|
|
||||||
if (Msg.get_error()) {
|
|
||||||
if (!Msg.is_eof()) {
|
|
||||||
poco_error(Logger_,
|
|
||||||
fmt::format("Error: {}", Msg.get_error().to_string()));
|
|
||||||
}
|
|
||||||
if (!AutoCommit)
|
|
||||||
Consumer.async_commit(Msg);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
KafkaManager()->Dispatch(Msg.get_topic().c_str(), Msg.get_key(), std::make_shared<std::string>(Msg.get_payload()));
|
|
||||||
if (!AutoCommit)
|
|
||||||
Consumer.async_commit(Msg);
|
|
||||||
}
|
|
||||||
} catch (const cppkafka::HandleException &E) {
|
|
||||||
poco_warning(Logger_,
|
|
||||||
fmt::format("Caught a Kafka exception (consumer): {}", E.what()));
|
|
||||||
} catch(const Poco::Exception &E) {
|
} catch(const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
poco_error(Logger_, "std::exception");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
Consumer.commit(msg);
|
||||||
|
},
|
||||||
|
// Whenever there's an error (other than the EOF soft error)
|
||||||
|
[&Logger_](cppkafka::Error error) {
|
||||||
|
poco_warning(Logger_,fmt::format("Error: {}", error.to_string()));
|
||||||
|
},
|
||||||
|
// Whenever EOF is reached on a partition, print this
|
||||||
|
[&Logger_](cppkafka::ConsumerDispatcher::EndOfFile, const cppkafka::TopicPartition& topic_partition) {
|
||||||
|
poco_debug(Logger_,fmt::format("Partition {} EOF", topic_partition.get_partition()));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
Consumer.unsubscribe();
|
Consumer.unsubscribe();
|
||||||
poco_information(Logger_, "Stopped...");
|
poco_information(Logger_, "Stopped...");
|
||||||
}
|
}
|
||||||
@@ -213,14 +223,13 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void KafkaProducer::Produce(const char *Topic, const std::string &Key,
|
void KafkaProducer::Produce(const char *Topic, const std::string &Key,
|
||||||
const std::shared_ptr<std::string> Payload) {
|
const std::string &Payload) {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
|
Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaConsumer::Start() {
|
void KafkaConsumer::Start() {
|
||||||
if (!Running_) {
|
if (!Running_) {
|
||||||
Running_ = true;
|
|
||||||
Worker_.start(*this);
|
Worker_.start(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -228,29 +237,16 @@ namespace OpenWifi {
|
|||||||
void KafkaConsumer::Stop() {
|
void KafkaConsumer::Stop() {
|
||||||
if (Running_) {
|
if (Running_) {
|
||||||
Running_ = false;
|
Running_ = false;
|
||||||
Worker_.wakeUp();
|
if(Dispatcher_) {
|
||||||
|
Dispatcher_->stop();
|
||||||
|
}
|
||||||
Worker_.join();
|
Worker_.join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaDispatcher::Start() {
|
std::uint64_t KafkaConsumer::RegisterTopicWatcher(const std::string &Topic,
|
||||||
if (!Running_) {
|
|
||||||
Running_ = true;
|
|
||||||
Worker_.start(*this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void KafkaDispatcher::Stop() {
|
|
||||||
if (Running_) {
|
|
||||||
Running_ = false;
|
|
||||||
Queue_.wakeUpAll();
|
|
||||||
Worker_.join();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto KafkaDispatcher::RegisterTopicWatcher(const std::string &Topic,
|
|
||||||
Types::TopicNotifyFunction &F) {
|
Types::TopicNotifyFunction &F) {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(ConsumerMutex_);
|
||||||
auto It = Notifiers_.find(Topic);
|
auto It = Notifiers_.find(Topic);
|
||||||
if (It == Notifiers_.end()) {
|
if (It == Notifiers_.end()) {
|
||||||
Types::TopicNotifyFunctionList L;
|
Types::TopicNotifyFunctionList L;
|
||||||
@@ -259,11 +255,12 @@ namespace OpenWifi {
|
|||||||
} else {
|
} else {
|
||||||
It->second.emplace(It->second.end(), std::make_pair(F, FunctionId_));
|
It->second.emplace(It->second.end(), std::make_pair(F, FunctionId_));
|
||||||
}
|
}
|
||||||
|
Topics_.insert(Topic);
|
||||||
return FunctionId_++;
|
return FunctionId_++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaDispatcher::UnregisterTopicWatcher(const std::string &Topic, int Id) {
|
void KafkaConsumer::UnregisterTopicWatcher(const std::string &Topic, int Id) {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(ConsumerMutex_);
|
||||||
auto It = Notifiers_.find(Topic);
|
auto It = Notifiers_.find(Topic);
|
||||||
if (It != Notifiers_.end()) {
|
if (It != Notifiers_.end()) {
|
||||||
Types::TopicNotifyFunctionList &L = It->second;
|
Types::TopicNotifyFunctionList &L = It->second;
|
||||||
@@ -275,56 +272,17 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaDispatcher::Dispatch(const char *Topic, const std::string &Key,
|
|
||||||
const std::shared_ptr<std::string> Payload) {
|
|
||||||
std::lock_guard G(Mutex_);
|
|
||||||
auto It = Notifiers_.find(Topic);
|
|
||||||
if (It != Notifiers_.end()) {
|
|
||||||
Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void KafkaDispatcher::run() {
|
|
||||||
Poco::Logger &Logger_ =
|
|
||||||
Poco::Logger::create("KAFKA-DISPATCHER", KafkaManager()->Logger().getChannel());
|
|
||||||
poco_information(Logger_, "Starting...");
|
|
||||||
Poco::AutoPtr<Poco::Notification> Note(Queue_.waitDequeueNotification());
|
|
||||||
Utils::SetThreadName("kafka:dispatch");
|
|
||||||
while (Note && Running_) {
|
|
||||||
auto Msg = dynamic_cast<KafkaMessage *>(Note.get());
|
|
||||||
if (Msg != nullptr) {
|
|
||||||
auto It = Notifiers_.find(Msg->Topic());
|
|
||||||
if (It != Notifiers_.end()) {
|
|
||||||
const auto &FL = It->second;
|
|
||||||
for (const auto &[CallbackFunc, _] : FL) {
|
|
||||||
CallbackFunc(Msg->Key(), Msg->Payload());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Note = Queue_.waitDequeueNotification();
|
|
||||||
}
|
|
||||||
poco_information(Logger_, "Stopped...");
|
|
||||||
}
|
|
||||||
|
|
||||||
void KafkaDispatcher::Topics(std::vector<std::string> &T) {
|
|
||||||
T.clear();
|
|
||||||
for (const auto &[TopicName, _] : Notifiers_)
|
|
||||||
T.push_back(TopicName);
|
|
||||||
}
|
|
||||||
|
|
||||||
int KafkaManager::Start() {
|
int KafkaManager::Start() {
|
||||||
if (!KafkaEnabled_)
|
if (!KafkaEnabled_)
|
||||||
return 0;
|
return 0;
|
||||||
ConsumerThr_.Start();
|
ConsumerThr_.Start();
|
||||||
ProducerThr_.Start();
|
ProducerThr_.Start();
|
||||||
Dispatcher_.Start();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaManager::Stop() {
|
void KafkaManager::Stop() {
|
||||||
if (KafkaEnabled_) {
|
if (KafkaEnabled_) {
|
||||||
poco_information(Logger(), "Stopping...");
|
poco_information(Logger(), "Stopping...");
|
||||||
Dispatcher_.Stop();
|
|
||||||
ProducerThr_.Stop();
|
ProducerThr_.Stop();
|
||||||
ConsumerThr_.Stop();
|
ConsumerThr_.Stop();
|
||||||
poco_information(Logger(), "Stopped...");
|
poco_information(Logger(), "Stopped...");
|
||||||
@@ -333,38 +291,25 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void KafkaManager::PostMessage(const char *topic, const std::string &key,
|
void KafkaManager::PostMessage(const char *topic, const std::string &key,
|
||||||
const std::shared_ptr<std::string> PayLoad, bool WrapMessage) {
|
const std::string & PayLoad, bool WrapMessage) {
|
||||||
if (KafkaEnabled_) {
|
if (KafkaEnabled_) {
|
||||||
ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(PayLoad) : PayLoad);
|
ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(PayLoad) : PayLoad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaManager::Dispatch(const char *Topic, const std::string &Key,
|
void KafkaManager::PostMessage(const char *topic, const std::string &key,
|
||||||
const std::shared_ptr<std::string> Payload) {
|
const Poco::JSON::Object &Object, bool WrapMessage) {
|
||||||
Dispatcher_.Dispatch(Topic, Key, Payload);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] const std::shared_ptr<std::string> KafkaManager::WrapSystemId(const std::shared_ptr<std::string> PayLoad) {
|
|
||||||
*PayLoad = SystemInfoWrapper_ + *PayLoad + "}";
|
|
||||||
return PayLoad;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t KafkaManager::RegisterTopicWatcher(const std::string &Topic,
|
|
||||||
Types::TopicNotifyFunction &F) {
|
|
||||||
if (KafkaEnabled_) {
|
if (KafkaEnabled_) {
|
||||||
return Dispatcher_.RegisterTopicWatcher(Topic, F);
|
std::ostringstream ObjectStr;
|
||||||
} else {
|
Object.stringify(ObjectStr);
|
||||||
return 0;
|
ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(ObjectStr.str()) : ObjectStr.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KafkaManager::UnregisterTopicWatcher(const std::string &Topic, uint64_t Id) {
|
[[nodiscard]] std::string KafkaManager::WrapSystemId(const std::string & PayLoad) {
|
||||||
if (KafkaEnabled_) {
|
return fmt::format( R"lit({{ "system" : {{ "id" : {}, "host" : "{}" }}, "payload" : {} }})lit",
|
||||||
Dispatcher_.UnregisterTopicWatcher(Topic, Id);
|
MicroServiceID(), MicroServicePrivateEndPoint(), PayLoad ) ;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void KafkaManager::Topics(std::vector<std::string> &T) { Dispatcher_.Topics(T); }
|
|
||||||
|
|
||||||
void KafkaManager::PartitionAssignment(const cppkafka::TopicPartitionList &partitions) {
|
void KafkaManager::PartitionAssignment(const cppkafka::TopicPartitionList &partitions) {
|
||||||
poco_information(
|
poco_information(
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "Poco/Notification.h"
|
#include "Poco/Notification.h"
|
||||||
#include "Poco/NotificationQueue.h"
|
#include "Poco/NotificationQueue.h"
|
||||||
|
#include "Poco/JSON/Object.h"
|
||||||
#include "framework/KafkaTopics.h"
|
#include "framework/KafkaTopics.h"
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "framework/SubSystemServer.h"
|
#include "framework/SubSystemServer.h"
|
||||||
@@ -18,17 +18,17 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class KafkaMessage : public Poco::Notification {
|
class KafkaMessage : public Poco::Notification {
|
||||||
public:
|
public:
|
||||||
KafkaMessage(const char * Topic, const std::string &Key, const std::shared_ptr<std::string> Payload)
|
KafkaMessage(const char * Topic, const std::string &Key, const std::string &Payload)
|
||||||
: Topic_(Topic), Key_(Key), Payload_(std::move(Payload)) {}
|
: Topic_(Topic), Key_(Key), Payload_(Payload) {}
|
||||||
|
|
||||||
inline const char * Topic() { return Topic_; }
|
inline const char * Topic() { return Topic_; }
|
||||||
inline const std::string &Key() { return Key_; }
|
inline const std::string &Key() { return Key_; }
|
||||||
inline const std::string &Payload() { return *Payload_; }
|
inline const std::string &Payload() { return Payload_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char *Topic_;
|
const char *Topic_;
|
||||||
std::string Key_;
|
std::string Key_;
|
||||||
std::shared_ptr<std::string> Payload_;
|
std::string Payload_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class KafkaProducer : public Poco::Runnable {
|
class KafkaProducer : public Poco::Runnable {
|
||||||
@@ -36,10 +36,10 @@ namespace OpenWifi {
|
|||||||
void run() override;
|
void run() override;
|
||||||
void Start();
|
void Start();
|
||||||
void Stop();
|
void Stop();
|
||||||
void Produce(const char *Topic, const std::string &Key, const std::shared_ptr<std::string> Payload);
|
void Produce(const char *Topic, const std::string &Key, const std::string & Payload);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::recursive_mutex Mutex_;
|
std::mutex Mutex_;
|
||||||
Poco::Thread Worker_;
|
Poco::Thread Worker_;
|
||||||
mutable std::atomic_bool Running_ = false;
|
mutable std::atomic_bool Running_ = false;
|
||||||
Poco::NotificationQueue Queue_;
|
Poco::NotificationQueue Queue_;
|
||||||
@@ -47,33 +47,22 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class KafkaConsumer : public Poco::Runnable {
|
class KafkaConsumer : public Poco::Runnable {
|
||||||
public:
|
public:
|
||||||
void run() override;
|
|
||||||
void Start();
|
void Start();
|
||||||
void Stop();
|
void Stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::recursive_mutex Mutex_;
|
std::mutex ConsumerMutex_;
|
||||||
Poco::Thread Worker_;
|
|
||||||
mutable std::atomic_bool Running_ = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
class KafkaDispatcher : public Poco::Runnable {
|
|
||||||
public:
|
|
||||||
void Start();
|
|
||||||
void Stop();
|
|
||||||
auto RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
|
|
||||||
void UnregisterTopicWatcher(const std::string &Topic, int Id);
|
|
||||||
void Dispatch(const char *Topic, const std::string &Key, const std::shared_ptr<std::string> Payload);
|
|
||||||
void run() override;
|
|
||||||
void Topics(std::vector<std::string> &T);
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::recursive_mutex Mutex_;
|
|
||||||
Types::NotifyTable Notifiers_;
|
Types::NotifyTable Notifiers_;
|
||||||
Poco::Thread Worker_;
|
Poco::Thread Worker_;
|
||||||
mutable std::atomic_bool Running_ = false;
|
mutable std::atomic_bool Running_ = false;
|
||||||
uint64_t FunctionId_ = 1;
|
uint64_t FunctionId_ = 1;
|
||||||
Poco::NotificationQueue Queue_;
|
std::unique_ptr<cppkafka::ConsumerDispatcher> Dispatcher_;
|
||||||
|
std::set<std::string> Topics_;
|
||||||
|
|
||||||
|
void run() override;
|
||||||
|
friend class KafkaManager;
|
||||||
|
std::uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
|
||||||
|
void UnregisterTopicWatcher(const std::string &Topic, int Id);
|
||||||
};
|
};
|
||||||
|
|
||||||
class KafkaManager : public SubSystemServer {
|
class KafkaManager : public SubSystemServer {
|
||||||
@@ -92,20 +81,24 @@ namespace OpenWifi {
|
|||||||
void Stop() override;
|
void Stop() override;
|
||||||
|
|
||||||
void PostMessage(const char *topic, const std::string &key,
|
void PostMessage(const char *topic, const std::string &key,
|
||||||
const std::shared_ptr<std::string> PayLoad, bool WrapMessage = true);
|
const std::string &PayLoad, bool WrapMessage = true);
|
||||||
void Dispatch(const char *Topic, const std::string &Key, const std::shared_ptr<std::string> Payload);
|
void PostMessage(const char *topic, const std::string &key,
|
||||||
[[nodiscard]] const std::shared_ptr<std::string> WrapSystemId(const std::shared_ptr<std::string> PayLoad);
|
const Poco::JSON::Object &Object, bool WrapMessage = true);
|
||||||
|
|
||||||
|
[[nodiscard]] std::string WrapSystemId(const std::string & PayLoad);
|
||||||
[[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; }
|
[[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; }
|
||||||
uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
|
inline std::uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F) {
|
||||||
void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id);
|
return ConsumerThr_.RegisterTopicWatcher(Topic,F);
|
||||||
void Topics(std::vector<std::string> &T);
|
}
|
||||||
|
inline void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id) {
|
||||||
|
return ConsumerThr_.UnregisterTopicWatcher(Topic,Id);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool KafkaEnabled_ = false;
|
bool KafkaEnabled_ = false;
|
||||||
std::string SystemInfoWrapper_;
|
std::string SystemInfoWrapper_;
|
||||||
KafkaProducer ProducerThr_;
|
KafkaProducer ProducerThr_;
|
||||||
KafkaConsumer ConsumerThr_;
|
KafkaConsumer ConsumerThr_;
|
||||||
KafkaDispatcher Dispatcher_;
|
|
||||||
|
|
||||||
void PartitionAssignment(const cppkafka::TopicPartitionList &partitions);
|
void PartitionAssignment(const cppkafka::TopicPartitionList &partitions);
|
||||||
void PartitionRevocation(const cppkafka::TopicPartitionList &partitions);
|
void PartitionRevocation(const cppkafka::TopicPartitionList &partitions);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace OpenWifi::KafkaTopics {
|
|||||||
inline const char * DEVICE_EVENT_QUEUE = "device_event_queue";
|
inline const char * DEVICE_EVENT_QUEUE = "device_event_queue";
|
||||||
inline const char * DEVICE_TELEMETRY = "device_telemetry";
|
inline const char * DEVICE_TELEMETRY = "device_telemetry";
|
||||||
inline const char * PROVISIONING_CHANGE = "provisioning_change";
|
inline const char * PROVISIONING_CHANGE = "provisioning_change";
|
||||||
|
inline const char * RRM = "rrm";
|
||||||
|
|
||||||
namespace ServiceEvents {
|
namespace ServiceEvents {
|
||||||
inline const char * EVENT_JOIN = "join";
|
inline const char * EVENT_JOIN = "join";
|
||||||
|
|||||||
@@ -33,9 +33,23 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
void MicroService::Exit(int Reason) { std::exit(Reason); }
|
void MicroService::Exit(int Reason) { std::exit(Reason); }
|
||||||
|
|
||||||
|
static std::string MakeServiceListString(const Types::MicroServiceMetaMap &Services) {
|
||||||
|
std::string SvcList;
|
||||||
|
for (const auto &Svc : Services) {
|
||||||
|
if (SvcList.empty())
|
||||||
|
SvcList = Svc.second.Type;
|
||||||
|
else
|
||||||
|
SvcList += ", " + Svc.second.Type;
|
||||||
|
}
|
||||||
|
return SvcList;
|
||||||
|
}
|
||||||
|
|
||||||
void MicroService::BusMessageReceived([[maybe_unused]] const std::string &Key,
|
void MicroService::BusMessageReceived([[maybe_unused]] const std::string &Key,
|
||||||
const std::string &Payload) {
|
const std::string &Payload) {
|
||||||
std::lock_guard G(InfraMutex_);
|
std::lock_guard G(InfraMutex_);
|
||||||
|
|
||||||
|
Poco::Logger &BusLogger = EventBusManager()->Logger();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Poco::JSON::Parser P;
|
Poco::JSON::Parser P;
|
||||||
auto Object = P.parse(Payload).extract<Poco::JSON::Object::Ptr>();
|
auto Object = P.parse(Payload).extract<Poco::JSON::Object::Ptr>();
|
||||||
@@ -55,13 +69,10 @@ namespace OpenWifi {
|
|||||||
Object->has(KafkaTopics::ServiceEvents::Fields::KEY)) {
|
Object->has(KafkaTopics::ServiceEvents::Fields::KEY)) {
|
||||||
auto PrivateEndPoint =
|
auto PrivateEndPoint =
|
||||||
Object->get(KafkaTopics::ServiceEvents::Fields::PRIVATE).toString();
|
Object->get(KafkaTopics::ServiceEvents::Fields::PRIVATE).toString();
|
||||||
if (Event == KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE &&
|
if (Event == KafkaTopics::ServiceEvents::EVENT_LEAVE) {
|
||||||
Services_.find(PrivateEndPoint) != Services_.end()) {
|
|
||||||
Services_[PrivateEndPoint].LastUpdate = Utils::Now();
|
|
||||||
} else if (Event == KafkaTopics::ServiceEvents::EVENT_LEAVE) {
|
|
||||||
Services_.erase(PrivateEndPoint);
|
Services_.erase(PrivateEndPoint);
|
||||||
poco_debug(
|
poco_information(
|
||||||
logger(),
|
BusLogger,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"Service {} ID={} leaving system.",
|
"Service {} ID={} leaving system.",
|
||||||
Object->get(KafkaTopics::ServiceEvents::Fields::PRIVATE)
|
Object->get(KafkaTopics::ServiceEvents::Fields::PRIVATE)
|
||||||
@@ -69,14 +80,7 @@ namespace OpenWifi {
|
|||||||
ID));
|
ID));
|
||||||
} else if (Event == KafkaTopics::ServiceEvents::EVENT_JOIN ||
|
} else if (Event == KafkaTopics::ServiceEvents::EVENT_JOIN ||
|
||||||
Event == KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE) {
|
Event == KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE) {
|
||||||
poco_debug(
|
auto ServiceInfo = Types::MicroServiceMeta{
|
||||||
logger(),
|
|
||||||
fmt::format(
|
|
||||||
"Service {} ID={} joining system.",
|
|
||||||
Object->get(KafkaTopics::ServiceEvents::Fields::PRIVATE)
|
|
||||||
.toString(),
|
|
||||||
ID));
|
|
||||||
Services_[PrivateEndPoint] = Types::MicroServiceMeta{
|
|
||||||
.Id = ID,
|
.Id = ID,
|
||||||
.Type = Poco::toLower(
|
.Type = Poco::toLower(
|
||||||
Object->get(KafkaTopics::ServiceEvents::Fields::TYPE)
|
Object->get(KafkaTopics::ServiceEvents::Fields::TYPE)
|
||||||
@@ -94,6 +98,22 @@ namespace OpenWifi {
|
|||||||
.toString(),
|
.toString(),
|
||||||
.LastUpdate = Utils::Now()};
|
.LastUpdate = Utils::Now()};
|
||||||
|
|
||||||
|
auto s1 = MakeServiceListString(Services_);
|
||||||
|
auto PreviousSize = Services_.size();
|
||||||
|
Services_[PrivateEndPoint] = ServiceInfo;
|
||||||
|
auto CurrentSize = Services_.size();
|
||||||
|
if(Event == KafkaTopics::ServiceEvents::EVENT_JOIN) {
|
||||||
|
if(!s1.empty()) {
|
||||||
|
poco_information(
|
||||||
|
BusLogger,
|
||||||
|
fmt::format(
|
||||||
|
"Service {} ID={} is joining the system.",
|
||||||
|
Object
|
||||||
|
->get(
|
||||||
|
KafkaTopics::ServiceEvents::Fields::PRIVATE)
|
||||||
|
.toString(),
|
||||||
|
ID));
|
||||||
|
}
|
||||||
std::string SvcList;
|
std::string SvcList;
|
||||||
for (const auto &Svc : Services_) {
|
for (const auto &Svc : Services_) {
|
||||||
if (SvcList.empty())
|
if (SvcList.empty())
|
||||||
@@ -102,12 +122,22 @@ namespace OpenWifi {
|
|||||||
SvcList += ", " + Svc.second.Type;
|
SvcList += ", " + Svc.second.Type;
|
||||||
}
|
}
|
||||||
poco_information(
|
poco_information(
|
||||||
logger(),
|
BusLogger,
|
||||||
fmt::format("Current list of microservices: {}", SvcList));
|
fmt::format("Current list of microservices: {}", SvcList));
|
||||||
|
} else if(CurrentSize!=PreviousSize) {
|
||||||
|
poco_information(
|
||||||
|
BusLogger,
|
||||||
|
fmt::format(
|
||||||
|
"Service {} ID={} is being added back in.",
|
||||||
|
Object
|
||||||
|
->get(KafkaTopics::ServiceEvents::Fields::PRIVATE)
|
||||||
|
.toString(),
|
||||||
|
ID));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
poco_error(
|
poco_information(
|
||||||
logger(),
|
BusLogger,
|
||||||
fmt::format("KAFKA-MSG: invalid event '{}', missing a field.",
|
fmt::format("KAFKA-MSG: invalid event '{}', missing a field.",
|
||||||
Event));
|
Event));
|
||||||
}
|
}
|
||||||
@@ -118,30 +148,39 @@ namespace OpenWifi {
|
|||||||
Object->get(KafkaTopics::ServiceEvents::Fields::TOKEN).toString());
|
Object->get(KafkaTopics::ServiceEvents::Fields::TOKEN).toString());
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
poco_error(
|
poco_information(
|
||||||
logger(),
|
BusLogger,
|
||||||
fmt::format("KAFKA-MSG: invalid event '{}', missing token", Event));
|
fmt::format("KAFKA-MSG: invalid event '{}', missing token", Event));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
poco_error(logger(),
|
poco_information(BusLogger,
|
||||||
fmt::format("Unknown Event: {} Source: {}", Event, ID));
|
fmt::format("Unknown Event: {} Source: {}", Event, ID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
poco_error(logger(), "Bad bus message.");
|
std::ostringstream os;
|
||||||
|
Object->stringify(std::cout);
|
||||||
|
poco_error(BusLogger, fmt::format("Bad bus message: {}", os.str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto i = Services_.begin();
|
auto ServiceHint = Services_.begin();
|
||||||
auto now = Utils::Now();
|
auto now = Utils::Now();
|
||||||
for (; i != Services_.end();) {
|
auto si1 = Services_.size();
|
||||||
if ((now - i->second.LastUpdate) > 60) {
|
auto ss1 = MakeServiceListString(Services_);
|
||||||
i = Services_.erase(i);
|
while(ServiceHint!=Services_.end()) {
|
||||||
|
if ((now - ServiceHint->second.LastUpdate) > 120) {
|
||||||
|
poco_information(BusLogger, fmt::format("ZombieService: Removing service {}, ", ServiceHint->second.PublicEndPoint));
|
||||||
|
ServiceHint = Services_.erase(ServiceHint);
|
||||||
} else
|
} else
|
||||||
++i;
|
++ServiceHint;
|
||||||
|
}
|
||||||
|
if(Services_.size() != si1) {
|
||||||
|
auto ss2 = MakeServiceListString(Services_);
|
||||||
|
poco_information(BusLogger, fmt::format("Current list of microservices: {} -> {}", ss1, ss2));
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
logger().log(E);
|
BusLogger.log(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,7 +449,7 @@ namespace OpenWifi {
|
|||||||
try {
|
try {
|
||||||
DataDir.createDirectory();
|
DataDir.createDirectory();
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
logger().log(E);
|
Logger_.log(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WWWAssetsDir_ = ConfigPath("openwifi.restapi.wwwassets", "");
|
WWWAssetsDir_ = ConfigPath("openwifi.restapi.wwwassets", "");
|
||||||
@@ -528,14 +567,12 @@ namespace OpenWifi {
|
|||||||
for (auto i : SubSystems_) {
|
for (auto i : SubSystems_) {
|
||||||
i->Start();
|
i->Start();
|
||||||
}
|
}
|
||||||
EventBusManager_ = std::make_unique<EventBusManager>(Poco::Logger::create(
|
EventBusManager()->Start();
|
||||||
"EventBusManager", Poco::Logger::root().getChannel(), Poco::Logger::root().getLevel()));
|
|
||||||
EventBusManager_->Start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MicroService::StopSubSystemServers() {
|
void MicroService::StopSubSystemServers() {
|
||||||
AddActivity("Stopping");
|
AddActivity("Stopping");
|
||||||
EventBusManager_->Stop();
|
EventBusManager()->Stop();
|
||||||
for (auto i = SubSystems_.rbegin(); i != SubSystems_.rend(); ++i) {
|
for (auto i = SubSystems_.rbegin(); i != SubSystems_.rend(); ++i) {
|
||||||
(*i)->Stop();
|
(*i)->Stop();
|
||||||
}
|
}
|
||||||
@@ -695,7 +732,7 @@ namespace OpenWifi {
|
|||||||
auto APIKEY = Request.get("X-API-KEY");
|
auto APIKEY = Request.get("X-API-KEY");
|
||||||
return APIKEY == MyHash_;
|
return APIKEY == MyHash_;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
logger().log(E);
|
Logger_.log(E);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,7 +201,6 @@ namespace OpenWifi {
|
|||||||
Poco::JWT::Signer Signer_;
|
Poco::JWT::Signer Signer_;
|
||||||
Poco::Logger &Logger_;
|
Poco::Logger &Logger_;
|
||||||
Poco::ThreadPool TimerPool_{"timer:pool", 2, 32};
|
Poco::ThreadPool TimerPool_{"timer:pool", 2, 32};
|
||||||
std::unique_ptr<EventBusManager> EventBusManager_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline MicroService *MicroService::instance_ = nullptr;
|
inline MicroService *MicroService::instance_ = nullptr;
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
#include "framework/MicroServiceFuncs.h"
|
#include "framework/MicroServiceFuncs.h"
|
||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
|
|
||||||
|
#include "framework/ALBserver.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
const std::string &MicroServiceDataDirectory() { return MicroService::instance().DataDir(); }
|
const std::string &MicroServiceDataDirectory() { return MicroService::instance().DataDir(); }
|
||||||
|
|
||||||
@@ -123,4 +125,12 @@ namespace OpenWifi {
|
|||||||
return MicroService::instance().AllowExternalMicroServices();
|
return MicroService::instance().AllowExternalMicroServices();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MicroServiceALBCallback( std::string Callback()) {
|
||||||
|
return ALBHealthCheckServer()->RegisterExtendedHealthMessage(Callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MicroServiceAccessKey() {
|
||||||
|
return MicroService::instance().Hash();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ namespace OpenWifi {
|
|||||||
std::string MicroServicePublicEndPoint();
|
std::string MicroServicePublicEndPoint();
|
||||||
std::string MicroServiceConfigGetString(const std::string &Key,
|
std::string MicroServiceConfigGetString(const std::string &Key,
|
||||||
const std::string &DefaultValue);
|
const std::string &DefaultValue);
|
||||||
|
std::string MicroServiceAccessKey();
|
||||||
bool MicroServiceConfigGetBool(const std::string &Key, bool DefaultValue);
|
bool MicroServiceConfigGetBool(const std::string &Key, bool DefaultValue);
|
||||||
std::uint64_t MicroServiceConfigGetInt(const std::string &Key, std::uint64_t DefaultValue);
|
std::uint64_t MicroServiceConfigGetInt(const std::string &Key, std::uint64_t DefaultValue);
|
||||||
std::string MicroServicePrivateEndPoint();
|
std::string MicroServicePrivateEndPoint();
|
||||||
@@ -53,4 +54,5 @@ namespace OpenWifi {
|
|||||||
std::string MicroServiceGetPublicAPIEndPoint();
|
std::string MicroServiceGetPublicAPIEndPoint();
|
||||||
void MicroServiceDeleteOverrideConfiguration();
|
void MicroServiceDeleteOverrideConfiguration();
|
||||||
bool AllowExternalMicroServices();
|
bool AllowExternalMicroServices();
|
||||||
|
void MicroServiceALBCallback( std::string Callback());
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ namespace OpenWifi::Types {
|
|||||||
typedef std::string UUID_t;
|
typedef std::string UUID_t;
|
||||||
typedef std::vector<UUID_t> UUIDvec_t;
|
typedef std::vector<UUID_t> UUIDvec_t;
|
||||||
typedef std::map<std::string, std::map<uint32_t, uint64_t>> Counted3DMapSII;
|
typedef std::map<std::string, std::map<uint32_t, uint64_t>> Counted3DMapSII;
|
||||||
|
typedef std::vector<int64_t> IntList;
|
||||||
|
typedef std::vector<uint64_t> UIntList;
|
||||||
|
typedef std::vector<double> DoubleList;
|
||||||
|
|
||||||
struct MicroServiceMeta {
|
struct MicroServiceMeta {
|
||||||
uint64_t Id = 0;
|
uint64_t Id = 0;
|
||||||
|
|||||||
@@ -574,6 +574,36 @@ namespace OpenWifi {
|
|||||||
Poco::JSON::Stringifier::stringify(Object, Answer);
|
Poco::JSON::Stringifier::stringify(Object, Answer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void ReturnObject(const std::vector<std::string> &Strings) {
|
||||||
|
Poco::JSON::Array Arr;
|
||||||
|
for(const auto &String:Strings) {
|
||||||
|
Arr.add(String);
|
||||||
|
}
|
||||||
|
std::ostringstream os;
|
||||||
|
Arr.stringify(os);
|
||||||
|
return ReturnRawJSON(os.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> void ReturnObject(const std::vector<T> &Objects) {
|
||||||
|
Poco::JSON::Array Arr;
|
||||||
|
for(const auto &Object:Objects) {
|
||||||
|
Poco::JSON::Object O;
|
||||||
|
Object.to_json(O);
|
||||||
|
Arr.add(O);
|
||||||
|
}
|
||||||
|
std::ostringstream os;
|
||||||
|
Arr.stringify(os);
|
||||||
|
return ReturnRawJSON(os.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> void ReturnObject(const T &Object) {
|
||||||
|
Poco::JSON::Object O;
|
||||||
|
Object.to_json(O);
|
||||||
|
std::ostringstream os;
|
||||||
|
O.stringify(os);
|
||||||
|
return ReturnRawJSON(os.str());
|
||||||
|
}
|
||||||
|
|
||||||
inline void ReturnRawJSON(const std::string &json_doc) {
|
inline void ReturnRawJSON(const std::string &json_doc) {
|
||||||
PrepareResponse();
|
PrepareResponse();
|
||||||
if (Request != nullptr) {
|
if (Request != nullptr) {
|
||||||
|
|||||||
@@ -24,9 +24,10 @@ namespace OpenWifi {
|
|||||||
Server, TransactionId, Internal) {}
|
Server, TransactionId, Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/system"}; }
|
static auto PathName() { return std::list<std::string>{"/api/v1/system"}; }
|
||||||
|
|
||||||
inline void DoGet() {
|
inline void DoGet() final {
|
||||||
std::string Arg;
|
std::string Arg;
|
||||||
if (HasParameter("command", Arg) && Arg == "info") {
|
if (HasParameter("command", Arg)) {
|
||||||
|
if (Arg == "info") {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
Answer.set(RESTAPI::Protocol::VERSION, MicroServiceVersion());
|
Answer.set(RESTAPI::Protocol::VERSION, MicroServiceVersion());
|
||||||
Answer.set(RESTAPI::Protocol::UPTIME, MicroServiceUptimeTotalSeconds());
|
Answer.set(RESTAPI::Protocol::UPTIME, MicroServiceUptimeTotalSeconds());
|
||||||
@@ -64,11 +65,23 @@ namespace OpenWifi {
|
|||||||
Answer.set("certificates", Certificates);
|
Answer.set("certificates", Certificates);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
}
|
}
|
||||||
if (GetBoolParameter("extraConfiguration")) {
|
if (Arg == "extraConfiguration") {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
MicroServiceGetExtraConfiguration(Answer);
|
MicroServiceGetExtraConfiguration(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
}
|
}
|
||||||
|
if (Arg == "resources") {
|
||||||
|
Poco::JSON::Object Answer;
|
||||||
|
Answer.set("numberOfFileDescriptors", Utils::get_open_fds());
|
||||||
|
std::uint64_t currRealMem, peakRealMem, currVirtMem, peakVirtMem;
|
||||||
|
Utils::getMemory(currRealMem, peakRealMem, currVirtMem, peakVirtMem);
|
||||||
|
Answer.set("currRealMem", currRealMem);
|
||||||
|
Answer.set("peakRealMem", peakRealMem);
|
||||||
|
Answer.set("currVirtMem", currVirtMem);
|
||||||
|
Answer.set("peakVirtMem", peakVirtMem);
|
||||||
|
return ReturnObject(Answer);
|
||||||
|
}
|
||||||
|
}
|
||||||
BadRequest(RESTAPI::Errors::InvalidCommand);
|
BadRequest(RESTAPI::Errors::InvalidCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,15 @@
|
|||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "framework/utils.h"
|
#include "framework/utils.h"
|
||||||
|
|
||||||
|
#include <RESTObjects/RESTAPI_SecurityObjects.h>
|
||||||
|
|
||||||
namespace OpenWifi::RESTAPI_utils {
|
namespace OpenWifi::RESTAPI_utils {
|
||||||
|
|
||||||
|
inline bool IsRootOrAdmin(const SecurityObjects::UserInfo &UI) {
|
||||||
|
return UI.userRole==SecurityObjects::ROOT ||
|
||||||
|
UI.userRole==SecurityObjects::ADMIN;
|
||||||
|
}
|
||||||
|
|
||||||
inline void EmbedDocument(const std::string &ObjName, Poco::JSON::Object &Obj,
|
inline void EmbedDocument(const std::string &ObjName, Poco::JSON::Object &Obj,
|
||||||
const std::string &ObjStr) {
|
const std::string &ObjStr) {
|
||||||
std::string D = ObjStr.empty() ? "{}" : ObjStr;
|
std::string D = ObjStr.empty() ? "{}" : ObjStr;
|
||||||
@@ -95,6 +102,20 @@ namespace OpenWifi::RESTAPI_utils {
|
|||||||
Obj.set(Field, A);
|
Obj.set(Field, A);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::DoubleList &V) {
|
||||||
|
Poco::JSON::Array A;
|
||||||
|
for (const auto &i : V)
|
||||||
|
A.add(i);
|
||||||
|
Obj.set(Field, A);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::IntList &V) {
|
||||||
|
Poco::JSON::Array A;
|
||||||
|
for (const auto &i : V)
|
||||||
|
A.add(i);
|
||||||
|
Obj.set(Field, A);
|
||||||
|
}
|
||||||
|
|
||||||
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::TagList &V) {
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::TagList &V) {
|
||||||
Poco::JSON::Array A;
|
Poco::JSON::Array A;
|
||||||
for (const auto &i : V)
|
for (const auto &i : V)
|
||||||
@@ -277,6 +298,28 @@ namespace OpenWifi::RESTAPI_utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
|
||||||
|
Types::DoubleList &Value) {
|
||||||
|
if (Obj->isArray(Field) && !Obj->isNull(Field)) {
|
||||||
|
Value.clear();
|
||||||
|
Poco::JSON::Array::Ptr A = Obj->getArray(Field);
|
||||||
|
for (const auto &i : *A) {
|
||||||
|
Value.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
|
||||||
|
Types::IntList &Value) {
|
||||||
|
if (Obj->isArray(Field) && !Obj->isNull(Field)) {
|
||||||
|
Value.clear();
|
||||||
|
Poco::JSON::Array::Ptr A = Obj->getArray(Field);
|
||||||
|
for (const auto &i : *A) {
|
||||||
|
Value.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
|
void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field,
|
||||||
std::vector<T> &Value) {
|
std::vector<T> &Value) {
|
||||||
|
|||||||
@@ -22,9 +22,8 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class StorageClass : public SubSystemServer {
|
class StorageClass : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
StorageClass() noexcept : SubSystemServer("StorageClass", "STORAGE-SVR", "storage") {}
|
|
||||||
|
|
||||||
int Start() override {
|
inline int Start() override {
|
||||||
std::lock_guard Guard(Mutex_);
|
std::lock_guard Guard(Mutex_);
|
||||||
|
|
||||||
Logger().notice("Starting.");
|
Logger().notice("Starting.");
|
||||||
@@ -40,17 +39,24 @@ namespace OpenWifi {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stop() override { Pool_->shutdown(); }
|
inline void Stop() override { Pool_->shutdown(); }
|
||||||
|
|
||||||
DBType Type() const { return dbType_; };
|
DBType Type() const { return dbType_; };
|
||||||
|
|
||||||
|
StorageClass() noexcept : SubSystemServer("StorageClass", "STORAGE-SVR", "storage") {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Data::SessionPool &Pool() { return *Pool_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline int Setup_SQLite();
|
inline int Setup_SQLite();
|
||||||
inline int Setup_MySQL();
|
inline int Setup_MySQL();
|
||||||
inline int Setup_PostgreSQL();
|
inline int Setup_PostgreSQL();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::unique_ptr<Poco::Data::SessionPool> Pool_;
|
std::shared_ptr<Poco::Data::SessionPool> Pool_;
|
||||||
Poco::Data::SQLite::Connector SQLiteConn_;
|
Poco::Data::SQLite::Connector SQLiteConn_;
|
||||||
Poco::Data::PostgreSQL::Connector PostgresConn_;
|
Poco::Data::PostgreSQL::Connector PostgresConn_;
|
||||||
Poco::Data::MySQL::Connector MySQLConn_;
|
Poco::Data::MySQL::Connector MySQLConn_;
|
||||||
@@ -81,7 +87,7 @@ namespace OpenWifi {
|
|||||||
// Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8,
|
// Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8,
|
||||||
// (int)NumSessions,
|
// (int)NumSessions,
|
||||||
// (int)IdleTime));
|
// (int)IdleTime));
|
||||||
Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_.name(), DBName, 8,
|
Pool_ = std::make_shared<Poco::Data::SessionPool>(SQLiteConn_.name(), DBName, 8,
|
||||||
(int)NumSessions, (int)IdleTime);
|
(int)NumSessions, (int)IdleTime);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -102,7 +108,7 @@ namespace OpenWifi {
|
|||||||
";compress=true;auto-reconnect=true";
|
";compress=true;auto-reconnect=true";
|
||||||
|
|
||||||
Poco::Data::MySQL::Connector::registerConnector();
|
Poco::Data::MySQL::Connector::registerConnector();
|
||||||
Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_.name(), ConnectionStr, 8,
|
Pool_ = std::make_shared<Poco::Data::SessionPool>(MySQLConn_.name(), ConnectionStr, 8,
|
||||||
NumSessions, IdleTime);
|
NumSessions, IdleTime);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -126,7 +132,7 @@ namespace OpenWifi {
|
|||||||
" connect_timeout=" + ConnectionTimeout;
|
" connect_timeout=" + ConnectionTimeout;
|
||||||
|
|
||||||
Poco::Data::PostgreSQL::Connector::registerConnector();
|
Poco::Data::PostgreSQL::Connector::registerConnector();
|
||||||
Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_.name(), ConnectionStr, 8,
|
Pool_ = std::make_shared<Poco::Data::SessionPool>(PostgresConn_.name(), ConnectionStr, 8,
|
||||||
NumSessions, IdleTime);
|
NumSessions, IdleTime);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ namespace OpenWifi {
|
|||||||
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
|
P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
|
||||||
P.dhUse2048Bits = true;
|
P.dhUse2048Bits = true;
|
||||||
P.caLocation = cas_;
|
P.caLocation = cas_;
|
||||||
|
// P.securityLevel =
|
||||||
|
|
||||||
auto Context = Poco::AutoPtr<Poco::Net::Context>(
|
auto Context = Poco::AutoPtr<Poco::Net::Context>(
|
||||||
new Poco::Net::Context(Poco::Net::Context::TLS_SERVER_USE, P));
|
new Poco::Net::Context(Poco::Net::Context::TLS_SERVER_USE, P));
|
||||||
@@ -53,7 +54,6 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
Context->useCertificate(Cert);
|
Context->useCertificate(Cert);
|
||||||
Context->addChainCertificate(Root);
|
Context->addChainCertificate(Root);
|
||||||
|
|
||||||
Context->addCertificateAuthority(Root);
|
Context->addCertificateAuthority(Root);
|
||||||
|
|
||||||
if (level_ == Poco::Net::Context::VERIFY_STRICT) {
|
if (level_ == Poco::Net::Context::VERIFY_STRICT) {
|
||||||
@@ -76,18 +76,18 @@ namespace OpenWifi {
|
|||||||
L.fatal(fmt::format("Wrong Certificate({}) for Key({})", cert_file_, key_file_));
|
L.fatal(fmt::format("Wrong Certificate({}) for Key({})", cert_file_, key_file_));
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL_CTX_set_verify(SSLCtx, SSL_VERIFY_PEER, nullptr);
|
SSL_CTX_set_verify(SSLCtx, level_==Poco::Net::Context::VERIFY_NONE ? SSL_VERIFY_NONE : SSL_VERIFY_PEER, nullptr);
|
||||||
|
|
||||||
if (level_ == Poco::Net::Context::VERIFY_STRICT) {
|
if (level_ == Poco::Net::Context::VERIFY_STRICT) {
|
||||||
SSL_CTX_set_client_CA_list(SSLCtx, SSL_load_client_CA_file(client_cas_.c_str()));
|
SSL_CTX_set_client_CA_list(SSLCtx, SSL_load_client_CA_file(client_cas_.c_str()));
|
||||||
}
|
|
||||||
SSL_CTX_enable_ct(SSLCtx, SSL_CT_VALIDATION_STRICT);
|
SSL_CTX_enable_ct(SSLCtx, SSL_CT_VALIDATION_STRICT);
|
||||||
|
}
|
||||||
SSL_CTX_dane_enable(SSLCtx);
|
SSL_CTX_dane_enable(SSLCtx);
|
||||||
|
|
||||||
Context->enableSessionCache();
|
Context->enableSessionCache();
|
||||||
Context->setSessionCacheSize(0);
|
Context->setSessionCacheSize(0);
|
||||||
Context->setSessionTimeout(60);
|
Context->setSessionTimeout(60);
|
||||||
Context->enableExtendedCertificateVerification(true);
|
Context->enableExtendedCertificateVerification( level_!= Poco::Net::Context::VERIFY_NONE );
|
||||||
Context->disableStatelessSessionResumption();
|
Context->disableStatelessSessionResumption();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -576,8 +576,8 @@ namespace ORM {
|
|||||||
bool UpdateRecord(field_name_t FieldName, const T &Value, const RecordType &R) {
|
bool UpdateRecord(field_name_t FieldName, const T &Value, const RecordType &R) {
|
||||||
try {
|
try {
|
||||||
assert(ValidFieldName(FieldName));
|
assert(ValidFieldName(FieldName));
|
||||||
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
|
Session.begin();
|
||||||
Poco::Data::Statement Update(Session);
|
Poco::Data::Statement Update(Session);
|
||||||
|
|
||||||
RecordTuple RT;
|
RecordTuple RT;
|
||||||
@@ -593,6 +593,7 @@ namespace ORM {
|
|||||||
Update.execute();
|
Update.execute();
|
||||||
if (Cache_)
|
if (Cache_)
|
||||||
Cache_->UpdateCache(R);
|
Cache_->UpdateCache(R);
|
||||||
|
Session.commit();
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
@@ -662,6 +663,7 @@ namespace ORM {
|
|||||||
assert(ValidFieldName(FieldName));
|
assert(ValidFieldName(FieldName));
|
||||||
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
|
Session.begin();
|
||||||
Poco::Data::Statement Delete(Session);
|
Poco::Data::Statement Delete(Session);
|
||||||
|
|
||||||
std::string St = "delete from " + TableName_ + " where " + FieldName + "=?";
|
std::string St = "delete from " + TableName_ + " where " + FieldName + "=?";
|
||||||
@@ -671,6 +673,7 @@ namespace ORM {
|
|||||||
Delete.execute();
|
Delete.execute();
|
||||||
if (Cache_)
|
if (Cache_)
|
||||||
Cache_->Delete(FieldName, Value);
|
Cache_->Delete(FieldName, Value);
|
||||||
|
Session.commit();
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
@@ -682,11 +685,13 @@ namespace ORM {
|
|||||||
try {
|
try {
|
||||||
assert(!WhereClause.empty());
|
assert(!WhereClause.empty());
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
|
Session.begin();
|
||||||
Poco::Data::Statement Delete(Session);
|
Poco::Data::Statement Delete(Session);
|
||||||
|
|
||||||
std::string St = "delete from " + TableName_ + " where " + WhereClause;
|
std::string St = "delete from " + TableName_ + " where " + WhereClause;
|
||||||
Delete << St;
|
Delete << St;
|
||||||
Delete.execute();
|
Delete.execute();
|
||||||
|
Session.commit();
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ namespace OpenWifi {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DBGLINE std::cout << __LINE__ << ":" << __FILE__ << ", " << __func__ << std::endl;
|
||||||
namespace OpenWifi::RESTAPI::Errors {
|
namespace OpenWifi::RESTAPI::Errors {
|
||||||
struct msg {
|
struct msg {
|
||||||
uint64_t err_num;
|
uint64_t err_num;
|
||||||
@@ -401,6 +402,37 @@ namespace OpenWifi::RESTAPI::Errors {
|
|||||||
1171, "Command not supported on simulated device."
|
1171, "Command not supported on simulated device."
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct msg VenuesNameAlreadyExists {
|
||||||
|
1172, "The venue name already exists."
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct msg InvalidGlobalReachAccount {
|
||||||
|
1173, "Invalid Global Reach account information."
|
||||||
|
};
|
||||||
|
static const struct msg CannotCreateCSR {
|
||||||
|
1174, "Cannot create a CSR certificate."
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct msg DefFirmwareNameExists { 1175, "Firmware name already exists." };
|
||||||
|
static const struct msg NotAValidECKey { 1176, "Not a valid Signing Key." };
|
||||||
|
static const struct msg NotAValidRadiusPoolType { 1177, "Not a valid RADIUS pool type." };
|
||||||
|
static const struct msg InvalidRadiusTypeEndpoint { 1178, "Invalid RADIUS Server Endpoint type." };
|
||||||
|
static const struct msg InvalidRadiusEndpointPoolStrategy { 1179, "Invalid RADIUS Server Endpoint Pool strategy." };
|
||||||
|
static const struct msg EndpointMustHaveOneTypeOfServers { 1180, "All servers must be either RADIUS or RADSEC." };
|
||||||
|
static const struct msg RadiusEndpointIndexInvalid { 1181, "Index must be an address between 0.0.1.1 and 0.0.2.254" };
|
||||||
|
static const struct msg RadiusEndpointIndexMustBeUnique { 1182, "Index must be unique." };
|
||||||
|
static const struct msg OrionAccountMustExist { 1183, "Orion account must exist." };
|
||||||
|
static const struct msg GlobalReachCertMustExist { 1184, "Global Reach certificate must exist." };
|
||||||
|
static const struct msg InvalidRadsecMainCertificate { 1185, "Invalid Radsec main certificate." };
|
||||||
|
static const struct msg InvalidRadsecCaCertificate { 1186, "Invalid Radsec CA certificates." };
|
||||||
|
static const struct msg InvalidRadsecPrivteKey { 1187, "Invalid Radsec Private key." };
|
||||||
|
static const struct msg InvalidRadsecIPAddress { 1188, "Invalid Radsec IP Address." };
|
||||||
|
static const struct msg InvalidRadsecPort { 1189, "Invalid Radsec Port." };
|
||||||
|
static const struct msg InvalidRadsecSecret { 1190, "Invalid Radsec Secret." };
|
||||||
|
static const struct msg InvalidRadiusServer { 1191, "Invalid Radius Server." };
|
||||||
|
|
||||||
|
static const struct msg InvalidRRMAction { 1192, "Invalid RRM Action." };
|
||||||
|
|
||||||
static const struct msg SimulationDoesNotExist {
|
static const struct msg SimulationDoesNotExist {
|
||||||
7000, "Simulation Instance ID does not exist."
|
7000, "Simulation Instance ID does not exist."
|
||||||
};
|
};
|
||||||
@@ -531,6 +563,10 @@ namespace OpenWifi::RESTAPI::Protocol {
|
|||||||
static const char *CONTENTDISPOSITION = "Content-Disposition";
|
static const char *CONTENTDISPOSITION = "Content-Disposition";
|
||||||
static const char *CONTENTTYPE = "Content-Type";
|
static const char *CONTENTTYPE = "Content-Type";
|
||||||
|
|
||||||
|
static const char *TRANSFER = "transfer";
|
||||||
|
static const char *CERTUPDATE = "certupdate";
|
||||||
|
static const char *RRM = "rrm";
|
||||||
|
|
||||||
static const char *REQUIREMENTS = "requirements";
|
static const char *REQUIREMENTS = "requirements";
|
||||||
static const char *PASSWORDPATTERN = "passwordPattern";
|
static const char *PASSWORDPATTERN = "passwordPattern";
|
||||||
static const char *ACCESSPOLICY = "accessPolicy";
|
static const char *ACCESSPOLICY = "accessPolicy";
|
||||||
@@ -648,6 +684,12 @@ namespace OpenWifi::uCentralProtocol {
|
|||||||
static const char *RADIUSCOA = "coa";
|
static const char *RADIUSCOA = "coa";
|
||||||
static const char *RADIUSDST = "dst";
|
static const char *RADIUSDST = "dst";
|
||||||
static const char *IES = "ies";
|
static const char *IES = "ies";
|
||||||
|
|
||||||
|
static const char *TRANSFER = "transfer";
|
||||||
|
static const char *CERTUPDATE = "certupdate";
|
||||||
|
static const char *RRM = "rrm";
|
||||||
|
static const char *ACTIONS = "actions";
|
||||||
|
|
||||||
} // namespace OpenWifi::uCentralProtocol
|
} // namespace OpenWifi::uCentralProtocol
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol::Events {
|
namespace OpenWifi::uCentralProtocol::Events {
|
||||||
@@ -740,6 +782,9 @@ namespace OpenWifi::APCommands {
|
|||||||
telemetry,
|
telemetry,
|
||||||
ping,
|
ping,
|
||||||
script,
|
script,
|
||||||
|
rrm,
|
||||||
|
certupdate,
|
||||||
|
transfer,
|
||||||
unknown
|
unknown
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -752,7 +797,10 @@ namespace OpenWifi::APCommands {
|
|||||||
RESTAPI::Protocol::LEDS, RESTAPI::Protocol::TRACE,
|
RESTAPI::Protocol::LEDS, RESTAPI::Protocol::TRACE,
|
||||||
RESTAPI::Protocol::REQUEST, RESTAPI::Protocol::WIFISCAN,
|
RESTAPI::Protocol::REQUEST, RESTAPI::Protocol::WIFISCAN,
|
||||||
RESTAPI::Protocol::EVENTQUEUE, RESTAPI::Protocol::TELEMETRY,
|
RESTAPI::Protocol::EVENTQUEUE, RESTAPI::Protocol::TELEMETRY,
|
||||||
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT};
|
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT,
|
||||||
|
RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE,
|
||||||
|
RESTAPI::Protocol::TRANSFER
|
||||||
|
};
|
||||||
|
|
||||||
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }
|
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,19 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "Poco/Path.h"
|
#include "Poco/Path.h"
|
||||||
|
#include "Poco/TemporaryFile.h"
|
||||||
|
#include "Poco/Crypto/ECKey.h"
|
||||||
#include "framework/AppServiceRegistry.h"
|
#include "framework/AppServiceRegistry.h"
|
||||||
#include "framework/utils.h"
|
#include "framework/utils.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <ctime>
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <resolv.h>
|
||||||
|
|
||||||
namespace OpenWifi::Utils {
|
namespace OpenWifi::Utils {
|
||||||
|
|
||||||
bool NormalizeMac(std::string &Mac) {
|
bool NormalizeMac(std::string &Mac) {
|
||||||
@@ -27,6 +36,10 @@ namespace OpenWifi::Utils {
|
|||||||
std::all_of(Serial.begin(), Serial.end(), [](auto i) { return std::isxdigit(i); }));
|
std::all_of(Serial.begin(), Serial.end(), [](auto i) { return std::isxdigit(i); }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool ValidSerialNumbers(const std::vector<std::string> &numbers) {
|
||||||
|
return std::all_of(numbers.begin(),numbers.end(),[](auto &number) {return ValidSerialNumber(number);});
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool ValidUUID(const std::string &UUID) {
|
[[nodiscard]] bool ValidUUID(const std::string &UUID) {
|
||||||
if (UUID.size() > 36)
|
if (UUID.size() > 36)
|
||||||
return false;
|
return false;
|
||||||
@@ -128,6 +141,15 @@ namespace OpenWifi::Utils {
|
|||||||
return std::regex_match(Hostname, HostNameRegex);
|
return std::regex_match(Hostname, HostNameRegex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool ValidNumber(const std::string &number, bool isSigned)
|
||||||
|
{
|
||||||
|
static std::regex IntRegex("^-?[0-9]\\d*(\\.\\d+)?$");
|
||||||
|
if(!isSigned) {
|
||||||
|
IntRegex = "^[0-9]\\d*(\\.\\d+)?$";
|
||||||
|
}
|
||||||
|
return std::regex_match(number, IntRegex);
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] std::string ToHex(const std::vector<unsigned char> &B) {
|
[[nodiscard]] std::string ToHex(const std::vector<unsigned char> &B) {
|
||||||
std::string R;
|
std::string R;
|
||||||
R.reserve(B.size() * 2);
|
R.reserve(B.size() * 2);
|
||||||
@@ -595,4 +617,329 @@ namespace OpenWifi::Utils {
|
|||||||
return DT.timestamp().epochTime();
|
return DT.timestamp().epochTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string FileToString(const std::string &Filename) {
|
||||||
|
std::ifstream ifs(Filename.c_str(),std::ios_base::in|std::ios_base::binary);
|
||||||
|
std::ostringstream os;
|
||||||
|
Poco::StreamCopier::copyStream(ifs,os);
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CreateX509CSR(const CSRCreationParameters & Parameters, CSRCreationResults & Results) {
|
||||||
|
int ret = 0;
|
||||||
|
RSA *r = nullptr;
|
||||||
|
BIGNUM *bne = nullptr;
|
||||||
|
|
||||||
|
int nVersion = 0;
|
||||||
|
unsigned long e = RSA_F4;
|
||||||
|
|
||||||
|
X509_REQ *x509_req = nullptr;
|
||||||
|
X509_NAME *x509_name = nullptr;
|
||||||
|
EVP_PKEY *pKey = nullptr;
|
||||||
|
// RSA *tem = nullptr;
|
||||||
|
// BIO *bio_err = nullptr;
|
||||||
|
|
||||||
|
const char *szCountry = Parameters.Country.c_str();
|
||||||
|
const char *szProvince = Parameters.Province.c_str();
|
||||||
|
const char *szCity = Parameters.City.c_str();
|
||||||
|
const char *szOrganization = Parameters.Organization.c_str();
|
||||||
|
const char *szCommon = Parameters.CommonName.c_str();
|
||||||
|
|
||||||
|
Poco::TemporaryFile CsrPath, PubKey, PrivateKey;
|
||||||
|
std::string Result;
|
||||||
|
std::ifstream ifs;
|
||||||
|
std::ostringstream ss;
|
||||||
|
BIO *bp_public = nullptr,
|
||||||
|
*bp_private = nullptr,
|
||||||
|
*bp_csr = nullptr;
|
||||||
|
|
||||||
|
// 1. generate rsa key
|
||||||
|
bne = BN_new();
|
||||||
|
ret = BN_set_word(bne,e);
|
||||||
|
if(ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = RSA_new();
|
||||||
|
ret = RSA_generate_key_ex(r, Parameters.bits, bne, nullptr);
|
||||||
|
if(ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
bp_public = BIO_new_file(PubKey.path().c_str(), "w+");
|
||||||
|
ret = PEM_write_bio_RSAPublicKey(bp_public, r);
|
||||||
|
if(ret != 1) {
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
bp_private = BIO_new_file(PrivateKey.path().c_str(), "w+");
|
||||||
|
ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
|
||||||
|
if(ret != 1) {
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. set version of x509 req
|
||||||
|
x509_req = X509_REQ_new();
|
||||||
|
ret = X509_REQ_set_version(x509_req, nVersion);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. set subject of x509 req
|
||||||
|
x509_name = X509_REQ_get_subject_name(x509_req);
|
||||||
|
|
||||||
|
ret = X509_NAME_add_entry_by_txt(x509_name,"C", MBSTRING_ASC, (const unsigned char*)szCountry, -1, -1, 0);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = X509_NAME_add_entry_by_txt(x509_name,"ST", MBSTRING_ASC, (const unsigned char*)szProvince, -1, -1, 0);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = X509_NAME_add_entry_by_txt(x509_name,"L", MBSTRING_ASC, (const unsigned char*)szCity, -1, -1, 0);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = X509_NAME_add_entry_by_txt(x509_name,"O", MBSTRING_ASC, (const unsigned char*)szOrganization, -1, -1, 0);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = X509_NAME_add_entry_by_txt(x509_name,"CN", MBSTRING_ASC, (const unsigned char*)szCommon, -1, -1, 0);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. set public key of x509 req
|
||||||
|
pKey = EVP_PKEY_new();
|
||||||
|
EVP_PKEY_assign_RSA(pKey, r);
|
||||||
|
r = nullptr; // will be free rsa when EVP_PKEY_free(pKey)
|
||||||
|
|
||||||
|
ret = X509_REQ_set_pubkey(x509_req, pKey);
|
||||||
|
if (ret != 1){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. set sign key of x509 req
|
||||||
|
ret = X509_REQ_sign(x509_req, pKey, EVP_sha1()); // return x509_req->signature->length
|
||||||
|
if (ret <= 0){
|
||||||
|
goto free_all;
|
||||||
|
}
|
||||||
|
|
||||||
|
bp_csr = BIO_new_file(CsrPath.path().c_str(),"w");
|
||||||
|
ret = PEM_write_bio_X509_REQ(bp_csr, x509_req);
|
||||||
|
|
||||||
|
// 6. free
|
||||||
|
free_all:
|
||||||
|
X509_REQ_free(x509_req);
|
||||||
|
BIO_free_all(bp_csr);
|
||||||
|
BIO_free_all(bp_public);
|
||||||
|
BIO_free_all(bp_private);
|
||||||
|
|
||||||
|
EVP_PKEY_free(pKey);
|
||||||
|
BN_free(bne);
|
||||||
|
if(ret==1) {
|
||||||
|
Results.CSR = FileToString(CsrPath.path());
|
||||||
|
Results.PrivateKey = FileToString(PrivateKey.path());
|
||||||
|
Results.PublicKey = FileToString(PubKey.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VerifyECKey(const std::string &key) {
|
||||||
|
try {
|
||||||
|
Poco::TemporaryFile F;
|
||||||
|
|
||||||
|
std::ofstream of(F.path().c_str(), std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
|
||||||
|
of << key;
|
||||||
|
of.close();
|
||||||
|
|
||||||
|
auto Key = Poco::SharedPtr<Poco::Crypto::ECKey>(
|
||||||
|
new Poco::Crypto::ECKey("", F.path(),""));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VerifyRSAKey([[
|
||||||
|
maybe_unused]] const std::string &key) {
|
||||||
|
try {
|
||||||
|
Poco::TemporaryFile F;
|
||||||
|
|
||||||
|
std::ofstream of(F.path().c_str(), std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
|
||||||
|
of << key;
|
||||||
|
of.close();
|
||||||
|
|
||||||
|
auto Key = Poco::SharedPtr<Poco::Crypto::RSAKey>(
|
||||||
|
new Poco::Crypto::RSAKey("", F.path(),""));
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VerifyPrivateKey(const std::string &key) {
|
||||||
|
return VerifyECKey(key) || VerifyRSAKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidX509Certificate([[
|
||||||
|
maybe_unused]] const std::string &Cert) {
|
||||||
|
try {
|
||||||
|
Poco::TemporaryFile F;
|
||||||
|
std::ofstream of(F.path().c_str(), std::ios_base::trunc | std::ios_base::out | std::ios_base::binary);
|
||||||
|
of << Cert;
|
||||||
|
of.close();
|
||||||
|
|
||||||
|
auto Key = Poco::SharedPtr<Poco::Crypto::X509Certificate>(
|
||||||
|
new Poco::Crypto::X509Certificate(F.path()));
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidX509Certificate([[
|
||||||
|
maybe_unused]] const std::vector<std::string> &Certs) {
|
||||||
|
auto F = [](const std::string &C) -> bool { return ValidX509Certificate(C); };
|
||||||
|
return std::all_of(Certs.begin(),Certs.end(), F);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string generateStrongPassword(int minLength, int maxLength, int numDigits, int minLowercase, int minSpecial, int minUppercase) {
|
||||||
|
// Define character sets for each category
|
||||||
|
const std::string lowercaseChars = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
const std::string uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
const std::string digitChars = "0123456789";
|
||||||
|
const std::string specialChars = "!@#$%^&*()_+[]{}|;:,.<>?";
|
||||||
|
|
||||||
|
// Check if parameters are valid
|
||||||
|
if (minLength < 1 || minLength > maxLength || minLowercase + minUppercase + numDigits + minSpecial > maxLength) {
|
||||||
|
return "Invalid parameters";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize random seed
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 g(rd());
|
||||||
|
|
||||||
|
// Initialize the password string
|
||||||
|
std::string password;
|
||||||
|
|
||||||
|
// Generate the required number of each character type
|
||||||
|
for (int i = 0; i < minLowercase; ++i) {
|
||||||
|
password += lowercaseChars[g() % lowercaseChars.length()];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < minUppercase; ++i) {
|
||||||
|
password += uppercaseChars[g() % uppercaseChars.length()];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < numDigits; ++i) {
|
||||||
|
password += digitChars[g() % digitChars.length()];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < minSpecial; ++i) {
|
||||||
|
password += specialChars[g() % specialChars.length()];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate how many more characters are needed
|
||||||
|
int remainingLength = maxLength - (int)password.length();
|
||||||
|
|
||||||
|
// Generate random characters to fill the remaining length
|
||||||
|
for (int i = 0; i < remainingLength; ++i) {
|
||||||
|
int category = g() % 4; // Randomly select a category
|
||||||
|
if (category == 0) {
|
||||||
|
password += lowercaseChars[g() % lowercaseChars.length()];
|
||||||
|
} else if (category == 1) {
|
||||||
|
password += uppercaseChars[g() % uppercaseChars.length()];
|
||||||
|
} else if (category == 2) {
|
||||||
|
password += digitChars[g() % digitChars.length()];
|
||||||
|
} else {
|
||||||
|
password += specialChars[g() % specialChars.length()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shuffle the password to randomize the character order
|
||||||
|
std::shuffle(password.begin(), password.end(),g);
|
||||||
|
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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> naptrRecords;
|
||||||
|
|
||||||
|
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> srvRecords;
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
#include "Poco/Base64Decoder.h"
|
#include "Poco/Base64Decoder.h"
|
||||||
#include "Poco/Base64Encoder.h"
|
#include "Poco/Base64Encoder.h"
|
||||||
#include "Poco/File.h"
|
#include "Poco/File.h"
|
||||||
@@ -68,8 +70,10 @@ namespace OpenWifi::Utils {
|
|||||||
};
|
};
|
||||||
|
|
||||||
[[nodiscard]] bool ValidSerialNumber(const std::string &Serial);
|
[[nodiscard]] bool ValidSerialNumber(const std::string &Serial);
|
||||||
|
[[nodiscard]] bool ValidSerialNumbers(const std::vector<std::string> &Serial);
|
||||||
[[nodiscard]] bool ValidUUID(const std::string &UUID);
|
[[nodiscard]] bool ValidUUID(const std::string &UUID);
|
||||||
[[nodiscard]] bool ValidHostname(const std::string &hostname);
|
[[nodiscard]] bool ValidHostname(const std::string &hostname);
|
||||||
|
[[nodiscard]] bool ValidNumber(const std::string &number, bool isSigned);
|
||||||
|
|
||||||
template <typename... Args> std::string ComputeHash(Args &&...args) {
|
template <typename... Args> std::string ComputeHash(Args &&...args) {
|
||||||
Poco::SHA2Engine E;
|
Poco::SHA2Engine E;
|
||||||
@@ -180,4 +184,222 @@ namespace OpenWifi::Utils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline std::uint64_t GetValue(FILE *file) {
|
||||||
|
unsigned long v=0;
|
||||||
|
char factor[32];
|
||||||
|
if(fscanf(file, " %lu %31s", &v, factor)==2) {
|
||||||
|
switch (factor[0]) {
|
||||||
|
case 'k':
|
||||||
|
return v * 1000;
|
||||||
|
case 'M':
|
||||||
|
return v * 1000000;
|
||||||
|
case 'G':
|
||||||
|
return v * 1000000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool getMemory(
|
||||||
|
std::uint64_t &currRealMem, std::uint64_t &peakRealMem,
|
||||||
|
std::uint64_t &currVirtMem, std::uint64_t &peakVirtMem) {
|
||||||
|
|
||||||
|
// stores each word in status file
|
||||||
|
char buffer[1024] = "";
|
||||||
|
|
||||||
|
currRealMem = peakRealMem = currVirtMem = peakVirtMem = 0;
|
||||||
|
|
||||||
|
// linux file contains this-process info
|
||||||
|
FILE * file = std::fopen("/proc/self/status", "r");
|
||||||
|
if (file == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read the entire file, recording mems in kB
|
||||||
|
while (fscanf(file, " %1023s", buffer) == 1) {
|
||||||
|
|
||||||
|
if (strcmp(buffer, "VmRSS:") == 0) {
|
||||||
|
currRealMem= GetValue(file);
|
||||||
|
} else if (strcmp(buffer, "VmHWM:") == 0) {
|
||||||
|
peakRealMem= GetValue(file);
|
||||||
|
} else if (strcmp(buffer, "VmSize:") == 0) {
|
||||||
|
currVirtMem= GetValue(file);
|
||||||
|
} else if (strcmp(buffer, "VmPeak:") == 0) {
|
||||||
|
peakVirtMem= GetValue(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int get_open_fds() {
|
||||||
|
DIR *dp = opendir("/proc/self/fd");
|
||||||
|
struct dirent *de;
|
||||||
|
int count = -3; // '.', '..', dp
|
||||||
|
|
||||||
|
if (dp == nullptr)
|
||||||
|
return -1;
|
||||||
|
while ((de = readdir(dp)) != nullptr)
|
||||||
|
count++;
|
||||||
|
(void)closedir(dp);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::uint32_t IPtoInt(const std::string &A) {
|
||||||
|
Poco::Net::IPAddress IP;
|
||||||
|
std::uint32_t Result=0;
|
||||||
|
|
||||||
|
if(Poco::Net::IPAddress::tryParse(A,IP)) {
|
||||||
|
for(const auto i:IP.toBytes()) {
|
||||||
|
Result <<= 8;
|
||||||
|
Result += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool ValidIP(const std::string &IPstr) {
|
||||||
|
Poco::Net::IPAddress IP;
|
||||||
|
return Poco::Net::IPAddress::tryParse(IPstr,IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CSRCreationParameters {
|
||||||
|
std::string Country, Province, City,
|
||||||
|
Organization, CommonName;
|
||||||
|
int bits=2048;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CSRCreationResults {
|
||||||
|
std::string CSR, PublicKey, PrivateKey;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool CreateX509CSR(const CSRCreationParameters & Parameters, CSRCreationResults & Results);
|
||||||
|
std::string generateStrongPassword(int minLength, int maxLength, int numDigits, int minLowercase, int minSpecial, int minUppercase);
|
||||||
|
bool VerifyECKey(const std::string &key);
|
||||||
|
bool VerifyRSAKey(const std::string &key);
|
||||||
|
bool VerifyPrivateKey(const std::string &key);
|
||||||
|
bool ValidX509Certificate(const std::string &Cert);
|
||||||
|
bool ValidX509Certificate(const std::vector<std::string> &Certs);
|
||||||
|
|
||||||
|
struct NAPTRRecord {
|
||||||
|
std::string name;
|
||||||
|
std::string ttl;
|
||||||
|
std::string rclass;
|
||||||
|
std::string rtype;
|
||||||
|
uint32_t order=0;
|
||||||
|
uint32_t preference=0;
|
||||||
|
std::string flags;
|
||||||
|
std::string service;
|
||||||
|
std::string regexp;
|
||||||
|
std::string replacement;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Function to query NAPTR records for a domain and return them in a vector
|
||||||
|
std::vector<NAPTRRecord> getNAPTRRecords(const std::string& domain);
|
||||||
|
struct SrvRecord {
|
||||||
|
std::string name;
|
||||||
|
std::string ttl;
|
||||||
|
std::string rclass;
|
||||||
|
std::string rtype;
|
||||||
|
uint32_t pref = 0;
|
||||||
|
uint32_t weight = 0;
|
||||||
|
uint32_t port = 0;
|
||||||
|
std::string srvname;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<SrvRecord> getSRVRecords(const std::string& domain);
|
||||||
|
|
||||||
|
struct HostNameServerResult{
|
||||||
|
std::string Hostname;
|
||||||
|
uint32_t Port;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CompressedString {
|
||||||
|
public:
|
||||||
|
CompressedString() {
|
||||||
|
DecompressedSize_ = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit CompressedString(const std::string &Data) : DecompressedSize_(Data.size()) {
|
||||||
|
CompressIt(Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
CompressedString(const CompressedString &Data) {
|
||||||
|
this->DecompressedSize_ = Data.DecompressedSize_;
|
||||||
|
this->CompressedData_ = Data.CompressedData_;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompressedString& operator=(const CompressedString& rhs) {
|
||||||
|
if (this != &rhs) {
|
||||||
|
this->DecompressedSize_ = rhs.DecompressedSize_;
|
||||||
|
this->CompressedData_ = rhs.CompressedData_;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompressedString& operator=(CompressedString&& rhs) {
|
||||||
|
if (this != &rhs) {
|
||||||
|
this->DecompressedSize_ = rhs.DecompressedSize_;
|
||||||
|
this->CompressedData_ = rhs.CompressedData_;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
~CompressedString() = default;
|
||||||
|
|
||||||
|
operator std::string() const {
|
||||||
|
return DecompressIt();
|
||||||
|
}
|
||||||
|
|
||||||
|
CompressedString &operator=(const std::string &Data) {
|
||||||
|
DecompressedSize_ = Data.size();
|
||||||
|
CompressIt(Data);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto CompressedSize() const { return CompressedData_.size(); }
|
||||||
|
auto DecompressedSize() const { return DecompressedSize_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string CompressedData_;
|
||||||
|
std::size_t DecompressedSize_;
|
||||||
|
|
||||||
|
inline void CompressIt(const std::string &Data) {
|
||||||
|
z_stream strm; // = {0};
|
||||||
|
CompressedData_.resize(Data.size());
|
||||||
|
strm.next_in = (Bytef *)Data.data();
|
||||||
|
strm.avail_in = Data.size();
|
||||||
|
strm.next_out = (Bytef *)CompressedData_.data();
|
||||||
|
strm.avail_out = Data.size();
|
||||||
|
strm.zalloc = Z_NULL;
|
||||||
|
strm.zfree = Z_NULL;
|
||||||
|
strm.opaque = Z_NULL;
|
||||||
|
deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY);
|
||||||
|
deflate(&strm, Z_FINISH);
|
||||||
|
deflateEnd(&strm);
|
||||||
|
CompressedData_.resize(strm.total_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] std::string DecompressIt() const {
|
||||||
|
std::string Result;
|
||||||
|
if(DecompressedSize_!=0) {
|
||||||
|
Result.resize(DecompressedSize_);
|
||||||
|
z_stream strm ; //= {0};
|
||||||
|
strm.next_in = (Bytef *)CompressedData_.data();
|
||||||
|
strm.avail_in = CompressedData_.size();
|
||||||
|
strm.next_out = (Bytef *)Result.data();
|
||||||
|
strm.avail_out = Result.size();
|
||||||
|
strm.zalloc = Z_NULL;
|
||||||
|
strm.zfree = Z_NULL;
|
||||||
|
strm.opaque = Z_NULL;
|
||||||
|
inflateInit2(&strm, 15 + 32);
|
||||||
|
inflate(&strm, Z_FINISH);
|
||||||
|
inflateEnd(&strm);
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace OpenWifi::Utils
|
} // namespace OpenWifi::Utils
|
||||||
|
|||||||
Reference in New Issue
Block a user