mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralfms.git
synced 2025-10-30 18:27:54 +00:00
Compare commits
13 Commits
v2.6.0-RC2
...
v2.4.0-RC5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0507ceb82 | ||
|
|
afc8b942cb | ||
|
|
5737ab7c00 | ||
|
|
1b59208fa2 | ||
|
|
f5ee31bd8b | ||
|
|
9f9faafb1c | ||
|
|
dc9d155b78 | ||
|
|
b8a7a7aff9 | ||
|
|
3195679fee | ||
|
|
d1a9556b27 | ||
|
|
c45850b749 | ||
|
|
ab859d1f77 | ||
|
|
da5720cf8d |
104
.github/workflows/ci.yml
vendored
104
.github/workflows/ci.yml
vendored
@@ -13,7 +13,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- 'release/*'
|
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -26,78 +25,41 @@ jobs:
|
|||||||
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
|
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
DOCKER_REGISTRY_USERNAME: ucentral
|
DOCKER_REGISTRY_USERNAME: ucentral
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout actions repo
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: Telecominfraproject/.github
|
|
||||||
path: github
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build Docker image
|
||||||
uses: ./github/composite-actions/docker-image-build
|
run: docker build -t wlan-cloud-owfms:${{ github.sha }} .
|
||||||
with:
|
|
||||||
image_name: owfms
|
|
||||||
registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
|
||||||
registry_user: ucentral
|
|
||||||
registry_password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Notify on failure via Slack
|
- name: Tag Docker image
|
||||||
if: failure() && github.ref == 'refs/heads/main'
|
|
||||||
uses: rtCamp/action-slack-notify@v2
|
|
||||||
env:
|
|
||||||
SLACK_USERNAME: GitHub Actions failure notifier
|
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
|
||||||
SLACK_COLOR: "${{ job.status }}"
|
|
||||||
SLACK_ICON: https://raw.githubusercontent.com/quintessence/slack-icons/master/images/github-logo-slack-icon.png
|
|
||||||
SLACK_TITLE: Docker build failed for OWFMS service
|
|
||||||
|
|
||||||
trigger-testing:
|
|
||||||
if: startsWith(github.ref, 'refs/pull/')
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: docker
|
|
||||||
steps:
|
|
||||||
- name: Get base branch name and set as output
|
|
||||||
id: get_base_branch
|
|
||||||
run: |
|
run: |
|
||||||
echo ::set-output name=branch::$(echo ${GITHUB_BASE_REF##*/})
|
TAGS="${{ github.sha }}"
|
||||||
echo ::set-output name=owgw_branch::$(echo ${GITHUB_BASE_REF##*/} | sed 's/main/master/g')
|
if [[ ${GITHUB_REF} == "refs/heads/"* ]]
|
||||||
|
then
|
||||||
- name: Checkout actions repo
|
CURRENT_TAG=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')
|
||||||
uses: actions/checkout@v2
|
TAGS="$TAGS $CURRENT_TAG"
|
||||||
|
else
|
||||||
|
if [[ ${GITHUB_REF} == "refs/tags/"* ]]
|
||||||
|
then
|
||||||
|
CURRENT_TAG=$(echo ${GITHUB_REF#refs/tags/} | tr '/' '-')
|
||||||
|
TAGS="$TAGS $CURRENT_TAG"
|
||||||
|
else # PR build
|
||||||
|
CURRENT_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
|
||||||
|
TAGS="$TAGS $CURRENT_TAG"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "Result tags: $TAGS"
|
||||||
|
for tag in $TAGS; do
|
||||||
|
docker tag wlan-cloud-owfms:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/owfms:$tag
|
||||||
|
done
|
||||||
|
- name: Log into Docker registry
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/main'
|
||||||
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
repository: Telecominfraproject/.github
|
registry: ${{ env.DOCKER_REGISTRY_URL }}
|
||||||
path: github
|
username: ${{ env.DOCKER_REGISTRY_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
- name: Trigger testing of OpenWifi Docker Compose deployment and wait for result
|
- name: Push Docker images
|
||||||
uses: ./github/composite-actions/trigger-workflow-and-wait
|
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/main'
|
||||||
env:
|
run: |
|
||||||
BASE_BRANCH: ${{ steps.get_base_branch.outputs.branch }}
|
docker images | grep ${{ env.DOCKER_REGISTRY_URL }}/owfms | awk -F ' ' '{print $1":"$2}' | xargs -I {} docker push {}
|
||||||
OWGW_BASE_BRANCH: ${{ steps.get_base_branch.outputs.owgw_branch }}
|
|
||||||
with:
|
|
||||||
owner: Telecominfraproject
|
|
||||||
repo: wlan-testing
|
|
||||||
workflow: ow_docker-compose.yml
|
|
||||||
token: ${{ secrets.WLAN_TESTING_PAT }}
|
|
||||||
ref: master
|
|
||||||
inputs: '{"deployment_version": "${{ env.BASE_BRANCH }}", "owgw_version": "${{ env.OWGW_BASE_BRANCH }}", "owsec_version": "${{ env.BASE_BRANCH }}", "owfms_version": "${{ github.sha }}", "owprov_version": "${{ env.BASE_BRANCH }}", "owanalytics_version": "${{ env.BASE_BRANCH }}", "owsub_version": "${{ env.BASE_BRANCH }}", "microservice": "owfms"}'
|
|
||||||
|
|
||||||
trigger-deploy-to-dev:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.ref == 'refs/heads/main'
|
|
||||||
needs:
|
|
||||||
- docker
|
|
||||||
steps:
|
|
||||||
- name: Checkout actions repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: Telecominfraproject/.github
|
|
||||||
path: github
|
|
||||||
|
|
||||||
- name: Trigger deployment of the latest version to dev instance and wait for result
|
|
||||||
uses: ./github/composite-actions/trigger-workflow-and-wait
|
|
||||||
with:
|
|
||||||
owner: Telecominfraproject
|
|
||||||
repo: wlan-testing
|
|
||||||
workflow: ucentralgw-dev-deployment.yaml
|
|
||||||
token: ${{ secrets.WLAN_TESTING_PAT }}
|
|
||||||
ref: master
|
|
||||||
inputs: '{"force_latest": "true"}'
|
|
||||||
|
|||||||
9
.github/workflows/cleanup.yml
vendored
9
.github/workflows/cleanup.yml
vendored
@@ -4,7 +4,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- 'release/*'
|
|
||||||
types: [ closed ]
|
types: [ closed ]
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
@@ -17,10 +16,4 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- run: |
|
- run: |
|
||||||
export PR_BRANCH_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
|
export PR_BRANCH_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
|
||||||
|
curl -uucentral:${{ secrets.DOCKER_REGISTRY_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral/owfms/$PR_BRANCH_TAG"
|
||||||
if [[ ! $PR_BRANCH_TAG =~ (main|master|release-*) ]]; then
|
|
||||||
echo "PR branch is $PR_BRANCH_TAG, deleting Docker image"
|
|
||||||
curl -s -uucentral:${{ secrets.DOCKER_REGISTRY_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral/owfms/$PR_BRANCH_TAG"
|
|
||||||
else
|
|
||||||
echo "PR branch is $PR_BRANCH_TAG, not deleting Docker image"
|
|
||||||
fi
|
|
||||||
|
|||||||
24
.github/workflows/enforce-jira-issue-key.yml
vendored
24
.github/workflows/enforce-jira-issue-key.yml
vendored
@@ -1,24 +0,0 @@
|
|||||||
name: Ensure Jira issue is linked
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, edited, reopened, synchronize]
|
|
||||||
branches:
|
|
||||||
- 'release/*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check_for_issue_key:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout actions repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: Telecominfraproject/.github
|
|
||||||
path: github
|
|
||||||
|
|
||||||
- name: Run JIRA check
|
|
||||||
uses: ./github/composite-actions/enforce-jira-issue-key
|
|
||||||
with:
|
|
||||||
jira_base_url: ${{ secrets.TIP_JIRA_URL }}
|
|
||||||
jira_user_email: ${{ secrets.TIP_JIRA_USER_EMAIL }}
|
|
||||||
jira_api_token: ${{ secrets.TIP_JIRA_API_TOKEN }}
|
|
||||||
46
.github/workflows/release.yml
vendored
46
.github/workflows/release.yml
vendored
@@ -1,46 +0,0 @@
|
|||||||
name: Release chart package
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
helm-package:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
env:
|
|
||||||
HELM_REPO_URL: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
|
||||||
HELM_REPO_USERNAME: ucentral
|
|
||||||
steps:
|
|
||||||
- name: Checkout uCentral assembly chart repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: wlan-cloud-ucentralfms
|
|
||||||
|
|
||||||
- name: Build package
|
|
||||||
working-directory: wlan-cloud-ucentralfms/helm
|
|
||||||
run: |
|
|
||||||
helm plugin install https://github.com/aslafy-z/helm-git --version 0.10.0
|
|
||||||
helm repo add bitnami https://charts.bitnami.com/bitnami
|
|
||||||
helm repo update
|
|
||||||
helm dependency update
|
|
||||||
mkdir dist
|
|
||||||
helm package . -d dist
|
|
||||||
|
|
||||||
- name: Generate GitHub release body
|
|
||||||
working-directory: wlan-cloud-ucentralfms/helm
|
|
||||||
run: |
|
|
||||||
pip3 install yq -q
|
|
||||||
echo "Docker image - tip-tip-wlan-cloud-ucentral.jfrog.io/owfms:$GITHUB_REF_NAME" > release.txt
|
|
||||||
echo "Helm charted may be attached to this release" >> release.txt
|
|
||||||
echo "Deployment artifacts may be found in https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/$GITHUB_REF_NAME" >> release.txt
|
|
||||||
|
|
||||||
- name: Create GitHub release
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
with:
|
|
||||||
body_path: wlan-cloud-ucentralfms/helm/release.txt
|
|
||||||
files: wlan-cloud-ucentralfms/helm/dist/*
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -20,4 +20,5 @@ _deps
|
|||||||
*.zip
|
*.zip
|
||||||
result.json
|
result.json
|
||||||
pidfile
|
pidfile
|
||||||
test_scripts/curl/result.json
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
project(owfms VERSION 2.6.0)
|
project(owfms VERSION 2.4.0)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
@@ -15,14 +15,14 @@ if(UNIX AND NOT APPLE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
|
||||||
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/build BUILD_NUM)
|
file(READ build BUILD_NUM)
|
||||||
if(BUILD_INCREMENT)
|
if(BUILD_INCREMENT)
|
||||||
MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
|
MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
|
||||||
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
|
file(WRITE build ${BUILD_NUM})
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
set(BUILD_NUM 1)
|
set(BUILD_NUM 1)
|
||||||
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
|
file(WRITE build ${BUILD_NUM})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Git QUIET)
|
find_package(Git QUIET)
|
||||||
@@ -36,14 +36,16 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
|
|||||||
endif()
|
endif()
|
||||||
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
|
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
|
||||||
endif()
|
endif()
|
||||||
|
add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT)
|
||||||
|
|
||||||
# set(BUILD_SHARED_LIBS 1)
|
set(Boost_USE_STATIC_LIBS OFF)
|
||||||
# add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT)
|
set(Boost_USE_MULTITHREADED ON)
|
||||||
|
set(Boost_USE_STATIC_RUNTIME OFF)
|
||||||
|
|
||||||
|
find_package(Boost REQUIRED system)
|
||||||
find_package(OpenSSL REQUIRED)
|
find_package(OpenSSL REQUIRED)
|
||||||
find_package(fmt REQUIRED)
|
|
||||||
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
|
||||||
find_package(AWSSDK REQUIRED COMPONENTS s3)
|
find_package(AWSSDK REQUIRED COMPONENTS s3)
|
||||||
|
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
||||||
|
|
||||||
if(SMALL_BUILD)
|
if(SMALL_BUILD)
|
||||||
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
||||||
@@ -58,12 +60,6 @@ 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)
|
|
||||||
if(ASAN)
|
|
||||||
add_compile_options(-fsanitize=address)
|
|
||||||
add_link_options(-fsanitize=address)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable( owfms
|
add_executable( owfms
|
||||||
build
|
build
|
||||||
src/ow_version.h.in
|
src/ow_version.h.in
|
||||||
@@ -72,9 +68,10 @@ add_executable( owfms
|
|||||||
src/framework/MicroService.h
|
src/framework/MicroService.h
|
||||||
src/framework/OpenWifiTypes.h
|
src/framework/OpenWifiTypes.h
|
||||||
src/framework/orm.h
|
src/framework/orm.h
|
||||||
|
src/framework/RESTAPI_errors.h
|
||||||
|
src/framework/RESTAPI_protocol.h
|
||||||
src/framework/StorageClass.h
|
src/framework/StorageClass.h
|
||||||
src/framework/ow_constants.h
|
src/framework/uCentral_Protocol.h
|
||||||
src/framework/WebSocketClientNotifications.h
|
|
||||||
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
|
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
|
||||||
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
|
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
|
||||||
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
|
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
|
||||||
@@ -86,7 +83,12 @@ add_executable( owfms
|
|||||||
src/RESTAPI/RESTAPI_connectedDevicesHandler.cpp src/RESTAPI/RESTAPI_connectedDevicesHandler.h
|
src/RESTAPI/RESTAPI_connectedDevicesHandler.cpp src/RESTAPI/RESTAPI_connectedDevicesHandler.h
|
||||||
src/RESTAPI/RESTAPI_deviceReportHandler.cpp src/RESTAPI/RESTAPI_deviceReportHandler.h
|
src/RESTAPI/RESTAPI_deviceReportHandler.cpp src/RESTAPI/RESTAPI_deviceReportHandler.h
|
||||||
src/RESTAPI/RESTAPI_connectedDeviceHandler.cpp src/RESTAPI/RESTAPI_connectedDeviceHandler.h
|
src/RESTAPI/RESTAPI_connectedDeviceHandler.cpp src/RESTAPI/RESTAPI_connectedDeviceHandler.h
|
||||||
src/RESTAPI/RESTAPI_Routers.cpp
|
src/storage/storage_tables.cpp
|
||||||
|
src/storage/storage_firmwares.cpp
|
||||||
|
src/storage/storage_firmwares.h src/storage/storage_history.cpp
|
||||||
|
src/storage/storage_history.h src/storage/storage_deviceTypes.cpp
|
||||||
|
src/storage/storage_deviceInfo.cpp src/storage/storage_deviceInfo.h
|
||||||
|
src/APIServers.cpp
|
||||||
src/Dashboard.cpp src/Dashboard.h
|
src/Dashboard.cpp src/Dashboard.h
|
||||||
src/Daemon.cpp src/Daemon.h
|
src/Daemon.cpp src/Daemon.h
|
||||||
src/StorageService.cpp src/StorageService.h
|
src/StorageService.cpp src/StorageService.h
|
||||||
@@ -98,17 +100,11 @@ add_executable( owfms
|
|||||||
src/FirmwareCache.cpp src/FirmwareCache.h
|
src/FirmwareCache.cpp src/FirmwareCache.h
|
||||||
src/SDK/Prov_SDK.cpp src/SDK/Prov_SDK.h
|
src/SDK/Prov_SDK.cpp src/SDK/Prov_SDK.h
|
||||||
src/AutoUpdater.cpp src/AutoUpdater.h src/SDK/GW_SDK.cpp src/SDK/GW_SDK.h
|
src/AutoUpdater.cpp src/AutoUpdater.h src/SDK/GW_SDK.cpp src/SDK/GW_SDK.h
|
||||||
src/NewCommandHandler.cpp src/NewCommandHandler.h
|
)
|
||||||
src/storage/orm_history.cpp src/storage/orm_history.h
|
|
||||||
src/storage/orm_firmwares.cpp src/storage/orm_firmwares.h
|
|
||||||
src/storage/orm_deviceInfo.cpp src/storage/orm_deviceInfo.h src/RESTAPI/RESTAPI_deviceInformation_handler.cpp src/RESTAPI/RESTAPI_deviceInformation_handler.h)
|
|
||||||
|
|
||||||
target_link_libraries( owfms PUBLIC
|
target_link_libraries(owfms PUBLIC
|
||||||
${Poco_LIBRARIES}
|
${Poco_LIBRARIES} ${MySQL_LIBRARIES}
|
||||||
${MySQL_LIBRARIES}
|
${Boost_LIBRARIES}
|
||||||
${ZLIB_LIBRARIES}
|
${ZLIB_LIBRARIES} ${AWSSDK_LINK_LIBRARIES}
|
||||||
${AWSSDK_LINK_LIBRARIES}
|
CppKafka::cppkafka )
|
||||||
fmt::fmt
|
|
||||||
CppKafka::cppkafka
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|||||||
111
Dockerfile
111
Dockerfile
@@ -1,41 +1,30 @@
|
|||||||
FROM alpine:3.15 AS build-base
|
FROM alpine AS builder
|
||||||
|
|
||||||
RUN apk add --update --no-cache \
|
RUN apk add --update --no-cache \
|
||||||
make cmake g++ git \
|
openssl openssh \
|
||||||
|
ncurses-libs \
|
||||||
|
bash util-linux coreutils curl libcurl \
|
||||||
|
make cmake gcc g++ libstdc++ libgcc git zlib-dev \
|
||||||
|
openssl-dev boost-dev curl-dev util-linux-dev \
|
||||||
unixodbc-dev postgresql-dev mariadb-dev \
|
unixodbc-dev postgresql-dev mariadb-dev \
|
||||||
librdkafka-dev boost-dev openssl-dev \
|
librdkafka-dev
|
||||||
zlib-dev nlohmann-json \
|
|
||||||
curl-dev
|
|
||||||
|
|
||||||
FROM build-base AS poco-build
|
|
||||||
|
|
||||||
ADD https://api.github.com/repos/stephb9959/poco/git/refs/heads/master version.json
|
|
||||||
RUN git clone https://github.com/stephb9959/poco /poco
|
RUN git clone https://github.com/stephb9959/poco /poco
|
||||||
|
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
|
||||||
|
RUN git clone https://github.com/nlohmann/json /json
|
||||||
|
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
|
||||||
|
RUN git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp /aws-sdk-cpp
|
||||||
|
|
||||||
WORKDIR /poco
|
WORKDIR /aws-sdk-cpp
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
WORKDIR cmake-build
|
WORKDIR cmake-build
|
||||||
RUN cmake ..
|
RUN cmake .. -DBUILD_ONLY="s3" \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow -Wno-error=uninitialized" \
|
||||||
|
-DAUTORUN_UNIT_TESTS=OFF
|
||||||
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 fmtlib-build
|
|
||||||
|
|
||||||
ADD https://api.github.com/repos/fmtlib/fmt/git/refs/heads/master version.json
|
|
||||||
RUN git clone https://github.com/fmtlib/fmt /fmtlib
|
|
||||||
|
|
||||||
WORKDIR /fmtlib
|
|
||||||
RUN mkdir cmake-build
|
|
||||||
WORKDIR cmake-build
|
|
||||||
RUN cmake ..
|
|
||||||
RUN make
|
|
||||||
RUN make install
|
|
||||||
|
|
||||||
FROM build-base AS cppkafka-build
|
|
||||||
|
|
||||||
ADD https://api.github.com/repos/stephb9959/cppkafka/git/refs/heads/master version.json
|
|
||||||
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
|
|
||||||
|
|
||||||
WORKDIR /cppkafka
|
WORKDIR /cppkafka
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
WORKDIR cmake-build
|
WORKDIR cmake-build
|
||||||
@@ -43,10 +32,19 @@ 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 json-schema-validator-build
|
WORKDIR /poco
|
||||||
|
RUN mkdir cmake-build
|
||||||
|
WORKDIR cmake-build
|
||||||
|
RUN cmake ..
|
||||||
|
RUN cmake --build . --config Release -j8
|
||||||
|
RUN cmake --build . --target install
|
||||||
|
|
||||||
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/heads/master version.json
|
WORKDIR /json
|
||||||
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
|
RUN mkdir cmake-build
|
||||||
|
WORKDIR cmake-build
|
||||||
|
RUN cmake ..
|
||||||
|
RUN make
|
||||||
|
RUN make install
|
||||||
|
|
||||||
WORKDIR /json-schema-validator
|
WORKDIR /json-schema-validator
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
@@ -55,48 +53,18 @@ RUN cmake ..
|
|||||||
RUN make
|
RUN make
|
||||||
RUN make install
|
RUN make install
|
||||||
|
|
||||||
FROM build-base AS aws-sdk-cpp-build
|
|
||||||
|
|
||||||
ADD https://api.github.com/repos/aws/aws-sdk-cpp/git/refs/heads/main version.json
|
|
||||||
RUN git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp /aws-sdk-cpp
|
|
||||||
|
|
||||||
WORKDIR /aws-sdk-cpp
|
|
||||||
RUN mkdir cmake-build
|
|
||||||
WORKDIR cmake-build
|
|
||||||
RUN cmake .. -DBUILD_ONLY="sns;s3" \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow -Wno-error=uninitialized" \
|
|
||||||
-DAUTORUN_UNIT_TESTS=OFF
|
|
||||||
RUN cmake --build . --config Release -j8
|
|
||||||
RUN cmake --build . --target install
|
|
||||||
|
|
||||||
FROM build-base AS owfms-build
|
|
||||||
|
|
||||||
ADD CMakeLists.txt build /owfms/
|
ADD CMakeLists.txt build /owfms/
|
||||||
ADD cmake /owfms/cmake
|
ADD cmake /owfms/cmake
|
||||||
ADD src /owfms/src
|
ADD src /owfms/src
|
||||||
ADD .git /owfms/.git
|
ADD .git /owfms/.git
|
||||||
|
|
||||||
COPY --from=poco-build /usr/local/include /usr/local/include
|
|
||||||
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/lib /usr/local/lib
|
|
||||||
COPY --from=json-schema-validator-build /usr/local/include /usr/local/include
|
|
||||||
COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib
|
|
||||||
COPY --from=aws-sdk-cpp-build /usr/local/include /usr/local/include
|
|
||||||
COPY --from=aws-sdk-cpp-build /usr/local/lib /usr/local/lib
|
|
||||||
COPY --from=fmtlib-build /usr/local/include /usr/local/include
|
|
||||||
COPY --from=fmtlib-build /usr/local/lib /usr/local/lib
|
|
||||||
|
|
||||||
WORKDIR /owfms
|
WORKDIR /owfms
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
WORKDIR /owfms/cmake-build
|
WORKDIR /owfms/cmake-build
|
||||||
RUN cmake .. \
|
RUN cmake ..
|
||||||
-Dcrypto_LIBRARY=/usr/lib/libcrypto.so \
|
|
||||||
-DBUILD_SHARED_LIBS=ON
|
|
||||||
RUN cmake --build . --config Release -j8
|
RUN cmake --build . --config Release -j8
|
||||||
|
|
||||||
FROM alpine:3.15
|
FROM alpine
|
||||||
|
|
||||||
ENV OWFMS_USER=owfms \
|
ENV OWFMS_USER=owfms \
|
||||||
OWFMS_ROOT=/owfms-data \
|
OWFMS_ROOT=/owfms-data \
|
||||||
@@ -108,25 +76,20 @@ RUN addgroup -S "$OWFMS_USER" && \
|
|||||||
RUN mkdir /openwifi
|
RUN mkdir /openwifi
|
||||||
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
|
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
|
||||||
chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
||||||
|
RUN apk add --update --no-cache librdkafka curl-dev mariadb-connector-c libpq unixodbc su-exec gettext ca-certificates bash jq curl
|
||||||
|
|
||||||
RUN apk add --update --no-cache librdkafka su-exec gettext ca-certificates bash jq curl \
|
COPY --from=builder /owfms/cmake-build/owfms /openwifi/owfms
|
||||||
mariadb-connector-c libpq unixodbc postgresql-client
|
COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/
|
||||||
|
COPY --from=builder /poco/cmake-build/lib/* /lib/
|
||||||
COPY readiness_check /readiness_check
|
COPY --from=builder /aws-sdk-cpp/cmake-build/aws-cpp-sdk-core/libaws-cpp-sdk-core.so /lib/
|
||||||
COPY test_scripts/curl/cli /cli
|
COPY --from=builder /aws-sdk-cpp/cmake-build/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so /lib/
|
||||||
|
|
||||||
COPY owfms.properties.tmpl /
|
COPY owfms.properties.tmpl /
|
||||||
COPY docker-entrypoint.sh /
|
COPY docker-entrypoint.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.pem
|
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem
|
||||||
|
|
||||||
COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms
|
COPY readiness_check /readiness_check
|
||||||
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=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-core/libaws-cpp-sdk-core.so /usr/local/lib
|
|
||||||
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so /usr/local/lib
|
|
||||||
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-sns/libaws-cpp-sdk-sns.so /usr/local/lib
|
|
||||||
|
|
||||||
EXPOSE 16004 17004 16104
|
EXPOSE 16004 17004 16104
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ if [ "$SELFSIGNED_CERTS" = 'true' ]; then
|
|||||||
update-ca-certificates
|
update-ca-certificates
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
|
if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; then
|
||||||
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWFMS_ROOT/certs/restapi-ca.pem"} \
|
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWFMS_ROOT/certs/restapi-ca.pem"} \
|
||||||
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16004"} \
|
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16004"} \
|
||||||
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWFMS_ROOT/certs/restapi-cert.pem"} \
|
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWFMS_ROOT/certs/restapi-cert.pem"} \
|
||||||
@@ -29,10 +29,6 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
|
|||||||
S3_BUCKET_URI=${S3_BUCKET_URI:-"ucentral-ap-firmware.s3.amazonaws.com"} \
|
S3_BUCKET_URI=${S3_BUCKET_URI:-"ucentral-ap-firmware.s3.amazonaws.com"} \
|
||||||
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
|
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
|
||||||
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
|
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
|
||||||
KAFKA_SSL_CA_LOCATION=${KAFKA_SSL_CA_LOCATION:-""} \
|
|
||||||
KAFKA_SSL_CERTIFICATE_LOCATION=${KAFKA_SSL_CERTIFICATE_LOCATION:-""} \
|
|
||||||
KAFKA_SSL_KEY_LOCATION=${KAFKA_SSL_KEY_LOCATION:-""} \
|
|
||||||
KAFKA_SSL_KEY_PASSWORD=${KAFKA_SSL_KEY_PASSWORD:-""} \
|
|
||||||
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
|
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
|
||||||
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
|
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
|
||||||
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owfms"} \
|
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owfms"} \
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ name: owfms
|
|||||||
version: 0.1.0
|
version: 0.1.0
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
repository: https://charts.bitnami.com/bitnami
|
||||||
version: 10.9.2
|
version: 10.9.2
|
||||||
condition: postgresql.enabled
|
condition: postgresql.enabled
|
||||||
- name: mysql
|
- name: mysql
|
||||||
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
repository: https://charts.bitnami.com/bitnami
|
||||||
version: 8.8.3
|
version: 8.8.3
|
||||||
condition: mysql.enabled
|
condition: mysql.enabled
|
||||||
- name: mariadb
|
- name: mariadb
|
||||||
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
repository: https://charts.bitnami.com/bitnami
|
||||||
version: 9.4.2
|
version: 9.4.2
|
||||||
condition: mariadb.enabled
|
condition: mariadb.enabled
|
||||||
|
|||||||
@@ -30,13 +30,3 @@ Create chart name and version as used by the chart label.
|
|||||||
{{- define "owfms.chart" -}}
|
{{- define "owfms.chart" -}}
|
||||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- define "owfms.ingress.apiVersion" -}}
|
|
||||||
{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" -}}
|
|
||||||
{{- print "networking.k8s.io/v1" -}}
|
|
||||||
{{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}}
|
|
||||||
{{- print "networking.k8s.io/v1beta1" -}}
|
|
||||||
{{- else -}}
|
|
||||||
{{- print "extensions/v1beta1" -}}
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ spec:
|
|||||||
replicas: {{ .Values.replicaCount }}
|
replicas: {{ .Values.replicaCount }}
|
||||||
strategy:
|
strategy:
|
||||||
type: {{ .Values.strategyType }}
|
type: {{ .Values.strategyType }}
|
||||||
revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
|
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app.kubernetes.io/name: {{ include "owfms.name" . }}
|
app.kubernetes.io/name: {{ include "owfms.name" . }}
|
||||||
@@ -36,16 +35,6 @@ spec:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
spec:
|
spec:
|
||||||
|
|
||||||
initContainers:
|
|
||||||
- name: wait-kafka
|
|
||||||
image: "{{ .Values.images.dockerize.repository }}:{{ .Values.images.dockerize.tag }}"
|
|
||||||
imagePullPolicy: {{ .Values.images.dockerize.pullPolicy }}
|
|
||||||
args:
|
|
||||||
- -wait
|
|
||||||
- tcp://{{ index .Values.configProperties "openwifi.kafka.brokerlist" }}
|
|
||||||
- -timeout
|
|
||||||
- 600s
|
|
||||||
|
|
||||||
containers:
|
containers:
|
||||||
|
|
||||||
- name: owfms
|
- name: owfms
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{{- range $ingress, $ingressValue := .Values.ingresses }}
|
{{- range $ingress, $ingressValue := .Values.ingresses }}
|
||||||
{{- if $ingressValue.enabled }}
|
{{- if $ingressValue.enabled }}
|
||||||
---
|
---
|
||||||
apiVersion: {{ include "owfms.ingress.apiVersion" $root }}
|
apiVersion: extensions/v1beta1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ include "owfms.fullname" $root }}-{{ $ingress }}
|
name: {{ include "owfms.fullname" $root }}-{{ $ingress }}
|
||||||
@@ -36,23 +36,9 @@ spec:
|
|||||||
paths:
|
paths:
|
||||||
{{- range $ingressValue.paths }}
|
{{- range $ingressValue.paths }}
|
||||||
- path: {{ .path }}
|
- path: {{ .path }}
|
||||||
{{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
|
|
||||||
pathType: {{ .pathType | default "ImplementationSpecific" }}
|
|
||||||
{{- end }}
|
|
||||||
backend:
|
backend:
|
||||||
{{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
|
|
||||||
service:
|
|
||||||
name: {{ include "owfms.fullname" $root }}-{{ .serviceName }}
|
|
||||||
port:
|
|
||||||
{{- if kindIs "string" .servicePort }}
|
|
||||||
name: {{ .servicePort }}
|
|
||||||
{{- else }}
|
|
||||||
number: {{ .servicePort }}
|
|
||||||
{{- end }}
|
|
||||||
{{- else }}
|
|
||||||
serviceName: {{ include "owfms.fullname" $root }}-{{ .serviceName }}
|
serviceName: {{ include "owfms.fullname" $root }}-{{ .serviceName }}
|
||||||
servicePort: {{ .servicePort }}
|
servicePort: {{ .servicePort }}
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
# System
|
# System
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
strategyType: Recreate
|
strategyType: Recreate
|
||||||
revisionHistoryLimit: 2
|
|
||||||
|
|
||||||
nameOverride: ""
|
nameOverride: ""
|
||||||
fullnameOverride: ""
|
fullnameOverride: ""
|
||||||
@@ -9,20 +8,16 @@ fullnameOverride: ""
|
|||||||
images:
|
images:
|
||||||
owfms:
|
owfms:
|
||||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
|
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
|
||||||
tag: v2.6.0-RC2
|
tag: v2.4.0-RC5
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
# regcred:
|
# regcred:
|
||||||
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
# username: username
|
# username: username
|
||||||
# password: password
|
# password: password
|
||||||
dockerize:
|
|
||||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/dockerize
|
|
||||||
tag: 0.16.0
|
|
||||||
pullPolicy: IfNotPresent
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
owfms:
|
owfms:
|
||||||
type: ClusterIP
|
type: LoadBalancer
|
||||||
ports:
|
ports:
|
||||||
restapi:
|
restapi:
|
||||||
servicePort: 16004
|
servicePort: 16004
|
||||||
@@ -43,6 +38,8 @@ checks:
|
|||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
- /readiness_check
|
- /readiness_check
|
||||||
|
failureThreshold: 1
|
||||||
|
|
||||||
|
|
||||||
ingresses:
|
ingresses:
|
||||||
restapi:
|
restapi:
|
||||||
@@ -54,7 +51,6 @@ ingresses:
|
|||||||
- restapi.chart-example.local
|
- restapi.chart-example.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementationSpecific
|
|
||||||
serviceName: owfms
|
serviceName: owfms
|
||||||
servicePort: restapi
|
servicePort: restapi
|
||||||
|
|
||||||
@@ -155,10 +151,6 @@ configProperties:
|
|||||||
openwifi.kafka.brokerlist: localhost:9092
|
openwifi.kafka.brokerlist: localhost:9092
|
||||||
openwifi.kafka.auto.commit: false
|
openwifi.kafka.auto.commit: false
|
||||||
openwifi.kafka.queue.buffering.max.ms: 50
|
openwifi.kafka.queue.buffering.max.ms: 50
|
||||||
openwifi.kafka.ssl.ca.location: ""
|
|
||||||
openwifi.kafka.ssl.certificate.location: ""
|
|
||||||
openwifi.kafka.ssl.key.location: ""
|
|
||||||
openwifi.kafka.ssl.key.password: ""
|
|
||||||
# Storage
|
# Storage
|
||||||
storage.type: sqlite # (sqlite|postgresql|mysql|odbc)
|
storage.type: sqlite # (sqlite|postgresql|mysql|odbc)
|
||||||
## SQLite
|
## SQLite
|
||||||
@@ -188,9 +180,22 @@ configProperties:
|
|||||||
openwifi.system.uri.ui: https://localhost
|
openwifi.system.uri.ui: https://localhost
|
||||||
openwifi.system.commandchannel: /tmp/app_owfms
|
openwifi.system.commandchannel: /tmp/app_owfms
|
||||||
# Logging
|
# Logging
|
||||||
logging.type: console
|
logging.formatters.f1.class: PatternFormatter
|
||||||
logging.path: $OWFMS_ROOT/logs
|
logging.formatters.f1.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
|
||||||
logging.level: debug
|
logging.formatters.f1.times: UTC
|
||||||
|
logging.channels.c1.class: ConsoleChannel
|
||||||
|
logging.channels.c1.formatter: f1
|
||||||
|
logging.channels.c2.class: FileChannel
|
||||||
|
logging.channels.c2.path: /tmp/log_owfms
|
||||||
|
logging.channels.c2.formatter.class: PatternFormatter
|
||||||
|
logging.channels.c2.formatter.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
|
||||||
|
logging.channels.c2.rotation: "20 M"
|
||||||
|
logging.channels.c2.archive: timestamp
|
||||||
|
logging.channels.c2.purgeCount: 20
|
||||||
|
logging.channels.c3.class: ConsoleChannel
|
||||||
|
logging.channels.c3.pattern: "%s: [%p] %t"
|
||||||
|
logging.loggers.root.channel: c1
|
||||||
|
logging.loggers.root.level: debug
|
||||||
|
|
||||||
# -> Secret part
|
# -> Secret part
|
||||||
# REST API
|
# REST API
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ openapi: 3.0.1
|
|||||||
info:
|
info:
|
||||||
title: uCentral Firmware Service API
|
title: uCentral Firmware Service API
|
||||||
description: A process to manage new uCentral firmware distribution.
|
description: A process to manage new uCentral firmware distribution.
|
||||||
version: 2.5.0
|
version: 2.0.0
|
||||||
license:
|
license:
|
||||||
name: BSD3
|
name: BSD3
|
||||||
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||||
@@ -60,11 +60,6 @@ components:
|
|||||||
- 6 # INTERNAL_ERROR,
|
- 6 # INTERNAL_ERROR,
|
||||||
- 7 # ACCESS_DENIED,
|
- 7 # ACCESS_DENIED,
|
||||||
- 8 # INVALID_TOKEN
|
- 8 # INVALID_TOKEN
|
||||||
- 9 # EXPIRED_TOKEN
|
|
||||||
- 10 # RATE_LIMIT_EXCEEDED
|
|
||||||
- 11 # BAD_MFA_TRANSACTION
|
|
||||||
- 12 # MFA_FAILURE
|
|
||||||
- 13 # SECURITY_SERVICE_UNREACHABLE
|
|
||||||
ErrorDetails:
|
ErrorDetails:
|
||||||
type: string
|
type: string
|
||||||
ErrorDescription:
|
ErrorDescription:
|
||||||
@@ -140,25 +135,6 @@ components:
|
|||||||
items:
|
items:
|
||||||
$ref: '#/components/schemas/FirmwareDetails'
|
$ref: '#/components/schemas/FirmwareDetails'
|
||||||
|
|
||||||
DeviceCurrentInfo:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serialNumber:
|
|
||||||
type: string
|
|
||||||
revision:
|
|
||||||
type: string
|
|
||||||
upgraded:
|
|
||||||
type: integer
|
|
||||||
format: int64
|
|
||||||
|
|
||||||
DeviceCurrentInfoList:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
devices:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
$ref: '#/components/schemas/DeviceCurrentInfo'
|
|
||||||
|
|
||||||
RevisionHistoryEntry:
|
RevisionHistoryEntry:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -276,26 +252,6 @@ components:
|
|||||||
totalSecondsOld:
|
totalSecondsOld:
|
||||||
$ref: '#/components/schemas/TagIntPairList'
|
$ref: '#/components/schemas/TagIntPairList'
|
||||||
|
|
||||||
DeviceInformation:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serialNumber:
|
|
||||||
type: string
|
|
||||||
history:
|
|
||||||
$ref: '#/components/schemas/RevisionHistoryEntryList'
|
|
||||||
currentFirmware:
|
|
||||||
type: string
|
|
||||||
currentFirmwareDate:
|
|
||||||
type: integer
|
|
||||||
format: int64
|
|
||||||
latestFirmware:
|
|
||||||
type: string
|
|
||||||
latestFirmwareDate:
|
|
||||||
type: integer
|
|
||||||
format: int64
|
|
||||||
latestFirmwareAvailable:
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
##
|
##
|
||||||
## These are endpoints that all services in the uCentral stack must provide
|
## These are endpoints that all services in the uCentral stack must provide
|
||||||
@@ -494,10 +450,9 @@ paths:
|
|||||||
required: false
|
required: false
|
||||||
- in: query
|
- in: query
|
||||||
name: latestOnly
|
name: latestOnly
|
||||||
description: Return only the latest firmware
|
description: Return only the latest firwares
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
|
||||||
required: false
|
required: false
|
||||||
- in: query
|
- in: query
|
||||||
name: deviceType
|
name: deviceType
|
||||||
@@ -508,28 +463,19 @@ paths:
|
|||||||
name: revisionSet
|
name: revisionSet
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
|
||||||
required: false
|
required: false
|
||||||
- in: query
|
- in: query
|
||||||
name: deviceSet
|
name: deviceSet
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
required: false
|
required: false
|
||||||
- in: query
|
|
||||||
name: rcOnly
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
required: false
|
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
description: List firmwares
|
description: List firmwares
|
||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
oneOf:
|
$ref: '#/components/schemas/FirmwareDetailsList'
|
||||||
- $ref: '#/components/schemas/FirmwareDetailsList'
|
|
||||||
- $ref: '#/components/schemas/FirmwareDetails'
|
|
||||||
403:
|
403:
|
||||||
$ref: '#/components/responses/Unauthorized'
|
$ref: '#/components/responses/Unauthorized'
|
||||||
404:
|
404:
|
||||||
@@ -676,31 +622,13 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
required: false
|
required: false
|
||||||
- in: query
|
|
||||||
description: Return current device list and current firmware
|
|
||||||
name: currentList
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
required: false
|
|
||||||
example: You must set {serialNumber} to 000000000000
|
|
||||||
- in: query
|
|
||||||
description: Return current device list and current firmware
|
|
||||||
name: unknownList
|
|
||||||
schema:
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
required: false
|
|
||||||
example: You must set {serialNumber} to 000000000000
|
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
description: List of device history upgrade.
|
description: List of device history upgrade.
|
||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
oneOf:
|
$ref: '#/components/schemas/RevisionHistoryEntryList'
|
||||||
- $ref: '#/components/schemas/RevisionHistoryEntryList'
|
|
||||||
- $ref: '#/components/schemas/DeviceCurrentInfoList'
|
|
||||||
403:
|
403:
|
||||||
$ref: '#/components/responses/Unauthorized'
|
$ref: '#/components/responses/Unauthorized'
|
||||||
404:
|
404:
|
||||||
@@ -855,28 +783,6 @@ paths:
|
|||||||
404:
|
404:
|
||||||
$ref: '#/components/responses/NotFound'
|
$ref: '#/components/responses/NotFound'
|
||||||
|
|
||||||
/deviceInformation/{serialNumber}:
|
|
||||||
get:
|
|
||||||
tags:
|
|
||||||
- Device Information
|
|
||||||
summary: receive a repor on a single decide
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: serialNumber
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
example:
|
|
||||||
aabbccdd1234
|
|
||||||
required: true
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
$ref: '#/components/schemas/DeviceInformation'
|
|
||||||
403:
|
|
||||||
$ref: '#/components/responses/Unauthorized'
|
|
||||||
404:
|
|
||||||
$ref: '#/components/responses/NotFound'
|
|
||||||
|
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
##
|
##
|
||||||
## These are endpoints that all services in the uCentral stack must provide
|
## These are endpoints that all services in the uCentral stack must provide
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ openwifi.system.uri.private = https://localhost:17004
|
|||||||
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004
|
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004
|
||||||
openwifi.system.commandchannel = /tmp/app.owfms
|
openwifi.system.commandchannel = /tmp/app.owfms
|
||||||
openwifi.system.uri.ui = ucentral-ui.arilia.com
|
openwifi.system.uri.ui = ucentral-ui.arilia.com
|
||||||
|
|
||||||
firmwaredb.refresh = 1800
|
firmwaredb.refresh = 1800
|
||||||
firmwaredb.maxage = 90
|
firmwaredb.maxage = 90
|
||||||
|
|
||||||
@@ -69,10 +68,6 @@ openwifi.kafka.enable = true
|
|||||||
openwifi.kafka.brokerlist = a1.arilia.com:9092
|
openwifi.kafka.brokerlist = a1.arilia.com:9092
|
||||||
openwifi.kafka.auto.commit = false
|
openwifi.kafka.auto.commit = false
|
||||||
openwifi.kafka.queue.buffering.max.ms = 50
|
openwifi.kafka.queue.buffering.max.ms = 50
|
||||||
openwifi.kafka.ssl.ca.location =
|
|
||||||
openwifi.kafka.ssl.certificate.location =
|
|
||||||
openwifi.kafka.ssl.key.location =
|
|
||||||
openwifi.kafka.ssl.key.password =
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# This section select which form of persistence you need
|
# This section select which form of persistence you need
|
||||||
@@ -113,9 +108,37 @@ storage.type.mysql.connectiontimeout = 60
|
|||||||
# Logging: please leave as is for now.
|
# Logging: please leave as is for now.
|
||||||
#
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
logging.type = file
|
logging.formatters.f1.class = PatternFormatter
|
||||||
logging.path = $OWFMS_ROOT/logs
|
logging.formatters.f1.pattern = %s: [%p] %t
|
||||||
logging.level = debug
|
logging.formatters.f1.times = UTC
|
||||||
|
logging.channels.c1.class = ConsoleChannel
|
||||||
|
logging.channels.c1.formatter = f1
|
||||||
|
|
||||||
|
# This is where the logs will be written. This path MUST exist
|
||||||
|
logging.channels.c2.class = FileChannel
|
||||||
|
logging.channels.c2.path = $OWFMS_ROOT/logs/log
|
||||||
|
logging.channels.c2.formatter.class = PatternFormatter
|
||||||
|
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
||||||
|
logging.channels.c2.rotation = 20 M
|
||||||
|
logging.channels.c2.archive = timestamp
|
||||||
|
logging.channels.c2.purgeCount = 20
|
||||||
|
logging.channels.c3.class = ConsoleChannel
|
||||||
|
logging.channels.c3.pattern = %s: [%p] %t
|
||||||
|
|
||||||
|
# External Channel
|
||||||
|
logging.loggers.root.channel = c2
|
||||||
|
logging.loggers.root.level = debug
|
||||||
|
|
||||||
|
# Inline Channel with PatternFormatter
|
||||||
|
# logging.loggers.l1.name = logger1
|
||||||
|
# logging.loggers.l1.channel.class = ConsoleChannel
|
||||||
|
# logging.loggers.l1.channel.pattern = %s: [%p] %t
|
||||||
|
# logging.loggers.l1.level = information
|
||||||
|
# SplitterChannel
|
||||||
|
# logging.channels.splitter.class = SplitterChannel
|
||||||
|
# logging.channels.splitter.channels = l1,l2
|
||||||
|
# logging.loggers.l2.name = logger2
|
||||||
|
# logging.loggers.l2.channel = splitter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -67,10 +67,6 @@ openwifi.kafka.enable = ${KAFKA_ENABLE}
|
|||||||
openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST}
|
openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST}
|
||||||
openwifi.kafka.auto.commit = false
|
openwifi.kafka.auto.commit = false
|
||||||
openwifi.kafka.queue.buffering.max.ms = 50
|
openwifi.kafka.queue.buffering.max.ms = 50
|
||||||
openwifi.kafka.ssl.ca.location = ${KAFKA_SSL_CA_LOCATION}
|
|
||||||
openwifi.kafka.ssl.certificate.location = ${KAFKA_SSL_CERTIFICATE_LOCATION}
|
|
||||||
openwifi.kafka.ssl.key.location = ${KAFKA_SSL_KEY_LOCATION}
|
|
||||||
openwifi.kafka.ssl.key.password = ${KAFKA_SSL_KEY_PASSWORD}
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# This section select which form of persistence you need
|
# This section select which form of persistence you need
|
||||||
@@ -108,6 +104,37 @@ storage.type.mysql.connectiontimeout = 60
|
|||||||
# Logging: please leave as is for now.
|
# Logging: please leave as is for now.
|
||||||
#
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
logging.type = console
|
logging.formatters.f1.class = PatternFormatter
|
||||||
logging.path = $OWFMS_ROOT/logs
|
logging.formatters.f1.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
||||||
logging.level = debug
|
logging.formatters.f1.times = UTC
|
||||||
|
logging.channels.c1.class = ConsoleChannel
|
||||||
|
logging.channels.c1.formatter = f1
|
||||||
|
|
||||||
|
# This is where the logs will be written. This path MUST exist
|
||||||
|
logging.channels.c2.class = FileChannel
|
||||||
|
logging.channels.c2.path = $OWFMS_ROOT/logs/log
|
||||||
|
logging.channels.c2.formatter.class = PatternFormatter
|
||||||
|
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
||||||
|
logging.channels.c2.rotation = 20 M
|
||||||
|
logging.channels.c2.archive = timestamp
|
||||||
|
logging.channels.c2.purgeCount = 20
|
||||||
|
logging.channels.c3.class = ConsoleChannel
|
||||||
|
logging.channels.c3.pattern = %s: [%p] %t
|
||||||
|
|
||||||
|
# External Channel
|
||||||
|
logging.loggers.root.channel = c1
|
||||||
|
logging.loggers.root.level = debug
|
||||||
|
|
||||||
|
# Inline Channel with PatternFormatter
|
||||||
|
# logging.loggers.l1.name = logger1
|
||||||
|
# logging.loggers.l1.channel.class = ConsoleChannel
|
||||||
|
# logging.loggers.l1.channel.pattern = %s: [%p] %t
|
||||||
|
# logging.loggers.l1.level = information
|
||||||
|
# SplitterChannel
|
||||||
|
# logging.channels.splitter.class = SplitterChannel
|
||||||
|
# logging.channels.splitter.channels = l1,l2
|
||||||
|
# logging.loggers.l2.name = logger2
|
||||||
|
# logging.loggers.l2.channel = splitter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,29 +13,29 @@ then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "${OWSEC}" == "" ]]
|
||||||
|
then
|
||||||
|
echo "You must set the variable OWSEC in order to use this script. Something like"
|
||||||
|
echo "OWSEC=security.isp.com:16001"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${OWSEC_USERNAME}" == "" ]]
|
||||||
|
then
|
||||||
|
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
|
||||||
|
echo "OWSEC_USERNAME=tip@ucentral.com"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${OWSEC_PASSWORD}" == "" ]]
|
||||||
|
then
|
||||||
|
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
|
||||||
|
echo "OWSEC_PASSWORD=openwifi"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
|
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
|
||||||
then
|
then
|
||||||
if [[ "${OWSEC}" == "" ]]
|
|
||||||
then
|
|
||||||
echo "You must set the variable OWSEC in order to use this script. Something like"
|
|
||||||
echo "OWSEC=security.isp.com:16001"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${OWSEC_USERNAME}" == "" ]]
|
|
||||||
then
|
|
||||||
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
|
|
||||||
echo "OWSEC_USERNAME=tip@ucentral.com"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${OWSEC_PASSWORD}" == "" ]]
|
|
||||||
then
|
|
||||||
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
|
|
||||||
echo "OWSEC_PASSWORD=openwifi"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get OAuth token from OWSEC and cache it or use cached one
|
# Get OAuth token from OWSEC and cache it or use cached one
|
||||||
payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
|
payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
|
||||||
if [[ -f "/tmp/token" ]]
|
if [[ -f "/tmp/token" ]]
|
||||||
|
|||||||
41
src/APIServers.cpp
Normal file
41
src/APIServers.cpp
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-10-23.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "framework/MicroService.h"
|
||||||
|
|
||||||
|
#include "RESTAPI/RESTAPI_firmwareHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_firmwaresHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_firmwareAgeHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_connectedDeviceHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_historyHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_deviceReportHandler.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler * RESTAPI_external_server(const char *Path, RESTAPIHandler::BindingMap &Bindings,
|
||||||
|
Poco::Logger & L, RESTAPI_GenericServer & S) {
|
||||||
|
return RESTAPI_Router<
|
||||||
|
RESTAPI_firmwaresHandler,
|
||||||
|
RESTAPI_firmwareHandler,
|
||||||
|
RESTAPI_system_command,
|
||||||
|
RESTAPI_firmwareAgeHandler,
|
||||||
|
RESTAPI_connectedDevicesHandler,
|
||||||
|
RESTAPI_connectedDeviceHandler,
|
||||||
|
RESTAPI_historyHandler,
|
||||||
|
RESTAPI_deviceReportHandler
|
||||||
|
>(Path,Bindings,L, S);
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler * RESTAPI_internal_server(const char *Path, RESTAPIHandler::BindingMap &Bindings,
|
||||||
|
Poco::Logger & L, RESTAPI_GenericServer & S) {
|
||||||
|
return RESTAPI_Router_I<
|
||||||
|
RESTAPI_firmwaresHandler,
|
||||||
|
RESTAPI_firmwareHandler,
|
||||||
|
RESTAPI_system_command,
|
||||||
|
RESTAPI_connectedDevicesHandler,
|
||||||
|
RESTAPI_connectedDeviceHandler
|
||||||
|
>(Path, Bindings, L, S);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,22 +11,19 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int AutoUpdater::Start() {
|
int AutoUpdater::Start() {
|
||||||
|
Running_ = true;
|
||||||
|
AutoUpdaterFrequency_ = MicroService::instance().ConfigGetInt("autoupdater.frequency",600);
|
||||||
AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false);
|
AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false);
|
||||||
if(AutoUpdaterEnabled_) {
|
if(AutoUpdaterEnabled_)
|
||||||
Running_ = false;
|
Thr_.start(*this);
|
||||||
AutoUpdaterFrequency_ = MicroService::instance().ConfigGetInt("autoupdater.frequency",600);
|
|
||||||
AutoUpdaterCallBack_ = std::make_unique<Poco::TimerCallback<AutoUpdater>>(*this, &AutoUpdater::onTimer);
|
|
||||||
Timer_.setStartInterval(5 * 60 * 1000); // first run in 5 minutes
|
|
||||||
Timer_.setPeriodicInterval(AutoUpdaterFrequency_ * 1000);
|
|
||||||
Timer_.start(*AutoUpdaterCallBack_);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::Stop() {
|
void AutoUpdater::Stop() {
|
||||||
Running_ = false;
|
Running_ = false;
|
||||||
if(AutoUpdaterEnabled_) {
|
if(AutoUpdaterEnabled_) {
|
||||||
Timer_.stop();
|
Thr_.wakeUp();
|
||||||
|
Thr_.join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,68 +34,71 @@ namespace OpenWifi {
|
|||||||
Queue_.emplace_back(std::make_pair(std::move(serialNumber),std::move(DeviceType)));
|
Queue_.emplace_back(std::make_pair(std::move(serialNumber),std::move(DeviceType)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::onTimer([[maybe_unused]] Poco::Timer & timer) {
|
void AutoUpdater::run() {
|
||||||
Utils::SetThreadName("auto-updater");
|
while(Running_) {
|
||||||
Running_ = true;
|
Poco::Thread::trySleep(2000);
|
||||||
std::unique_lock L(Mutex_);
|
if(!Running_)
|
||||||
while(!Queue_.empty() && Running_) {
|
break;
|
||||||
auto Entry = Queue_.front();
|
std::unique_lock L(Mutex_);
|
||||||
Queue_.pop_front();
|
while(!Queue_.empty() && Running_) {
|
||||||
try {
|
auto Entry = Queue_.front();
|
||||||
Logger().debug(fmt::format("Preparing to upgrade {}",Entry.first));
|
Queue_.pop_front();
|
||||||
auto CacheEntry = Cache_.find(Entry.first);
|
try {
|
||||||
uint64_t now = OpenWifi::Now();
|
Logger_.debug(Poco::format("Preparing to upgrade %s",Entry.first));
|
||||||
std::string firmwareUpgrade;
|
auto CacheEntry = Cache_.find(Entry.first);
|
||||||
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-now)>300) {
|
uint64_t Now = std::time(nullptr);
|
||||||
// get the firmware settings for that device.
|
std::string firmwareUpgrade;
|
||||||
SerialCache C;
|
|
||||||
C.LastCheck = now;
|
|
||||||
bool firmwareRCOnly;
|
bool firmwareRCOnly;
|
||||||
if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
|
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-Now)>300) {
|
||||||
Logger().debug(fmt::format("Found firmware options for {}",Entry.first));
|
// get the firmware settings for that device.
|
||||||
C.firmwareRCOnly = firmwareRCOnly;
|
SerialCache C;
|
||||||
C.firmwareUpgrade = firmwareUpgrade;
|
C.LastCheck = Now;
|
||||||
} else {
|
if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
|
||||||
Logger().debug(fmt::format("Found no firmware options for {}",Entry.first));
|
Logger_.debug(Poco::format("Found firmware options for %s",Entry.first));
|
||||||
C.firmwareRCOnly = firmwareRCOnly;
|
C.firmwareRCOnly = firmwareRCOnly;
|
||||||
C.firmwareUpgrade = firmwareUpgrade;
|
C.firmwareUpgrade = firmwareUpgrade;
|
||||||
}
|
|
||||||
Cache_[Entry.first] = C;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(firmwareUpgrade=="no") {
|
|
||||||
Logger().information(fmt::format("Device {} not upgradable. Provisioning service settings.",Entry.first));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
LatestFirmwareCacheEntry fwEntry;
|
|
||||||
FMSObjects::Firmware fwDetails;
|
|
||||||
auto LF = LatestFirmwareCache()->FindLatestFirmware(Entry.second, fwEntry );
|
|
||||||
if(LF) {
|
|
||||||
if(StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id,fwDetails)) {
|
|
||||||
// send the command to upgrade this device...
|
|
||||||
Logger().information(fmt::format("Upgrading {} to version {}", Entry.first, fwEntry.Revision));
|
|
||||||
if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
|
|
||||||
Logger().information(fmt::format("Upgrade command sent for {}",Entry.first));
|
|
||||||
} else {
|
} else {
|
||||||
Logger().information(fmt::format("Upgrade command not sent for {}",Entry.first));
|
Logger_.debug(Poco::format("Found no firmware options for %s",Entry.first));
|
||||||
|
C.firmwareRCOnly = firmwareRCOnly;
|
||||||
|
C.firmwareUpgrade = firmwareUpgrade;
|
||||||
|
}
|
||||||
|
Cache_[Entry.first] = C;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(firmwareUpgrade=="no") {
|
||||||
|
Logger_.information(Poco::format("Device %s not upgradable. Provisioning service settings.",Entry.first));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
LatestFirmwareCacheEntry fwEntry;
|
||||||
|
FMSObjects::Firmware fwDetails;
|
||||||
|
auto LF = LatestFirmwareCache()->FindLatestFirmware(Entry.second, fwEntry );
|
||||||
|
if(LF) {
|
||||||
|
if(StorageService()->GetFirmware(fwEntry.Id,fwDetails)) {
|
||||||
|
// send the command to upgrade this device...
|
||||||
|
Logger_.information(Poco::format("Upgrading %s to version %s", Entry.first, fwEntry.Revision));
|
||||||
|
if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
|
||||||
|
Logger_.information(Poco::format("Upgrade command sent for %s",Entry.first));
|
||||||
|
} else {
|
||||||
|
Logger_.information(Poco::format("Upgrade command not sent for %s",Entry.first));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Logger_.information(Poco::format("Firmware for device %s (%s) cannot be found.", Entry.first, Entry.second ));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger().information(fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
|
Logger_.information(Poco::format("Firmware for device %s (%s) cannot be found.", Entry.first, Entry.second ));
|
||||||
}
|
}
|
||||||
} else {
|
} catch (...) {
|
||||||
Logger().information(fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
|
Logger_.information(Poco::format("Exception during auto update for device %s.", Entry.first ));
|
||||||
}
|
}
|
||||||
} catch (...) {
|
|
||||||
Logger().information(fmt::format("Exception during auto update for device {}.", Entry.first ));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
|
void AutoUpdater::reinitialize(Poco::Util::Application &self) {
|
||||||
Logger().information("Reinitializing.");
|
Logger_.information("Reinitializing.");
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,11 +8,9 @@
|
|||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include "Poco/Util/Application.h"
|
#include "Poco/Util/Application.h"
|
||||||
#include "Poco/Timer.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
class AutoUpdater : public SubSystemServer, Poco::Runnable {
|
||||||
class AutoUpdater : public SubSystemServer { // };, Poco::Runnable {
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct SerialCache {
|
struct SerialCache {
|
||||||
@@ -21,13 +19,14 @@ namespace OpenWifi {
|
|||||||
bool firmwareRCOnly=false;
|
bool firmwareRCOnly=false;
|
||||||
};
|
};
|
||||||
|
|
||||||
static auto instance() {
|
static AutoUpdater *instance() {
|
||||||
static auto instance_ = new AutoUpdater;
|
static AutoUpdater *instance_ = new AutoUpdater;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Start() override;
|
int Start() override;
|
||||||
void Stop() override;
|
void Stop() override;
|
||||||
|
void run() final;
|
||||||
void ToBeUpgraded(std::string serialNumber, std::string DeviceType);
|
void ToBeUpgraded(std::string serialNumber, std::string DeviceType);
|
||||||
inline void Reset() {
|
inline void Reset() {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
@@ -35,24 +34,21 @@ namespace OpenWifi {
|
|||||||
Queue_.clear();
|
Queue_.clear();
|
||||||
}
|
}
|
||||||
void reinitialize(Poco::Util::Application &self) final;
|
void reinitialize(Poco::Util::Application &self) final;
|
||||||
void onTimer(Poco::Timer & timer);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::atomic_bool Running_=false;
|
std::atomic_bool Running_=false;
|
||||||
std::map<std::string,SerialCache> Cache_;
|
Poco::Thread Thr_;
|
||||||
std::deque<std::pair<std::string,std::string>> Queue_;
|
std::map<std::string,SerialCache> Cache_;
|
||||||
uint64_t AutoUpdaterFrequency_=600;
|
std::deque<std::pair<std::string,std::string>> Queue_;
|
||||||
bool AutoUpdaterEnabled_=true;
|
uint64_t AutoUpdaterFrequency_=600;
|
||||||
Poco::Timer Timer_;
|
bool AutoUpdaterEnabled_=true;
|
||||||
std::unique_ptr<Poco::TimerCallback<AutoUpdater>> AutoUpdaterCallBack_;
|
|
||||||
|
|
||||||
explicit AutoUpdater() noexcept:
|
explicit AutoUpdater() noexcept:
|
||||||
SubSystemServer("AutoUpdater", "AUTO-UPDATER", "autoupdater")
|
SubSystemServer("AutoUpdater", "AUTO-UPDATER", "autoupdater")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto AutoUpdater() { return AutoUpdater::instance(); }
|
inline AutoUpdater * AutoUpdater() { return AutoUpdater::instance(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //OWFMS_AUTOUPDATER_H
|
#endif //OWFMS_AUTOUPDATER_H
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
#include "DeviceCache.h"
|
#include "DeviceCache.h"
|
||||||
#include "FirmwareCache.h"
|
#include "FirmwareCache.h"
|
||||||
#include "AutoUpdater.h"
|
#include "AutoUpdater.h"
|
||||||
#include "NewCommandHandler.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class Daemon *Daemon::instance_ = nullptr;
|
class Daemon *Daemon::instance_ = nullptr;
|
||||||
@@ -36,14 +35,18 @@ namespace OpenWifi {
|
|||||||
DeviceCache(),
|
DeviceCache(),
|
||||||
NewConnectionHandler(),
|
NewConnectionHandler(),
|
||||||
ManifestCreator(),
|
ManifestCreator(),
|
||||||
AutoUpdater(),
|
AutoUpdater()
|
||||||
NewCommandHandler()
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {
|
void Daemon::initialize(Poco::Util::Application &self) {
|
||||||
|
MicroService::initialize(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MicroServicePostInitialization() {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
15
src/Daemon.h
15
src/Daemon.h
@@ -12,11 +12,11 @@
|
|||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
[[maybe_unused]] static const char * vDAEMON_PROPERTIES_FILENAME = "owfms.properties";
|
static const char * vDAEMON_PROPERTIES_FILENAME = "owfms.properties";
|
||||||
[[maybe_unused]] static const char * vDAEMON_ROOT_ENV_VAR = "OWFMS_ROOT";
|
static const char * vDAEMON_ROOT_ENV_VAR = "OWFMS_ROOT";
|
||||||
[[maybe_unused]] static const char * vDAEMON_CONFIG_ENV_VAR = "OWFMS_CONFIG";
|
static const char * vDAEMON_CONFIG_ENV_VAR = "OWFMS_CONFIG";
|
||||||
[[maybe_unused]] static const char * vDAEMON_APP_NAME = uSERVICE_FIRMWARE.c_str();
|
static const char * vDAEMON_APP_NAME = uSERVICE_FIRMWARE.c_str();
|
||||||
[[maybe_unused]] static const uint64_t vDAEMON_BUS_TIMER = 10000;
|
static const uint64_t vDAEMON_BUS_TIMER = 10000;
|
||||||
|
|
||||||
class Daemon : public MicroService {
|
class Daemon : public MicroService {
|
||||||
public:
|
public:
|
||||||
@@ -28,7 +28,7 @@ namespace OpenWifi {
|
|||||||
const SubSystemVec & SubSystems) :
|
const SubSystemVec & SubSystems) :
|
||||||
MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
|
MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
|
||||||
|
|
||||||
void PostInitialization(Poco::Util::Application &self);
|
void initialize(Poco::Util::Application &self);
|
||||||
static Daemon *instance();
|
static Daemon *instance();
|
||||||
inline void ResetDashboard() { DB_.Reset(); }
|
inline void ResetDashboard() { DB_.Reset(); }
|
||||||
inline void CreateDashboard() { DB_.Create(); }
|
inline void CreateDashboard() { DB_.Create(); }
|
||||||
@@ -40,9 +40,6 @@ namespace OpenWifi {
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline Daemon * Daemon() { return Daemon::instance(); }
|
inline Daemon * Daemon() { return Daemon::instance(); }
|
||||||
inline void DaemonPostInitialization(Poco::Util::Application &self) {
|
|
||||||
Daemon()->PostInitialization(self);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //UCENTRALFWS_DAEMON_H
|
#endif //UCENTRALFWS_DAEMON_H
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void DeviceDashboard::Create() {
|
void DeviceDashboard::Create() {
|
||||||
uint64_t Now = OpenWifi::Now();
|
uint64_t Now = std::time(nullptr);
|
||||||
|
|
||||||
if(LastRun_==0 || (Now-LastRun_)>120) {
|
if(LastRun_==0 || (Now-LastRun_)>120) {
|
||||||
DB_.reset();
|
DB_.reset();
|
||||||
StorageService()->DevicesDB().GenerateDeviceReport(DB_);
|
StorageService()->GenerateDeviceReport(DB_);
|
||||||
LastRun_ = Now;
|
LastRun_ = Now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class DeviceCache : public SubSystemServer {
|
class DeviceCache : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static auto instance() {
|
static DeviceCache *instance() {
|
||||||
static auto instance_ = new DeviceCache;
|
static DeviceCache *instance_ = new DeviceCache;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto DeviceCache() { return DeviceCache::instance(); }
|
inline DeviceCache * DeviceCache() { return DeviceCache::instance(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<FMSObjects::Firmware> GetFirmware([[maybe_unused]] const std::string & DeviceType, [[maybe_unused]] const std::string & Revision) {
|
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<FMSObjects::Firmware> AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) {
|
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class FirmwareCache: public SubSystemServer {
|
class FirmwareCache: public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static auto instance() {
|
static FirmwareCache *instance() {
|
||||||
static auto instance_= new FirmwareCache;
|
static FirmwareCache *instance_= new FirmwareCache;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@ namespace OpenWifi {
|
|||||||
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision);
|
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision);
|
||||||
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
|
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::atomic_bool Running_=false;
|
std::atomic_bool Running_=false;
|
||||||
FirmwareCacheMap Cache_;
|
FirmwareCacheMap Cache_;
|
||||||
@@ -37,7 +38,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto FirmwareCache() { return FirmwareCache::instance(); }
|
inline FirmwareCache * FirmwareCache() { return FirmwareCache::instance(); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int LatestFirmwareCache::Start() {
|
int LatestFirmwareCache::Start() {
|
||||||
StorageService()->FirmwaresDB().PopulateLatestFirmwareCache();
|
StorageService()->PopulateLatestFirmwareCache();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,26 +20,14 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
RevisionSet_.insert(Revision);
|
RevisionSet_.insert(Revision);
|
||||||
DeviceSet_.insert(DeviceType);
|
DeviceSet_.insert(DeviceType);
|
||||||
|
|
||||||
auto E = Cache_.find(DeviceType);
|
auto E = Cache_.find(DeviceType);
|
||||||
if((E==Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
|
if((E==Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
|
||||||
Cache_[DeviceType] = LatestFirmwareCacheEntry{
|
Cache_[DeviceType] = LatestFirmwareCacheEntry{ .Id=Id,
|
||||||
.Id=Id,
|
.TimeStamp=TimeStamp,
|
||||||
.TimeStamp=TimeStamp,
|
.Revision=Revision};
|
||||||
.Revision=Revision};
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!IsRC(Revision))
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
auto rcE = rcCache_.find(DeviceType);
|
|
||||||
if((rcE==rcCache_.end()) || (TimeStamp >= rcE->second.TimeStamp)) {
|
|
||||||
rcCache_[DeviceType] = LatestFirmwareCacheEntry{
|
|
||||||
.Id=Id,
|
|
||||||
.TimeStamp=TimeStamp,
|
|
||||||
.Revision=Revision};
|
|
||||||
}
|
}
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
|
bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
|
||||||
@@ -50,21 +38,10 @@ namespace OpenWifi {
|
|||||||
Entry = E->second;
|
Entry = E->second;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
|
|
||||||
std::lock_guard G(Mutex_);
|
|
||||||
|
|
||||||
auto E=rcCache_.find(DeviceType);
|
|
||||||
if(E!=rcCache_.end()) {
|
|
||||||
Entry = E->second;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
|
bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
|
|
||||||
@@ -75,16 +52,6 @@ namespace OpenWifi {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision) {
|
|
||||||
std::lock_guard G(Mutex_);
|
|
||||||
|
|
||||||
auto E=rcCache_.find(DeviceType);
|
|
||||||
if(E!=rcCache_.end()) {
|
|
||||||
return E->second.Revision==Revision;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LatestFirmwareCache::DumpCache() {
|
void LatestFirmwareCache::DumpCache() {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
|
|||||||
@@ -21,12 +21,11 @@ namespace OpenWifi {
|
|||||||
std::string Revision;
|
std::string Revision;
|
||||||
};
|
};
|
||||||
typedef std::map<std::string, LatestFirmwareCacheEntry> LatestFirmwareCacheMap;
|
typedef std::map<std::string, LatestFirmwareCacheEntry> LatestFirmwareCacheMap;
|
||||||
typedef std::map<std::string, LatestFirmwareCacheEntry> rcOnlyLatestFirmwareCacheMap;
|
|
||||||
|
|
||||||
class LatestFirmwareCache : public SubSystemServer {
|
class LatestFirmwareCache : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static auto instance() {
|
static LatestFirmwareCache *instance() {
|
||||||
static auto instance_ = new LatestFirmwareCache;
|
static LatestFirmwareCache *instance_ = new LatestFirmwareCache;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,25 +34,13 @@ namespace OpenWifi {
|
|||||||
bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp);
|
bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp);
|
||||||
// void AddRevision(const std::string &Revision);
|
// void AddRevision(const std::string &Revision);
|
||||||
bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
|
bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
|
||||||
bool FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
|
|
||||||
|
|
||||||
inline static bool IsRC(const std::string & Revision) {
|
|
||||||
// OpenWrt 21.02-SNAPSHOT r16399+120-c67509efd7 / TIP-v2.5.0-36b5478
|
|
||||||
auto Tokens = Poco::StringTokenizer(Revision,"/", Poco::StringTokenizer::TOK_TRIM);
|
|
||||||
if(Tokens.count()!=2)
|
|
||||||
return false;
|
|
||||||
return (Tokens[1].substr(0,5) == "IP-v");
|
|
||||||
}
|
|
||||||
|
|
||||||
void DumpCache();
|
void DumpCache();
|
||||||
inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; };
|
inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; };
|
||||||
inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; };
|
inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; };
|
||||||
bool IsLatest(const std::string &DeviceType, const std::string &Revision);
|
bool IsLatest(const std::string &DeviceType, const std::string &Revision);
|
||||||
bool IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LatestFirmwareCacheMap Cache_;
|
LatestFirmwareCacheMap Cache_;
|
||||||
rcOnlyLatestFirmwareCacheMap rcCache_;
|
|
||||||
Types::StringSet RevisionSet_;
|
Types::StringSet RevisionSet_;
|
||||||
Types::StringSet DeviceSet_;
|
Types::StringSet DeviceSet_;
|
||||||
explicit LatestFirmwareCache() noexcept:
|
explicit LatestFirmwareCache() noexcept:
|
||||||
@@ -62,7 +49,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto LatestFirmwareCache() { return LatestFirmwareCache::instance(); }
|
inline LatestFirmwareCache * LatestFirmwareCache() { return LatestFirmwareCache::instance(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,20 +16,30 @@
|
|||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
void ManifestCreator::onTimer([[maybe_unused]] Poco::Timer &timer) {
|
void ManifestCreator::run() {
|
||||||
Utils::SetThreadName("manifest");
|
Running_ = true;
|
||||||
Logger().information("Performing DB refresh");
|
bool FirstRun = true;
|
||||||
S3BucketContent BucketList;
|
|
||||||
StorageService()->FirmwaresDB().RemoveOldFirmware();
|
while(Running_) {
|
||||||
ReadBucket(BucketList);
|
Poco::Thread::trySleep(FirstRun ? 10000 : DBRefresh_*1000);
|
||||||
Logger().information(fmt::format("Found {} firmware entries in S3 repository.", BucketList.size()));
|
if(!Running_)
|
||||||
ComputeManifest(BucketList);
|
break;
|
||||||
AddManifestToDB(BucketList);
|
FirstRun = false;
|
||||||
|
Logger_.information("Performing DB refresh");
|
||||||
|
S3BucketContent BucketList;
|
||||||
|
StorageService()->RemoveOldFirmware();
|
||||||
|
ReadBucket(BucketList);
|
||||||
|
if(!Running_)
|
||||||
|
break;
|
||||||
|
Logger_.information(Poco::format("Found %Lu firmware entries in S3 repository.",(uint64_t)BucketList.size()));
|
||||||
|
ComputeManifest(BucketList);
|
||||||
|
AddManifestToDB(BucketList);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
|
bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
|
||||||
|
|
||||||
uint64_t Limit = OpenWifi::Now() - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0;
|
uint64_t Limit = std::time(nullptr) - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0;
|
||||||
for(auto &[Name,Entry]:BucketContent) {
|
for(auto &[Name,Entry]:BucketContent) {
|
||||||
std::string C = Entry.S3ContentManifest;
|
std::string C = Entry.S3ContentManifest;
|
||||||
|
|
||||||
@@ -49,7 +59,7 @@ namespace OpenWifi {
|
|||||||
Entry.Image = ParsedContent->get("image").toString();
|
Entry.Image = ParsedContent->get("image").toString();
|
||||||
auto FullNme = Name + "-upgrade.bin";
|
auto FullNme = Name + "-upgrade.bin";
|
||||||
if(FullNme!=Entry.Image) {
|
if(FullNme!=Entry.Image) {
|
||||||
Logger().error(fmt::format("MANIFEST({}): Image name does not match manifest name ({}).",Name,Entry.Image));
|
Logger_.error(Poco::format("MANIFEST(%s): Image name does not match manifest name (%s).",Name,Entry.Image));
|
||||||
Entry.Valid = false;
|
Entry.Valid = false;
|
||||||
BadFormat++;
|
BadFormat++;
|
||||||
continue;
|
continue;
|
||||||
@@ -61,19 +71,19 @@ namespace OpenWifi {
|
|||||||
Entry.Valid = false;
|
Entry.Valid = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger().error(fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.",Name));
|
Logger_.error(Poco::format("MANIFEST(%s): Entry does not have a valid JSON manifest.",Name));
|
||||||
MissingJson++;
|
MissingJson++;
|
||||||
Entry.Valid = false;
|
Entry.Valid = false;
|
||||||
}
|
}
|
||||||
} catch (const Poco::Exception &E ) {
|
} catch (const Poco::Exception &E ) {
|
||||||
Logger().log(E);
|
Logger_.log(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger().information(fmt::format("Accepted {} firmwares.", Accepted));
|
Logger_.information(Poco::format("Accepted %Lu firmwares.", Accepted));
|
||||||
Logger().information(fmt::format("Rejected {} too old firmwares.", Rejected));
|
Logger_.information(Poco::format("Rejected %Lu too old firmwares.", Rejected));
|
||||||
Logger().information(fmt::format("Rejected {} bad JSON.", BadFormat));
|
Logger_.information(Poco::format("Rejected %Lu bad JSON.", BadFormat));
|
||||||
Logger().information(fmt::format("Rejected {} missing JSON.", MissingJson));
|
Logger_.information(Poco::format("Rejected %Lu missing JSON.", MissingJson));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -88,18 +98,18 @@ namespace OpenWifi {
|
|||||||
if(BucketEntry.URI.find("-staging-")!=std::string::npos)
|
if(BucketEntry.URI.find("-staging-")!=std::string::npos)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(BucketEntry.Valid && !StorageService()->FirmwaresDB().GetFirmwareByName(R,BucketEntry.Compatible,F)) {
|
if(BucketEntry.Valid && !StorageService()->GetFirmwareByName(R,BucketEntry.Compatible,F)) {
|
||||||
F.id = MicroService::instance().CreateUUID();
|
F.id = MicroService::instance().CreateUUID();
|
||||||
F.release = Release;
|
F.release = Release;
|
||||||
F.size = BucketEntry.S3Size;
|
F.size = BucketEntry.S3Size;
|
||||||
F.created = OpenWifi::Now();
|
F.created = std::time(nullptr);
|
||||||
F.imageDate = BucketEntry.S3TimeStamp;
|
F.imageDate = BucketEntry.S3TimeStamp;
|
||||||
F.image = BucketEntry.Image;
|
F.image = BucketEntry.S3Name;
|
||||||
F.uri = BucketEntry.URI;
|
F.uri = BucketEntry.URI;
|
||||||
F.revision = BucketEntry.Revision;
|
F.revision = BucketEntry.Revision;
|
||||||
F.deviceType = BucketEntry.Compatible;
|
F.deviceType = BucketEntry.Compatible;
|
||||||
if(StorageService()->FirmwaresDB().AddFirmware(F)) {
|
if(StorageService()->AddFirmware(F)) {
|
||||||
Logger().information(fmt::format("Adding firmware '{}', size={}",Release,F.size));
|
Logger_.information(Poco::format("Adding firmware '%s'",Release));
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +118,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ManifestCreator::Start() {
|
int ManifestCreator::Start() {
|
||||||
Running_ = true;
|
|
||||||
S3BucketName_ = MicroService::instance().ConfigGetString("s3.bucketname");
|
S3BucketName_ = MicroService::instance().ConfigGetString("s3.bucketname");
|
||||||
S3Region_ = MicroService::instance().ConfigGetString("s3.region");
|
S3Region_ = MicroService::instance().ConfigGetString("s3.region");
|
||||||
S3Secret_ = MicroService::instance().ConfigGetString("s3.secret");
|
S3Secret_ = MicroService::instance().ConfigGetString("s3.secret");
|
||||||
@@ -126,21 +135,23 @@ namespace OpenWifi {
|
|||||||
AwsCreds_.SetAWSAccessKeyId(S3Key_);
|
AwsCreds_.SetAWSAccessKeyId(S3Key_);
|
||||||
AwsCreds_.SetAWSSecretKey(S3Secret_);
|
AwsCreds_.SetAWSSecretKey(S3Secret_);
|
||||||
|
|
||||||
ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(*this, &ManifestCreator::onTimer);
|
Worker_.start(*this);
|
||||||
Timer_.setStartInterval(1 * 60 * 1000); // first run in 1 minutes
|
|
||||||
Timer_.setPeriodicInterval((long)(DBRefresh_ * 1000));
|
|
||||||
Timer_.start(*ManifestCreatorCallBack_);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManifestCreator::Stop() {
|
void ManifestCreator::Stop() {
|
||||||
if(Running_) {
|
if(Running_) {
|
||||||
Running_ = false;
|
Running_ = false;
|
||||||
Timer_.stop();
|
Worker_.wakeUp();
|
||||||
|
Worker_.join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ManifestCreator::Update() {
|
||||||
|
Worker_.wakeUp();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ManifestCreator::CloseBucket() {
|
void ManifestCreator::CloseBucket() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +196,7 @@ namespace OpenWifi {
|
|||||||
while(!isDone) {
|
while(!isDone) {
|
||||||
Outcome = S3Client.ListObjectsV2(Request);
|
Outcome = S3Client.ListObjectsV2(Request);
|
||||||
if(!Outcome.IsSuccess()) {
|
if(!Outcome.IsSuccess()) {
|
||||||
Logger().error(fmt::format("Error while doing ListObjectsV2: {}, {}",
|
Logger_.error(Poco::format("Error while doing ListObjectsV2: %s, %s",
|
||||||
std::string{Outcome.GetError().GetExceptionName()},
|
std::string{Outcome.GetError().GetExceptionName()},
|
||||||
std::string{Outcome.GetError().GetMessage()}));
|
std::string{Outcome.GetError().GetMessage()}));
|
||||||
return false;
|
return false;
|
||||||
@@ -224,17 +235,12 @@ namespace OpenWifi {
|
|||||||
It->second.Image = Image;
|
It->second.Image = Image;
|
||||||
It->second.S3ContentManifest = Content;
|
It->second.S3ContentManifest = Content;
|
||||||
} else {
|
} else {
|
||||||
Bucket.emplace(Release, S3BucketEntry{
|
Bucket.emplace(Release, S3BucketEntry{
|
||||||
.Valid = false,
|
|
||||||
.S3Name = "",
|
|
||||||
.S3ContentManifest = Content,
|
.S3ContentManifest = Content,
|
||||||
.S3TimeStamp = 0 ,
|
|
||||||
.S3Size = 0 ,
|
|
||||||
.Revision = Revision,
|
.Revision = Revision,
|
||||||
.Image = Image,
|
.Image = Image,
|
||||||
.Compatible = Compatible,
|
.Compatible = Compatible,
|
||||||
.Timestamp = TimeStamp,
|
.Timestamp = TimeStamp});
|
||||||
.URI = ""});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,17 +257,10 @@ namespace OpenWifi {
|
|||||||
It->second.S3Name = ReleaseName;
|
It->second.S3Name = ReleaseName;
|
||||||
It->second.URI = URI;
|
It->second.URI = URI;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Bucket.emplace(ReleaseName, S3BucketEntry{
|
Bucket.emplace(ReleaseName, S3BucketEntry{
|
||||||
.Valid = false,
|
.S3Name = ReleaseName,
|
||||||
.S3Name = "",
|
|
||||||
.S3ContentManifest = "",
|
|
||||||
.S3TimeStamp = S3TimeStamp,
|
.S3TimeStamp = S3TimeStamp,
|
||||||
.S3Size = S3Size ,
|
.S3Size = S3Size,
|
||||||
.Revision = "",
|
|
||||||
.Image = "",
|
|
||||||
.Compatible = "",
|
|
||||||
.Timestamp = 0 ,
|
|
||||||
.URI = URI});
|
.URI = URI});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -281,7 +280,7 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
// std::cout << "Count:" << Count << " Runs:" << Runs << std::endl;
|
// std::cout << "Count:" << Count << " Runs:" << Runs << std::endl;
|
||||||
if(!Outcome.IsSuccess()) {
|
if(!Outcome.IsSuccess()) {
|
||||||
Logger().error(fmt::format("Error while doing ListObjectsV2: {}, {}",
|
Logger_.error(Poco::format("Error while doing ListObjectsV2: %s, %s",
|
||||||
std::string{Outcome.GetError().GetExceptionName()},
|
std::string{Outcome.GetError().GetExceptionName()},
|
||||||
std::string{Outcome.GetError().GetMessage()}));
|
std::string{Outcome.GetError().GetMessage()}));
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include <aws/core/auth/AWSCredentials.h>
|
#include <aws/core/auth/AWSCredentials.h>
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
#include "Poco/Timer.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -29,15 +28,17 @@ namespace OpenWifi {
|
|||||||
};
|
};
|
||||||
typedef std::map<const std::string, S3BucketEntry> S3BucketContent;
|
typedef std::map<const std::string, S3BucketEntry> S3BucketContent;
|
||||||
|
|
||||||
class ManifestCreator : public SubSystemServer {
|
class ManifestCreator : public SubSystemServer, Poco::Runnable {
|
||||||
public:
|
public:
|
||||||
static auto instance() {
|
static ManifestCreator *instance() {
|
||||||
static auto instance_ = new ManifestCreator;
|
static ManifestCreator *instance_ = new ManifestCreator;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void run() override;
|
||||||
int Start() override;
|
int Start() override;
|
||||||
void Stop() override;
|
void Stop() override;
|
||||||
|
bool Update();
|
||||||
|
|
||||||
bool ComputeManifest(S3BucketContent & BucketContent);
|
bool ComputeManifest(S3BucketContent & BucketContent);
|
||||||
bool AddManifestToDB(S3BucketContent & BucketContent);
|
bool AddManifestToDB(S3BucketContent & BucketContent);
|
||||||
@@ -47,9 +48,10 @@ namespace OpenWifi {
|
|||||||
void CloseBucket();
|
void CloseBucket();
|
||||||
void Print(const S3BucketContent &B);
|
void Print(const S3BucketContent &B);
|
||||||
uint64_t MaxAge() const { return MaxAge_; }
|
uint64_t MaxAge() const { return MaxAge_; }
|
||||||
void onTimer(Poco::Timer & timer);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static ManifestCreator *instance_;
|
||||||
|
Poco::Thread Worker_;
|
||||||
std::atomic_bool Running_ = false;
|
std::atomic_bool Running_ = false;
|
||||||
Aws::String S3BucketName_;
|
Aws::String S3BucketName_;
|
||||||
Aws::String S3Region_;
|
Aws::String S3Region_;
|
||||||
@@ -60,15 +62,13 @@ namespace OpenWifi {
|
|||||||
Aws::Auth::AWSCredentials AwsCreds_;
|
Aws::Auth::AWSCredentials AwsCreds_;
|
||||||
uint64_t DBRefresh_ = 30 * 60;
|
uint64_t DBRefresh_ = 30 * 60;
|
||||||
uint64_t MaxAge_ = 0 ;
|
uint64_t MaxAge_ = 0 ;
|
||||||
Poco::Timer Timer_;
|
|
||||||
std::unique_ptr<Poco::TimerCallback<ManifestCreator>> ManifestCreatorCallBack_;
|
|
||||||
|
|
||||||
ManifestCreator() noexcept:
|
ManifestCreator() noexcept:
|
||||||
SubSystemServer("ManifestCreator", "MANIFEST-MGR", "manifestcreator") {
|
SubSystemServer("ManifestCreator", "MANIFEST-MGR", "manifestcreator") {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto ManifestCreator() { return ManifestCreator::instance(); };
|
inline ManifestCreator * ManifestCreator() { return ManifestCreator::instance(); };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-11-21.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "NewCommandHandler.h"
|
|
||||||
#include "StorageService.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
void NewCommandHandler::run() {
|
|
||||||
Running_ = true ;
|
|
||||||
Utils::SetThreadName("cmd-handler");
|
|
||||||
while(Running_) {
|
|
||||||
Poco::Thread::trySleep(2000);
|
|
||||||
|
|
||||||
if(!Running_)
|
|
||||||
break;
|
|
||||||
|
|
||||||
while(!NewCommands_.empty()) {
|
|
||||||
if(!Running_)
|
|
||||||
break;
|
|
||||||
|
|
||||||
Types::StringPair S;
|
|
||||||
{
|
|
||||||
std::lock_guard G(Mutex_);
|
|
||||||
S = NewCommands_.front();
|
|
||||||
NewCommands_.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
auto SerialNumber = S.first;
|
|
||||||
auto M = nlohmann::json::parse(S.second);
|
|
||||||
|
|
||||||
std::string EndPoint;
|
|
||||||
|
|
||||||
if(M.contains(uCentralProtocol::SYSTEM)) {
|
|
||||||
auto SystemObj = M[uCentralProtocol::SYSTEM];
|
|
||||||
if(SystemObj.contains(uCentralProtocol::HOST))
|
|
||||||
EndPoint = SystemObj[uCentralProtocol::HOST];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(M.contains(uCentralProtocol::PAYLOAD)) {
|
|
||||||
auto PayloadSection = M[uCentralProtocol::PAYLOAD];
|
|
||||||
if(PayloadSection.contains("command")) {
|
|
||||||
auto Command = PayloadSection["command"];
|
|
||||||
if(Command=="delete_device") {
|
|
||||||
auto pSerialNumber = PayloadSection["payload"]["serialNumber"];
|
|
||||||
if(pSerialNumber==SerialNumber) {
|
|
||||||
Logger().debug(fmt::format("Removing device '{}' from upgrade history.",SerialNumber));
|
|
||||||
StorageService()->HistoryDB().DeleteHistory(SerialNumber);
|
|
||||||
Logger().debug(fmt::format("Removing device '{}' from device table.",SerialNumber));
|
|
||||||
StorageService()->DevicesDB().DeleteDevice(SerialNumber);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger().log(E);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int NewCommandHandler::Start() {
|
|
||||||
Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->CommandReceived(s1,s2); };
|
|
||||||
WatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::COMMAND, F);
|
|
||||||
Worker_.start(*this);
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
void NewCommandHandler::Stop() {
|
|
||||||
KafkaManager()->UnregisterTopicWatcher(KafkaTopics::COMMAND, WatcherId_);
|
|
||||||
Running_ = false;
|
|
||||||
Worker_.wakeUp();
|
|
||||||
Worker_.join();
|
|
||||||
};
|
|
||||||
|
|
||||||
bool NewCommandHandler::Update() {
|
|
||||||
Worker_.wakeUp();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NewCommandHandler::CommandReceived( const std::string & Key, const std::string & Message) {
|
|
||||||
std::lock_guard G(Mutex_);
|
|
||||||
NewCommands_.push(std::make_pair(Key,Message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-11-21.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef OWFMS_NEWCOMMANDHANDLER_H
|
|
||||||
#define OWFMS_NEWCOMMANDHANDLER_H
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
class NewCommandHandler : public SubSystemServer, Poco::Runnable {
|
|
||||||
public:
|
|
||||||
static auto instance() {
|
|
||||||
static auto instance_ = new NewCommandHandler;
|
|
||||||
return instance_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void run() override;
|
|
||||||
int Start() override;
|
|
||||||
void Stop() override;
|
|
||||||
bool Update();
|
|
||||||
void CommandReceived( const std::string & Key, const std::string & Message);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Poco::Thread Worker_;
|
|
||||||
std::atomic_bool Running_ = false;
|
|
||||||
int WatcherId_=0;
|
|
||||||
Types::StringPairQueue NewCommands_;
|
|
||||||
|
|
||||||
NewCommandHandler() noexcept:
|
|
||||||
SubSystemServer("NewCommandHandler", "NEWCOM-MGR", "commanmdhandler") {
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
inline auto NewCommandHandler() { return NewCommandHandler::instance(); };
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //OWFMS_NEWCOMMANDHANDLER_H
|
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
#include "NewConnectionHandler.h"
|
#include "NewConnectionHandler.h"
|
||||||
#include "framework/KafkaTopics.h"
|
#include "framework/KafkaTopics.h"
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "framework/ow_constants.h"
|
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Poco/JSON/Parser.h"
|
#include "Poco/JSON/Parser.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "LatestFirmwareCache.h"
|
#include "LatestFirmwareCache.h"
|
||||||
|
#include "framework/uCentral_Protocol.h"
|
||||||
#include "DeviceCache.h"
|
#include "DeviceCache.h"
|
||||||
#include "AutoUpdater.h"
|
#include "AutoUpdater.h"
|
||||||
|
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
void NewConnectionHandler::run() {
|
void NewConnectionHandler::run() {
|
||||||
Utils::SetThreadName("conn-handler");
|
|
||||||
Running_ = true ;
|
Running_ = true ;
|
||||||
while(Running_) {
|
while(Running_) {
|
||||||
Poco::Thread::trySleep(2000);
|
Poco::Thread::trySleep(2000);
|
||||||
@@ -65,15 +64,15 @@ namespace OpenWifi {
|
|||||||
auto Revision = Storage::TrimRevision(PayloadObj->get(uCentralProtocol::FIRMWARE).toString());
|
auto Revision = Storage::TrimRevision(PayloadObj->get(uCentralProtocol::FIRMWARE).toString());
|
||||||
// std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << " DeviceType: " << DeviceType << " Revision:" << Revision << std::endl;
|
// std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << " DeviceType: " << DeviceType << " Revision:" << Revision << std::endl;
|
||||||
FMSObjects::FirmwareAgeDetails FA;
|
FMSObjects::FirmwareAgeDetails FA;
|
||||||
if(StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
if(StorageService()->ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
||||||
StorageService()->DevicesDB().SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint);
|
StorageService()->SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint);
|
||||||
if(FA.age)
|
if(FA.age)
|
||||||
Logger().information(fmt::format("Device {} connection. Firmware is {} older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age)));
|
Logger_.information(Poco::format("Device %s connection. Firmware is %s older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age)));
|
||||||
else
|
else
|
||||||
Logger().information(fmt::format("Device {} connection. Device firmware is up to date.",SerialNumber));
|
Logger_.information(Poco::format("Device %s connection. Device firmware is up to date.",SerialNumber));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Logger().information(fmt::format("Device {} connection. Firmware age cannot be determined.",SerialNumber));
|
Logger_.information(Poco::format("Device %s connection. Firmware age cannot be determined",SerialNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
||||||
@@ -87,7 +86,7 @@ namespace OpenWifi {
|
|||||||
if(DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) {
|
if(DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) {
|
||||||
auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER).toString();
|
auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER).toString();
|
||||||
auto Timestamp = DisconnectMessage->get(uCentralProtocol::TIMESTAMP);
|
auto Timestamp = DisconnectMessage->get(uCentralProtocol::TIMESTAMP);
|
||||||
StorageService()->DevicesDB().SetDeviceDisconnected(SNum,EndPoint);
|
StorageService()->SetDeviceDisconnected(SNum,EndPoint);
|
||||||
// std::cout << "DISCONNECTION:" << SerialNumber << std::endl;
|
// std::cout << "DISCONNECTION:" << SerialNumber << std::endl;
|
||||||
}
|
}
|
||||||
} else if(PayloadObj->has(uCentralProtocol::PING)) {
|
} else if(PayloadObj->has(uCentralProtocol::PING)) {
|
||||||
@@ -99,7 +98,7 @@ namespace OpenWifi {
|
|||||||
auto Revision = Storage::TrimRevision(PingMessage->get(uCentralProtocol::FIRMWARE).toString());
|
auto Revision = Storage::TrimRevision(PingMessage->get(uCentralProtocol::FIRMWARE).toString());
|
||||||
auto Serial = PingMessage->get( uCentralProtocol::SERIALNUMBER).toString();
|
auto Serial = PingMessage->get( uCentralProtocol::SERIALNUMBER).toString();
|
||||||
auto DeviceType = PingMessage->get( uCentralProtocol::COMPATIBLE).toString();
|
auto DeviceType = PingMessage->get( uCentralProtocol::COMPATIBLE).toString();
|
||||||
StorageService()->DevicesDB().SetDeviceRevision(Serial, Revision, DeviceType, EndPoint);
|
StorageService()->SetDeviceRevision(Serial, Revision, DeviceType, EndPoint);
|
||||||
DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
|
DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
|
||||||
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
||||||
// std::cout << "Device(ping): " << SerialNumber << " to be upgraded ... " << std::endl;
|
// std::cout << "Device(ping): " << SerialNumber << " to be upgraded ... " << std::endl;
|
||||||
@@ -109,7 +108,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger().log(E);
|
Logger_.log(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ namespace OpenWifi {
|
|||||||
class NewConnectionHandler : public SubSystemServer, Poco::Runnable {
|
class NewConnectionHandler : public SubSystemServer, Poco::Runnable {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static auto instance() {
|
static NewConnectionHandler *instance() {
|
||||||
static auto instance_ = new NewConnectionHandler;
|
static NewConnectionHandler *instance_ = new NewConnectionHandler;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +29,8 @@ namespace OpenWifi {
|
|||||||
private:
|
private:
|
||||||
Poco::Thread Worker_;
|
Poco::Thread Worker_;
|
||||||
std::atomic_bool Running_ = false;
|
std::atomic_bool Running_ = false;
|
||||||
uint64_t ConnectionWatcherId_=0;
|
int ConnectionWatcherId_=0;
|
||||||
|
int HealthcheckWatcherId_=0;
|
||||||
Types::StringPairQueue NewConnections_;
|
Types::StringPairQueue NewConnections_;
|
||||||
|
|
||||||
NewConnectionHandler() noexcept:
|
NewConnectionHandler() noexcept:
|
||||||
@@ -37,7 +38,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
inline auto NewConnectionHandler() { return NewConnectionHandler::instance(); };
|
inline NewConnectionHandler * NewConnectionHandler() { return NewConnectionHandler::instance(); };
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //UCENTRALFMS_NEWCONNECTIONHANDLER_H
|
#endif //UCENTRALFMS_NEWCONNECTIONHANDLER_H
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-10-23.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
#include "RESTAPI/RESTAPI_firmwareHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_firmwaresHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_firmwareAgeHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_connectedDeviceHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_historyHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_deviceReportHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_deviceInformation_handler.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
|
|
||||||
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
|
|
||||||
return RESTAPI_Router<
|
|
||||||
RESTAPI_firmwaresHandler,
|
|
||||||
RESTAPI_firmwareHandler,
|
|
||||||
RESTAPI_system_command,
|
|
||||||
RESTAPI_firmwareAgeHandler,
|
|
||||||
RESTAPI_connectedDevicesHandler,
|
|
||||||
RESTAPI_connectedDeviceHandler,
|
|
||||||
RESTAPI_historyHandler,
|
|
||||||
RESTAPI_deviceReportHandler,
|
|
||||||
RESTAPI_deviceInformation_handler
|
|
||||||
>(Path,Bindings,L, S, TransactionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
|
|
||||||
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
|
|
||||||
return RESTAPI_Router_I<
|
|
||||||
RESTAPI_firmwaresHandler,
|
|
||||||
RESTAPI_firmwareHandler,
|
|
||||||
RESTAPI_system_command,
|
|
||||||
RESTAPI_firmwareAgeHandler,
|
|
||||||
RESTAPI_connectedDevicesHandler,
|
|
||||||
RESTAPI_connectedDeviceHandler,
|
|
||||||
RESTAPI_historyHandler,
|
|
||||||
RESTAPI_deviceReportHandler,
|
|
||||||
RESTAPI_deviceInformation_handler
|
|
||||||
>(Path, Bindings, L, S, TransactionId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,8 @@
|
|||||||
#include "RESTAPI_connectedDeviceHandler.h"
|
#include "RESTAPI_connectedDeviceHandler.h"
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/ow_constants.h"
|
#include "framework/RESTAPI_protocol.h"
|
||||||
|
#include "framework/RESTAPI_errors.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::DeviceConnectionInformation DevInfo;
|
FMSObjects::DeviceConnectionInformation DevInfo;
|
||||||
if(StorageService()->DevicesDB().GetDevice(SerialNumber, DevInfo)) {
|
if(StorageService()->GetDevice(SerialNumber, DevInfo)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
DevInfo.to_json(Answer);
|
DevInfo.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
|
|||||||
@@ -10,15 +10,14 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_connectedDeviceHandler : public RESTAPIHandler {
|
class RESTAPI_connectedDeviceHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevice/{serialNumber}"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/connectedDevice/{serialNumber}"};}
|
||||||
|
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
|
|||||||
@@ -8,14 +8,14 @@
|
|||||||
#include "RESTAPI_connectedDevicesHandler.h"
|
#include "RESTAPI_connectedDevicesHandler.h"
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/ow_constants.h"
|
#include "framework/RESTAPI_protocol.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void RESTAPI_connectedDevicesHandler::DoGet() {
|
void RESTAPI_connectedDevicesHandler::DoGet() {
|
||||||
std::vector<FMSObjects::DeviceConnectionInformation> Devices;
|
std::vector<FMSObjects::DeviceConnectionInformation> Devices;
|
||||||
Poco::JSON::Object AnswerObj;
|
Poco::JSON::Object AnswerObj;
|
||||||
Poco::JSON::Array AnswerArr;
|
Poco::JSON::Array AnswerArr;
|
||||||
if (StorageService()->DevicesDB().GetDevices(QB_.Offset, QB_.Limit, Devices)) {
|
if (StorageService()->GetDevices(QB_.Offset, QB_.Limit, Devices)) {
|
||||||
for (const auto &i:Devices) {
|
for (const auto &i:Devices) {
|
||||||
Poco::JSON::Object Obj;
|
Poco::JSON::Object Obj;
|
||||||
i.to_json(Obj);
|
i.to_json(Obj);
|
||||||
|
|||||||
@@ -11,15 +11,14 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_connectedDevicesHandler : public RESTAPIHandler {
|
class RESTAPI_connectedDevicesHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevices"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/connectedDevices"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2022-03-04.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "RESTAPI_deviceInformation_handler.h"
|
|
||||||
#include "StorageService.h"
|
|
||||||
#include "LatestFirmwareCache.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
void RESTAPI_deviceInformation_handler::DoGet() {
|
|
||||||
auto SerialNumber = GetBinding("serialNumber","");
|
|
||||||
|
|
||||||
if(SerialNumber.empty() || !Utils::ValidSerialNumber(SerialNumber)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
FMSObjects::DeviceInformation DI;
|
|
||||||
|
|
||||||
// Let's get the history
|
|
||||||
StorageService()->HistoryDB().GetHistory(SerialNumber,0,100,DI.history.history);
|
|
||||||
|
|
||||||
// Let's get the DeviceConnectionInformation
|
|
||||||
FMSObjects::DeviceConnectionInformation DCI;
|
|
||||||
StorageService()->DevicesDB().GetDevice(SerialNumber,DCI);
|
|
||||||
|
|
||||||
LatestFirmwareCacheEntry LFE;
|
|
||||||
LatestFirmwareCache()->FindLatestFirmware(DCI.deviceType,LFE);
|
|
||||||
|
|
||||||
FMSObjects::Firmware Latest;
|
|
||||||
StorageService()->FirmwaresDB().GetFirmware(LFE.Id,Latest);
|
|
||||||
|
|
||||||
DI.serialNumber = SerialNumber;
|
|
||||||
DI.currentFirmware = DCI.revision;
|
|
||||||
DI.latestFirmware = LFE.Revision;
|
|
||||||
DI.latestFirmwareDate = LFE.TimeStamp;
|
|
||||||
DI.latestFirmwareURI = Latest.uri;
|
|
||||||
FirmwaresDB::RecordName FI;
|
|
||||||
StorageService()->FirmwaresDB().GetFirmwareByRevision(DCI.revision,DCI.deviceType,FI);
|
|
||||||
DI.currentFirmwareDate = FI.imageDate;
|
|
||||||
|
|
||||||
DI.latestFirmwareAvailable = (LFE.Revision != DCI.revision);
|
|
||||||
|
|
||||||
Poco::JSON::Object Answer;
|
|
||||||
DI.to_json(Answer);
|
|
||||||
return ReturnObject(Answer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2022-03-04.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
class RESTAPI_deviceInformation_handler : public RESTAPIHandler {
|
|
||||||
public:
|
|
||||||
RESTAPI_deviceInformation_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
|
||||||
: RESTAPIHandler(bindings, L,
|
|
||||||
std::vector<std::string>
|
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
|
||||||
Server,
|
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/deviceInformation/{serialNumber}"};}
|
|
||||||
void DoGet() final;
|
|
||||||
void DoDelete() final {};
|
|
||||||
void DoPost() final {};
|
|
||||||
void DoPut() final {};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "RESTAPI_deviceReportHandler.h"
|
#include "RESTAPI_deviceReportHandler.h"
|
||||||
|
#include "StorageService.h"
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Daemon.h"
|
#include "Daemon.h"
|
||||||
|
|||||||
@@ -2,25 +2,28 @@
|
|||||||
// Created by stephane bourque on 2021-07-19.
|
// Created by stephane bourque on 2021-07-19.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
|
||||||
|
#define UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_deviceReportHandler : public RESTAPIHandler {
|
class RESTAPI_deviceReportHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/deviceReport"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/deviceReport"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
void DoPut() final {};
|
void DoPut() final {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif //UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
|
||||||
|
|||||||
@@ -7,17 +7,20 @@
|
|||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "Poco/JSON/Parser.h"
|
#include "Poco/JSON/Parser.h"
|
||||||
#include "DeviceCache.h"
|
#include "DeviceCache.h"
|
||||||
#include "framework/ow_constants.h"
|
#include "framework/uCentral_Protocol.h"
|
||||||
|
#include "framework/RESTAPI_protocol.h"
|
||||||
|
#include "framework/RESTAPI_errors.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void RESTAPI_firmwareAgeHandler::DoGet() {
|
void RESTAPI_firmwareAgeHandler::DoGet() {
|
||||||
if (!QB_.Select.empty()) {
|
if (!QB_.Select.empty()) {
|
||||||
Poco::JSON::Array Objects;
|
Poco::JSON::Array Objects;
|
||||||
for (auto &i : SelectedRecords()) {
|
std::vector<std::string> Numbers = Utils::Split(QB_.Select);
|
||||||
|
for (auto &i : Numbers) {
|
||||||
DeviceCacheEntry E;
|
DeviceCacheEntry E;
|
||||||
if (DeviceCache()->GetDevice(i, E)) {
|
if (DeviceCache()->GetDevice(i, E)) {
|
||||||
FMSObjects::FirmwareAgeDetails FA;
|
FMSObjects::FirmwareAgeDetails FA;
|
||||||
if(StorageService()->FirmwaresDB().ComputeFirmwareAge(E.deviceType,E.revision,FA)) {
|
if(StorageService()->ComputeFirmwareAge(E.deviceType,E.revision,FA)) {
|
||||||
Poco::JSON::Object O;
|
Poco::JSON::Object O;
|
||||||
FA.to_json(O);
|
FA.to_json(O);
|
||||||
O.set(uCentralProtocol::SERIALNUMBER,i);
|
O.set(uCentralProtocol::SERIALNUMBER,i);
|
||||||
@@ -47,7 +50,7 @@ namespace OpenWifi {
|
|||||||
Revision = Storage::TrimRevision(Revision);
|
Revision = Storage::TrimRevision(Revision);
|
||||||
|
|
||||||
FMSObjects::FirmwareAgeDetails FA;
|
FMSObjects::FirmwareAgeDetails FA;
|
||||||
if (StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
if (StorageService()->ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
|
|
||||||
FA.to_json(Answer);
|
FA.to_json(Answer);
|
||||||
|
|||||||
@@ -10,15 +10,14 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_firmwareAgeHandler : public RESTAPIHandler {
|
class RESTAPI_firmwareAgeHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/firmwareAge"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/firmwareAge"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
|
|||||||
@@ -6,18 +6,20 @@
|
|||||||
|
|
||||||
#include "RESTAPI_firmwareHandler.h"
|
#include "RESTAPI_firmwareHandler.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/ow_constants.h"
|
#include "framework/uCentral_Protocol.h"
|
||||||
|
#include "framework/RESTAPI_protocol.h"
|
||||||
|
#include "framework/RESTAPI_errors.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void
|
void
|
||||||
RESTAPI_firmwareHandler::DoPost() {
|
RESTAPI_firmwareHandler::DoPost() {
|
||||||
const auto &Obj = ParsedBody_;
|
auto Obj = ParseStream();
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if (!F.from_json(Obj)) {
|
if (!F.from_json(Obj)) {
|
||||||
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
||||||
}
|
}
|
||||||
F.id = MicroService::instance().CreateUUID();
|
F.id = MicroService::instance().CreateUUID();
|
||||||
if(StorageService()->FirmwaresDB().AddFirmware(F)) {
|
if(StorageService()->AddFirmware(F)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
F.to_json(Answer);
|
F.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
@@ -34,7 +36,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if (StorageService()->FirmwaresDB().GetFirmware(UUID, F)) {
|
if (StorageService()->GetFirmware(UUID, F)) {
|
||||||
Poco::JSON::Object Object;
|
Poco::JSON::Object Object;
|
||||||
F.to_json(Object);
|
F.to_json(Object);
|
||||||
return ReturnObject(Object);
|
return ReturnObject(Object);
|
||||||
@@ -49,7 +51,7 @@ namespace OpenWifi {
|
|||||||
return BadRequest(RESTAPI::Errors::MissingUUID);
|
return BadRequest(RESTAPI::Errors::MissingUUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StorageService()->FirmwaresDB().DeleteFirmware(UUID)) {
|
if (StorageService()->DeleteFirmware(UUID)) {
|
||||||
return OK();
|
return OK();
|
||||||
}
|
}
|
||||||
BadRequest(RESTAPI::Errors::CouldNotBeDeleted);
|
BadRequest(RESTAPI::Errors::CouldNotBeDeleted);
|
||||||
@@ -62,11 +64,11 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if(!StorageService()->FirmwaresDB().GetFirmware(UUID, F)) {
|
if(!StorageService()->GetFirmware(UUID, F)) {
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto & Obj = ParsedBody_;
|
auto Obj = ParseStream();
|
||||||
FMSObjects::Firmware NewFirmware;
|
FMSObjects::Firmware NewFirmware;
|
||||||
if(!NewFirmware.from_json(Obj)) {
|
if(!NewFirmware.from_json(Obj)) {
|
||||||
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
||||||
@@ -78,12 +80,12 @@ namespace OpenWifi {
|
|||||||
SecurityObjects::NoteInfoVec NIV;
|
SecurityObjects::NoteInfoVec NIV;
|
||||||
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString());
|
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString());
|
||||||
for(auto const &i:NIV) {
|
for(auto const &i:NIV) {
|
||||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UserInfo_.userinfo.email, .note=i.note};
|
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UserInfo_.userinfo.email, .note=i.note};
|
||||||
F.notes.push_back(ii);
|
F.notes.push_back(ii);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(StorageService()->FirmwaresDB().UpdateFirmware(UUID, F)) {
|
if(StorageService()->UpdateFirmware(UUID, F)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
F.to_json(Answer);
|
F.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_firmwareHandler : public RESTAPIHandler {
|
class RESTAPI_firmwareHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
@@ -19,9 +19,8 @@ namespace OpenWifi {
|
|||||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/firmware/{id}"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/firmware/{id}"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final;
|
void DoDelete() final;
|
||||||
void DoPost() final;
|
void DoPost() final;
|
||||||
|
|||||||
@@ -5,17 +5,18 @@
|
|||||||
#include "RESTAPI_firmwaresHandler.h"
|
#include "RESTAPI_firmwaresHandler.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "LatestFirmwareCache.h"
|
#include "LatestFirmwareCache.h"
|
||||||
#include "framework/ow_constants.h"
|
#include "framework/RESTAPI_protocol.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void
|
void
|
||||||
RESTAPI_firmwaresHandler::DoGet() {
|
RESTAPI_firmwaresHandler::DoGet() {
|
||||||
std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
|
std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
|
||||||
bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY);
|
bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY, false);
|
||||||
bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY);
|
bool RevisionSet = GetBoolParameter(RESTAPI::Protocol::REVISIONSET, false);
|
||||||
bool rcOnly = GetBoolParameter("rcOnly");
|
bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY, false);
|
||||||
|
bool DeviceSet = GetBoolParameter(RESTAPI::Protocol::DEVICESET, false);
|
||||||
|
|
||||||
if(GetBoolParameter(RESTAPI::Protocol::DEVICESET)) {
|
if(DeviceSet) {
|
||||||
auto Revisions = LatestFirmwareCache()->GetDevices();
|
auto Revisions = LatestFirmwareCache()->GetDevices();
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
for (const auto &i:Revisions) {
|
for (const auto &i:Revisions) {
|
||||||
@@ -26,7 +27,7 @@ namespace OpenWifi {
|
|||||||
return ReturnObject(RetObj);
|
return ReturnObject(RetObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetBoolParameter(RESTAPI::Protocol::REVISIONSET)) {
|
if(RevisionSet) {
|
||||||
auto Revisions = LatestFirmwareCache()->GetRevisions();
|
auto Revisions = LatestFirmwareCache()->GetRevisions();
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
for (const auto &i:Revisions) {
|
for (const auto &i:Revisions) {
|
||||||
@@ -41,18 +42,12 @@ namespace OpenWifi {
|
|||||||
if(!DeviceType.empty()) {
|
if(!DeviceType.empty()) {
|
||||||
if(LatestOnly) {
|
if(LatestOnly) {
|
||||||
LatestFirmwareCacheEntry Entry;
|
LatestFirmwareCacheEntry Entry;
|
||||||
if(rcOnly) {
|
if(!LatestFirmwareCache()->FindLatestFirmware(DeviceType,Entry)) {
|
||||||
if (!LatestFirmwareCache()->FindLatestRCOnlyFirmware(DeviceType, Entry)) {
|
return NotFound();
|
||||||
return NotFound();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!LatestFirmwareCache()->FindLatestFirmware(DeviceType, Entry)) {
|
|
||||||
return NotFound();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if(StorageService()->FirmwaresDB().GetFirmware(Entry.Id,F)) {
|
if(StorageService()->GetFirmware(Entry.Id,F)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
F.to_json(Answer);
|
F.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
@@ -60,11 +55,9 @@ namespace OpenWifi {
|
|||||||
return NotFound();
|
return NotFound();
|
||||||
} else {
|
} else {
|
||||||
std::vector<FMSObjects::Firmware> List;
|
std::vector<FMSObjects::Firmware> List;
|
||||||
if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
if (StorageService()->GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
for (const auto &i:List) {
|
for (const auto &i:List) {
|
||||||
if(rcOnly && !LatestFirmwareCache::IsRC(i.revision))
|
|
||||||
continue;
|
|
||||||
if(IdOnly) {
|
if(IdOnly) {
|
||||||
ObjectArray.add(i.id);
|
ObjectArray.add(i.id);
|
||||||
} else {
|
} else {
|
||||||
@@ -85,10 +78,8 @@ namespace OpenWifi {
|
|||||||
std::vector<FMSObjects::Firmware> List;
|
std::vector<FMSObjects::Firmware> List;
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
if (StorageService()->GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
||||||
for (const auto &i:List) {
|
for (const auto &i:List) {
|
||||||
if(rcOnly && !LatestFirmwareCache::IsRC(i.revision))
|
|
||||||
continue;
|
|
||||||
if(IdOnly) {
|
if(IdOnly) {
|
||||||
ObjectArray.add(i.id);
|
ObjectArray.add(i.id);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -10,16 +10,15 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_firmwaresHandler : public RESTAPIHandler {
|
class RESTAPI_firmwaresHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
|
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/firmwares"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/firmwares"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
#include "RESTAPI_historyHandler.h"
|
#include "RESTAPI_historyHandler.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/ow_constants.h"
|
#include "framework/RESTAPI_protocol.h"
|
||||||
|
#include "framework/RESTAPI_errors.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void
|
void
|
||||||
@@ -15,28 +16,8 @@ namespace OpenWifi {
|
|||||||
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
|
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto unknownList = GetBoolParameter("unknownList");
|
|
||||||
if(SerialNumber=="000000000000" && unknownList) {
|
|
||||||
// so let's get all the devices, filter the latest record
|
|
||||||
FMSObjects::DeviceCurrentInfoList L;
|
|
||||||
StorageService()->HistoryDB().GetUnknownDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
|
|
||||||
Poco::JSON::Object Answer;
|
|
||||||
L.to_json(Answer);
|
|
||||||
return ReturnObject(Answer);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto currentList = GetBoolParameter("currentList");
|
|
||||||
if(SerialNumber=="000000000000" && currentList) {
|
|
||||||
// so let's get all the devices, filter the latest record
|
|
||||||
FMSObjects::DeviceCurrentInfoList L;
|
|
||||||
StorageService()->HistoryDB().GetDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
|
|
||||||
Poco::JSON::Object Answer;
|
|
||||||
L.to_json(Answer);
|
|
||||||
return ReturnObject(Answer);
|
|
||||||
}
|
|
||||||
|
|
||||||
FMSObjects::RevisionHistoryEntryVec H;
|
FMSObjects::RevisionHistoryEntryVec H;
|
||||||
if (StorageService()->HistoryDB().GetHistory(SerialNumber, QB_.Offset, QB_.Limit, H)) {
|
if (StorageService()->GetHistory(SerialNumber, QB_.Offset, QB_.Limit, H)) {
|
||||||
Poco::JSON::Array A;
|
Poco::JSON::Array A;
|
||||||
for (auto const &i:H) {
|
for (auto const &i:H) {
|
||||||
Poco::JSON::Object O;
|
Poco::JSON::Object O;
|
||||||
@@ -57,7 +38,7 @@ namespace OpenWifi {
|
|||||||
return BadRequest(RESTAPI::Errors::IdOrSerialEmpty);
|
return BadRequest(RESTAPI::Errors::IdOrSerialEmpty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!StorageService()->HistoryDB().DeleteHistory(SerialNumber, Id)) {
|
if (!StorageService()->DeleteHistory(SerialNumber, Id)) {
|
||||||
return OK();
|
return OK();
|
||||||
}
|
}
|
||||||
NotFound();
|
NotFound();
|
||||||
|
|||||||
@@ -2,26 +2,30 @@
|
|||||||
// Created by stephane bourque on 2021-07-13.
|
// Created by stephane bourque on 2021-07-13.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
|
||||||
|
#define UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
|
||||||
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_historyHandler : public RESTAPIHandler {
|
class RESTAPI_historyHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
|
RESTAPI_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
TransactionId,
|
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static auto PathName() { return std::list<std::string>{"/api/v1/revisionHistory/{serialNumber}"};}
|
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/revisionHistory/{serialNumber}"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final;
|
void DoDelete() final;
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
void DoPut() final {};
|
void DoPut() final {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif //UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
|
||||||
|
|||||||
@@ -1,624 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2022-01-10.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "RESTAPI_AnalyticsObjects.h"
|
|
||||||
#include "RESTAPI_ProvObjects.h"
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
|
||||||
|
|
||||||
namespace OpenWifi::AnalyticsObjects {
|
|
||||||
|
|
||||||
void Report::reset() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void Report::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {
|
|
||||||
}
|
|
||||||
|
|
||||||
void VenueInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id",id);
|
|
||||||
field_to_json(Obj,"name",name);
|
|
||||||
field_to_json(Obj,"description",description);
|
|
||||||
field_to_json(Obj,"retention",retention);
|
|
||||||
field_to_json(Obj,"interval",interval);
|
|
||||||
field_to_json(Obj,"monitorSubVenues",monitorSubVenues);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VenueInfo::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,"description",description);
|
|
||||||
field_from_json(Obj,"retention",retention);
|
|
||||||
field_from_json(Obj,"interval",interval);
|
|
||||||
field_from_json(Obj,"monitorSubVenues",monitorSubVenues);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BoardInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json(Obj,"venueList",venueList);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BoardInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json(Obj,"venueList",venueList);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"boardId",boardId);
|
|
||||||
field_to_json(Obj,"type",type);
|
|
||||||
field_to_json(Obj,"serialNumber",serialNumber);
|
|
||||||
field_to_json(Obj,"deviceType",deviceType);
|
|
||||||
field_to_json(Obj,"lastContact",lastContact);
|
|
||||||
field_to_json(Obj,"lastPing",lastPing);
|
|
||||||
field_to_json(Obj,"lastState",lastState);
|
|
||||||
field_to_json(Obj,"lastFirmware",lastFirmware);
|
|
||||||
field_to_json(Obj,"lastFirmwareUpdate",lastFirmwareUpdate);
|
|
||||||
field_to_json(Obj,"lastConnection",lastConnection);
|
|
||||||
field_to_json(Obj,"lastDisconnection",lastDisconnection);
|
|
||||||
field_to_json(Obj,"pings",pings);
|
|
||||||
field_to_json(Obj,"states",states);
|
|
||||||
field_to_json(Obj,"connected",connected);
|
|
||||||
field_to_json(Obj,"connectionIp",connectionIp);
|
|
||||||
field_to_json(Obj,"associations_2g",associations_2g);
|
|
||||||
field_to_json(Obj,"associations_5g",associations_5g);
|
|
||||||
field_to_json(Obj,"associations_6g",associations_6g);
|
|
||||||
field_to_json(Obj,"health",health);
|
|
||||||
field_to_json(Obj,"lastHealth",lastHealth);
|
|
||||||
field_to_json(Obj,"locale",locale);
|
|
||||||
field_to_json(Obj,"uptime",uptime);
|
|
||||||
field_to_json(Obj,"memory",memory);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"boardId",boardId);
|
|
||||||
field_from_json(Obj,"type",type);
|
|
||||||
field_from_json(Obj,"serialNumber",serialNumber);
|
|
||||||
field_from_json(Obj,"deviceType",deviceType);
|
|
||||||
field_from_json(Obj,"lastContact",lastContact);
|
|
||||||
field_from_json(Obj,"lastPing",lastPing);
|
|
||||||
field_from_json(Obj,"lastState",lastState);
|
|
||||||
field_from_json(Obj,"lastFirmware",lastFirmware);
|
|
||||||
field_from_json(Obj,"lastFirmwareUpdate",lastFirmwareUpdate);
|
|
||||||
field_from_json(Obj,"lastConnection",lastConnection);
|
|
||||||
field_from_json(Obj,"lastDisconnection",lastDisconnection);
|
|
||||||
field_from_json(Obj,"pings",pings);
|
|
||||||
field_from_json(Obj,"states",states);
|
|
||||||
field_from_json(Obj,"connected",connected);
|
|
||||||
field_from_json(Obj,"connectionIp",connectionIp);
|
|
||||||
field_from_json(Obj,"associations_2g",associations_2g);
|
|
||||||
field_from_json(Obj,"associations_5g",associations_5g);
|
|
||||||
field_from_json(Obj,"associations_6g",associations_6g);
|
|
||||||
field_from_json(Obj,"health",health);
|
|
||||||
field_from_json(Obj,"lastHealth",lastHealth);
|
|
||||||
field_from_json(Obj,"locale",locale);
|
|
||||||
field_from_json(Obj,"uptime",uptime);
|
|
||||||
field_from_json(Obj,"memory",memory);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceInfoList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"devices",devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"devices",devices);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UE_rate::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"bitrate",bitrate);
|
|
||||||
field_to_json(Obj,"mcs",mcs);
|
|
||||||
field_to_json(Obj,"nss",nss);
|
|
||||||
field_to_json(Obj,"ht",ht);
|
|
||||||
field_to_json(Obj,"sgi",sgi);
|
|
||||||
field_to_json(Obj,"chwidth",chwidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UE_rate::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"bitrate",bitrate);
|
|
||||||
field_from_json(Obj,"mcs",mcs);
|
|
||||||
field_from_json(Obj,"nss",nss);
|
|
||||||
field_from_json(Obj,"ht",ht);
|
|
||||||
field_from_json(Obj,"sgi",sgi);
|
|
||||||
field_from_json(Obj,"chwidth",chwidth);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UETimePoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"station",station);
|
|
||||||
field_to_json(Obj,"rssi",rssi);
|
|
||||||
field_to_json(Obj,"tx_bytes",tx_bytes);
|
|
||||||
field_to_json(Obj,"rx_bytes",rx_bytes);
|
|
||||||
field_to_json(Obj,"tx_duration",tx_duration);
|
|
||||||
field_to_json(Obj,"rx_packets",rx_packets);
|
|
||||||
field_to_json(Obj,"tx_packets",tx_packets);
|
|
||||||
field_to_json(Obj,"tx_retries",tx_retries);
|
|
||||||
field_to_json(Obj,"tx_failed",tx_failed);
|
|
||||||
field_to_json(Obj,"connected",connected);
|
|
||||||
field_to_json(Obj,"inactive",inactive);
|
|
||||||
field_to_json(Obj,"tx_rate",tx_rate);
|
|
||||||
field_to_json(Obj,"rx_rate",rx_rate);
|
|
||||||
// field_to_json(Obj, "tidstats", tidstats);
|
|
||||||
|
|
||||||
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_to_json(Obj,"tx_failed_pct",tx_failed_pct);
|
|
||||||
field_to_json(Obj,"tx_retries_pct",tx_retries_pct);
|
|
||||||
field_to_json(Obj,"tx_duration_pct",tx_duration_pct);
|
|
||||||
|
|
||||||
field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
|
||||||
field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
|
||||||
field_to_json(Obj,"tx_packets_delta",tx_packets_delta);
|
|
||||||
field_to_json(Obj,"rx_packets_delta",rx_packets_delta);
|
|
||||||
field_to_json(Obj,"tx_failed_delta",tx_failed_delta);
|
|
||||||
field_to_json(Obj,"tx_retries_delta",tx_retries_delta);
|
|
||||||
field_to_json(Obj,"tx_duration_delta",tx_duration_delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UETimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"station",station);
|
|
||||||
field_from_json(Obj,"rssi",rssi);
|
|
||||||
field_from_json(Obj,"tx_bytes",tx_bytes);
|
|
||||||
field_from_json(Obj,"rx_bytes",rx_bytes);
|
|
||||||
field_from_json(Obj,"tx_duration",tx_duration);
|
|
||||||
field_from_json(Obj,"rx_packets",rx_packets);
|
|
||||||
field_from_json(Obj,"tx_packets",tx_packets);
|
|
||||||
field_from_json(Obj,"tx_retries",tx_retries);
|
|
||||||
field_from_json(Obj,"tx_failed",tx_failed);
|
|
||||||
field_from_json(Obj,"connected",connected);
|
|
||||||
field_from_json(Obj,"inactive",inactive);
|
|
||||||
field_from_json(Obj,"tx_rate",tx_rate);
|
|
||||||
field_from_json(Obj,"rx_rate",rx_rate);
|
|
||||||
// field_from_json(Obj,"tidstats",tidstats);
|
|
||||||
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_from_json(Obj,"tx_failed_pct",tx_failed_pct);
|
|
||||||
field_from_json(Obj,"tx_retries_pct",tx_retries_pct);
|
|
||||||
field_from_json(Obj,"tx_duration_pct",tx_duration_pct);
|
|
||||||
field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
|
||||||
field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
|
||||||
field_from_json(Obj,"tx_packets_delta",tx_packets_delta);
|
|
||||||
field_from_json(Obj,"rx_packets_delta",rx_packets_delta);
|
|
||||||
field_from_json(Obj,"tx_failed_delta",tx_failed_delta);
|
|
||||||
field_from_json(Obj,"tx_retries_delta",tx_retries_delta);
|
|
||||||
field_from_json(Obj,"tx_duration_delta",tx_duration_delta);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void APTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"collisions",collisions);
|
|
||||||
field_to_json(Obj,"multicast",multicast);
|
|
||||||
field_to_json(Obj,"rx_bytes",rx_bytes);
|
|
||||||
field_to_json(Obj,"rx_dropped",rx_dropped);
|
|
||||||
field_to_json(Obj,"rx_errors",rx_errors);
|
|
||||||
field_to_json(Obj,"rx_packets",rx_packets);
|
|
||||||
field_to_json(Obj,"tx_bytes",tx_bytes);
|
|
||||||
field_to_json(Obj,"tx_packets",tx_packets);
|
|
||||||
field_to_json(Obj,"tx_dropped",tx_dropped);
|
|
||||||
field_to_json(Obj,"tx_errors",tx_errors);
|
|
||||||
field_to_json(Obj,"tx_packets",tx_packets);
|
|
||||||
|
|
||||||
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
|
||||||
field_to_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
|
||||||
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_to_json(Obj,"rx_errors_pct",rx_errors_pct);
|
|
||||||
field_to_json(Obj,"tx_errors_pct",tx_errors_pct);
|
|
||||||
|
|
||||||
field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
|
||||||
field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
|
||||||
field_to_json(Obj,"rx_dropped_delta",rx_dropped_delta);
|
|
||||||
field_to_json(Obj,"tx_dropped_delta",tx_dropped_delta);
|
|
||||||
field_to_json(Obj,"rx_packets_delta",rx_packets_delta);
|
|
||||||
field_to_json(Obj,"tx_packets_delta",tx_packets_delta);
|
|
||||||
field_to_json(Obj,"rx_errors_delta",rx_errors_delta);
|
|
||||||
field_to_json(Obj,"tx_errors_delta",tx_errors_delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool APTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"collisions",collisions);
|
|
||||||
field_from_json(Obj,"multicast",multicast);
|
|
||||||
field_from_json(Obj,"rx_bytes",rx_bytes);
|
|
||||||
field_from_json(Obj,"rx_dropped",rx_dropped);
|
|
||||||
field_from_json(Obj,"rx_errors",rx_errors);
|
|
||||||
field_from_json(Obj,"rx_packets",rx_packets);
|
|
||||||
field_from_json(Obj,"tx_bytes",tx_bytes);
|
|
||||||
field_from_json(Obj,"tx_packets",tx_packets);
|
|
||||||
field_from_json(Obj,"tx_dropped",tx_dropped);
|
|
||||||
field_from_json(Obj,"tx_errors",tx_errors);
|
|
||||||
field_from_json(Obj,"tx_packets",tx_packets);
|
|
||||||
|
|
||||||
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
|
||||||
field_from_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
|
||||||
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_from_json(Obj,"rx_errors_pct",rx_errors_pct);
|
|
||||||
field_from_json(Obj,"tx_errors_pct",tx_errors_pct);
|
|
||||||
|
|
||||||
field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
|
||||||
field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
|
||||||
field_from_json(Obj,"rx_dropped_delta",rx_dropped_delta);
|
|
||||||
field_from_json(Obj,"tx_dropped_delta",tx_dropped_delta);
|
|
||||||
field_from_json(Obj,"rx_packets_delta",rx_packets_delta);
|
|
||||||
field_from_json(Obj,"tx_packets_delta",tx_packets_delta);
|
|
||||||
field_from_json(Obj,"rx_errors_delta",rx_errors_delta);
|
|
||||||
field_from_json(Obj,"tx_errors_delta",tx_errors_delta);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TIDstat_entry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"rx_msdu",rx_msdu);
|
|
||||||
field_to_json(Obj,"tx_msdu",tx_msdu);
|
|
||||||
field_to_json(Obj,"tx_msdu_failed",tx_msdu_failed);
|
|
||||||
field_to_json(Obj,"tx_msdu_retries",tx_msdu_retries);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TIDstat_entry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"rx_msdu",rx_msdu);
|
|
||||||
field_from_json(Obj,"tx_msdu",tx_msdu);
|
|
||||||
field_from_json(Obj,"tx_msdu_failed",tx_msdu_failed);
|
|
||||||
field_from_json(Obj,"tx_msdu_retries",tx_msdu_retries);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadioTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"band",band);
|
|
||||||
field_to_json(Obj,"channel_width",channel_width);
|
|
||||||
field_to_json(Obj,"active_ms",active_ms);
|
|
||||||
field_to_json(Obj,"busy_ms",busy_ms);
|
|
||||||
field_to_json(Obj,"receive_ms",receive_ms);
|
|
||||||
field_to_json(Obj,"transmit_ms",transmit_ms);
|
|
||||||
field_to_json(Obj,"tx_power",tx_power);
|
|
||||||
field_to_json(Obj,"channel",channel);
|
|
||||||
field_to_json(Obj,"temperature",temperature);
|
|
||||||
field_to_json(Obj,"noise",noise);
|
|
||||||
field_to_json(Obj,"active_pct",active_pct);
|
|
||||||
field_to_json(Obj,"busy_pct",busy_pct);
|
|
||||||
field_to_json(Obj,"receive_pct",receive_pct);
|
|
||||||
field_to_json(Obj,"transmit_pct",transmit_pct);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadioTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"band",band);
|
|
||||||
field_from_json(Obj,"channel_width",channel_width);
|
|
||||||
field_from_json(Obj,"active_ms",active_ms);
|
|
||||||
field_from_json(Obj,"busy_ms",busy_ms);
|
|
||||||
field_from_json(Obj,"receive_ms",receive_ms);
|
|
||||||
field_from_json(Obj,"transmit_ms",transmit_ms);
|
|
||||||
field_from_json(Obj,"tx_power",tx_power);
|
|
||||||
field_from_json(Obj,"channel",channel);
|
|
||||||
field_from_json(Obj,"temperature",temperature);
|
|
||||||
field_from_json(Obj,"noise",noise);
|
|
||||||
field_from_json(Obj,"active_pct",active_pct);
|
|
||||||
field_from_json(Obj,"busy_pct",busy_pct);
|
|
||||||
field_from_json(Obj,"receive_pct",receive_pct);
|
|
||||||
field_from_json(Obj,"transmit_pct",transmit_pct);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AveragePoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"min",min);
|
|
||||||
field_to_json(Obj,"max",max);
|
|
||||||
field_to_json(Obj,"avg",avg);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AveragePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"min",min);
|
|
||||||
field_from_json(Obj,"max",max);
|
|
||||||
field_from_json(Obj,"avg",avg);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SSIDTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"bssid",bssid);
|
|
||||||
field_to_json(Obj,"mode",mode);
|
|
||||||
field_to_json(Obj,"ssid",ssid);
|
|
||||||
field_to_json(Obj,"band",band);
|
|
||||||
field_to_json(Obj,"channel",channel);
|
|
||||||
field_to_json(Obj,"associations",associations);
|
|
||||||
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_to_json(Obj,"tx_failed_pct",tx_failed_pct);
|
|
||||||
field_to_json(Obj,"tx_retries_pct",tx_retries_pct);
|
|
||||||
field_to_json(Obj,"tx_duration_pct",tx_duration_pct);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SSIDTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"bssid",bssid);
|
|
||||||
field_from_json(Obj,"mode",mode);
|
|
||||||
field_from_json(Obj,"ssid",ssid);
|
|
||||||
field_from_json(Obj,"band",band);
|
|
||||||
field_from_json(Obj,"channel",channel);
|
|
||||||
field_from_json(Obj,"associations",associations);
|
|
||||||
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_from_json(Obj,"tx_failed_pct",tx_failed_pct);
|
|
||||||
field_from_json(Obj,"tx_retries_pct",tx_retries_pct);
|
|
||||||
field_from_json(Obj,"tx_duration_pct",tx_duration_pct);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id",id);
|
|
||||||
field_to_json(Obj,"boardId",boardId);
|
|
||||||
field_to_json(Obj,"timestamp",timestamp);
|
|
||||||
field_to_json(Obj,"ap_data",ap_data);
|
|
||||||
field_to_json(Obj,"ssid_data",ssid_data);
|
|
||||||
field_to_json(Obj,"radio_data",radio_data);
|
|
||||||
field_to_json(Obj,"device_info",device_info);
|
|
||||||
field_to_json(Obj,"serialNumber",serialNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id",id);
|
|
||||||
field_from_json(Obj,"boardId",boardId);
|
|
||||||
field_from_json(Obj,"timestamp",timestamp);
|
|
||||||
field_from_json(Obj,"ap_data",ap_data);
|
|
||||||
field_from_json(Obj,"ssid_data",ssid_data);
|
|
||||||
field_from_json(Obj,"radio_data",radio_data);
|
|
||||||
field_from_json(Obj,"device_info",device_info);
|
|
||||||
field_from_json(Obj,"serialNumber",serialNumber);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceTimePointAnalysis::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"noise",noise);
|
|
||||||
field_to_json(Obj,"temperature",temperature);
|
|
||||||
field_to_json(Obj,"active_pct",active_pct);
|
|
||||||
field_to_json(Obj,"busy_pct",busy_pct);
|
|
||||||
field_to_json(Obj,"receive_pct",receive_pct);
|
|
||||||
field_to_json(Obj,"transmit_pct",transmit_pct);
|
|
||||||
field_to_json(Obj,"tx_power",tx_power);
|
|
||||||
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
|
||||||
field_to_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
|
||||||
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_to_json(Obj,"rx_errors_pct",rx_errors_pct);
|
|
||||||
field_to_json(Obj,"tx_errors_pct",tx_errors_pct);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceTimePointAnalysis::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"noise",noise);
|
|
||||||
field_from_json(Obj,"temperature",temperature);
|
|
||||||
field_from_json(Obj,"active_pct",active_pct);
|
|
||||||
field_from_json(Obj,"busy_pct",busy_pct);
|
|
||||||
field_from_json(Obj,"receive_pct",receive_pct);
|
|
||||||
field_from_json(Obj,"transmit_pct",transmit_pct);
|
|
||||||
field_from_json(Obj,"tx_power",tx_power);
|
|
||||||
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
|
||||||
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
|
||||||
field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
|
||||||
field_from_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
|
||||||
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
|
||||||
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
|
||||||
field_from_json(Obj,"rx_errors_pct",rx_errors_pct);
|
|
||||||
field_from_json(Obj,"tx_errors_pct",tx_errors_pct);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceTimePointList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"points",points);
|
|
||||||
field_to_json(Obj,"stats",stats);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceTimePointList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"points",points);
|
|
||||||
field_from_json(Obj,"stats",stats);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceTimePointStats::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"firstPoint",firstPoint);
|
|
||||||
field_to_json(Obj,"lastPoint",lastPoint);
|
|
||||||
field_to_json(Obj,"count",count);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceTimePointStats::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"firstPoint",firstPoint);
|
|
||||||
field_from_json(Obj,"lastPoint",lastPoint);
|
|
||||||
field_from_json(Obj,"count",count);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WifiClientRate::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"bitrate",bitrate);
|
|
||||||
field_to_json(Obj,"chwidth",chwidth);
|
|
||||||
field_to_json(Obj,"mcs",mcs);
|
|
||||||
field_to_json(Obj,"nss",nss);
|
|
||||||
field_to_json(Obj,"vht",vht);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WifiClientRate::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"bitrate",bitrate);
|
|
||||||
field_from_json(Obj,"chwidth",chwidth);
|
|
||||||
field_from_json(Obj,"mcs",mcs);
|
|
||||||
field_from_json(Obj,"nss",nss);
|
|
||||||
field_from_json(Obj,"vht",vht);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"timestamp",timestamp);
|
|
||||||
field_to_json(Obj,"station_id",station_id);
|
|
||||||
field_to_json(Obj,"bssid",bssid);
|
|
||||||
field_to_json(Obj,"ssid",ssid);
|
|
||||||
field_to_json(Obj,"rssi",rssi);
|
|
||||||
field_to_json(Obj,"rx_bitrate",rx_bitrate);
|
|
||||||
field_to_json(Obj,"rx_chwidth",rx_chwidth);
|
|
||||||
field_to_json(Obj,"rx_mcs",rx_mcs);
|
|
||||||
field_to_json(Obj,"rx_nss",rx_nss);
|
|
||||||
field_to_json(Obj,"rx_vht",rx_vht);
|
|
||||||
field_to_json(Obj,"tx_bitrate",tx_bitrate);
|
|
||||||
field_to_json(Obj,"tx_chwidth",tx_chwidth);
|
|
||||||
field_to_json(Obj,"tx_mcs",tx_mcs);
|
|
||||||
field_to_json(Obj,"tx_nss",tx_nss);
|
|
||||||
field_to_json(Obj,"tx_vht",tx_vht);
|
|
||||||
field_to_json(Obj,"rx_bytes",rx_bytes);
|
|
||||||
field_to_json(Obj,"tx_bytes",tx_bytes);
|
|
||||||
field_to_json(Obj,"rx_duration",rx_duration);
|
|
||||||
field_to_json(Obj,"tx_duration",tx_duration);
|
|
||||||
field_to_json(Obj,"rx_packets",rx_packets);
|
|
||||||
field_to_json(Obj,"tx_packets",tx_packets);
|
|
||||||
field_to_json(Obj,"ipv4",ipv4);
|
|
||||||
field_to_json(Obj,"ipv6",ipv6);
|
|
||||||
field_to_json(Obj,"channel_width",channel_width);
|
|
||||||
field_to_json(Obj,"noise",noise);
|
|
||||||
field_to_json(Obj,"tx_power",tx_power);
|
|
||||||
field_to_json(Obj,"channel",channel);
|
|
||||||
field_to_json(Obj,"active_ms",active_ms);
|
|
||||||
field_to_json(Obj,"busy_ms",busy_ms);
|
|
||||||
field_to_json(Obj,"receive_ms",receive_ms);
|
|
||||||
field_to_json(Obj,"mode",mode);
|
|
||||||
field_to_json(Obj,"ack_signal",ack_signal);
|
|
||||||
field_to_json(Obj,"ack_signal_avg",ack_signal_avg);
|
|
||||||
field_to_json(Obj,"connected",connected);
|
|
||||||
field_to_json(Obj,"inactive",inactive);
|
|
||||||
field_to_json(Obj,"tx_retries",tx_retries);
|
|
||||||
field_to_json(Obj,"venue_id",venue_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"timestamp",timestamp);
|
|
||||||
field_from_json(Obj,"station_id",station_id);
|
|
||||||
field_from_json(Obj,"bssid",bssid);
|
|
||||||
field_from_json(Obj,"ssid",ssid);
|
|
||||||
field_from_json(Obj,"rssi",rssi);
|
|
||||||
field_from_json(Obj,"rx_bitrate",rx_bitrate);
|
|
||||||
field_from_json(Obj,"rx_chwidth",rx_chwidth);
|
|
||||||
field_from_json(Obj,"rx_mcs",rx_mcs);
|
|
||||||
field_from_json(Obj,"rx_nss",rx_nss);
|
|
||||||
field_from_json(Obj,"rx_vht",rx_vht);
|
|
||||||
field_from_json(Obj,"tx_bitrate",tx_bitrate);
|
|
||||||
field_from_json(Obj,"tx_chwidth",tx_chwidth);
|
|
||||||
field_from_json(Obj,"tx_mcs",tx_mcs);
|
|
||||||
field_from_json(Obj,"tx_nss",tx_nss);
|
|
||||||
field_from_json(Obj,"tx_vht",tx_vht);
|
|
||||||
field_from_json(Obj,"rx_bytes",rx_bytes);
|
|
||||||
field_from_json(Obj,"tx_bytes",tx_bytes);
|
|
||||||
field_from_json(Obj,"rx_duration",rx_duration);
|
|
||||||
field_from_json(Obj,"tx_duration",tx_duration);
|
|
||||||
field_from_json(Obj,"rx_packets",rx_packets);
|
|
||||||
field_from_json(Obj,"tx_packets",tx_packets);
|
|
||||||
field_from_json(Obj,"ipv4",ipv4);
|
|
||||||
field_from_json(Obj,"ipv6",ipv6);
|
|
||||||
field_from_json(Obj,"channel_width",channel_width);
|
|
||||||
field_from_json(Obj,"noise",noise);
|
|
||||||
field_from_json(Obj,"tx_power",tx_power);
|
|
||||||
field_from_json(Obj,"channel",channel);
|
|
||||||
field_from_json(Obj,"active_ms",active_ms);
|
|
||||||
field_from_json(Obj,"busy_ms",busy_ms);
|
|
||||||
field_from_json(Obj,"receive_ms",receive_ms);
|
|
||||||
field_from_json(Obj,"mode",mode);
|
|
||||||
field_from_json(Obj,"ack_signal",ack_signal);
|
|
||||||
field_from_json(Obj,"ack_signal_avg",ack_signal_avg);
|
|
||||||
field_from_json(Obj,"connected",connected);
|
|
||||||
field_from_json(Obj,"inactive",inactive);
|
|
||||||
field_from_json(Obj,"tx_retries",tx_retries);
|
|
||||||
field_from_json(Obj,"venue_id",venue_id);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,422 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2022-01-10.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "RESTAPI_ProvObjects.h"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
namespace AnalyticsObjects {
|
|
||||||
|
|
||||||
struct Report {
|
|
||||||
uint64_t snapShot = 0;
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VenueInfo {
|
|
||||||
OpenWifi::Types::UUID_t id;
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
uint64_t retention = 0;
|
|
||||||
uint64_t interval = 0;
|
|
||||||
bool monitorSubVenues = false;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoardInfo {
|
|
||||||
ProvObjects::ObjectInfo info;
|
|
||||||
std::vector<VenueInfo> venueList;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
|
|
||||||
inline bool operator<(const BoardInfo &bb) const {
|
|
||||||
return info.id < bb.info.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator==(const BoardInfo &bb) const {
|
|
||||||
return info.id == bb.info.id;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceInfo {
|
|
||||||
std::string boardId;
|
|
||||||
std::string type;
|
|
||||||
std::string serialNumber;
|
|
||||||
std::string deviceType;
|
|
||||||
uint64_t lastContact = 0 ;
|
|
||||||
uint64_t lastPing = 0;
|
|
||||||
uint64_t lastState = 0;
|
|
||||||
std::string lastFirmware;
|
|
||||||
uint64_t lastFirmwareUpdate = 0;
|
|
||||||
uint64_t lastConnection = 0;
|
|
||||||
uint64_t lastDisconnection = 0;
|
|
||||||
uint64_t pings = 0;
|
|
||||||
uint64_t states = 0;
|
|
||||||
bool connected = false;
|
|
||||||
std::string connectionIp;
|
|
||||||
uint64_t associations_2g = 0;
|
|
||||||
uint64_t associations_5g = 0;
|
|
||||||
uint64_t associations_6g = 0;
|
|
||||||
uint64_t health = 0;
|
|
||||||
uint64_t lastHealth = 0;
|
|
||||||
std::string locale;
|
|
||||||
uint64_t uptime = 0;
|
|
||||||
double memory = 0.0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceInfoList {
|
|
||||||
std::vector<DeviceInfo> devices;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
enum wifi_band {
|
|
||||||
band_2g = 0, band_5g = 1, band_6g = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TIDstat_entry {
|
|
||||||
uint64_t rx_msdu = 0,
|
|
||||||
tx_msdu = 0,
|
|
||||||
tx_msdu_failed = 0,
|
|
||||||
tx_msdu_retries = 0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct UE_rate {
|
|
||||||
uint64_t bitrate=0;
|
|
||||||
uint64_t mcs=0;
|
|
||||||
uint64_t nss=0;
|
|
||||||
bool ht=false;
|
|
||||||
bool sgi=false;
|
|
||||||
uint64_t chwidth=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AveragePoint {
|
|
||||||
double min = 0.0,
|
|
||||||
max = 0.0,
|
|
||||||
avg = 0.0;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct UETimePoint {
|
|
||||||
std::string station;
|
|
||||||
int64_t rssi = 0;
|
|
||||||
uint64_t tx_bytes = 0,
|
|
||||||
rx_bytes = 0,
|
|
||||||
tx_duration = 0,
|
|
||||||
rx_packets = 0,
|
|
||||||
tx_packets = 0,
|
|
||||||
tx_retries = 0,
|
|
||||||
tx_failed = 0,
|
|
||||||
connected = 0,
|
|
||||||
inactive = 0;
|
|
||||||
|
|
||||||
double tx_bytes_bw = 0.0 ,
|
|
||||||
rx_bytes_bw = 0.0 ,
|
|
||||||
tx_packets_bw = 0.0 ,
|
|
||||||
rx_packets_bw = 0.0 ,
|
|
||||||
tx_failed_pct = 0.0 ,
|
|
||||||
tx_retries_pct = 0.0 ,
|
|
||||||
tx_duration_pct = 0.0;
|
|
||||||
|
|
||||||
uint64_t tx_bytes_delta = 0,
|
|
||||||
rx_bytes_delta = 0,
|
|
||||||
tx_duration_delta = 0,
|
|
||||||
rx_packets_delta = 0,
|
|
||||||
tx_packets_delta = 0,
|
|
||||||
tx_retries_delta = 0,
|
|
||||||
tx_failed_delta = 0;
|
|
||||||
|
|
||||||
UE_rate tx_rate,
|
|
||||||
rx_rate;
|
|
||||||
std::vector<TIDstat_entry> tidstats;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
enum SSID_MODES {
|
|
||||||
unknown = 0,
|
|
||||||
ap,
|
|
||||||
mesh,
|
|
||||||
sta,
|
|
||||||
wds_ap,
|
|
||||||
wds_sta,
|
|
||||||
wds_repeater
|
|
||||||
};
|
|
||||||
|
|
||||||
inline SSID_MODES SSID_Mode(const std::string &m) {
|
|
||||||
if (m == "ap")
|
|
||||||
return ap;
|
|
||||||
if (m == "sta")
|
|
||||||
return sta;
|
|
||||||
if (m == "mesh")
|
|
||||||
return mesh;
|
|
||||||
if (m == "wds-ap")
|
|
||||||
return wds_ap;
|
|
||||||
if (m == "wds-sta")
|
|
||||||
return wds_sta;
|
|
||||||
if (m == "wds-repeater")
|
|
||||||
return wds_repeater;
|
|
||||||
return unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SSIDTimePoint {
|
|
||||||
std::string bssid,
|
|
||||||
mode,
|
|
||||||
ssid;
|
|
||||||
uint64_t band=0,
|
|
||||||
channel=0;
|
|
||||||
std::vector<UETimePoint> associations;
|
|
||||||
|
|
||||||
AveragePoint tx_bytes_bw,
|
|
||||||
rx_bytes_bw,
|
|
||||||
tx_packets_bw,
|
|
||||||
rx_packets_bw,
|
|
||||||
tx_failed_pct,
|
|
||||||
tx_retries_pct,
|
|
||||||
tx_duration_pct;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct APTimePoint {
|
|
||||||
uint64_t collisions = 0,
|
|
||||||
multicast = 0,
|
|
||||||
rx_bytes = 0,
|
|
||||||
rx_dropped = 0,
|
|
||||||
rx_errors = 0,
|
|
||||||
rx_packets = 0,
|
|
||||||
tx_bytes = 0,
|
|
||||||
tx_dropped = 0,
|
|
||||||
tx_errors = 0,
|
|
||||||
tx_packets = 0;
|
|
||||||
|
|
||||||
double tx_bytes_bw = 0.0 ,
|
|
||||||
rx_bytes_bw = 0.0 ,
|
|
||||||
rx_dropped_pct = 0.0,
|
|
||||||
tx_dropped_pct = 0.0,
|
|
||||||
rx_packets_bw = 0.0,
|
|
||||||
tx_packets_bw = 0.0,
|
|
||||||
rx_errors_pct = 0.0 ,
|
|
||||||
tx_errors_pct = 0.0;
|
|
||||||
|
|
||||||
uint64_t tx_bytes_delta = 0,
|
|
||||||
rx_bytes_delta = 0 ,
|
|
||||||
rx_dropped_delta = 0,
|
|
||||||
tx_dropped_delta = 0,
|
|
||||||
rx_packets_delta = 0,
|
|
||||||
tx_packets_delta = 0,
|
|
||||||
rx_errors_delta = 0,
|
|
||||||
tx_errors_delta = 0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadioTimePoint {
|
|
||||||
uint64_t band = 0,
|
|
||||||
channel_width = 0;
|
|
||||||
uint64_t active_ms = 0,
|
|
||||||
busy_ms = 0,
|
|
||||||
receive_ms = 0,
|
|
||||||
transmit_ms = 0,
|
|
||||||
tx_power = 0,
|
|
||||||
channel = 0;
|
|
||||||
int64_t temperature = 0,
|
|
||||||
noise = 0;
|
|
||||||
|
|
||||||
double active_pct = 0.0 ,
|
|
||||||
busy_pct = 0.0,
|
|
||||||
receive_pct = 0.0,
|
|
||||||
transmit_pct = 0.0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct DeviceTimePoint {
|
|
||||||
std::string id;
|
|
||||||
std::string boardId;
|
|
||||||
uint64_t timestamp = 0;
|
|
||||||
APTimePoint ap_data;
|
|
||||||
std::vector<SSIDTimePoint> ssid_data;
|
|
||||||
std::vector<RadioTimePoint> radio_data;
|
|
||||||
AnalyticsObjects::DeviceInfo device_info;
|
|
||||||
std::string serialNumber;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
|
|
||||||
inline bool operator<(const DeviceTimePoint &rhs) const {
|
|
||||||
if(timestamp < rhs.timestamp)
|
|
||||||
return true;
|
|
||||||
if(timestamp > rhs.timestamp)
|
|
||||||
return false;
|
|
||||||
if(device_info.serialNumber < rhs.device_info.serialNumber)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator==(const DeviceTimePoint &rhs) const {
|
|
||||||
return timestamp==rhs.timestamp && device_info.serialNumber==rhs.device_info.serialNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator>(const DeviceTimePoint &rhs) const {
|
|
||||||
if(timestamp > rhs.timestamp)
|
|
||||||
return true;
|
|
||||||
if(timestamp < rhs.timestamp)
|
|
||||||
return false;
|
|
||||||
if(device_info.serialNumber > rhs.device_info.serialNumber)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceTimePointAnalysis {
|
|
||||||
uint64_t timestamp;
|
|
||||||
|
|
||||||
AveragePoint noise;
|
|
||||||
AveragePoint temperature;
|
|
||||||
AveragePoint active_pct;
|
|
||||||
AveragePoint busy_pct;
|
|
||||||
AveragePoint receive_pct;
|
|
||||||
AveragePoint transmit_pct;
|
|
||||||
AveragePoint tx_power;
|
|
||||||
|
|
||||||
AveragePoint tx_bytes_bw;
|
|
||||||
AveragePoint rx_bytes_bw;
|
|
||||||
AveragePoint rx_dropped_pct;
|
|
||||||
AveragePoint tx_dropped_pct;
|
|
||||||
AveragePoint rx_packets_bw;
|
|
||||||
AveragePoint tx_packets_bw;
|
|
||||||
AveragePoint rx_errors_pct;
|
|
||||||
AveragePoint tx_errors_pct;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceTimePointList {
|
|
||||||
std::vector<DeviceTimePoint> points;
|
|
||||||
std::vector<DeviceTimePointAnalysis> stats;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BandwidthAnalysisEntry {
|
|
||||||
uint64_t timestamp = 0;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BandwidthAnalysis {
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AverageValueSigned {
|
|
||||||
int64_t peak=0, avg=0, low=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AverageValueUnsigned {
|
|
||||||
uint64_t peak=0, avg=0, low=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadioAnalysis {
|
|
||||||
uint64_t timestamp=0;
|
|
||||||
AverageValueSigned noise, temperature;
|
|
||||||
AverageValueUnsigned active_ms,
|
|
||||||
busy_ms,
|
|
||||||
transmit_ms,
|
|
||||||
receive_ms;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceTimePointStats {
|
|
||||||
uint64_t firstPoint=0;
|
|
||||||
uint64_t lastPoint=0;
|
|
||||||
uint64_t count=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WifiClientRate {
|
|
||||||
uint32_t bitrate=0;
|
|
||||||
uint32_t chwidth=0;
|
|
||||||
uint16_t mcs=0;
|
|
||||||
uint16_t nss=0;
|
|
||||||
bool vht=false;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WifiClientHistory {
|
|
||||||
uint64_t timestamp=OpenWifi::Now();
|
|
||||||
std::string station_id;
|
|
||||||
std::string bssid;
|
|
||||||
std::string ssid;
|
|
||||||
int64_t rssi=0;
|
|
||||||
uint32_t rx_bitrate=0;
|
|
||||||
uint32_t rx_chwidth=0;
|
|
||||||
uint16_t rx_mcs=0;
|
|
||||||
uint16_t rx_nss=0;
|
|
||||||
bool rx_vht=false;
|
|
||||||
uint32_t tx_bitrate=0;
|
|
||||||
uint32_t tx_chwidth=0;
|
|
||||||
uint16_t tx_mcs=0;
|
|
||||||
uint16_t tx_nss=0;
|
|
||||||
bool tx_vht=false;
|
|
||||||
uint64_t rx_bytes=0;
|
|
||||||
uint64_t tx_bytes=0;
|
|
||||||
uint64_t rx_duration=0;
|
|
||||||
uint64_t tx_duration=0;
|
|
||||||
uint64_t rx_packets=0;
|
|
||||||
uint64_t tx_packets=0;
|
|
||||||
std::string ipv4;
|
|
||||||
std::string ipv6;
|
|
||||||
uint64_t channel_width=0;
|
|
||||||
int64_t noise=0;
|
|
||||||
uint64_t tx_power=0;
|
|
||||||
uint64_t channel=0;
|
|
||||||
uint64_t active_ms=0;
|
|
||||||
uint64_t busy_ms=0;
|
|
||||||
uint64_t receive_ms=0;
|
|
||||||
std::string mode;
|
|
||||||
int64_t ack_signal=0;
|
|
||||||
int64_t ack_signal_avg=0;
|
|
||||||
uint64_t connected=0;
|
|
||||||
uint64_t inactive=0;
|
|
||||||
uint64_t tx_retries=0;
|
|
||||||
std::string venue_id;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,208 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-07.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "RESTAPI_CertObjects.h"
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
|
||||||
|
|
||||||
namespace OpenWifi::CertObjects {
|
|
||||||
void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id", id);
|
|
||||||
field_to_json(Obj,"entity", entity);
|
|
||||||
field_to_json(Obj,"creator", creator);
|
|
||||||
field_to_json(Obj,"type", type);
|
|
||||||
field_to_json(Obj,"status", status);
|
|
||||||
field_to_json(Obj,"certificate", certificate);
|
|
||||||
field_to_json(Obj,"key", key);
|
|
||||||
field_to_json(Obj,"devid", devid);
|
|
||||||
field_to_json(Obj,"cas", cas);
|
|
||||||
field_to_json(Obj,"manufacturer", manufacturer);
|
|
||||||
field_to_json(Obj,"model", model);
|
|
||||||
field_to_json(Obj,"redirector", redirector);
|
|
||||||
field_to_json(Obj,"commonName", commonName);
|
|
||||||
field_to_json(Obj,"certificateId", certificateId);
|
|
||||||
field_to_json(Obj,"batch", batch);
|
|
||||||
field_to_json(Obj,"created", created);
|
|
||||||
field_to_json(Obj,"modified", modified);
|
|
||||||
field_to_json(Obj,"revoked", revoked);
|
|
||||||
field_to_json(Obj,"revokeCount", revokeCount);
|
|
||||||
field_to_json(Obj,"synched", synched);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id", id);
|
|
||||||
field_from_json(Obj,"entity", entity);
|
|
||||||
field_from_json(Obj,"creator", creator);
|
|
||||||
field_from_json(Obj,"type", type);
|
|
||||||
field_from_json(Obj,"status", status);
|
|
||||||
field_from_json(Obj,"certificate", certificate);
|
|
||||||
field_from_json(Obj,"key", key);
|
|
||||||
field_from_json(Obj,"devid", devid);
|
|
||||||
field_from_json(Obj,"cas", cas);
|
|
||||||
field_from_json(Obj,"manufacturer", manufacturer);
|
|
||||||
field_from_json(Obj,"model", model);
|
|
||||||
field_from_json(Obj,"redirector", redirector);
|
|
||||||
field_from_json(Obj,"commonName", commonName);
|
|
||||||
field_from_json(Obj,"certificateId", certificateId);
|
|
||||||
field_from_json(Obj,"batch", batch);
|
|
||||||
field_from_json(Obj,"created", created);
|
|
||||||
field_from_json(Obj,"modified", modified);
|
|
||||||
field_from_json(Obj,"revoked", revoked);
|
|
||||||
field_from_json(Obj,"revokeCount", revokeCount);
|
|
||||||
field_from_json(Obj,"synched", synched);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EntityEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id", id);
|
|
||||||
field_to_json(Obj,"creator", creator);
|
|
||||||
field_to_json(Obj,"name", name);
|
|
||||||
field_to_json(Obj,"description", description);
|
|
||||||
field_to_json(Obj,"defaultRedirector", defaultRedirector);
|
|
||||||
field_to_json(Obj,"apiKey", apiKey);
|
|
||||||
field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
|
||||||
field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
|
||||||
field_to_json(Obj,"organization", organization);
|
|
||||||
field_to_json(Obj,"created", created);
|
|
||||||
field_to_json(Obj,"modified", modified);
|
|
||||||
field_to_json(Obj,"suspended", suspended);
|
|
||||||
field_to_json(Obj,"deleted", deleted);
|
|
||||||
field_to_json(Obj,"notes", notes);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id", id);
|
|
||||||
field_from_json(Obj,"creator", creator);
|
|
||||||
field_from_json(Obj,"name", name);
|
|
||||||
field_from_json(Obj,"description", description);
|
|
||||||
field_from_json(Obj,"defaultRedirector", defaultRedirector);
|
|
||||||
field_from_json(Obj,"apiKey", apiKey);
|
|
||||||
field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
|
||||||
field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
|
||||||
field_from_json(Obj,"organization", organization);
|
|
||||||
field_from_json(Obj,"created", created);
|
|
||||||
field_from_json(Obj,"modified", modified);
|
|
||||||
field_from_json(Obj,"suspended", suspended);
|
|
||||||
field_from_json(Obj,"deleted", deleted);
|
|
||||||
field_from_json(Obj,"notes", notes);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BatchEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id", id);
|
|
||||||
field_to_json(Obj,"entity", entity);
|
|
||||||
field_to_json(Obj,"creator", creator);
|
|
||||||
field_to_json(Obj,"name", name);
|
|
||||||
field_to_json(Obj,"description", description);
|
|
||||||
field_to_json(Obj,"manufacturer", manufacturer);
|
|
||||||
field_to_json(Obj,"model", model);
|
|
||||||
field_to_json(Obj,"redirector", redirector);
|
|
||||||
field_to_json(Obj,"commonNames", commonNames);
|
|
||||||
field_to_json(Obj,"jobHistory", jobHistory);
|
|
||||||
field_to_json(Obj,"notes", notes);
|
|
||||||
field_to_json(Obj,"submitted", submitted);
|
|
||||||
field_to_json(Obj,"started", started);
|
|
||||||
field_to_json(Obj,"completed", completed);
|
|
||||||
field_to_json(Obj,"modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id", id);
|
|
||||||
field_from_json(Obj,"entity", entity);
|
|
||||||
field_from_json(Obj,"creator", creator);
|
|
||||||
field_from_json(Obj,"name", name);
|
|
||||||
field_from_json(Obj,"description", description);
|
|
||||||
field_from_json(Obj,"manufacturer", manufacturer);
|
|
||||||
field_from_json(Obj,"model", model);
|
|
||||||
field_from_json(Obj,"redirector", redirector);
|
|
||||||
field_from_json(Obj,"commonNames", commonNames);
|
|
||||||
field_from_json(Obj,"jobHistory", jobHistory);
|
|
||||||
field_from_json(Obj,"notes", notes);
|
|
||||||
field_from_json(Obj,"submitted", submitted);
|
|
||||||
field_from_json(Obj,"started", started);
|
|
||||||
field_from_json(Obj,"completed", completed);
|
|
||||||
field_from_json(Obj,"modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JobEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id", id);
|
|
||||||
field_to_json(Obj,"entity", entity);
|
|
||||||
field_to_json(Obj,"creator", creator);
|
|
||||||
field_to_json(Obj,"batch", batch);
|
|
||||||
field_to_json(Obj,"commonNames", commonNames);
|
|
||||||
field_to_json(Obj,"completedNames", completedNames);
|
|
||||||
field_to_json(Obj,"errorNames", errorNames);
|
|
||||||
field_to_json(Obj,"status", status);
|
|
||||||
field_to_json(Obj,"command", command);
|
|
||||||
field_to_json(Obj,"parameters", parameters);
|
|
||||||
field_to_json(Obj,"submitted", submitted);
|
|
||||||
field_to_json(Obj,"started", started);
|
|
||||||
field_to_json(Obj,"completed", completed);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id", id);
|
|
||||||
field_from_json(Obj,"entity", entity);
|
|
||||||
field_from_json(Obj,"creator", creator);
|
|
||||||
field_from_json(Obj,"batch", batch);
|
|
||||||
field_from_json(Obj,"commonNames", commonNames);
|
|
||||||
field_from_json(Obj,"completedNames", completedNames);
|
|
||||||
field_from_json(Obj,"errorNames", errorNames);
|
|
||||||
field_from_json(Obj,"status", status);
|
|
||||||
field_from_json(Obj,"command", command);
|
|
||||||
field_from_json(Obj,"parameters", parameters);
|
|
||||||
field_from_json(Obj,"submitted", submitted);
|
|
||||||
field_from_json(Obj,"started", started);
|
|
||||||
field_from_json(Obj,"completed", completed);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DashBoardYearlyStats::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "year", year);
|
|
||||||
field_to_json(Obj, "activeCerts", activeCerts);
|
|
||||||
field_to_json(Obj, "revokedCerts", revokedCerts);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Dashboard::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"snapshot", snapshot);
|
|
||||||
field_to_json(Obj,"numberOfIssuedCerts", numberOfIssuedCerts);
|
|
||||||
field_to_json(Obj,"numberOfRevokedCerts", numberOfRevokedCerts);
|
|
||||||
field_to_json(Obj,"activeCertsPerOrganization", activeCertsPerOrganization);
|
|
||||||
field_to_json(Obj,"revokedCertsPerOrganization", revokedCertsPerOrganization);
|
|
||||||
field_to_json(Obj,"numberOfRedirectors", numberOfRedirectors);
|
|
||||||
field_to_json(Obj,"deviceTypes", deviceTypes);
|
|
||||||
field_to_json(Obj,"monthlyNumberOfCerts", monthlyNumberOfCerts);
|
|
||||||
field_to_json(Obj,"monthlyNumberOfCertsPerOrgPerYear", monthlyNumberOfCertsPerOrgPerYear);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Dashboard::reset() {
|
|
||||||
snapshot=0;
|
|
||||||
numberOfRevokedCerts = numberOfIssuedCerts = 0;
|
|
||||||
activeCertsPerOrganization.clear();
|
|
||||||
revokedCertsPerOrganization.clear();
|
|
||||||
numberOfRedirectors.clear();
|
|
||||||
deviceTypes.clear();
|
|
||||||
monthlyNumberOfCerts.clear();
|
|
||||||
monthlyNumberOfCertsPerOrgPerYear.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-07.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
|
||||||
#include "RESTObjects/RESTAPI_SecurityObjects.h"
|
|
||||||
|
|
||||||
namespace OpenWifi::CertObjects {
|
|
||||||
|
|
||||||
struct CertificateEntry {
|
|
||||||
OpenWifi::Types::UUID_t id;
|
|
||||||
OpenWifi::Types::UUID_t entity;
|
|
||||||
OpenWifi::Types::UUID_t creator;
|
|
||||||
std::string type;
|
|
||||||
std::string status;
|
|
||||||
std::string certificate;
|
|
||||||
std::string key;
|
|
||||||
std::string devid;
|
|
||||||
std::string cas;
|
|
||||||
std::string manufacturer;
|
|
||||||
std::string model;
|
|
||||||
std::string redirector;
|
|
||||||
std::string commonName;
|
|
||||||
std::string certificateId;
|
|
||||||
OpenWifi::Types::UUID_t batch;
|
|
||||||
uint64_t created = 0;
|
|
||||||
uint64_t modified = 0;
|
|
||||||
uint64_t revoked = 0;
|
|
||||||
uint64_t revokeCount = 0;
|
|
||||||
uint64_t synched = 0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct EntityEntry {
|
|
||||||
OpenWifi::Types::UUID_t id;
|
|
||||||
OpenWifi::Types::UUID_t creator;
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
std::string defaultRedirector;
|
|
||||||
std::string apiKey;
|
|
||||||
std::string serverEnrollmentProfile;
|
|
||||||
std::string clientEnrollmentProfile;
|
|
||||||
std::string organization;
|
|
||||||
SecurityObjects::NoteInfoVec notes;
|
|
||||||
bool suspended=false;
|
|
||||||
bool deleted=false;
|
|
||||||
uint64_t created = 0 ;
|
|
||||||
uint64_t modified = 0 ;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BatchEntry {
|
|
||||||
OpenWifi::Types::UUID_t id;
|
|
||||||
OpenWifi::Types::UUID_t entity;
|
|
||||||
OpenWifi::Types::UUID_t creator;
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
std::string manufacturer;
|
|
||||||
std::string model;
|
|
||||||
std::string redirector;
|
|
||||||
std::vector<std::string> commonNames;
|
|
||||||
std::vector<std::string> jobHistory;
|
|
||||||
SecurityObjects::NoteInfoVec notes;
|
|
||||||
uint64_t submitted = 0 ;
|
|
||||||
uint64_t started = 0 ;
|
|
||||||
uint64_t completed = 0 ;
|
|
||||||
uint64_t modified = 0 ;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct JobEntry {
|
|
||||||
OpenWifi::Types::UUID_t id;
|
|
||||||
OpenWifi::Types::UUID_t entity;
|
|
||||||
OpenWifi::Types::UUID_t creator;
|
|
||||||
OpenWifi::Types::UUID_t batch;
|
|
||||||
std::string command;
|
|
||||||
OpenWifi::Types::StringVec commonNames;
|
|
||||||
OpenWifi::Types::StringVec completedNames;
|
|
||||||
OpenWifi::Types::StringVec errorNames;
|
|
||||||
Types::StringPairVec parameters;
|
|
||||||
std::string status;
|
|
||||||
uint64_t submitted=0;
|
|
||||||
uint64_t started=0;
|
|
||||||
uint64_t completed=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DashBoardYearlyStats {
|
|
||||||
uint64_t year=0;
|
|
||||||
OpenWifi::Types::Counted3DMapSII activeCerts;
|
|
||||||
OpenWifi::Types::Counted3DMapSII revokedCerts;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Dashboard {
|
|
||||||
uint64_t snapshot=0;
|
|
||||||
uint64_t numberOfIssuedCerts=0;
|
|
||||||
uint64_t numberOfRevokedCerts=0;
|
|
||||||
OpenWifi::Types::CountedMap activeCertsPerOrganization;
|
|
||||||
OpenWifi::Types::CountedMap revokedCertsPerOrganization;
|
|
||||||
OpenWifi::Types::CountedMap numberOfRedirectors;
|
|
||||||
OpenWifi::Types::CountedMap deviceTypes;
|
|
||||||
OpenWifi::Types::CountedMap monthlyNumberOfCerts;
|
|
||||||
std::vector<DashBoardYearlyStats> monthlyNumberOfCertsPerOrgPerYear;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
void reset();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -233,10 +233,10 @@ namespace OpenWifi::FMSObjects {
|
|||||||
UnknownFirmwares_.clear();
|
UnknownFirmwares_.clear();
|
||||||
totalSecondsOld_.clear();
|
totalSecondsOld_.clear();
|
||||||
numberOfDevices = 0 ;
|
numberOfDevices = 0 ;
|
||||||
snapshot = OpenWifi::Now();
|
snapshot = std::time(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DeviceReport::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) {
|
bool DeviceReport::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -245,65 +245,4 @@ namespace OpenWifi::FMSObjects {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceInformation::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "serialNumber",serialNumber);
|
|
||||||
field_to_json(Obj, "history", history);
|
|
||||||
field_to_json(Obj, "currentFirmware", currentFirmware);
|
|
||||||
field_to_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
|
||||||
field_to_json(Obj, "latestFirmware", latestFirmware);
|
|
||||||
field_to_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
|
||||||
field_to_json(Obj, "latestFirmwareAvailable",latestFirmwareAvailable);
|
|
||||||
field_to_json(Obj, "latestFirmwareURI",latestFirmwareURI);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceInformation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "serialNumber",serialNumber);
|
|
||||||
field_from_json(Obj, "history", history);
|
|
||||||
field_from_json(Obj, "currentFirmware", currentFirmware);
|
|
||||||
field_from_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
|
||||||
field_from_json(Obj, "latestFirmware", latestFirmware);
|
|
||||||
field_from_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
|
||||||
field_from_json(Obj, "latestFirmwareAvailable",latestFirmwareAvailable);
|
|
||||||
field_from_json(Obj, "latestFirmwareURI",latestFirmwareURI);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceCurrentInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "serialNumber",serialNumber);
|
|
||||||
field_to_json(Obj, "revision", revision);
|
|
||||||
field_to_json(Obj, "upgraded", upgraded);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceCurrentInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "serialNumber",serialNumber);
|
|
||||||
field_from_json(Obj, "revision", revision);
|
|
||||||
field_from_json(Obj, "upgraded", upgraded);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceCurrentInfoList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "devices",devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceCurrentInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "devices",devices);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#pragma once
|
#ifndef UCENTRALFMS_RESTAPI_FMSOBJECTS_H
|
||||||
|
#define UCENTRALFMS_RESTAPI_FMSOBJECTS_H
|
||||||
|
|
||||||
|
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
#include "RESTAPI_SecurityObjects.h"
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
@@ -125,35 +127,7 @@ namespace OpenWifi::FMSObjects {
|
|||||||
void reset();
|
void reset();
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DeviceInformation {
|
|
||||||
std::string serialNumber;
|
|
||||||
RevisionHistoryEntryList history;
|
|
||||||
std::string currentFirmware;
|
|
||||||
uint64_t currentFirmwareDate=0;
|
|
||||||
std::string latestFirmware;
|
|
||||||
uint64_t latestFirmwareDate=0;
|
|
||||||
bool latestFirmwareAvailable;
|
|
||||||
std::string latestFirmwareURI;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceCurrentInfo {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::string revision;
|
|
||||||
uint64_t upgraded=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DeviceCurrentInfoList {
|
|
||||||
std::vector<DeviceCurrentInfo> devices;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif //UCENTRALFMS_RESTAPI_FMSOBJECTS_H
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
#include "Daemon.h"
|
#include "Daemon.h"
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
#include "DeviceRegistry.h"
|
#include "DeviceRegistry.h"
|
||||||
#include "CapabilitiesCache.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "RESTAPI_GWobjects.h"
|
#include "RESTAPI_GWobjects.h"
|
||||||
@@ -27,7 +26,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
void Device::to_json(Poco::JSON::Object &Obj) const {
|
void Device::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"serialNumber", SerialNumber);
|
field_to_json(Obj,"serialNumber", SerialNumber);
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
field_to_json(Obj,"deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
|
field_to_json(Obj,"deviceType", Daemon::instance()->IdentifyDevice(Compatible));
|
||||||
#endif
|
#endif
|
||||||
field_to_json(Obj,"macAddress", MACAddress);
|
field_to_json(Obj,"macAddress", MACAddress);
|
||||||
field_to_json(Obj,"manufacturer", Manufacturer);
|
field_to_json(Obj,"manufacturer", Manufacturer);
|
||||||
@@ -45,10 +44,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"compatible", Compatible);
|
field_to_json(Obj,"compatible", Compatible);
|
||||||
field_to_json(Obj,"fwUpdatePolicy", FWUpdatePolicy);
|
field_to_json(Obj,"fwUpdatePolicy", FWUpdatePolicy);
|
||||||
field_to_json(Obj,"devicePassword", DevicePassword);
|
field_to_json(Obj,"devicePassword", DevicePassword);
|
||||||
field_to_json(Obj,"subscriber", subscriber);
|
|
||||||
field_to_json(Obj,"entity", entity);
|
|
||||||
field_to_json(Obj,"modified", modified);
|
|
||||||
field_to_json(Obj,"locale", locale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
|
void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
|
||||||
@@ -73,7 +68,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Device::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"serialNumber",SerialNumber);
|
field_from_json(Obj,"serialNumber",SerialNumber);
|
||||||
field_from_json(Obj,"deviceType",DeviceType);
|
field_from_json(Obj,"deviceType",DeviceType);
|
||||||
@@ -85,9 +80,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_from_json(Obj,"location",Location);
|
field_from_json(Obj,"location",Location);
|
||||||
field_from_json(Obj,"venue",Venue);
|
field_from_json(Obj,"venue",Venue);
|
||||||
field_from_json(Obj,"compatible",Compatible);
|
field_from_json(Obj,"compatible",Compatible);
|
||||||
field_from_json(Obj,"subscriber", subscriber);
|
|
||||||
field_from_json(Obj,"entity", entity);
|
|
||||||
field_from_json(Obj,"locale", locale);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
}
|
}
|
||||||
@@ -153,10 +145,9 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"custom", Custom);
|
field_to_json(Obj,"custom", Custom);
|
||||||
field_to_json(Obj,"waitingForFile", WaitingForFile);
|
field_to_json(Obj,"waitingForFile", WaitingForFile);
|
||||||
field_to_json(Obj,"attachFile", AttachDate);
|
field_to_json(Obj,"attachFile", AttachDate);
|
||||||
field_to_json(Obj,"executionTime", executionTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool DefaultConfiguration::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"name",Name);
|
field_from_json(Obj,"name",Name);
|
||||||
field_from_json(Obj,"configuration",Configuration);
|
field_from_json(Obj,"configuration",Configuration);
|
||||||
@@ -175,7 +166,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"created", created);
|
field_to_json(Obj,"created", created);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BlackListedDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool BlackListedDevice::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"serialNumber",serialNumber);
|
field_from_json(Obj,"serialNumber",serialNumber);
|
||||||
field_from_json(Obj,"author",author);
|
field_from_json(Obj,"author",author);
|
||||||
@@ -188,6 +179,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
|
void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"serialNumber", SerialNumber);
|
||||||
field_to_json(Obj,"ipAddress", Address);
|
field_to_json(Obj,"ipAddress", Address);
|
||||||
field_to_json(Obj,"txBytes", TX);
|
field_to_json(Obj,"txBytes", TX);
|
||||||
field_to_json(Obj,"rxBytes", RX);
|
field_to_json(Obj,"rxBytes", RX);
|
||||||
@@ -198,11 +190,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"lastContact", LastContact);
|
field_to_json(Obj,"lastContact", LastContact);
|
||||||
field_to_json(Obj,"associations_2G", Associations_2G);
|
field_to_json(Obj,"associations_2G", Associations_2G);
|
||||||
field_to_json(Obj,"associations_5G", Associations_5G);
|
field_to_json(Obj,"associations_5G", Associations_5G);
|
||||||
field_to_json(Obj,"webSocketClients", webSocketClients);
|
|
||||||
field_to_json(Obj,"websocketPackets", websocketPackets);
|
|
||||||
field_to_json(Obj,"kafkaClients", kafkaClients);
|
|
||||||
field_to_json(Obj,"kafkaPackets", kafkaPackets);
|
|
||||||
field_to_json(Obj,"locale", locale);
|
|
||||||
|
|
||||||
switch(VerifiedCertificate) {
|
switch(VerifiedCertificate) {
|
||||||
case NO_CERTIFICATE:
|
case NO_CERTIFICATE:
|
||||||
@@ -264,7 +251,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
lastContact.clear();
|
lastContact.clear();
|
||||||
associations.clear();
|
associations.clear();
|
||||||
numberOfDevices = 0 ;
|
numberOfDevices = 0 ;
|
||||||
snapshot = OpenWifi::Now();
|
snapshot = std::time(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const{
|
void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const{
|
||||||
@@ -272,100 +259,5 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"capabilities", capabilities);
|
field_to_json(Obj,"capabilities", capabilities);
|
||||||
};
|
};
|
||||||
|
|
||||||
void ScriptRequest::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"serialNumber",serialNumber);
|
|
||||||
field_to_json(Obj,"timeout",timeout);
|
|
||||||
field_to_json(Obj,"type",type);
|
|
||||||
field_to_json(Obj,"script",script);
|
|
||||||
field_to_json(Obj,"scriptId",scriptId);
|
|
||||||
field_to_json(Obj,"when",when);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"serialNumber",serialNumber);
|
|
||||||
field_from_json(Obj,"timeout",timeout);
|
|
||||||
field_from_json(Obj,"type",type);
|
|
||||||
field_from_json(Obj,"script",script);
|
|
||||||
field_from_json(Obj,"scriptId",scriptId);
|
|
||||||
field_from_json(Obj,"when",when);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadiusProxyPoolList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"pools",pools);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadiusProxyPoolList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"pools",pools);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadiusProxyPool::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"name",name);
|
|
||||||
field_to_json(Obj,"description",description);
|
|
||||||
field_to_json(Obj,"authConfig",authConfig);
|
|
||||||
field_to_json(Obj,"acctConfig",acctConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"name",name);
|
|
||||||
field_from_json(Obj,"description",description);
|
|
||||||
field_from_json(Obj,"authConfig",authConfig);
|
|
||||||
field_from_json(Obj,"acctConfig",acctConfig);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadiusProxyServerConfig::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"policy",strategy);
|
|
||||||
field_to_json(Obj,"monitor",monitor);
|
|
||||||
field_to_json(Obj,"monitorMethod",monitorMethod);
|
|
||||||
field_to_json(Obj,"methodParameters",methodParameters);
|
|
||||||
field_to_json(Obj,"servers",servers);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadiusProxyServerConfig::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"policy",strategy);
|
|
||||||
field_from_json(Obj,"monitor",monitor);
|
|
||||||
field_from_json(Obj,"monitorMethod",monitorMethod);
|
|
||||||
field_from_json(Obj,"methodParameters",methodParameters);
|
|
||||||
field_from_json(Obj,"servers",servers);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadiusProxyServerEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"name",name);
|
|
||||||
field_to_json(Obj,"ip",ip);
|
|
||||||
field_to_json(Obj,"port",port);
|
|
||||||
field_to_json(Obj,"weight",weight);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadiusProxyServerEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"name",name);
|
|
||||||
field_from_json(Obj,"ip",ip);
|
|
||||||
field_from_json(Obj,"port",port);
|
|
||||||
field_from_json(Obj,"weight",weight);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef UCENTRAL_RESTAPI_OBJECTS_H
|
||||||
|
#define UCENTRAL_RESTAPI_OBJECTS_H
|
||||||
|
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
#include "RESTAPI_SecurityObjects.h"
|
||||||
@@ -22,6 +23,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
|
|
||||||
struct ConnectionState {
|
struct ConnectionState {
|
||||||
uint64_t MessageCount = 0 ;
|
uint64_t MessageCount = 0 ;
|
||||||
|
std::string SerialNumber;
|
||||||
std::string Address;
|
std::string Address;
|
||||||
uint64_t UUID = 0 ;
|
uint64_t UUID = 0 ;
|
||||||
uint64_t PendingUUID = 0 ;
|
uint64_t PendingUUID = 0 ;
|
||||||
@@ -33,11 +35,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string Firmware;
|
std::string Firmware;
|
||||||
CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
|
CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
|
||||||
std::string Compatible;
|
std::string Compatible;
|
||||||
uint64_t kafkaClients=0;
|
|
||||||
uint64_t webSocketClients=0;
|
|
||||||
uint64_t kafkaPackets=0;
|
|
||||||
uint64_t websocketPackets=0;
|
|
||||||
std::string locale;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -53,45 +50,40 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string Firmware;
|
std::string Firmware;
|
||||||
std::string Compatible;
|
std::string Compatible;
|
||||||
std::string FWUpdatePolicy;
|
std::string FWUpdatePolicy;
|
||||||
uint64_t UUID = 0 ;
|
uint64_t UUID;
|
||||||
uint64_t CreationTimestamp = 0 ;
|
uint64_t CreationTimestamp;
|
||||||
uint64_t LastConfigurationChange = 0 ;
|
uint64_t LastConfigurationChange;
|
||||||
uint64_t LastConfigurationDownload = 0 ;
|
uint64_t LastConfigurationDownload;
|
||||||
uint64_t LastFWUpdate = 0 ;
|
uint64_t LastFWUpdate;
|
||||||
std::string Venue;
|
std::string Venue;
|
||||||
std::string DevicePassword;
|
std::string DevicePassword;
|
||||||
std::string subscriber;
|
|
||||||
std::string entity;
|
|
||||||
uint64_t modified=0;
|
|
||||||
std::string locale;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
void to_json_with_status(Poco::JSON::Object &Obj) const;
|
void to_json_with_status(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
void Print() const;
|
void Print() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Statistics {
|
struct Statistics {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
uint64_t UUID = 0 ;
|
uint64_t UUID;
|
||||||
std::string Data;
|
std::string Data;
|
||||||
uint64_t Recorded = 0;
|
uint64_t Recorded;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct HealthCheck {
|
struct HealthCheck {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
uint64_t UUID = 0 ;
|
uint64_t UUID;
|
||||||
std::string Data;
|
std::string Data;
|
||||||
uint64_t Recorded = 0 ;
|
uint64_t Recorded;
|
||||||
uint64_t Sanity = 0 ;
|
uint64_t Sanity;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Capabilities {
|
struct Capabilities {
|
||||||
std::string Capabilities;
|
std::string Capabilities;
|
||||||
uint64_t FirstUpdate = 0 ;
|
uint64_t FirstUpdate;
|
||||||
uint64_t LastUpdate = 0 ;
|
uint64_t LastUpdate;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -109,22 +101,22 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
std::string Log;
|
std::string Log;
|
||||||
std::string Data;
|
std::string Data;
|
||||||
uint64_t Severity = 0 ;
|
uint64_t Severity;
|
||||||
uint64_t Recorded = 0 ;
|
uint64_t Recorded;
|
||||||
uint64_t LogType = 0 ;
|
uint64_t LogType;
|
||||||
uint64_t UUID = 0 ;
|
uint64_t UUID;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DefaultConfiguration {
|
struct DefaultConfiguration {
|
||||||
std::string Name;
|
std::string Name;
|
||||||
std::string Configuration;
|
std::string Configuration;
|
||||||
Types::StringVec Models;
|
std::string Models;
|
||||||
std::string Description;
|
std::string Description;
|
||||||
uint64_t Created;
|
uint64_t Created;
|
||||||
uint64_t LastModified;
|
uint64_t LastModified;
|
||||||
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(Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CommandDetails {
|
struct CommandDetails {
|
||||||
@@ -146,7 +138,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
uint64_t AttachDate = 0 ;
|
uint64_t AttachDate = 0 ;
|
||||||
uint64_t AttachSize = 0 ;
|
uint64_t AttachSize = 0 ;
|
||||||
std::string AttachType;
|
std::string AttachType;
|
||||||
double executionTime = 0.0;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -156,26 +147,26 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string author;
|
std::string author;
|
||||||
uint64_t created;
|
uint64_t created;
|
||||||
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(Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RttySessionDetails {
|
struct RttySessionDetails {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
std::string Server;
|
std::string Server;
|
||||||
uint64_t Port = 0 ;
|
uint64_t Port;
|
||||||
std::string Token;
|
std::string Token;
|
||||||
uint64_t TimeOut = 0 ;
|
uint64_t TimeOut;
|
||||||
std::string ConnectionId;
|
std::string ConnectionId;
|
||||||
uint64_t Started = 0 ;
|
uint64_t Started;
|
||||||
std::string CommandUUID;
|
std::string CommandUUID;
|
||||||
uint64_t ViewPort = 0 ;
|
uint64_t ViewPort;
|
||||||
std::string DevicePassword;
|
std::string DevicePassword;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Dashboard {
|
struct Dashboard {
|
||||||
uint64_t snapshot = 0 ;
|
uint64_t snapshot;
|
||||||
uint64_t numberOfDevices = 0 ;
|
uint64_t numberOfDevices;
|
||||||
Types::CountedMap commands;
|
Types::CountedMap commands;
|
||||||
Types::CountedMap upTimes;
|
Types::CountedMap upTimes;
|
||||||
Types::CountedMap memoryUsed;
|
Types::CountedMap memoryUsed;
|
||||||
@@ -199,53 +190,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScriptRequest {
|
|
||||||
uint64_t timeout=30;
|
|
||||||
std::string serialNumber;
|
|
||||||
std::string type;
|
|
||||||
std::string script;
|
|
||||||
std::string scriptId;
|
|
||||||
uint64_t when=0;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadiusProxyServerEntry {
|
|
||||||
std::string name;
|
|
||||||
std::string ip;
|
|
||||||
uint16_t port=0;
|
|
||||||
uint64_t weight=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadiusProxyServerConfig {
|
|
||||||
std::string strategy;
|
|
||||||
bool monitor=false;
|
|
||||||
std::string monitorMethod;
|
|
||||||
std::vector<std::string> methodParameters;
|
|
||||||
std::vector<RadiusProxyServerEntry> servers;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadiusProxyPool {
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
RadiusProxyServerConfig authConfig;
|
|
||||||
RadiusProxyServerConfig acctConfig;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadiusProxyPoolList {
|
|
||||||
std::vector<RadiusProxyPool> pools;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //UCENTRAL_RESTAPI_OBJECTS_H
|
||||||
|
|||||||
@@ -91,13 +91,8 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_to_json( Obj,"devices",devices);
|
field_to_json( Obj,"devices",devices);
|
||||||
field_to_json( Obj,"deviceRules",deviceRules);
|
field_to_json( Obj,"rrm",rrm);
|
||||||
field_to_json( Obj,"sourceIP",sourceIP);
|
field_to_json( Obj,"sourceIP",sourceIP);
|
||||||
field_to_json( Obj,"variables", variables);
|
|
||||||
field_to_json( Obj,"managementPolicies", managementPolicies);
|
|
||||||
field_to_json( Obj,"managementRoles", managementRoles);
|
|
||||||
field_to_json( Obj,"maps", maps);
|
|
||||||
field_to_json( Obj,"configurations", configurations);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -111,13 +106,8 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_from_json( Obj,"devices",devices);
|
field_from_json( Obj,"devices",devices);
|
||||||
field_from_json( Obj,"deviceRules",deviceRules);
|
field_from_json( Obj,"rrm",rrm);
|
||||||
field_from_json( Obj,"sourceIP",sourceIP);
|
field_from_json( Obj,"sourceIP",sourceIP);
|
||||||
field_from_json( Obj,"variables", variables);
|
|
||||||
field_from_json( Obj,"managementPolicies", managementPolicies);
|
|
||||||
field_from_json( Obj,"managementRoles", managementRoles);
|
|
||||||
field_from_json( Obj,"maps", maps);
|
|
||||||
field_from_json( Obj,"configurations", configurations);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -152,16 +142,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"design",design);
|
field_to_json( Obj,"design",design);
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_to_json( Obj,"contacts",contacts);
|
field_to_json( Obj,"contact",contact);
|
||||||
field_to_json( Obj,"location",location);
|
field_to_json( Obj,"location",location);
|
||||||
field_to_json( Obj,"deviceRules",deviceRules);
|
field_to_json( Obj,"rrm",rrm);
|
||||||
field_to_json( Obj,"sourceIP",sourceIP);
|
field_to_json( Obj,"sourceIP",sourceIP);
|
||||||
field_to_json( Obj,"variables", variables);
|
|
||||||
field_to_json( Obj,"managementPolicies", managementPolicies);
|
|
||||||
field_to_json( Obj,"managementRoles", managementRoles);
|
|
||||||
field_to_json( Obj,"maps", maps);
|
|
||||||
field_to_json( Obj,"configurations", configurations);
|
|
||||||
field_to_json( Obj,"boards", boards);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -176,16 +160,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"design",design);
|
field_from_json( Obj,"design",design);
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_from_json( Obj,"contacts",contacts);
|
field_from_json( Obj,"contact",contact);
|
||||||
field_from_json( Obj,"location",location);
|
field_from_json( Obj,"location",location);
|
||||||
field_from_json( Obj,"deviceRules",deviceRules);
|
field_from_json( Obj,"rrm",rrm);
|
||||||
field_from_json( Obj,"sourceIP",sourceIP);
|
field_from_json( Obj,"sourceIP",sourceIP);
|
||||||
field_from_json( Obj,"variables", variables);
|
|
||||||
field_from_json( Obj,"managementPolicies", managementPolicies);
|
|
||||||
field_from_json( Obj,"managementRoles", managementRoles);
|
|
||||||
field_from_json( Obj,"maps", maps);
|
|
||||||
field_from_json( Obj,"configurations", configurations);
|
|
||||||
field_from_json( Obj,"boards", boards);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
|
||||||
@@ -193,89 +171,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Operator::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
field_to_json( Obj,"managementRoles",managementRoles);
|
|
||||||
field_to_json( Obj,"deviceRules",deviceRules);
|
|
||||||
field_to_json( Obj,"variables",variables);
|
|
||||||
field_to_json( Obj,"defaultOperator",defaultOperator);
|
|
||||||
field_to_json( Obj,"sourceIP",sourceIP);
|
|
||||||
field_to_json( Obj,"registrationId",registrationId);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Operator::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
field_from_json( Obj,"managementRoles",managementRoles);
|
|
||||||
field_from_json( Obj,"deviceRules",deviceRules);
|
|
||||||
field_from_json( Obj,"variables",variables);
|
|
||||||
field_from_json( Obj,"defaultOperator",defaultOperator);
|
|
||||||
field_from_json( Obj,"sourceIP",sourceIP);
|
|
||||||
field_from_json( Obj,"registrationId",registrationId);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OperatorList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"operators",operators);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OperatorList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"operators",operators);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServiceClass::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"operatorId",operatorId);
|
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
field_to_json( Obj,"cost",cost);
|
|
||||||
field_to_json( Obj,"currency",currency);
|
|
||||||
field_to_json( Obj,"period",period);
|
|
||||||
field_to_json( Obj,"billingCode",billingCode);
|
|
||||||
field_to_json( Obj,"variables",variables);
|
|
||||||
field_to_json( Obj,"defaultService",defaultService);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ServiceClass::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"operatorId",operatorId);
|
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
field_from_json( Obj,"cost",cost);
|
|
||||||
field_from_json( Obj,"currency",currency);
|
|
||||||
field_from_json( Obj,"period",period);
|
|
||||||
field_from_json( Obj,"billingCode",billingCode);
|
|
||||||
field_from_json( Obj,"variables",variables);
|
|
||||||
field_from_json( Obj,"defaultService",defaultService);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServiceClassList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"serviceClasses",serviceClasses);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ServiceClassList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"serviceClasses",serviceClasses);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const {
|
void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json( Obj,"id",id);
|
field_to_json( Obj,"id",id);
|
||||||
field_to_json( Obj,"entity",loginId);
|
field_to_json( Obj,"entity",loginId);
|
||||||
@@ -298,7 +193,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"users",users);
|
field_to_json( Obj,"users",users);
|
||||||
field_to_json( Obj,"entity",entity);
|
field_to_json( Obj,"entity",entity);
|
||||||
field_to_json( Obj,"venue",venue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -307,7 +201,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"users",users);
|
field_from_json( Obj,"users",users);
|
||||||
field_from_json( Obj,"entity",entity);
|
field_from_json( Obj,"entity",entity);
|
||||||
field_from_json( Obj,"venue",venue);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
}
|
}
|
||||||
@@ -356,92 +249,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OperatorLocation::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"type",type);
|
|
||||||
field_to_json( Obj,"buildingName",buildingName);
|
|
||||||
field_to_json( Obj,"addressLines",addressLines);
|
|
||||||
field_to_json( Obj,"city",city);
|
|
||||||
field_to_json( Obj,"state",state);
|
|
||||||
field_to_json( Obj,"postal",postal);
|
|
||||||
field_to_json( Obj,"country",country);
|
|
||||||
field_to_json( Obj,"phones",phones);
|
|
||||||
field_to_json( Obj,"mobiles",mobiles);
|
|
||||||
field_to_json( Obj,"geoCode",geoCode);
|
|
||||||
field_to_json( Obj,"operatorId",operatorId);
|
|
||||||
field_to_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OperatorLocation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"type", type);
|
|
||||||
field_from_json( Obj,"buildingName",buildingName);
|
|
||||||
field_from_json( Obj,"addressLines",addressLines);
|
|
||||||
field_from_json( Obj,"city",city);
|
|
||||||
field_from_json( Obj,"state",state);
|
|
||||||
field_from_json( Obj,"postal",postal);
|
|
||||||
field_from_json( Obj,"country",country);
|
|
||||||
field_from_json( Obj,"phones",phones);
|
|
||||||
field_from_json( Obj,"mobiles",mobiles);
|
|
||||||
field_from_json( Obj,"geoCode",geoCode);
|
|
||||||
field_from_json( Obj,"operatorId",operatorId);
|
|
||||||
field_from_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubLocation::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"type",type);
|
|
||||||
field_to_json( Obj,"buildingName",buildingName);
|
|
||||||
field_to_json( Obj,"addressLines",addressLines);
|
|
||||||
field_to_json( Obj,"city",city);
|
|
||||||
field_to_json( Obj,"state",state);
|
|
||||||
field_to_json( Obj,"postal",postal);
|
|
||||||
field_to_json( Obj,"country",country);
|
|
||||||
field_to_json( Obj,"phones",phones);
|
|
||||||
field_to_json( Obj,"mobiles",mobiles);
|
|
||||||
field_to_json( Obj,"geoCode",geoCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubLocation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"type", type);
|
|
||||||
field_from_json( Obj,"buildingName",buildingName);
|
|
||||||
field_from_json( Obj,"addressLines",addressLines);
|
|
||||||
field_from_json( Obj,"city",city);
|
|
||||||
field_from_json( Obj,"state",state);
|
|
||||||
field_from_json( Obj,"postal",postal);
|
|
||||||
field_from_json( Obj,"country",country);
|
|
||||||
field_from_json( Obj,"phones",phones);
|
|
||||||
field_from_json( Obj,"mobiles",mobiles);
|
|
||||||
field_from_json( Obj,"geoCode",geoCode);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OperatorLocationList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj, "locations", locations);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OperatorLocationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj, "locations", locations);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Contact::to_json(Poco::JSON::Object &Obj) const {
|
void Contact::to_json(Poco::JSON::Object &Obj) const {
|
||||||
info.to_json(Obj);
|
info.to_json(Obj);
|
||||||
field_to_json( Obj,"type", to_string(type));
|
field_to_json( Obj,"type", to_string(type));
|
||||||
@@ -488,118 +295,20 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OperatorContact::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"type", type);
|
|
||||||
field_to_json( Obj,"title",title);
|
|
||||||
field_to_json( Obj,"salutation",salutation);
|
|
||||||
field_to_json( Obj,"firstname",firstname);
|
|
||||||
field_to_json( Obj,"lastname",lastname);
|
|
||||||
field_to_json( Obj,"initials",initials);
|
|
||||||
field_to_json( Obj,"visual",visual);
|
|
||||||
field_to_json( Obj,"mobiles",mobiles);
|
|
||||||
field_to_json( Obj,"phones",phones);
|
|
||||||
field_to_json( Obj,"primaryEmail",primaryEmail);
|
|
||||||
field_to_json( Obj,"secondaryEmail",secondaryEmail);
|
|
||||||
field_to_json( Obj,"accessPIN",accessPIN);
|
|
||||||
field_to_json( Obj,"operatorId",operatorId);
|
|
||||||
field_to_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OperatorContact::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"type", type);
|
|
||||||
field_from_json( Obj,"title",title);
|
|
||||||
field_from_json( Obj,"salutation",salutation);
|
|
||||||
field_from_json( Obj,"firstname",firstname);
|
|
||||||
field_from_json( Obj,"lastname",lastname);
|
|
||||||
field_from_json( Obj,"initials",initials);
|
|
||||||
field_from_json( Obj,"visual",visual);
|
|
||||||
field_from_json( Obj,"mobiles",mobiles);
|
|
||||||
field_from_json( Obj,"phones",phones);
|
|
||||||
field_from_json( Obj,"primaryEmail",primaryEmail);
|
|
||||||
field_from_json( Obj,"secondaryEmail",secondaryEmail);
|
|
||||||
field_from_json( Obj,"accessPIN",accessPIN);
|
|
||||||
field_from_json( Obj,"operatorId",operatorId);
|
|
||||||
field_from_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubContact::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"type", type);
|
|
||||||
field_to_json( Obj,"title",title);
|
|
||||||
field_to_json( Obj,"salutation",salutation);
|
|
||||||
field_to_json( Obj,"firstname",firstname);
|
|
||||||
field_to_json( Obj,"lastname",lastname);
|
|
||||||
field_to_json( Obj,"initials",initials);
|
|
||||||
field_to_json( Obj,"visual",visual);
|
|
||||||
field_to_json( Obj,"mobiles",mobiles);
|
|
||||||
field_to_json( Obj,"phones",phones);
|
|
||||||
field_to_json( Obj,"primaryEmail",primaryEmail);
|
|
||||||
field_to_json( Obj,"secondaryEmail",secondaryEmail);
|
|
||||||
field_to_json( Obj,"accessPIN",accessPIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubContact::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"type", type);
|
|
||||||
field_from_json( Obj,"title",title);
|
|
||||||
field_from_json( Obj,"salutation",salutation);
|
|
||||||
field_from_json( Obj,"firstname",firstname);
|
|
||||||
field_from_json( Obj,"lastname",lastname);
|
|
||||||
field_from_json( Obj,"initials",initials);
|
|
||||||
field_from_json( Obj,"visual",visual);
|
|
||||||
field_from_json( Obj,"mobiles",mobiles);
|
|
||||||
field_from_json( Obj,"phones",phones);
|
|
||||||
field_from_json( Obj,"primaryEmail",primaryEmail);
|
|
||||||
field_from_json( Obj,"secondaryEmail",secondaryEmail);
|
|
||||||
field_from_json( Obj,"accessPIN",accessPIN);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OperatorContactList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj, "contacts", contacts);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OperatorContactList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj, "contacts", contacts);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InventoryTag::to_json(Poco::JSON::Object &Obj) const {
|
void InventoryTag::to_json(Poco::JSON::Object &Obj) const {
|
||||||
info.to_json(Obj);
|
info.to_json(Obj);
|
||||||
field_to_json( Obj, "serialNumber", serialNumber);
|
field_to_json(Obj, "serialNumber", serialNumber);
|
||||||
field_to_json( Obj, "venue", venue);
|
field_to_json(Obj, "venue", venue);
|
||||||
field_to_json( Obj, "entity", entity);
|
field_to_json(Obj, "entity", entity);
|
||||||
field_to_json( Obj, "subscriber", subscriber);
|
field_to_json(Obj, "subscriber", subscriber);
|
||||||
field_to_json( Obj, "deviceType", deviceType);
|
field_to_json(Obj, "deviceType", deviceType);
|
||||||
field_to_json( Obj, "qrCode", qrCode);
|
field_to_json(Obj, "qrCode", qrCode);
|
||||||
field_to_json( Obj, "geoCode", geoCode);
|
field_to_json(Obj, "geoCode", geoCode);
|
||||||
field_to_json( Obj, "location", location);
|
field_to_json(Obj, "location", location);
|
||||||
field_to_json( Obj, "contact", contact);
|
field_to_json(Obj, "contact", contact);
|
||||||
field_to_json( Obj, "deviceConfiguration",deviceConfiguration);
|
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_to_json( Obj,"deviceRules",deviceRules);
|
field_to_json( Obj,"rrm",rrm);
|
||||||
field_to_json( Obj, "managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj, "state",state);
|
|
||||||
field_to_json( Obj, "devClass",devClass);
|
|
||||||
field_to_json( Obj, "locale",locale);
|
|
||||||
field_to_json( Obj, "realMacAddress",realMacAddress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -610,17 +319,13 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"entity",entity);
|
field_from_json( Obj,"entity",entity);
|
||||||
field_from_json( Obj,"subscriber",subscriber);
|
field_from_json( Obj,"subscriber",subscriber);
|
||||||
field_from_json( Obj,"deviceType",deviceType);
|
field_from_json( Obj,"deviceType",deviceType);
|
||||||
field_from_json( Obj,"qrCode", qrCode);
|
field_from_json(Obj, "qrCode", qrCode);
|
||||||
field_from_json( Obj,"geoCode",geoCode);
|
field_from_json( Obj,"geoCode",geoCode);
|
||||||
field_from_json( Obj,"location",location);
|
field_from_json( Obj,"location",location);
|
||||||
field_from_json( Obj,"contact",contact);
|
field_from_json( Obj,"contact",contact);
|
||||||
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_from_json( Obj,"deviceRules",deviceRules);
|
field_from_json( Obj,"rrm",rrm);
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"state",state);
|
|
||||||
field_from_json( Obj,"devClass",devClass);
|
|
||||||
field_from_json( Obj,"locale",locale);
|
|
||||||
field_from_json( Obj,"realMacAddress",realMacAddress);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -628,40 +333,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InventoryConfigApplyResult::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj, "appliedConfiguration", appliedConfiguration);
|
|
||||||
field_to_json( Obj, "warnings", warnings);
|
|
||||||
field_to_json( Obj, "errors", errors);
|
|
||||||
field_to_json( Obj, "errorCode", errorCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InventoryConfigApplyResult::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj, "appliedConfiguration", appliedConfiguration);
|
|
||||||
field_from_json( Obj, "warnings", warnings);
|
|
||||||
field_from_json( Obj, "errors", errors);
|
|
||||||
field_from_json( Obj, "errorCode", errorCode);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InventoryTagList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"taglist",taglist);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InventoryTagList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"taglist",taglist);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
void DeviceConfigurationElement::to_json(Poco::JSON::Object &Obj) const {
|
void DeviceConfigurationElement::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json( Obj,"name", name);
|
field_to_json( Obj,"name", name);
|
||||||
field_to_json( Obj,"description", description);
|
field_to_json( Obj,"description", description);
|
||||||
@@ -686,14 +357,12 @@ namespace OpenWifi::ProvObjects {
|
|||||||
info.to_json(Obj);
|
info.to_json(Obj);
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"deviceTypes",deviceTypes);
|
field_to_json( Obj,"deviceTypes",deviceTypes);
|
||||||
field_to_json( Obj,"subscriberOnly",subscriberOnly);
|
|
||||||
field_to_json( Obj,"entity", entity);
|
|
||||||
field_to_json( Obj,"venue", venue);
|
|
||||||
field_to_json( Obj,"subscriber", subscriber);
|
|
||||||
field_to_json( Obj,"configuration",configuration);
|
field_to_json( Obj,"configuration",configuration);
|
||||||
field_to_json( Obj,"inUse",inUse);
|
field_to_json( Obj,"inUse",inUse);
|
||||||
field_to_json( Obj,"variables",variables);
|
field_to_json( Obj,"variables",variables);
|
||||||
field_to_json( Obj,"deviceRules",deviceRules);
|
field_to_json( Obj,"rrm",rrm);
|
||||||
|
field_to_json( Obj,"firmwareUpgrade",firmwareUpgrade);
|
||||||
|
field_to_json( Obj,"firmwareRCOnly",firmwareRCOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -701,14 +370,12 @@ namespace OpenWifi::ProvObjects {
|
|||||||
info.from_json(Obj);
|
info.from_json(Obj);
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"deviceTypes",deviceTypes);
|
field_from_json( Obj,"deviceTypes",deviceTypes);
|
||||||
|
field_from_json( Obj,"configuration",configuration);
|
||||||
field_from_json( Obj,"inUse",inUse);
|
field_from_json( Obj,"inUse",inUse);
|
||||||
field_from_json( Obj,"variables",variables);
|
field_from_json( Obj,"variables",variables);
|
||||||
field_from_json( Obj,"subscriberOnly",subscriberOnly);
|
field_from_json( Obj,"rrm",rrm);
|
||||||
field_from_json( Obj,"entity", entity);
|
field_from_json( Obj,"firmwareUpgrade",firmwareUpgrade);
|
||||||
field_from_json( Obj,"venue", venue);
|
field_from_json( Obj,"firmwareRCOnly",firmwareRCOnly);
|
||||||
field_from_json( Obj,"subscriber", subscriber);
|
|
||||||
field_from_json( Obj,"configuration",configuration);
|
|
||||||
field_from_json( Obj,"deviceRules",deviceRules);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -773,11 +440,11 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UuidList::to_json(Poco::JSON::Object &Obj) const {
|
void UserList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "list", list);
|
field_to_json(Obj, "list", list);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UuidList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool UserList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "list", list);
|
field_from_json(Obj, "list", list);
|
||||||
return true;
|
return true;
|
||||||
@@ -789,14 +456,12 @@ namespace OpenWifi::ProvObjects {
|
|||||||
|
|
||||||
void ObjectACL::to_json(Poco::JSON::Object &Obj) const {
|
void ObjectACL::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "users", users);
|
field_to_json(Obj, "users", users);
|
||||||
field_to_json(Obj, "roles", roles);
|
|
||||||
field_to_json(Obj, "access", access);
|
field_to_json(Obj, "access", access);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "users", users);
|
field_from_json(Obj, "users", users);
|
||||||
field_from_json(Obj, "roles", roles);
|
|
||||||
field_from_json(Obj, "access", access);
|
field_from_json(Obj, "access", access);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
@@ -826,34 +491,16 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"creator",creator);
|
field_to_json( Obj,"creator",creator);
|
||||||
field_to_json( Obj,"visibility",visibility);
|
field_to_json( Obj,"visibility",visibility);
|
||||||
field_to_json( Obj,"access",access);
|
field_to_json( Obj,"access",access);
|
||||||
field_to_json( Obj,"managementPolicy", managementPolicy);
|
|
||||||
field_to_json( Obj,"venue", venue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
info.from_json(Obj);
|
info.from_json(Obj);
|
||||||
RESTAPI_utils::field_from_json( Obj,"data",data);
|
field_from_json( Obj,"data",data);
|
||||||
RESTAPI_utils::field_from_json( Obj,"entity",entity);
|
field_from_json( Obj,"entity",entity);
|
||||||
RESTAPI_utils::field_from_json( Obj,"creator",creator);
|
field_from_json( Obj,"creator",creator);
|
||||||
RESTAPI_utils::field_from_json( Obj,"visibility",visibility);
|
field_from_json( Obj,"visibility",visibility);
|
||||||
RESTAPI_utils::field_from_json( Obj,"access",access);
|
field_from_json( Obj,"access",access);
|
||||||
RESTAPI_utils::field_from_json( Obj,"managementPolicy", managementPolicy);
|
|
||||||
RESTAPI_utils::field_from_json( Obj,"venue", venue);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SerialNumberList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
RESTAPI_utils::field_to_json( Obj,"serialNumbers",serialNumbers);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SerialNumberList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
RESTAPI_utils::field_from_json( Obj,"serialNumbers",serialNumbers);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -862,227 +509,12 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MapList::to_json(Poco::JSON::Object &Obj) const {
|
void MapList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
RESTAPI_utils::field_to_json( Obj,"list",list);
|
field_to_json( Obj,"list",list);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool MapList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
RESTAPI_utils::field_from_json( Obj,"list",list);
|
field_from_json( Obj,"list",list);
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SignupEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"email", email);
|
|
||||||
field_to_json( Obj,"userId", userId);
|
|
||||||
field_to_json( Obj,"macAddress", macAddress);
|
|
||||||
field_to_json( Obj,"serialNumber", serialNumber);
|
|
||||||
field_to_json( Obj,"submitted", submitted);
|
|
||||||
field_to_json( Obj,"completed", completed);
|
|
||||||
field_to_json( Obj,"status", status);
|
|
||||||
field_to_json( Obj,"error", error);
|
|
||||||
field_to_json( Obj,"statusCode", statusCode);
|
|
||||||
field_to_json( Obj,"deviceID", deviceID);
|
|
||||||
field_to_json( Obj,"registrationId",registrationId);
|
|
||||||
field_to_json( Obj,"operatorId",operatorId);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SignupEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"email", email);
|
|
||||||
field_from_json( Obj,"userId", userId);
|
|
||||||
field_from_json( Obj,"macAddress", macAddress);
|
|
||||||
field_from_json( Obj,"serialNumber", serialNumber);
|
|
||||||
field_from_json( Obj,"submitted", submitted);
|
|
||||||
field_from_json( Obj,"completed", completed);
|
|
||||||
field_from_json( Obj,"status", status);
|
|
||||||
field_from_json( Obj,"error", error);
|
|
||||||
field_from_json( Obj,"statusCode", statusCode);
|
|
||||||
field_from_json( Obj,"deviceID", deviceID);
|
|
||||||
field_from_json( Obj,"registrationId",registrationId);
|
|
||||||
field_from_json( Obj,"operatorId",operatorId);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Variable::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"type", type);
|
|
||||||
field_to_json( Obj,"weight", weight);
|
|
||||||
field_to_json( Obj,"prefix", prefix);
|
|
||||||
field_to_json( Obj,"value", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Variable::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"type", type);
|
|
||||||
field_from_json( Obj,"weight", weight);
|
|
||||||
field_from_json( Obj,"prefix", prefix);
|
|
||||||
field_from_json( Obj,"value", value);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VariableList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"variables", variables);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VariableList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"variables", variables);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VariableBlock::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"variables", variables);
|
|
||||||
field_to_json( Obj,"entity", entity);
|
|
||||||
field_to_json( Obj,"venue", venue);
|
|
||||||
field_to_json( Obj,"subscriber", subscriber);
|
|
||||||
field_to_json( Obj,"inventory", inventory);
|
|
||||||
field_to_json( Obj,"configurations", configurations);
|
|
||||||
field_to_json( Obj,"managementPolicy", managementPolicy);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VariableBlock::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"variables", variables);
|
|
||||||
field_from_json( Obj,"entity", entity);
|
|
||||||
field_from_json( Obj,"venue", venue);
|
|
||||||
field_from_json( Obj,"subscriber", subscriber);
|
|
||||||
field_from_json( Obj,"inventory", inventory);
|
|
||||||
field_from_json( Obj,"configurations", configurations);
|
|
||||||
field_from_json( Obj,"managementPolicy", managementPolicy);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VariableBlockList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"variableBlocks", variableBlocks);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VariableBlockList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"variableBlocks", variableBlocks);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigurationDetails::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"configuration", configuration);
|
|
||||||
field_to_json( Obj,"rrm", rrm);
|
|
||||||
field_to_json( Obj,"firmwareRCOnly", firmwareRCOnly);
|
|
||||||
field_to_json( Obj,"firmwareUpgrade", firmwareUpgrade);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ConfigurationDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"configuration", configuration);
|
|
||||||
field_from_json( Obj,"rrm", rrm);
|
|
||||||
field_from_json( Obj,"firmwareRCOnly", firmwareRCOnly);
|
|
||||||
field_from_json( Obj,"firmwareUpgrade", firmwareUpgrade);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubscriberDevice::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
info.to_json(Obj);
|
|
||||||
field_to_json( Obj,"serialNumber", serialNumber);
|
|
||||||
field_to_json( Obj,"deviceType", deviceType);
|
|
||||||
field_to_json( Obj,"operatorId", operatorId);
|
|
||||||
field_to_json( Obj,"subscriberId", subscriberId);
|
|
||||||
field_to_json( Obj,"location", location);
|
|
||||||
field_to_json( Obj,"contact", contact);
|
|
||||||
field_to_json( Obj,"managementPolicy", managementPolicy);
|
|
||||||
field_to_json( Obj,"serviceClass", serviceClass);
|
|
||||||
field_to_json( Obj,"qrCode", qrCode);
|
|
||||||
field_to_json( Obj,"geoCode", geoCode);
|
|
||||||
field_to_json( Obj,"deviceRules",deviceRules);
|
|
||||||
field_to_json( Obj,"state", state);
|
|
||||||
field_to_json( Obj,"locale", locale);
|
|
||||||
field_to_json( Obj,"billingCode", billingCode);
|
|
||||||
field_to_json( Obj,"configuration", configuration);
|
|
||||||
field_to_json( Obj,"suspended", suspended);
|
|
||||||
field_to_json( Obj,"realMacAddress", realMacAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubscriberDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
info.from_json(Obj);
|
|
||||||
field_from_json( Obj,"serialNumber", serialNumber);
|
|
||||||
field_from_json( Obj,"deviceType", deviceType);
|
|
||||||
field_from_json( Obj,"operatorId", operatorId);
|
|
||||||
field_from_json( Obj,"subscriberId", subscriberId);
|
|
||||||
field_from_json( Obj,"location", location);
|
|
||||||
field_from_json( Obj,"contact", contact);
|
|
||||||
field_from_json( Obj,"managementPolicy", managementPolicy);
|
|
||||||
field_from_json( Obj,"serviceClass", serviceClass);
|
|
||||||
field_from_json( Obj,"qrCode", qrCode);
|
|
||||||
field_from_json( Obj,"geoCode", geoCode);
|
|
||||||
field_from_json( Obj,"deviceRules",deviceRules);
|
|
||||||
field_from_json( Obj,"state", state);
|
|
||||||
field_from_json( Obj,"locale", locale);
|
|
||||||
field_from_json( Obj,"billingCode", billingCode);
|
|
||||||
field_from_json( Obj,"configuration", configuration);
|
|
||||||
field_from_json( Obj,"suspended", suspended);
|
|
||||||
field_from_json( Obj,"realMacAddress", realMacAddress);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubscriberDeviceList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json( Obj,"subscriberDevices", subscriberDevices);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubscriberDeviceList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json( Obj,"subscriberDevices", subscriberDevices);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VenueDeviceList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id",id);
|
|
||||||
field_to_json(Obj,"name",name);
|
|
||||||
field_to_json(Obj,"description",description);
|
|
||||||
field_to_json(Obj,"devices",devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VenueDeviceList::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,"description",description);
|
|
||||||
field_from_json(Obj,"devices",devices);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -1091,14 +523,14 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
||||||
uint64_t Now = OpenWifi::Now();
|
uint64_t Now = std::time(nullptr);
|
||||||
if(O->has("name"))
|
if(O->has("name"))
|
||||||
I.name = O->get("name").toString();
|
I.name = O->get("name").toString();
|
||||||
|
|
||||||
if(I.name.empty())
|
if(I.name.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(O->has("description"))
|
if(O->has("description"))
|
||||||
I.description = O->get("description").toString();
|
I.description = O->get("description").toString();
|
||||||
SecurityObjects::MergeNotes(O,U,I.notes);
|
SecurityObjects::MergeNotes(O,U,I.notes);
|
||||||
SecurityObjects::NoteInfoVec N;
|
SecurityObjects::NoteInfoVec N;
|
||||||
@@ -1112,7 +544,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
||||||
uint64_t Now = OpenWifi::Now();
|
uint64_t Now = std::time(nullptr);
|
||||||
if(O->has("name"))
|
if(O->has("name"))
|
||||||
I.name = O->get("name").toString();
|
I.name = O->get("name").toString();
|
||||||
|
|
||||||
@@ -1130,34 +562,8 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
I.notes = N;
|
I.notes = N;
|
||||||
I.modified = I.created = Now;
|
I.modified = I.created = Now;
|
||||||
I.id = MicroService::CreateUUID();
|
I.id = MicroService::instance().CreateUUID();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
bool CreateObjectInfo([[maybe_unused]] const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
|
||||||
I.modified = I.created = OpenWifi::Now();
|
|
||||||
I.id = MicroService::CreateUUID();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceRules::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"rcOnly",rcOnly);
|
|
||||||
field_to_json(Obj,"rrm",rrm);
|
|
||||||
field_to_json(Obj,"firmwareUpgrade",firmwareUpgrade);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeviceRules::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"rcOnly",rcOnly);
|
|
||||||
field_from_json(Obj,"rrm",rrm);
|
|
||||||
field_from_json(Obj,"firmwareUpgrade",firmwareUpgrade);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,9 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
#ifndef OWPROV_RESTAPI_PROVOBJECTS_H
|
||||||
|
#define OWPROV_RESTAPI_PROVOBJECTS_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
#include "RESTAPI_SecurityObjects.h"
|
||||||
@@ -33,13 +35,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SerialNumberList {
|
|
||||||
Types::UUIDvec_t serialNumbers;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ManagementPolicyEntry {
|
struct ManagementPolicyEntry {
|
||||||
Types::UUIDvec_t users;
|
Types::UUIDvec_t users;
|
||||||
Types::UUIDvec_t resources;
|
Types::UUIDvec_t resources;
|
||||||
@@ -55,22 +50,12 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ManagementPolicyEntry> entries;
|
std::vector<ManagementPolicyEntry> entries;
|
||||||
Types::StringVec inUse;
|
Types::StringVec inUse;
|
||||||
Types::UUID_t entity;
|
Types::UUID_t entity;
|
||||||
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 DeviceRules {
|
|
||||||
std::string rcOnly{"inherit"};
|
|
||||||
std::string rrm{"inherit"};
|
|
||||||
std::string firmwareUpgrade{"inherit"};
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Entity {
|
struct Entity {
|
||||||
ObjectInfo info;
|
ObjectInfo info;
|
||||||
Types::UUID_t parent;
|
Types::UUID_t parent;
|
||||||
@@ -81,13 +66,8 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
Types::UUIDvec_t deviceConfiguration;
|
Types::UUIDvec_t deviceConfiguration;
|
||||||
Types::UUIDvec_t devices;
|
Types::UUIDvec_t devices;
|
||||||
DeviceRules deviceRules;
|
std::string rrm;
|
||||||
Types::StringVec sourceIP;
|
Types::StringVec sourceIP;
|
||||||
Types::UUIDvec_t variables;
|
|
||||||
Types::UUIDvec_t managementPolicies;
|
|
||||||
Types::UUIDvec_t managementRoles;
|
|
||||||
Types::UUIDvec_t maps;
|
|
||||||
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);
|
||||||
@@ -114,16 +94,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
DiGraph topology;
|
DiGraph topology;
|
||||||
std::string design;
|
std::string design;
|
||||||
Types::UUIDvec_t deviceConfiguration;
|
Types::UUIDvec_t deviceConfiguration;
|
||||||
Types::UUIDvec_t contacts;
|
std::string contact;
|
||||||
std::string location;
|
std::string location;
|
||||||
DeviceRules deviceRules;
|
std::string rrm;
|
||||||
Types::StringVec sourceIP;
|
Types::StringVec sourceIP;
|
||||||
Types::UUIDvec_t variables;
|
|
||||||
Types::UUIDvec_t configurations;
|
|
||||||
Types::UUIDvec_t maps;
|
|
||||||
Types::UUIDvec_t managementPolicies;
|
|
||||||
Types::UUIDvec_t managementRoles;
|
|
||||||
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);
|
||||||
@@ -145,7 +119,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t users;
|
Types::UUIDvec_t users;
|
||||||
Types::StringVec inUse;
|
Types::StringVec inUse;
|
||||||
Types::UUID_t entity;
|
Types::UUID_t entity;
|
||||||
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);
|
||||||
@@ -209,51 +182,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
};
|
};
|
||||||
typedef std::vector<Location> LocationVec;
|
typedef std::vector<Location> LocationVec;
|
||||||
|
|
||||||
struct OperatorLocation {
|
|
||||||
ObjectInfo info;
|
|
||||||
std::string type;
|
|
||||||
std::string buildingName;
|
|
||||||
Types::StringVec addressLines;
|
|
||||||
std::string city;
|
|
||||||
std::string state;
|
|
||||||
std::string postal;
|
|
||||||
std::string country;
|
|
||||||
Types::StringVec phones;
|
|
||||||
Types::StringVec mobiles;
|
|
||||||
std::string geoCode;
|
|
||||||
Types::UUID_t operatorId;
|
|
||||||
Types::UUID_t subscriberDeviceId;
|
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
typedef std::vector<Location> LocationVec;
|
|
||||||
|
|
||||||
struct SubLocation {
|
|
||||||
std::string type;
|
|
||||||
std::string buildingName;
|
|
||||||
Types::StringVec addressLines;
|
|
||||||
std::string city;
|
|
||||||
std::string state;
|
|
||||||
std::string postal;
|
|
||||||
std::string country;
|
|
||||||
Types::StringVec phones;
|
|
||||||
Types::StringVec mobiles;
|
|
||||||
std::string geoCode;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OperatorLocationList {
|
|
||||||
std::vector<OperatorLocation> locations;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum ContactType {
|
enum ContactType {
|
||||||
CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER,
|
CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER,
|
||||||
CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN
|
CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN
|
||||||
@@ -317,55 +245,6 @@ namespace OpenWifi::ProvObjects {
|
|||||||
};
|
};
|
||||||
typedef std::vector<Contact> ContactVec;
|
typedef std::vector<Contact> ContactVec;
|
||||||
|
|
||||||
struct OperatorContact {
|
|
||||||
ObjectInfo info;
|
|
||||||
std::string type;
|
|
||||||
std::string title;
|
|
||||||
std::string salutation;
|
|
||||||
std::string firstname;
|
|
||||||
std::string lastname;
|
|
||||||
std::string initials;
|
|
||||||
std::string visual;
|
|
||||||
Types::StringVec mobiles;
|
|
||||||
Types::StringVec phones;
|
|
||||||
std::string primaryEmail;
|
|
||||||
std::string secondaryEmail;
|
|
||||||
std::string accessPIN;
|
|
||||||
Types::UUID_t operatorId;
|
|
||||||
Types::UUID_t subscriberDeviceId;
|
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubContact {
|
|
||||||
std::string type;
|
|
||||||
std::string title;
|
|
||||||
std::string salutation;
|
|
||||||
std::string firstname;
|
|
||||||
std::string lastname;
|
|
||||||
std::string initials;
|
|
||||||
std::string visual;
|
|
||||||
Types::StringVec mobiles;
|
|
||||||
Types::StringVec phones;
|
|
||||||
std::string primaryEmail;
|
|
||||||
std::string secondaryEmail;
|
|
||||||
std::string accessPIN;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OperatorContactList {
|
|
||||||
std::vector<OperatorContact> contacts;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::vector<OperatorContact> OperatorContactVec;
|
|
||||||
|
|
||||||
struct DeviceConfigurationElement {
|
struct DeviceConfigurationElement {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string description;
|
std::string description;
|
||||||
@@ -378,24 +257,21 @@ namespace OpenWifi::ProvObjects {
|
|||||||
typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec;
|
typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec;
|
||||||
|
|
||||||
struct DeviceConfiguration {
|
struct DeviceConfiguration {
|
||||||
ObjectInfo info;
|
ObjectInfo info;
|
||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
Types::StringVec deviceTypes;
|
Types::StringVec deviceTypes;
|
||||||
DeviceConfigurationElementVec configuration;
|
DeviceConfigurationElementVec configuration;
|
||||||
Types::StringVec inUse;
|
Types::StringVec inUse;
|
||||||
Types::UUIDvec_t variables;
|
Types::StringPairVec variables;
|
||||||
DeviceRules deviceRules;
|
std::string rrm;
|
||||||
bool subscriberOnly=false;
|
std::string firmwareUpgrade;
|
||||||
std::string venue;
|
bool firmwareRCOnly=false;
|
||||||
std::string entity;
|
|
||||||
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 {
|
||||||
ObjectInfo info;
|
ObjectInfo info;
|
||||||
std::string serialNumber;
|
std::string serialNumber;
|
||||||
@@ -408,36 +284,14 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string location;
|
std::string location;
|
||||||
std::string contact;
|
std::string contact;
|
||||||
std::string deviceConfiguration;
|
std::string deviceConfiguration;
|
||||||
DeviceRules deviceRules;
|
std::string rrm;
|
||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
std::string state;
|
|
||||||
std::string devClass;
|
|
||||||
std::string locale;
|
|
||||||
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<InventoryTag> InventoryTagVec;
|
typedef std::vector<InventoryTag> InventoryTagVec;
|
||||||
|
|
||||||
struct InventoryTagList {
|
|
||||||
InventoryTagVec taglist;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct InventoryConfigApplyResult {
|
|
||||||
std::string appliedConfiguration;
|
|
||||||
Types::StringVec errors;
|
|
||||||
Types::StringVec warnings;
|
|
||||||
uint64_t errorCode;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Report {
|
struct Report {
|
||||||
uint64_t snapShot=0;
|
uint64_t snapShot=0;
|
||||||
Types::CountedMap tenants;
|
Types::CountedMap tenants;
|
||||||
@@ -470,21 +324,16 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UuidList {
|
struct UserList {
|
||||||
Types::UUIDvec_t list;
|
std::vector<std::string> 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
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ObjectACL {
|
struct ObjectACL {
|
||||||
UuidList users;
|
UserList users;
|
||||||
UuidList roles;
|
std::string access;
|
||||||
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);
|
||||||
@@ -502,10 +351,8 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string data;
|
std::string data;
|
||||||
std::string entity;
|
std::string entity;
|
||||||
std::string creator;
|
std::string creator;
|
||||||
std::string visibility{"private"};
|
std::string visibility;
|
||||||
ObjectACLList access;
|
ObjectACLList access;
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
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);
|
||||||
@@ -518,168 +365,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SignupStatusCodes {
|
|
||||||
SignupCreated = 0 ,
|
|
||||||
SignupWaitingForEmail,
|
|
||||||
SignupWaitingForDevice,
|
|
||||||
SignupSuccess,
|
|
||||||
SignupFailure,
|
|
||||||
SignupCanceled,
|
|
||||||
SignupTimedOut
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SignupEntry {
|
|
||||||
ObjectInfo info;
|
|
||||||
std::string email;
|
|
||||||
std::string userId;
|
|
||||||
std::string macAddress;
|
|
||||||
std::string serialNumber;
|
|
||||||
uint64_t submitted = 0 ;
|
|
||||||
uint64_t completed = 0 ;
|
|
||||||
std::string status;
|
|
||||||
uint64_t error=0;
|
|
||||||
uint64_t statusCode=0;
|
|
||||||
std::string deviceID;
|
|
||||||
std::string registrationId;
|
|
||||||
std::string operatorId;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Variable {
|
|
||||||
std::string type;
|
|
||||||
uint64_t weight=0;
|
|
||||||
std::string prefix;
|
|
||||||
std::string value;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VariableList {
|
|
||||||
std::vector<Variable> variables;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VariableBlock {
|
|
||||||
ObjectInfo info;
|
|
||||||
std::vector<Variable> variables;
|
|
||||||
std::string entity;
|
|
||||||
std::string venue;
|
|
||||||
std::string subscriber;
|
|
||||||
std::string inventory;
|
|
||||||
Types::UUIDvec_t configurations;
|
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VariableBlockList {
|
|
||||||
std::vector<VariableBlock> variableBlocks;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Operator {
|
|
||||||
ObjectInfo info;
|
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
Types::UUIDvec_t managementRoles;
|
|
||||||
DeviceRules deviceRules;
|
|
||||||
std::vector<Variable> variables;
|
|
||||||
bool defaultOperator=false;
|
|
||||||
Types::StringVec sourceIP;
|
|
||||||
std::string registrationId;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OperatorList {
|
|
||||||
std::vector<Operator> operators;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VenueDeviceList {
|
|
||||||
std::string id;
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
Types::UUIDvec_t devices;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ServiceClass {
|
|
||||||
ObjectInfo info;
|
|
||||||
Types::UUID_t operatorId;
|
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
double cost=0.0;
|
|
||||||
std::string currency;
|
|
||||||
std::string period;
|
|
||||||
std::string billingCode;
|
|
||||||
std::vector<Variable> variables;
|
|
||||||
bool defaultService=false;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ServiceClassList {
|
|
||||||
std::vector<ServiceClass> serviceClasses;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ConfigurationDetails {
|
|
||||||
DeviceConfigurationElementVec configuration;
|
|
||||||
std::string rrm{"inherit"};
|
|
||||||
std::string firmwareUpgrade{"inherit"};
|
|
||||||
std::string firmwareRCOnly{"inherit"};
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubscriberDevice {
|
|
||||||
ObjectInfo info;
|
|
||||||
std::string serialNumber;
|
|
||||||
std::string deviceType;
|
|
||||||
Types::UUID_t operatorId;
|
|
||||||
Types::UUID_t subscriberId;
|
|
||||||
SubLocation location;
|
|
||||||
SubContact contact;
|
|
||||||
Types::UUID_t managementPolicy;
|
|
||||||
Types::UUID_t serviceClass;
|
|
||||||
std::string qrCode;
|
|
||||||
std::string geoCode;
|
|
||||||
DeviceRules deviceRules;
|
|
||||||
std::string state;
|
|
||||||
std::string locale;
|
|
||||||
std::string billingCode;
|
|
||||||
DeviceConfigurationElementVec configuration;
|
|
||||||
bool suspended=false;
|
|
||||||
std::string realMacAddress;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubscriberDeviceList {
|
|
||||||
std::vector<SubscriberDevice> subscriberDevices;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
||||||
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
||||||
bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //OWPROV_RESTAPI_PROVOBJECTS_H
|
||||||
|
|||||||
@@ -54,8 +54,6 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
return ADMIN;
|
return ADMIN;
|
||||||
else if (!Poco::icompare(U,"subscriber"))
|
else if (!Poco::icompare(U,"subscriber"))
|
||||||
return SUBSCRIBER;
|
return SUBSCRIBER;
|
||||||
else if (!Poco::icompare(U,"partner"))
|
|
||||||
return PARTNER;
|
|
||||||
else if (!Poco::icompare(U,"csr"))
|
else if (!Poco::icompare(U,"csr"))
|
||||||
return CSR;
|
return CSR;
|
||||||
else if (!Poco::icompare(U, "system"))
|
else if (!Poco::icompare(U, "system"))
|
||||||
@@ -74,7 +72,6 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
case ROOT: return "root";
|
case ROOT: return "root";
|
||||||
case ADMIN: return "admin";
|
case ADMIN: return "admin";
|
||||||
case SUBSCRIBER: return "subscriber";
|
case SUBSCRIBER: return "subscriber";
|
||||||
case PARTNER: return "partner";
|
|
||||||
case CSR: return "csr";
|
case CSR: return "csr";
|
||||||
case SYSTEM: return "system";
|
case SYSTEM: return "system";
|
||||||
case INSTALLER: return "installer";
|
case INSTALLER: return "installer";
|
||||||
@@ -95,7 +92,6 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "PortalLogin", PortalLogin_);
|
field_from_json(Obj, "PortalLogin", PortalLogin_);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: AclTemplate" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -113,8 +109,6 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"userMustChangePassword",userMustChangePassword);
|
field_to_json(Obj,"userMustChangePassword",userMustChangePassword);
|
||||||
field_to_json(Obj,"errorCode", errorCode);
|
field_to_json(Obj,"errorCode", errorCode);
|
||||||
Obj.set("aclTemplate",AclTemplateObj);
|
Obj.set("aclTemplate",AclTemplateObj);
|
||||||
field_to_json(Obj,"errorCode", errorCode);
|
|
||||||
field_to_json(Obj,"lastRefresh", lastRefresh_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -131,10 +125,9 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "created", created_);
|
field_from_json(Obj, "created", created_);
|
||||||
field_from_json(Obj, "username", username_);
|
field_from_json(Obj, "username", username_);
|
||||||
field_from_json(Obj, "userMustChangePassword",userMustChangePassword);
|
field_from_json(Obj, "userMustChangePassword",userMustChangePassword);
|
||||||
field_from_json(Obj,"lastRefresh", lastRefresh_);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: WebToken" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -145,14 +138,14 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"primary", primary);
|
field_to_json(Obj,"primary", primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MobilePhoneNumber::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool MobilePhoneNumber::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"number",number);
|
field_from_json(Obj,"number",number);
|
||||||
field_from_json(Obj,"verified",verified);
|
field_from_json(Obj,"verified",verified);
|
||||||
field_from_json(Obj,"primary",primary);
|
field_from_json(Obj,"primary",primary);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: MobilePhoneNumber" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -162,13 +155,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"method", method);
|
field_to_json(Obj,"method", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MfaAuthInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool MfaAuthInfo::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"enabled",enabled);
|
field_from_json(Obj,"enabled",enabled);
|
||||||
field_from_json(Obj,"method",method);
|
field_from_json(Obj,"method",method);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: MfaAuthInfo" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -176,17 +169,15 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
void UserLoginLoginExtensions::to_json(Poco::JSON::Object &Obj) const {
|
void UserLoginLoginExtensions::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "mobiles", mobiles);
|
field_to_json(Obj, "mobiles", mobiles);
|
||||||
field_to_json(Obj, "mfa", mfa);
|
field_to_json(Obj, "mfa", mfa);
|
||||||
field_to_json(Obj, "authenticatorSecret", authenticatorSecret);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UserLoginLoginExtensions::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool UserLoginLoginExtensions::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "mobiles",mobiles);
|
field_from_json(Obj,"mobiles",mobiles);
|
||||||
field_from_json(Obj, "mfa",mfa);
|
field_from_json(Obj,"mfa",mfa);
|
||||||
field_from_json(Obj, "authenticatorSecret", authenticatorSecret);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: UserLoginLoginExtensions" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -198,7 +189,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj, "method", method);
|
field_to_json(Obj, "method", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MFAChallengeRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool MFAChallengeRequest::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"uuid",uuid);
|
field_from_json(Obj,"uuid",uuid);
|
||||||
field_from_json(Obj,"question",question);
|
field_from_json(Obj,"question",question);
|
||||||
@@ -206,7 +197,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"method",method);
|
field_from_json(Obj,"method",method);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: MFAChallengeRequest" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -214,22 +205,23 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const {
|
void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "uuid", uuid);
|
field_to_json(Obj, "uuid", uuid);
|
||||||
field_to_json(Obj, "answer", answer);
|
field_to_json(Obj, "answer", answer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MFAChallengeResponse::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool MFAChallengeResponse::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"uuid",uuid);
|
field_from_json(Obj,"uuid",uuid);
|
||||||
field_from_json(Obj,"answer",answer);
|
field_from_json(Obj,"answer",answer);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: MFAChallengeResponse" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserInfo::to_json(Poco::JSON::Object &Obj) const {
|
void UserInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"id",id);
|
field_to_json(Obj,"Id",Id);
|
||||||
field_to_json(Obj,"name",name);
|
field_to_json(Obj,"name",name);
|
||||||
field_to_json(Obj,"description", description);
|
field_to_json(Obj,"description", description);
|
||||||
field_to_json(Obj,"avatar", avatar);
|
field_to_json(Obj,"avatar", avatar);
|
||||||
@@ -259,13 +251,11 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"lastPasswords",lastPasswords);
|
field_to_json(Obj,"lastPasswords",lastPasswords);
|
||||||
field_to_json(Obj,"oauthType",oauthType);
|
field_to_json(Obj,"oauthType",oauthType);
|
||||||
field_to_json(Obj,"oauthUserInfo",oauthUserInfo);
|
field_to_json(Obj,"oauthUserInfo",oauthUserInfo);
|
||||||
field_to_json(Obj,"modified",modified);
|
|
||||||
field_to_json(Obj,"signingUp",signingUp);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id",id);
|
field_from_json(Obj,"Id",Id);
|
||||||
field_from_json(Obj,"name",name);
|
field_from_json(Obj,"name",name);
|
||||||
field_from_json(Obj,"description",description);
|
field_from_json(Obj,"description",description);
|
||||||
field_from_json(Obj,"avatar",avatar);
|
field_from_json(Obj,"avatar",avatar);
|
||||||
@@ -275,8 +265,6 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"currentLoginURI",currentLoginURI);
|
field_from_json(Obj,"currentLoginURI",currentLoginURI);
|
||||||
field_from_json(Obj,"locale",locale);
|
field_from_json(Obj,"locale",locale);
|
||||||
field_from_json(Obj,"notes",notes);
|
field_from_json(Obj,"notes",notes);
|
||||||
field_from_json(Obj,"location", location);
|
|
||||||
field_from_json(Obj,"owner", owner);
|
|
||||||
field_from_json<USER_ROLE>(Obj,"userRole",userRole, UserTypeFromString);
|
field_from_json<USER_ROLE>(Obj,"userRole",userRole, UserTypeFromString);
|
||||||
field_from_json(Obj,"securityPolicy",securityPolicy);
|
field_from_json(Obj,"securityPolicy",securityPolicy);
|
||||||
field_from_json(Obj,"userTypeProprietaryInfo",userTypeProprietaryInfo);
|
field_from_json(Obj,"userTypeProprietaryInfo",userTypeProprietaryInfo);
|
||||||
@@ -295,29 +283,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"lastPasswords",lastPasswords);
|
field_from_json(Obj,"lastPasswords",lastPasswords);
|
||||||
field_from_json(Obj,"oauthType",oauthType);
|
field_from_json(Obj,"oauthType",oauthType);
|
||||||
field_from_json(Obj,"oauthUserInfo",oauthUserInfo);
|
field_from_json(Obj,"oauthUserInfo",oauthUserInfo);
|
||||||
field_from_json(Obj,"modified",modified);
|
|
||||||
field_from_json(Obj,"signingUp",signingUp);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
std::cout << "Cannot parse: UserInfo" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
void UserInfoList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"users",users);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UserInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"users",users);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
std::cout << "Cannot parse: InternalServiceInfo" << std::endl;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const {
|
void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"privateURI",privateURI);
|
field_to_json(Obj,"privateURI",privateURI);
|
||||||
field_to_json(Obj,"publicURI",publicURI);
|
field_to_json(Obj,"publicURI",publicURI);
|
||||||
@@ -331,7 +303,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"token",token);
|
field_from_json(Obj,"token",token);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: InternalServiceInfo" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -349,7 +321,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "services", services);
|
field_from_json(Obj, "services", services);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: InternalSystemServices" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -371,7 +343,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "authenticationType", authenticationType);
|
field_from_json(Obj, "authenticationType", authenticationType);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: SystemEndpoint" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -385,7 +357,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "endpoints", endpoints);
|
field_from_json(Obj, "endpoints", endpoints);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cout << "Cannot parse: SystemEndpointList" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -404,7 +376,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "userInfo", userinfo);
|
field_from_json(Obj, "userInfo", userinfo);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: UserInfoAndPolicy" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -415,14 +387,14 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"note", note);
|
field_to_json(Obj,"note", note);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NoteInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool NoteInfo::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"created",created);
|
field_from_json(Obj,"created",created);
|
||||||
field_from_json(Obj,"createdBy",createdBy);
|
field_from_json(Obj,"createdBy",createdBy);
|
||||||
field_from_json(Obj,"note", note);
|
field_from_json(Obj,"note",note);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: NoteInfo" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -433,20 +405,20 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
SecurityObjects::NoteInfoVec NIV;
|
SecurityObjects::NoteInfoVec NIV;
|
||||||
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
|
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
|
||||||
for(auto const &i:NIV) {
|
for(auto const &i:NIV) {
|
||||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UInfo.email, .note=i.note};
|
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note};
|
||||||
Notes.push_back(ii);
|
Notes.push_back(ii);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: MergeNotes" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) {
|
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) {
|
||||||
for(auto const &i:NewNotes) {
|
for(auto const &i:NewNotes) {
|
||||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UInfo.email, .note=i.note};
|
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note};
|
||||||
ExistingNotes.push_back(ii);
|
ExistingNotes.push_back(ii);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -457,13 +429,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
|
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProfileAction::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ProfileAction::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"resource",resource);
|
field_from_json(Obj,"resource",resource);
|
||||||
field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString );
|
field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString );
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: ProfileAction" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -477,7 +449,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"notes", notes);
|
field_to_json(Obj,"notes", notes);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SecurityProfile::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool SecurityProfile::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id",id);
|
field_from_json(Obj,"id",id);
|
||||||
field_from_json(Obj,"name",name);
|
field_from_json(Obj,"name",name);
|
||||||
@@ -487,7 +459,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"notes",notes);
|
field_from_json(Obj,"notes",notes);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: SecurityProfile" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -496,12 +468,12 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj, "profiles", profiles);
|
field_to_json(Obj, "profiles", profiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SecurityProfileList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool SecurityProfileList::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"profiles",profiles);
|
field_from_json(Obj,"profiles",profiles);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: SecurityProfileList" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -519,10 +491,10 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"expires",expires);
|
field_to_json(Obj,"expires",expires);
|
||||||
field_to_json(Obj,"completed",completed);
|
field_to_json(Obj,"completed",completed);
|
||||||
field_to_json(Obj,"canceled",canceled);
|
field_to_json(Obj,"canceled",canceled);
|
||||||
field_to_json(Obj,"userAction",userAction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ActionLink::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ActionLink::from_json(Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id",id);
|
field_from_json(Obj,"id",id);
|
||||||
field_from_json(Obj,"action",action);
|
field_from_json(Obj,"action",action);
|
||||||
@@ -536,88 +508,11 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"expires",expires);
|
field_from_json(Obj,"expires",expires);
|
||||||
field_from_json(Obj,"completed",completed);
|
field_from_json(Obj,"completed",completed);
|
||||||
field_from_json(Obj,"canceled",canceled);
|
field_from_json(Obj,"canceled",canceled);
|
||||||
field_from_json(Obj,"userAction",userAction);
|
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Cannot parse: ActionLink" << std::endl;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Preferences::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id",id);
|
|
||||||
field_to_json(Obj,"modified",modified);
|
|
||||||
field_to_json(Obj,"data",data);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Preferences::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id",id);
|
|
||||||
field_from_json(Obj,"modified",modified);
|
|
||||||
field_from_json(Obj,"data",data);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
std::cout << "Cannot parse: Preferences" << std::endl;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubMfaConfig::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"id",id);
|
|
||||||
field_to_json(Obj,"type",type);
|
|
||||||
field_to_json(Obj,"sms",sms);
|
|
||||||
field_to_json(Obj,"email",email);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubMfaConfig::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"id",id);
|
|
||||||
field_from_json(Obj,"type",type);
|
|
||||||
field_from_json(Obj,"sms",sms);
|
|
||||||
field_from_json(Obj,"email",email);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
std::cout << "Cannot parse: SubMfaConfig" << std::endl;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Token::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"token",token);
|
|
||||||
field_to_json(Obj,"refreshToken",refreshToken);
|
|
||||||
field_to_json(Obj,"tokenType",tokenType);
|
|
||||||
field_to_json(Obj,"userName",userName);
|
|
||||||
field_to_json(Obj,"created",created);
|
|
||||||
field_to_json(Obj,"expires",expires);
|
|
||||||
field_to_json(Obj,"idleTimeout",idleTimeout);
|
|
||||||
field_to_json(Obj,"revocationDate",revocationDate);
|
|
||||||
field_to_json(Obj,"lastRefresh", lastRefresh);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Token::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj,"token",token);
|
|
||||||
field_from_json(Obj,"refreshToken",refreshToken);
|
|
||||||
field_from_json(Obj,"tokenType",tokenType);
|
|
||||||
field_from_json(Obj,"userName",userName);
|
|
||||||
field_from_json(Obj,"created",created);
|
|
||||||
field_from_json(Obj,"expires",expires);
|
|
||||||
field_from_json(Obj,"idleTimeout",idleTimeout);
|
|
||||||
field_from_json(Obj,"revocationDate",revocationDate);
|
|
||||||
field_from_json(Obj,"lastRefresh", lastRefresh);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
std::cout << "Cannot parse: Token" << std::endl;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoginRecordInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj,"sessionId",sessionId);
|
|
||||||
field_to_json(Obj,"userId",userId);
|
|
||||||
field_to_json(Obj,"email",email);
|
|
||||||
field_to_json(Obj,"login",login);
|
|
||||||
field_to_json(Obj,"logout",logout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,322 +6,244 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
||||||
|
#define UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <type_traits>
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Poco/Data/LOB.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "Poco/Data/LOBStream.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi::SecurityObjects {
|
||||||
uint64_t Now();
|
|
||||||
namespace SecurityObjects {
|
|
||||||
|
|
||||||
typedef std::string USER_ID_TYPE;
|
|
||||||
|
|
||||||
struct AclTemplate {
|
struct AclTemplate {
|
||||||
bool Read_ = true;
|
bool Read_ = true;
|
||||||
bool ReadWrite_ = true;
|
bool ReadWrite_ = true;
|
||||||
bool ReadWriteCreate_ = true;
|
bool ReadWriteCreate_ = true;
|
||||||
bool Delete_ = true;
|
bool Delete_ = true;
|
||||||
bool PortalLogin_ = true;
|
bool PortalLogin_ = true;
|
||||||
|
|
||||||
AclTemplate() noexcept = default;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj); };
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct WebToken {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string access_token_;
|
||||||
};
|
std::string refresh_token_;
|
||||||
|
std::string id_token_;
|
||||||
|
std::string token_type_;
|
||||||
|
std::string username_;
|
||||||
|
bool userMustChangePassword=false;
|
||||||
|
uint64_t errorCode=0;
|
||||||
|
uint64_t expires_in_=0;
|
||||||
|
uint64_t idle_timeout_=0;
|
||||||
|
AclTemplate acl_template_;
|
||||||
|
uint64_t created_=0;
|
||||||
|
|
||||||
static_assert( std::is_nothrow_move_constructible_v<AclTemplate> );
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct WebToken {
|
enum USER_ROLE {
|
||||||
std::string access_token_;
|
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING
|
||||||
std::string refresh_token_;
|
};
|
||||||
std::string id_token_;
|
|
||||||
std::string token_type_;
|
|
||||||
std::string username_;
|
|
||||||
bool userMustChangePassword=false;
|
|
||||||
uint64_t errorCode=0;
|
|
||||||
uint64_t expires_in_=0;
|
|
||||||
uint64_t idle_timeout_=0;
|
|
||||||
AclTemplate acl_template_;
|
|
||||||
uint64_t created_=0;
|
|
||||||
uint64_t lastRefresh_=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
USER_ROLE UserTypeFromString(const std::string &U);
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string UserTypeToString(USER_ROLE U);
|
||||||
};
|
|
||||||
|
|
||||||
enum USER_ROLE {
|
struct NoteInfo {
|
||||||
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING, PARTNER
|
uint64_t created = std::time(nullptr);
|
||||||
};
|
std::string createdBy;
|
||||||
|
std::string note;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
typedef std::vector<NoteInfo> NoteInfoVec;
|
||||||
|
|
||||||
USER_ROLE UserTypeFromString(const std::string &U);
|
struct MobilePhoneNumber {
|
||||||
std::string UserTypeToString(USER_ROLE U);
|
std::string number;
|
||||||
|
bool verified = false;
|
||||||
|
bool primary = false;
|
||||||
|
|
||||||
struct NoteInfo {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
uint64_t created=0; // = OpenWifi::Now();
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
std::string createdBy;
|
};
|
||||||
std::string note;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct MfaAuthInfo {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool enabled = false;
|
||||||
};
|
std::string method;
|
||||||
typedef std::vector<NoteInfo> NoteInfoVec;
|
|
||||||
|
|
||||||
struct MobilePhoneNumber {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string number;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
bool verified = false;
|
};
|
||||||
bool primary = false;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct UserLoginLoginExtensions {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::vector<MobilePhoneNumber> mobiles;
|
||||||
};
|
struct MfaAuthInfo mfa;
|
||||||
|
|
||||||
struct MfaAuthInfo {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool enabled = false;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
std::string method;
|
};
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct MFAChallengeRequest {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string uuid;
|
||||||
};
|
std::string question;
|
||||||
|
std::string method;
|
||||||
|
uint64_t created = std::time(nullptr);
|
||||||
|
|
||||||
struct UserLoginLoginExtensions {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::vector<MobilePhoneNumber> mobiles;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
struct MfaAuthInfo mfa;
|
};
|
||||||
std::string authenticatorSecret;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct MFAChallengeResponse {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string uuid;
|
||||||
};
|
std::string answer;
|
||||||
|
|
||||||
struct MFAChallengeRequest {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string uuid;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
std::string question;
|
};
|
||||||
std::string method;
|
|
||||||
uint64_t created = OpenWifi::Now();
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct UserInfo {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string Id;
|
||||||
};
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
std::string avatar;
|
||||||
|
std::string email;
|
||||||
|
bool validated = false;
|
||||||
|
std::string validationEmail;
|
||||||
|
uint64_t validationDate = 0;
|
||||||
|
uint64_t creationDate = 0;
|
||||||
|
std::string validationURI;
|
||||||
|
bool changePassword = false;
|
||||||
|
uint64_t lastLogin = 0;
|
||||||
|
std::string currentLoginURI;
|
||||||
|
uint64_t lastPasswordChange = 0;
|
||||||
|
uint64_t lastEmailCheck = 0;
|
||||||
|
bool waitingForEmailCheck = false;
|
||||||
|
std::string locale;
|
||||||
|
NoteInfoVec notes;
|
||||||
|
std::string location;
|
||||||
|
std::string owner;
|
||||||
|
bool suspended = false;
|
||||||
|
bool blackListed = false;
|
||||||
|
USER_ROLE userRole;
|
||||||
|
UserLoginLoginExtensions userTypeProprietaryInfo;
|
||||||
|
std::string securityPolicy;
|
||||||
|
uint64_t securityPolicyChange = 0 ;
|
||||||
|
std::string currentPassword;
|
||||||
|
Types::StringVec lastPasswords;
|
||||||
|
std::string oauthType;
|
||||||
|
std::string oauthUserInfo;
|
||||||
|
|
||||||
struct MFAChallengeResponse {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string uuid;
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
std::string answer;
|
};
|
||||||
|
typedef std::vector<UserInfo> UserInfoVec;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
// bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
||||||
};
|
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes);
|
||||||
|
|
||||||
struct UserInfo {
|
struct InternalServiceInfo {
|
||||||
std::string id;
|
std::string privateURI;
|
||||||
std::string name;
|
std::string publicURI;
|
||||||
std::string description;
|
std::string token;
|
||||||
std::string avatar;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string email;
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
bool validated = false;
|
};
|
||||||
std::string validationEmail;
|
typedef std::vector<InternalServiceInfo> InternalServiceInfoVec;
|
||||||
uint64_t validationDate = 0;
|
|
||||||
uint64_t creationDate = 0;
|
|
||||||
std::string validationURI;
|
|
||||||
bool changePassword = false;
|
|
||||||
uint64_t lastLogin = 0;
|
|
||||||
std::string currentLoginURI;
|
|
||||||
uint64_t lastPasswordChange = 0;
|
|
||||||
uint64_t lastEmailCheck = 0;
|
|
||||||
bool waitingForEmailCheck = false;
|
|
||||||
std::string locale;
|
|
||||||
NoteInfoVec notes;
|
|
||||||
std::string location;
|
|
||||||
std::string owner;
|
|
||||||
bool suspended = false;
|
|
||||||
bool blackListed = false;
|
|
||||||
USER_ROLE userRole;
|
|
||||||
UserLoginLoginExtensions userTypeProprietaryInfo;
|
|
||||||
std::string securityPolicy;
|
|
||||||
uint64_t securityPolicyChange = 0 ;
|
|
||||||
std::string currentPassword;
|
|
||||||
OpenWifi::Types::StringVec lastPasswords;
|
|
||||||
std::string oauthType;
|
|
||||||
std::string oauthUserInfo;
|
|
||||||
uint64_t modified;
|
|
||||||
std::string signingUp;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct InternalSystemServices {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string key;
|
||||||
};
|
std::string version;
|
||||||
typedef std::vector<UserInfo> UserInfoVec;
|
InternalServiceInfoVec services;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct UserInfoList {
|
struct SystemEndpoint {
|
||||||
std::vector<UserInfo> users;
|
std::string type;
|
||||||
|
uint64_t id = 0;
|
||||||
|
std::string vendor{"OpenWiFi"};
|
||||||
|
std::string uri;
|
||||||
|
std::string authenticationType{"internal_v1"};
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
typedef std::vector<SystemEndpoint> SystemEndpointVec;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
struct SystemEndpointList {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
SystemEndpointVec endpoints;
|
||||||
};
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
// bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
struct UserInfoAndPolicy {
|
||||||
bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
WebToken webtoken;
|
||||||
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes);
|
UserInfo userinfo;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
typedef std::map<std::string,SecurityObjects::UserInfoAndPolicy> UserInfoCache;
|
||||||
|
|
||||||
struct InternalServiceInfo {
|
enum ResourceAccessType {
|
||||||
std::string privateURI;
|
NONE,
|
||||||
std::string publicURI;
|
READ,
|
||||||
std::string token;
|
MODIFY,
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
DELETE,
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
CREATE,
|
||||||
};
|
TEST,
|
||||||
typedef std::vector<InternalServiceInfo> InternalServiceInfoVec;
|
MOVE
|
||||||
|
};
|
||||||
|
|
||||||
struct InternalSystemServices {
|
ResourceAccessType ResourceAccessTypeFromString(const std::string &s);
|
||||||
std::string key;
|
std::string ResourceAccessTypeToString(const ResourceAccessType & T);
|
||||||
std::string version;
|
|
||||||
InternalServiceInfoVec services;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SystemEndpoint {
|
struct ProfileAction {
|
||||||
std::string type;
|
std::string resource;
|
||||||
uint64_t id = 0;
|
ResourceAccessType access;
|
||||||
std::string vendor{"OpenWiFi"};
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string uri;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
std::string authenticationType{"internal_v1"};
|
};
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
typedef std::vector<ProfileAction> ProfileActionVec;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
typedef std::vector<SystemEndpoint> SystemEndpointVec;
|
|
||||||
|
|
||||||
struct SystemEndpointList {
|
struct SecurityProfile {
|
||||||
SystemEndpointVec endpoints;
|
uint64_t id=0;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
std::string name;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
std::string description;
|
||||||
};
|
ProfileActionVec policy;
|
||||||
|
std::string role;
|
||||||
|
NoteInfoVec notes;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
typedef std::vector<SecurityProfile> SecurityProfileVec;
|
||||||
|
|
||||||
struct UserInfoAndPolicy {
|
struct SecurityProfileList {
|
||||||
WebToken webtoken;
|
SecurityProfileVec profiles;
|
||||||
UserInfo userinfo;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
};
|
||||||
};
|
|
||||||
typedef std::map<std::string,SecurityObjects::UserInfoAndPolicy> UserInfoCache;
|
|
||||||
|
|
||||||
enum ResourceAccessType {
|
enum LinkActions {
|
||||||
NONE,
|
FORGOT_PASSWORD=1,
|
||||||
READ,
|
VERIFY_EMAIL
|
||||||
MODIFY,
|
};
|
||||||
DELETE,
|
|
||||||
CREATE,
|
|
||||||
TEST,
|
|
||||||
MOVE
|
|
||||||
};
|
|
||||||
|
|
||||||
ResourceAccessType ResourceAccessTypeFromString(const std::string &s);
|
struct ActionLink {
|
||||||
std::string ResourceAccessTypeToString(const ResourceAccessType & T);
|
std::string id;
|
||||||
|
uint64_t action;
|
||||||
|
std::string userId;
|
||||||
|
std::string actionTemplate;
|
||||||
|
Types::StringPairVec variables;
|
||||||
|
std::string locale;
|
||||||
|
std::string message;
|
||||||
|
uint64_t sent=0;
|
||||||
|
uint64_t created=std::time(nullptr);
|
||||||
|
uint64_t expires=0;
|
||||||
|
uint64_t completed=0;
|
||||||
|
uint64_t canceled=0;
|
||||||
|
|
||||||
struct ProfileAction {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string resource;
|
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
||||||
ResourceAccessType access;
|
};
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
typedef std::vector<ProfileAction> ProfileActionVec;
|
|
||||||
|
|
||||||
struct SecurityProfile {
|
|
||||||
uint64_t id=0;
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
ProfileActionVec policy;
|
|
||||||
std::string role;
|
|
||||||
NoteInfoVec notes;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
typedef std::vector<SecurityProfile> SecurityProfileVec;
|
|
||||||
|
|
||||||
struct SecurityProfileList {
|
|
||||||
SecurityProfileVec profiles;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
enum LinkActions {
|
|
||||||
FORGOT_PASSWORD=1,
|
|
||||||
VERIFY_EMAIL,
|
|
||||||
SUB_FORGOT_PASSWORD,
|
|
||||||
SUB_VERIFY_EMAIL,
|
|
||||||
SUB_SIGNUP
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ActionLink {
|
|
||||||
std::string id;
|
|
||||||
uint64_t action;
|
|
||||||
std::string userId;
|
|
||||||
std::string actionTemplate;
|
|
||||||
Types::StringPairVec variables;
|
|
||||||
std::string locale;
|
|
||||||
std::string message;
|
|
||||||
uint64_t sent=0;
|
|
||||||
uint64_t created=OpenWifi::Now();
|
|
||||||
uint64_t expires=0;
|
|
||||||
uint64_t completed=0;
|
|
||||||
uint64_t canceled=0;
|
|
||||||
bool userAction=true;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Preferences {
|
|
||||||
std::string id;
|
|
||||||
uint64_t modified;
|
|
||||||
Types::StringPairVec data;
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubMfaConfig {
|
|
||||||
std::string id;
|
|
||||||
std::string type;
|
|
||||||
std::string sms;
|
|
||||||
std::string email;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Token {
|
|
||||||
std::string token;
|
|
||||||
std::string refreshToken;
|
|
||||||
std::string tokenType;
|
|
||||||
std::string userName;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t expires=0;
|
|
||||||
uint64_t idleTimeout=0;
|
|
||||||
uint64_t revocationDate=0;
|
|
||||||
uint64_t lastRefresh=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Avatar {
|
|
||||||
std::string id;
|
|
||||||
std::string type;
|
|
||||||
uint64_t created=0;
|
|
||||||
std::string name;
|
|
||||||
Poco::Data::BLOB avatar;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct LoginRecordInfo {
|
|
||||||
std::string sessionId;
|
|
||||||
std::string userId;
|
|
||||||
std::string email;
|
|
||||||
uint64_t login=0;
|
|
||||||
uint64_t logout=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
||||||
@@ -1,603 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-10-27.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "RESTAPI_SubObjects.h"
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
|
||||||
|
|
||||||
|
|
||||||
namespace OpenWifi::SubObjects {
|
|
||||||
|
|
||||||
void HomeDeviceMode::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "enableLEDS", enableLEDS);
|
|
||||||
field_to_json(Obj, "type", type);
|
|
||||||
field_to_json(Obj, "subnet", subnet);
|
|
||||||
field_to_json(Obj, "subnetMask", subnetMask);
|
|
||||||
field_to_json(Obj, "startIP", startIP);
|
|
||||||
field_to_json(Obj, "endIP", endIP);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
field_to_json(Obj, "subnetV6", subnetV6);
|
|
||||||
field_to_json(Obj, "subnetMaskV6", subnetMaskV6);
|
|
||||||
field_to_json(Obj, "startIPV6", startIPV6);
|
|
||||||
field_to_json(Obj, "endIPV6", endIPV6);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HomeDeviceMode::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "enableLEDS", enableLEDS);
|
|
||||||
field_from_json(Obj, "type", type);
|
|
||||||
field_from_json(Obj, "subnet", subnet);
|
|
||||||
field_from_json(Obj, "subnetMask", subnetMask);
|
|
||||||
field_from_json(Obj, "startIP", startIP);
|
|
||||||
field_from_json(Obj, "endIP", endIP);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
field_from_json(Obj, "subnetV6", subnetV6);
|
|
||||||
field_from_json(Obj, "subnetMaskV6", subnetMaskV6);
|
|
||||||
field_from_json(Obj, "startIPV6", startIPV6);
|
|
||||||
field_from_json(Obj, "endIPV6", endIPV6);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IPReservation::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "nickname", nickname);
|
|
||||||
field_to_json(Obj, "ipAddress", ipAddress);
|
|
||||||
field_to_json(Obj, "macAddress", macAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPReservation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "nickname", nickname);
|
|
||||||
field_from_json(Obj, "ipAddress", ipAddress);
|
|
||||||
field_from_json(Obj, "macAddress", macAddress);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IPReservationList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "id", id);
|
|
||||||
field_to_json(Obj, "reservations", reservations);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IPReservationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "id", id);
|
|
||||||
field_from_json(Obj, "reservations", reservations);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DnsConfiguration::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "ISP", ISP);
|
|
||||||
field_to_json(Obj, "custom", custom);
|
|
||||||
field_to_json(Obj, "primary", primary);
|
|
||||||
field_to_json(Obj, "secondary", secondary);
|
|
||||||
field_to_json(Obj, "primaryV6", primaryV6);
|
|
||||||
field_to_json(Obj, "secondaryV6", secondaryV6);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DnsConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "ISP", ISP);
|
|
||||||
field_from_json(Obj, "custom", custom);
|
|
||||||
field_from_json(Obj, "primary", primary);
|
|
||||||
field_from_json(Obj, "secondary", secondary);
|
|
||||||
field_from_json(Obj, "primaryV6", primaryV6);
|
|
||||||
field_from_json(Obj, "secondaryV6", secondaryV6);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InternetConnection::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "type", type);
|
|
||||||
field_to_json(Obj, "username", username);
|
|
||||||
field_to_json(Obj, "password", password);
|
|
||||||
field_to_json(Obj, "ipAddress", ipAddress);
|
|
||||||
field_to_json(Obj, "subnetMask", subnetMask);
|
|
||||||
field_to_json(Obj, "defaultGateway", defaultGateway);
|
|
||||||
field_to_json(Obj, "sendHostname", sendHostname);
|
|
||||||
field_to_json(Obj, "primaryDns", primaryDns);
|
|
||||||
field_to_json(Obj, "secondaryDns", secondaryDns);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
field_to_json(Obj, "ipV6Support", ipV6Support);
|
|
||||||
field_to_json(Obj, "ipAddressV6", ipAddressV6);
|
|
||||||
field_to_json(Obj, "subnetMaskV6", subnetMaskV6);
|
|
||||||
field_to_json(Obj, "defaultGatewayV6", defaultGatewayV6);
|
|
||||||
field_to_json(Obj, "primaryDnsV6", primaryDnsV6);
|
|
||||||
field_to_json(Obj, "secondaryDnsV6", secondaryDnsV6);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InternetConnection::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "type", type);
|
|
||||||
field_from_json(Obj, "username", username);
|
|
||||||
field_from_json(Obj, "password", password);
|
|
||||||
field_from_json(Obj, "ipAddress", ipAddress);
|
|
||||||
field_from_json(Obj, "subnetMask", subnetMask);
|
|
||||||
field_from_json(Obj, "defaultGateway", defaultGateway);
|
|
||||||
field_from_json(Obj, "sendHostname", sendHostname);
|
|
||||||
field_from_json(Obj, "primaryDns", primaryDns);
|
|
||||||
field_from_json(Obj, "secondaryDns", secondaryDns);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
field_from_json(Obj, "ipV6Support", ipV6Support);
|
|
||||||
field_from_json(Obj, "ipAddressV6", ipAddressV6);
|
|
||||||
field_from_json(Obj, "subnetMaskV6", subnetMaskV6);
|
|
||||||
field_from_json(Obj, "defaultGatewayV6", defaultGatewayV6);
|
|
||||||
field_from_json(Obj, "primaryDnsV6", primaryDnsV6);
|
|
||||||
field_from_json(Obj, "secondaryDnsV6", secondaryDnsV6);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WifiNetwork::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "type", type);
|
|
||||||
field_to_json(Obj, "name", name);
|
|
||||||
field_to_json(Obj, "password", password);
|
|
||||||
field_to_json(Obj, "encryption", encryption);
|
|
||||||
field_to_json(Obj, "bands", bands);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WifiNetwork::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "type", type);
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
field_from_json(Obj, "password", password);
|
|
||||||
field_from_json(Obj, "encryption", encryption);
|
|
||||||
field_from_json(Obj, "bands", bands);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WifiNetworkList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "wifiNetworks", wifiNetworks);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WifiNetworkList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "wifiNetworks", wifiNetworks);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AccessTime::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "day", day);
|
|
||||||
field_to_json(Obj, "rangeList", rangeList);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AccessTime::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "day", day);
|
|
||||||
field_from_json(Obj, "rangeList", rangeList);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AccessTimes::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "schedule", schedule);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AccessTimes::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "schedule", schedule);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubscriberDevice::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "name", name);
|
|
||||||
field_to_json(Obj, "description", description);
|
|
||||||
field_to_json(Obj, "macAddress", macAddress);
|
|
||||||
field_to_json(Obj, "manufacturer", manufacturer);
|
|
||||||
field_to_json(Obj, "firstContact", firstContact);
|
|
||||||
field_to_json(Obj, "lastContact", lastContact);
|
|
||||||
field_to_json(Obj, "group", group);
|
|
||||||
field_to_json(Obj, "icon", icon);
|
|
||||||
field_to_json(Obj, "suspended", suspended);
|
|
||||||
field_to_json(Obj, "ip", ip);
|
|
||||||
field_to_json(Obj, "schedule", schedule);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubscriberDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
field_from_json(Obj, "description", description);
|
|
||||||
field_from_json(Obj, "macAddress", macAddress);
|
|
||||||
field_from_json(Obj, "manufacturer", manufacturer);
|
|
||||||
field_from_json(Obj, "firstContact", firstContact);
|
|
||||||
field_from_json(Obj, "lastContact", lastContact);
|
|
||||||
field_from_json(Obj, "group", group);
|
|
||||||
field_from_json(Obj, "icon", icon);
|
|
||||||
field_from_json(Obj, "suspended", suspended);
|
|
||||||
field_from_json(Obj, "ip", ip);
|
|
||||||
field_from_json(Obj, "schedule", schedule);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubscriberDeviceList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "devices", devices);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubscriberDeviceList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "devices", devices);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Association::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "name", name);
|
|
||||||
field_to_json(Obj, "ssid", ssid);
|
|
||||||
field_to_json(Obj, "macAddress", macAddress);
|
|
||||||
field_to_json(Obj, "rssi", rssi);
|
|
||||||
field_to_json(Obj, "power", power);
|
|
||||||
field_to_json(Obj, "ipv4", ipv4);
|
|
||||||
field_to_json(Obj, "ipv6", ipv6);
|
|
||||||
field_to_json(Obj, "tx", tx);
|
|
||||||
field_to_json(Obj, "rx", rx);
|
|
||||||
field_to_json(Obj, "manufacturer", manufacturer);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Association::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
field_from_json(Obj, "ssid", ssid);
|
|
||||||
field_from_json(Obj, "macAddress", macAddress);
|
|
||||||
field_from_json(Obj, "rssi", rssi);
|
|
||||||
field_from_json(Obj, "power", power);
|
|
||||||
field_from_json(Obj, "ipv4", ipv4);
|
|
||||||
field_from_json(Obj, "ipv6", ipv6);
|
|
||||||
field_from_json(Obj, "tx", tx);
|
|
||||||
field_from_json(Obj, "rx", rx);
|
|
||||||
field_from_json(Obj, "manufacturer", manufacturer);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AssociationList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "associations", associations);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AssociationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "associations", associations);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "macAddress", macAddress);
|
|
||||||
field_to_json(Obj, "speed", speed);
|
|
||||||
field_to_json(Obj, "mode", mode);
|
|
||||||
field_to_json(Obj, "ipv4", ipv4);
|
|
||||||
field_to_json(Obj, "ipv6", ipv6);
|
|
||||||
field_to_json(Obj, "tx", tx);
|
|
||||||
field_to_json(Obj, "rx", rx);
|
|
||||||
field_to_json(Obj, "manufacturer", manufacturer);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Client::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "macAddress", macAddress);
|
|
||||||
field_from_json(Obj, "speed", speed);
|
|
||||||
field_from_json(Obj, "mode", mode);
|
|
||||||
field_from_json(Obj, "ipv4", ipv4);
|
|
||||||
field_from_json(Obj, "ipv6", ipv6);
|
|
||||||
field_from_json(Obj, "tx", tx);
|
|
||||||
field_from_json(Obj, "rx", rx);
|
|
||||||
field_from_json(Obj, "manufacturer", manufacturer);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "clients", clients);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ClientList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "clients", clients);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Location::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "buildingName", buildingName);
|
|
||||||
field_to_json(Obj, "addressLines", addressLines);
|
|
||||||
field_to_json(Obj, "city", city);
|
|
||||||
field_to_json(Obj, "state", state);
|
|
||||||
field_to_json(Obj, "postal", postal);
|
|
||||||
field_to_json(Obj, "country", country);
|
|
||||||
field_to_json(Obj, "phones", phones);
|
|
||||||
field_to_json(Obj, "mobiles", mobiles);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Location::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "buildingName", buildingName);
|
|
||||||
field_from_json(Obj, "addressLines", addressLines);
|
|
||||||
field_from_json(Obj, "city", city);
|
|
||||||
field_from_json(Obj, "state", state);
|
|
||||||
field_from_json(Obj, "postal", postal);
|
|
||||||
field_from_json(Obj, "country", country);
|
|
||||||
field_from_json(Obj, "phones", phones);
|
|
||||||
field_from_json(Obj, "mobiles", mobiles);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadioHE::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "multipleBSSID", multipleBSSID);
|
|
||||||
field_to_json(Obj, "ema", ema);
|
|
||||||
field_to_json(Obj, "bssColor", bssColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadioHE::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "multipleBSSID", multipleBSSID);
|
|
||||||
field_from_json(Obj, "ema", ema);
|
|
||||||
field_from_json(Obj, "bssColor", bssColor);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadioRates::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "beacon", beacon);
|
|
||||||
field_to_json(Obj, "multicast", multicast);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadioRates::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "beacon", beacon);
|
|
||||||
field_from_json(Obj, "multicast", multicast);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RadioInformation::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "band", band);
|
|
||||||
field_to_json(Obj, "bandwidth", bandwidth);
|
|
||||||
field_to_json(Obj, "channel", channel);
|
|
||||||
field_to_json(Obj, "country", country);
|
|
||||||
field_to_json(Obj, "channelMode", channelMode);
|
|
||||||
field_to_json(Obj, "channelWidth", channelWidth);
|
|
||||||
field_to_json(Obj, "requireMode", requireMode);
|
|
||||||
field_to_json(Obj, "txpower", txpower);
|
|
||||||
field_to_json(Obj, "legacyRates", legacyRates);
|
|
||||||
field_to_json(Obj, "beaconInterval", beaconInterval);
|
|
||||||
field_to_json(Obj, "dtimPeriod", dtimPeriod);
|
|
||||||
field_to_json(Obj, "maximumClients", maximumClients);
|
|
||||||
field_to_json(Obj, "rates", rates);
|
|
||||||
field_to_json(Obj, "he", he);
|
|
||||||
field_to_json(Obj, "rawInfo", rawInfo);
|
|
||||||
field_to_json(Obj, "allowDFS", allowDFS);
|
|
||||||
field_to_json(Obj, "mimo", mimo);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RadioInformation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "band", band);
|
|
||||||
field_from_json(Obj, "bandwidth", bandwidth);
|
|
||||||
field_from_json(Obj, "channel", channel);
|
|
||||||
field_from_json(Obj, "country", country);
|
|
||||||
field_from_json(Obj, "channelMode", channelMode);
|
|
||||||
field_from_json(Obj, "channelWidth", channelWidth);
|
|
||||||
field_from_json(Obj, "requireMode", requireMode);
|
|
||||||
field_from_json(Obj, "txpower", txpower);
|
|
||||||
field_from_json(Obj, "legacyRates", legacyRates);
|
|
||||||
field_from_json(Obj, "beaconInterval", beaconInterval);
|
|
||||||
field_from_json(Obj, "dtimPeriod", dtimPeriod);
|
|
||||||
field_from_json(Obj, "maximumClients", maximumClients);
|
|
||||||
field_from_json(Obj, "rates", rates);
|
|
||||||
field_from_json(Obj, "he", he);
|
|
||||||
field_from_json(Obj, "rawInfo", rawInfo);
|
|
||||||
field_from_json(Obj, "allowDFS", allowDFS);
|
|
||||||
field_from_json(Obj, "mimo", mimo);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AccessPoint::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "id", id);
|
|
||||||
field_to_json(Obj, "macAddress", macAddress);
|
|
||||||
field_to_json(Obj, "serialNumber", serialNumber);
|
|
||||||
field_to_json(Obj, "name", name);
|
|
||||||
field_to_json(Obj, "deviceType", deviceType);
|
|
||||||
field_to_json(Obj, "subscriberDevices", subscriberDevices);
|
|
||||||
field_to_json(Obj, "ipReservations", ipReservations);
|
|
||||||
field_to_json(Obj, "address", address);
|
|
||||||
field_to_json(Obj, "wifiNetworks", wifiNetworks);
|
|
||||||
field_to_json(Obj, "internetConnection", internetConnection);
|
|
||||||
field_to_json(Obj, "deviceMode", deviceMode);
|
|
||||||
field_to_json(Obj, "dnsConfiguration", dnsConfiguration);
|
|
||||||
field_to_json(Obj, "radios", radios);
|
|
||||||
field_to_json(Obj, "automaticUpgrade", automaticUpgrade);
|
|
||||||
field_to_json(Obj, "configurationUUID", configurationUUID);
|
|
||||||
field_to_json(Obj, "currentFirmware", currentFirmware);
|
|
||||||
field_to_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
|
||||||
field_to_json(Obj, "latestFirmware", latestFirmware);
|
|
||||||
field_to_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
|
||||||
field_to_json(Obj, "newFirmwareAvailable", newFirmwareAvailable);
|
|
||||||
field_to_json(Obj, "latestFirmwareURI", latestFirmwareURI);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AccessPoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "id", id);
|
|
||||||
field_from_json(Obj, "macAddress", macAddress);
|
|
||||||
field_from_json(Obj, "serialNumber", serialNumber);
|
|
||||||
field_from_json(Obj, "name", name);
|
|
||||||
field_from_json(Obj, "deviceType", deviceType);
|
|
||||||
field_from_json(Obj, "subscriberDevices", subscriberDevices);
|
|
||||||
field_from_json(Obj, "ipReservations", ipReservations);
|
|
||||||
field_from_json(Obj, "address", address);
|
|
||||||
field_from_json(Obj, "wifiNetworks", wifiNetworks);
|
|
||||||
field_from_json(Obj, "internetConnection", internetConnection);
|
|
||||||
field_from_json(Obj, "deviceMode", deviceMode);
|
|
||||||
field_from_json(Obj, "dnsConfiguration", dnsConfiguration);
|
|
||||||
field_from_json(Obj, "radios", radios);
|
|
||||||
field_from_json(Obj, "automaticUpgrade", automaticUpgrade);
|
|
||||||
field_from_json(Obj, "configurationUUID", configurationUUID);
|
|
||||||
field_from_json(Obj, "currentFirmware", currentFirmware);
|
|
||||||
field_from_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
|
||||||
field_from_json(Obj, "latestFirmware", latestFirmware);
|
|
||||||
field_from_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
|
||||||
field_from_json(Obj, "newFirmwareAvailable", newFirmwareAvailable);
|
|
||||||
field_from_json(Obj, "latestFirmwareURI", latestFirmwareURI);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AccessPointList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "list", list);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AccessPointList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "list", list);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubscriberInfo::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "id", id);
|
|
||||||
field_to_json(Obj, "userId", userId);
|
|
||||||
field_to_json(Obj, "firstName", firstName);
|
|
||||||
field_to_json(Obj, "initials", initials);
|
|
||||||
field_to_json(Obj, "lastName", lastName);
|
|
||||||
field_to_json(Obj, "phoneNumber", phoneNumber);
|
|
||||||
field_to_json(Obj, "secondaryEmail", secondaryEmail);
|
|
||||||
field_to_json(Obj, "accessPoints", accessPoints);
|
|
||||||
field_to_json(Obj, "serviceAddress", serviceAddress);
|
|
||||||
field_to_json(Obj, "billingAddress", billingAddress);
|
|
||||||
field_to_json(Obj, "created", created);
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SubscriberInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "id", id);
|
|
||||||
field_from_json(Obj, "userId", userId);
|
|
||||||
field_from_json(Obj, "firstName", firstName);
|
|
||||||
field_from_json(Obj, "initials", initials);
|
|
||||||
field_from_json(Obj, "lastName", lastName);
|
|
||||||
field_from_json(Obj, "phoneNumber", phoneNumber);
|
|
||||||
field_from_json(Obj, "secondaryEmail", secondaryEmail);
|
|
||||||
field_from_json(Obj, "accessPoints", accessPoints);
|
|
||||||
field_from_json(Obj, "serviceAddress", serviceAddress);
|
|
||||||
field_from_json(Obj, "billingAddress", billingAddress);
|
|
||||||
field_from_json(Obj, "created", created);
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StatsEntry::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "timestamp", timestamp);
|
|
||||||
field_to_json(Obj, "tx", tx);
|
|
||||||
field_to_json(Obj, "rx", rx);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StatsEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "timestamp", timestamp);
|
|
||||||
field_from_json(Obj, "tx", tx);
|
|
||||||
field_from_json(Obj, "rx", rx);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StatsBlock::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
field_to_json(Obj, "modified", modified);
|
|
||||||
field_to_json(Obj, "external", external);
|
|
||||||
field_to_json(Obj, "internal", internal);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StatsBlock::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "modified", modified);
|
|
||||||
field_from_json(Obj, "external", external);
|
|
||||||
field_from_json(Obj, "internal", internal);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,322 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-10-27.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef OWSUB_RESTAPI_SUBOBJECTS_H
|
|
||||||
#define OWSUB_RESTAPI_SUBOBJECTS_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "Poco/JSON/Object.h"
|
|
||||||
|
|
||||||
namespace OpenWifi::SubObjects {
|
|
||||||
|
|
||||||
struct HomeDeviceMode {
|
|
||||||
bool enableLEDS = true;
|
|
||||||
std::string type; // bridge, manual, automatic
|
|
||||||
std::string subnet;
|
|
||||||
std::string subnetMask;
|
|
||||||
std::string startIP;
|
|
||||||
std::string endIP;
|
|
||||||
uint64_t created = 0 ;
|
|
||||||
uint64_t modified = 0 ;
|
|
||||||
std::string subnetV6;
|
|
||||||
int subnetMaskV6=0;
|
|
||||||
std::string startIPV6;
|
|
||||||
std::string endIPV6;
|
|
||||||
std::string leaseTime;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct IPReservation {
|
|
||||||
std::string nickname;
|
|
||||||
std::string ipAddress;
|
|
||||||
std::string macAddress;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct IPReservationList {
|
|
||||||
std::string id;
|
|
||||||
std::vector<IPReservation> reservations;
|
|
||||||
uint64_t created = 0 ;
|
|
||||||
uint64_t modified = 0 ;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DnsConfiguration {
|
|
||||||
bool ISP=false;
|
|
||||||
bool custom=false;
|
|
||||||
std::string primary;
|
|
||||||
std::string secondary;
|
|
||||||
std::string primaryV6;
|
|
||||||
std::string secondaryV6;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct InternetConnection {
|
|
||||||
std::string type; // automatic, pppoe, manual
|
|
||||||
std::string username;
|
|
||||||
std::string password;
|
|
||||||
std::string ipAddress;
|
|
||||||
std::string subnetMask;
|
|
||||||
std::string defaultGateway;
|
|
||||||
bool sendHostname = true;
|
|
||||||
std::string primaryDns;
|
|
||||||
std::string secondaryDns;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t modified=0;
|
|
||||||
bool ipV6Support=false;
|
|
||||||
std::string ipAddressV6;
|
|
||||||
int subnetMaskV6=0;
|
|
||||||
std::string defaultGatewayV6;
|
|
||||||
std::string primaryDnsV6;
|
|
||||||
std::string secondaryDnsV6;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WifiNetwork {
|
|
||||||
std::string type; // main, guest
|
|
||||||
std::string name;
|
|
||||||
std::string password;
|
|
||||||
std::string encryption;
|
|
||||||
std::vector<std::string> bands;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WifiNetworkList {
|
|
||||||
std::vector<WifiNetwork> wifiNetworks;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t modified=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AccessTime {
|
|
||||||
std::string day;
|
|
||||||
std::vector<std::string> rangeList;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AccessTimes {
|
|
||||||
std::vector<AccessTime> schedule;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t modified=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubscriberDevice {
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
std::string macAddress;
|
|
||||||
std::string manufacturer;
|
|
||||||
uint64_t firstContact=0;
|
|
||||||
uint64_t lastContact=0;
|
|
||||||
std::string group;
|
|
||||||
std::string icon;
|
|
||||||
bool suspended=false;
|
|
||||||
std::string ip;
|
|
||||||
std::vector<AccessTimes> schedule;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubscriberDeviceList {
|
|
||||||
std::vector<SubscriberDevice> devices;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t modified=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Association {
|
|
||||||
std::string name;
|
|
||||||
std::string ssid;
|
|
||||||
std::string macAddress;
|
|
||||||
int rssi=0;
|
|
||||||
int power=0;
|
|
||||||
std::string ipv4;
|
|
||||||
std::string ipv6;
|
|
||||||
uint64_t tx=0;
|
|
||||||
uint64_t rx=0;
|
|
||||||
std::string manufacturer;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AssociationList {
|
|
||||||
std::vector<Association> associations;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t modified=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Client {
|
|
||||||
std::string macAddress;
|
|
||||||
std::string speed;
|
|
||||||
std::string mode;
|
|
||||||
std::string ipv4;
|
|
||||||
std::string ipv6;
|
|
||||||
uint64_t tx=0;
|
|
||||||
uint64_t rx=0;
|
|
||||||
std::string manufacturer;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ClientList {
|
|
||||||
std::vector<Client> clients;
|
|
||||||
uint64_t created=0;
|
|
||||||
uint64_t modified=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Location {
|
|
||||||
std::string buildingName;
|
|
||||||
std::vector<std::string> addressLines;
|
|
||||||
std::string city;
|
|
||||||
std::string state;
|
|
||||||
std::string postal;
|
|
||||||
std::string country;
|
|
||||||
std::vector<std::string> phones;
|
|
||||||
std::vector<std::string> mobiles;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadioHE {
|
|
||||||
bool multipleBSSID = false;
|
|
||||||
bool ema = false;
|
|
||||||
uint64_t bssColor = 64;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadioRates {
|
|
||||||
uint64_t beacon = 6000;
|
|
||||||
uint64_t multicast = 24000;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RadioInformation {
|
|
||||||
std::string band;
|
|
||||||
uint64_t bandwidth;
|
|
||||||
uint64_t channel = 0 ;
|
|
||||||
std::string country;
|
|
||||||
std::string channelMode{"HE"};
|
|
||||||
uint64_t channelWidth = 80;
|
|
||||||
std::string requireMode;
|
|
||||||
uint64_t txpower=0;
|
|
||||||
bool legacyRates = false;
|
|
||||||
uint64_t beaconInterval = 100;
|
|
||||||
uint64_t dtimPeriod = 2;
|
|
||||||
uint64_t maximumClients = 64;
|
|
||||||
RadioRates rates;
|
|
||||||
RadioHE he;
|
|
||||||
bool allowDFS=false;
|
|
||||||
std::string mimo;
|
|
||||||
std::vector<std::string> rawInfo;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AccessPoint {
|
|
||||||
std::string id;
|
|
||||||
std::string macAddress;
|
|
||||||
std::string serialNumber;
|
|
||||||
std::string name;
|
|
||||||
std::string deviceType;
|
|
||||||
SubscriberDeviceList subscriberDevices;
|
|
||||||
IPReservationList ipReservations;
|
|
||||||
Location address;
|
|
||||||
WifiNetworkList wifiNetworks;
|
|
||||||
InternetConnection internetConnection;
|
|
||||||
HomeDeviceMode deviceMode;
|
|
||||||
DnsConfiguration dnsConfiguration;
|
|
||||||
std::vector<RadioInformation> radios;
|
|
||||||
bool automaticUpgrade = true;
|
|
||||||
std::string configurationUUID;
|
|
||||||
std::string currentFirmware;
|
|
||||||
uint64_t currentFirmwareDate;
|
|
||||||
std::string latestFirmware;
|
|
||||||
uint64_t latestFirmwareDate;
|
|
||||||
bool newFirmwareAvailable;
|
|
||||||
std::string latestFirmwareURI;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct AccessPointList {
|
|
||||||
std::vector<AccessPoint> list;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubscriberInfo {
|
|
||||||
std::string id;
|
|
||||||
std::string userId;
|
|
||||||
std::string firstName;
|
|
||||||
std::string initials;
|
|
||||||
std::string lastName;
|
|
||||||
std::string phoneNumber;
|
|
||||||
std::string secondaryEmail;
|
|
||||||
AccessPointList accessPoints;
|
|
||||||
Location serviceAddress;
|
|
||||||
Location billingAddress;
|
|
||||||
uint64_t created = 0;
|
|
||||||
uint64_t modified = 0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct StatsEntry {
|
|
||||||
uint64_t timestamp=0;
|
|
||||||
uint64_t tx=0;
|
|
||||||
uint64_t rx=0;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct StatsBlock {
|
|
||||||
uint64_t modified=0;
|
|
||||||
std::vector<StatsEntry> external, internal;
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //OWSUB_RESTAPI_SUBOBJECTS_H
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
namespace OpenWifi::SDK::GW {
|
namespace OpenWifi::SDK::GW {
|
||||||
|
|
||||||
bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, [[maybe_unused]] uint64_t When ) {
|
bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, uint64_t When ) {
|
||||||
Types::StringPairVec QueryData;
|
Types::StringPairVec QueryData;
|
||||||
Poco::JSON::Object Body;
|
Poco::JSON::Object Body;
|
||||||
|
|
||||||
|
|||||||
@@ -13,22 +13,18 @@ namespace OpenWifi {
|
|||||||
int Storage::Start() {
|
int Storage::Start() {
|
||||||
std::lock_guard Guard(Mutex_);
|
std::lock_guard Guard(Mutex_);
|
||||||
|
|
||||||
|
Logger_.setLevel(Poco::Message::PRIO_NOTICE);
|
||||||
|
|
||||||
StorageClass::Start();
|
StorageClass::Start();
|
||||||
|
|
||||||
HistoryDB_ = std::make_unique<OpenWifi::HistoryDB>(dbType_,*Pool_, Logger());
|
Create_Tables();
|
||||||
FirmwaresDB_ = std::make_unique<OpenWifi::FirmwaresDB>(dbType_,*Pool_, Logger());
|
|
||||||
DevicesDB_ = std::make_unique<OpenWifi::DevicesDB>(dbType_,*Pool_, Logger());
|
|
||||||
|
|
||||||
HistoryDB_->Create();
|
|
||||||
FirmwaresDB_->Create();
|
|
||||||
DevicesDB_->Create();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Storage::Stop() {
|
void Storage::Stop() {
|
||||||
std::lock_guard Guard(Mutex_);
|
std::lock_guard Guard(Mutex_);
|
||||||
Logger().notice("Stopping.");
|
Logger_.notice("Stopping.");
|
||||||
StorageClass::Stop();
|
StorageClass::Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,43 +13,61 @@
|
|||||||
#include "framework/StorageClass.h"
|
#include "framework/StorageClass.h"
|
||||||
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
|
#include "storage/storage_firmwares.h"
|
||||||
#include "storage/orm_history.h"
|
#include "storage/storage_history.h"
|
||||||
#include "storage/orm_firmwares.h"
|
#include "storage/storage_deviceTypes.h"
|
||||||
#include "storage/orm_deviceInfo.h"
|
#include "storage/storage_deviceInfo.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
class Storage : public StorageClass {
|
class Storage : public StorageClass {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
int Start() override;
|
|
||||||
void Stop() override;
|
|
||||||
|
|
||||||
int Create_Tables();
|
int Create_Tables();
|
||||||
|
int Create_Firmwares();
|
||||||
|
int Create_History();
|
||||||
int Create_DeviceTypes();
|
int Create_DeviceTypes();
|
||||||
int Create_DeviceInfo();
|
int Create_DeviceInfo();
|
||||||
|
|
||||||
|
bool AddFirmware(FMSObjects::Firmware & F);
|
||||||
|
bool UpdateFirmware(std::string & UUID, FMSObjects::Firmware & C);
|
||||||
|
bool DeleteFirmware(std::string & UUID);
|
||||||
|
bool GetFirmware(std::string & UUID, FMSObjects::Firmware & C);
|
||||||
|
bool GetFirmwares(uint64_t From, uint64_t HowMany, std::string & Compatible, FMSObjects::FirmwareVec & Firmwares);
|
||||||
bool BuildFirmwareManifest(Poco::JSON::Object & Manifest, uint64_t & Version);
|
bool BuildFirmwareManifest(Poco::JSON::Object & Manifest, uint64_t & Version);
|
||||||
|
bool GetFirmwareByName(std::string & Release, std::string &DeviceType,FMSObjects::Firmware & C );
|
||||||
|
bool GetFirmwareByRevision(std::string & Revision, std::string &DeviceType,FMSObjects::Firmware & C );
|
||||||
|
bool ComputeFirmwareAge(std::string & DeviceType, std::string & Revision, FMSObjects::FirmwareAgeDetails &AgeDetails);
|
||||||
|
|
||||||
|
bool GetHistory(std::string &SerialNumber,uint64_t From, uint64_t HowMany,FMSObjects::RevisionHistoryEntryVec &History);
|
||||||
|
bool AddHistory(FMSObjects::RevisionHistoryEntry &History);
|
||||||
|
|
||||||
|
void PopulateLatestFirmwareCache();
|
||||||
|
void RemoveOldFirmware();
|
||||||
|
|
||||||
|
int Start() override;
|
||||||
|
void Stop() override;
|
||||||
|
|
||||||
|
bool SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint);
|
||||||
|
bool AddHistory( std::string & SerialNumber, std::string &DeviceType, std::string & PreviousRevision, std::string & NewVersion);
|
||||||
|
bool DeleteHistory( std::string & SerialNumber, std::string &Id);
|
||||||
|
|
||||||
|
bool GetDevices(uint64_t From, uint64_t HowMany, std::vector<FMSObjects::DeviceConnectionInformation> & Devices);
|
||||||
|
bool GetDevice(std::string &SerialNumber, FMSObjects::DeviceConnectionInformation & Device);
|
||||||
|
bool SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint);
|
||||||
|
|
||||||
|
bool GenerateDeviceReport(FMSObjects::DeviceReport &Report);
|
||||||
static std::string TrimRevision(const std::string &R);
|
static std::string TrimRevision(const std::string &R);
|
||||||
static auto instance() {
|
static Storage *instance() {
|
||||||
static auto instance_ = new Storage;
|
static Storage *instance_ = new Storage;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
OpenWifi::HistoryDB & HistoryDB() { return * HistoryDB_; }
|
|
||||||
OpenWifi::FirmwaresDB & FirmwaresDB() { return * FirmwaresDB_; }
|
|
||||||
OpenWifi::DevicesDB & DevicesDB() { return * DevicesDB_; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::unique_ptr<OpenWifi::HistoryDB> HistoryDB_;
|
|
||||||
std::unique_ptr<OpenWifi::FirmwaresDB> FirmwaresDB_;
|
|
||||||
std::unique_ptr<OpenWifi::DevicesDB> DevicesDB_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto StorageService() { return Storage::instance(); };
|
inline class Storage * StorageService() { return Storage::instance(); };
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-11-30.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include "Poco/JSON/Parser.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
inline void API_Proxy( Poco::Logger &Logger,
|
|
||||||
Poco::Net::HTTPServerRequest *Request,
|
|
||||||
Poco::Net::HTTPServerResponse *Response,
|
|
||||||
const char * ServiceType,
|
|
||||||
const char * PathRewrite,
|
|
||||||
uint64_t msTimeout_ = 10000 ) {
|
|
||||||
try {
|
|
||||||
auto Services = MicroService::instance().GetServices(ServiceType);
|
|
||||||
for(auto const &Svc:Services) {
|
|
||||||
Poco::URI SourceURI(Request->getURI());
|
|
||||||
Poco::URI DestinationURI(Svc.PrivateEndPoint);
|
|
||||||
DestinationURI.setPath(PathRewrite);
|
|
||||||
DestinationURI.setQuery(SourceURI.getQuery());
|
|
||||||
|
|
||||||
// std::cout << " Source: " << SourceURI.toString() << std::endl;
|
|
||||||
// std::cout << "Destination: " << DestinationURI.toString() << std::endl;
|
|
||||||
|
|
||||||
Poco::Net::HTTPSClientSession Session(DestinationURI.getHost(), DestinationURI.getPort());
|
|
||||||
Session.setKeepAlive(true);
|
|
||||||
Session.setTimeout(Poco::Timespan(msTimeout_/1000, msTimeout_ % 1000));
|
|
||||||
Poco::Net::HTTPRequest ProxyRequest(Request->getMethod(),
|
|
||||||
DestinationURI.getPathAndQuery(),
|
|
||||||
Poco::Net::HTTPMessage::HTTP_1_1);
|
|
||||||
if(Request->has("Authorization")) {
|
|
||||||
ProxyRequest.add("Authorization", Request->get("Authorization"));
|
|
||||||
} else {
|
|
||||||
ProxyRequest.add("X-API-KEY", Svc.AccessKey);
|
|
||||||
ProxyRequest.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Request->getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
|
|
||||||
Session.sendRequest(ProxyRequest);
|
|
||||||
Poco::Net::HTTPResponse ProxyResponse;
|
|
||||||
Session.receiveResponse(ProxyResponse);
|
|
||||||
Response->setStatus(ProxyResponse.getStatus());
|
|
||||||
Response->send();
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
Poco::JSON::Parser P;
|
|
||||||
std::stringstream SS;
|
|
||||||
try {
|
|
||||||
auto Body = P.parse(Request->stream()).extract<Poco::JSON::Object::Ptr>();
|
|
||||||
Poco::JSON::Stringifier::condense(Body,SS);
|
|
||||||
SS << "\r\n\r\n";
|
|
||||||
} catch(const Poco::Exception &E) {
|
|
||||||
Logger.log(E);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(SS.str().empty()) {
|
|
||||||
Session.sendRequest(ProxyRequest);
|
|
||||||
} else {
|
|
||||||
ProxyRequest.setContentType("application/json");
|
|
||||||
ProxyRequest.setContentLength(SS.str().size());
|
|
||||||
std::ostream & os = Session.sendRequest(ProxyRequest);
|
|
||||||
os << SS.str() ;
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::Net::HTTPResponse ProxyResponse;
|
|
||||||
std::stringstream SSR;
|
|
||||||
try {
|
|
||||||
std::istream &ProxyResponseStream = Session.receiveResponse(ProxyResponse);
|
|
||||||
Poco::JSON::Parser P2;
|
|
||||||
auto ProxyResponseBody = P2.parse(ProxyResponseStream).extract<Poco::JSON::Object::Ptr>();
|
|
||||||
Poco::JSON::Stringifier::condense(ProxyResponseBody,SSR);
|
|
||||||
Response->setContentType("application/json");
|
|
||||||
Response->setContentLength(SSR.str().size());
|
|
||||||
Response->setStatus(ProxyResponse.getStatus());
|
|
||||||
Response->sendBuffer(SSR.str().c_str(),SSR.str().size());
|
|
||||||
return;
|
|
||||||
} catch( const Poco::Exception & E) {
|
|
||||||
|
|
||||||
}
|
|
||||||
Response->setStatus(ProxyResponse.getStatus());
|
|
||||||
Response->send();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger.log(E);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,8 @@
|
|||||||
// Created by stephane bourque on 2021-09-14.
|
// Created by stephane bourque on 2021-09-14.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef OWPROV_CONFIGURATIONVALIDATOR_H
|
||||||
|
#define OWPROV_CONFIGURATIONVALIDATOR_H
|
||||||
|
|
||||||
#include <nlohmann/json-schema.hpp>
|
#include <nlohmann/json-schema.hpp>
|
||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
@@ -14,8 +15,9 @@ namespace OpenWifi {
|
|||||||
class ConfigurationValidator : public SubSystemServer {
|
class ConfigurationValidator : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static auto instance() {
|
static ConfigurationValidator *instance() {
|
||||||
static auto instance_ = new ConfigurationValidator;
|
if(instance_== nullptr)
|
||||||
|
instance_ = new ConfigurationValidator;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,17 +28,19 @@ namespace OpenWifi {
|
|||||||
void reinitialize(Poco::Util::Application &self) override;
|
void reinitialize(Poco::Util::Application &self) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static ConfigurationValidator * instance_;
|
||||||
bool Initialized_=false;
|
bool Initialized_=false;
|
||||||
bool Working_=false;
|
bool Working_=false;
|
||||||
void Init();
|
void Init();
|
||||||
nlohmann::json RootSchema_;
|
std::unique_ptr<json_validator> Validator_=std::make_unique<json_validator>(nullptr, my_format_checker);
|
||||||
|
|
||||||
ConfigurationValidator():
|
ConfigurationValidator():
|
||||||
SubSystemServer("configvalidator", "CFG-VALIDATOR", "config.validator") {
|
SubSystemServer("configvalidator", "CFG-VALIDATOR", "config.validator") {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline auto ConfigurationValidator() { return ConfigurationValidator::instance(); }
|
inline ConfigurationValidator * ConfigurationValidator() { return ConfigurationValidator::instance(); }
|
||||||
inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); }
|
inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //OWPROV_CONFIGURATIONVALIDATOR_H
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
// Created by stephane bourque on 2021-10-08.
|
// Created by stephane bourque on 2021-10-08.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef OWPROV_COUNTRYCODES_H
|
||||||
|
#define OWPROV_COUNTRYCODES_H
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -269,3 +270,4 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //OWPROV_COUNTRYCODES_H
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
// Created by Stephane Bourque on 2021-03-04.
|
// Created by Stephane Bourque on 2021-03-04.
|
||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
#ifndef UCENTRALGW_KAFKA_TOPICS_H
|
||||||
#pragma once
|
#define UCENTRALGW_KAFKA_TOPICS_H
|
||||||
|
|
||||||
namespace OpenWifi::KafkaTopics {
|
namespace OpenWifi::KafkaTopics {
|
||||||
static const std::string HEALTHCHECK{"healthcheck"};
|
static const std::string HEALTHCHECK{"healthcheck"};
|
||||||
@@ -17,8 +17,6 @@ namespace OpenWifi::KafkaTopics {
|
|||||||
static const std::string COMMAND{"command"};
|
static const std::string COMMAND{"command"};
|
||||||
static const std::string SERVICE_EVENTS{"service_events"};
|
static const std::string SERVICE_EVENTS{"service_events"};
|
||||||
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
|
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
|
||||||
static const std::string DEVICE_TELEMETRY{"device_telemetry"};
|
|
||||||
static const std::string PROVISIONING_CHANGE{"provisioning_change"};
|
|
||||||
|
|
||||||
namespace ServiceEvents {
|
namespace ServiceEvents {
|
||||||
static const std::string EVENT_JOIN{"join"};
|
static const std::string EVENT_JOIN{"join"};
|
||||||
@@ -39,3 +37,4 @@ namespace OpenWifi::KafkaTopics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // UCENTRALGW_KAFKA_TOPICS_H
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,38 +1,42 @@
|
|||||||
//
|
//
|
||||||
// Created by stephane bourque on 2021-11-16.
|
// License type: BSD 3-Clause License
|
||||||
|
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||||
|
//
|
||||||
|
// Created by Stephane Bourque on 2021-03-04.
|
||||||
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef UCENTRALGW_UCENTRALTYPES_H
|
||||||
|
#define UCENTRALGW_UCENTRALTYPES_H
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <functional>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <queue>
|
#include <map>
|
||||||
|
#include <functional>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <set>
|
#include <utility>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
#include "Poco/StringTokenizer.h"
|
||||||
|
#include "Poco/JSON/Parser.h"
|
||||||
|
#include "Poco/JSON/Stringifier.h"
|
||||||
|
|
||||||
namespace OpenWifi::Types {
|
namespace OpenWifi::Types {
|
||||||
typedef std::pair<std::string,std::string> StringPair;
|
typedef std::pair<std::string,std::string> StringPair;
|
||||||
typedef std::vector<StringPair> StringPairVec;
|
typedef std::vector<StringPair> StringPairVec;
|
||||||
typedef std::queue<StringPair> StringPairQueue;
|
typedef std::queue<StringPair> StringPairQueue;
|
||||||
typedef std::vector<std::string> StringVec;
|
typedef std::vector<std::string> StringVec;
|
||||||
typedef std::set<std::string> StringSet;
|
typedef std::set<std::string> StringSet;
|
||||||
typedef std::map<std::string,std::set<std::string>> StringMapStringSet;
|
typedef std::map<std::string,std::set<std::string>> StringMapStringSet;
|
||||||
typedef std::function<void(const std::string &, const std::string &)> TopicNotifyFunction;
|
typedef std::function<void(std::string, std::string)> TopicNotifyFunction;
|
||||||
typedef std::list<std::pair<TopicNotifyFunction,int>> TopicNotifyFunctionList;
|
typedef std::list<std::pair<TopicNotifyFunction,int>> TopicNotifyFunctionList;
|
||||||
typedef std::map<std::string, TopicNotifyFunctionList> NotifyTable;
|
typedef std::map<std::string, TopicNotifyFunctionList> NotifyTable;
|
||||||
typedef std::map<std::string,uint64_t> CountedMap;
|
typedef std::map<std::string,uint64_t> CountedMap;
|
||||||
typedef std::vector<uint64_t> TagList;
|
typedef std::vector<uint64_t> TagList;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
inline void UpdateCountedMap(CountedMap &M, const std::string &S, uint64_t Increment=1) {
|
||||||
|
|
||||||
inline void UpdateCountedMap(OpenWifi::Types::CountedMap &M, const std::string &S, uint64_t Increment=1) {
|
|
||||||
auto it = M.find(S);
|
auto it = M.find(S);
|
||||||
if(it==M.end())
|
if(it==M.end())
|
||||||
M[S] = Increment;
|
M[S] = Increment;
|
||||||
@@ -40,21 +44,60 @@ namespace OpenWifi {
|
|||||||
it->second += Increment;
|
it->second += Increment;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void UpdateCountedMap(OpenWifi::Types::Counted3DMapSII &M, const std::string &S, uint32_t Index, uint64_t Increment=1) {
|
inline std::string to_string( const StringVec &V) {
|
||||||
auto it = M.find(S);
|
Poco::JSON::Array O;
|
||||||
if(it==M.end()) {
|
for(const auto &i:V) {
|
||||||
std::map<uint32_t,uint64_t> E;
|
O.add(i);
|
||||||
E[Index] = Increment;
|
|
||||||
M[S] = E;
|
|
||||||
}
|
}
|
||||||
else {
|
std::stringstream SS;
|
||||||
std::map<uint32_t,uint64_t> & IndexMap = it->second;
|
Poco::JSON::Stringifier::stringify(O,SS);
|
||||||
auto it_index = IndexMap.find(Index);
|
return SS.str();
|
||||||
if(it_index == IndexMap.end()) {
|
}
|
||||||
IndexMap[Index] = Increment;
|
|
||||||
} else {
|
inline std::string to_string( const StringPairVec &V) {
|
||||||
it_index->second += Increment;
|
Poco::JSON::Array O;
|
||||||
|
for(const auto &i:V) {
|
||||||
|
Poco::JSON::Array OO;
|
||||||
|
OO.add(i.first);
|
||||||
|
OO.add(i.second);
|
||||||
|
O.add(OO);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::stringstream SS;
|
||||||
|
Poco::JSON::Stringifier::stringify(O,SS);
|
||||||
|
return SS.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void from_string(const std::string &S, StringPairVec &V) {
|
||||||
|
try {
|
||||||
|
Poco::JSON::Parser P;
|
||||||
|
auto O = P.parse(S).extract<Poco::JSON::Array::Ptr>();
|
||||||
|
|
||||||
|
for(const auto &i:*O) {
|
||||||
|
auto Inner = i.extract<Poco::JSON::Array::Ptr>();
|
||||||
|
for(const auto &j:*Inner) {
|
||||||
|
auto S1 = i[0].toString();
|
||||||
|
auto S2 = i[1].toString();
|
||||||
|
V.push_back(std::make_pair(S1,S2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
inline void from_string(const std::string &S, StringVec &V) {
|
||||||
|
try {
|
||||||
|
Poco::JSON::Parser P;
|
||||||
|
auto O = P.parse(S).extract<Poco::JSON::Array::Ptr>();
|
||||||
|
|
||||||
|
for(auto const &i:*O) {
|
||||||
|
V.push_back(i.toString());
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // UCENTRALGW_UCENTRALTYPES_H
|
||||||
|
|||||||
65
src/framework/RESTAPI_errors.h
Normal file
65
src/framework/RESTAPI_errors.h
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-09-12.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OWPROV_RESTAPI_ERRORS_H
|
||||||
|
#define OWPROV_RESTAPI_ERRORS_H
|
||||||
|
|
||||||
|
namespace OpenWifi::RESTAPI::Errors {
|
||||||
|
static const std::string MissingUUID{"Missing UUID."};
|
||||||
|
static const std::string MissingSerialNumber{"Missing Serial Number."};
|
||||||
|
static const std::string InternalError{"Internal error. Please try later."};
|
||||||
|
static const std::string InvalidJSONDocument{"Invalid JSON document."};
|
||||||
|
static const std::string UnsupportedHTTPMethod{"Unsupported HTTP Method"};
|
||||||
|
static const std::string StillInUse{"Element still in use."};
|
||||||
|
static const std::string CouldNotBeDeleted{"Element could not be deleted."};
|
||||||
|
static const std::string NameMustBeSet{"The name property must be set."};
|
||||||
|
static const std::string ConfigBlockInvalid{"Configuration block type invalid."};
|
||||||
|
static const std::string UnknownId{"Unknown management policy."};
|
||||||
|
static const std::string InvalidDeviceTypes{"Unknown or invalid device type(s)."};
|
||||||
|
static const std::string RecordNotCreated{"Record could not be created."};
|
||||||
|
static const std::string RecordNotUpdated{"Record could not be updated."};
|
||||||
|
static const std::string UnknownManagementPolicyUUID{"Unknown management policy UUID."};
|
||||||
|
static const std::string CannotDeleteRoot{"Root Entity cannot be removed, only modified."};
|
||||||
|
static const std::string MustCreateRootFirst{"Root entity must be created first."};
|
||||||
|
static const std::string ParentUUIDMustExist{"Parent UUID must exist."};
|
||||||
|
static const std::string ConfigurationMustExist{"Configuration must exist."};
|
||||||
|
static const std::string MissingOrInvalidParameters{"Invalid or missing parameters."};
|
||||||
|
static const std::string UnknownSerialNumber{"Unknown Serial Number."};
|
||||||
|
static const std::string InvalidSerialNumber{"Invalid Serial Number."};
|
||||||
|
static const std::string SerialNumberExists{"Serial Number already exists."};
|
||||||
|
static const std::string ValidNonRootUUID{"Must be a non-root, and valid UUID."};
|
||||||
|
static const std::string VenueMustExist{"Venue does not exist."};
|
||||||
|
static const std::string NotBoth{"You cannot specify both Entity and Venue"};
|
||||||
|
static const std::string EntityMustExist{"Entity must exist."};
|
||||||
|
static const std::string ParentOrEntityMustBeSet{"Parent or Entity must be set."};
|
||||||
|
static const std::string ContactMustExist{"Contact must exist."};
|
||||||
|
static const std::string LocationMustExist{"Location must exist."};
|
||||||
|
static const std::string OnlyWSSupported{"This endpoint only supports WebSocket."};
|
||||||
|
static const std::string SerialNumberMismatch{"Serial Number mismatch."};
|
||||||
|
static const std::string InvalidCommand{"Invalid command."};
|
||||||
|
static const std::string NoRecordsDeleted{"No records deleted."};
|
||||||
|
static const std::string DeviceNotConnected{"Device is not currently connected."};
|
||||||
|
static const std::string CannotCreateWS{"Telemetry system could not create WS endpoint. Please try again."};
|
||||||
|
static const std::string BothDeviceTypeRevision{"Both deviceType and revision must be set."};
|
||||||
|
static const std::string IdOrSerialEmpty{"SerialNumber and Id must not be empty."};
|
||||||
|
static const std::string MissingUserID{"Missing user ID."};
|
||||||
|
static const std::string IdMustBe0{"To create a user, you must set the ID to 0"};
|
||||||
|
static const std::string InvalidUserRole{"Invalid userRole."};
|
||||||
|
static const std::string InvalidEmailAddress{"Invalid email address."};
|
||||||
|
static const std::string PasswordRejected{"Password was rejected. This maybe an old password."};
|
||||||
|
static const std::string InvalidIPRanges{"Invalid IP range specifications."};
|
||||||
|
static const std::string InvalidLOrderBy{"Invalid orderBy specification."};
|
||||||
|
static const std::string NeedMobileNumber{"You must provide at least one validated phone number."};
|
||||||
|
static const std::string BadMFAMethod{"MFA only supports sms or email."};
|
||||||
|
static const std::string InvalidCredentials{"Invalid credentials (username/password)."};
|
||||||
|
static const std::string InvalidPassword{"Password does not conform to basic password rules."};
|
||||||
|
static const std::string UserPendingVerification{"User access denied pending email verification."};
|
||||||
|
static const std::string PasswordMustBeChanged{"Password must be changed."};
|
||||||
|
static const std::string UnrecognizedRequest{"Ill-formed request. Please consult documentation."};
|
||||||
|
static const std::string MissingAuthenticationInformation{"Missing authentication information."};
|
||||||
|
static const std::string InsufficientAccessRights{"Insufficient access rights to complete the operation."};
|
||||||
|
static const std::string ExpiredToken{"Token has expired, user must login."};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //OWPROV_RESTAPI_ERRORS_H
|
||||||
140
src/framework/RESTAPI_protocol.h
Normal file
140
src/framework/RESTAPI_protocol.h
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
//
|
||||||
|
// License type: BSD 3-Clause License
|
||||||
|
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||||
|
//
|
||||||
|
// Created by Stephane Bourque on 2021-03-04.
|
||||||
|
// Arilia Wireless Inc.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALGW_RESTAPI_PROTOCOL_H
|
||||||
|
#define UCENTRALGW_RESTAPI_PROTOCOL_H
|
||||||
|
|
||||||
|
namespace OpenWifi::RESTAPI::Protocol {
|
||||||
|
static const char * CAPABILITIES = "capabilities";
|
||||||
|
static const char * LOGS = "logs";
|
||||||
|
static const char * HEALTHCHECKS = "healthchecks";
|
||||||
|
static const char * STATISTICS = "statistics";
|
||||||
|
static const char * STATUS = "status";
|
||||||
|
static const char * SERIALNUMBER = "serialNumber";
|
||||||
|
static const char * PERFORM = "perform";
|
||||||
|
static const char * CONFIGURE = "configure";
|
||||||
|
static const char * UPGRADE = "upgrade";
|
||||||
|
static const char * REBOOT = "reboot";
|
||||||
|
static const char * FACTORY = "factory";
|
||||||
|
static const char * LEDS = "leds";
|
||||||
|
static const char * TRACE = "trace";
|
||||||
|
static const char * REQUEST = "request";
|
||||||
|
static const char * WIFISCAN = "wifiscan";
|
||||||
|
static const char * EVENTQUEUE = "eventqueue";
|
||||||
|
static const char * RTTY = "rtty";
|
||||||
|
static const char * COMMAND = "command";
|
||||||
|
static const char * STARTDATE = "startDate";
|
||||||
|
static const char * ENDDATE = "endDate";
|
||||||
|
static const char * OFFSET = "offset";
|
||||||
|
static const char * LIMIT = "limit";
|
||||||
|
static const char * LIFETIME = "lifetime";
|
||||||
|
static const char * UUID = "UUID";
|
||||||
|
static const char * DATA = "data";
|
||||||
|
static const char * CONFIGURATION = "configuration";
|
||||||
|
static const char * WHEN = "when";
|
||||||
|
static const char * URI = "uri";
|
||||||
|
static const char * LOGTYPE = "logType";
|
||||||
|
static const char * VALUES = "values";
|
||||||
|
static const char * TYPES = "types";
|
||||||
|
static const char * PAYLOAD = "payload";
|
||||||
|
static const char * KEEPREDIRECTOR = "keepRedirector";
|
||||||
|
static const char * NETWORK = "network";
|
||||||
|
static const char * INTERFACE = "interface";
|
||||||
|
static const char * BANDS = "bands";
|
||||||
|
static const char * CHANNELS = "channels";
|
||||||
|
static const char * VERBOSE = "verbose";
|
||||||
|
static const char * MESSAGE = "message";
|
||||||
|
static const char * STATE = "state";
|
||||||
|
static const char * HEALTHCHECK = "healthcheck";
|
||||||
|
static const char * PCAP_FILE_TYPE = "pcap";
|
||||||
|
static const char * DURATION = "duration";
|
||||||
|
static const char * NUMBEROFPACKETS = "numberOfPackets";
|
||||||
|
static const char * FILTER = "filter";
|
||||||
|
static const char * SELECT = "select";
|
||||||
|
static const char * SERIALONLY = "serialOnly";
|
||||||
|
static const char * COUNTONLY = "countOnly";
|
||||||
|
static const char * DEVICEWITHSTATUS = "deviceWithStatus";
|
||||||
|
static const char * DEVICESWITHSTATUS = "devicesWithStatus";
|
||||||
|
static const char * DEVICES = "devices";
|
||||||
|
static const char * COUNT = "count";
|
||||||
|
static const char * SERIALNUMBERS = "serialNumbers";
|
||||||
|
static const char * CONFIGURATIONS = "configurations";
|
||||||
|
static const char * NAME = "name";
|
||||||
|
static const char * COMMANDS = "commands";
|
||||||
|
static const char * COMMANDUUID = "commandUUID";
|
||||||
|
static const char * FIRMWARES = "firmwares";
|
||||||
|
static const char * TOPIC = "topic";
|
||||||
|
static const char * HOST = "host";
|
||||||
|
static const char * OS = "os";
|
||||||
|
static const char * HOSTNAME = "hostname";
|
||||||
|
static const char * PROCESSORS = "processors";
|
||||||
|
static const char * REASON = "reason";
|
||||||
|
static const char * RELOAD = "reload";
|
||||||
|
static const char * SUBSYSTEMS = "subsystems";
|
||||||
|
static const char * FILEUUID = "uuid";
|
||||||
|
static const char * USERID = "userId";
|
||||||
|
static const char * PASSWORD = "password";
|
||||||
|
static const char * TOKEN = "token";
|
||||||
|
static const char * SETLOGLEVEL = "setloglevel";
|
||||||
|
static const char * GETLOGLEVELS = "getloglevels";
|
||||||
|
static const char * GETSUBSYSTEMNAMES = "getsubsystemnames";
|
||||||
|
static const char * GETLOGLEVELNAMES = "getloglevelnames";
|
||||||
|
static const char * STATS = "stats";
|
||||||
|
static const char * PARAMETERS = "parameters";
|
||||||
|
static const char * VALUE = "value";
|
||||||
|
static const char * LASTONLY = "lastOnly";
|
||||||
|
static const char * NEWEST = "newest";
|
||||||
|
static const char * ACTIVESCAN = "activeScan";
|
||||||
|
static const char * LIST = "list";
|
||||||
|
static const char * TAG = "tag";
|
||||||
|
static const char * TAGLIST = "tagList";
|
||||||
|
static const char * DESCRIPTION = "description";
|
||||||
|
static const char * NOTES = "notes";
|
||||||
|
static const char * DEVICETYPE = "deviceType";
|
||||||
|
static const char * REVISION = "revision";
|
||||||
|
static const char * AGES = "ages";
|
||||||
|
static const char * REVISIONS = "revisions";
|
||||||
|
static const char * DEVICETYPES = "deviceTypes";
|
||||||
|
static const char * LATESTONLY = "latestOnly";
|
||||||
|
static const char * IDONLY = "idOnly";
|
||||||
|
static const char * REVISIONSET = "revisionSet";
|
||||||
|
static const char * DEVICESET = "deviceSet";
|
||||||
|
static const char * HISTORY = "history";
|
||||||
|
static const char * ID = "id";
|
||||||
|
static const char * VERSION = "version";
|
||||||
|
static const char * TIMES = "times";
|
||||||
|
static const char * UPTIME = "uptime";
|
||||||
|
static const char * START = "start";
|
||||||
|
|
||||||
|
static const char * NEWPASSWORD = "newPassword";
|
||||||
|
static const char * USERS = "users";
|
||||||
|
static const char * WITHEXTENDEDINFO = "withExtendedInfo";
|
||||||
|
|
||||||
|
static const char * ERRORTEXT = "errorText";
|
||||||
|
static const char * ERRORCODE = "errorCode";
|
||||||
|
static const char * AVATARID = "avatarId";
|
||||||
|
static const char * UNNAMED = "(unnamed)";
|
||||||
|
static const char * UNSPECIFIED = "(unspecified)";
|
||||||
|
static const char * CONTENTDISPOSITION = "Content-Disposition";
|
||||||
|
static const char * CONTENTTYPE = "Content-Type";
|
||||||
|
|
||||||
|
static const char * REQUIREMENTS = "requirements";
|
||||||
|
static const char * PASSWORDPATTERN = "passwordPattern";
|
||||||
|
static const char * ACCESSPOLICY = "accessPolicy";
|
||||||
|
static const char * PASSWORDPOLICY = "passwordPolicy";
|
||||||
|
static const char * FORGOTPASSWORD = "forgotPassword";
|
||||||
|
static const char * RESENDMFACODE = "resendMFACode";
|
||||||
|
static const char * COMPLETEMFACHALLENGE = "completeMFAChallenge";
|
||||||
|
static const char * ME = "me";
|
||||||
|
static const char * TELEMETRY = "telemetry";
|
||||||
|
static const char * INTERVAL = "interval";
|
||||||
|
static const char * UI = "UI";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // UCENTRALGW_RESTAPI_PROTOCOL_H
|
||||||
@@ -33,8 +33,8 @@ namespace OpenWifi {
|
|||||||
int Start() override {
|
int Start() override {
|
||||||
std::lock_guard Guard(Mutex_);
|
std::lock_guard Guard(Mutex_);
|
||||||
|
|
||||||
Logger().setLevel(Poco::Message::PRIO_INFORMATION);
|
Logger_.setLevel(Poco::Message::PRIO_NOTICE);
|
||||||
Logger().notice("Starting.");
|
Logger_.notice("Starting.");
|
||||||
std::string DBType = MicroService::instance().ConfigGetString("storage.type");
|
std::string DBType = MicroService::instance().ConfigGetString("storage.type");
|
||||||
|
|
||||||
if (DBType == "sqlite") {
|
if (DBType == "sqlite") {
|
||||||
@@ -51,14 +51,44 @@ namespace OpenWifi {
|
|||||||
Pool_->shutdown();
|
Pool_->shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
DBType Type() const { return dbType_; };
|
[[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) {
|
||||||
|
if(dbType_==sqlite) {
|
||||||
|
return " LIMIT " + std::to_string(From) + ", " + std::to_string(HowMany) + " ";
|
||||||
|
} else if(dbType_==pgsql) {
|
||||||
|
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
|
||||||
|
} else if(dbType_==mysql) {
|
||||||
|
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
|
||||||
|
}
|
||||||
|
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string ConvertParams(const std::string & S) const {
|
||||||
|
std::string R;
|
||||||
|
R.reserve(S.size()*2+1);
|
||||||
|
if(dbType_==pgsql) {
|
||||||
|
auto Idx=1;
|
||||||
|
for(auto const & i:S)
|
||||||
|
{
|
||||||
|
if(i=='?') {
|
||||||
|
R += '$';
|
||||||
|
R.append(std::to_string(Idx++));
|
||||||
|
} else {
|
||||||
|
R += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
R = S;
|
||||||
|
}
|
||||||
|
return R;
|
||||||
|
}
|
||||||
|
|
||||||
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_;
|
Poco::SharedPtr<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_;
|
||||||
@@ -71,25 +101,21 @@ namespace OpenWifi {
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
inline int StorageClass::Setup_SQLite() {
|
inline int StorageClass::Setup_SQLite() {
|
||||||
Logger().notice("SQLite StorageClass enabled.");
|
Logger_.notice("SQLite StorageClass enabled.");
|
||||||
dbType_ = sqlite;
|
dbType_ = sqlite;
|
||||||
auto DBName = MicroService::instance().DataDir() + "/" + MicroService::instance().ConfigGetString("storage.type.sqlite.db");
|
auto DBName = MicroService::instance().DataDir() + "/" + MicroService::instance().ConfigGetString("storage.type.sqlite.db");
|
||||||
int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64);
|
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64);
|
||||||
int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60);
|
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60);
|
||||||
|
SQLiteConn_.registerConnector();
|
||||||
Poco::Data::SQLite::Connector::registerConnector();
|
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 4, NumSessions, IdleTime));
|
||||||
// Pool_ = std::make_unique<Poco::Data::SessionPool>(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8,
|
|
||||||
// (int)NumSessions, (int)IdleTime));
|
|
||||||
Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_.name(), DBName, 8,
|
|
||||||
(int)NumSessions, (int)IdleTime);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int StorageClass::Setup_MySQL() {
|
inline int StorageClass::Setup_MySQL() {
|
||||||
Logger().notice("MySQL StorageClass enabled.");
|
Logger_.notice("MySQL StorageClass enabled.");
|
||||||
dbType_ = mysql;
|
dbType_ = mysql;
|
||||||
int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.mysql.maxsessions", 64);
|
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.mysql.maxsessions", 64);
|
||||||
int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.mysql.idletime", 60);
|
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.mysql.idletime", 60);
|
||||||
auto Host = MicroService::instance().ConfigGetString("storage.type.mysql.host");
|
auto Host = MicroService::instance().ConfigGetString("storage.type.mysql.host");
|
||||||
auto Username = MicroService::instance().ConfigGetString("storage.type.mysql.username");
|
auto Username = MicroService::instance().ConfigGetString("storage.type.mysql.username");
|
||||||
auto Password = MicroService::instance().ConfigGetString("storage.type.mysql.password");
|
auto Password = MicroService::instance().ConfigGetString("storage.type.mysql.password");
|
||||||
@@ -104,17 +130,17 @@ namespace OpenWifi {
|
|||||||
";port=" + Port +
|
";port=" + Port +
|
||||||
";compress=true;auto-reconnect=true";
|
";compress=true;auto-reconnect=true";
|
||||||
|
|
||||||
Poco::Data::MySQL::Connector::registerConnector();
|
MySQLConn_.registerConnector();
|
||||||
Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_.name(), ConnectionStr, 8, NumSessions, IdleTime);
|
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(MySQLConn_.name(), ConnectionStr, 4, NumSessions, IdleTime));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int StorageClass::Setup_PostgreSQL() {
|
inline int StorageClass::Setup_PostgreSQL() {
|
||||||
Logger().notice("PostgreSQL StorageClass enabled.");
|
Logger_.notice("PostgreSQL StorageClass enabled.");
|
||||||
dbType_ = pgsql;
|
dbType_ = pgsql;
|
||||||
int NumSessions = (int) MicroService::instance().ConfigGetInt("storage.type.postgresql.maxsessions", 64);
|
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.postgresql.maxsessions", 64);
|
||||||
int IdleTime = (int) MicroService::instance().ConfigGetInt("storage.type.postgresql.idletime", 60);
|
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.postgresql.idletime", 60);
|
||||||
auto Host = MicroService::instance().ConfigGetString("storage.type.postgresql.host");
|
auto Host = MicroService::instance().ConfigGetString("storage.type.postgresql.host");
|
||||||
auto Username = MicroService::instance().ConfigGetString("storage.type.postgresql.username");
|
auto Username = MicroService::instance().ConfigGetString("storage.type.postgresql.username");
|
||||||
auto Password = MicroService::instance().ConfigGetString("storage.type.postgresql.password");
|
auto Password = MicroService::instance().ConfigGetString("storage.type.postgresql.password");
|
||||||
@@ -130,8 +156,8 @@ namespace OpenWifi {
|
|||||||
" port=" + Port +
|
" port=" + Port +
|
||||||
" connect_timeout=" + ConnectionTimeout;
|
" connect_timeout=" + ConnectionTimeout;
|
||||||
|
|
||||||
Poco::Data::PostgreSQL::Connector::registerConnector();
|
PostgresConn_.registerConnector();
|
||||||
Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_.name(), ConnectionStr, 8, NumSessions, IdleTime);
|
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(PostgresConn_.name(), ConnectionStr, 4, NumSessions, IdleTime));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,193 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2022-05-05.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
struct WebNotificationSingleDevice {
|
|
||||||
std::string serialNumber;
|
|
||||||
inline void to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WebNotificationSingleDeviceConfigurationChange {
|
|
||||||
std::string serialNumber;
|
|
||||||
uint64_t oldUUID;
|
|
||||||
uint64_t newUUID;
|
|
||||||
|
|
||||||
inline void to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"oldUUID", oldUUID);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"newUUID", newUUID);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"oldUUID", oldUUID);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"newUUID", newUUID);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WebNotificationSingleDeviceFirmwareChange {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::string newFirmware;
|
|
||||||
inline void to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"serialNumber", serialNumber);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"newFirmware", newFirmware);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"serialNumber", serialNumber);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"newFirmware", newFirmware);
|
|
||||||
return true;
|
|
||||||
} catch (...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
inline void WebSocketClientNotificationDeviceConfigurationChange(const std::string &SerialNumber, uint64_t oldUUID, uint64_t newUUID) {
|
|
||||||
WebSocketNotification<WebNotificationSingleDeviceConfigurationChange> N;
|
|
||||||
N.content.serialNumber = SerialNumber;
|
|
||||||
N.content.oldUUID = oldUUID;
|
|
||||||
N.content.newUUID = newUUID;
|
|
||||||
N.type = "device_configuration_upgrade";
|
|
||||||
WebSocketClientServer()->SendNotification(N);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void WebSocketClientNotificationDeviceFirmwareUpdated(const std::string &SerialNumber, const std::string &Firmware) {
|
|
||||||
WebSocketNotification<WebNotificationSingleDeviceFirmwareChange> N;
|
|
||||||
N.content.serialNumber = SerialNumber;
|
|
||||||
N.content.newFirmware = Firmware;
|
|
||||||
N.type = "device_firmware_upgrade";
|
|
||||||
WebSocketClientServer()->SendNotification(N);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void WebSocketClientNotificationDeviceConnected(const std::string &SerialNumber) {
|
|
||||||
WebSocketNotification<WebNotificationSingleDevice> N;
|
|
||||||
N.content.serialNumber = SerialNumber;
|
|
||||||
N.type = "device_connection";
|
|
||||||
WebSocketClientServer()->SendNotification(N);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void WebSocketClientNotificationDeviceDisconnected(const std::string & SerialNumber) {
|
|
||||||
WebSocketNotification<WebNotificationSingleDevice> N;
|
|
||||||
N.content.serialNumber = SerialNumber;
|
|
||||||
N.type = "device_disconnection";
|
|
||||||
WebSocketClientServer()->SendNotification(N);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct WebSocketNotificationJobContent {
|
|
||||||
std::string title,
|
|
||||||
details,
|
|
||||||
jobId;
|
|
||||||
std::vector<std::string> success,
|
|
||||||
error,
|
|
||||||
warning;
|
|
||||||
uint64_t timeStamp=OpenWifi::Now();
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline void WebSocketNotificationJobContent::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"title",title);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"jobId",jobId);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"success",success);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"error",error);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"warning",warning);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"timeStamp",timeStamp);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"details",details);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool WebSocketNotificationJobContent::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"title",title);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"jobId",jobId);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"success",success);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"error",error);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"warning",warning);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"timeStamp",timeStamp);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"details",details);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef WebSocketNotification<WebSocketNotificationJobContent> WebSocketClientNotificationVenueUpdateJob_t;
|
|
||||||
|
|
||||||
inline void WebSocketClientNotificationVenueUpdateJobCompletionToUser( const std::string & User, WebSocketClientNotificationVenueUpdateJob_t &N) {
|
|
||||||
N.type = "venue_configuration_update";
|
|
||||||
WebSocketClientServer()->SendUserNotification(User,N);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct WebSocketNotificationRebootList {
|
|
||||||
std::string title,
|
|
||||||
details,
|
|
||||||
jobId;
|
|
||||||
std::vector<std::string> success,
|
|
||||||
warning;
|
|
||||||
uint64_t timeStamp=OpenWifi::Now();
|
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef WebSocketNotification<WebSocketNotificationRebootList> WebSocketClientNotificationVenueRebootList_t;
|
|
||||||
|
|
||||||
inline void WebSocketNotificationRebootList::to_json(Poco::JSON::Object &Obj) const {
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"title",title);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"jobId",jobId);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"success",success);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"warning",warning);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"timeStamp",timeStamp);
|
|
||||||
RESTAPI_utils::field_to_json(Obj,"details",details);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool WebSocketNotificationRebootList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"title",title);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"jobId",jobId);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"success",success);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"warning",warning);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"timeStamp",timeStamp);
|
|
||||||
RESTAPI_utils::field_from_json(Obj,"details",details);
|
|
||||||
return true;
|
|
||||||
} catch(...) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void WebSocketClientNotificationVenueRebootCompletionToUser( const std::string & User, WebSocketClientNotificationVenueRebootList_t &N) {
|
|
||||||
N.type = "venue_rebooter";
|
|
||||||
WebSocketClientServer()->SendUserNotification(User,N);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace OpenWifi
|
|
||||||
|
|
||||||
@@ -6,7 +6,8 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#ifndef __OPENWIFI_ORM_H__
|
||||||
|
#define __OPENWIFI_ORM_H__
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -32,9 +33,7 @@ namespace ORM {
|
|||||||
FT_BIGINT,
|
FT_BIGINT,
|
||||||
FT_TEXT,
|
FT_TEXT,
|
||||||
FT_VARCHAR,
|
FT_VARCHAR,
|
||||||
FT_BLOB,
|
FT_BLOB
|
||||||
FT_BOOLEAN,
|
|
||||||
FT_REAL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Indextype {
|
enum Indextype {
|
||||||
@@ -82,14 +81,14 @@ namespace ORM {
|
|||||||
typedef std::vector<Field> FieldVec;
|
typedef std::vector<Field> FieldVec;
|
||||||
|
|
||||||
struct IndexEntry {
|
struct IndexEntry {
|
||||||
std::string FieldName;
|
std::string FieldName;
|
||||||
Indextype Type;
|
Indextype Type;
|
||||||
};
|
};
|
||||||
typedef std::vector<IndexEntry> IndexEntryVec;
|
typedef std::vector<IndexEntry> IndexEntryVec;
|
||||||
|
|
||||||
struct Index {
|
struct Index {
|
||||||
std::string Name;
|
std::string Name;
|
||||||
IndexEntryVec Entries;
|
IndexEntryVec Entries;
|
||||||
};
|
};
|
||||||
typedef std::vector<Index> IndexVec;
|
typedef std::vector<Index> IndexVec;
|
||||||
|
|
||||||
@@ -98,24 +97,21 @@ namespace ORM {
|
|||||||
case FT_INT: return "INT";
|
case FT_INT: return "INT";
|
||||||
case FT_BIGINT: return "BIGINT";
|
case FT_BIGINT: return "BIGINT";
|
||||||
case FT_TEXT: return "TEXT";
|
case FT_TEXT: return "TEXT";
|
||||||
case FT_BOOLEAN: return "BOOLEAN";
|
|
||||||
case FT_VARCHAR:
|
case FT_VARCHAR:
|
||||||
if(Size)
|
if(Size)
|
||||||
return std::string("VARCHAR(") + std::to_string(Size) + std::string(")");
|
return std::string("VARCHAR(") + std::to_string(Size) + std::string(")");
|
||||||
else
|
else
|
||||||
return "TEXT";
|
return "TEXT";
|
||||||
case FT_BLOB:
|
case FT_BLOB:
|
||||||
if(Type==OpenWifi::DBType::mysql)
|
if(Type==OpenWifi::DBType::mysql)
|
||||||
return "LONGBLOB";
|
return "LONGBLOB";
|
||||||
else if(Type==OpenWifi::DBType::pgsql)
|
else if(Type==OpenWifi::DBType::pgsql)
|
||||||
return "BYTEA";
|
return "BYTEA";
|
||||||
else
|
else if(Type==OpenWifi::DBType::sqlite)
|
||||||
return "BLOB";
|
return "BLOB";
|
||||||
case FT_REAL:
|
default:
|
||||||
return "REAL";
|
assert(false);
|
||||||
default:
|
return "";
|
||||||
assert(false);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
assert(false);
|
assert(false);
|
||||||
return "";
|
return "";
|
||||||
@@ -124,13 +120,12 @@ namespace ORM {
|
|||||||
inline std::string Escape(const std::string &S) {
|
inline std::string Escape(const std::string &S) {
|
||||||
std::string R;
|
std::string R;
|
||||||
|
|
||||||
for(const auto &i:S) {
|
for(const auto &i:S)
|
||||||
if (i == '\'')
|
if(i=='\'')
|
||||||
R += "''";
|
R += "''";
|
||||||
else
|
else
|
||||||
R += i;
|
R += i;
|
||||||
}
|
return R;
|
||||||
return R;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SqlComparison { EQ = 0, NEQ, LT, LTE, GT, GTE };
|
enum SqlComparison { EQ = 0, NEQ, LT, LTE, GT, GTE };
|
||||||
@@ -155,61 +150,33 @@ namespace ORM {
|
|||||||
return S;
|
return S;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string to_string(const Poco::Data::BLOB &blob) {
|
|
||||||
std::string result;
|
|
||||||
result.assign(blob.begin(),blob.end());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string to_string(const char * S) {
|
inline std::string to_string(const char * S) {
|
||||||
return S;
|
return S;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename RecordType> class DBCache {
|
|
||||||
public:
|
|
||||||
DBCache(unsigned Size, unsigned Timeout) :
|
|
||||||
Size_(Size),
|
|
||||||
Timeout_(Timeout)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
virtual void Create(const RecordType &R)=0;
|
|
||||||
virtual bool GetFromCache(const std::string &FieldName, const std::string &Value, RecordType &R)=0;
|
|
||||||
virtual void UpdateCache(const RecordType &R)=0;
|
|
||||||
virtual void Delete(const std::string &FieldName, const std::string &Value)=0;
|
|
||||||
private:
|
|
||||||
size_t Size_=0;
|
|
||||||
uint64_t Timeout_=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename RecordTuple, typename RecordType> class DB {
|
template <typename RecordTuple, typename RecordType> class DB {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef const char * field_name_t;
|
|
||||||
|
|
||||||
DB( OpenWifi::DBType dbtype,
|
DB( OpenWifi::DBType dbtype,
|
||||||
const char *TableName,
|
const char *TableName,
|
||||||
const FieldVec & Fields,
|
const FieldVec & Fields,
|
||||||
const IndexVec & Indexes,
|
const IndexVec & Indexes,
|
||||||
Poco::Data::SessionPool & Pool,
|
Poco::Data::SessionPool & Pool,
|
||||||
Poco::Logger &L,
|
Poco::Logger &L,
|
||||||
const char *Prefix,
|
const char *Prefix):
|
||||||
DBCache<RecordType> * Cache=nullptr):
|
Type(dbtype),
|
||||||
TableName_(TableName),
|
DBName(TableName),
|
||||||
Type_(dbtype),
|
|
||||||
Pool_(Pool),
|
Pool_(Pool),
|
||||||
Logger_(L),
|
Logger_(L),
|
||||||
Prefix_(Prefix),
|
Prefix_(Prefix)
|
||||||
Cache_(Cache)
|
|
||||||
{
|
{
|
||||||
assert(RecordTuple::length == Fields.size());
|
|
||||||
|
|
||||||
bool first = true;
|
bool first = true;
|
||||||
int Place=0;
|
int Place=0;
|
||||||
|
|
||||||
|
assert( RecordTuple::length == Fields.size());
|
||||||
|
|
||||||
for(const auto &i:Fields) {
|
for(const auto &i:Fields) {
|
||||||
std::string FieldName = Poco::toLower(i.Name);
|
|
||||||
FieldNames_[FieldName] = Place;
|
FieldNames_[i.Name] = Place;
|
||||||
if(!first) {
|
if(!first) {
|
||||||
CreateFields_ += ", ";
|
CreateFields_ += ", ";
|
||||||
SelectFields_ += ", ";
|
SelectFields_ += ", ";
|
||||||
@@ -219,9 +186,9 @@ namespace ORM {
|
|||||||
SelectList_ += "(";
|
SelectList_ += "(";
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateFields_ += FieldName + " " + FieldTypeToChar(Type_, i.Type,i.Size) + (i.Index ? " unique primary key" : "");
|
CreateFields_ += i.Name + " " + FieldTypeToChar(Type, i.Type,i.Size) + (i.Index ? " unique primary key" : "");
|
||||||
SelectFields_ += FieldName ;
|
SelectFields_ += i.Name ;
|
||||||
UpdateFields_ += FieldName + "=?";
|
UpdateFields_ += i.Name + "=?";
|
||||||
SelectList_ += "?";
|
SelectList_ += "?";
|
||||||
first = false;
|
first = false;
|
||||||
Place++;
|
Place++;
|
||||||
@@ -229,25 +196,24 @@ namespace ORM {
|
|||||||
SelectList_ += ")";
|
SelectList_ += ")";
|
||||||
|
|
||||||
if(!Indexes.empty()) {
|
if(!Indexes.empty()) {
|
||||||
if(Type_==OpenWifi::DBType::sqlite || Type_==OpenWifi::DBType::pgsql) {
|
if(Type==OpenWifi::DBType::sqlite || Type==OpenWifi::DBType::pgsql) {
|
||||||
for(const auto &j:Indexes) {
|
for(const auto &j:Indexes) {
|
||||||
std::string IndexLine;
|
std::string IndexLine;
|
||||||
|
|
||||||
IndexLine = std::string("CREATE INDEX IF NOT EXISTS ") + j.Name + std::string(" ON ") + TableName_+ " (";
|
IndexLine = std::string("CREATE INDEX IF NOT EXISTS ") + j.Name + std::string(" ON ") + DBName + " (";
|
||||||
bool first_entry=true;
|
bool first_entry=true;
|
||||||
for(const auto &k:j.Entries) {
|
for(const auto &k:j.Entries) {
|
||||||
auto IndexFieldName = Poco::toLower(k.FieldName);
|
assert(FieldNames_.find(k.FieldName) != FieldNames_.end());
|
||||||
assert(ValidFieldName(IndexFieldName));
|
|
||||||
if(!first_entry) {
|
if(!first_entry) {
|
||||||
IndexLine += " , ";
|
IndexLine += " , ";
|
||||||
}
|
}
|
||||||
first_entry = false;
|
first_entry = false;
|
||||||
IndexLine += IndexFieldName + std::string(" ") + std::string(k.Type == Indextype::ASC ? "ASC" : "DESC") ;
|
IndexLine += k.FieldName + std::string(" ") + std::string(k.Type == Indextype::ASC ? "ASC" : "DESC") ;
|
||||||
}
|
}
|
||||||
IndexLine += " )";
|
IndexLine += " );";
|
||||||
IndexCreation_.template emplace_back(IndexLine);
|
IndexCreation += IndexLine;
|
||||||
}
|
}
|
||||||
} else if(Type_==OpenWifi::DBType::mysql) {
|
} else if(Type==OpenWifi::DBType::mysql) {
|
||||||
bool firstIndex = true;
|
bool firstIndex = true;
|
||||||
std::string IndexLine;
|
std::string IndexLine;
|
||||||
for(const auto &j:Indexes) {
|
for(const auto &j:Indexes) {
|
||||||
@@ -257,17 +223,16 @@ namespace ORM {
|
|||||||
IndexLine += " INDEX " + j.Name + " ( " ;
|
IndexLine += " INDEX " + j.Name + " ( " ;
|
||||||
bool first_entry=true;
|
bool first_entry=true;
|
||||||
for(const auto &k:j.Entries) {
|
for(const auto &k:j.Entries) {
|
||||||
auto IndexFieldName = Poco::toLower(k.FieldName);
|
assert(FieldNames_.find(k.FieldName) != FieldNames_.end());
|
||||||
assert(FieldNames_.find(IndexFieldName) != FieldNames_.end());
|
|
||||||
if(!first_entry) {
|
if(!first_entry) {
|
||||||
IndexLine += " ,";
|
IndexLine += " ,";
|
||||||
}
|
}
|
||||||
first_entry = false;
|
first_entry = false;
|
||||||
IndexLine += IndexFieldName + std::string(k.Type == Indextype::ASC ? " ASC" : " DESC");
|
IndexLine += k.FieldName + std::string(k.Type == Indextype::ASC ? " ASC" : " DESC");
|
||||||
}
|
}
|
||||||
IndexLine += " ) ";
|
IndexLine += " ) ";
|
||||||
}
|
}
|
||||||
IndexCreation_.template emplace_back(IndexLine);
|
IndexCreation = IndexLine;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -277,28 +242,23 @@ namespace ORM {
|
|||||||
[[nodiscard]] const std::string & SelectList() const { return SelectList_; };
|
[[nodiscard]] const std::string & SelectList() const { return SelectList_; };
|
||||||
[[nodiscard]] const std::string & UpdateFields() const { return UpdateFields_; };
|
[[nodiscard]] const std::string & UpdateFields() const { return UpdateFields_; };
|
||||||
|
|
||||||
inline std::string OP(field_name_t F, SqlComparison O , bool V) {
|
inline std::string OP(const char *F, SqlComparison O , int V) {
|
||||||
assert(ValidFieldName(F));
|
assert( FieldNames_.find(F) != FieldNames_.end() );
|
||||||
return std::string{"("} + F + SQLCOMPS[O] + (V ? "true" : "false") + ")" ;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string OP(field_name_t F, SqlComparison O , int V) {
|
|
||||||
assert(ValidFieldName(F));
|
|
||||||
return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ;
|
return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string OP(field_name_t F, SqlComparison O , uint64_t V) {
|
inline std::string OP(const char *F, SqlComparison O , uint64_t V) {
|
||||||
assert(ValidFieldName(F));
|
assert( FieldNames_.find(F) != FieldNames_.end() );
|
||||||
return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ;
|
return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string OP(field_name_t F, SqlComparison O , const std::string & V) {
|
std::string OP(const char *F, SqlComparison O , const std::string & V) {
|
||||||
assert(ValidFieldName(F));
|
assert( FieldNames_.find(F) != FieldNames_.end() );
|
||||||
return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ;
|
return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string OP(field_name_t F, SqlComparison O , const char * V) {
|
std::string OP(const char *F, SqlComparison O , const char * V) {
|
||||||
assert(ValidFieldName(F));
|
assert( FieldNames_.find(F) != FieldNames_.end() );
|
||||||
return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ;
|
return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,7 +266,7 @@ namespace ORM {
|
|||||||
return std::string("(")+P1 + BOPS[BOP] + P2 +")";
|
return std::string("(")+P1 + BOPS[BOP] + P2 +")";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string OP( [[maybe_unused]] bool Paran, const std::string &P1, SqlBinaryOp BOP , const std::string &P2) {
|
std::string OP( bool Paran, const std::string &P1, SqlBinaryOp BOP , const std::string &P2) {
|
||||||
return P1 + BOPS[BOP] + P2 +")";
|
return P1 + BOPS[BOP] + P2 +")";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,61 +278,35 @@ namespace ORM {
|
|||||||
return std::string{"("} + P1 + BOPS[BOP] + OP(true, P2, More...);
|
return std::string{"("} + P1 + BOPS[BOP] + OP(true, P2, More...);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Upgrade() {
|
|
||||||
uint32_t To;
|
|
||||||
return Upgrade(0, To);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool Create() {
|
inline bool Create() {
|
||||||
switch(Type_) {
|
std::string S;
|
||||||
case OpenWifi::DBType::mysql: {
|
|
||||||
try {
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
|
||||||
std::string Statement = IndexCreation_.empty() ? "create table if not exists " + TableName_ +" ( " + CreateFields_ + " )" :
|
|
||||||
"create table if not exists " + TableName_ +" ( " + CreateFields_ + " ), " + IndexCreation_[0] + " )";
|
|
||||||
Session << Statement , Poco::Data::Keywords::now;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger_.error("Failure to create MySQL DB resources.");
|
|
||||||
Logger_.log(E);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OpenWifi::DBType::sqlite: {
|
if(Type==OpenWifi::DBType::mysql) {
|
||||||
try {
|
if(IndexCreation.empty())
|
||||||
Poco::Data::Session Session = Pool_.get();
|
S = "create table if not exists " + DBName +" ( " + CreateFields_ + " )" ;
|
||||||
std::string Statement = "create table if not exists " + TableName_ + " ( " + CreateFields_ + " )";
|
else
|
||||||
Session << Statement , Poco::Data::Keywords::now;
|
S = "create table if not exists " + DBName +" ( " + CreateFields_ + " ), " + IndexCreation + " )";
|
||||||
for(const auto &i:IndexCreation_) {
|
} else if (Type==OpenWifi::DBType::pgsql || Type==OpenWifi::DBType::sqlite) {
|
||||||
Session << i , Poco::Data::Keywords::now;
|
S = "create table if not exists " + DBName + " ( " + CreateFields_ + " ); " + IndexCreation ;
|
||||||
}
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger_.error("Failure to create SQLITE DB resources.");
|
|
||||||
Logger_.log(E);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OpenWifi::DBType::pgsql: {
|
|
||||||
try {
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
|
||||||
std::string Statement = "create table if not exists " + TableName_ + " ( " + CreateFields_ + " )";
|
|
||||||
Session << Statement , Poco::Data::Keywords::now;
|
|
||||||
for(const auto &i:IndexCreation_) {
|
|
||||||
Session << i , Poco::Data::Keywords::now;
|
|
||||||
}
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger_.error("Failure to create POSTGRESQL DB resources.");
|
|
||||||
Logger_.log(E);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return Upgrade();
|
|
||||||
|
// std::cout << "CREATE-DB: " << S << std::endl;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Session = Pool_.get();
|
||||||
|
Poco::Data::Statement CreateStatement(Session);
|
||||||
|
|
||||||
|
CreateStatement << S;
|
||||||
|
CreateStatement.execute();
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
std::cout << "Exception while creating DB: " << E.name() << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] std::string ConvertParams(const std::string & S) const {
|
[[nodiscard]] std::string ConvertParams(const std::string & S) const {
|
||||||
if(Type_!=OpenWifi::DBType::pgsql)
|
if(Type!=OpenWifi::DBType::pgsql)
|
||||||
return S;
|
return S;
|
||||||
|
|
||||||
std::string R;
|
std::string R;
|
||||||
@@ -391,61 +325,48 @@ namespace ORM {
|
|||||||
return R;
|
return R;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Convert( const RecordTuple &in , RecordType &out);
|
void Convert( RecordTuple &in , RecordType &out);
|
||||||
void Convert( const RecordType &in , RecordTuple &out);
|
void Convert( RecordType &in , RecordTuple &out);
|
||||||
|
|
||||||
inline const std::string & Prefix() { return Prefix_; };
|
inline const std::string & Prefix() { return Prefix_; };
|
||||||
|
|
||||||
bool CreateRecord( const RecordType & R) {
|
bool CreateRecord( RecordType & R) {
|
||||||
try {
|
try {
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Insert(Session);
|
Poco::Data::Statement Insert(Session);
|
||||||
|
|
||||||
RecordTuple RT;
|
RecordTuple RT;
|
||||||
Convert(R, RT);
|
Convert(R, RT);
|
||||||
std::string St = "insert into " + TableName_ + " ( " + SelectFields_ + " ) values " + SelectList_;
|
std::string St = "insert into " + DBName + " ( " + SelectFields_ + " ) values " + SelectList_;
|
||||||
Insert << ConvertParams(St) ,
|
Insert << ConvertParams(St) ,
|
||||||
Poco::Data::Keywords::use(RT);
|
Poco::Data::Keywords::use(RT);
|
||||||
Insert.execute();
|
Insert.execute();
|
||||||
|
|
||||||
if(Cache_)
|
|
||||||
Cache_->Create(R);
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> bool GetRecord(field_name_t FieldName, const T & Value, RecordType & R) {
|
template<typename T> bool GetRecord( const char * FieldName, T Value, RecordType & R) {
|
||||||
try {
|
try {
|
||||||
assert(ValidFieldName(FieldName));
|
|
||||||
|
|
||||||
if(Cache_) {
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
if(Cache_->GetFromCache(FieldName, Value, R))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Select(Session);
|
Poco::Data::Statement Select(Session);
|
||||||
RecordTuple RT;
|
RecordTuple RT;
|
||||||
|
|
||||||
std::string St = "select " + SelectFields_ + " from " + TableName_ + " where " + FieldName + "=?" + " limit 1";
|
std::string St = "select " + SelectFields_ + " from " + DBName + " where " + FieldName + "=?" ;
|
||||||
|
|
||||||
auto tValue{Value};
|
|
||||||
|
|
||||||
Select << ConvertParams(St) ,
|
Select << ConvertParams(St) ,
|
||||||
Poco::Data::Keywords::into(RT),
|
Poco::Data::Keywords::into(RT),
|
||||||
Poco::Data::Keywords::use(tValue);
|
Poco::Data::Keywords::use(Value);
|
||||||
Select.execute();
|
|
||||||
|
|
||||||
if(Select.execute()==1) {
|
if(Select.execute()==1) {
|
||||||
Convert(RT,R);
|
Convert(RT,R);
|
||||||
if(Cache_)
|
|
||||||
Cache_->UpdateCache(R);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
}
|
}
|
||||||
@@ -455,16 +376,16 @@ namespace ORM {
|
|||||||
typedef std::vector<std::string> StringVec;
|
typedef std::vector<std::string> StringVec;
|
||||||
|
|
||||||
template < typename T,
|
template < typename T,
|
||||||
typename T0, typename T1> bool GR(field_name_t FieldName, T & R,T0 &V0, T1 &V1) {
|
typename T0, typename T1> bool GR(const char *FieldName, T & R,T0 &V0, T1 &V1) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
assert( ValidFieldName(FieldName) );
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Select(Session);
|
Poco::Data::Statement Select(Session);
|
||||||
RecordTuple RT;
|
RecordTuple RT;
|
||||||
|
|
||||||
std::string St = "select " + SelectFields_ + " from " + TableName_
|
std::string St = "select " + SelectFields_ + " from " + DBName
|
||||||
+ " where " + FieldName[0] + "=? and " + FieldName[1] + "=?" ;
|
+ " where " + FieldName[0] + "=? and " + FieldName[1] + "=?" ;
|
||||||
Select << ConvertParams(St) ,
|
Select << ConvertParams(St) ,
|
||||||
Poco::Data::Keywords::into(RT),
|
Poco::Data::Keywords::into(RT),
|
||||||
@@ -482,24 +403,21 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::vector<RecordTuple> RecordList;
|
typedef std::vector<RecordTuple> RecordList;
|
||||||
typedef std::vector<RecordType> RecordVec;
|
|
||||||
typedef RecordType RecordName;
|
|
||||||
|
|
||||||
bool GetRecords( uint64_t Offset, uint64_t HowMany, RecordVec & Records, const std::string & Where = "", const std::string & OrderBy = "") {
|
bool GetRecords( uint64_t Offset, uint64_t HowMany, std::vector<RecordType> & Records, const std::string & Where = "", const std::string & OrderBy = "") {
|
||||||
try {
|
try {
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Select(Session);
|
Poco::Data::Statement Select(Session);
|
||||||
RecordList RL;
|
RecordList RL;
|
||||||
std::string St = "select " + SelectFields_ + " from " + TableName_ +
|
std::string St = "select " + SelectFields_ + " from " + DBName +
|
||||||
(Where.empty() ? "" : " where " + Where) + OrderBy +
|
(Where.empty() ? "" : " where " + Where) + OrderBy +
|
||||||
ComputeRange(Offset, HowMany) ;
|
ComputeRange(Offset, HowMany) ;
|
||||||
|
|
||||||
Select << St ,
|
Select << St ,
|
||||||
Poco::Data::Keywords::into(RL);
|
Poco::Data::Keywords::into(RL);
|
||||||
Select.execute();
|
|
||||||
|
|
||||||
if(Select.rowsExtracted()>0) {
|
if(Select.execute()>0) {
|
||||||
for(auto &i:RL) {
|
for(auto &i:RL) {
|
||||||
RecordType R;
|
RecordType R;
|
||||||
Convert(i, R);
|
Convert(i, R);
|
||||||
@@ -514,9 +432,9 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> bool UpdateRecord(field_name_t FieldName, const T & Value, const RecordType & R) {
|
template <typename T> bool UpdateRecord( const char *FieldName, T & Value, RecordType & R) {
|
||||||
try {
|
try {
|
||||||
assert( ValidFieldName(FieldName) );
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Update(Session);
|
Poco::Data::Statement Update(Session);
|
||||||
@@ -525,15 +443,11 @@ namespace ORM {
|
|||||||
|
|
||||||
Convert(R, RT);
|
Convert(R, RT);
|
||||||
|
|
||||||
auto tValue(Value);
|
std::string St = "update " + DBName + " set " + UpdateFields_ + " where " + FieldName + "=?" ;
|
||||||
|
|
||||||
std::string St = "update " + TableName_ + " set " + UpdateFields_ + " where " + FieldName + "=?" ;
|
|
||||||
Update << ConvertParams(St) ,
|
Update << ConvertParams(St) ,
|
||||||
Poco::Data::Keywords::use(RT),
|
Poco::Data::Keywords::use(RT),
|
||||||
Poco::Data::Keywords::use(tValue);
|
Poco::Data::Keywords::use(Value);
|
||||||
Update.execute();
|
Update.execute();
|
||||||
if(Cache_)
|
|
||||||
Cache_->UpdateCache(R);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
@@ -541,47 +455,18 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RunStatement(const std::string &St) {
|
template <typename T> bool GetNameAndDescription(const char *FieldName, T & Value, std::string & Name, std::string & Description ) {
|
||||||
try {
|
try {
|
||||||
Poco::Data::Session Session = Pool_.get();
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
Poco::Data::Statement Command(Session);
|
|
||||||
|
|
||||||
Command << St ;
|
|
||||||
Command.execute();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger_.log(E);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> bool ReplaceRecord(field_name_t FieldName, const T & Value, RecordType & R) {
|
|
||||||
try {
|
|
||||||
if(Exists(FieldName, Value)) {
|
|
||||||
return UpdateRecord(FieldName,Value,R);
|
|
||||||
}
|
|
||||||
return CreateRecord(R);
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger_.log(E);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> bool GetNameAndDescription(field_name_t FieldName, const T & Value, std::string & Name, std::string & Description ) {
|
|
||||||
try {
|
|
||||||
assert( ValidFieldName(FieldName) );
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Select(Session);
|
Poco::Data::Statement Select(Session);
|
||||||
RecordTuple RT;
|
RecordTuple RT;
|
||||||
|
|
||||||
std::string St = "select " + SelectFields_ + " from " + TableName_ + " where " + FieldName + "=?" ;
|
std::string St = "select " + SelectFields_ + " from " + DBName + " where " + FieldName + "=?" ;
|
||||||
RecordType R;
|
RecordType R;
|
||||||
auto tValue{Value};
|
|
||||||
Select << ConvertParams(St) ,
|
Select << ConvertParams(St) ,
|
||||||
Poco::Data::Keywords::into(RT),
|
Poco::Data::Keywords::into(RT),
|
||||||
Poco::Data::Keywords::use(tValue);
|
Poco::Data::Keywords::use(Value);
|
||||||
|
|
||||||
if(Select.execute()==1) {
|
if(Select.execute()==1) {
|
||||||
Convert(RT,R);
|
Convert(RT,R);
|
||||||
Name = R.info.name;
|
Name = R.info.name;
|
||||||
@@ -595,21 +480,17 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> bool DeleteRecord(field_name_t FieldName, const T & Value) {
|
template <typename T> bool DeleteRecord( const char *FieldName, T Value) {
|
||||||
try {
|
try {
|
||||||
assert( ValidFieldName(FieldName) );
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Delete(Session);
|
Poco::Data::Statement Delete(Session);
|
||||||
|
|
||||||
std::string St = "delete from " + TableName_ + " where " + FieldName + "=?" ;
|
std::string St = "delete from " + DBName + " where " + FieldName + "=?" ;
|
||||||
auto tValue{Value};
|
|
||||||
|
|
||||||
Delete << ConvertParams(St) ,
|
Delete << ConvertParams(St) ,
|
||||||
Poco::Data::Keywords::use(tValue);
|
Poco::Data::Keywords::use(Value);
|
||||||
Delete.execute();
|
Delete.execute();
|
||||||
if(Cache_)
|
|
||||||
Cache_->Delete(FieldName, Value);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger_.log(E);
|
||||||
@@ -623,7 +504,7 @@ namespace ORM {
|
|||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Delete(Session);
|
Poco::Data::Statement Delete(Session);
|
||||||
|
|
||||||
std::string St = "delete from " + TableName_ + " where " + WhereClause;
|
std::string St = "delete from " + DBName + " where " + WhereClause;
|
||||||
Delete << St;
|
Delete << St;
|
||||||
Delete.execute();
|
Delete.execute();
|
||||||
return true;
|
return true;
|
||||||
@@ -633,9 +514,9 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Exists(field_name_t FieldName, const std::string & Value) {
|
bool Exists(const char *FieldName, std::string & Value) {
|
||||||
try {
|
try {
|
||||||
assert( ValidFieldName(FieldName) );
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
|
|
||||||
RecordType R;
|
RecordType R;
|
||||||
if(GetRecord(FieldName,Value,R))
|
if(GetRecord(FieldName,Value,R))
|
||||||
@@ -647,15 +528,15 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Iterate( std::function<bool(const RecordType &R)> F, const std::string & WhereClause = "" ) {
|
bool Iterate( std::function<bool(const RecordType &R)> F) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
uint64_t Offset=0;
|
uint64_t Offset=1;
|
||||||
uint64_t Batch=50;
|
uint64_t Batch=50;
|
||||||
bool Done=false;
|
bool Done=false;
|
||||||
while(!Done) {
|
while(!Done) {
|
||||||
std::vector<RecordType> Records;
|
std::vector<RecordType> Records;
|
||||||
if(GetRecords(Offset,Batch,Records, WhereClause)) {
|
if(GetRecords(Offset,Batch,Records)) {
|
||||||
for(const auto &i:Records) {
|
for(const auto &i:Records) {
|
||||||
if(!F(i))
|
if(!F(i))
|
||||||
return true;
|
return true;
|
||||||
@@ -688,7 +569,7 @@ namespace ORM {
|
|||||||
}
|
}
|
||||||
if(!ItemList.empty())
|
if(!ItemList.empty())
|
||||||
ItemList += " , ";
|
ItemList += " , ";
|
||||||
auto hint = FieldNames_.find(Poco::toLower(T[0]));
|
auto hint = FieldNames_.find(T[0]);
|
||||||
if(hint==FieldNames_.end()) {
|
if(hint==FieldNames_.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -698,6 +579,9 @@ namespace ORM {
|
|||||||
if(!ItemList.empty()) {
|
if(!ItemList.empty()) {
|
||||||
OrderByString = " ORDER BY " + ItemList;
|
OrderByString = " ORDER BY " + ItemList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cout << OrderByString << std::endl;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -708,7 +592,7 @@ namespace ORM {
|
|||||||
Poco::Data::Session Session = Pool_.get();
|
Poco::Data::Session Session = Pool_.get();
|
||||||
Poco::Data::Statement Select(Session);
|
Poco::Data::Statement Select(Session);
|
||||||
|
|
||||||
std::string st{"SELECT COUNT(*) FROM " + TableName_ + " " + (Where.empty() ? "" : (" where " + Where)) };
|
std::string st{"SELECT COUNT(*) FROM " + DBName + " " + (Where.empty() ? "" : (" where " + Where)) };
|
||||||
|
|
||||||
Select << st ,
|
Select << st ,
|
||||||
Poco::Data::Keywords::into(Cnt);
|
Poco::Data::Keywords::into(Cnt);
|
||||||
@@ -722,9 +606,9 @@ namespace ORM {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename X> bool ManipulateVectorMember( X T, field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID, bool Add) {
|
template <typename X> bool ManipulateVectorMember( X T, const char *FieldName, std::string & ParentUUID, std::string & ChildUUID, bool Add) {
|
||||||
try {
|
try {
|
||||||
assert( ValidFieldName(FieldName) );
|
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
|
||||||
|
|
||||||
RecordType R;
|
RecordType R;
|
||||||
if(GetRecord(FieldName, ParentUUID, R)) {
|
if(GetRecord(FieldName, ParentUUID, R)) {
|
||||||
@@ -749,122 +633,89 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RunScript(const std::vector<std::string> & Statements, bool IgnoreExceptions=true) {
|
inline bool AddChild( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
try {
|
|
||||||
Poco::Data::Session Session = Pool_.get();
|
|
||||||
Poco::Data::Statement Command(Session);
|
|
||||||
|
|
||||||
for(const auto &i:Statements) {
|
|
||||||
try {
|
|
||||||
Command << i, Poco::Data::Keywords::now;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
// Logger_.log(E);
|
|
||||||
// Logger_.error(Poco::format("The following statement '%s' generated an exception during a table upgrade. This may or may not be a problem.", i));
|
|
||||||
if(!IgnoreExceptions) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Command.reset(Session);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger_.log(E);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual uint32_t Version() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool Upgrade(uint32_t from, uint32_t &to) {
|
|
||||||
to = from;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool AddChild(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
|
||||||
return ManipulateVectorMember(&RecordType::children, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::children, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteChild(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DeleteChild( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::children, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::children, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddLocation(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddLocation( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::locations, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::locations, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteLocation(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DeleteLocation( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::locations, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::locations, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddContact(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddContact( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::contacts, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::contacts, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteContact(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DeleteContact( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::contacts, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::contacts, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddVenue(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddVenue( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::venues, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::venues, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteVenue(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DeleteVenue( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::venues, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::venues, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddDevice(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddDevice( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::devices, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::devices, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteDevice(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DeleteDevice( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::devices, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::devices, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddEntity(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddEntity( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::entities, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::entities, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteEntity(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DeleteEntity( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::entities, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::entities, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddUser(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddUser( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::users, FieldName, ParentUUID, ChildUUID, true);
|
return ManipulateVectorMember(&RecordType::users, FieldName, ParentUUID, ChildUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DelUser(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool DelUser( const char *FieldName, std::string & ParentUUID, std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::users, FieldName, ParentUUID, ChildUUID, false);
|
return ManipulateVectorMember(&RecordType::users, FieldName, ParentUUID, ChildUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool AddConfiguration(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
inline bool AddInUse(const char *FieldName, std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) {
|
||||||
return ManipulateVectorMember(&RecordType::deviceConfiguration, FieldName, ParentUUID, ChildUUID, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool DelConfiguration(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
|
||||||
return ManipulateVectorMember(&RecordType::deviceConfiguration, FieldName, ParentUUID, ChildUUID, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool AddVariable(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
|
||||||
return ManipulateVectorMember(&RecordType::variables, FieldName, ParentUUID, ChildUUID, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool DelVariable(field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID) {
|
|
||||||
return ManipulateVectorMember(&RecordType::variables, FieldName, ParentUUID, ChildUUID, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool AddInUse(field_name_t FieldName, const std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) {
|
|
||||||
std::string FakeUUID{ Prefix + ":" + ChildUUID};
|
std::string FakeUUID{ Prefix + ":" + ChildUUID};
|
||||||
return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, true);
|
return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool DeleteInUse(field_name_t FieldName, const std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) {
|
inline bool DeleteInUse(const char *FieldName, std::string & ParentUUID, const std::string & Prefix, const std::string & ChildUUID) {
|
||||||
std::string FakeUUID{ Prefix + ":" + ChildUUID};
|
std::string FakeUUID{ Prefix + ":" + ChildUUID};
|
||||||
return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, false);
|
return ManipulateVectorMember(&RecordType::inUse,FieldName, ParentUUID, FakeUUID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool GetInUse(field_name_t FieldName, const std::string & UUID, std::vector<std::string> & UUIDs ) {
|
inline bool DeleteContact(const char *FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
|
||||||
|
return ManipulateVectorMember(&RecordType::contacts,FieldName, ParentUUID, ChildUUID, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool AddContact(const char *FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
|
||||||
|
return ManipulateVectorMember(&RecordType::contacts,FieldName, ParentUUID, ChildUUID, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool DeleteLocation(const char *FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
|
||||||
|
return ManipulateVectorMember(&RecordType::locations,FieldName, ParentUUID, ChildUUID, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool AddLocation(const char *FieldName, std::string & ParentUUID, const std::string & ChildUUID) {
|
||||||
|
return ManipulateVectorMember(&RecordType::locations,FieldName, ParentUUID, ChildUUID, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool GetInUse(const char *FieldName, std::string & UUID, std::vector<std::string> & UUIDs ) {
|
||||||
RecordType R;
|
RecordType R;
|
||||||
if(GetRecord(FieldName,UUID,R)) {
|
if(GetRecord(FieldName,UUID,R)) {
|
||||||
UUIDs = R.inUse;
|
UUIDs = R.inUse;
|
||||||
@@ -873,56 +724,35 @@ namespace ORM {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool ValidFieldName(const std::string &FieldName) {
|
|
||||||
return FieldNames_.find(Poco::toLower(FieldName)) != FieldNames_.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool ValidFieldName(const char *FieldName) {
|
|
||||||
std::string Field{FieldName};
|
|
||||||
return ValidFieldName(Field);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) {
|
[[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) {
|
||||||
if(From<1) From=0;
|
if(From<1) From=1;
|
||||||
switch(Type_) {
|
switch(Type) {
|
||||||
case OpenWifi::DBType::sqlite:
|
case OpenWifi::DBType::sqlite:
|
||||||
return " LIMIT " + std::to_string(From) + ", " + std::to_string(HowMany) + " ";
|
return " LIMIT " + std::to_string(From-1) + ", " + std::to_string(HowMany) + " ";
|
||||||
case OpenWifi::DBType::pgsql:
|
case OpenWifi::DBType::pgsql:
|
||||||
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
|
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " ";
|
||||||
case OpenWifi::DBType::mysql:
|
case OpenWifi::DBType::mysql:
|
||||||
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
|
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " ";
|
||||||
default:
|
default:
|
||||||
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
|
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Poco::Logger & Logger() { return Logger_; }
|
Poco::Logger & Logger() { return Logger_; }
|
||||||
|
|
||||||
inline bool DeleteRecordsFromCache(const char *FieldName, const std::string &Value ) {
|
|
||||||
if(Cache_)
|
|
||||||
Cache_->Delete(FieldName, Value);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void GetFieldNames( OpenWifi::Types::StringVec & F) {
|
|
||||||
for(const auto &[field,_]:FieldNames_)
|
|
||||||
F.push_back(field);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::string TableName_;
|
|
||||||
OpenWifi::DBType Type_;
|
|
||||||
Poco::Data::SessionPool &Pool_;
|
|
||||||
Poco::Logger &Logger_;
|
|
||||||
std::string Prefix_;
|
|
||||||
DBCache<RecordType> *Cache_= nullptr;
|
|
||||||
private:
|
private:
|
||||||
|
OpenWifi::DBType Type;
|
||||||
|
std::string DBName;
|
||||||
std::string CreateFields_;
|
std::string CreateFields_;
|
||||||
std::string SelectFields_;
|
std::string SelectFields_;
|
||||||
std::string SelectList_;
|
std::string SelectList_;
|
||||||
std::string UpdateFields_;
|
std::string UpdateFields_;
|
||||||
std::vector<std::string> IndexCreation_;
|
std::string IndexCreation;
|
||||||
std::map<std::string,int> FieldNames_;
|
std::map<std::string,int> FieldNames_;
|
||||||
|
Poco::Data::SessionPool &Pool_;
|
||||||
|
Poco::Logger &Logger_;
|
||||||
|
std::string Prefix_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,509 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2022-02-21.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <cstring>
|
|
||||||
#include "Poco/String.h"
|
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__clang__)
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wunused-variable"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace OpenWifi::RESTAPI::Errors {
|
|
||||||
struct msg { uint64_t err_num; std::string err_txt; };
|
|
||||||
static const struct msg Error404{404,"Resource does not exist."};
|
|
||||||
|
|
||||||
static const struct msg SUCCESS{0,"No error."};
|
|
||||||
static const struct msg PASSWORD_CHANGE_REQUIRED{1,"Password change required"};
|
|
||||||
static const struct msg INVALID_CREDENTIALS{2,"Invalid credentials."};
|
|
||||||
static const struct msg PASSWORD_ALREADY_USED{3,"Password already used."};
|
|
||||||
static const struct msg USERNAME_PENDING_VERIFICATION{4,"Username pending verification."};
|
|
||||||
static const struct msg PASSWORD_INVALID{5,"Password is invalid"};
|
|
||||||
static const struct msg INTERNAL_ERROR{6,"Internal error."};
|
|
||||||
static const struct msg ACCESS_DENIED{7,"Access denied."};
|
|
||||||
static const struct msg INVALID_TOKEN{8,"Invalid token."};
|
|
||||||
static const struct msg EXPIRED_TOKEN{9,"Expired token."};
|
|
||||||
static const struct msg RATE_LIMIT_EXCEEDED{10,"Rate limit exceeded."};
|
|
||||||
static const struct msg BAD_MFA_TRANSACTION{11,"Bad MFA transaction."};
|
|
||||||
static const struct msg MFA_FAILURE{12,"MFA failure."};
|
|
||||||
static const struct msg SECURITY_SERVICE_UNREACHABLE{13,"Security service is unreachable, try again later."};
|
|
||||||
static const struct msg CANNOT_REFRESH_TOKEN{14,"Cannot refresh token."};
|
|
||||||
|
|
||||||
static const struct msg MissingUUID{1000,"Missing UUID."};
|
|
||||||
static const struct msg MissingSerialNumber{1001,"Missing Serial Number."};
|
|
||||||
static const struct msg InternalError{1002,"Internal error. Please try later."};
|
|
||||||
static const struct msg InvalidJSONDocument{1003,"Invalid JSON document."};
|
|
||||||
static const struct msg UnsupportedHTTPMethod{1004,"Unsupported HTTP Method"};
|
|
||||||
static const struct msg StillInUse{1005,"Element still in use."};
|
|
||||||
static const struct msg CouldNotBeDeleted{1006,"Element could not be deleted."};
|
|
||||||
static const struct msg NameMustBeSet{1007,"The name property must be set."};
|
|
||||||
static const struct msg ConfigBlockInvalid{1008,"Configuration block type invalid."};
|
|
||||||
static const struct msg UnknownId{1009,"Unknown UUID."};
|
|
||||||
static const struct msg InvalidDeviceTypes{1010,"Unknown or invalid device type(s)."};
|
|
||||||
static const struct msg RecordNotCreated{1011,"Record could not be created."};
|
|
||||||
static const struct msg RecordNotUpdated{1012,"Record could not be updated."};
|
|
||||||
static const struct msg UnknownManagementPolicyUUID{1013,"Unknown management policy UUID."};
|
|
||||||
static const struct msg CannotDeleteRoot{1014,"Root Entity cannot be removed, only modified."};
|
|
||||||
static const struct msg MustCreateRootFirst{1015,"Root entity must be created first."};
|
|
||||||
static const struct msg ParentUUIDMustExist{1016,"Parent UUID must exist."};
|
|
||||||
static const struct msg ConfigurationMustExist{1017,"Configuration must exist."};
|
|
||||||
static const struct msg MissingOrInvalidParameters{1018,"Invalid or missing parameters."};
|
|
||||||
static const struct msg UnknownSerialNumber{1019,"Unknown Serial Number."};
|
|
||||||
static const struct msg InvalidSerialNumber{1020,"Invalid Serial Number."};
|
|
||||||
static const struct msg SerialNumberExists{1021,"Serial Number already exists."};
|
|
||||||
static const struct msg ValidNonRootUUID{1022,"Must be a non-root, and valid UUID."};
|
|
||||||
static const struct msg VenueMustExist{1023,"Venue does not exist."};
|
|
||||||
static const struct msg NotBoth{1024,"You cannot specify both Entity and Venue"};
|
|
||||||
static const struct msg EntityMustExist{1025,"Entity must exist."};
|
|
||||||
static const struct msg ParentOrEntityMustBeSet{1026,"Parent or Entity must be set."};
|
|
||||||
static const struct msg ContactMustExist{1027,"Contact must exist."};
|
|
||||||
static const struct msg LocationMustExist{1028,"Location must exist."};
|
|
||||||
static const struct msg OnlyWSSupported{1029,"This endpoint only supports WebSocket."};
|
|
||||||
static const struct msg SerialNumberMismatch{1030,"Serial Number mismatch."};
|
|
||||||
static const struct msg InvalidCommand{1031,"Invalid command."};
|
|
||||||
static const struct msg NoRecordsDeleted{1032,"No records deleted."};
|
|
||||||
static const struct msg DeviceNotConnected{1033,"Device is not currently connected."};
|
|
||||||
static const struct msg CannotCreateWS{1034,"Telemetry system could not create WS endpoint. Please try again."};
|
|
||||||
static const struct msg BothDeviceTypeRevision{1035,"Both deviceType and revision must be set."};
|
|
||||||
static const struct msg IdOrSerialEmpty{1036,"SerialNumber and Id must not be empty."};
|
|
||||||
static const struct msg MissingUserID{1037,"Missing user ID."};
|
|
||||||
static const struct msg IdMustBe0{1038,"To create a user, you must set the ID to 0"};
|
|
||||||
static const struct msg InvalidUserRole{1039,"Invalid userRole."};
|
|
||||||
static const struct msg InvalidEmailAddress{1040,"Invalid email address."};
|
|
||||||
static const struct msg PasswordRejected{1041,"Password was rejected. This maybe an old password."};
|
|
||||||
static const struct msg InvalidIPRanges{1042,"Invalid IP range specifications."};
|
|
||||||
static const struct msg InvalidLOrderBy{1043,"Invalid orderBy specification."};
|
|
||||||
static const struct msg NeedMobileNumber{1044,"You must provide at least one validated phone number."};
|
|
||||||
static const struct msg BadMFAMethod{1045,"MFA only supports sms or email."};
|
|
||||||
static const struct msg InvalidCredentials{1046,"Invalid credentials (username/password)."};
|
|
||||||
static const struct msg InvalidPassword{1047,"Password does not conform to basic password rules."};
|
|
||||||
static const struct msg UserPendingVerification{1048,"User access denied pending email verification."};
|
|
||||||
static const struct msg PasswordMustBeChanged{1049,"Password must be changed."};
|
|
||||||
static const struct msg UnrecognizedRequest{1050,"Ill-formed request. Please consult documentation."};
|
|
||||||
static const struct msg MissingAuthenticationInformation{1051,"Missing authentication information."};
|
|
||||||
static const struct msg InsufficientAccessRights{1052,"Insufficient access rights to complete the operation."};
|
|
||||||
static const struct msg ExpiredToken{1053,"Token has expired, user must login."};
|
|
||||||
static const struct msg SubscriberMustExist{1054,"Subscriber must exist."};
|
|
||||||
static const struct msg AuthenticatorVerificationIncomplete{1055,"Authenticator validation is not complete."};
|
|
||||||
static const struct msg SMSCouldNotBeSentRetry{1056,"SMS could not be sent to validate device, try later or change the phone number."};
|
|
||||||
static const struct msg SMSCouldNotValidate{1057,"Code and number could not be validated"};
|
|
||||||
static const struct msg InvalidDeviceClass{1058,"Invalid device class. Must be: any, venue, entity, or subscriber"};
|
|
||||||
static const struct msg SerialNumberAlreadyProvisioned{1059,"This device has already been provisioned to a subscriber."};
|
|
||||||
static const struct msg SerialNumberNotTheProperClass{1060,"Device is not available to subscribers. It ahs been assigned to another class of devices."};
|
|
||||||
static const struct msg UserAlreadyExists{1061,"Username already exists."};
|
|
||||||
static const struct msg NotImplemented{1062,"Function not implemented."};
|
|
||||||
static const struct msg VariableMustExist{1063,"Specified variable does not exist."};
|
|
||||||
static const struct msg InvalidEntityType{1064,"Invalid entity type."};
|
|
||||||
static const struct msg CannotDeleteSubEntity{1065,"Cannot delete the default subscriber entity."};
|
|
||||||
static const struct msg OperatorIdMustExist{1066,"Missing or bad Operator ID"};
|
|
||||||
static const struct msg CannotDeleteDefaultOperator{1067,"Cannot delete the default operator."};
|
|
||||||
static const struct msg CannotCreateDefaultOperator{1068,"Cannot create the default operator."};
|
|
||||||
static const struct msg InvalidRRM{1069,"Invalid RRM value."};
|
|
||||||
static const struct msg InvalidIPAddresses{1070,"Invalid IP addresses."};
|
|
||||||
static const struct msg InvalidBillingCode{1071,"Empty of invalid billing code."};
|
|
||||||
static const struct msg InvalidBillingPeriod{1072,"Invalid billing period."};
|
|
||||||
static const struct msg InvalidSubscriberId{1073,"Invalid subscriber ID."};
|
|
||||||
static const struct msg InvalidContactId{1074,"Invalid contact ID."};
|
|
||||||
static const struct msg InvalidLocationId{1075,"Invalid location ID."};
|
|
||||||
static const struct msg InvalidContactType{1076,"Invalid contact type."};
|
|
||||||
static const struct msg InvalidLocationType{1077,"Invalid location type."};
|
|
||||||
static const struct msg InvalidOperatorId{1078,"Invalid operator ID."};
|
|
||||||
static const struct msg InvalidServiceClassId{1079,"Invalid service class ID."};
|
|
||||||
static const struct msg InvalidSubscriberDeviceId{1080,"Invalid subscriber device ID."};
|
|
||||||
static const struct msg InvalidRegistrationOperatorId{1081,"Invalid registration operator ID."};
|
|
||||||
static const struct msg InvalidRegistrationOperatorName{1082,"Invalid registration operator name."};
|
|
||||||
static const struct msg RegistrationNameDuplicate{1083,"Registration name must be unique."};
|
|
||||||
static const struct msg SMSMFANotEnabled{1084,"SMS is not enabled in the security service."};
|
|
||||||
static const struct msg EMailMFANotEnabled{1085,"email is not enabled in the security service."};
|
|
||||||
|
|
||||||
static const struct msg TOTInvalidCode{1086,"Invalid code."};
|
|
||||||
static const struct msg TOTInvalidIndex{1087,"Invalid index."};
|
|
||||||
static const struct msg TOTRepeatedCode{1088,"Code is repeated. Must be new code."};
|
|
||||||
static const struct msg TOTInvalidProtocol{1089,"Invalid protocol sequence."};
|
|
||||||
static const struct msg TOTNoSession{1090,"No validation session present."};
|
|
||||||
|
|
||||||
static const struct msg SignupAlreadySigned{1091,"Code is repeated. Must be new code."};
|
|
||||||
static const struct msg SignupEmailCheck{1092,"Waiting for email check completion."};
|
|
||||||
static const struct msg SignupWaitingForDevice{1093,"Waiting for device."};
|
|
||||||
|
|
||||||
static const struct msg SMSMissingPhoneNumber{1094,"Missing phone number"};
|
|
||||||
static const struct msg SMSTryLater{1095,"SMS could not be sent. Verify the number or try again later."};
|
|
||||||
static const struct msg SMSMissingChallenge{1096,"Missing 'challengeCode'"};
|
|
||||||
static const struct msg MustHaveConfigElement{1097,"Must have 'configuration' element."};
|
|
||||||
|
|
||||||
static const struct msg ModelIDListCannotBeEmpty{1098,"Model ID list cannot be empty."};
|
|
||||||
static const struct msg DefConfigNameExists{1099,"Configuration name already exists."};
|
|
||||||
|
|
||||||
static const struct msg SubNoDeviceActivated{1100,"No devices activated yet."};
|
|
||||||
static const struct msg SubConfigNotRefreshed{1101,"Configuration could not be refreshed."};
|
|
||||||
|
|
||||||
static const struct msg ProvServiceNotAvailable{1102,"Provisioning service not available yet."};
|
|
||||||
static const struct msg SSIDInvalidPassword{1103,"Invalid password length. Must be 8 characters or greater, and a maximum of 32 characters."};
|
|
||||||
static const struct msg InvalidStartingIPAddress{1104,"Invalid starting/ending IP address."};
|
|
||||||
static const struct msg SubnetFormatError{1105,"Subnet must be in format like 192.168.1.1/24."};
|
|
||||||
static const struct msg DeviceModeError{1106,"Device mode subnet must be of the form 192.168.1.1/24."};
|
|
||||||
|
|
||||||
static const struct msg BadDeviceMode{1107,"Mode must be bridge, nat, or manual."};
|
|
||||||
static const struct msg DefaultGatewayFormat{1108,"Default gateway must be in format like 192.168.1.1."};
|
|
||||||
static const struct msg PrimaryDNSFormat{1109,"Primary DNS must be an IP address i.e. 192.168.1.1."};
|
|
||||||
|
|
||||||
static const struct msg SecondaryDNSFormat{1110,"Secondary DNS must be an IP address i.e. 192.168.1.1."};
|
|
||||||
static const struct msg BadConnectionType{1111,"Internet Connection must be automatic, bridge, pppoe, or manual."};
|
|
||||||
static const struct msg InvalidDeviceID{1112,"Invalid deviceID."};
|
|
||||||
static const struct msg InvalidVisibilityAttribute{1113,"Invalid visibility attribute."};
|
|
||||||
static const struct msg UnknownConfigurationSection{1114,"Unknown section."};
|
|
||||||
|
|
||||||
static const struct msg CannotValidatePhoneNumber{1115,"Phone number could not be validated."};
|
|
||||||
static const struct msg RootUsersNoOwners{1116,"ROOT users may not have owners."};
|
|
||||||
static const struct msg PartnerMustHaveEntity{1118,"Partner user must belong to an entity."};
|
|
||||||
static const struct msg RootCannotModifyUsers{1119,"ROOT may not modify user roles."};
|
|
||||||
|
|
||||||
static const struct msg CertificateNotIssued{1120,"Certificate was not issued."};
|
|
||||||
static const struct msg IncompleteCertificate{1121,"Incomplete certificate information. Cannot be downloaded. You must delete and recreate."};
|
|
||||||
static const struct msg InvalidCertificateType{1122,"Invalid certificate type."};
|
|
||||||
static const struct msg InvalidDeviceName{1123,"Invalid device name."};
|
|
||||||
|
|
||||||
static const struct msg InvalidRedirectorName{1124,"Invalid redirector name"};
|
|
||||||
static const struct msg CommonNameAlreadyExists{1125,"A device/server of this name already exists"};
|
|
||||||
static const struct msg CertificateAlreadyExists{1126,"A certificate for this device already exists."};
|
|
||||||
static const struct msg CannotCreateCertTryAgain{1127,"Device certificate could not be created. Please try later."};
|
|
||||||
static const struct msg CouldNotRevoke{1128,"Certificate could not be revoked."};
|
|
||||||
|
|
||||||
static const struct msg CouldNotModifyCert{1129,"Certificate could not me modified. Please verify the information you supplied."};
|
|
||||||
static const struct msg BatchCertNoCreated{1130,"Certificates have not been created for this batch."};
|
|
||||||
static const struct msg BatchTooBig{1131,"Illegal number of MAC Addresses: must be between 1 and 1000."};
|
|
||||||
|
|
||||||
static const struct msg OutstandingJobs{1132,"Batch has running outstanding jobs. Please wait until job is finished."};
|
|
||||||
static const struct msg InvalidSMSNotificationList{1133,"Invalid SMS Notification list."};
|
|
||||||
static const struct msg InvalidEMailNotificationList{1134,"Invalid email Notification list."};
|
|
||||||
static const struct msg CannotChangeCommanNames{1135,"You cannot provide new/modified common names after jobs have been run for a batch."};
|
|
||||||
static const struct msg FailedToVerifyDigicert{1136,"Failed to verify the DigiCert information provided."};
|
|
||||||
static const struct msg CouldNotPerformCommand{1137,"Could not perform command."};
|
|
||||||
|
|
||||||
static const struct msg PoolNameInvalid{1138,"Pool name is invalid."};
|
|
||||||
static const struct msg InvalidRadiusProxyStrategy{1139,"Strategy name must be: random, round_robin, weighted."};
|
|
||||||
static const struct msg InvalidRadiusProxyMonitorMethod{1140,"monitorMethod must be: none, https, radius."};
|
|
||||||
static const struct msg MustHaveAtLeastOneRadiusServer{1141,"Must have at least one RADIUS server."};
|
|
||||||
static const struct msg InvalidRadiusServerEntry{1142,"RADIUS Server IP address invalid or port missing."};
|
|
||||||
static const struct msg InvalidRadiusServerWeigth{1143,"RADIUS Server IP weight cannot be 0."};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace OpenWifi::RESTAPI::Protocol {
|
|
||||||
static const char * CAPABILITIES = "capabilities";
|
|
||||||
static const char * LOGS = "logs";
|
|
||||||
static const char * HEALTHCHECKS = "healthchecks";
|
|
||||||
static const char * STATISTICS = "statistics";
|
|
||||||
static const char * STATUS = "status";
|
|
||||||
static const char * SERIALNUMBER = "serialNumber";
|
|
||||||
static const char * PERFORM = "perform";
|
|
||||||
static const char * CONFIGURE = "configure";
|
|
||||||
static const char * UPGRADE = "upgrade";
|
|
||||||
static const char * REBOOT = "reboot";
|
|
||||||
static const char * FACTORY = "factory";
|
|
||||||
static const char * LEDS = "leds";
|
|
||||||
static const char * TRACE = "trace";
|
|
||||||
static const char * REQUEST = "request";
|
|
||||||
static const char * WIFISCAN = "wifiscan";
|
|
||||||
static const char * EVENTQUEUE = "eventqueue";
|
|
||||||
static const char * RTTY = "rtty";
|
|
||||||
static const char * COMMAND = "command";
|
|
||||||
static const char * STARTDATE = "startDate";
|
|
||||||
static const char * ENDDATE = "endDate";
|
|
||||||
static const char * OFFSET = "offset";
|
|
||||||
static const char * LIMIT = "limit";
|
|
||||||
static const char * LIFETIME = "lifetime";
|
|
||||||
static const char * UUID = "UUID";
|
|
||||||
static const char * DATA = "data";
|
|
||||||
static const char * CONFIGURATION = "configuration";
|
|
||||||
static const char * WHEN = "when";
|
|
||||||
static const char * URI = "uri";
|
|
||||||
static const char * LOGTYPE = "logType";
|
|
||||||
static const char * VALUES = "values";
|
|
||||||
static const char * TYPES = "types";
|
|
||||||
static const char * PAYLOAD = "payload";
|
|
||||||
static const char * KEEPREDIRECTOR = "keepRedirector";
|
|
||||||
static const char * NETWORK = "network";
|
|
||||||
static const char * INTERFACE = "interface";
|
|
||||||
static const char * BANDS = "bands";
|
|
||||||
static const char * CHANNELS = "channels";
|
|
||||||
static const char * VERBOSE = "verbose";
|
|
||||||
static const char * MESSAGE = "message";
|
|
||||||
static const char * STATE = "state";
|
|
||||||
static const char * HEALTHCHECK = "healthcheck";
|
|
||||||
static const char * PCAP_FILE_TYPE = "pcap";
|
|
||||||
static const char * DURATION = "duration";
|
|
||||||
static const char * NUMBEROFPACKETS = "numberOfPackets";
|
|
||||||
static const char * FILTER = "filter";
|
|
||||||
static const char * SELECT = "select";
|
|
||||||
static const char * SERIALONLY = "serialOnly";
|
|
||||||
static const char * COUNTONLY = "countOnly";
|
|
||||||
static const char * DEVICEWITHSTATUS = "deviceWithStatus";
|
|
||||||
static const char * DEVICESWITHSTATUS = "devicesWithStatus";
|
|
||||||
static const char * DEVICES = "devices";
|
|
||||||
static const char * COUNT = "count";
|
|
||||||
static const char * SERIALNUMBERS = "serialNumbers";
|
|
||||||
static const char * CONFIGURATIONS = "configurations";
|
|
||||||
static const char * NAME = "name";
|
|
||||||
static const char * COMMANDS = "commands";
|
|
||||||
static const char * COMMANDUUID = "commandUUID";
|
|
||||||
static const char * FIRMWARES = "firmwares";
|
|
||||||
static const char * TOPIC = "topic";
|
|
||||||
static const char * HOST = "host";
|
|
||||||
static const char * OS = "os";
|
|
||||||
static const char * HOSTNAME = "hostname";
|
|
||||||
static const char * PROCESSORS = "processors";
|
|
||||||
static const char * REASON = "reason";
|
|
||||||
static const char * RELOAD = "reload";
|
|
||||||
static const char * SUBSYSTEMS = "subsystems";
|
|
||||||
static const char * FILEUUID = "uuid";
|
|
||||||
static const char * USERID = "userId";
|
|
||||||
static const char * PASSWORD = "password";
|
|
||||||
static const char * TOKEN = "token";
|
|
||||||
static const char * SETLOGLEVEL = "setloglevel";
|
|
||||||
static const char * GETLOGLEVELS = "getloglevels";
|
|
||||||
static const char * GETSUBSYSTEMNAMES = "getsubsystemnames";
|
|
||||||
static const char * GETLOGLEVELNAMES = "getloglevelnames";
|
|
||||||
static const char * STATS = "stats";
|
|
||||||
static const char * PING = "ping";
|
|
||||||
static const char * PARAMETERS = "parameters";
|
|
||||||
static const char * VALUE = "value";
|
|
||||||
static const char * LASTONLY = "lastOnly";
|
|
||||||
static const char * NEWEST = "newest";
|
|
||||||
static const char * ACTIVESCAN = "activeScan";
|
|
||||||
static const char * OVERRIDEDFS = "override_dfs";
|
|
||||||
static const char * LIST = "list";
|
|
||||||
static const char * TAG = "tag";
|
|
||||||
static const char * TAGLIST = "tagList";
|
|
||||||
static const char * DESCRIPTION = "description";
|
|
||||||
static const char * NOTES = "notes";
|
|
||||||
static const char * DEVICETYPE = "deviceType";
|
|
||||||
static const char * REVISION = "revision";
|
|
||||||
static const char * AGES = "ages";
|
|
||||||
static const char * REVISIONS = "revisions";
|
|
||||||
static const char * DEVICETYPES = "deviceTypes";
|
|
||||||
static const char * LATESTONLY = "latestOnly";
|
|
||||||
static const char * IDONLY = "idOnly";
|
|
||||||
static const char * REVISIONSET = "revisionSet";
|
|
||||||
static const char * DEVICESET = "deviceSet";
|
|
||||||
static const char * HISTORY = "history";
|
|
||||||
static const char * ID = "id";
|
|
||||||
static const char * VERSION = "version";
|
|
||||||
static const char * TIMES = "times";
|
|
||||||
static const char * UPTIME = "uptime";
|
|
||||||
static const char * START = "start";
|
|
||||||
static const char * DEBUG = "debug";
|
|
||||||
static const char * SCRIPT = "script";
|
|
||||||
static const char * TIMEOUT = "timeout";
|
|
||||||
|
|
||||||
static const char * NEWPASSWORD = "newPassword";
|
|
||||||
static const char * USERS = "users";
|
|
||||||
static const char * WITHEXTENDEDINFO = "withExtendedInfo";
|
|
||||||
|
|
||||||
static const char * ERRORTEXT = "errorText";
|
|
||||||
static const char * ERRORCODE = "errorCode";
|
|
||||||
static const char * AVATARID = "avatarId";
|
|
||||||
static const char * UNNAMED = "(unnamed)";
|
|
||||||
static const char * UNSPECIFIED = "(unspecified)";
|
|
||||||
static const char * CONTENTDISPOSITION = "Content-Disposition";
|
|
||||||
static const char * CONTENTTYPE = "Content-Type";
|
|
||||||
|
|
||||||
static const char * REQUIREMENTS = "requirements";
|
|
||||||
static const char * PASSWORDPATTERN = "passwordPattern";
|
|
||||||
static const char * ACCESSPOLICY = "accessPolicy";
|
|
||||||
static const char * PASSWORDPOLICY = "passwordPolicy";
|
|
||||||
static const char * FORGOTPASSWORD = "forgotPassword";
|
|
||||||
static const char * RESENDMFACODE = "resendMFACode";
|
|
||||||
static const char * COMPLETEMFACHALLENGE = "completeMFAChallenge";
|
|
||||||
static const char * ME = "me";
|
|
||||||
static const char * TELEMETRY = "telemetry";
|
|
||||||
static const char * INTERVAL = "interval";
|
|
||||||
static const char * UI = "UI";
|
|
||||||
static const char * BANDWIDTH = "bandwidth";
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol {
|
|
||||||
|
|
||||||
const int SERIAL_NUMBER_LENGTH = 30;
|
|
||||||
|
|
||||||
// vocabulary used in the PROTOCOL.md file
|
|
||||||
static const char *JSONRPC = "jsonrpc";
|
|
||||||
static const char *ID = "id";
|
|
||||||
static const char *UUID = "uuid";
|
|
||||||
static const char *JSONRPC_VERSION = "2.0";
|
|
||||||
static const char *METHOD = "method";
|
|
||||||
static const char *PARAMS = "params";
|
|
||||||
static const char *SERIAL = "serial";
|
|
||||||
static const char *FIRMWARE = "firmware";
|
|
||||||
static const char *CONNECT = "connect";
|
|
||||||
static const char *STATE = "state";
|
|
||||||
static const char *STATUS = "status";
|
|
||||||
static const char *ERROR = "error";
|
|
||||||
static const char *TEXT = "text";
|
|
||||||
static const char *HEALTHCHECK = "healthcheck";
|
|
||||||
static const char *LOG = "log";
|
|
||||||
static const char *CRASHLOG = "crashlog";
|
|
||||||
static const char *PING = "ping";
|
|
||||||
static const char *CFGPENDING = "cfgpending";
|
|
||||||
static const char *RECOVERY = "recovery";
|
|
||||||
static const char *COMPRESS_64 = "compress_64";
|
|
||||||
static const char *CAPABILITIES = "capabilities";
|
|
||||||
static const char *REQUEST_UUID = "request_uuid";
|
|
||||||
static const char *SANITY = "sanity";
|
|
||||||
static const char *DATA = "data";
|
|
||||||
static const char *LOGLINES = "loglines";
|
|
||||||
static const char *SEVERITY = "severity";
|
|
||||||
static const char *ACTIVE = "active";
|
|
||||||
static const char *OVERRIDEDFS = "override_dfs";
|
|
||||||
static const char *REBOOT = "reboot";
|
|
||||||
static const char *WHEN = "when";
|
|
||||||
static const char *CONFIG = "config";
|
|
||||||
static const char *EMPTY_JSON_DOC = "{}";
|
|
||||||
static const char *RESULT = "result";
|
|
||||||
static const char *RESULT_64 = "result_64";
|
|
||||||
static const char *RESULT_SZ = "result_sz";
|
|
||||||
static const char *REQUEST = "request";
|
|
||||||
static const char *PERFORM = "perform";
|
|
||||||
static const char *CONFIGURE = "configure";
|
|
||||||
static const char *PENDING = "pending";
|
|
||||||
static const char *SUBMITTED_BY_SYSTEM = "*system";
|
|
||||||
static const char *URI = "uri";
|
|
||||||
static const char *COMMAND = "command";
|
|
||||||
static const char *PAYLOAD = "payload";
|
|
||||||
static const char *KEEP_REDIRECTOR = "keep_redirector";
|
|
||||||
static const char *DURATION = "duration";
|
|
||||||
static const char *PATTERN = "pattern";
|
|
||||||
static const char *LEDS = "leds";
|
|
||||||
static const char *DEBUG = "debug";
|
|
||||||
static const char *ON = "on";
|
|
||||||
static const char *OFF = "off";
|
|
||||||
static const char *BLINK = "blink";
|
|
||||||
static const char *PACKETS = "packets";
|
|
||||||
static const char *NETWORK = "network";
|
|
||||||
static const char *INTERFACE = "interface";
|
|
||||||
static const char *TRACE = "trace";
|
|
||||||
static const char *WIFISCAN = "wifiscan";
|
|
||||||
static const char *TYPES = "types";
|
|
||||||
static const char *EVENT = "event";
|
|
||||||
static const char *MESSAGE = "message";
|
|
||||||
static const char *RTTY = "rtty";
|
|
||||||
static const char *TOKEN = "token";
|
|
||||||
static const char *SERVER = "server";
|
|
||||||
static const char *PORT = "port";
|
|
||||||
static const char *USER = "user";
|
|
||||||
static const char *TIMEOUT = "timeout";
|
|
||||||
static const char *UPGRADE = "upgrade";
|
|
||||||
static const char *FACTORY = "factory";
|
|
||||||
static const char *VERBOSE = "verbose";
|
|
||||||
static const char *BANDS = "bands";
|
|
||||||
static const char *CHANNELS = "channels";
|
|
||||||
static const char *PASSWORD = "password";
|
|
||||||
static const char *DEVICEUPDATE = "deviceupdate";
|
|
||||||
|
|
||||||
static const char *SERIALNUMBER = "serialNumber";
|
|
||||||
static const char *COMPATIBLE = "compatible";
|
|
||||||
static const char *DISCONNECTION = "disconnection";
|
|
||||||
static const char *TIMESTAMP = "timestamp";
|
|
||||||
static const char *SYSTEM = "system";
|
|
||||||
static const char *HOST = "host";
|
|
||||||
static const char *CONNECTIONIP = "connectionIp";
|
|
||||||
static const char *TELEMETRY = "telemetry";
|
|
||||||
static const char *BANDWIDTH = "bandwidth";
|
|
||||||
|
|
||||||
static const char *SCRIPT = "script";
|
|
||||||
static const char *TYPE = "type";
|
|
||||||
|
|
||||||
static const char *RADIUS = "radius";
|
|
||||||
static const char *RADIUSDATA = "data";
|
|
||||||
static const char *RADIUSACCT = "acct";
|
|
||||||
static const char *RADIUSAUTH = "auth";
|
|
||||||
static const char *RADIUSDST = "dst";
|
|
||||||
static const char *IES = "ies";
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol::Events {
|
|
||||||
|
|
||||||
static const char *CONNECT = "connect";
|
|
||||||
static const char *STATE = "state";
|
|
||||||
static const char *HEALTHCHECK = "healthcheck";
|
|
||||||
static const char *LOG = "log";
|
|
||||||
static const char *CRASHLOG = "crashlog";
|
|
||||||
static const char *PING = "ping";
|
|
||||||
static const char *CFGPENDING = "cfgpending";
|
|
||||||
static const char *RECOVERY = "recovery";
|
|
||||||
static const char *TELEMETRY = "telemetry";
|
|
||||||
static const char *DEVICEUPDATE = "deviceupdate";
|
|
||||||
|
|
||||||
enum EVENT_MSG {
|
|
||||||
ET_UNKNOWN,
|
|
||||||
ET_CONNECT,
|
|
||||||
ET_STATE,
|
|
||||||
ET_HEALTHCHECK,
|
|
||||||
ET_LOG,
|
|
||||||
ET_CRASHLOG,
|
|
||||||
ET_PING,
|
|
||||||
ET_CFGPENDING,
|
|
||||||
ET_RECOVERY,
|
|
||||||
ET_DEVICEUPDATE,
|
|
||||||
ET_TELEMETRY
|
|
||||||
};
|
|
||||||
|
|
||||||
inline EVENT_MSG EventFromString(const std::string & Method) {
|
|
||||||
if(strcmp(STATE,Method.c_str())==0)
|
|
||||||
return ET_STATE;
|
|
||||||
else if(strcmp(HEALTHCHECK,Method.c_str())==0)
|
|
||||||
return ET_HEALTHCHECK;
|
|
||||||
else if(strcmp(CONNECT,Method.c_str())==0)
|
|
||||||
return ET_CONNECT;
|
|
||||||
else if(strcmp(CFGPENDING,Method.c_str())==0)
|
|
||||||
return ET_CFGPENDING;
|
|
||||||
else if(strcmp(CRASHLOG,Method.c_str())==0)
|
|
||||||
return ET_CRASHLOG;
|
|
||||||
else if(strcmp(DEVICEUPDATE,Method.c_str())==0)
|
|
||||||
return ET_DEVICEUPDATE;
|
|
||||||
else if(strcmp(LOG,Method.c_str())==0)
|
|
||||||
return ET_LOG;
|
|
||||||
else if(strcmp(PING,Method.c_str())==0)
|
|
||||||
return ET_PING;
|
|
||||||
else if(strcmp(RECOVERY,Method.c_str())==0)
|
|
||||||
return ET_RECOVERY;
|
|
||||||
else if(strcmp(TELEMETRY,Method.c_str())==0)
|
|
||||||
return ET_TELEMETRY;
|
|
||||||
return ET_UNKNOWN;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace OpenWifi::Provisioning::DeviceClass {
|
|
||||||
|
|
||||||
static const char * ANY = "any";
|
|
||||||
static const char * SUBSCRIBER = "subscriber";
|
|
||||||
static const char * VENUE = "venue";
|
|
||||||
static const char * ENTITY = "entity";
|
|
||||||
|
|
||||||
inline bool Validate(const char *s) {
|
|
||||||
static std::vector<std::string> Values{ ANY, ENTITY, SUBSCRIBER, VENUE };
|
|
||||||
return std::find(cbegin(Values), cend(Values), s) != cend(Values);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__GNUC__ )
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__clang__)
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
134
src/framework/uCentral_Protocol.h
Normal file
134
src/framework/uCentral_Protocol.h
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
//
|
||||||
|
// License type: BSD 3-Clause License
|
||||||
|
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||||
|
//
|
||||||
|
// Created by Stephane Bourque on 2021-03-04.
|
||||||
|
// Arilia Wireless Inc.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALGW_UCENTRALPROTOCOL_H
|
||||||
|
#define UCENTRALGW_UCENTRALPROTOCOL_H
|
||||||
|
|
||||||
|
#include "Poco/String.h"
|
||||||
|
|
||||||
|
namespace OpenWifi::uCentralProtocol {
|
||||||
|
|
||||||
|
const int SERIAL_NUMBER_LENGTH = 30;
|
||||||
|
|
||||||
|
// vocabulary used in the PROTOCOL.md file
|
||||||
|
static const char * JSONRPC = "jsonrpc";
|
||||||
|
static const char * ID = "id";
|
||||||
|
static const char * UUID = "uuid";
|
||||||
|
static const char * JSONRPC_VERSION = "2.0";
|
||||||
|
static const char * METHOD = "method";
|
||||||
|
static const char * PARAMS = "params";
|
||||||
|
static const char * SERIAL = "serial";
|
||||||
|
static const char * FIRMWARE = "firmware";
|
||||||
|
static const char * CONNECT = "connect";
|
||||||
|
static const char * STATE = "state";
|
||||||
|
static const char * HEALTHCHECK = "healthcheck";
|
||||||
|
static const char * LOG = "log";
|
||||||
|
static const char * CRASHLOG = "crashlog";
|
||||||
|
static const char * PING = "ping";
|
||||||
|
static const char * CFGPENDING = "cfgpending";
|
||||||
|
static const char * RECOVERY = "recovery";
|
||||||
|
static const char * COMPRESS_64 = "compress_64";
|
||||||
|
static const char * CAPABILITIES = "capabilities";
|
||||||
|
static const char * REQUEST_UUID = "request_uuid";
|
||||||
|
static const char * SANITY = "sanity";
|
||||||
|
static const char * DATA = "data";
|
||||||
|
static const char * LOGLINES = "loglines";
|
||||||
|
static const char * SEVERITY = "severity";
|
||||||
|
static const char * ACTIVE = "active";
|
||||||
|
static const char * REBOOT = "reboot";
|
||||||
|
static const char * WHEN = "when";
|
||||||
|
static const char * CONFIG = "config";
|
||||||
|
static const char * EMPTY_JSON_DOC = "{}";
|
||||||
|
static const char * RESULT = "result";
|
||||||
|
static const char * REQUEST = "request";
|
||||||
|
static const char * PERFORM = "perform";
|
||||||
|
static const char * CONFIGURE = "configure";
|
||||||
|
static const char * PENDING = "pending";
|
||||||
|
static const char * SUBMITTED_BY_SYSTEM = "*system";
|
||||||
|
static const char * URI = "uri";
|
||||||
|
static const char * COMMAND = "command";
|
||||||
|
static const char * PAYLOAD = "payload";
|
||||||
|
static const char * KEEP_REDIRECTOR = "keep_redirector";
|
||||||
|
static const char * DURATION = "duration";
|
||||||
|
static const char * PATTERN = "pattern";
|
||||||
|
static const char * LEDS = "leds";
|
||||||
|
static const char * ON = "on";
|
||||||
|
static const char * OFF = "off";
|
||||||
|
static const char * BLINK = "blink";
|
||||||
|
static const char * PACKETS = "packets";
|
||||||
|
static const char * NETWORK = "network";
|
||||||
|
static const char * INTERFACE = "interface";
|
||||||
|
static const char * TRACE = "trace";
|
||||||
|
static const char * WIFISCAN = "wifiscan";
|
||||||
|
static const char * TYPES = "types";
|
||||||
|
static const char * EVENT = "event";
|
||||||
|
static const char * MESSAGE = "message";
|
||||||
|
static const char * RTTY = "rtty";
|
||||||
|
static const char * TOKEN = "token";
|
||||||
|
static const char * SERVER = "server";
|
||||||
|
static const char * PORT = "port";
|
||||||
|
static const char * USER = "user";
|
||||||
|
static const char * TIMEOUT = "timeout";
|
||||||
|
static const char * UPGRADE = "upgrade";
|
||||||
|
static const char * FACTORY = "factory";
|
||||||
|
static const char * VERBOSE = "verbose";
|
||||||
|
static const char * BANDS = "bands";
|
||||||
|
static const char * CHANNELS = "channels";
|
||||||
|
static const char * PASSWORD = "password";
|
||||||
|
static const char * DEVICEUPDATE = "deviceupdate";
|
||||||
|
|
||||||
|
static const char * SERIALNUMBER = "serialNumber";
|
||||||
|
static const char * COMPATIBLE = "compatible";
|
||||||
|
static const char * DISCONNECTION = "disconnection";
|
||||||
|
static const char * TIMESTAMP = "timestamp";
|
||||||
|
static const char * SYSTEM = "system";
|
||||||
|
static const char * HOST = "host";
|
||||||
|
static const char * CONNECTIONIP = "connectionIp";
|
||||||
|
static const char * TELEMETRY = "telemetry";
|
||||||
|
|
||||||
|
enum EVENT_MSG {
|
||||||
|
ET_UNKNOWN,
|
||||||
|
ET_CONNECT,
|
||||||
|
ET_STATE,
|
||||||
|
ET_HEALTHCHECK,
|
||||||
|
ET_LOG,
|
||||||
|
ET_CRASHLOG,
|
||||||
|
ET_PING,
|
||||||
|
ET_CFGPENDING,
|
||||||
|
ET_RECOVERY,
|
||||||
|
ET_DEVICEUPDATE,
|
||||||
|
ET_TELEMETRY
|
||||||
|
};
|
||||||
|
|
||||||
|
inline static EVENT_MSG EventFromString(const std::string & Method) {
|
||||||
|
if (!Poco::icompare(Method, CONNECT)) {
|
||||||
|
return ET_CONNECT;
|
||||||
|
} else if (!Poco::icompare(Method, STATE)) {
|
||||||
|
return ET_STATE;
|
||||||
|
} else if (!Poco::icompare(Method, HEALTHCHECK)) {
|
||||||
|
return ET_HEALTHCHECK;
|
||||||
|
} else if (!Poco::icompare(Method, LOG)) {
|
||||||
|
return ET_LOG;
|
||||||
|
} else if (!Poco::icompare(Method, CRASHLOG)) {
|
||||||
|
return ET_CRASHLOG;
|
||||||
|
} else if (!Poco::icompare(Method, PING)) {
|
||||||
|
return ET_PING;
|
||||||
|
} else if (!Poco::icompare(Method, CFGPENDING)) {
|
||||||
|
return ET_CFGPENDING;
|
||||||
|
} else if (!Poco::icompare(Method, RECOVERY)) {
|
||||||
|
return ET_RECOVERY;
|
||||||
|
} else if (!Poco::icompare(Method, DEVICEUPDATE)) {
|
||||||
|
return ET_DEVICEUPDATE;
|
||||||
|
} else if (!Poco::icompare(Method, TELEMETRY)) {
|
||||||
|
return ET_TELEMETRY;
|
||||||
|
} else
|
||||||
|
return ET_UNKNOWN;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // UCENTRALGW_UCENTRALPROTOCOL_H
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-29.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "orm_deviceInfo.h"
|
|
||||||
#include "StorageService.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
"serialNumber varchar(36) UNIQUE PRIMARY KEY, "
|
|
||||||
"revision varchar, "
|
|
||||||
"deviceType varchar, "
|
|
||||||
"endPoint varchar, "
|
|
||||||
"lastUpdate bigint, "
|
|
||||||
"status varchar "
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
static ORM::FieldVec DevicesDB_Fields{
|
|
||||||
ORM::Field{"serialNumber", 36, true},
|
|
||||||
ORM::Field{"revision", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"deviceType", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"endPoint", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"lastUpdate", ORM::FieldType::FT_BIGINT},
|
|
||||||
ORM::Field{"status", ORM::FieldType::FT_TEXT}
|
|
||||||
};
|
|
||||||
|
|
||||||
DevicesDB::DevicesDB(OpenWifi::DBType T,
|
|
||||||
Poco::Data::SessionPool &P, Poco::Logger &L) :
|
|
||||||
DB(T, "devices", DevicesDB_Fields,{}, P, L, "fdi") {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DevicesDB::SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint) {
|
|
||||||
FMSObjects::DeviceConnectionInformation D;
|
|
||||||
if(GetRecord("serialNumber", SerialNumber, D)) {
|
|
||||||
if(D.revision!=Revision) {
|
|
||||||
StorageService()->HistoryDB().AddHistory(SerialNumber, DeviceType, D.revision, Revision);
|
|
||||||
}
|
|
||||||
D.revision = Revision;
|
|
||||||
D.deviceType = DeviceType;
|
|
||||||
D.endPoint = EndPoint;
|
|
||||||
D.status = "connected";
|
|
||||||
return UpdateRecord("serialNumber", SerialNumber, D);
|
|
||||||
} else {
|
|
||||||
FMSObjects::DeviceConnectionInformation DI{
|
|
||||||
.serialNumber = SerialNumber,
|
|
||||||
.revision = Revision,
|
|
||||||
.deviceType = DeviceType,
|
|
||||||
.endPoint = EndPoint,
|
|
||||||
.lastUpdate = (uint64_t)OpenWifi::Now(),
|
|
||||||
.status = "connected"};
|
|
||||||
return CreateRecord(DI);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DevicesDB::DeleteDevice( std::string & SerialNumber) {
|
|
||||||
return DeleteRecord("serialNumber", SerialNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DevicesDB::SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint) {
|
|
||||||
FMSObjects::DeviceConnectionInformation D;
|
|
||||||
if(GetRecord("serialNumber", SerialNumber, D)) {
|
|
||||||
D.status = "not connected";
|
|
||||||
D.endPoint = EndPoint;
|
|
||||||
return UpdateRecord("serialNumber", SerialNumber, D);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DevicesDB::GetDevices(uint64_t From, uint64_t HowMany, std::vector<FMSObjects::DeviceConnectionInformation> & Devices) {
|
|
||||||
return GetRecords(From, HowMany, Devices, "", " ORDER BY SerialNumber ASC ");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DevicesDB::GetDevice(std::string &SerialNumber, FMSObjects::DeviceConnectionInformation & Device) {
|
|
||||||
return GetRecord("serialNumber", SerialNumber, Device);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DevicesDB::GenerateDeviceReport(FMSObjects::DeviceReport &Report) {
|
|
||||||
Iterate([&Report](const FMSObjects::DeviceConnectionInformation &D) {
|
|
||||||
Report.numberOfDevices++;
|
|
||||||
UpdateCountedMap(Report.DeviceTypes_, D.deviceType);
|
|
||||||
UpdateCountedMap(Report.Revisions_, D.revision);
|
|
||||||
UpdateCountedMap(Report.Status_, D.status);
|
|
||||||
UpdateCountedMap(Report.EndPoints_, D.endPoint);
|
|
||||||
UpdateCountedMap(Report.OUI_, D.serialNumber.substr(0, 6));
|
|
||||||
FMSObjects::FirmwareAgeDetails Age;
|
|
||||||
if (StorageService()->FirmwaresDB().ComputeFirmwareAge(D.deviceType, D.revision, Age)) {
|
|
||||||
if (Age.latest) {
|
|
||||||
UpdateCountedMap(Report.UsingLatest_, D.revision);
|
|
||||||
} else if (Age.age == 0) {
|
|
||||||
UpdateCountedMap(Report.UnknownFirmwares_, D.revision);
|
|
||||||
} else {
|
|
||||||
UpdateCountedMap(Report.totalSecondsOld_,"total_seconds", Age.age);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
template<> void ORM::DB<OpenWifi::DevicesRecordTuple, OpenWifi::FMSObjects::DeviceConnectionInformation>::Convert(const OpenWifi::DevicesRecordTuple &T, OpenWifi::FMSObjects::DeviceConnectionInformation &F ) {
|
|
||||||
F.serialNumber = T.get<0>();
|
|
||||||
F.revision = T.get<1>();
|
|
||||||
F.deviceType = T.get<2>();
|
|
||||||
F.endPoint = T.get<3>();
|
|
||||||
F.lastUpdate = T.get<4>();
|
|
||||||
F.status = T.get<5>();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void ORM::DB<OpenWifi::DevicesRecordTuple, OpenWifi::FMSObjects::DeviceConnectionInformation>::Convert(const OpenWifi::FMSObjects::DeviceConnectionInformation &F, OpenWifi::DevicesRecordTuple &T ) {
|
|
||||||
T.set<0>(F.serialNumber);
|
|
||||||
T.set<1>(F.revision);
|
|
||||||
T.set<2>(F.deviceType);
|
|
||||||
T.set<3>(F.endPoint);
|
|
||||||
T.set<4>(F.lastUpdate);
|
|
||||||
T.set<5>(F.status);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-29.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "framework/orm.h"
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
typedef Poco::Tuple<
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
uint64_t,
|
|
||||||
std::string> DevicesRecordTuple;
|
|
||||||
typedef std::vector<DevicesRecordTuple> DevicesRecordTupleList;
|
|
||||||
|
|
||||||
class DevicesDB : public ORM::DB<DevicesRecordTuple, FMSObjects::DeviceConnectionInformation> {
|
|
||||||
public:
|
|
||||||
DevicesDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
|
|
||||||
virtual ~DevicesDB() {};
|
|
||||||
bool SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint);
|
|
||||||
bool DeleteDevice( std::string & SerialNumber);
|
|
||||||
bool SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint);
|
|
||||||
bool GetDevices(uint64_t From, uint64_t HowMany, std::vector<FMSObjects::DeviceConnectionInformation> & Devices);
|
|
||||||
bool GetDevice(std::string &SerialNumber, FMSObjects::DeviceConnectionInformation & Device);
|
|
||||||
bool GenerateDeviceReport(FMSObjects::DeviceReport &Report);
|
|
||||||
|
|
||||||
private:
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-28.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "orm_firmwares.h"
|
|
||||||
#include "LatestFirmwareCache.h"
|
|
||||||
#include "ManifestCreator.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
"Id varchar(36) UNIQUE PRIMARY KEY, "
|
|
||||||
"release varchar, "
|
|
||||||
"deviceType varchar, "
|
|
||||||
"description varchar, "
|
|
||||||
"revision varchar, "
|
|
||||||
"uri varchar, "
|
|
||||||
"image varchar, "
|
|
||||||
"imageDate bigint, "
|
|
||||||
"size bigint, "
|
|
||||||
"downloadCount bigint, "
|
|
||||||
"firmwareHash varchar, "
|
|
||||||
"owner varchar, "
|
|
||||||
"location varchar, "
|
|
||||||
"uploader varchar, "
|
|
||||||
"digest varchar, "
|
|
||||||
"latest boolean, "
|
|
||||||
"notes text, "
|
|
||||||
"created bigint"
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
static ORM::FieldVec FirmwaresDB_Fields{
|
|
||||||
ORM::Field{"id", 36, true},
|
|
||||||
ORM::Field{"release", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"deviceType", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"description", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"revision", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"uri", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"image", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"imageDate", ORM::FieldType::FT_BIGINT},
|
|
||||||
ORM::Field{"size", ORM::FieldType::FT_BIGINT},
|
|
||||||
ORM::Field{"downloadCount", ORM::FieldType::FT_BIGINT},
|
|
||||||
ORM::Field{"firmwareHash", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"owner", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"location", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"uploader", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"digest", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"latest", ORM::FieldType::FT_BOOLEAN},
|
|
||||||
ORM::Field{"notes", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"created", ORM::FieldType::FT_BIGINT}
|
|
||||||
};
|
|
||||||
|
|
||||||
FirmwaresDB::FirmwaresDB(OpenWifi::DBType T,
|
|
||||||
Poco::Data::SessionPool &P, Poco::Logger &L) :
|
|
||||||
DB(T, "firmwares", FirmwaresDB_Fields,{}, P, L, "fws") {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::AddFirmware(FMSObjects::Firmware & F) {
|
|
||||||
// find the older software and change to latest = 0
|
|
||||||
F.id = MicroService::CreateUUID();
|
|
||||||
if (LatestFirmwareCache()->AddToCache(F.deviceType, F.revision, F.id, F.imageDate)) {
|
|
||||||
F.latest = true;
|
|
||||||
std::vector<FMSObjects::Firmware> Fs;
|
|
||||||
std::string WhereClause{" deviceType='" + F.deviceType + "' AND Latest=true "};
|
|
||||||
if (GetRecords(0, 200, Fs, WhereClause)) {
|
|
||||||
for (auto &i: Fs) {
|
|
||||||
i.latest = false;
|
|
||||||
UpdateRecord("id", i.id, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
F.latest = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CreateRecord(F);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::UpdateFirmware(std::string & Id, FMSObjects::Firmware & F) {
|
|
||||||
return UpdateRecord("id",Id, F);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::DeleteFirmware(std::string & Id) {
|
|
||||||
return DeleteRecord("id", Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FirmwaresDB::RemoveOldFirmware() {
|
|
||||||
uint64_t Limit = OpenWifi::Now() - ManifestCreator()->MaxAge();
|
|
||||||
std::string WhereClause{"imageDate < " + std::to_string(Limit)};
|
|
||||||
DeleteRecords(WhereClause);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::GetFirmware(std::string & Id, FMSObjects::Firmware & F) {
|
|
||||||
return GetRecord("id", Id, F);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::GetFirmwareByName(const std::string & Release, const std::string &DeviceType, FMSObjects::Firmware & Firmware ) {
|
|
||||||
std::string WhereClause{" release='" + Release + "' and DeviceType='" + DeviceType + "' "};
|
|
||||||
std::vector<FMSObjects::Firmware> Fs;
|
|
||||||
if(GetRecords(0,2,Fs,WhereClause)) {
|
|
||||||
Firmware = Fs[0];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::GetFirmwareByRevision(const std::string & Revision, const std::string &DeviceType,FMSObjects::Firmware & Firmware ) {
|
|
||||||
std::string WhereClause{" Revision='" + Revision + "' and DeviceType='" + DeviceType + "' "};
|
|
||||||
std::vector<FMSObjects::Firmware> Fs;
|
|
||||||
if (GetRecords(0, 2, Fs, WhereClause)) {
|
|
||||||
Firmware = Fs[0];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::GetFirmwares(uint64_t From, uint64_t HowMany, const std::string & Compatible, FMSObjects::FirmwareVec & Firmwares) {
|
|
||||||
if(Compatible.empty()) {
|
|
||||||
GetRecords(From, HowMany, Firmwares);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
std::string WhereClause{ " DeviceType='" + Compatible + "' "};
|
|
||||||
GetRecords(From, HowMany, Firmwares, WhereClause);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FirmwaresDB::PopulateLatestFirmwareCache() {
|
|
||||||
Iterate([](const OpenWifi::FMSObjects::Firmware &F){
|
|
||||||
LatestFirmwareCache()->AddToCache(F.deviceType, F.revision, F.id, F.imageDate);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FirmwaresDB::ComputeFirmwareAge(const std::string & DeviceType, const std::string & Revision, FMSObjects::FirmwareAgeDetails &AgeDetails) {
|
|
||||||
try {
|
|
||||||
FMSObjects::Firmware CurrentFirmware;
|
|
||||||
FMSObjects::Firmware LatestFirmware;
|
|
||||||
bool CurrentFirmwareExists = false;
|
|
||||||
|
|
||||||
if(GetFirmwareByRevision(Revision,DeviceType,CurrentFirmware)) {
|
|
||||||
CurrentFirmwareExists = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
LatestFirmwareCacheEntry LE;
|
|
||||||
if(LatestFirmwareCache()->FindLatestFirmware(DeviceType,LE)) {
|
|
||||||
// std::cout << "LE.id" << LE.Id << std::endl;
|
|
||||||
|
|
||||||
if(GetFirmware(LE.Id, LatestFirmware)) {
|
|
||||||
AgeDetails.imageDate = LatestFirmware.imageDate;
|
|
||||||
AgeDetails.uri = LatestFirmware.uri;
|
|
||||||
AgeDetails.image = LatestFirmware.image;
|
|
||||||
AgeDetails.revision = LatestFirmware.revision;
|
|
||||||
AgeDetails.latestId = LatestFirmware.id;
|
|
||||||
// std::cout << " Revision='" << Revision << "'" << std::endl;
|
|
||||||
// std::cout << "LF Revision='" << LatestFirmware.revision << "'" << std::endl;
|
|
||||||
|
|
||||||
AgeDetails.latest = (Revision == LatestFirmware.revision);
|
|
||||||
// std::cout << "Latest=" << AgeDetails.latest << std::endl;
|
|
||||||
AgeDetails.age = CurrentFirmwareExists ? (LatestFirmware.imageDate - CurrentFirmware.imageDate) : 0;
|
|
||||||
//std::cout << "Revision: '" << Revision << "' vs '" << LatestFirmware.revision << "'" << std::endl;
|
|
||||||
//if (AgeDetails.latest)
|
|
||||||
// std::cout << "Found latest firmware" << std::endl;
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
// std::cout << "Cannot find firmware: " << LE.Id << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger().log(E);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void ORM::DB<OpenWifi::FirmwaresRecordTuple, OpenWifi::FMSObjects::Firmware>::Convert(const OpenWifi::FirmwaresRecordTuple &T, OpenWifi::FMSObjects::Firmware &F ) {
|
|
||||||
F.id = T.get<0>();
|
|
||||||
F.release = T.get<1>();
|
|
||||||
F.deviceType = T.get<2>();
|
|
||||||
F.description = T.get<3>();
|
|
||||||
F.revision = T.get<4>();
|
|
||||||
F.uri = T.get<5>();
|
|
||||||
F.image = T.get<6>();
|
|
||||||
F.imageDate = T.get<7>();
|
|
||||||
F.size = T.get<8>();
|
|
||||||
F.downloadCount = T.get<9>();
|
|
||||||
F.firmwareHash = T.get<10>();
|
|
||||||
F.owner = T.get<11>();
|
|
||||||
F.location = T.get<12>();
|
|
||||||
F.uploader = T.get<13>();
|
|
||||||
F.digest = T.get<14>();
|
|
||||||
F.latest = T.get<15>();
|
|
||||||
F.notes = OpenWifi::RESTAPI_utils::to_object_array<OpenWifi::SecurityObjects::NoteInfo>(T.get<16>());
|
|
||||||
F.created = T.get<17>();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void ORM::DB<OpenWifi::FirmwaresRecordTuple, OpenWifi::FMSObjects::Firmware>::Convert(const OpenWifi::FMSObjects::Firmware &F, OpenWifi::FirmwaresRecordTuple &T ) {
|
|
||||||
T.set<0>(F.id);
|
|
||||||
T.set<1>(F.release);
|
|
||||||
T.set<2>(F.deviceType);
|
|
||||||
T.set<3>(F.description);
|
|
||||||
T.set<4>(F.revision);
|
|
||||||
T.set<5>(F.uri);
|
|
||||||
T.set<6>(F.image);
|
|
||||||
T.set<7>(F.imageDate);
|
|
||||||
T.set<8>(F.size);
|
|
||||||
T.set<9>(F.downloadCount);
|
|
||||||
T.set<10>(F.firmwareHash);
|
|
||||||
T.set<11>(F.owner);
|
|
||||||
T.set<12>(F.location);
|
|
||||||
T.set<13>(F.uploader);
|
|
||||||
T.set<14>(F.digest);
|
|
||||||
T.set<15>(F.latest);
|
|
||||||
T.set<16>(OpenWifi::RESTAPI_utils::to_string(F.notes));
|
|
||||||
T.set<17>(F.created);
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-28.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "framework/orm.h"
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
typedef Poco::Tuple<
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
uint64_t,
|
|
||||||
uint64_t,
|
|
||||||
uint64_t,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::string,
|
|
||||||
uint64_t> FirmwaresRecordTuple;
|
|
||||||
typedef std::vector <FirmwaresRecordTuple> FirmwaresRecordTupleList;
|
|
||||||
|
|
||||||
class FirmwaresDB : public ORM::DB<FirmwaresRecordTuple, FMSObjects::Firmware> {
|
|
||||||
public:
|
|
||||||
FirmwaresDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
|
|
||||||
virtual ~FirmwaresDB() {};
|
|
||||||
|
|
||||||
bool AddFirmware(FMSObjects::Firmware & F);
|
|
||||||
bool UpdateFirmware(std::string & ID, FMSObjects::Firmware & F);
|
|
||||||
bool DeleteFirmware(std::string & ID);
|
|
||||||
void RemoveOldFirmware();
|
|
||||||
bool GetFirmware(std::string & ID, FMSObjects::Firmware & F);
|
|
||||||
bool GetFirmwareByName(const std::string & Release, const std::string &DeviceType, FMSObjects::Firmware & Firmware );
|
|
||||||
bool GetFirmwareByRevision(const std::string & Revision, const std::string &DeviceType,FMSObjects::Firmware & Firmware );
|
|
||||||
bool GetFirmwares(uint64_t From, uint64_t HowMany, const std::string & Compatible, FMSObjects::FirmwareVec & Firmwares);
|
|
||||||
void PopulateLatestFirmwareCache();
|
|
||||||
bool ComputeFirmwareAge(const std::string & DeviceType, const std::string & Revision, FMSObjects::FirmwareAgeDetails &AgeDetails);
|
|
||||||
|
|
||||||
private:
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-28.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "orm_history.h"
|
|
||||||
#include "StorageService.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
"id varchar(36) UNIQUE PRIMARY KEY, "
|
|
||||||
"serialNumber varchar, "
|
|
||||||
"fromRelease varchar, "
|
|
||||||
"toRelease varchar, "
|
|
||||||
"commandUUID varchar, "
|
|
||||||
"revisionId varchar, "
|
|
||||||
"upgraded bigint "
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
static ORM::FieldVec HistoryDB_Fields{
|
|
||||||
ORM::Field{"id", 36, true},
|
|
||||||
ORM::Field{"serialNumber", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"fromRelease", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"toRelease", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"commandUUID", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"revisionId", ORM::FieldType::FT_TEXT},
|
|
||||||
ORM::Field{"upgraded", ORM::FieldType::FT_BIGINT}
|
|
||||||
};
|
|
||||||
|
|
||||||
HistoryDB::HistoryDB(OpenWifi::DBType T,
|
|
||||||
Poco::Data::SessionPool &P, Poco::Logger &L) :
|
|
||||||
DB(T, "history", HistoryDB_Fields,{}, P, L, "his") {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::GetHistory(const std::string &SerialNumber, uint64_t From, uint64_t HowMany,
|
|
||||||
FMSObjects::RevisionHistoryEntryVec &History) {
|
|
||||||
std::string WhereClause{" serialNumber='" + SerialNumber + "' "};
|
|
||||||
std::string OrderBy{ " order by upgraded DESC "};
|
|
||||||
return GetRecords(From, HowMany, History, WhereClause, OrderBy);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::AddHistory(FMSObjects::RevisionHistoryEntry &History) {
|
|
||||||
return CreateRecord(History);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::AddHistory(const std::string &SerialNumber, const std::string &DeviceType, const std::string &PreviousRevision,
|
|
||||||
const std::string &NewVersion) {
|
|
||||||
|
|
||||||
FMSObjects::RevisionHistoryEntry History{
|
|
||||||
.id = MicroService::CreateUUID(),
|
|
||||||
.serialNumber = SerialNumber,
|
|
||||||
.fromRelease = PreviousRevision,
|
|
||||||
.toRelease = NewVersion,
|
|
||||||
.commandUUID = "",
|
|
||||||
.revisionId = "",
|
|
||||||
.upgraded = OpenWifi::Now()};
|
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
|
||||||
if (StorageService()->FirmwaresDB().GetFirmwareByRevision(NewVersion, DeviceType, F)) {
|
|
||||||
History.revisionId = F.id;
|
|
||||||
} else {
|
|
||||||
History.revisionId = "unknown";
|
|
||||||
}
|
|
||||||
return AddHistory(History);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::DeleteHistory([[maybe_unused]] const std::string &SerialNumber, const std::string &Id) {
|
|
||||||
return DeleteRecord("id", Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::DeleteHistory(const std::string &SerialNumber) {
|
|
||||||
std::string WhereClause{" serialNumber='" + SerialNumber + "' "};
|
|
||||||
return DeleteRecords(WhereClause);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::GetUnknownDeviceFirmwares(uint64_t offset, uint64_t limit,
|
|
||||||
std::vector<FMSObjects::DeviceCurrentInfo> &Devices) {
|
|
||||||
|
|
||||||
typedef Poco::Tuple<std::string, std::string, uint64_t > RecInfo;
|
|
||||||
std::vector<RecInfo> RecList;
|
|
||||||
|
|
||||||
try {
|
|
||||||
Poco::Data::Session sql_session = Pool_.get();
|
|
||||||
auto sql_query = fmt::format("select max(upgraded), serialnumber from history where revisionid='unknown' group by serialnumber order by serialnumber offset={} limit={};)", offset, limit);
|
|
||||||
Poco::Data::Statement sql_statement(sql_session);
|
|
||||||
|
|
||||||
sql_statement << sql_query,
|
|
||||||
Poco::Data::Keywords::into(RecList),
|
|
||||||
Poco::Data::Keywords::now;
|
|
||||||
|
|
||||||
for(const auto &record:RecList) {
|
|
||||||
FMSObjects::DeviceCurrentInfo entry{
|
|
||||||
.serialNumber = record.get<1>(),
|
|
||||||
.revision = "unknown",
|
|
||||||
.upgraded = record.get<2>()
|
|
||||||
};
|
|
||||||
Devices.emplace_back(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger().log(E);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HistoryDB::GetDeviceFirmwares(uint64_t offset, uint64_t limit,
|
|
||||||
std::vector<FMSObjects::DeviceCurrentInfo> &Devices) {
|
|
||||||
|
|
||||||
typedef Poco::Tuple<uint64_t, std::string, std::string> RecInfo;
|
|
||||||
std::vector<RecInfo> RecList;
|
|
||||||
|
|
||||||
try {
|
|
||||||
Poco::Data::Session sql_session = Pool_.get();
|
|
||||||
auto sql_query = fmt::format("select max(upgraded), serialNumber, toRelease from history where "
|
|
||||||
"revisionId!='unknown' group by serialNumber, toRelease order by serialNumber, "
|
|
||||||
"toRelease offset={} limit={};)", offset, limit);
|
|
||||||
Poco::Data::Statement sql_statement(sql_session);
|
|
||||||
|
|
||||||
sql_statement << sql_query,
|
|
||||||
Poco::Data::Keywords::into(RecList),
|
|
||||||
Poco::Data::Keywords::now;
|
|
||||||
|
|
||||||
for(const auto &record:RecList) {
|
|
||||||
FMSObjects::DeviceCurrentInfo entry{
|
|
||||||
.serialNumber = record.get<1>(),
|
|
||||||
.revision = record.get<2>(),
|
|
||||||
.upgraded = record.get<0>()
|
|
||||||
};
|
|
||||||
Devices.emplace_back(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
Logger().log(E);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void ORM::DB<OpenWifi::HistoryRecordTuple, OpenWifi::FMSObjects::RevisionHistoryEntry>::Convert(const OpenWifi::HistoryRecordTuple &T, OpenWifi::FMSObjects::RevisionHistoryEntry &F ) {
|
|
||||||
F.id = T.get<0>();
|
|
||||||
F.serialNumber = T.get<1>();
|
|
||||||
F.fromRelease = T.get<2>();
|
|
||||||
F.toRelease = T.get<3>();
|
|
||||||
F.commandUUID = T.get<4>();
|
|
||||||
F.revisionId = T.get<5>();
|
|
||||||
F.upgraded = T.get<6>();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> void ORM::DB<OpenWifi::HistoryRecordTuple, OpenWifi::FMSObjects::RevisionHistoryEntry>::Convert(const OpenWifi::FMSObjects::RevisionHistoryEntry &F, OpenWifi::HistoryRecordTuple &T ) {
|
|
||||||
T.set<0>(F.id);
|
|
||||||
T.set<1>(F.serialNumber);
|
|
||||||
T.set<2>(F.fromRelease);
|
|
||||||
T.set<3>(F.toRelease);
|
|
||||||
T.set<4>(F.commandUUID);
|
|
||||||
T.set<5>(F.revisionId);
|
|
||||||
T.set<6>(F.upgraded);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-12-28.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "framework/orm.h"
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
typedef Poco::Tuple<
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
std::string,
|
|
||||||
uint64_t> HistoryRecordTuple;
|
|
||||||
typedef std::vector<HistoryRecordTuple> HistoryRecordTupleList;
|
|
||||||
|
|
||||||
class HistoryDB : public ORM::DB<HistoryRecordTuple, FMSObjects::RevisionHistoryEntry> {
|
|
||||||
public:
|
|
||||||
HistoryDB(OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
|
|
||||||
virtual ~HistoryDB() {};
|
|
||||||
|
|
||||||
bool GetHistory(const std::string &SerialNumber, uint64_t From, uint64_t HowMany,
|
|
||||||
FMSObjects::RevisionHistoryEntryVec &History);
|
|
||||||
bool AddHistory(FMSObjects::RevisionHistoryEntry &History);
|
|
||||||
bool AddHistory(const std::string &SerialNumber, const std::string &DeviceType, const std::string &PreviousRevision,
|
|
||||||
const std::string &NewVersion);
|
|
||||||
bool DeleteHistory(const std::string &SerialNumber, const std::string &Id);
|
|
||||||
bool DeleteHistory(const std::string &SerialNumber);
|
|
||||||
|
|
||||||
bool GetUnknownDeviceFirmwares(uint64_t offset, uint64_t limit, std::vector<FMSObjects::DeviceCurrentInfo> & Devices);
|
|
||||||
bool GetDeviceFirmwares(uint64_t offset, uint64_t limit, std::vector<FMSObjects::DeviceCurrentInfo> & Devices);
|
|
||||||
|
|
||||||
private:
|
|
||||||
};
|
|
||||||
}
|
|
||||||
236
src/storage/storage_deviceInfo.cpp
Normal file
236
src/storage/storage_deviceInfo.cpp
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-16.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "storage_deviceInfo.h"
|
||||||
|
#include "StorageService.h"
|
||||||
|
#include "Poco/Data/RecordSet.h"
|
||||||
|
#include "LatestFirmwareCache.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
"serialNumber=?, "
|
||||||
|
"revision=?, "
|
||||||
|
"deviceType=?, "
|
||||||
|
"endPoint=?, "
|
||||||
|
"lastUpdate=?, "
|
||||||
|
"status=?
|
||||||
|
*/
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
bool Convert(const DevicesRecord &T, FMSObjects::DeviceConnectionInformation & F) {
|
||||||
|
F.serialNumber = T.get<0>();
|
||||||
|
F.revision = T.get<1>();
|
||||||
|
F.deviceType = T.get<2>();
|
||||||
|
F.endPoint = T.get<3>();
|
||||||
|
F.lastUpdate = T.get<4>();
|
||||||
|
F.status = T.get<5>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Convert(const FMSObjects::DeviceConnectionInformation & F, DevicesRecord & T) {
|
||||||
|
T.set<0>(F.serialNumber);
|
||||||
|
T.set<1>(F.revision);
|
||||||
|
T.set<2>(F.deviceType);
|
||||||
|
T.set<3>(F.endPoint);
|
||||||
|
T.set<4>(F.lastUpdate);
|
||||||
|
T.set<5>(F.status);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
|
||||||
|
DevicesRecordList Records;
|
||||||
|
std::string PreviousVersion;
|
||||||
|
bool DeviceExists=false;
|
||||||
|
try {
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string St{"select " + DBFIELDS_DEVICES_SELECT + " from " + DBNAME_DEVICES + " where serialNumber=?"};
|
||||||
|
Select << ConvertParams(St) ,
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(SerialNumber);
|
||||||
|
Select.execute();
|
||||||
|
if(!Records.empty()) {
|
||||||
|
PreviousVersion = Records[0].get<1>();
|
||||||
|
DeviceExists = true;
|
||||||
|
}
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Status{"connected"};
|
||||||
|
|
||||||
|
if(!DeviceExists) {
|
||||||
|
std::string st{"INSERT INTO " + DBNAME_DEVICES + " (" +
|
||||||
|
DBFIELDS_DEVICES_SELECT +
|
||||||
|
") VALUES(?,?,?,?,?,?)"};
|
||||||
|
Logger_.information(Poco::format("New device '%s' connected", SerialNumber));
|
||||||
|
FMSObjects::DeviceConnectionInformation DI{
|
||||||
|
.serialNumber = SerialNumber,
|
||||||
|
.revision = Revision,
|
||||||
|
.deviceType = DeviceType,
|
||||||
|
.endPoint = EndPoint,
|
||||||
|
.lastUpdate = (uint64_t)std::time(nullptr),
|
||||||
|
.status = Status};
|
||||||
|
Poco::Data::Statement Insert(Sess);
|
||||||
|
|
||||||
|
DevicesRecordList InsertRecords;
|
||||||
|
DevicesRecord R;
|
||||||
|
Convert(DI, R);
|
||||||
|
InsertRecords.push_back(R);
|
||||||
|
Insert << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(InsertRecords);
|
||||||
|
Insert.execute();
|
||||||
|
} else {
|
||||||
|
Poco::Data::Statement Update(Sess);
|
||||||
|
auto Now = (uint64_t)std::time(nullptr);
|
||||||
|
// std::cout << "Updating device: " << SerialNumber << std::endl;
|
||||||
|
std::string st{"UPDATE " + DBNAME_DEVICES + " set revision=?, lastUpdate=?, endpoint=?, status=? " + " where serialNumber=?"};
|
||||||
|
Update << ConvertParams(st) ,
|
||||||
|
Poco::Data::Keywords::use(Revision),
|
||||||
|
Poco::Data::Keywords::use(Now),
|
||||||
|
Poco::Data::Keywords::use(EndPoint),
|
||||||
|
Poco::Data::Keywords::use(Status),
|
||||||
|
Poco::Data::Keywords::use(SerialNumber);
|
||||||
|
Update.execute();
|
||||||
|
if(PreviousVersion!=Revision) {
|
||||||
|
AddHistory(SerialNumber, DeviceType, PreviousVersion, Revision);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Update(Sess);
|
||||||
|
uint64_t Now = (uint64_t)std::time(nullptr);
|
||||||
|
|
||||||
|
std::string Status{"not connected"};
|
||||||
|
|
||||||
|
// std::cout << "Updating device: " << SerialNumber << std::endl;
|
||||||
|
std::string st{"UPDATE " + DBNAME_DEVICES + " set lastUpdate=?, endpoint=?, status=? " + " where serialNumber=?"};
|
||||||
|
Update << ConvertParams(st) ,
|
||||||
|
Poco::Data::Keywords::use(Now),
|
||||||
|
Poco::Data::Keywords::use(EndPoint),
|
||||||
|
Poco::Data::Keywords::use(Status),
|
||||||
|
Poco::Data::Keywords::use(SerialNumber);
|
||||||
|
Update.execute();
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Storage::GetDevices(uint64_t From, uint64_t HowMany, std::vector<FMSObjects::DeviceConnectionInformation> & Devices) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
DevicesRecordList Records;
|
||||||
|
|
||||||
|
std::string St{"select " + DBFIELDS_DEVICES_SELECT + " from " + DBNAME_DEVICES + " ORDER BY SerialNumber ASC "};
|
||||||
|
Select << ConvertParams(St) + ComputeRange(From, HowMany),
|
||||||
|
Poco::Data::Keywords::into(Records);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
for(const auto &i:Records) {
|
||||||
|
FMSObjects::DeviceConnectionInformation DI;
|
||||||
|
Convert(i,DI);
|
||||||
|
Devices.push_back(DI);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::GetDevice(std::string &SerialNumber, FMSObjects::DeviceConnectionInformation & Device) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
DevicesRecordList Records;
|
||||||
|
std::string St{"select " + DBFIELDS_DEVICES_SELECT + " from " + DBNAME_DEVICES + " where serialNumber=?"};
|
||||||
|
Select << ConvertParams(St) ,
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(SerialNumber);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
if(!Records.empty()) {
|
||||||
|
Convert(Records[0],Device);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
"serialNumber, "
|
||||||
|
"revision, "
|
||||||
|
"deviceType, "
|
||||||
|
"endPoint, "
|
||||||
|
"lastUpdate, "
|
||||||
|
"status "
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Storage::GenerateDeviceReport(FMSObjects::DeviceReport &Report) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
Report.reset();
|
||||||
|
|
||||||
|
Select << "SELECT " + DBFIELDS_DEVICES_SELECT + " from " + DBNAME_DEVICES;
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
Poco::Data::RecordSet RSet(Select);
|
||||||
|
|
||||||
|
bool More = RSet.moveFirst();
|
||||||
|
while(More) {
|
||||||
|
Report.numberOfDevices++;
|
||||||
|
auto SerialNumber = RSet[0].convert<std::string>();
|
||||||
|
auto Revision = RSet[1].convert<std::string>();
|
||||||
|
auto DeviceType = RSet[2].convert<std::string>();
|
||||||
|
auto EndPoint = RSet[3].convert<std::string>();
|
||||||
|
auto Status = RSet[5].convert<std::string>();
|
||||||
|
|
||||||
|
// find the real revision for this device...
|
||||||
|
Types::UpdateCountedMap(Report.DeviceTypes_, DeviceType);
|
||||||
|
Types::UpdateCountedMap(Report.Revisions_, Revision);
|
||||||
|
Types::UpdateCountedMap(Report.Status_, Status);
|
||||||
|
Types::UpdateCountedMap(Report.EndPoints_, EndPoint);
|
||||||
|
Types::UpdateCountedMap(Report.OUI_, SerialNumber.substr(0, 6));
|
||||||
|
FMSObjects::FirmwareAgeDetails Age;
|
||||||
|
if (ComputeFirmwareAge(DeviceType, Revision, Age)) {
|
||||||
|
if (Age.latest) {
|
||||||
|
Types::UpdateCountedMap(Report.UsingLatest_, Revision);
|
||||||
|
} else if (Age.age == 0) {
|
||||||
|
Types::UpdateCountedMap(Report.UnknownFirmwares_, Revision);
|
||||||
|
} else {
|
||||||
|
Types::UpdateCountedMap(Report.totalSecondsOld_,"total_seconds", Age.age);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
More = RSet.moveNext();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch( const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
51
src/storage/storage_deviceInfo.h
Normal file
51
src/storage/storage_deviceInfo.h
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-16.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALFMS_STORAGE_DEVICEINFO_H
|
||||||
|
#define UCENTRALFMS_STORAGE_DEVICEINFO_H
|
||||||
|
|
||||||
|
#include "StorageService.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
static const std::string DBNAME_DEVICES{"devices"};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_DEVICES_CREATION {
|
||||||
|
"serialNumber varchar(36) UNIQUE PRIMARY KEY, "
|
||||||
|
"revision varchar, "
|
||||||
|
"deviceType varchar, "
|
||||||
|
"endPoint varchar, "
|
||||||
|
"lastUpdate bigint, "
|
||||||
|
"status varchar "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_DEVICES_SELECT{
|
||||||
|
"serialNumber, "
|
||||||
|
"revision, "
|
||||||
|
"deviceType, "
|
||||||
|
"endPoint, "
|
||||||
|
"lastUpdate, "
|
||||||
|
"status "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_DEVICES_UPDATE {
|
||||||
|
"serialNumber=?, "
|
||||||
|
"revision=?, "
|
||||||
|
"deviceType=?, "
|
||||||
|
"endPoint=?, "
|
||||||
|
"lastUpdate=?, "
|
||||||
|
"status=? "
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Poco::Tuple<
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
uint64_t,
|
||||||
|
std::string> DevicesRecord;
|
||||||
|
typedef std::vector<DevicesRecord> DevicesRecordList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //UCENTRALFMS_STORAGE_DEVICEINFO_H
|
||||||
5
src/storage/storage_deviceTypes.cpp
Normal file
5
src/storage/storage_deviceTypes.cpp
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-12.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "storage_deviceTypes.h"
|
||||||
47
src/storage/storage_deviceTypes.h
Normal file
47
src/storage/storage_deviceTypes.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-12.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALFMS_STORAGE_DEVICETYPES_H
|
||||||
|
#define UCENTRALFMS_STORAGE_DEVICETYPES_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
static const std::string DBNAME_DEVICETYPES{"deviceTypes"};
|
||||||
|
static const std::string DBFIELDS_DEVICETYPES_CREATION {
|
||||||
|
" id varchar(36) UNIQUE PRIMARY KEY, "
|
||||||
|
"deviceType varchar, "
|
||||||
|
"manufacturer varchar, "
|
||||||
|
"model varchar, "
|
||||||
|
"policy varchar, "
|
||||||
|
"notes varchar, "
|
||||||
|
"lastUpdate bigint, "
|
||||||
|
"created bigint "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_DEVICETYPES_SELECT{
|
||||||
|
" id, "
|
||||||
|
"deviceType, "
|
||||||
|
"manufacturer, "
|
||||||
|
"model, "
|
||||||
|
"policy, "
|
||||||
|
"notes, "
|
||||||
|
"lastUpdate, "
|
||||||
|
"created "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_DEVICETYPES_UPDATE {
|
||||||
|
" id=?, "
|
||||||
|
"deviceType=?, "
|
||||||
|
"manufacturer=?, "
|
||||||
|
"model=?, "
|
||||||
|
"policy=?, "
|
||||||
|
"notes=?, "
|
||||||
|
"lastUpdate=?, "
|
||||||
|
"created=? "
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //UCENTRALFMS_STORAGE_DEVICETYPES_H
|
||||||
356
src/storage/storage_firmwares.cpp
Normal file
356
src/storage/storage_firmwares.cpp
Normal file
@@ -0,0 +1,356 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-05-09.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
#include "StorageService.h"
|
||||||
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
|
#include "LatestFirmwareCache.h"
|
||||||
|
#include "ManifestCreator.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
bool Convert(const FirmwaresRecord &T, FMSObjects::Firmware & F) {
|
||||||
|
F.id = T.get<0>();
|
||||||
|
F.release = T.get<1>();
|
||||||
|
F.deviceType = T.get<2>();
|
||||||
|
F.description = T.get<3>();
|
||||||
|
F.revision = T.get<4>();
|
||||||
|
F.uri = T.get<5>();
|
||||||
|
F.image = T.get<6>();
|
||||||
|
F.imageDate = T.get<7>();
|
||||||
|
F.size = T.get<8>();
|
||||||
|
F.downloadCount = T.get<9>();
|
||||||
|
F.firmwareHash = T.get<10>();
|
||||||
|
F.owner = T.get<11>();
|
||||||
|
F.location = T.get<12>();
|
||||||
|
F.uploader = T.get<13>();
|
||||||
|
F.digest = T.get<14>();
|
||||||
|
F.latest = T.get<15>();
|
||||||
|
F.notes = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(T.get<16>());
|
||||||
|
F.created = T.get<17>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Convert(const FMSObjects::Firmware & F, FirmwaresRecord & T) {
|
||||||
|
T.set<0>(F.id);
|
||||||
|
T.set<1>(F.release);
|
||||||
|
T.set<2>(F.deviceType);
|
||||||
|
T.set<3>(F.description);
|
||||||
|
T.set<4>(F.revision);
|
||||||
|
T.set<5>(F.uri);
|
||||||
|
T.set<6>(F.image);
|
||||||
|
T.set<7>(F.imageDate);
|
||||||
|
T.set<8>(F.size);
|
||||||
|
T.set<9>(F.downloadCount);
|
||||||
|
T.set<10>(F.firmwareHash);
|
||||||
|
T.set<11>(F.owner);
|
||||||
|
T.set<12>(F.location);
|
||||||
|
T.set<13>(F.uploader);
|
||||||
|
T.set<14>(F.digest);
|
||||||
|
T.set<15>(F.latest);
|
||||||
|
T.set<16>(RESTAPI_utils::to_string(F.notes));
|
||||||
|
T.set<17>(F.created);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::AddFirmware(FMSObjects::Firmware & F) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Insert(Sess);
|
||||||
|
|
||||||
|
// find the older software and change to latest = 0
|
||||||
|
F.id = MicroService::CreateUUID();
|
||||||
|
if(LatestFirmwareCache()->AddToCache(F.deviceType,F.revision,F.id,F.imageDate)) {
|
||||||
|
F.latest = true ;
|
||||||
|
Poco::Data::Statement Update(Sess);
|
||||||
|
std::string st{"UPDATE " + DBNAME_FIRMWARES + " SET latest=false WHERE deviceType=? AND Latest=true"};
|
||||||
|
Update << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(F.deviceType);
|
||||||
|
Update.execute();
|
||||||
|
} else {
|
||||||
|
F.latest = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto Notes = RESTAPI_utils::to_string(F.notes);
|
||||||
|
std::string st{"INSERT INTO " + DBNAME_FIRMWARES + " (" +
|
||||||
|
DBFIELDS_FIRMWARES_SELECT +
|
||||||
|
") VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"};
|
||||||
|
Insert << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(F.id),
|
||||||
|
Poco::Data::Keywords::use(F.release),
|
||||||
|
Poco::Data::Keywords::use(F.deviceType),
|
||||||
|
Poco::Data::Keywords::use(F.description),
|
||||||
|
Poco::Data::Keywords::use(F.revision),
|
||||||
|
Poco::Data::Keywords::use(F.uri),
|
||||||
|
Poco::Data::Keywords::use(F.image),
|
||||||
|
Poco::Data::Keywords::use(F.imageDate),
|
||||||
|
Poco::Data::Keywords::use(F.size),
|
||||||
|
Poco::Data::Keywords::use(F.downloadCount),
|
||||||
|
Poco::Data::Keywords::use(F.firmwareHash),
|
||||||
|
Poco::Data::Keywords::use(F.owner),
|
||||||
|
Poco::Data::Keywords::use(F.location),
|
||||||
|
Poco::Data::Keywords::use(F.uploader),
|
||||||
|
Poco::Data::Keywords::use(F.digest),
|
||||||
|
Poco::Data::Keywords::use(F.latest),
|
||||||
|
Poco::Data::Keywords::use(Notes),
|
||||||
|
Poco::Data::Keywords::use(F.created);
|
||||||
|
Insert.execute();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::UpdateFirmware(std::string & ID, FMSObjects::Firmware & F) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Update(Sess);
|
||||||
|
|
||||||
|
std::string st{"UPDATE " + DBNAME_FIRMWARES + " set " + DBFIELDS_FIRMWARES_UPDATE +
|
||||||
|
" WHERE id=?"};
|
||||||
|
auto Notes = RESTAPI_utils::to_string(F.notes);
|
||||||
|
|
||||||
|
Update << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(F.id),
|
||||||
|
Poco::Data::Keywords::use(F.release),
|
||||||
|
Poco::Data::Keywords::use(F.deviceType),
|
||||||
|
Poco::Data::Keywords::use(F.description),
|
||||||
|
Poco::Data::Keywords::use(F.revision),
|
||||||
|
Poco::Data::Keywords::use(F.uri),
|
||||||
|
Poco::Data::Keywords::use(F.image),
|
||||||
|
Poco::Data::Keywords::use(F.imageDate),
|
||||||
|
Poco::Data::Keywords::use(F.size),
|
||||||
|
Poco::Data::Keywords::use(F.downloadCount),
|
||||||
|
Poco::Data::Keywords::use(F.firmwareHash),
|
||||||
|
Poco::Data::Keywords::use(F.owner),
|
||||||
|
Poco::Data::Keywords::use(F.location),
|
||||||
|
Poco::Data::Keywords::use(F.uploader),
|
||||||
|
Poco::Data::Keywords::use(F.digest),
|
||||||
|
Poco::Data::Keywords::use(F.latest),
|
||||||
|
Poco::Data::Keywords::use(Notes),
|
||||||
|
Poco::Data::Keywords::use(F.created),
|
||||||
|
Poco::Data::Keywords::use(ID);
|
||||||
|
Update.execute();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::DeleteFirmware(std::string & ID) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Delete(Sess);
|
||||||
|
|
||||||
|
std::string st{"DELETE FROM " + DBNAME_FIRMWARES + " WHERE id=?"};
|
||||||
|
Delete << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(ID);
|
||||||
|
Delete.execute();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Storage::RemoveOldFirmware() {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Delete(Sess);
|
||||||
|
|
||||||
|
std::cout << "Removing old firmware..." << std::endl;
|
||||||
|
uint64_t Limit = std::time(nullptr) - ManifestCreator()->MaxAge();
|
||||||
|
|
||||||
|
std::string st{"DELETE FROM " + DBNAME_FIRMWARES + " WHERE imageDate<?"};
|
||||||
|
Delete << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(Limit);
|
||||||
|
Delete.execute();
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::GetFirmware(std::string & ID, FMSObjects::Firmware & F) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string st{"SELECT " + DBFIELDS_FIRMWARES_SELECT +
|
||||||
|
" FROM " + DBNAME_FIRMWARES + " WHERE id=?"};
|
||||||
|
|
||||||
|
FirmwaresRecordList Records;
|
||||||
|
Select << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(ID);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
if(Records.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Convert(Records[0],F);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::GetFirmwareByName( std::string & Release, std::string &DeviceType, FMSObjects::Firmware & Firmware ) {
|
||||||
|
try {
|
||||||
|
FirmwaresRecordList Records;
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string st{"SELECT " + DBFIELDS_FIRMWARES_SELECT +
|
||||||
|
" FROM " + DBNAME_FIRMWARES + " where release=? and DeviceType=?"};
|
||||||
|
|
||||||
|
Select << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(Release),
|
||||||
|
Poco::Data::Keywords::use(DeviceType);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
if(Records.empty())
|
||||||
|
return false;
|
||||||
|
Convert(Records[0],Firmware);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::GetFirmwareByRevision(std::string & Revision, std::string &DeviceType,FMSObjects::Firmware & Firmware ) {
|
||||||
|
try {
|
||||||
|
FirmwaresRecordList Records;
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string st{"SELECT " + DBFIELDS_FIRMWARES_SELECT +
|
||||||
|
" FROM " + DBNAME_FIRMWARES + " where Revision=? and DeviceType=?"};
|
||||||
|
|
||||||
|
Select << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(Revision),
|
||||||
|
Poco::Data::Keywords::use(DeviceType);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
if (Records.empty())
|
||||||
|
return false;
|
||||||
|
Convert(Records[0], Firmware);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::GetFirmwares(uint64_t From, uint64_t HowMany, std::string & Compatible, FMSObjects::FirmwareVec & Firmwares) {
|
||||||
|
try {
|
||||||
|
FirmwaresRecordList Records;
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string st;
|
||||||
|
|
||||||
|
if(Compatible.empty()) {
|
||||||
|
st = "SELECT " + DBFIELDS_FIRMWARES_SELECT + " FROM " + DBNAME_FIRMWARES + " ORDER BY Id ASC ";
|
||||||
|
Select << ConvertParams(st) + ComputeRange(From, HowMany),
|
||||||
|
Poco::Data::Keywords::into(Records);
|
||||||
|
} else {
|
||||||
|
st = "SELECT " + DBFIELDS_FIRMWARES_SELECT + " FROM " + DBNAME_FIRMWARES + " where DeviceType=? ORDER BY Id ASC ";
|
||||||
|
Select << ConvertParams(st) + ComputeRange(From, HowMany),
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(Compatible);
|
||||||
|
}
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
for(const auto &R:Records) {
|
||||||
|
FMSObjects::Firmware F;
|
||||||
|
Convert(R,F);
|
||||||
|
Firmwares.push_back(F);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Storage::PopulateLatestFirmwareCache() {
|
||||||
|
try {
|
||||||
|
typedef Poco::Tuple<
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
uint64_t,
|
||||||
|
std::string> FCE;
|
||||||
|
typedef std::vector<FCE> FCEList;
|
||||||
|
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string st{"SELECT Id, DeviceType, ImageDate, Revision FROM " + DBNAME_FIRMWARES};
|
||||||
|
FCEList Records;
|
||||||
|
Select << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::into(Records);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
for(const auto &R:Records) {
|
||||||
|
LatestFirmwareCache()->AddToCache(R.get<1>(), R.get<3>(), R.get<0>(), R.get<2>());
|
||||||
|
}
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::ComputeFirmwareAge(std::string & DeviceType, std::string & Revision, FMSObjects::FirmwareAgeDetails &AgeDetails) {
|
||||||
|
try {
|
||||||
|
FMSObjects::Firmware CurrentFirmware;
|
||||||
|
FMSObjects::Firmware LatestFirmware;
|
||||||
|
bool CurrentFirmwareExists = false;
|
||||||
|
|
||||||
|
if(GetFirmwareByRevision(Revision,DeviceType,CurrentFirmware)) {
|
||||||
|
CurrentFirmwareExists = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
LatestFirmwareCacheEntry LE;
|
||||||
|
if(LatestFirmwareCache()->FindLatestFirmware(DeviceType,LE)) {
|
||||||
|
// std::cout << "LE.id" << LE.Id << std::endl;
|
||||||
|
|
||||||
|
if(GetFirmware(LE.Id, LatestFirmware)) {
|
||||||
|
AgeDetails.imageDate = LatestFirmware.imageDate;
|
||||||
|
AgeDetails.uri = LatestFirmware.uri;
|
||||||
|
AgeDetails.image = LatestFirmware.image;
|
||||||
|
AgeDetails.revision = LatestFirmware.revision;
|
||||||
|
AgeDetails.latestId = LatestFirmware.id;
|
||||||
|
// std::cout << " Revision='" << Revision << "'" << std::endl;
|
||||||
|
// std::cout << "LF Revision='" << LatestFirmware.revision << "'" << std::endl;
|
||||||
|
|
||||||
|
AgeDetails.latest = (Revision == LatestFirmware.revision);
|
||||||
|
// std::cout << "Latest=" << AgeDetails.latest << std::endl;
|
||||||
|
AgeDetails.age = CurrentFirmwareExists ? (LatestFirmware.imageDate - CurrentFirmware.imageDate) : 0;
|
||||||
|
//std::cout << "Revision: '" << Revision << "' vs '" << LatestFirmware.revision << "'" << std::endl;
|
||||||
|
//if (AgeDetails.latest)
|
||||||
|
// std::cout << "Found latest firmware" << std::endl;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
// std::cout << "Cannot find firmware: " << LE.Id << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
97
src/storage/storage_firmwares.h
Normal file
97
src/storage/storage_firmwares.h
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-12.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALFMS_STORAGE_FIRMWARES_H
|
||||||
|
#define UCENTRALFMS_STORAGE_FIRMWARES_H
|
||||||
|
|
||||||
|
#include "Poco/Tuple.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
static const std::string DBNAME_FIRMWARES{"firmwares"};
|
||||||
|
static const std::string DBFIELDS_FIRMWARES_CREATION {
|
||||||
|
"Id varchar(36) UNIQUE PRIMARY KEY, "
|
||||||
|
"release varchar, "
|
||||||
|
"deviceType varchar, "
|
||||||
|
"description varchar, "
|
||||||
|
"revision varchar, "
|
||||||
|
"uri varchar, "
|
||||||
|
"image varchar, "
|
||||||
|
"imageDate bigint, "
|
||||||
|
"size bigint, "
|
||||||
|
"downloadCount bigint, "
|
||||||
|
"firmwareHash varchar, "
|
||||||
|
"owner varchar, "
|
||||||
|
"location varchar, "
|
||||||
|
"uploader varchar, "
|
||||||
|
"digest varchar, "
|
||||||
|
"latest boolean, "
|
||||||
|
"notes text, "
|
||||||
|
"created bigint"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_FIRMWARES_SELECT{
|
||||||
|
" Id, "
|
||||||
|
"release, "
|
||||||
|
"deviceType, "
|
||||||
|
"description, "
|
||||||
|
"revision, "
|
||||||
|
"uri, "
|
||||||
|
"image, "
|
||||||
|
"imageDate, "
|
||||||
|
"size, "
|
||||||
|
"downloadCount, "
|
||||||
|
"firmwareHash, "
|
||||||
|
"owner, "
|
||||||
|
"location, "
|
||||||
|
"uploader, "
|
||||||
|
"digest, "
|
||||||
|
"latest, "
|
||||||
|
"notes, "
|
||||||
|
"created "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_FIRMWARES_UPDATE {
|
||||||
|
" Id=?, "
|
||||||
|
"release=?, "
|
||||||
|
"deviceType=?, "
|
||||||
|
"description=?, "
|
||||||
|
"revision=?, "
|
||||||
|
"uri=?, "
|
||||||
|
"image=?, "
|
||||||
|
"imageDate=?, "
|
||||||
|
"size=?, "
|
||||||
|
"downloadCount=?, "
|
||||||
|
"firmwareHash=?, "
|
||||||
|
"owner=?, "
|
||||||
|
"location=?, "
|
||||||
|
"uploader=?, "
|
||||||
|
"digest=?, "
|
||||||
|
"latest=?, "
|
||||||
|
"notes=?, "
|
||||||
|
"created=? "
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Poco::Tuple<
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
uint64_t,
|
||||||
|
uint64_t,
|
||||||
|
uint64_t,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
bool,
|
||||||
|
std::string,
|
||||||
|
uint64_t> FirmwaresRecord;
|
||||||
|
typedef std::vector<FirmwaresRecord> FirmwaresRecordList;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif //UCENTRALFMS_STORAGE_FIRMWARES_H
|
||||||
130
src/storage/storage_history.cpp
Normal file
130
src/storage/storage_history.cpp
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-12.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "StorageService.h"
|
||||||
|
#include "storage_history.h"
|
||||||
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
|
#include "Daemon.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
/*
|
||||||
|
* " id, "
|
||||||
|
"serialNumber, "
|
||||||
|
"fromRelease, "
|
||||||
|
"toRelease, "
|
||||||
|
"commandUUID, "
|
||||||
|
"revisionId, "
|
||||||
|
"upgraded "
|
||||||
|
|
||||||
|
*/
|
||||||
|
bool Convert(const HistoryRecord &T, FMSObjects::RevisionHistoryEntry & F) {
|
||||||
|
F.id = T.get<0>();
|
||||||
|
F.serialNumber = T.get<1>();
|
||||||
|
F.fromRelease = T.get<2>();
|
||||||
|
F.toRelease = T.get<3>();
|
||||||
|
F.commandUUID = T.get<4>();
|
||||||
|
F.revisionId = T.get<5>();
|
||||||
|
F.upgraded = T.get<6>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Convert(const FMSObjects::RevisionHistoryEntry & F, HistoryRecord & T) {
|
||||||
|
T.set<0>(F.id);
|
||||||
|
T.set<1>(F.serialNumber);
|
||||||
|
T.set<2>(F.fromRelease);
|
||||||
|
T.set<3>(F.toRelease);
|
||||||
|
T.set<4>(F.commandUUID);
|
||||||
|
T.set<5>(F.revisionId);
|
||||||
|
T.set<6>(F.upgraded);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::GetHistory(std::string &SerialNumber,uint64_t From, uint64_t HowMany,FMSObjects::RevisionHistoryEntryVec &History) {
|
||||||
|
try {
|
||||||
|
HistoryRecordList Records;
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Select(Sess);
|
||||||
|
|
||||||
|
std::string st{"SELECT " + DBFIELDS_HISTORY_SELECT +
|
||||||
|
" FROM " + DBNAME_HISTORY + " where SerialNumber=? ORDER BY Upgraded DESC " };
|
||||||
|
|
||||||
|
Select << ConvertParams(st) + ComputeRange(From, HowMany),
|
||||||
|
Poco::Data::Keywords::into(Records),
|
||||||
|
Poco::Data::Keywords::use(SerialNumber);
|
||||||
|
Select.execute();
|
||||||
|
|
||||||
|
for(const auto &R:Records) {
|
||||||
|
FMSObjects::RevisionHistoryEntry F;
|
||||||
|
Convert(R,F);
|
||||||
|
History.push_back(F);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::AddHistory(FMSObjects::RevisionHistoryEntry &History) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Insert(Sess);
|
||||||
|
|
||||||
|
std::string st{"INSERT INTO " + DBNAME_HISTORY + " (" + DBFIELDS_HISTORY_SELECT +
|
||||||
|
" ) values(?,?,?,?,?,?,?)" };
|
||||||
|
|
||||||
|
std::cout << "Adding history for " << History.serialNumber << std::endl;
|
||||||
|
HistoryRecordList RL;
|
||||||
|
HistoryRecord R;
|
||||||
|
Convert(History, R);
|
||||||
|
RL.push_back(R);
|
||||||
|
|
||||||
|
Insert << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(RL);
|
||||||
|
Insert.execute();
|
||||||
|
return true;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::AddHistory( std::string & SerialNumber, std::string &DeviceType, std::string & PreviousRevision, std::string & NewVersion) {
|
||||||
|
FMSObjects::RevisionHistoryEntry History{
|
||||||
|
.id = MicroService::CreateUUID(),
|
||||||
|
.serialNumber = SerialNumber,
|
||||||
|
.fromRelease = PreviousRevision,
|
||||||
|
.toRelease = NewVersion,
|
||||||
|
.upgraded = (uint64_t)std::time(nullptr)};
|
||||||
|
|
||||||
|
FMSObjects::Firmware F;
|
||||||
|
if(GetFirmwareByRevision(NewVersion,DeviceType,F)) {
|
||||||
|
History.revisionId = F.id;
|
||||||
|
} else {
|
||||||
|
History.revisionId = "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
return AddHistory(History);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Storage::DeleteHistory( std::string & SerialNumber, std::string &Id) {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
Poco::Data::Statement Delete(Sess);
|
||||||
|
|
||||||
|
std::string st{"DELETE FROM " + DBNAME_HISTORY + " where id=? and serialnumber=?"};
|
||||||
|
|
||||||
|
Delete << ConvertParams(st),
|
||||||
|
Poco::Data::Keywords::use(Id),
|
||||||
|
Poco::Data::Keywords::use(SerialNumber);
|
||||||
|
Delete.execute();
|
||||||
|
return true;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
56
src/storage/storage_history.h
Normal file
56
src/storage/storage_history.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-07-12.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALFMS_STORAGE_HISTORY_H
|
||||||
|
#define UCENTRALFMS_STORAGE_HISTORY_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "Poco/Tuple.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
static const std::string DBNAME_HISTORY{"history"};
|
||||||
|
static const std::string DBFIELDS_HISTORY_CREATION {
|
||||||
|
" id varchar(36) UNIQUE PRIMARY KEY, "
|
||||||
|
"serialNumber varchar, "
|
||||||
|
"fromRelease varchar, "
|
||||||
|
"toRelease varchar, "
|
||||||
|
"commandUUID varchar, "
|
||||||
|
"revisionId varchar, "
|
||||||
|
"upgraded bigint "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_HISTORY_SELECT{
|
||||||
|
" id, "
|
||||||
|
"serialNumber, "
|
||||||
|
"fromRelease, "
|
||||||
|
"toRelease, "
|
||||||
|
"commandUUID, "
|
||||||
|
"revisionId, "
|
||||||
|
"upgraded "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string DBFIELDS_HISTORY_UPDATE {
|
||||||
|
" id=?, "
|
||||||
|
"serialNumber=?, "
|
||||||
|
"fromRelease=?, "
|
||||||
|
"toRelease=?, "
|
||||||
|
"commandUUID=?, "
|
||||||
|
"revisionId=?, "
|
||||||
|
"upgraded=? "
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Poco::Tuple<
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
std::string,
|
||||||
|
uint64_t> HistoryRecord;
|
||||||
|
typedef std::vector<HistoryRecord> HistoryRecordList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif //UCENTRALFMS_STORAGE_HISTORY_H
|
||||||
106
src/storage/storage_tables.cpp
Normal file
106
src/storage/storage_tables.cpp
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
//
|
||||||
|
// License type: BSD 3-Clause License
|
||||||
|
// License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||||
|
//
|
||||||
|
// Created by Stephane Bourque on 2021-03-04.
|
||||||
|
// Arilia Wireless Inc.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "StorageService.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
int Storage::Create_Tables() {
|
||||||
|
Create_Firmwares();
|
||||||
|
Create_History();
|
||||||
|
Create_DeviceTypes();
|
||||||
|
Create_DeviceInfo();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Storage::Create_Firmwares() {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
|
||||||
|
if(dbType_==mysql) {
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_FIRMWARES + " (" +
|
||||||
|
DBFIELDS_FIRMWARES_CREATION +
|
||||||
|
")",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
|
} else {
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_FIRMWARES + " (" +
|
||||||
|
DBFIELDS_FIRMWARES_CREATION +
|
||||||
|
")",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Storage::Create_History() {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
|
||||||
|
if(dbType_==mysql) {
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_HISTORY + " (" +
|
||||||
|
DBFIELDS_HISTORY_CREATION +
|
||||||
|
",INDEX Serial (SerialNumber ASC, upgraded ASC))"
|
||||||
|
, Poco::Data::Keywords::now;
|
||||||
|
} else {
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_HISTORY + " (" +
|
||||||
|
DBFIELDS_HISTORY_CREATION +
|
||||||
|
")",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
|
Sess << "CREATE INDEX IF NOT EXISTS Serial ON " + DBNAME_HISTORY + " (SerialNumber ASC, upgraded ASC)", Poco::Data::Keywords::now;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Storage::Create_DeviceTypes() {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
|
||||||
|
if(dbType_==mysql) {
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_DEVICETYPES + " (" +
|
||||||
|
DBFIELDS_DEVICETYPES_CREATION +
|
||||||
|
")",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
|
} else {
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_DEVICETYPES + " (" +
|
||||||
|
DBFIELDS_DEVICETYPES_CREATION +
|
||||||
|
")",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Storage::Create_DeviceInfo() {
|
||||||
|
try {
|
||||||
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
|
|
||||||
|
Sess << "CREATE TABLE IF NOT EXISTS " + DBNAME_DEVICES + " (" +
|
||||||
|
DBFIELDS_DEVICES_CREATION +
|
||||||
|
")",
|
||||||
|
Poco::Data::Keywords::now;
|
||||||
|
return 0;
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -34,31 +34,22 @@ fi
|
|||||||
|
|
||||||
token=""
|
token=""
|
||||||
result_file=result.json
|
result_file=result.json
|
||||||
|
username="tip@ucentral.com"
|
||||||
|
password="openwifi"
|
||||||
browser_list=(firefox sensible-browser xdg-open w3m links links2 lynx youtube-dl)
|
browser_list=(firefox sensible-browser xdg-open w3m links links2 lynx youtube-dl)
|
||||||
browser=""
|
browser=""
|
||||||
|
|
||||||
if [ -z ${OWSEC_USERNAME+x} ]; then
|
|
||||||
username="script.runner@arilia.com"
|
|
||||||
else
|
|
||||||
username=${OWSEC_USERNAME}
|
|
||||||
fi
|
|
||||||
if [ -z ${OWSEC_PASSWORD+x} ]; then
|
|
||||||
password="Snoopy99!!!"
|
|
||||||
else
|
|
||||||
password=${OWSEC_PASSWORD}
|
|
||||||
fi
|
|
||||||
|
|
||||||
login() {
|
login() {
|
||||||
payload="{ \"userId\" : \"$username\" , \"password\" : \"$password\" }"
|
payload="{ \"userId\" : \"$username\" , \"password\" : \"$password\" }"
|
||||||
token=$(curl ${FLAGS} -X POST -H "Content-Type: application/json" -d "$payload" "https://${OWSEC}/api/v1/oauth2" | jq -r '.access_token')
|
token=$(curl ${FLAGS} -X POST -H "Content-Type: application/json" -d "$payload" "https://${OWSEC}/api/v1/oauth2" | jq -r '.access_token')
|
||||||
|
|
||||||
if [[ "${token}" == "" ]]
|
if [[ "${token}" == "" ]]
|
||||||
then
|
then
|
||||||
echo "Could not login. Please verify the host and username/password."
|
echo "Could not login. Please verify the host and username/password."
|
||||||
exit 13
|
exit 13
|
||||||
fi
|
fi
|
||||||
echo "${token}" > token.json
|
echo "${token}" > token.json
|
||||||
setfms
|
setfms
|
||||||
}
|
}
|
||||||
|
|
||||||
findbrowser() {
|
findbrowser() {
|
||||||
@@ -82,69 +73,74 @@ findbrowser() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setfms() {
|
setfms() {
|
||||||
if [ -z ${OWFMS_OVERRIDE+x} ]; then
|
|
||||||
curl ${FLAGS} -X GET "https://${OWSEC}/api/v1/systemEndpoints" \
|
curl ${FLAGS} -X GET "https://${OWSEC}/api/v1/systemEndpoints" \
|
||||||
-H "accept: Application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" > ${result_file}
|
-H "Authorization: Bearer ${token}" > ${result_file}
|
||||||
rawurl="$(cat ${result_file} | jq -r '.endpoints[] | select( .type == "owfms" ) | .uri')"
|
# jq < ${result_file}
|
||||||
if [[ ! -z "${rawurl}" ]]; then
|
|
||||||
proto="$(echo $rawurl | grep :// | sed -e's,^\(.*://\).*,\1,g')"
|
for index in {0..10}
|
||||||
url="$(echo ${rawurl/$proto/})"
|
do
|
||||||
user="$(echo $url | grep @ | cut -d@ -f1)"
|
endpointlocation=".endpoints[${index}].uri"
|
||||||
hostport="$(echo ${url/$user@/} | cut -d/ -f1)"
|
endpointlocationtype=".endpoints[${index}].type"
|
||||||
host="$(echo $hostport | sed -e 's,:.*,,g')"
|
rawurl="$(cat ${result_file} | jq -r ${endpointlocation})"
|
||||||
port="$(echo $hostport | sed -e 's,^.*:,:,g' -e 's,.*:\([0-9]*\).*,\1,g' -e 's,[^0-9],,g')"
|
svctype="$(cat ${result_file} | jq -r ${endpointlocationtype})"
|
||||||
path="$(echo $url | grep / | cut -d/ -f2-)"
|
proto="$(echo $rawurl | grep :// | sed -e's,^\(.*://\).*,\1,g')"
|
||||||
export OWFMS=${url}
|
url="$(echo ${rawurl/$proto/})"
|
||||||
echo "Using ${OWFMS}..."
|
user="$(echo $url | grep @ | cut -d@ -f1)"
|
||||||
else
|
hostport="$(echo ${url/$user@/} | cut -d/ -f1)"
|
||||||
echo "OWFMS endpoint is not found:"
|
host="$(echo $hostport | sed -e 's,:.*,,g')"
|
||||||
jq < ${result_file}
|
port="$(echo $hostport | sed -e 's,^.*:,:,g' -e 's,.*:\([0-9]*\).*,\1,g' -e 's,[^0-9],,g')"
|
||||||
exit 1
|
path="$(echo $url | grep / | cut -d/ -f2-)"
|
||||||
|
if [[ ${url} != "null" ]]
|
||||||
|
then
|
||||||
|
if [[ ${svctype} == "owfms" ]]
|
||||||
|
then
|
||||||
|
# echo "url: $url"
|
||||||
|
# echo " proto: $proto"
|
||||||
|
# echo " user: $user"
|
||||||
|
# echo " host: $host"
|
||||||
|
# echo " port: $port"
|
||||||
|
# echo " path: $path"
|
||||||
|
OWFMS="${url}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
else
|
echo "Using ${OWFMS}..."
|
||||||
export OWFMS=${OWFMS_OVERRIDE}
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logout() {
|
logout() {
|
||||||
curl ${FLAGS} -X DELETE "https://${OWSEC}/api/v1/oauth2/${token}" \
|
curl ${FLAGS} -X DELETE -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Authorization: Bearer ${token}"
|
"https://${OWSEC}/api/v1/oauth2/${token}"
|
||||||
rm -rf token.json
|
rm -rf token.json
|
||||||
}
|
}
|
||||||
|
|
||||||
getfirmwares() {
|
getfirmwares() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?deviceType=$1" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/firmwares?deviceType=$1" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
latestfirmware() {
|
latestfirmware() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?latestOnly=true&deviceType=$1" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/firmwares?latestOnly=true&deviceType=$1" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
revisions() {
|
revisions() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?revisionSet=true" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/firmwares?revisionSet=true" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
devicetypes() {
|
devicetypes() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/firmwares?deviceSet=true" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/firmwares?deviceSet=true" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,10 +152,9 @@ firmwareage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gethistory() {
|
gethistory() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/revisionHistory/$1" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/revisionHistory/$1" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,159 +166,64 @@ connecteddevice() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
connecteddevices() {
|
connecteddevices() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/connectedDevices" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/connectedDevices" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
devicereport() {
|
devicereport() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/deviceReport" \
|
curl ${FLAGS} -X GET -H "Content-Type: application/json" \
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" > ${result_file}
|
"https://${OWFMS}/api/v1/deviceReport" > ${result_file}
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
setloglevel() {
|
setloglevel() {
|
||||||
payload="{ \"command\" : \"setloglevel\" , \"subsystems\" : [ { \"tag\" : \"$1\" , \"value\" : \"$2\" } ] }"
|
payload="{ \"command\" : \"setloglevel\" , \"subsystems\" : [ { \"tag\" : \"$1\" , \"value\" : \"$2\" } ] }"
|
||||||
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
||||||
-H "Content-Type: application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" \
|
-d "$payload"
|
||||||
-d "$payload"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getloglevels() {
|
getloglevels() {
|
||||||
payload="{ \"command\" : \"getloglevels\" }"
|
payload="{ \"command\" : \"getloglevels\" }"
|
||||||
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
||||||
-H "Content-Type: application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" \
|
-d "$payload"
|
||||||
-d "$payload"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getloglevelnames() {
|
getloglevelnames() {
|
||||||
payload="{ \"command\" : \"getloglevelnames\" }"
|
payload="{ \"command\" : \"getloglevelnames\" }"
|
||||||
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
||||||
-H "Content-Type: application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" \
|
-d "$payload"
|
||||||
-d "$payload"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getsubsystemnames() {
|
getsubsystemnames() {
|
||||||
payload="{ \"command\" : \"getsubsystemnames\" }"
|
payload="{ \"command\" : \"getsubsystemnames\" }"
|
||||||
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
||||||
-H "Content-Type: application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" \
|
-d "$payload"
|
||||||
-d "$payload"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
systeminfo() {
|
systeminfo() {
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/system?command=info" \
|
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/system?command=info" \
|
||||||
-H "Content-Type: application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" > ${result_file}
|
||||||
-H "Accept: application/json" > ${result_file}
|
|
||||||
jq < ${result_file}
|
|
||||||
}
|
|
||||||
|
|
||||||
getdeviceinfo() {
|
|
||||||
curl ${FLAGS} -X GET "https://${OWFMS}/api/v1/deviceInformation/$1" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer ${token}" \
|
|
||||||
-H "Accept: application/json" > ${result_file}
|
|
||||||
jq < ${result_file}
|
jq < ${result_file}
|
||||||
}
|
}
|
||||||
|
|
||||||
reloadsubsystem() {
|
reloadsubsystem() {
|
||||||
payload="{ \"command\" : \"reload\", \"subsystems\" : [ \"$1\" ] }"
|
payload="{ \"command\" : \"reload\", \"subsystems\" : [ \"$1\" ] }"
|
||||||
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
curl ${FLAGS} -X POST "https://${OWFMS}/api/v1/system" \
|
||||||
-H "Content-Type: application/json" \
|
-H "accept: application/json" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Accept: application/json" \
|
-d "$payload"
|
||||||
-d "$payload"
|
|
||||||
}
|
|
||||||
|
|
||||||
check_response() {
|
|
||||||
|
|
||||||
if [ -s "$1" ]; then
|
|
||||||
ERROR_CODE="$(jq -r '.ErrorCode' < $1)"
|
|
||||||
|
|
||||||
if [[ -n "$ERROR_CODE" && "$ERROR_CODE" != 'null' ]]; then
|
|
||||||
echo "Error: got HTTP error code $ERROR_CODE, exiting"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
|
||||||
echo "Error: result file not found or empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
test_service() {
|
|
||||||
echo
|
|
||||||
echo "----------------------"
|
|
||||||
echo "Get system information"
|
|
||||||
echo "----------------------"
|
|
||||||
systeminfo
|
|
||||||
check_response $result_file
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "-----------------"
|
|
||||||
echo "Get device status"
|
|
||||||
echo "-----------------"
|
|
||||||
SECONDS=0
|
|
||||||
TIMEOUT_SECONDS=900
|
|
||||||
|
|
||||||
while (( $SECONDS < $TIMEOUT_SECONDS )); do
|
|
||||||
connecteddevice $1 &>/dev/null
|
|
||||||
DEVICE_STATUS="$(jq -r '.status' < $result_file)"
|
|
||||||
|
|
||||||
if [ "$DEVICE_STATUS" != 'connected' ]; then
|
|
||||||
echo "Waiting for firmware service to report device status, $SECONDS seconds elapsed"
|
|
||||||
sleep 30
|
|
||||||
else
|
|
||||||
jq < $result_file
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
if (( $SECONDS >= $TIMEOUT_SECONDS )); then
|
|
||||||
echo "Error: timed out getting firmware list"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "-----------------"
|
|
||||||
echo "Get firmware list"
|
|
||||||
echo "-----------------"
|
|
||||||
SECONDS=0
|
|
||||||
TIMEOUT_SECONDS=900
|
|
||||||
|
|
||||||
while (( $SECONDS < $TIMEOUT_SECONDS )); do
|
|
||||||
getfirmwares &>/dev/null
|
|
||||||
check_response $result_file
|
|
||||||
FIRMWARE_STATUS="$(jq -r '.firmwares' < $result_file)"
|
|
||||||
|
|
||||||
if [ "$FIRMWARE_STATUS" == '[]' ]; then
|
|
||||||
echo "Waiting for service to retrieve firmware list, $SECONDS seconds elapsed"
|
|
||||||
sleep 30
|
|
||||||
else
|
|
||||||
jq < $result_file
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
if (( $SECONDS >= $TIMEOUT_SECONDS )); then
|
|
||||||
echo "Error: timed out getting firmware list"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
help() {
|
help() {
|
||||||
@@ -345,7 +245,6 @@ help() {
|
|||||||
echo "getsubsystemnames Get the list of subsystems."
|
echo "getsubsystemnames Get the list of subsystems."
|
||||||
echo "systeminfo Get basic system information."
|
echo "systeminfo Get basic system information."
|
||||||
echo "reloadsubsystem <subsystem name> Reload the configuration for a subsystem."
|
echo "reloadsubsystem <subsystem name> Reload the configuration for a subsystem."
|
||||||
echo "test_service <serial> Run a set of CLI commands for testing purposes."
|
|
||||||
echo
|
echo
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
@@ -368,8 +267,6 @@ case "$1" in
|
|||||||
"getsubsystemnames") login; getsubsystemnames; logout ;;
|
"getsubsystemnames") login; getsubsystemnames; logout ;;
|
||||||
"reloadsubsystem") login; reloadsubsystem "$2"; logout ;;
|
"reloadsubsystem") login; reloadsubsystem "$2"; logout ;;
|
||||||
"systeminfo") login; systeminfo ; logout;;
|
"systeminfo") login; systeminfo ; logout;;
|
||||||
"test_service") login; test_service $2; logout;;
|
|
||||||
"getdeviceinfo") login; getdeviceinfo $2; logout;;
|
|
||||||
*) help ;;
|
*) help ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
1
test_scripts/curl/result.json
Normal file
1
test_scripts/curl/result.json
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user