Compare commits

..

13 Commits

Author SHA1 Message Date
TIP Automation User
e0507ceb82 Chg: update image tag in helm values to v2.4.0-RC5 2021-12-11 08:12:32 +00:00
stephb9959
afc8b942cb Fixing https://telecominfraproject.atlassian.net/browse/WIFI-6149 2021-12-10 10:31:42 -08:00
TIP Automation User
5737ab7c00 Chg: update image tag in helm values to v2.4.0-RC4 2021-12-08 07:42:44 +00:00
Dmitry Dunaev
1b59208fa2 Add: .git dir to build image to expose git hash for version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-12-08 10:27:29 +03:00
stephb9959
f5ee31bd8b Merge remote-tracking branch 'origin/release/v2.4.0' into release/v2.4.0 2021-12-06 09:10:57 -08:00
stephb9959
9f9faafb1c Adding git hash as part of the version number. - no Jira. 2021-12-06 09:10:48 -08:00
TIP Automation User
dc9d155b78 Chg: update image tag in helm values to v2.4.0-RC3 2021-12-06 15:58:04 +00:00
stephb9959
b8a7a7aff9 Fixing https://telecominfraproject.atlassian.net/browse/WIFI-6048 2021-12-05 12:00:47 -08:00
stephb9959
3195679fee Fixing https://telecominfraproject.atlassian.net/browse/WIFI-6048 2021-12-05 10:06:03 -08:00
stephb9959
d1a9556b27 Fixing https://telecominfraproject.atlassian.net/browse/WIFI-6048 2021-12-04 22:43:32 -08:00
Dmitry Dunaev
c45850b749 Chg: helm image in values to new release candidate 2021-11-22 14:59:10 +03:00
stephb9959
ab859d1f77 Solving https://telecominfraproject.atlassian.net/browse/WIFI-5780 2021-11-19 10:59:20 -08:00
Leonid Mirsky
da5720cf8d Update Helm values to v2.4.0-RC1
Signed-off-by: Leonid Mirsky <leonid@opsfleet.com>
2021-11-16 23:13:00 +02:00
101 changed files with 5745 additions and 11866 deletions

View File

@@ -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"}'

View File

@@ -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

View File

@@ -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 }}

View File

@@ -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
View File

@@ -20,4 +20,5 @@ _deps
*.zip *.zip
result.json result.json
pidfile pidfile
test_scripts/curl/result.json

View File

@@ -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
${Poco_LIBRARIES}
${MySQL_LIBRARIES}
${ZLIB_LIBRARIES}
${AWSSDK_LINK_LIBRARIES}
fmt::fmt
CppKafka::cppkafka
) )
target_link_libraries(owfms PUBLIC
${Poco_LIBRARIES} ${MySQL_LIBRARIES}
${Boost_LIBRARIES}
${ZLIB_LIBRARIES} ${AWSSDK_LINK_LIBRARIES}
CppKafka::cppkafka )

View File

@@ -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

2
build
View File

@@ -1 +1 @@
46 32

View File

@@ -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"} \

View File

@@ -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

View File

@@ -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 -}}

View File

@@ -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

View File

@@ -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,25 +36,11 @@ 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 }}
{{- end }} {{- end }}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -13,29 +13,29 @@ then
exit 1 exit 1
fi fi
if [[ "${READINESS_METHOD}" == "systeminfo" ]] if [[ "${OWSEC}" == "" ]]
then then
if [[ "${OWSEC}" == "" ]]
then
echo "You must set the variable OWSEC in order to use this script. Something like" echo "You must set the variable OWSEC in order to use this script. Something like"
echo "OWSEC=security.isp.com:16001" echo "OWSEC=security.isp.com:16001"
exit 1 exit 1
fi fi
if [[ "${OWSEC_USERNAME}" == "" ]] if [[ "${OWSEC_USERNAME}" == "" ]]
then then
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like" echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
echo "OWSEC_USERNAME=tip@ucentral.com" echo "OWSEC_USERNAME=tip@ucentral.com"
exit 1 exit 1
fi fi
if [[ "${OWSEC_PASSWORD}" == "" ]] if [[ "${OWSEC_PASSWORD}" == "" ]]
then then
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like" echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
echo "OWSEC_PASSWORD=openwifi" echo "OWSEC_PASSWORD=openwifi"
exit 1 exit 1
fi fi
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
then
# 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
View 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);
}
}

View File

@@ -11,22 +11,19 @@
namespace OpenWifi { namespace OpenWifi {
int AutoUpdater::Start() { int AutoUpdater::Start() {
AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false); Running_ = true;
if(AutoUpdaterEnabled_) {
Running_ = false;
AutoUpdaterFrequency_ = MicroService::instance().ConfigGetInt("autoupdater.frequency",600); AutoUpdaterFrequency_ = MicroService::instance().ConfigGetInt("autoupdater.frequency",600);
AutoUpdaterCallBack_ = std::make_unique<Poco::TimerCallback<AutoUpdater>>(*this, &AutoUpdater::onTimer); AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false);
Timer_.setStartInterval(5 * 60 * 1000); // first run in 5 minutes if(AutoUpdaterEnabled_)
Timer_.setPeriodicInterval(AutoUpdaterFrequency_ * 1000); Thr_.start(*this);
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,29 +34,31 @@ 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);
if(!Running_)
break;
std::unique_lock L(Mutex_); std::unique_lock L(Mutex_);
while(!Queue_.empty() && Running_) { while(!Queue_.empty() && Running_) {
auto Entry = Queue_.front(); auto Entry = Queue_.front();
Queue_.pop_front(); Queue_.pop_front();
try { try {
Logger().debug(fmt::format("Preparing to upgrade {}",Entry.first)); Logger_.debug(Poco::format("Preparing to upgrade %s",Entry.first));
auto CacheEntry = Cache_.find(Entry.first); auto CacheEntry = Cache_.find(Entry.first);
uint64_t now = OpenWifi::Now(); uint64_t Now = std::time(nullptr);
std::string firmwareUpgrade; std::string firmwareUpgrade;
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-now)>300) { bool firmwareRCOnly;
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-Now)>300) {
// get the firmware settings for that device. // get the firmware settings for that device.
SerialCache C; SerialCache C;
C.LastCheck = now; C.LastCheck = Now;
bool firmwareRCOnly;
if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) { if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
Logger().debug(fmt::format("Found 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;
} else { } else {
Logger().debug(fmt::format("Found no firmware options for {}",Entry.first)); Logger_.debug(Poco::format("Found no firmware options for %s",Entry.first));
C.firmwareRCOnly = firmwareRCOnly; C.firmwareRCOnly = firmwareRCOnly;
C.firmwareUpgrade = firmwareUpgrade; C.firmwareUpgrade = firmwareUpgrade;
} }
@@ -69,7 +68,7 @@ namespace OpenWifi {
} }
if(firmwareUpgrade=="no") { if(firmwareUpgrade=="no") {
Logger().information(fmt::format("Device {} not upgradable. Provisioning service settings.",Entry.first)); Logger_.information(Poco::format("Device %s not upgradable. Provisioning service settings.",Entry.first));
continue; continue;
} }
@@ -77,28 +76,29 @@ namespace OpenWifi {
FMSObjects::Firmware fwDetails; FMSObjects::Firmware fwDetails;
auto LF = LatestFirmwareCache()->FindLatestFirmware(Entry.second, fwEntry ); auto LF = LatestFirmwareCache()->FindLatestFirmware(Entry.second, fwEntry );
if(LF) { if(LF) {
if(StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id,fwDetails)) { if(StorageService()->GetFirmware(fwEntry.Id,fwDetails)) {
// send the command to upgrade this device... // send the command to upgrade this device...
Logger().information(fmt::format("Upgrading {} to version {}", Entry.first, fwEntry.Revision)); Logger_.information(Poco::format("Upgrading %s to version %s", Entry.first, fwEntry.Revision));
if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) { if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
Logger().information(fmt::format("Upgrade command sent for {}",Entry.first)); Logger_.information(Poco::format("Upgrade command sent for %s",Entry.first));
} else { } else {
Logger().information(fmt::format("Upgrade command not sent for {}",Entry.first)); Logger_.information(Poco::format("Upgrade command not sent for %s",Entry.first));
} }
} 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 { } 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 ));
} }
} catch (...) { } catch (...) {
Logger().information(fmt::format("Exception during auto update for device {}.", Entry.first )); Logger_.information(Poco::format("Exception during auto update for device %s.", 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();
} }
} }

View File

@@ -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;
Poco::Thread Thr_;
std::map<std::string,SerialCache> Cache_; std::map<std::string,SerialCache> Cache_;
std::deque<std::pair<std::string,std::string>> Queue_; std::deque<std::pair<std::string,std::string>> Queue_;
uint64_t AutoUpdaterFrequency_=600; uint64_t AutoUpdaterFrequency_=600;
bool AutoUpdaterEnabled_=true; bool AutoUpdaterEnabled_=true;
Poco::Timer Timer_;
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

View File

@@ -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() {
} }
} }

View File

@@ -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

View File

@@ -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;
} }
} }

View File

@@ -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(); }
} }

View File

@@ -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;
} }

View File

@@ -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(); }
} }

View File

@@ -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_);

View File

@@ -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(); }
} }

View File

@@ -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;
while(Running_) {
Poco::Thread::trySleep(FirstRun ? 10000 : DBRefresh_*1000);
if(!Running_)
break;
FirstRun = false;
Logger_.information("Performing DB refresh");
S3BucketContent BucketList; S3BucketContent BucketList;
StorageService()->FirmwaresDB().RemoveOldFirmware(); StorageService()->RemoveOldFirmware();
ReadBucket(BucketList); ReadBucket(BucketList);
Logger().information(fmt::format("Found {} firmware entries in S3 repository.", BucketList.size())); if(!Running_)
break;
Logger_.information(Poco::format("Found %Lu firmware entries in S3 repository.",(uint64_t)BucketList.size()));
ComputeManifest(BucketList); ComputeManifest(BucketList);
AddManifestToDB(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;
@@ -225,16 +236,11 @@ namespace OpenWifi {
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;

View File

@@ -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(); };
} }

View File

@@ -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));
}
}

View File

@@ -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

View File

@@ -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);
} }
} }
} }

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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 {};

View File

@@ -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);

View File

@@ -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 {};

View File

@@ -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);
}
}

View File

@@ -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 {};
};
}

View File

@@ -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"

View File

@@ -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

View File

@@ -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);

View File

@@ -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 {};

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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 {};

View File

@@ -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();

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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);
};
}
}

View File

@@ -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();
}
}

View File

@@ -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();
};
}

View File

@@ -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;
}
} }

View File

@@ -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

View File

@@ -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;
}
} }

View File

@@ -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

View File

@@ -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,7 +523,7 @@ 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();
@@ -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;
}
}

View File

@@ -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;
@@ -383,19 +262,16 @@ namespace OpenWifi::ProvObjects {
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

View File

@@ -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);
}
} }

View File

@@ -6,20 +6,13 @@
// 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;
@@ -28,13 +21,8 @@ namespace OpenWifi {
bool Delete_ = true; bool Delete_ = true;
bool PortalLogin_ = true; bool PortalLogin_ = true;
AclTemplate() noexcept = default;
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); };
};
static_assert( std::is_nothrow_move_constructible_v<AclTemplate> );
struct WebToken { struct WebToken {
std::string access_token_; std::string access_token_;
@@ -48,26 +36,24 @@ namespace OpenWifi {
uint64_t idle_timeout_=0; uint64_t idle_timeout_=0;
AclTemplate acl_template_; AclTemplate acl_template_;
uint64_t created_=0; uint64_t created_=0;
uint64_t lastRefresh_=0;
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 USER_ROLE { enum USER_ROLE {
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING, PARTNER UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING
}; };
USER_ROLE UserTypeFromString(const std::string &U); USER_ROLE UserTypeFromString(const std::string &U);
std::string UserTypeToString(USER_ROLE U); std::string UserTypeToString(USER_ROLE U);
struct NoteInfo { struct NoteInfo {
uint64_t created=0; // = OpenWifi::Now(); uint64_t created = std::time(nullptr);
std::string createdBy; std::string createdBy;
std::string note; std::string note;
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);
}; };
typedef std::vector<NoteInfo> NoteInfoVec; typedef std::vector<NoteInfo> NoteInfoVec;
@@ -77,7 +63,7 @@ namespace OpenWifi {
bool primary = false; bool primary = false;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(Poco::JSON::Object::Ptr &Obj);
}; };
struct MfaAuthInfo { struct MfaAuthInfo {
@@ -85,26 +71,25 @@ namespace OpenWifi {
std::string method; std::string method;
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 UserLoginLoginExtensions { struct UserLoginLoginExtensions {
std::vector<MobilePhoneNumber> mobiles; std::vector<MobilePhoneNumber> mobiles;
struct MfaAuthInfo mfa; struct MfaAuthInfo mfa;
std::string authenticatorSecret;
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 MFAChallengeRequest { struct MFAChallengeRequest {
std::string uuid; std::string uuid;
std::string question; std::string question;
std::string method; std::string method;
uint64_t created = OpenWifi::Now(); uint64_t created = std::time(nullptr);
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 MFAChallengeResponse { struct MFAChallengeResponse {
@@ -112,11 +97,11 @@ namespace OpenWifi {
std::string answer; std::string answer;
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 UserInfo { struct UserInfo {
std::string id; std::string Id;
std::string name; std::string name;
std::string description; std::string description;
std::string avatar; std::string avatar;
@@ -143,24 +128,15 @@ namespace OpenWifi {
std::string securityPolicy; std::string securityPolicy;
uint64_t securityPolicyChange = 0 ; uint64_t securityPolicyChange = 0 ;
std::string currentPassword; std::string currentPassword;
OpenWifi::Types::StringVec lastPasswords; Types::StringVec lastPasswords;
std::string oauthType; std::string oauthType;
std::string oauthUserInfo; std::string oauthUserInfo;
uint64_t modified;
std::string signingUp;
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<UserInfo> UserInfoVec; typedef std::vector<UserInfo> UserInfoVec;
struct UserInfoList {
std::vector<UserInfo> users;
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); // bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes); bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes);
@@ -224,7 +200,7 @@ namespace OpenWifi {
std::string resource; std::string resource;
ResourceAccessType access; ResourceAccessType access;
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);
}; };
typedef std::vector<ProfileAction> ProfileActionVec; typedef std::vector<ProfileAction> ProfileActionVec;
@@ -236,22 +212,19 @@ namespace OpenWifi {
std::string role; std::string role;
NoteInfoVec notes; NoteInfoVec notes;
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);
}; };
typedef std::vector<SecurityProfile> SecurityProfileVec; typedef std::vector<SecurityProfile> SecurityProfileVec;
struct SecurityProfileList { struct SecurityProfileList {
SecurityProfileVec profiles; SecurityProfileVec profiles;
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);
}; };
enum LinkActions { enum LinkActions {
FORGOT_PASSWORD=1, FORGOT_PASSWORD=1,
VERIFY_EMAIL, VERIFY_EMAIL
SUB_FORGOT_PASSWORD,
SUB_VERIFY_EMAIL,
SUB_SIGNUP
}; };
struct ActionLink { struct ActionLink {
@@ -263,65 +236,14 @@ namespace OpenWifi {
std::string locale; std::string locale;
std::string message; std::string message;
uint64_t sent=0; uint64_t sent=0;
uint64_t created=OpenWifi::Now(); uint64_t created=std::time(nullptr);
uint64_t expires=0; uint64_t expires=0;
uint64_t completed=0; uint64_t completed=0;
uint64_t canceled=0; uint64_t canceled=0;
bool userAction=true;
void to_json(Poco::JSON::Object &Obj) const; void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj); bool from_json(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

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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();
} }

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -13,11 +13,9 @@
namespace OpenWifi { namespace OpenWifi {
static const std::string GitUCentralJSONSchemaFile{ static const std::string GitUCentralJSONSchemaFile{"https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"};
"https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"};
static json DefaultUCentralSchema = R"(
static json DefaultUCentralSchema = R"(
{ {
"$id": "https://openwrt.org/ucentral.schema.json", "$id": "https://openwrt.org/ucentral.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#", "$schema": "http://json-schema.org/draft-07/schema#",
@@ -77,10 +75,6 @@ static json DefaultUCentralSchema = R"(
"name": { "name": {
"type": "string" "type": "string"
}, },
"hostname": {
"type": "string",
"format": "hostname"
},
"location": { "location": {
"type": "string" "type": "string"
}, },
@@ -107,14 +101,12 @@ static json DefaultUCentralSchema = R"(
"items": { "items": {
"type": "string", "type": "string",
"enum": [ "enum": [
"CS0",
"CS1", "CS1",
"CS2", "CS2",
"CS3", "CS3",
"CS4", "CS4",
"CS5", "CS5",
"CS6", "CS6",
"CS7",
"AF11", "AF11",
"AF12", "AF12",
"AF13", "AF13",
@@ -128,15 +120,12 @@ static json DefaultUCentralSchema = R"(
"AF42", "AF42",
"AF43", "AF43",
"DF", "DF",
"EF", "EF"
"VA",
"LE"
] ]
} }
}, },
"globals.wireless-multimedia.table": { "globals.wireless-multimedia": {
"type": "object", "type": "object",
"additionalProperties": false,
"properties": { "properties": {
"UP0": { "UP0": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector" "$ref": "#/$defs/globals.wireless-multimedia.class-selector"
@@ -164,19 +153,11 @@ static json DefaultUCentralSchema = R"(
} }
} }
}, },
"globals.wireless-multimedia.profile": { "globals.wireless-multimedia-profile": {
"type": "object",
"additionalProperties": false,
"properties": {
"profile": {
"type": "string", "type": "string",
"enum": [ "enum": [
"enterprise", "enterprise"
"rfc8325",
"3gpp"
] ]
}
}
}, },
"globals": { "globals": {
"type": "object", "type": "object",
@@ -196,11 +177,12 @@ static json DefaultUCentralSchema = R"(
] ]
}, },
"wireless-multimedia": { "wireless-multimedia": {
"anyOf": [{ "oneOf": [
"$ref": "#/$defs/globals.wireless-multimedia.table" {
"$ref": "#/$defs/globals.wireless-multimedia"
}, },
{ {
"$ref": "#/$defs/globals.wireless-multimedia.profile" "$ref": "#/$defs/globals.wireless-multimedia-profile"
} }
] ]
} }
@@ -390,9 +372,10 @@ static json DefaultUCentralSchema = R"(
] ]
}, },
"channel": { "channel": {
"oneOf": [{ "oneOf": [
{
"type": "integer", "type": "integer",
"maximum": 196, "maximum": 171,
"minimum": 1 "minimum": 1
}, },
{ {
@@ -401,14 +384,6 @@ static json DefaultUCentralSchema = R"(
} }
] ]
}, },
"valid-channels": {
"type": "array",
"items": {
"type": "integer",
"maximum": 196,
"minimum": 1
}
},
"country": { "country": {
"type": "string", "type": "string",
"maxLength": 2, "maxLength": 2,
@@ -417,10 +392,6 @@ static json DefaultUCentralSchema = R"(
"US" "US"
] ]
}, },
"allow-dfs": {
"type": "boolean",
"default": true
},
"channel-mode": { "channel-mode": {
"type": "string", "type": "string",
"enum": [ "enum": [
@@ -519,17 +490,17 @@ static json DefaultUCentralSchema = R"(
"maximum": 4050 "maximum": 4050
}, },
"proto": { "proto": {
"decription": "The L2 vlan tag that shall be added (1q,1ad ) ", "decription": "The L2 vlan tag that shall be added (1q,1ad) ",
"type": "string", "type": "string",
"enum": [ "enum": [
"802.1ad", "802.1ad",
"802.1q" "802.1q"
], ],
"default": "802.1q" "default": "802.1q"
} }
} }
}, },
"interface.bridge": { "interface.bridge": {
"type": "object", "type": "object",
"properties": { "properties": {
"mtu": { "mtu": {
@@ -670,47 +641,6 @@ static json DefaultUCentralSchema = R"(
} }
} }
}, },
"interface.ipv4.port-forward": {
"type": "object",
"properties": {
"protocol": {
"type": "string",
"enum": [
"tcp",
"udp",
"any"
],
"default": "any"
},
"external-port": {
"type": [
"integer",
"string"
],
"minimum": 0,
"maximum": 65535,
"format": "uc-portrange"
},
"internal-address": {
"type": "string",
"format": "ipv4",
"example": "0.0.0.120"
},
"internal-port": {
"type": [
"integer",
"string"
],
"minimum": 0,
"maximum": 65535,
"format": "uc-portrange"
}
},
"required": [
"external-port",
"internal-address"
]
},
"interface.ipv4": { "interface.ipv4": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -764,12 +694,6 @@ static json DefaultUCentralSchema = R"(
"items": { "items": {
"$ref": "#/$defs/interface.ipv4.dhcp-lease" "$ref": "#/$defs/interface.ipv4.dhcp-lease"
} }
},
"port-forward": {
"type": "array",
"items": {
"$ref": "#/$defs/interface.ipv4.port-forward"
}
} }
} }
}, },
@@ -799,96 +723,6 @@ static json DefaultUCentralSchema = R"(
} }
} }
}, },
"interface.ipv6.port-forward": {
"type": "object",
"properties": {
"protocol": {
"type": "string",
"enum": [
"tcp",
"udp",
"any"
],
"default": "any"
},
"external-port": {
"type": [
"integer",
"string"
],
"minimum": 0,
"maximum": 65535,
"format": "uc-portrange"
},
"internal-address": {
"type": "string",
"format": "ipv6",
"example": "::1234:abcd"
},
"internal-port": {
"type": [
"integer",
"string"
],
"minimum": 0,
"maximum": 65535,
"format": "uc-portrange"
}
},
"required": [
"external-port",
"internal-address"
]
},
"interface.ipv6.traffic-allow": {
"type": "object",
"properties": {
"protocol": {
"type": "string",
"default": "any"
},
"source-address": {
"type": "string",
"format": "uc-cidr6",
"example": "2001:db8:1234:abcd::/64",
"default": "::/0"
},
"source-ports": {
"type": "array",
"minItems": 1,
"items": {
"type": [
"integer",
"string"
],
"minimum": 0,
"maximum": 65535,
"format": "uc-portrange"
}
},
"destination-address": {
"type": "string",
"format": "ipv6",
"example": "::1000"
},
"destination-ports": {
"type": "array",
"minItems": 1,
"items": {
"type": [
"integer",
"string"
],
"minimum": 0,
"maximum": 65535,
"format": "uc-portrange"
}
}
},
"required": [
"destination-address"
]
},
"interface.ipv6": { "interface.ipv6": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -920,18 +754,6 @@ static json DefaultUCentralSchema = R"(
}, },
"dhcpv6": { "dhcpv6": {
"$ref": "#/$defs/interface.ipv6.dhcpv6" "$ref": "#/$defs/interface.ipv6.dhcpv6"
},
"port-forward": {
"type": "array",
"items": {
"$ref": "#/$defs/interface.ipv6.port-forward"
}
},
"traffic-allow": {
"type": "array",
"items": {
"$ref": "#/$defs/interface.ipv6.traffic-allow"
}
} }
} }
}, },
@@ -999,7 +821,8 @@ static json DefaultUCentralSchema = R"(
} }
}, },
"interface.broad-band": { "interface.broad-band": {
"oneOf": [{ "oneOf": [
{
"$ref": "#/$defs/interface.broad-band.wwan" "$ref": "#/$defs/interface.broad-band.wwan"
}, },
{ {
@@ -1016,7 +839,7 @@ static json DefaultUCentralSchema = R"(
}, },
"gateway-fqdn": { "gateway-fqdn": {
"type": "string", "type": "string",
"format": "uc-fqdn", "format": "fqdn",
"default": "ucentral.splash" "default": "ucentral.splash"
}, },
"max-clients": { "max-clients": {
@@ -1051,7 +874,6 @@ static json DefaultUCentralSchema = R"(
"psk", "psk",
"psk2", "psk2",
"psk-mixed", "psk-mixed",
"psk2-radius",
"wpa", "wpa",
"wpa2", "wpa2",
"wpa-mixed", "wpa-mixed",
@@ -1112,10 +934,6 @@ static json DefaultUCentralSchema = R"(
"type": "boolean", "type": "boolean",
"default": false "default": false
}, },
"reduced-neighbor-reporting": {
"type": "boolean",
"default": false
},
"lci": { "lci": {
"type": "string" "type": "string"
}, },
@@ -1256,7 +1074,8 @@ static json DefaultUCentralSchema = R"(
"minimum": 1 "minimum": 1
}, },
"value": { "value": {
"anyOf": [{ "anyOf": [
{
"type": "integer", "type": "integer",
"maximum": 4294967295, "maximum": 4294967295,
"minimum": 0 "minimum": 0
@@ -1267,7 +1086,8 @@ static json DefaultUCentralSchema = R"(
] ]
} }
}, },
"examples": [{ "examples": [
{
"id": 27, "id": 27,
"value": 900 "value": 900
}, },
@@ -1304,49 +1124,12 @@ static json DefaultUCentralSchema = R"(
"local": { "local": {
"$ref": "#/$defs/interface.ssid.radius.local" "$ref": "#/$defs/interface.ssid.radius.local"
}, },
"dynamic-authorization": {
"type": "object",
"properties": {
"host": {
"type": "string",
"format": "uc-ip",
"examples": [
"192.168.1.10"
]
},
"port": {
"type": "integer",
"maximum": 65535,
"minimum": 1024,
"examples": [
1812
]
},
"secret": {
"type": "string",
"examples": [
"secret"
]
}
}
},
"authentication": { "authentication": {
"allOf": [{
"$ref": "#/$defs/interface.ssid.radius.server" "$ref": "#/$defs/interface.ssid.radius.server"
}, },
{
"type": "object",
"properties": {
"mac-filter": {
"type": "boolean",
"default": false
}
}
}
]
},
"accounting": { "accounting": {
"allOf": [{ "allOf": [
{
"$ref": "#/$defs/interface.ssid.radius.server" "$ref": "#/$defs/interface.ssid.radius.server"
}, },
{ {
@@ -1549,13 +1332,15 @@ static json DefaultUCentralSchema = R"(
] ]
} }
}, },
"examples": [{ "examples": [
{
"width": 32, "width": 32,
"height": 32, "height": 32,
"type": "image/png", "type": "image/png",
"language": "eng", "language": "eng",
"icon": "R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" "icon": "R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
}] }
]
} }
}, },
"wan-metrics": { "wan-metrics": {
@@ -1682,11 +1467,6 @@ static json DefaultUCentralSchema = R"(
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.", "decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
"type": "string" "type": "string"
}, },
"fils-discovery-interval": {
"type": "integer",
"default": 20,
"maximum": 10000
},
"encryption": { "encryption": {
"$ref": "#/$defs/interface.ssid.encryption" "$ref": "#/$defs/interface.ssid.encryption"
}, },
@@ -1801,7 +1581,8 @@ static json DefaultUCentralSchema = R"(
} }
}, },
"interface.tunnel": { "interface.tunnel": {
"oneOf": [{ "oneOf": [
{
"$ref": "#/$defs/interface.tunnel.mesh" "$ref": "#/$defs/interface.tunnel.mesh"
}, },
{ {
@@ -2007,11 +1788,6 @@ static json DefaultUCentralSchema = R"(
"type": "integer", "type": "integer",
"minimum": 32, "minimum": 32,
"default": 1000 "default": 1000
},
"priority": {
"type": "integer",
"minimum": 0,
"default": 7
} }
} }
}, },
@@ -2158,7 +1934,7 @@ static json DefaultUCentralSchema = R"(
"properties": { "properties": {
"controller": { "controller": {
"type": "string", "type": "string",
"format": "uc-ip", "format": "ip",
"example": "192.168.10.1" "example": "192.168.10.1"
}, },
"datapath-description": { "datapath-description": {
@@ -2175,11 +1951,6 @@ static json DefaultUCentralSchema = R"(
], ],
"default": "ssl" "default": "ssl"
}, },
"port": {
"type": "integer",
"maximum": 65535,
"default": 6653
},
"ca-certificate": { "ca-certificate": {
"type": "string" "type": "string"
}, },
@@ -2247,42 +2018,9 @@ static json DefaultUCentralSchema = R"(
"auto-channel": { "auto-channel": {
"type": "boolean", "type": "boolean",
"default": false "default": false
},
"ipv6": {
"type": "boolean",
"default": false
} }
} }
}, },
"service.quality-of-service.class-selector": {
"type": "string",
"enum": [
"CS0",
"CS1",
"CS2",
"CS3",
"CS4",
"CS5",
"CS6",
"CS7",
"AF11",
"AF12",
"AF13",
"AF21",
"AF22",
"AF23",
"AF31",
"AF32",
"AF33",
"AF41",
"AF42",
"AF43",
"DF",
"EF",
"VA",
"LE"
]
},
"service.quality-of-service": { "service.quality-of-service": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -2301,26 +2039,23 @@ static json DefaultUCentralSchema = R"(
"type": "integer", "type": "integer",
"default": 0 "default": 0
}, },
"bulk-detection": {
"type": "object",
"properties": {
"dscp": {
"$ref": "#/$defs/service.quality-of-service.class-selector",
"default": "CS0"
},
"packets-per-second": {
"type": "number",
"default": 0
}
}
},
"classifier": { "classifier": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
"properties": { "properties": {
"dscp": { "dscp": {
"$ref": "#/$defs/service.quality-of-service.class-selector", "type": "string",
"enum": [
"CS0",
"CS1",
"CS2",
"CS3",
"CS4",
"CS5",
"CS6",
"CS7"
],
"default": "CS1" "default": "CS1"
}, },
"ports": { "ports": {
@@ -2348,25 +2083,12 @@ static json DefaultUCentralSchema = R"(
"default": true "default": true
} }
} }
}
}, },
"dns": { "dns": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object",
"properties": {
"fqdn": {
"type": "string", "type": "string",
"format": "uc-fqdn" "format": "fqdn"
},
"suffix-matching": {
"type": "boolean",
"default": true
},
"reclassify": {
"type": "boolean",
"default": true
}
} }
} }
} }
@@ -2389,36 +2111,21 @@ static json DefaultUCentralSchema = R"(
} }
} }
}, },
"service.airtime-fairness": { "service.airtime-policies": {
"type": "object", "type": "object",
"properties": { "properties": {
"voice-weight": { "dns-match": {
"type": "number", "type": "array",
"default": 4 "items": {
"type": "string",
"examples": [
"*.voice.example.com"
]
}
}, },
"packet-threshold": { "dns-weight": {
"type": "number", "type": "integer",
"default": 100
},
"bulk-threshold": {
"type": "number",
"default": 50
},
"priority-threshold": {
"type": "number",
"default": 30
},
"weight-normal": {
"type": "number",
"default": 256 "default": 256
},
"weight-priority": {
"type": "number",
"default": 394
},
"weight-bulk": {
"type": "number",
"default": 128
} }
} }
}, },
@@ -2473,8 +2180,8 @@ static json DefaultUCentralSchema = R"(
"facebook-wifi": { "facebook-wifi": {
"$ref": "#/$defs/service.facebook-wifi" "$ref": "#/$defs/service.facebook-wifi"
}, },
"airtime-fairness": { "airtime-policies": {
"$ref": "#/$defs/service.airtime-fairness" "$ref": "#/$defs/service.airtime-policies"
} }
} }
}, },
@@ -2605,50 +2312,35 @@ static json DefaultUCentralSchema = R"(
] ]
] ]
} }
}
}
} }
)"_json; }
}
)"_json;
class custom_error_handler : public nlohmann::json_schema::basic_error_handler class ConfigurationValidator *ConfigurationValidator::instance_ = nullptr;
{
void error(const nlohmann::json_pointer<nlohmann::basic_json<>> &pointer, const json &instance,
const std::string &message) override
{
nlohmann::json_schema::basic_error_handler::error(pointer, instance, message);
std::cout << "ERROR: '" << pointer << "' - '" << instance << "': " << message << "\n";
}
};
void ConfigurationValidator::Init() { void ConfigurationValidator::Init() {
if(Initialized_) if(Initialized_)
return; return;
std::string GitSchema; std::string GitSchema;
if(MicroService::instance().ConfigGetBool("ucentral.datamodel.internal",true)) {
RootSchema_ = DefaultUCentralSchema;
Logger().information("Using uCentral validation from built-in default.");
Initialized_ = Working_ = true;
return;
}
try { try {
auto GitURI = MicroService::instance().ConfigGetString("ucentral.datamodel.uri",GitUCentralJSONSchemaFile); if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) {
if(Utils::wgets(GitURI, GitSchema)) { auto schema = json::parse(GitSchema);
RootSchema_ = json::parse(GitSchema); Validator_->set_root_schema(schema);
Logger().information("Using uCentral validation schema from GIT."); Logger_.information("Using uCentral validation schema from GIT.");
} else { } else {
std::string FileName{ MicroService::instance().DataDir() + "/ucentral.schema.json" }; std::string FileName{ MicroService::instance().DataDir() + "/ucentral.schema.json" };
std::ifstream input(FileName); std::ifstream input(FileName);
std::stringstream schema_file; std::stringstream schema_file;
schema_file << input.rdbuf(); schema_file << input.rdbuf();
input.close(); input.close();
RootSchema_ = json::parse(schema_file.str()); auto schema = json::parse(schema_file.str());
Logger().information("Using uCentral validation schema from local file."); Validator_->set_root_schema(schema);
Logger_.information("Using uCentral validation schema from local file.");
} }
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
RootSchema_ = DefaultUCentralSchema; Validator_->set_root_schema(DefaultUCentralSchema);
Logger().information("Using uCentral validation from built-in default."); Logger_.information("Using uCentral validation from built-in default.");
} }
Initialized_ = Working_ = true; Initialized_ = Working_ = true;
} }
@@ -2700,17 +2392,6 @@ static json DefaultUCentralSchema = R"(
return IsCIDRv4(value) || IsCIDRv6(value); return IsCIDRv4(value) || IsCIDRv6(value);
} }
static inline bool IsPortRangeIsValid(const std::string &r) {
const auto ports = Poco::StringTokenizer("-",r,Poco::StringTokenizer::TOK_TRIM);
for(const auto &port:ports) {
uint32_t port_num = std::stoul(port);
if(port_num==0 || port_num>65535)
return false;
}
return true;
}
void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value) void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value)
{ {
static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"}; static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"};
@@ -2733,7 +2414,7 @@ static json DefaultUCentralSchema = R"(
} else if(format == "uc-mac") { } else if(format == "uc-mac") {
if(std::regex_match(value,mac_regex)) if(std::regex_match(value,mac_regex))
return; return;
throw std::invalid_argument(value + " is not a valid MAC: should be something like 11:22:33:44:55:66"); throw std::invalid_argument(value + " is not a valid MAC: should be something like 2e60:3500::/64.");
} else if(format == "uc-timeout") { } else if(format == "uc-timeout") {
if(std::regex_match(value,uc_timeout_regex)) if(std::regex_match(value,uc_timeout_regex))
return; return;
@@ -2761,20 +2442,16 @@ static json DefaultUCentralSchema = R"(
} catch (...) { } catch (...) {
} }
throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com."); throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com.");
} else if(format == "uc-portrange") {
try {
if(IsPortRangeIsValid(value))
return;
throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port.");
} catch (...) {
}
throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port.");
} else if(format == "ip") { } else if(format == "ip") {
if (IsIP(value)) if (IsIP(value))
return; return;
throw std::invalid_argument(value + " is not a valid IP address."); throw std::invalid_argument(value + " is not a valid IP address.");
} else { } else {
try {
nlohmann::json_schema::default_string_format_check(format,value); nlohmann::json_schema::default_string_format_check(format,value);
} catch (const std::logic_error &E) {
std::string Error{"JSON Schema validation: "};
}
} }
} }
@@ -2782,32 +2459,19 @@ static json DefaultUCentralSchema = R"(
if(Working_) { if(Working_) {
try { try {
auto Doc = json::parse(C); auto Doc = json::parse(C);
custom_error_handler CE; Validator_->validate(Doc);
json_validator Validator(nullptr, my_format_checker);
Validator.set_root_schema(RootSchema_);
Validator.validate(Doc,CE);
return true; return true;
} catch (const std::invalid_argument &E) {
std::cout << "1 Validation failed, here is why: " << E.what() << "\n";
Error = E.what();
return false;
} catch (const std::logic_error &E) {
std::cout << "2 Validation failed, here is why: " << E.what() << "\n";
Error = E.what();
return false;
} catch(const std::exception &E) { } catch(const std::exception &E) {
Error = E.what(); Error = E.what();
std::cout << "3 Validation failed, here is why: " << E.what() << "\n"; std::cout << "Validation failed, here is why: " << E.what() << "\n";
return false; return false;
} catch(...) {
std::cout << "4 Some kind of bullshit exception..." << std::endl;
} }
} }
return true; return true;
} }
void ConfigurationValidator::reinitialize([[maybe_unused]] Poco::Util::Application &self) { void ConfigurationValidator::reinitialize(Poco::Util::Application &self) {
Logger().information("Reinitializing."); Logger_.information("Reinitializing.");
Working_ = Initialized_ = false; Working_ = Initialized_ = false;
Init(); Init();
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,17 +1,25 @@
// //
// 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;
@@ -20,19 +28,15 @@ namespace OpenWifi::Types {
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

View 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

View 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

View File

@@ -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;
} }

View File

@@ -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

View File

@@ -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 {
@@ -98,7 +97,6 @@ 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(")");
@@ -109,13 +107,11 @@ namespace ORM {
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:
return "REAL";
default: default:
assert(false); assert(false);
return "";
} }
assert(false); assert(false);
return ""; return "";
@@ -124,12 +120,11 @@ 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;
} }
@@ -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: { // std::cout << "CREATE-DB: " << S << std::endl;
try { try {
Poco::Data::Session Session = Pool_.get(); Poco::Data::Session Session = Pool_.get();
std::string Statement = "create table if not exists " + TableName_ + " ( " + CreateFields_ + " )"; Poco::Data::Statement CreateStatement(Session);
Session << Statement , Poco::Data::Keywords::now;
for(const auto &i:IndexCreation_) { CreateStatement << S;
Session << i , Poco::Data::Keywords::now; CreateStatement.execute();
} return true;
} catch (const Poco::Exception &E) { } catch (const Poco::Exception &E) {
Logger_.error("Failure to create POSTGRESQL DB resources."); std::cout << "Exception while creating DB: " << E.name() << std::endl;
Logger_.log(E);
} }
} return false;
break;
}
return Upgrade();
} }
[[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),
@@ -483,23 +404,20 @@ namespace ORM {
} }
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

View File

@@ -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

View 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

View File

@@ -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);
}

View File

@@ -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:
};
}

View File

@@ -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);
}

View File

@@ -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:
};
}

View File

@@ -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);
}

View File

@@ -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:
};
}

View 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;
}
}

View 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

View File

@@ -0,0 +1,5 @@
//
// Created by stephane bourque on 2021-07-12.
//
#include "storage_deviceTypes.h"

View 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

View 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;
}
}

View 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

View 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;
}
}

View 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

View 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;
}
}

View File

@@ -34,20 +34,11 @@ 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')
@@ -82,12 +73,17 @@ 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
for index in {0..10}
do
endpointlocation=".endpoints[${index}].uri"
endpointlocationtype=".endpoints[${index}].type"
rawurl="$(cat ${result_file} | jq -r ${endpointlocation})"
svctype="$(cat ${result_file} | jq -r ${endpointlocationtype})"
proto="$(echo $rawurl | grep :// | sed -e's,^\(.*://\).*,\1,g')" proto="$(echo $rawurl | grep :// | sed -e's,^\(.*://\).*,\1,g')"
url="$(echo ${rawurl/$proto/})" url="$(echo ${rawurl/$proto/})"
user="$(echo $url | grep @ | cut -d@ -f1)" user="$(echo $url | grep @ | cut -d@ -f1)"
@@ -95,56 +91,56 @@ if [ -z ${OWFMS_OVERRIDE+x} ]; then
host="$(echo $hostport | sed -e 's,:.*,,g')" host="$(echo $hostport | sed -e 's,:.*,,g')"
port="$(echo $hostport | sed -e 's,^.*:,:,g' -e 's,.*:\([0-9]*\).*,\1,g' -e 's,[^0-9],,g')" port="$(echo $hostport | sed -e 's,^.*:,:,g' -e 's,.*:\([0-9]*\).*,\1,g' -e 's,[^0-9],,g')"
path="$(echo $url | grep / | cut -d/ -f2-)" path="$(echo $url | grep / | cut -d/ -f2-)"
export OWFMS=${url} if [[ ${url} != "null" ]]
echo "Using ${OWFMS}..." then
else if [[ ${svctype} == "owfms" ]]
echo "OWFMS endpoint is not found:" then
jq < ${result_file} # echo "url: $url"
exit 1 # echo " proto: $proto"
# echo " user: $user"
# echo " host: $host"
# echo " port: $port"
# echo " path: $path"
OWFMS="${url}"
break
fi fi
fi
else done
export OWFMS=${OWFMS_OVERRIDE} echo "Using ${OWFMS}..."
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,161 +166,66 @@ 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() {
echo "Usage: cli <cmd> [args]" echo "Usage: cli <cmd> [args]"
@@ -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

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