mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralgw.git
synced 2025-11-02 03:37:57 +00:00
Compare commits
203 Commits
dev-micros
...
v2.1.0-RC1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf69a47195 | ||
|
|
df71d60c2c | ||
|
|
9eef500eb9 | ||
|
|
8172b9c55e | ||
|
|
a35d3d73c2 | ||
|
|
5ae99dd04b | ||
|
|
5f118b51d4 | ||
|
|
b7a762ad44 | ||
|
|
a236bd7e4a | ||
|
|
25af9bee46 | ||
|
|
897f5076b2 | ||
|
|
dd7a7bbc74 | ||
|
|
ef4af5b379 | ||
|
|
cfb562bb7a | ||
|
|
0675192f2c | ||
|
|
27f0c5fe75 | ||
|
|
5153f16d00 | ||
|
|
deff8e5253 | ||
|
|
152ba10a13 | ||
|
|
36cb68fef7 | ||
|
|
7874cf3bd0 | ||
|
|
6ea7e93cb0 | ||
|
|
3520fb5ed4 | ||
|
|
c2266581b9 | ||
|
|
389de28cfb | ||
|
|
595dc5d42b | ||
|
|
c1d75c09be | ||
|
|
c0941512ae | ||
|
|
1f83f954dd | ||
|
|
3f7385d248 | ||
|
|
25d13d3cb2 | ||
|
|
5120b2cb64 | ||
|
|
bca4f6cfcd | ||
|
|
0b2ca909ed | ||
|
|
3a5a5ae7bc | ||
|
|
1d102cf1e9 | ||
|
|
4644d231c4 | ||
|
|
c50ed2f252 | ||
|
|
7bba3da732 | ||
|
|
6f9abd32e7 | ||
|
|
1c3e98619a | ||
|
|
20fe93fcdc | ||
|
|
57a9114ac5 | ||
|
|
4b2eecf8b0 | ||
|
|
ed88cbfce6 | ||
|
|
f7e70f5839 | ||
|
|
d76ef5e1d0 | ||
|
|
a4cf28c858 | ||
|
|
4f5e21d658 | ||
|
|
bd5f7cd373 | ||
|
|
d74795fd96 | ||
|
|
3fe17e58de | ||
|
|
adba0fbe22 | ||
|
|
64a99e5079 | ||
|
|
34def33f69 | ||
|
|
de34051cd4 | ||
|
|
346d845ee9 | ||
|
|
83ada431de | ||
|
|
2563d7e9b3 | ||
|
|
1f0f3e8f38 | ||
|
|
f13ecd0d1c | ||
|
|
54f35de99f | ||
|
|
f7b6c6f90f | ||
|
|
f003149b8d | ||
|
|
4f9e7c9677 | ||
|
|
14d7aad56c | ||
|
|
aa4d2ae764 | ||
|
|
4e60b248ca | ||
|
|
685f9024d7 | ||
|
|
104d429b69 | ||
|
|
8cf5672a73 | ||
|
|
186f7624a6 | ||
|
|
8986cde273 | ||
|
|
0abc3de4cd | ||
|
|
d219fab455 | ||
|
|
3b3e79ac14 | ||
|
|
2ff32a69e6 | ||
|
|
2b66f15bda | ||
|
|
508ff00663 | ||
|
|
d0fc391cde | ||
|
|
77a031eaa3 | ||
|
|
a6f6421992 | ||
|
|
fdf497397e | ||
|
|
ab605655e1 | ||
|
|
422574ed65 | ||
|
|
34f9b6f761 | ||
|
|
27e8178444 | ||
|
|
ba6796cd16 | ||
|
|
816d5da3ba | ||
|
|
c9c3c16e0b | ||
|
|
35dc055c40 | ||
|
|
6760ca1da1 | ||
|
|
36e6ee3ac4 | ||
|
|
362d97de1f | ||
|
|
530a2bb772 | ||
|
|
b333af3465 | ||
|
|
1b405987bf | ||
|
|
6dd52f86b9 | ||
|
|
76081e82af | ||
|
|
ebe2d16a87 | ||
|
|
60e4ced29a | ||
|
|
5683054349 | ||
|
|
210a96c143 | ||
|
|
92e108aa6b | ||
|
|
691b82589d | ||
|
|
4b471af065 | ||
|
|
3c556da991 | ||
|
|
9ddd371c86 | ||
|
|
5391468ea2 | ||
|
|
8daffc2ccf | ||
|
|
f58c204f51 | ||
|
|
5e857d6019 | ||
|
|
a7fe50f956 | ||
|
|
40239079a4 | ||
|
|
27c4602fca | ||
|
|
c107c6da93 | ||
|
|
f67995b4a9 | ||
|
|
851fdb1f1d | ||
|
|
8f52dc57ba | ||
|
|
427ee37b16 | ||
|
|
fc153f7fc9 | ||
|
|
5c9f571565 | ||
|
|
ab3905f6d8 | ||
|
|
9cee7d4588 | ||
|
|
dd95731b22 | ||
|
|
101384d595 | ||
|
|
77297d5a3e | ||
|
|
8b3c3a50ed | ||
|
|
4b5128e41d | ||
|
|
b11d713e5b | ||
|
|
143c4078d4 | ||
|
|
b6babaa2f8 | ||
|
|
57f0425bc0 | ||
|
|
c28159ebe7 | ||
|
|
2a0be33c23 | ||
|
|
f1c77c0a63 | ||
|
|
64fd80f489 | ||
|
|
840481f0d0 | ||
|
|
f7e450a66e | ||
|
|
2d8f925115 | ||
|
|
3988f6c38c | ||
|
|
4d1ebd398a | ||
|
|
2790fb0de1 | ||
|
|
02c40835f5 | ||
|
|
4c75a2cd71 | ||
|
|
d0df73fa86 | ||
|
|
660570df44 | ||
|
|
5f8f4137b0 | ||
|
|
de164d30dd | ||
|
|
a69c51afd3 | ||
|
|
161ddd281e | ||
|
|
5e36935f3b | ||
|
|
91dd93fcd5 | ||
|
|
12152a6a6e | ||
|
|
326b33ce63 | ||
|
|
9effac0c6e | ||
|
|
4bc8788df2 | ||
|
|
e8cfcbb507 | ||
|
|
44f427fcc7 | ||
|
|
487e043e4f | ||
|
|
6d294e6add | ||
|
|
d39fe0b07c | ||
|
|
64719877f3 | ||
|
|
127e455fe5 | ||
|
|
e7b625d058 | ||
|
|
fdccb31482 | ||
|
|
fc1daade6e | ||
|
|
99e937614b | ||
|
|
f341598056 | ||
|
|
0f6ec15fa2 | ||
|
|
34a04b406c | ||
|
|
a2ae90a7cb | ||
|
|
52e252576a | ||
|
|
9345c4892d | ||
|
|
89c325190a | ||
|
|
add35585e0 | ||
|
|
b8fe3e41fa | ||
|
|
bb4effa518 | ||
|
|
997f2c4787 | ||
|
|
56f0a3f46a | ||
|
|
ff911cb478 | ||
|
|
f31aa8711e | ||
|
|
523bbbcb84 | ||
|
|
0010a5fc02 | ||
|
|
8a440cfcd8 | ||
|
|
3ebd5426f4 | ||
|
|
46b3cad88b | ||
|
|
e756a7c1cd | ||
|
|
8e216417f7 | ||
|
|
3a7a386a87 | ||
|
|
ebc6af17b3 | ||
|
|
c3d17499b1 | ||
|
|
01473a337b | ||
|
|
4e9dfe53d5 | ||
|
|
39a6daecf5 | ||
|
|
897dc735d1 | ||
|
|
8c406c57e0 | ||
|
|
923386a06f | ||
|
|
ca52d187ca | ||
|
|
925285b7db | ||
|
|
f8fd154dd8 | ||
|
|
8b0586b122 | ||
|
|
4d119fabd5 |
106
.github/workflows/ci.yml
vendored
106
.github/workflows/ci.yml
vendored
@@ -7,11 +7,12 @@ on:
|
||||
- '**.md'
|
||||
branches:
|
||||
- master
|
||||
- dev-microservice
|
||||
- 'release/*'
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- dev-microservice
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -26,87 +27,102 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: build Docker image
|
||||
- name: Build Docker image
|
||||
run: docker build -t wlan-cloud-ucentralgw:${{ github.sha }} .
|
||||
|
||||
- name: log into Docker registry
|
||||
- name: Tag Docker image
|
||||
run: |
|
||||
TAGS="${{ github.sha }}"
|
||||
|
||||
if [[ ${GITHUB_REF} == "refs/heads/"* ]]
|
||||
then
|
||||
CURRENT_TAG=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')
|
||||
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-ucentralgw:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw:$tag
|
||||
done
|
||||
|
||||
- name: Log into Docker registry
|
||||
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{ env.DOCKER_REGISTRY_URL }}
|
||||
username: ${{ env.DOCKER_REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
|
||||
|
||||
- name: push Docker image
|
||||
- name: Push Docker images
|
||||
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
|
||||
run: |
|
||||
TAGS="${{ github.sha }}"
|
||||
|
||||
if [ ${GITHUB_REF} == "refs/heads/master" ]
|
||||
then
|
||||
TAGS="$TAGS ${GITHUB_REF#refs/heads/}"
|
||||
else # PR build
|
||||
CURRENT_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
|
||||
TAGS="$TAGS $CURRENT_TAG"
|
||||
fi
|
||||
|
||||
echo "Pushing tags $TAGS"
|
||||
|
||||
for tag in $TAGS; do
|
||||
docker tag wlan-cloud-ucentralgw:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw:$tag
|
||||
docker push ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw:$tag
|
||||
done
|
||||
docker images | grep ${{ env.DOCKER_REGISTRY_URL }}/ucentralgw | awk -F ' ' '{print $1":"$2}' | xargs -I {} docker push {}
|
||||
|
||||
docker-compose:
|
||||
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
|
||||
runs-on: ubuntu-20.04
|
||||
needs: docker
|
||||
steps:
|
||||
- name: Check out repository
|
||||
- name: Check out wlan-cloud-ucentral-deploy repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Create certificate and key files from Github secrets
|
||||
env:
|
||||
DIGICERT_TIP_WILDCARD_CERT: ${{ secrets.DIGICERT_TIP_WILDCARD_CERT }}
|
||||
DIGICERT_TIP_WILDCARD_KEY: ${{ secrets.DIGICERT_TIP_WILDCARD_KEY }}
|
||||
run: |
|
||||
cat certificates/issuer.pem certificates/root.pem > docker-compose/ucentral-data/certs/restapi-ca.pem
|
||||
echo "$DIGICERT_TIP_WILDCARD_CERT" > docker-compose/ucentral-data/certs/websocket-cert.pem
|
||||
echo "$DIGICERT_TIP_WILDCARD_CERT" > docker-compose/ucentral-data/certs/restapi-cert.pem
|
||||
echo "$DIGICERT_TIP_WILDCARD_KEY" > docker-compose/ucentral-data/certs/websocket-key.pem
|
||||
echo "$DIGICERT_TIP_WILDCARD_KEY" > docker-compose/ucentral-data/certs/restapi-key.pem
|
||||
with:
|
||||
repository: Telecominfraproject/wlan-cloud-ucentral-deploy
|
||||
path: wlan-cloud-ucentral-deploy
|
||||
|
||||
- name: Instantiate Docker Compose deployment
|
||||
working-directory: ./docker-compose
|
||||
working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
|
||||
env:
|
||||
UCENTRALGW_TAG: ${{ github.sha }}
|
||||
run: |
|
||||
docker-compose up -d
|
||||
|
||||
- name: Wait for uCentralGW to be alive and kicking
|
||||
- name: Wait for uCentralSec to be alive and kicking
|
||||
run: |
|
||||
n=0
|
||||
until [ "$n" -ge 3 ]
|
||||
do
|
||||
curl -s 127.0.0.1:15015 && break
|
||||
n=$((n+1))
|
||||
if [ "$n" -eq 3]; then
|
||||
curl -s 127.0.0.1:16102 && break
|
||||
n=$((n+1))
|
||||
if [ "$n" -eq 3]; then
|
||||
exit 1
|
||||
else
|
||||
sleep 3
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Check functionality of uCentralGW
|
||||
env:
|
||||
UCENTRALGW: "ucentral.cicd.lab.wlan.tip.build:16001"
|
||||
FLAGS: "-s --cacert docker-compose/ucentral-data/certs/restapi-ca.pem --resolve ucentral.cicd.lab.wlan.tip.build:16001:127.0.0.1"
|
||||
- name: Add self-signed certificates to system trust store of containers
|
||||
working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
|
||||
run: |
|
||||
./test_scripts/curl/cli listdevices
|
||||
./add-ca-cert.sh
|
||||
|
||||
- name: Check out wlan-cloud-ucentralgw repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: wlan-cloud-ucentralgw
|
||||
|
||||
- name: Check functionality of microservices
|
||||
env:
|
||||
UCENTRALSEC: "ucentral.wlan.local:16001"
|
||||
FLAGS: "-s --cacert ./wlan-cloud-ucentral-deploy/docker-compose/certs/restapi-ca.pem --resolve ucentral.wlan.local:16001:127.0.0.1"
|
||||
run: |
|
||||
./wlan-cloud-ucentralgw/test_scripts/curl/cli listdevices
|
||||
|
||||
- name: Display information about running containers and log ucentralgw output
|
||||
working-directory: ./docker-compose
|
||||
working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
|
||||
if: always()
|
||||
run: |
|
||||
docker-compose ps -a
|
||||
docker-compose logs
|
||||
docker-compose logs
|
||||
|
||||
# disable until repo is public
|
||||
#- name: export Docker image
|
||||
|
||||
1
.github/workflows/cleanup.yml
vendored
1
.github/workflows/cleanup.yml
vendored
@@ -4,7 +4,6 @@ on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- dev-microservice
|
||||
types: [ closed ]
|
||||
|
||||
defaults:
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -25,3 +25,6 @@ _deps
|
||||
test_scripts/curl/token.json
|
||||
.vscode/c_cpp_properties.json
|
||||
test_scripts/curl/result.json
|
||||
*.swp
|
||||
helm/charts/*
|
||||
!helm/charts/.gitkeep
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(ucentralgw VERSION 0.4.0)
|
||||
project(ucentralgw VERSION 2.1.0)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
@@ -45,8 +45,7 @@ else()
|
||||
find_package(CppKafka REQUIRED)
|
||||
find_package(PostgreSQL REQUIRED)
|
||||
find_package(MySQL REQUIRED)
|
||||
find_package(ODBC REQUIRED)
|
||||
find_package(Poco REQUIRED COMPONENTS JSON Crypto JWT Net Util NetSSL Data DataSQLite DataPostgreSQL DataMySQL DataODBC)
|
||||
find_package(Poco REQUIRED COMPONENTS JSON Crypto JWT Net Util NetSSL Data DataSQLite DataPostgreSQL DataMySQL)
|
||||
endif()
|
||||
|
||||
include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
|
||||
@@ -64,7 +63,7 @@ add_executable( ucentralgw
|
||||
src/RESTAPI_device_handler.cpp src/RESTAPI_device_handler.h
|
||||
src/RESTAPI_handler.cpp src/RESTAPI_handler.h
|
||||
src/RESTAPI_device_commandHandler.cpp src/RESTAPI_device_commandHandler.h
|
||||
src/RESTAPI_GWobjects.h src/RESTAPI_GWobjects.cpp
|
||||
src/RESTAPI_GWobjects.h src/RESTAPI_GWobjects.cpp
|
||||
src/CentralConfig.cpp src/CentralConfig.h
|
||||
src/RESTAPI_default_configuration.cpp
|
||||
src/RESTAPI_InternalServer.cpp src/RESTAPI_InternalServer.h
|
||||
@@ -74,21 +73,29 @@ add_executable( ucentralgw
|
||||
src/RESTAPI_command.cpp src/RESTAPI_command.h
|
||||
src/FileUploader.cpp src/FileUploader.h
|
||||
src/RESTAPI_file.cpp src/RESTAPI_file.h
|
||||
src/CommandChannel.cpp src/CommandChannel.h
|
||||
src/RESTAPI_system_command.cpp src/RESTAPI_system_command.h
|
||||
src/RESTAPI_BlackList.cpp src/RESTAPI_BlackList.h
|
||||
src/Utils.h src/Utils.cpp src/storage_blacklist.cpp
|
||||
src/storage_command.cpp src/storage_healthcheck.cpp src/storage_statistics.cpp src/storage_logs.cpp
|
||||
src/storage_device.cpp src/storage_capabilities.cpp src/storage_defconfig.cpp src/storage_sqlite.cpp
|
||||
src/storage_mysql.cpp src/storage_pgql.cpp src/storage_odbc.cpp src/storage_tables.cpp src/RESTAPI_callback.cpp
|
||||
src/RESTAPI_callback.h src/CallbackManager.cpp src/CallbackManager.h
|
||||
src/storage_device.cpp src/storage_capabilities.cpp src/storage_defconfig.cpp
|
||||
src/storage_tables.cpp
|
||||
src/storage_setup.cpp
|
||||
src/StateProcessor.cpp src/StateProcessor.h
|
||||
src/storage_lifetime_stats.cpp src/uCentralProtocol.h src/RESTAPI_protocol.h
|
||||
src/ALBHealthCheckServer.h src/Kafka_topics.h src/uCentralTypes.h
|
||||
src/ALBHealthCheckServer.h src/Kafka_topics.h
|
||||
src/OUIServer.cpp src/OUIServer.h
|
||||
src/RESTAPI_ouis.cpp src/RESTAPI_ouis.h
|
||||
src/MicroService.cpp src/MicroService.h
|
||||
src/RESTAPI_RPC.cpp src/RESTAPI_RPC.h src/AuthClient.cpp src/AuthClient.h src/OpenAPIRequest.cpp src/OpenAPIRequest.h src/RESTAPI_utils.h src/RESTAPI_utils.cpp src/StorageArchiver.cpp src/StorageArchiver.h)
|
||||
src/RESTAPI_RPC.cpp src/RESTAPI_RPC.h
|
||||
src/AuthClient.cpp src/AuthClient.h
|
||||
src/OpenAPIRequest.cpp src/OpenAPIRequest.h
|
||||
src/RESTAPI_utils.h src/RESTAPI_utils.cpp
|
||||
src/StorageArchiver.cpp src/StorageArchiver.h
|
||||
src/Dashboard.cpp src/Dashboard.h
|
||||
src/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI_deviceDashboardHandler.h
|
||||
src/SerialNumberCache.cpp src/SerialNumberCache.h
|
||||
src/RESTAPI_webSocketServer.cpp src/RESTAPI_webSocketServer.h
|
||||
src/OpenWifiTypes.h)
|
||||
|
||||
if(NOT SMALL_BUILD)
|
||||
target_sources(ucentralgw PUBLIC src/KafkaManager.cpp src/KafkaManager.h)
|
||||
@@ -102,7 +109,7 @@ target_link_libraries(ucentralgw PUBLIC
|
||||
${Poco_LIBRARIES} ${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
|
||||
if(NOT SMALL_BUILD)
|
||||
target_link_libraries(ucentralgw PUBLIC
|
||||
${MySQL_LIBRARIES} ${ODBC_LIBRARIES} ${ZLIB_LIBRARIES}
|
||||
${MySQL_LIBRARIES} ${ZLIB_LIBRARIES}
|
||||
CppKafka::cppkafka
|
||||
)
|
||||
if(UNIX AND NOT APPLE)
|
||||
|
||||
40
Dockerfile
40
Dockerfile
@@ -1,13 +1,13 @@
|
||||
FROM alpine AS builder
|
||||
|
||||
RUN apk update && \
|
||||
apk add --no-cache openssl openssh && \
|
||||
apk add --no-cache ncurses-libs && \
|
||||
apk add --no-cache bash util-linux coreutils curl && \
|
||||
apk add --no-cache make cmake gcc g++ libstdc++ libgcc git zlib-dev yaml-cpp-dev && \
|
||||
apk add --no-cache openssl-dev boost-dev unixodbc-dev postgresql-dev mariadb-dev && \
|
||||
apk add --no-cache apache2-utils yaml-dev apr-util-dev && \
|
||||
apk add --no-cache lua-dev librdkafka-dev
|
||||
RUN apk add --update --no-cache \
|
||||
openssl openssh \
|
||||
ncurses-libs \
|
||||
bash util-linux coreutils curl \
|
||||
make cmake gcc g++ libstdc++ libgcc git zlib-dev yaml-cpp-dev \
|
||||
openssl-dev boost-dev unixodbc-dev postgresql-dev mariadb-dev \
|
||||
apache2-utils yaml-dev apr-util-dev \
|
||||
lua-dev librdkafka-dev
|
||||
|
||||
RUN git clone https://github.com/stephb9959/poco /poco
|
||||
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
|
||||
@@ -26,7 +26,7 @@ RUN cmake ..
|
||||
RUN cmake --build . --config Release -j8
|
||||
RUN cmake --build . --target install
|
||||
|
||||
ADD CMakeLists.txt /ucentralgw/
|
||||
ADD CMakeLists.txt build /ucentralgw/
|
||||
ADD cmake /ucentralgw/cmake
|
||||
ADD src /ucentralgw/src
|
||||
|
||||
@@ -38,18 +38,24 @@ RUN cmake --build . --config Release -j8
|
||||
|
||||
FROM alpine
|
||||
|
||||
ENV UCENTRALGW_USER=ucentralgw \
|
||||
UCENTRALGW_ROOT=/ucentralgw-data \
|
||||
UCENTRALGW_CONFIG=/ucentralgw-data
|
||||
|
||||
RUN addgroup -S "$UCENTRALGW_USER" && \
|
||||
adduser -S -G "$UCENTRALGW_USER" "$UCENTRALGW_USER"
|
||||
|
||||
RUN mkdir /ucentral
|
||||
RUN mkdir /ucentralgw-data
|
||||
RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc
|
||||
RUN mkdir -p "$UCENTRALGW_ROOT" "$UCENTRALGW_CONFIG" && \
|
||||
chown "$UCENTRALGW_USER": "$UCENTRALGW_ROOT" "$UCENTRALGW_CONFIG"
|
||||
RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc su-exec
|
||||
|
||||
COPY --from=builder /ucentralgw/cmake-build/ucentralgw /ucentral/ucentralgw
|
||||
COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/
|
||||
COPY --from=builder /poco/cmake-build/lib/* /lib/
|
||||
COPY docker-entrypoint.sh /
|
||||
|
||||
EXPOSE 15002
|
||||
EXPOSE 16002
|
||||
EXPOSE 16003
|
||||
EXPOSE 17002
|
||||
EXPOSE 16102
|
||||
EXPOSE 15002 16002 16003 17002 16102
|
||||
|
||||
ENTRYPOINT /ucentral/ucentralgw
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
CMD ["/ucentral/ucentralgw"]
|
||||
|
||||
68
README.md
68
README.md
@@ -26,9 +26,9 @@ Poco may take several minutes depending on the platform you are building on.
|
||||
### Ubuntu
|
||||
These instructions have proven to work on Ubuntu 20.4.
|
||||
```
|
||||
sudo apt install git cmake g++ libssl-dev libmariabd-dev unixodbc-dev
|
||||
sudo apt install git cmake g++ libssl-dev libmariadb-dev unixodbc-dev
|
||||
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
|
||||
sudo apt install librdkafka-dev liblua5.3-dev
|
||||
sudo apt install librdkafka-dev liblua5.3-dev libmysqlclient-dev
|
||||
|
||||
git clone https://github.com/stephb9959/poco
|
||||
cd poco
|
||||
@@ -153,8 +153,8 @@ cmake -DSMALL_BUILD=1 ..
|
||||
make
|
||||
```
|
||||
|
||||
### After the build step is completed
|
||||
Once your build is done. You can remove the Poco source as it is no longer needed.
|
||||
### After completing the build
|
||||
After completing the build, you can remove the Poco source as it is no longer needed.
|
||||
|
||||
#### Expected directory layout
|
||||
From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `uploads` directories.
|
||||
@@ -220,13 +220,13 @@ in your browner
|
||||
#### Configuration
|
||||
The configuration for this service is kept in a properties file. This file is called `ucentralgw.properties` and you can
|
||||
see the latest version [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/ucentralgw.properties). The file will be loaded from
|
||||
the directory set by the environment variable `UCENTRAL_CONFIG`. To use environment variables in the configuration,
|
||||
the directory set by the environment variable `UCENTRALGW_CONFIG`. To use environment variables in the configuration,
|
||||
you must use `$<varname>`. Only `path names` support the use of environment variables. The sample configuration requires very
|
||||
little changes if you keep the suggested directory structure. For the sample configuration to work, you need to define 2
|
||||
environment variables.
|
||||
```
|
||||
export UCENTRAL_ROOT=`pwd`
|
||||
export UCENTRAL_CONFIG=`pwd`
|
||||
export UCENTRALGW_ROOT=`pwd`
|
||||
export UCENTRALGW_CONFIG=`pwd`
|
||||
```
|
||||
If you current working directory is the root of the project, this will set the variables properly. Otherwise, you can set the variables
|
||||
to point to wherever is necessary.
|
||||
@@ -234,7 +234,7 @@ to point to wherever is necessary.
|
||||
##### Important config entries
|
||||
###### This is the logging directory
|
||||
```
|
||||
logging.channels.c2.path = $UCENTRAL_ROOT/logs/sample.log
|
||||
logging.channels.c2.path = $UCENTRALGW_ROOT/logs/sample.log
|
||||
```
|
||||
|
||||
###### This is the type of storage in use
|
||||
@@ -255,11 +255,11 @@ ucentral.devicetypes.2 = IOT:esp32
|
||||
```asm
|
||||
ucentral.restapi.host.0.backlog = 100
|
||||
ucentral.restapi.host.0.security = relaxed
|
||||
ucentral.restapi.host.0.rootca = $UCENTRAL_ROOT/certs/restapi-ca.pem
|
||||
ucentral.restapi.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
|
||||
ucentral.restapi.host.0.address = *
|
||||
ucentral.restapi.host.0.port = 16002
|
||||
ucentral.restapi.host.0.cert = $UCENTRAL_ROOT/certs/restapi-cert.pem
|
||||
ucentral.restapi.host.0.key = $UCENTRAL_ROOT/certs/restapi-key.pem
|
||||
ucentral.restapi.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
|
||||
ucentral.restapi.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.restapi.host.0.key.password = mypassword
|
||||
```
|
||||
|
||||
@@ -309,12 +309,12 @@ You will need to get the `cert.pem` and `key.pem` from Digicert. The rest is her
|
||||
|
||||
```asm
|
||||
ucentral.websocket.host.0.backlog = 500
|
||||
ucentral.websocket.host.0.rootca = $UCENTRAL_ROOT/certs/root.pem
|
||||
ucentral.websocket.host.0.issuer = $UCENTRAL_ROOT/certs/issuer.pem
|
||||
ucentral.websocket.host.0.cert = $UCENTRAL_ROOT/certs/websocket-cert.pem
|
||||
ucentral.websocket.host.0.key = $UCENTRAL_ROOT/certs/websocket-key.pem
|
||||
ucentral.websocket.host.0.clientcas = $UCENTRAL_ROOT/certs/clientcas.pem
|
||||
ucentral.websocket.host.0.cas = $UCENTRAL_ROOT/certs/cas
|
||||
ucentral.websocket.host.0.rootca = $UCENTRALGW_ROOT/certs/root.pem
|
||||
ucentral.websocket.host.0.issuer = $UCENTRALGW_ROOT/certs/issuer.pem
|
||||
ucentral.websocket.host.0.cert = $UCENTRALGW_ROOT/certs/websocket-cert.pem
|
||||
ucentral.websocket.host.0.key = $UCENTRALGW_ROOT/certs/websocket-key.pem
|
||||
ucentral.websocket.host.0.clientcas = $UCENTRALGW_ROOT/certs/clientcas.pem
|
||||
ucentral.websocket.host.0.cas = $UCENTRALGW_ROOT/certs/cas
|
||||
ucentral.websocket.host.0.address = *
|
||||
ucentral.websocket.host.0.port = 15002
|
||||
ucentral.websocket.host.0.security = strict
|
||||
@@ -325,15 +325,15 @@ ucentral.websocket.maxreactors = 20
|
||||
###### This is the end point for the devices when uploading files
|
||||
```asm
|
||||
ucentral.fileuploader.host.0.backlog = 100
|
||||
ucentral.fileuploader.host.0.rootca = $UCENTRAL_ROOT/certs/restapi-ca.pem
|
||||
ucentral.fileuploader.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
|
||||
ucentral.fileuploader.host.0.security = relaxed
|
||||
ucentral.fileuploader.host.0.address = *
|
||||
ucentral.fileuploader.host.0.name = 192.168.1.176
|
||||
ucentral.fileuploader.host.0.port = 16003
|
||||
ucentral.fileuploader.host.0.cert = $UCENTRAL_ROOT/certs/restapi-cert.pem
|
||||
ucentral.fileuploader.host.0.key = $UCENTRAL_ROOT/certs/restapi-key.pem
|
||||
ucentral.fileuploader.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
|
||||
ucentral.fileuploader.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.fileuploader.host.0.key.password = mypassword
|
||||
ucentral.fileuploader.path = $UCENTRAL_ROOT/uploads
|
||||
ucentral.fileuploader.path = $UCENTRALGW_ROOT/uploads
|
||||
ucentral.fileuploader.maxsize = 10000
|
||||
```
|
||||
|
||||
@@ -369,7 +369,7 @@ can be any of the keys you are already using. You must keep that keep secret and
|
||||
this is the entry
|
||||
|
||||
```asm
|
||||
ucentral.service.key = $UCENTRAL_ROOT/certs/websocket-key.pem
|
||||
ucentral.service.key = $UCENTRALGW_ROOT/certs/websocket-key.pem
|
||||
```
|
||||
|
||||
#### Command line options
|
||||
@@ -391,7 +391,7 @@ A uCentral gateway implementation for TIP.
|
||||
```
|
||||
|
||||
##### file
|
||||
This allows you to point to another file without specifying the UCENTRAL_CONFIG variable. The file name must end in `.properties`.
|
||||
This allows you to point to another file without specifying the UCENTRALGW_CONFIG variable. The file name must end in `.properties`.
|
||||
##### daemon
|
||||
Run this as a UNIX service
|
||||
##### pidfile
|
||||
@@ -452,7 +452,7 @@ docker run -d -p 15002:15002 \
|
||||
--init \
|
||||
--volume="$PWD:/ucentral-data" \
|
||||
-e UCENTRAL_ROOT="/ucentral-data" \
|
||||
-e UCENTRAL_CONFIG="/ucentral-data" \
|
||||
-e UCENTRALGW_CONFIG="/ucentral-data" \
|
||||
--name="ucentralgw" $DOCKER_NAME
|
||||
|
||||
```
|
||||
@@ -493,29 +493,11 @@ Please refer to the `certs` directory from the sections above.
|
||||
The configuration for this service is kept in a properties file. Currently, this configuration file must be kept in the
|
||||
current directory of uCentral or one level up. This file is called `ucentralgw.properties` and you can see the latest version
|
||||
[here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/ucentralgw.properties). The file will be loaded from
|
||||
the directory set by the environment variable `UCENTRAL_CONFIG`. To use environment variables in the configuration,
|
||||
the directory set by the environment variable `UCENTRALGW_CONFIG`. To use environment variables in the configuration,
|
||||
you must use `$<varname>`. The path for the logs for the service must exist prior to starting the
|
||||
service. The path is defined under `logging.channels.c2.path`. Only `path names` support the use of
|
||||
environment variables. Here is a sample configuration:
|
||||
|
||||
### Docker Compose
|
||||
The repository also contains a Docker Compose file, which you can use to instantiate a complete deployment of the uCentral microservices and related components for local development purposes. To spin up a local development environment:
|
||||
1. Switch into the project directory with `cd docker-compose/`.
|
||||
2. This repository contains a gateway certificate signed by TIP and a self-signed certificate for the REST API and other components which are used by default in the Compose deployment. The certificates are valid for the `*.wlan.local` domain and the Docker Compose uCentral microservice configs use `ucentral.wlan.local` as a hostname, so make sure you add an entry in your hosts file (or in your local DNS solution) which points to `127.0.0.1`.
|
||||
3. If you have your own certificates and want to use the deployment for anything other than local development copy your certs into the `certs/` directory and reference them in the appropriate sections of the microservice configuration files. Make sure to also adapt the sections which reference the hostname. For more information on certificates please see the [certificates section](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw#certificates) of this README and/or [CERTIFICATES.md](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CERTIFICATES.md).
|
||||
4. Docker Compose pulls the microservice images from the JFrog repository. If you want to change the image tag or some of the image versions which are used for the other services, have a look into the `.env` file. You'll also find service specific `.env` files in this directory. Edit them if you want to change database passwords (highly recommended!) or other configuration data. Don't forget to adapt your changes in the application configuration files.
|
||||
5. Open `docker-compose/ucentralgw-data/ucentral.properties` to change [authentication data](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw#default-username-and-password) for uCentralGW (again highly recommended!).
|
||||
6. Spin up the deployment with `docker-compose up -d`.
|
||||
7. Navigate to the UI which listens to `127.0.0.1` and login with your uCentralGW authentication data.
|
||||
8. To use the [curl test script](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/TEST_CURL.md) to talk to the API set the following environment variables:
|
||||
```
|
||||
export UCENTRALSEC="ucentral.wlan.local:16001"
|
||||
export FLAGS="-s --cacert docker-compose/ucentral-data/certs/restapi-ca.pem"
|
||||
```
|
||||
The `--cacert` option is necessary since the REST API certificates are self-signed. Omit the option if you provide your own signed certificates.
|
||||
|
||||
PS: The Docker Compose deployment creates five local volumes to persist mostly database data and data for Zookeeper and Kafka. If you want re-create the deployment and remove all persistent application and database data just delete the volumes with `docker volume rm $(docker volume ls -qf name=ucentral)` after you stopped the services with `docker-compose down`.
|
||||
|
||||
## uCentral communication protocol
|
||||
The communication protocol between the device and the controller is detailed in this [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/PROTOCOL.md).
|
||||
|
||||
|
||||
@@ -84,8 +84,9 @@
|
||||
<Option type="1"/>
|
||||
<Option compiler="gcc"/>
|
||||
<Compiler>
|
||||
<Add option="-DAPP_VERSION="0.4.0""/>
|
||||
<Add option="-DBUILD_NUMBER="61""/>
|
||||
<Add option="-DAPP_VERSION="0.7.0""/>
|
||||
<Add option="-DBUILD_NUMBER="120""/>
|
||||
<Add option="-DTIP_GATEWAY_SERVICE="1""/>
|
||||
<Add option="-D_DEBUG"/>
|
||||
<Add option="-DPOCO_ENABLE_CPP14"/>
|
||||
<Add option="-DPOCO_ENABLE_CPP11"/>
|
||||
@@ -98,6 +99,7 @@
|
||||
<Add option="-DBOOST_ALL_NO_LIB"/>
|
||||
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/>
|
||||
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/>
|
||||
<Add directory="/usr/local/opt/mysql-client/include"/>
|
||||
<Add directory="/usr/local/include"/>
|
||||
<Add directory="/usr/local/opt/openssl/include"/>
|
||||
<Add directory="/usr/local/opt/mysql-client/include/mysql"/>
|
||||
@@ -121,8 +123,9 @@
|
||||
<Option type="1"/>
|
||||
<Option compiler="gcc"/>
|
||||
<Compiler>
|
||||
<Add option="-DAPP_VERSION="0.4.0""/>
|
||||
<Add option="-DBUILD_NUMBER="61""/>
|
||||
<Add option="-DAPP_VERSION="0.7.0""/>
|
||||
<Add option="-DBUILD_NUMBER="120""/>
|
||||
<Add option="-DTIP_GATEWAY_SERVICE="1""/>
|
||||
<Add option="-D_DEBUG"/>
|
||||
<Add option="-DPOCO_ENABLE_CPP14"/>
|
||||
<Add option="-DPOCO_ENABLE_CPP11"/>
|
||||
@@ -135,6 +138,7 @@
|
||||
<Add option="-DBOOST_ALL_NO_LIB"/>
|
||||
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src"/>
|
||||
<Add directory="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/include/kafka"/>
|
||||
<Add directory="/usr/local/opt/mysql-client/include"/>
|
||||
<Add directory="/usr/local/include"/>
|
||||
<Add directory="/usr/local/opt/openssl/include"/>
|
||||
<Add directory="/usr/local/opt/mysql-client/include/mysql"/>
|
||||
@@ -155,16 +159,106 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/build">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/ALBHealthCheckServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/AuthClient.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/AuthClient.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CentralConfig.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CentralConfig.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandChannel.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandChannel.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandManager.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/CommandManager.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Daemon.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Daemon.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/DeviceRegistry.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/DeviceRegistry.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/FileUploader.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/FileUploader.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/KafkaManager.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/KafkaManager.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Kafka_topics.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/MicroService.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/MicroService.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OUIServer.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OUIServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OpenAPIRequest.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/OpenAPIRequest.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_BlackList.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_callback.cpp">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_GWobjects.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_callback.h">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_GWobjects.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_InternalServer.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_InternalServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_RPC.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_RPC.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_SecurityObjects.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_SecurityObjects.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_command.cpp">
|
||||
@@ -221,16 +315,13 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_handler.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_oauth2Handler.cpp">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_ouis.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_oauth2Handler.h">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_ouis.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_objects.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_objects.h">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_protocol.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_server.cpp">
|
||||
@@ -245,16 +336,46 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_system_command.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_unknownRequestHandler.cpp">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_utils.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_unknownRequestHandler.h">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/RESTAPI_utils.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/kafka_service.cpp">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StateProcessor.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/kafka_service.h">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StateProcessor.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageArchiver.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageArchiver.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageService.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/StorageService.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/SubSystemServer.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/SubSystemServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Utils.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/Utils.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/WebSocketServer.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/WebSocketServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_blacklist.cpp">
|
||||
@@ -272,13 +393,10 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_device.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_firmware_updates.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_healthcheck.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_identity.cpp">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_lifetime_stats.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_logs.cpp">
|
||||
@@ -287,9 +405,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_mysql.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_odbc.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_pgql.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
@@ -302,82 +417,10 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/storage_tables.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uAuthService.cpp">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralProtocol.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uAuthService.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCallbackManager.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCallbackManager.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentral.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentral.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralConfig.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralConfig.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralWebSocketServer.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralWebSocketServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandChannel.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandChannel.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandManager.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCommandManager.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uDeviceRegistry.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uDeviceRegistry.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFileUploader.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFileUploader.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFirmwareManager.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uFirmwareManager.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uStorageService.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uStorageService.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uSubSystemServer.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uSubSystemServer.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uUtils.cpp">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uUtils.h">
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/src/uCentralTypes.h">
|
||||
<Option target="ucentralgw"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/CMakeLists.txt">
|
||||
@@ -440,12 +483,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoCryptoTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -464,48 +501,18 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataMySQLTargets.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCConfig.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataODBCTargets.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfig.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataPostgreSQLTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -518,24 +525,12 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataSQLiteTargets.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoDataTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -548,12 +543,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoFoundationTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -566,12 +555,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJSONTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -584,12 +567,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoJWTTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -608,24 +585,12 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetSSLTargets.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoNetTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -638,12 +603,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoUtilTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
@@ -656,12 +615,6 @@
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLConfigVersion.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-debug.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-release.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
<Unit filename="/Users/stephb/Desktop/Dropbox/clion/wlan-cloud-ucentralgw/../../../../../../usr/local/lib/cmake/Poco/PocoXMLTargets-relwithdebinfo.cmake">
|
||||
<Option virtualFolder="CMake Files\..\..\..\..\..\..\usr\local\lib\cmake\Poco\"/>
|
||||
</Unit>
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
COMPOSE_PROJECT_NAME=ucentral
|
||||
POSTGRES_TAG=latest
|
||||
MYSQL_TAG=latest
|
||||
UCENTRALGW_TAG=master
|
||||
UCENTRALGWUI_TAG=main
|
||||
UCENTRALSEC_TAG=main
|
||||
RTTYS_TAG=3.6.0
|
||||
KAFKA_TAG=latest
|
||||
ZOOKEEPER_TAG=latest
|
||||
@@ -1,2 +0,0 @@
|
||||
KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
|
||||
ALLOW_PLAINTEXT_LISTENER=yes
|
||||
@@ -1,4 +0,0 @@
|
||||
MYSQL_ROOT_PASSWORD=root
|
||||
MYSQL_USER=rttys
|
||||
MYSQL_PASSWORD=rttys
|
||||
MYSQL_DATABASE=rttys
|
||||
@@ -1,5 +0,0 @@
|
||||
POSTGRES_PASSWORD=ucentralgw
|
||||
POSTGRES_USER=ucentralgw
|
||||
UCENTRALSEC_DB=ucentralsec
|
||||
UCENTRALSEC_DB_USER=ucentralsec
|
||||
UCENTRALSEC_DB_PASSWORD=ucentralsec
|
||||
@@ -1,2 +0,0 @@
|
||||
UCENTRALGW_ROOT=/ucentralgw-data
|
||||
UCENTRALGW_CONFIG=/ucentralgw-data
|
||||
@@ -1,2 +0,0 @@
|
||||
DEFAULT_UCENTRALSEC_URL=https://ucentral.wlan.local:16001
|
||||
ALLOW_UCENTRALSEC_CHANGE=false
|
||||
@@ -1,2 +0,0 @@
|
||||
UCENTRALSEC_ROOT=/ucentralsec-data
|
||||
UCENTRALSEC_CONFIG=/ucentralsec-data
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SERVICES="ucentralgw.wlan.local ucentralsec.wlan.local"
|
||||
|
||||
for i in $SERVICES; do
|
||||
docker-compose exec $i apk add ca-certificates
|
||||
docker cp certs/restapi-ca.pem ucentral_$i\_1:/usr/local/share/ca-certificates/
|
||||
docker-compose exec $i update-ca-certificates
|
||||
done
|
||||
3
docker-compose/certs/.gitignore
vendored
3
docker-compose/certs/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
||||
!cas/
|
||||
2
docker-compose/certs/cas/.gitignore
vendored
2
docker-compose/certs/cas/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
||||
@@ -1,18 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIC4DCCAcgCCQC7oc+4dT4WlTANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJD
|
||||
QTEMMAoGA1UECgwDVElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwHhcNMjEwNzA3
|
||||
MDkyOTAxWhcNMzEwNzA1MDkyOTAxWjAyMQswCQYDVQQGEwJDQTEMMAoGA1UECgwD
|
||||
VElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQD67KEKKHj1xyj0Sc+/WSFeXluhp+76V/8njnGcTus8IsaHWeAj
|
||||
O1T1/PnqNMNP3CSgCpAZRn7Eom33HH89pC7iIE5t3aGrFzxZ6AxFgECUCkby1j9D
|
||||
j7PawapJ7XNqT4P4ZGEGOWlLGE9oUpF2pr3B3jBwmV9t9d/Zp8na23K7rnsr5kNn
|
||||
RXp6iPNPpynppNQFBwzsovyhu9tzk/zz3gohSY9f6oyNNaKcZwN/yrG4B8FnRfa7
|
||||
WFNvkPi5zAjJ3oEXMp+Im2/SvSqzptYwZhplb14ILZ5ClkSwAslG8FiOAzXr887r
|
||||
hgEPzqP6SNIOwy/B/AMOFQl6wPvXBwz9eNW1AgMBAAEwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAA8Oa8jannqNRdqOuY460Pum1B61kGmf2OK2ZiMaddlxqL3ZBdXPqF02hwSd
|
||||
q6uxCVP5NgvqSm+pTHaDcODJiCBrMmGQqHT82LuoCyk1BMqH/PYm+kfazPhKF31x
|
||||
Me7E47DQzk4tMyV28HBCHH6UicQ05ryT1yBfmj8JmYNx9ezmJcanu0/eyI2Lv8Ar
|
||||
Y7mrgblfOUnsif2w/aUaOsoY1t6/ThgTBc3BTMtUXXAcMiPLu4mSdN6nCm75Qp5q
|
||||
4zl/SNPjLnmtpHhLDtr4swf6vZw0RG7ECCf6Av8lv8mJG6g53YM8jfe0EzLqbAFf
|
||||
iSuQbt5n6lMWVgv+FKwXjwAda+Q=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,18 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIC4DCCAcgCCQC7oc+4dT4WlTANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJD
|
||||
QTEMMAoGA1UECgwDVElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwHhcNMjEwNzA3
|
||||
MDkyOTAxWhcNMzEwNzA1MDkyOTAxWjAyMQswCQYDVQQGEwJDQTEMMAoGA1UECgwD
|
||||
VElQMRUwEwYDVQQDDAwqLndsYW4ubG9jYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQD67KEKKHj1xyj0Sc+/WSFeXluhp+76V/8njnGcTus8IsaHWeAj
|
||||
O1T1/PnqNMNP3CSgCpAZRn7Eom33HH89pC7iIE5t3aGrFzxZ6AxFgECUCkby1j9D
|
||||
j7PawapJ7XNqT4P4ZGEGOWlLGE9oUpF2pr3B3jBwmV9t9d/Zp8na23K7rnsr5kNn
|
||||
RXp6iPNPpynppNQFBwzsovyhu9tzk/zz3gohSY9f6oyNNaKcZwN/yrG4B8FnRfa7
|
||||
WFNvkPi5zAjJ3oEXMp+Im2/SvSqzptYwZhplb14ILZ5ClkSwAslG8FiOAzXr887r
|
||||
hgEPzqP6SNIOwy/B/AMOFQl6wPvXBwz9eNW1AgMBAAEwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBAA8Oa8jannqNRdqOuY460Pum1B61kGmf2OK2ZiMaddlxqL3ZBdXPqF02hwSd
|
||||
q6uxCVP5NgvqSm+pTHaDcODJiCBrMmGQqHT82LuoCyk1BMqH/PYm+kfazPhKF31x
|
||||
Me7E47DQzk4tMyV28HBCHH6UicQ05ryT1yBfmj8JmYNx9ezmJcanu0/eyI2Lv8Ar
|
||||
Y7mrgblfOUnsif2w/aUaOsoY1t6/ThgTBc3BTMtUXXAcMiPLu4mSdN6nCm75Qp5q
|
||||
4zl/SNPjLnmtpHhLDtr4swf6vZw0RG7ECCf6Av8lv8mJG6g53YM8jfe0EzLqbAFf
|
||||
iSuQbt5n6lMWVgv+FKwXjwAda+Q=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,28 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD67KEKKHj1xyj0
|
||||
Sc+/WSFeXluhp+76V/8njnGcTus8IsaHWeAjO1T1/PnqNMNP3CSgCpAZRn7Eom33
|
||||
HH89pC7iIE5t3aGrFzxZ6AxFgECUCkby1j9Dj7PawapJ7XNqT4P4ZGEGOWlLGE9o
|
||||
UpF2pr3B3jBwmV9t9d/Zp8na23K7rnsr5kNnRXp6iPNPpynppNQFBwzsovyhu9tz
|
||||
k/zz3gohSY9f6oyNNaKcZwN/yrG4B8FnRfa7WFNvkPi5zAjJ3oEXMp+Im2/SvSqz
|
||||
ptYwZhplb14ILZ5ClkSwAslG8FiOAzXr887rhgEPzqP6SNIOwy/B/AMOFQl6wPvX
|
||||
Bwz9eNW1AgMBAAECggEAZdJT3u1heEqjAc5Z8QnYEpUzlbuxrAC9V23kCEu2BScP
|
||||
bKk53NIcvd00BKf4gZWRfygKJVeH5X8MJHR55aeUJsp5SPfgvK6nHMye/iz3B5vM
|
||||
AoqSDXZow2JHGcyzQvaVVNxWytHNOl3ZCzpGMOGkquDgwzBZmyNk/Muri5X1TtbH
|
||||
DgeYdht2YiHqHdGWsLNU1vZAgzlwD8fXg65XOmNehjWnowhpNRCgpcDeJCtEuNzt
|
||||
6iXFWffjO6YTbVnoM5xhLROjLv6gYP4wxsQSZc/NGz9Jow7VxlYZg9wCE75bduFn
|
||||
7D5O4OgVgPgYbyCutpB/o4PMNURb4V/5p2OAEgLX2QKBgQD+kHYRAaawRbaY4jGf
|
||||
isj0oh2C/Z99Mqf/nnpPwmUwrhpmnQ+pRdWBw940tPrEpVoOcCPWQ5hO1zUET18d
|
||||
xQqs3zd6lEhJogmMqkjOT670YBEX/wyALd3M5F3HT/K2aixL1XaCCpAl97JB9RyB
|
||||
zGIr5c+mIOVK/uYrlFO28thXzwKBgQD8VumZIYZpWeE7pTyCg0PcDYlNATA/VKoD
|
||||
9YrGqEEHGgFNJEWj8Xj8aqBzaPoUk+eGp7NfSoOchVM+Bf3ktWy5doZCmNuxlOyq
|
||||
Ix5yrB2jyYceaSf2nxHqlD2VhKB/YJx0yTU1UkB5dG4nYnqiUg7c5JeQOVzwFKm1
|
||||
t6/Hk/cXOwKBgGT+yWjL3+cVcXFMZGWouTudSdobZ3hTbaWTqXEVbfIXUPAfJgSB
|
||||
aUi3feQpXUhBVe5efUlXvgihhy4zk0gLUcXuNWOTiu5ztBgzwvjfUkkwB/geP0Zn
|
||||
bBULEU2vIVtP2k0n3oGPUUtO71ENvwacIOLLpUuCx5WudYEasu/lfwGvAoGBAOiE
|
||||
manuF3HaTU3tu20z0YLiwkK/tpqUxDjzuBXIEmudzdcsdjNUHbzR79mIwO/XPf95
|
||||
ZjKHcfD3dbXwRXzKpE3dZmfVfJMM/GrmA3d9G67B04z1Lsr01siGIp004cOd3W1L
|
||||
vojMqvZ/j8Ug3InX/TQUO4i9IuNi1uLISOQpdwTjAoGAG33swIFnH/mz7ubu8wfE
|
||||
9nwe8NNf56kbFBG2FMuHvo8GYj0sqylwtZnh4TCwlTzqUO8e6oFdK8Ot6z7H9Fa3
|
||||
vnDD2WRwEFydRP5fbW5eFmGbzLfHlzUY+Do81qrUMF47LEN94X7yaXdb/vNW57lp
|
||||
K9hGF1Bdk8089Knm3l1Fc4w=
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -1,27 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEgDCCA2igAwIBAgIUaKVB2xg9gr/sS6FvzMex0xSbEzswDQYJKoZIhvcNAQEL
|
||||
BQAwbDELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG1RlbGVjb20gSW5mcmEgUHJvamVj
|
||||
dCwgSW5jLjEMMAoGA1UECxMDVElQMSkwJwYDVQQDEyBUZWxlY29tIEluZnJhIFBy
|
||||
b2plY3QgSXNzdWluZyBDQTAeFw0yMTA3MDgxMDQ5MTVaFw0yNTA3MDgxMDQ5MTVa
|
||||
MDIxCzAJBgNVBAYTAlVTMQwwCgYDVQQKEwNUSVAxFTATBgNVBAMMDCoud2xhbi5s
|
||||
b2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL2rlMfV7/Si2Svx
|
||||
J1YOEz6KJLvey995/0MkQvAG0RM6TpFwgUNnpYFFozcWME8MGSxws+6hOzDoMmHC
|
||||
pgpP/KZ/Fyu9iUdzTxsJMyMxIW9sYbBMkQgBmvjkBlXDk5NfHh+yJBVxb7JlJ6vJ
|
||||
oT7EJMzgKpYpFnO+bddalUVsDp3qQIjSvJIxl77vwgZQUJx0qCm17VTBhyM2RTJ3
|
||||
jtr7kcWDm3jyyTVUvlM9g3DM9g0hUPMN0R5PP2HuqDdtYoY51krsm2mmVIYYnyAN
|
||||
BDawmwYnZJfcC4gFzZJ5wK5NFjSKmd1mYp0damlSh0/uHxPyd4rm2QhUCQH92yKM
|
||||
+9qYU70CAwEAAaOCAVIwggFOMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFM0mIZuE
|
||||
6aly7ZKXl0KWjprcO9/uMB8GA1UdIwQYMBaAFLMbVLjgR6s98ziA5Dzl/QBhbdHo
|
||||
MA4GA1UdDwEB/wQEAwIFoDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATCBhgYIKwYB
|
||||
BQUHAQEEejB4MCgGCCsGAQUFBzABhhxodHRwOi8vb2NzcC5vbmUuZGlnaWNlcnQu
|
||||
Y29tMEwGCCsGAQUFBzAChkBodHRwOi8vY2FjZXJ0cy5vbmUuZGlnaWNlcnQuY29t
|
||||
L1RlbGVjb21JbmZyYVByb2plY3RJc3N1aW5nQ0EuY3J0ME0GA1UdHwRGMEQwQqBA
|
||||
oD6GPGh0dHA6Ly9jcmwub25lLmRpZ2ljZXJ0LmNvbS9UZWxlY29tSW5mcmFQcm9q
|
||||
ZWN0SXNzdWluZ0NBLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAAyb7X9qW0z0QJrl2
|
||||
oAalMCh/gSJy5oER3L7iu/pnP3GREbr6bh6+1/MAf2bgnN2CUOKQHbozB7yCkM6V
|
||||
8m5RnL4ePKVP5yIrbs48uM5Hl14QFLU4ZtFao6js0haoWWEgMo3sfbeyfOU0ScyW
|
||||
ET5zfbDub3gUbWYmlz6hyV5aJoznaFjJTNP7SRQ9CHMTMHh3wAPfVlvG2TdcwwbM
|
||||
ZKkdAHpl1NwRxyiBPJfkejGWrY3ZAs10te7u9Lsc9yZZKL8SU9J/mrO9tM5HLeUr
|
||||
nCJN4RI7RyTuDw4LdMZW1Ju5QBXoZL9mj4KXIbUkDwryhbAxdQ1OnwD4O/avMChk
|
||||
TNJzIw==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,28 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9q5TH1e/0otkr
|
||||
8SdWDhM+iiS73svfef9DJELwBtETOk6RcIFDZ6WBRaM3FjBPDBkscLPuoTsw6DJh
|
||||
wqYKT/ymfxcrvYlHc08bCTMjMSFvbGGwTJEIAZr45AZVw5OTXx4fsiQVcW+yZSer
|
||||
yaE+xCTM4CqWKRZzvm3XWpVFbA6d6kCI0rySMZe+78IGUFCcdKgpte1UwYcjNkUy
|
||||
d47a+5HFg5t48sk1VL5TPYNwzPYNIVDzDdEeTz9h7qg3bWKGOdZK7JtpplSGGJ8g
|
||||
DQQ2sJsGJ2SX3AuIBc2SecCuTRY0ipndZmKdHWppUodP7h8T8neK5tkIVAkB/dsi
|
||||
jPvamFO9AgMBAAECggEBAJgYoaRmcJfShyhvp8WgX9pE2RQ2o3I/2Gy1BWCJdtte
|
||||
ZGbIuz+cO+IgP7QK/Q5Ge2Fht0hizp53dP9kIdYfMlEplSEkSpObahIaHIHaAh/h
|
||||
36yKmbq73tQ7tsDLpuoE2pk8Nydi4dlCuL9PXxiAHaqVEFF9/V0vldGd+BnFfyst
|
||||
retXgockCH+fqddM5Kp+H0bmjXzLke/b8T9KsdSBz7lg1Z67kmMrHLe14Q4Hgmr/
|
||||
pFBkGGWKTFn48OXfncrv+oQAGED7r9c5UEdpOB6SBDxuddfzgkw9urnpKrYC/KOs
|
||||
HLBTaGew73O81BsbaZlUiVxTdewrmFk2nG6UIPoGaxkCgYEA7IYOjIfNJOEPIWYP
|
||||
zj4eipTy6zFk4L7tX3wX4wsor93rz8ArlF8sgNoyUhbKm6H++ZfVezLs2jcjJJ8Q
|
||||
sXLwQ6L/D8aVb6AOVeC1WYJu5+wXIDX0H+1318a5+3bKVPn+hktJGEgCBvplVRnh
|
||||
yzpQ+2v1SBp9qEzoSl1sV6gm1tsCgYEAzUnZcjUhHvoXLXJ1lfagCC6QsmjqzpJv
|
||||
VdTKJlDuZ0qQGC6Ts+wKfM3MoiOsXW0pByC5lWwE43c/KU8J358j3OSSNafIFeD1
|
||||
cxtYzJlMgnw5Y2Zt9tj+QW/1BOMdOftnPSOnsk6rpdCBMW6a2tYubJjbAuge+a2O
|
||||
939XGnV0R0cCgYEA0bvmNtNNJAC2LAWWymnnJzgBWHFKZMipMNyXSethPuHo8yYS
|
||||
/tSOYAwcRxKSwwMZWDY9RavYv3/ZF+Y9JT0otLFav6B2bq9dRuWlqiOxONLvhs6R
|
||||
Faa7eIlt7gBeVpAAFRG5VWC0+38aUCZNRKsHmIsYy8FB3/Winh7NrcUb+7UCgYBi
|
||||
egCTZqUixPmFVZjOfWY7Rosm6mlo+pnp5I+sXbpfVkdVMlKsRpipUdfOF6rBjnHV
|
||||
937PDOgzbaqg2Ed2PFLpzcPNdVToGefkdcPdMdSf65Nj+WjatzEQlvJEi+YjQFQ/
|
||||
4fC5+j8g5apz2gjy3Teb5J96/3qMbxNb6nwQNzO2VQKBgHyHUJOrhvv9+vs7v8nu
|
||||
9DgV0b5eNO0g6Q4Ji7oqs24PssPQRA4gMtwmPT8Ha+wWGVzQt2U5LmjsLlrqAO6O
|
||||
+Fa3c63sgmt672A8BJ3PL8LI8E2keZiH6rwADSUFp3TZoU2SHamw5NEruNRMIF1R
|
||||
0LMsuAs2KEdnwAth2ZmUF2+S
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -1,120 +0,0 @@
|
||||
version: '3'
|
||||
|
||||
volumes:
|
||||
postgresql_data:
|
||||
driver: local
|
||||
mysql_data:
|
||||
driver: local
|
||||
zookeeper_data:
|
||||
driver: local
|
||||
zookeeper_datalog:
|
||||
driver: local
|
||||
kafka_data:
|
||||
driver: local
|
||||
|
||||
services:
|
||||
postgresql:
|
||||
image: "postgres:${POSTGRES_TAG}"
|
||||
env_file:
|
||||
- .env_postgresql
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- postgresql_data:/var/lib/postgresql/data
|
||||
- ./init-ucentralsec-db.sh:/docker-entrypoint-initdb.d/init-ucentralsec-db.sh
|
||||
|
||||
mysql:
|
||||
image: "mysql:${MYSQL_TAG}"
|
||||
env_file:
|
||||
- .env_mysql
|
||||
restart: unless-stopped
|
||||
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
|
||||
ucentralgw.wlan.local:
|
||||
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw:${UCENTRALGW_TAG}"
|
||||
env_file:
|
||||
- .env_ucentralgw
|
||||
depends_on:
|
||||
- postgresql
|
||||
- kafka
|
||||
- rttys
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:15002:15002"
|
||||
- "127.0.0.1:16002:16002"
|
||||
- "127.0.0.1:16003:16003"
|
||||
- "127.0.0.1:16102:16102"
|
||||
volumes:
|
||||
- ./ucentralgw-data:/ucentralgw-data
|
||||
- ./certs:/ucentralgw-data/certs
|
||||
- ../certificates/root.pem:/ucentralgw-data/certs/root.pem
|
||||
- ../certificates/issuer.pem:/ucentralgw-data/certs/issuer.pem
|
||||
- ../certificates/clientcas.pem:/ucentralgw-data/certs/clientcas.pem
|
||||
|
||||
ucentralgw-ui:
|
||||
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw-ui:${UCENTRALGWUI_TAG}"
|
||||
env_file:
|
||||
- .env_ucentralgw-ui
|
||||
depends_on:
|
||||
- ucentralgw.wlan.local
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:80:80"
|
||||
|
||||
ucentralsec.wlan.local:
|
||||
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralsec:${UCENTRALSEC_TAG}"
|
||||
env_file:
|
||||
- .env_ucentralsec
|
||||
depends_on:
|
||||
- postgresql
|
||||
- kafka
|
||||
- rttys
|
||||
- ucentralgw.wlan.local
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:16001:16001"
|
||||
- "127.0.0.1:16101:16101"
|
||||
volumes:
|
||||
- ./ucentralsec-data:/ucentralsec-data
|
||||
- ./certs:/ucentralsec-data/certs
|
||||
- ../certificates/root.pem:/ucentralsec-data/certs/root.pem
|
||||
- ../certificates/issuer.pem:/ucentralsec-data/certs/issuer.pem
|
||||
- ../certificates/clientcas.pem:/ucentralsec-data/certs/clientcas.pem
|
||||
|
||||
ucentralgw-ui:
|
||||
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw-ui:${UCENTRALGWUI_TAG}"
|
||||
env_file:
|
||||
- .env_ucentralgw-ui
|
||||
depends_on:
|
||||
- ucentralgw
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:80:80"
|
||||
|
||||
rttys:
|
||||
image: "tip-tip-wlan-cloud-ucentral.jfrog.io/rttys:${RTTYS_TAG}"
|
||||
depends_on:
|
||||
- mysql
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./certs/restapi-cert.pem:/etc/rttys/restapi-cert.pem
|
||||
- ./certs/restapi-key.pem:/etc/rttys/restapi-key.pem
|
||||
- ./rttys/rttys.conf:/rttys/rttys.conf
|
||||
|
||||
zookeeper:
|
||||
image: "zookeeper:${ZOOKEEPER_TAG}"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- zookeeper_data:/data
|
||||
- zookeeper_datalog:/datalog
|
||||
|
||||
kafka:
|
||||
image: "docker.io/bitnami/kafka:${KAFKA_TAG}"
|
||||
env_file:
|
||||
- .env_kafka
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- zookeeper
|
||||
volumes:
|
||||
- kafka_data:/bitnami/kafka
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
|
||||
CREATE USER $UCENTRALSEC_DB_USER WITH ENCRYPTED PASSWORD '$UCENTRALSEC_DB_PASSWORD';
|
||||
CREATE DATABASE $UCENTRALSEC_DB;
|
||||
GRANT ALL PRIVILEGES ON DATABASE $UCENTRALSEC_DB TO $UCENTRALSEC_DB_USER;
|
||||
EOSQL
|
||||
@@ -1,18 +0,0 @@
|
||||
addr-dev: :5912
|
||||
addr-user: :5913
|
||||
#addr-web: :5914
|
||||
#web-redir-url:# Auth for http
|
||||
http-username: rttys
|
||||
http-password: rttys
|
||||
ssl-cert: /etc/rttys/restapi-cert.pem
|
||||
ssl-key: /etc/rttys/restapi-key.pem
|
||||
token: 96181c567b4d0d98c50f127230068fa8
|
||||
# font-size: 16
|
||||
# No login required to connect device.
|
||||
# Values can be device IDs separated by spaces,
|
||||
# or a "*" indicates that all devices do not require login
|
||||
# http://localhost:5913/connect/rtty1
|
||||
white-list: "*"
|
||||
#white-list: rtty1 rtty2
|
||||
# mysql database source
|
||||
db: rttys:rttys@tcp(mysql)/rttys
|
||||
@@ -1,181 +0,0 @@
|
||||
#
|
||||
# uCentral protocol server for devices. This is where you point
|
||||
# all your devices. You can replace the * for address by the specific
|
||||
# address of one of your interfaces
|
||||
#
|
||||
ucentral.websocket.host.0.backlog = 500
|
||||
ucentral.websocket.host.0.rootca = $UCENTRALGW_ROOT/certs/root.pem
|
||||
ucentral.websocket.host.0.issuer = $UCENTRALGW_ROOT/certs/issuer.pem
|
||||
ucentral.websocket.host.0.cert = $UCENTRALGW_ROOT/certs/websocket-cert.pem
|
||||
ucentral.websocket.host.0.key = $UCENTRALGW_ROOT/certs/websocket-key.pem
|
||||
ucentral.websocket.host.0.clientcas = $UCENTRALGW_ROOT/certs/clientcas.pem
|
||||
ucentral.websocket.host.0.cas = $UCENTRALGW_ROOT/certs/cas
|
||||
ucentral.websocket.host.0.address = *
|
||||
ucentral.websocket.host.0.port = 15002
|
||||
ucentral.websocket.host.0.security = strict
|
||||
ucentral.websocket.host.0.key.password = mypassword
|
||||
ucentral.websocket.maxreactors = 20
|
||||
|
||||
#
|
||||
# REST API access
|
||||
#
|
||||
ucentral.restapi.host.0.backlog = 100
|
||||
ucentral.restapi.host.0.security = relaxed
|
||||
ucentral.restapi.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
|
||||
ucentral.restapi.host.0.address = *
|
||||
ucentral.restapi.host.0.port = 16002
|
||||
ucentral.restapi.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
|
||||
ucentral.restapi.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.restapi.host.0.key.password = mypassword
|
||||
|
||||
ucentral.internal.restapi.host.0.backlog = 100
|
||||
ucentral.internal.restapi.host.0.security = relaxed
|
||||
ucentral.internal.restapi.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
|
||||
ucentral.internal.restapi.host.0.address = *
|
||||
ucentral.internal.restapi.host.0.port = 17002
|
||||
ucentral.internal.restapi.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
|
||||
ucentral.internal.restapi.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.internal.restapi.host.0.key.password = mypassword
|
||||
|
||||
#
|
||||
# Used to upload files to the service.
|
||||
# You should replace the 'name' vaalue with the IP address of your gateway or an FQDN
|
||||
# that your devices can reach
|
||||
#
|
||||
ucentral.fileuploader.host.0.backlog = 100
|
||||
ucentral.fileuploader.host.0.rootca = $UCENTRALGW_ROOT/certs/restapi-ca.pem
|
||||
ucentral.fileuploader.host.0.security = relaxed
|
||||
ucentral.fileuploader.host.0.address = *
|
||||
ucentral.fileuploader.host.0.name = ucentral.wlan.local
|
||||
ucentral.fileuploader.host.0.port = 16003
|
||||
ucentral.fileuploader.host.0.cert = $UCENTRALGW_ROOT/certs/restapi-cert.pem
|
||||
ucentral.fileuploader.host.0.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.fileuploader.host.0.key.password = mypassword
|
||||
ucentral.fileuploader.path = $UCENTRALGW_ROOT/uploads
|
||||
ucentral.fileuploader.maxsize = 10000
|
||||
|
||||
#
|
||||
# Generic section that all microservices must have
|
||||
#
|
||||
ucentral.service.key = $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.system.data = $UCENTRALGW_ROOT/data
|
||||
ucentral.system.debug = true
|
||||
ucentral.system.uri.private = https://ucentralgw.wlan.local:17002
|
||||
ucentral.system.uri.public = https://ucentral.wlan.local:16002
|
||||
ucentral.system.commandchannel = /tmp/app.ucentralgw
|
||||
|
||||
#
|
||||
# Gateway Microservice Specific Section
|
||||
#
|
||||
ucentral.autoprovisioning = true
|
||||
ucentral.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
|
||||
ucentral.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
|
||||
ucentral.devicetypes.2 = IOT:esp32
|
||||
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
|
||||
firmware.autoupdate.policy.default = auto
|
||||
|
||||
#
|
||||
# rtty
|
||||
#
|
||||
rtty.enabled = true
|
||||
rtty.server = rttys
|
||||
rtty.port = 5912
|
||||
rtty.token = 96181c567b4d0d98c50f127230068fa8
|
||||
rtty.timeout = 60
|
||||
rtty.viewport = 5913
|
||||
|
||||
#############################
|
||||
# Generic information for all micro services
|
||||
#############################
|
||||
#
|
||||
# NLB Support
|
||||
#
|
||||
alb.enable = true
|
||||
alb.port = 16102
|
||||
|
||||
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
|
||||
|
||||
#
|
||||
# Kafka
|
||||
#
|
||||
ucentral.kafka.group.id = gateway
|
||||
ucentral.kafka.client.id = gateway1
|
||||
ucentral.kafka.enable = true
|
||||
# ucentral.kafka.brokerlist = a1.arilia.com:9092
|
||||
ucentral.kafka.brokerlist = kafka:9092
|
||||
ucentral.kafka.auto.commit = false
|
||||
ucentral.kafka.queue.buffering.max.ms = 50
|
||||
|
||||
#
|
||||
# This section select which form of persistence you need
|
||||
# Only one selected at a time. If you select multiple, this service will die if a horrible
|
||||
# death and might make your beer flat.
|
||||
#
|
||||
#storage.type = sqlite
|
||||
storage.type = postgresql
|
||||
#storage.type = mysql
|
||||
#storage.type = odbc
|
||||
|
||||
storage.type.sqlite.db = devices.db
|
||||
storage.type.sqlite.idletime = 120
|
||||
storage.type.sqlite.maxsessions = 128
|
||||
|
||||
storage.type.postgresql.maxsessions = 64
|
||||
storage.type.postgresql.idletime = 60
|
||||
storage.type.postgresql.host = postgresql
|
||||
storage.type.postgresql.username = ucentralgw
|
||||
storage.type.postgresql.password = ucentralgw
|
||||
storage.type.postgresql.database = ucentralgw
|
||||
storage.type.postgresql.port = 5432
|
||||
storage.type.postgresql.connectiontimeout = 60
|
||||
|
||||
storage.type.mysql.maxsessions = 64
|
||||
storage.type.mysql.idletime = 60
|
||||
storage.type.mysql.host = localhost
|
||||
storage.type.mysql.username = stephb
|
||||
storage.type.mysql.password = snoopy99
|
||||
storage.type.mysql.database = ucentral
|
||||
storage.type.mysql.port = 3306
|
||||
storage.type.mysql.connectiontimeout = 60
|
||||
|
||||
########################################################################
|
||||
########################################################################
|
||||
#
|
||||
# Logging: please leave as is for now.
|
||||
#
|
||||
########################################################################
|
||||
|
||||
logging.formatters.f1.class = PatternFormatter
|
||||
logging.formatters.f1.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
||||
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 = $UCENTRALGW_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
|
||||
|
||||
|
||||
|
||||
@@ -1,145 +0,0 @@
|
||||
#
|
||||
# uCentral protocol server for devices. This is where you point
|
||||
# all your devices. You can replace the * for address by the specific
|
||||
# address of one of your interfaces
|
||||
#
|
||||
|
||||
#
|
||||
# REST API access
|
||||
#
|
||||
ucentral.restapi.host.0.backlog = 100
|
||||
ucentral.restapi.host.0.security = relaxed
|
||||
ucentral.restapi.host.0.rootca = $UCENTRALSEC_ROOT/certs/restapi-ca.pem
|
||||
ucentral.restapi.host.0.address = *
|
||||
ucentral.restapi.host.0.port = 16001
|
||||
ucentral.restapi.host.0.cert = $UCENTRALSEC_ROOT/certs/restapi-cert.pem
|
||||
ucentral.restapi.host.0.key = $UCENTRALSEC_ROOT/certs/restapi-key.pem
|
||||
ucentral.restapi.host.0.key.password = mypassword
|
||||
|
||||
ucentral.internal.restapi.host.0.backlog = 100
|
||||
ucentral.internal.restapi.host.0.security = relaxed
|
||||
ucentral.internal.restapi.host.0.rootca = $UCENTRALSEC_ROOT/certs/restapi-ca.pem
|
||||
ucentral.internal.restapi.host.0.address = *
|
||||
ucentral.internal.restapi.host.0.port = 17001
|
||||
ucentral.internal.restapi.host.0.cert = $UCENTRALSEC_ROOT/certs/restapi-cert.pem
|
||||
ucentral.internal.restapi.host.0.key = $UCENTRALSEC_ROOT/certs/restapi-key.pem
|
||||
ucentral.internal.restapi.host.0.key.password = mypassword
|
||||
|
||||
#
|
||||
# Generic section that all microservices must have
|
||||
#
|
||||
authentication.enabled = true
|
||||
authentication.default.username = tip@ucentral.com
|
||||
authentication.default.password = 13268b7daa751240369d125e79c873bd8dd3bef7981bdfd38ea03dbb1fbe7dcf
|
||||
authentication.default.access = master
|
||||
authentication.service.type = internal
|
||||
ucentral.system.data = $UCENTRALSEC_ROOT/data
|
||||
ucentral.system.debug = true
|
||||
ucentral.system.uri.private = https://ucentralsec.wlan.local:17001
|
||||
ucentral.system.uri.public = https://ucentral.wlan.local:16001
|
||||
ucentral.system.commandchannel = /tmp/app.ucentralsec
|
||||
ucentral.service.key = $UCENTRALSEC_ROOT/certs/restapi-key.pem
|
||||
|
||||
#
|
||||
# Security Microservice Specific Section
|
||||
#
|
||||
mailer.hostname = smtp.gmail.com
|
||||
mailer.username = no-reply@arilia.com
|
||||
mailer.password = **************************
|
||||
mailer.loginmethod = login
|
||||
mailer.port = 587
|
||||
|
||||
|
||||
#############################
|
||||
# Generic information for all micro services
|
||||
#############################
|
||||
#
|
||||
# NLB Support
|
||||
#
|
||||
alb.enable = true
|
||||
alb.port = 16101
|
||||
|
||||
#
|
||||
# Kafka
|
||||
#
|
||||
ucentral.kafka.group.id = security
|
||||
ucentral.kafka.client.id = security1
|
||||
ucentral.kafka.enable = true
|
||||
# ucentral.kafka.brokerlist = a1.arilia.com:9092
|
||||
ucentral.kafka.brokerlist = kafka:9092
|
||||
ucentral.kafka.auto.commit = false
|
||||
ucentral.kafka.queue.buffering.max.ms = 50
|
||||
|
||||
#
|
||||
# This section select which form of persistence you need
|
||||
# Only one selected at a time. If you select multiple, this service will die if a horrible
|
||||
# death and might make your beer flat.
|
||||
#
|
||||
#storage.type = sqlite
|
||||
storage.type = postgresql
|
||||
#storage.type = mysql
|
||||
#storage.type = odbc
|
||||
|
||||
storage.type.sqlite.db = security.db
|
||||
storage.type.sqlite.idletime = 120
|
||||
storage.type.sqlite.maxsessions = 128
|
||||
|
||||
storage.type.postgresql.maxsessions = 64
|
||||
storage.type.postgresql.idletime = 60
|
||||
storage.type.postgresql.host = postgresql
|
||||
storage.type.postgresql.username = ucentralsec
|
||||
storage.type.postgresql.password = ucentralsec
|
||||
storage.type.postgresql.database = ucentralsec
|
||||
storage.type.postgresql.port = 5432
|
||||
storage.type.postgresql.connectiontimeout = 60
|
||||
|
||||
storage.type.mysql.maxsessions = 64
|
||||
storage.type.mysql.idletime = 60
|
||||
storage.type.mysql.host = localhost
|
||||
storage.type.mysql.username = stephb
|
||||
storage.type.mysql.password = snoopy99
|
||||
storage.type.mysql.database = ucentral
|
||||
storage.type.mysql.port = 3306
|
||||
storage.type.mysql.connectiontimeout = 60
|
||||
|
||||
|
||||
########################################################################
|
||||
########################################################################
|
||||
#
|
||||
# Logging: please leave as is for now.
|
||||
#
|
||||
########################################################################
|
||||
logging.formatters.f1.class = PatternFormatter
|
||||
logging.formatters.f1.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
||||
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 = $UCENTRALSEC_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
|
||||
|
||||
|
||||
|
||||
11
docker-entrypoint.sh
Executable file
11
docker-entrypoint.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
if [ "$1" = '/ucentral/ucentralgw' -a "$(id -u)" = '0' ]; then
|
||||
if [ "$RUN_CHOWN" = 'true' ]; then
|
||||
chown -R "$UCENTRALGW_USER": "$UCENTRALGW_ROOT" "$UCENTRALGW_CONFIG"
|
||||
fi
|
||||
exec su-exec "$UCENTRALGW_USER" "$@"
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
@@ -26,7 +26,7 @@ then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f ucentral.properties ]]
|
||||
if [[ ! -f ucentralgw.properties ]]
|
||||
then
|
||||
echo "Configuration file ucentral.properties is missing in the current directory"
|
||||
exit 2
|
||||
@@ -37,7 +37,7 @@ docker run -d -p 15002:15002 \
|
||||
-p 16003:16003 \
|
||||
--init \
|
||||
--volume="$PWD:/ucentral-data" \
|
||||
-e UCENTRAL_ROOT="/ucentral-data" \
|
||||
-e UCENTRAL_CONFIG="/ucentral-data" \
|
||||
-e UCENTRALGW_ROOT="/ucentral-data" \
|
||||
-e UCENTRALGW_CONFIG="/ucentral-data" \
|
||||
--name="ucentralgw" $DOCKER_NAME
|
||||
|
||||
|
||||
0
helm/.gitkeep
Normal file
0
helm/.gitkeep
Normal file
12
helm/Chart.lock
Normal file
12
helm/Chart.lock
Normal file
@@ -0,0 +1,12 @@
|
||||
dependencies:
|
||||
- name: postgresql
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
version: 10.9.2
|
||||
- name: mysql
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
version: 8.8.3
|
||||
- name: mariadb
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
version: 9.4.2
|
||||
digest: sha256:1fdae7cbea906e41dccd8618ff9e2c68d0c684724ae27c79a12bb6089968df5c
|
||||
generated: "2021-08-17T12:18:40.341427893+03:00"
|
||||
@@ -1,5 +1,18 @@
|
||||
apiVersion: v1
|
||||
apiVersion: v2
|
||||
appVersion: "1.0"
|
||||
description: A Helm chart for Kubernetes
|
||||
name: ucentralgw
|
||||
version: 0.1.0
|
||||
dependencies:
|
||||
- name: postgresql
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
version: 10.9.2
|
||||
condition: postgresql.enabled
|
||||
- name: mysql
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
version: 8.8.3
|
||||
condition: mysql.enabled
|
||||
- name: mariadb
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
version: 9.4.2
|
||||
condition: mariadb.enabled
|
||||
|
||||
104
helm/README.md
Normal file
104
helm/README.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# ucentralgw
|
||||
|
||||
This Helm chart helps to deploy uCentralGW to the Kubernetes clusters. It is mainly used in [assembly chart](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/chart) as uCentralGW requires other services as dependencies that are considered in that Helm chart. This chart is purposed to define deployment logic close to the application code itself and define default values that could be overriden during deployment.
|
||||
|
||||
|
||||
## TL;DR;
|
||||
|
||||
```bash
|
||||
$ helm install .
|
||||
```
|
||||
|
||||
## Introduction
|
||||
|
||||
This chart bootstraps an ucentralgw on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||
|
||||
## Installing the Chart
|
||||
|
||||
Currently this chart is not assembled in charts archives, so [helm-git](https://github.com/aslafy-z/helm-git) is required for remote the installation
|
||||
|
||||
To install the chart with the release name `my-release`:
|
||||
|
||||
```bash
|
||||
$ helm install --name my-release git+https://github.com/Telecominfraproject/wlan-cloud-ucentralgw@helm?ref=master
|
||||
```
|
||||
|
||||
The command deploys ucentralgw on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
|
||||
|
||||
> **Tip**: List all releases using `helm list`
|
||||
|
||||
## Uninstalling the Chart
|
||||
|
||||
To uninstall/delete the `my-release` deployment:
|
||||
|
||||
```bash
|
||||
$ helm delete my-release
|
||||
```
|
||||
|
||||
The command removes all the Kubernetes components associated with the chart and deletes the release.
|
||||
|
||||
## Configuration
|
||||
|
||||
The following table lists the configurable parameters of the chart and their default values. If Default value is not listed in the table, please refer to the [Values](values.yaml) files for details.
|
||||
|
||||
| Parameter | Type | Description | Default |
|
||||
|-----------|------|-------------|---------|
|
||||
| replicaCount | number | Amount of replicas to be deployed | `1` |
|
||||
| strategyType | string | Application deployment strategy | `'Recreate'` |
|
||||
| nameOverride | string | Override to be used for application deployment | |
|
||||
| fullnameOverride | string | Override to be used for application deployment (has priority over nameOverride) | |
|
||||
| images.ucentralgw.repository | string | Docker image repository | |
|
||||
| images.ucentralgw.tag | string | Docker image tag | `'master'` |
|
||||
| images.ucentralgw.pullPolicy | string | Docker image pull policy | `'Always'` |
|
||||
| services.ucentralgw.type | string | uCentralGW service type | `'LoadBalancer'` |
|
||||
| services.ucentralgw.ports.websocket.servicePort | number | Websocket endpoint port to be exposed on service | `15002` |
|
||||
| services.ucentralgw.ports.websocket.targetPort | number | Websocket endpoint port to be targeted by service | `15002` |
|
||||
| services.ucentralgw.ports.websocket.protocol | string | Websocket endpoint protocol | `'TCP'` |
|
||||
| services.ucentralgw.ports.restapi.servicePort | number | REST API endpoint port to be exposed on service | `16002` |
|
||||
| services.ucentralgw.ports.restapi.targetPort | number | REST API endpoint port to be targeted by service | `16002` |
|
||||
| services.ucentralgw.ports.restapi.protocol | string | REST API endpoint protocol | `'TCP'` |
|
||||
| services.ucentralgw.ports.restapiinternal.servicePort | string | Internal REST API endpoint port to be exposed on service | `17002` |
|
||||
| services.ucentralgw.ports.restapiinternal.targetPort | number | Internal REST API endpoint port to be targeted by service | `17002` |
|
||||
| services.ucentralgw.ports.restapiinternal.protocol | string | Internal REST API endpoint protocol | `'TCP'` |
|
||||
| services.ucentralgw.ports.fileuploader.servicePort | string | Fileuploader endpoint port to be exposed on service | `16003` |
|
||||
| services.ucentralgw.ports.fileuploader.targetPort | number | Fileuploader endpoint port to be targeted by service | `16003` |
|
||||
| services.ucentralgw.ports.fileuploader.protocol | string | Fileuploader endpoint protocol | `'TCP'` |
|
||||
| checks.ucentralgw.liveness.httpGet.path | string | Liveness check path to be used | `'/'` |
|
||||
| checks.ucentralgw.liveness.httpGet.port | number | Liveness check port to be used (should be pointint to ALB endpoint) | `16102` |
|
||||
| checks.ucentralgw.readiness.httpGet.path | string | Readiness check path to be used | `'/'` |
|
||||
| checks.ucentralgw.readiness.httpGet.port | number | Readiness check port to be used (should be pointint to ALB endpoint) | `16102` |
|
||||
| ingresses.restapi.enabled | boolean | Defines if REST API endpoint should be exposed via Ingress controller | `False` |
|
||||
| ingresses.restapi.hosts | array | List of hosts for exposed REST API | |
|
||||
| ingresses.restapi.paths | array | List of paths to be exposed for REST API | |
|
||||
| ingresses.fileuploader.enabled | boolean | Defines if Fileuploader endpoint should be exposed via Ingress controller | `False` |
|
||||
| ingresses.fileuploader.hosts | array | List of hosts for exposed Fileuploader | |
|
||||
| ingresses.fileuploader.paths | array | List of paths for exposed Fileuploader | |
|
||||
| volumes.ucentralgw | array | Defines list of volumes to be attached to uCentralGW | |
|
||||
| persistence.enabled | boolean | Defines if uCentralGW requires Persistent Volume (required for permanent files storage and SQLite DB if enabled) | `True` |
|
||||
| persistence.accessModes | array | Defines PV access modes | |
|
||||
| persistence.size | string | Defines PV size | `'10Gi'` |
|
||||
| public_env_variables | hash | Defines list of environment variables to be passed to uCentralGW | |
|
||||
| configProperties | hash | Configuration properties that should be passed to the application in `ucentralgw.properties`. May be passed by key in set (i.e. `configProperties."rtty\.token"`) | |
|
||||
| certs | hash | Defines files (keys and certificates) that should be passed to uCentralGW (PEM format is adviced to be used) (see `volumes.ucentralgw` on where it is mounted) | |
|
||||
| certsCAs | hash | Defines files with CAs that should be passed to uCentralGW (see `volumes.ucentralgw` on where it is mounted) | |
|
||||
|
||||
|
||||
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||
|
||||
```bash
|
||||
$ helm install --name my-release \
|
||||
--set replicaCount=1 \
|
||||
.
|
||||
```
|
||||
|
||||
The above command sets that only 1 instance of your app should be running
|
||||
|
||||
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
|
||||
|
||||
```bash
|
||||
$ helm install --name my-release -f values.yaml .
|
||||
```
|
||||
|
||||
> **Tip**: You can use the default [values.yaml](values.yaml) as a base for customization.
|
||||
|
||||
|
||||
@@ -83,6 +83,11 @@ spec:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.securityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
|
||||
imagePullSecrets:
|
||||
{{- range $image, $imageValue := .Values.images }}
|
||||
{{- if $imageValue.regcred }}
|
||||
|
||||
@@ -8,7 +8,7 @@ fullnameOverride: ""
|
||||
images:
|
||||
ucentralgw:
|
||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralgw
|
||||
tag: master
|
||||
tag: v2.1.0-RC1
|
||||
pullPolicy: Always
|
||||
# regcred:
|
||||
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||
@@ -109,6 +109,9 @@ resources: {}
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
securityContext:
|
||||
fsGroup: 101
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
tolerations: []
|
||||
@@ -168,7 +171,7 @@ configProperties:
|
||||
ucentral.fileuploader.host.0.port: 16003
|
||||
ucentral.fileuploader.host.0.cert: $UCENTRALGW_ROOT/certs/restapi-cert.pem
|
||||
ucentral.fileuploader.host.0.key: $UCENTRALGW_ROOT/certs/restapi-key.pem
|
||||
ucentral.fileuploader.path: $UCENTRALGW_ROOT/uploads
|
||||
ucentral.fileuploader.path: $UCENTRALGW_ROOT/persist/uploads
|
||||
ucentral.fileuploader.maxsize: 10000
|
||||
# Auto provisioning
|
||||
ucentral.autoprovisioning: "true"
|
||||
@@ -227,12 +230,12 @@ configProperties:
|
||||
ucentral.system.commandchannel: /tmp/app_ucentralgw
|
||||
# Logging
|
||||
logging.formatters.f1.class: PatternFormatter
|
||||
logging.formatters.f1.pattern: "%s: [%p] %t"
|
||||
logging.formatters.f1.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
|
||||
logging.formatters.f1.times: UTC
|
||||
logging.channels.c1.class: ConsoleChannel
|
||||
logging.channels.c1.formatter: f1
|
||||
logging.channels.c2.class: FileChannel
|
||||
logging.channels.c2.path: /dev/stdout
|
||||
logging.channels.c2.path: /tmp/log_ucentralgw
|
||||
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"
|
||||
@@ -240,7 +243,7 @@ configProperties:
|
||||
logging.channels.c2.purgeCount: 20
|
||||
logging.channels.c3.class: ConsoleChannel
|
||||
logging.channels.c3.pattern: "%s: [%p] %t"
|
||||
logging.loggers.root.channel: c2
|
||||
logging.loggers.root.channel: c1
|
||||
logging.loggers.root.level: debug
|
||||
|
||||
# -> Secret part
|
||||
@@ -425,3 +428,64 @@ certsCAs:
|
||||
L+/DtiR5fDVMNdBSGU89UNTi0wHY9+RFuNlIuvZC+x/swF0V9R5mN+ywquTPtDLA
|
||||
5IOM7ItsRmen6u3qu+JXros54e4juQ==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# PostgreSQL (https://github.com/bitnami/charts/tree/master/bitnami/postgresql)
|
||||
postgresql:
|
||||
enabled: false
|
||||
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: bitnami/postgresql
|
||||
tag: 11.13.0-debian-10-r0
|
||||
|
||||
postgresqlPostgresPassword: ""
|
||||
postgresqlUsername: postgres
|
||||
postgresqlPassword: ""
|
||||
postgresqlDatabase: ""
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: ""
|
||||
size: 8Gi
|
||||
|
||||
# MySQL (https://github.com/bitnami/charts/tree/master/bitnami/mysql)
|
||||
mysql:
|
||||
enabled: false
|
||||
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: bitnami/mysql
|
||||
tag: 8.0.26-debian-10-r10
|
||||
|
||||
auth:
|
||||
rootPassword: ""
|
||||
database: my_database
|
||||
username: ""
|
||||
password: ""
|
||||
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: ""
|
||||
size: 8Gi
|
||||
|
||||
# MariaDB (https://github.com/bitnami/charts/tree/master/bitnami/mariadb)
|
||||
mariadb:
|
||||
enabled: false
|
||||
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: bitnami/mariadb
|
||||
tag: 10.5.12-debian-10-r0
|
||||
|
||||
auth:
|
||||
rootPassword: ""
|
||||
database: my_database
|
||||
username: ""
|
||||
password: ""
|
||||
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: ""
|
||||
size: 8Gi
|
||||
|
||||
@@ -2,7 +2,7 @@ openapi: 3.0.1
|
||||
info:
|
||||
title: uCentral gateway API
|
||||
description: A process to manage configuration for devices.
|
||||
version: 0.0.8
|
||||
version: 2.0.0
|
||||
license:
|
||||
name: BSD3
|
||||
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||
@@ -180,6 +180,12 @@ components:
|
||||
rxBytes:
|
||||
type: integer
|
||||
format: int64
|
||||
associations_2G:
|
||||
type: integer
|
||||
format: int64
|
||||
associations_5G:
|
||||
type: integer
|
||||
format: int64
|
||||
devicePassword:
|
||||
type: string
|
||||
lastContact:
|
||||
@@ -248,6 +254,12 @@ components:
|
||||
format: int64
|
||||
firmware:
|
||||
type: string
|
||||
associations_2G:
|
||||
type: integer
|
||||
format: int64
|
||||
associations_5G:
|
||||
type: integer
|
||||
format: int64
|
||||
verifiedCertificate:
|
||||
type: string
|
||||
enum:
|
||||
@@ -581,6 +593,44 @@ components:
|
||||
items:
|
||||
$ref: '#/components/schemas/CommandInfo'
|
||||
|
||||
DeviceDashboard:
|
||||
type: object
|
||||
properties:
|
||||
snapshot:
|
||||
type: integer
|
||||
format: int64
|
||||
numberOfDevices:
|
||||
type: integer
|
||||
format: int64
|
||||
commands:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
upTimes:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
memoryUsed:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
load1:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
load5:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
load15:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
vendors:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
status:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
type:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
deviceType:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
healths:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
certificates:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
lastContact:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
associations:
|
||||
$ref: '#/components/schemas/TagIntPairList'
|
||||
|
||||
#########################################################################################
|
||||
##
|
||||
## These are endpoints that all services in the uCentral stack must provide
|
||||
@@ -616,6 +666,23 @@ components:
|
||||
items:
|
||||
$ref: '#/components/schemas/TagValuePair'
|
||||
|
||||
TagIntPair:
|
||||
type: object
|
||||
properties:
|
||||
tag:
|
||||
type: string
|
||||
value:
|
||||
type: integer
|
||||
format: int64
|
||||
|
||||
TagIntPairList:
|
||||
type: object
|
||||
properties:
|
||||
tagList:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/TagIntPair'
|
||||
|
||||
SystemCommandDetails:
|
||||
type: object
|
||||
properties:
|
||||
@@ -805,6 +872,7 @@ paths:
|
||||
name: countOnly
|
||||
schema:
|
||||
type: boolean
|
||||
example: countOnly=true
|
||||
- in: query
|
||||
description: Return extra information with the device information
|
||||
name: deviceWithStatus
|
||||
@@ -903,7 +971,7 @@ paths:
|
||||
format: int64
|
||||
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
description: Successfully deleted commands for the device.
|
||||
content:
|
||||
application/json:
|
||||
@@ -954,7 +1022,7 @@ paths:
|
||||
format: uuid
|
||||
required: true
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
description: Delete command success
|
||||
content:
|
||||
application/json:
|
||||
@@ -1049,7 +1117,7 @@ paths:
|
||||
type: string
|
||||
required: true
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
$ref: '#/components/responses/Success'
|
||||
403:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
@@ -1177,7 +1245,7 @@ paths:
|
||||
type: string
|
||||
required: true
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
$ref: '#/components/responses/Success'
|
||||
403:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
@@ -1272,7 +1340,7 @@ paths:
|
||||
format: int64
|
||||
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
description: Successfully deleted logs for the device.
|
||||
content:
|
||||
application/json:
|
||||
@@ -1369,7 +1437,7 @@ paths:
|
||||
required: false
|
||||
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
description: Successfully deleted health checks for the device.
|
||||
content:
|
||||
application/json:
|
||||
@@ -1416,7 +1484,7 @@ paths:
|
||||
type: string
|
||||
required: true
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
description: List of logs for this device
|
||||
content:
|
||||
application/json:
|
||||
@@ -1521,7 +1589,7 @@ paths:
|
||||
required: false
|
||||
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
description: Array of statistics for this device
|
||||
content:
|
||||
application/json:
|
||||
@@ -1790,7 +1858,7 @@ paths:
|
||||
404:
|
||||
$ref: '#/components/responses/NotFound'
|
||||
|
||||
/device/{serialNumber}/eventrequest:
|
||||
/device/{serialNumber}/eventqueue:
|
||||
post:
|
||||
tags:
|
||||
- Commands
|
||||
@@ -1909,7 +1977,7 @@ paths:
|
||||
type: string
|
||||
required: true
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
$ref: '#/components/responses/Success'
|
||||
403:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
@@ -1986,13 +2054,27 @@ paths:
|
||||
type: string
|
||||
required: true
|
||||
responses:
|
||||
200:
|
||||
204:
|
||||
$ref: '#/components/responses/Success'
|
||||
403:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
404:
|
||||
$ref: '#/components/responses/NotFound'
|
||||
|
||||
/deviceDashboard:
|
||||
get:
|
||||
tags:
|
||||
- Dashboards
|
||||
summary: Get the last version of the dashboard
|
||||
operationId: getDeviceDashboard
|
||||
responses:
|
||||
200:
|
||||
$ref: '#/components/schemas/DeviceDashboard'
|
||||
403:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
404:
|
||||
$ref: '#/components/responses/NotFound'
|
||||
|
||||
#########################################################################################
|
||||
##
|
||||
## These are endpoints that all services in the uCentral stack must provide
|
||||
@@ -2022,53 +2104,30 @@ paths:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
404:
|
||||
$ref: '#/components/responses/NotFound'
|
||||
|
||||
/callbackChannel:
|
||||
post:
|
||||
get:
|
||||
tags:
|
||||
- Callback
|
||||
summary: Generic callback hook
|
||||
operationId: postCallback
|
||||
- System Commands
|
||||
summary: Retrieve different values from the running service.
|
||||
operationId: getSystemCommand
|
||||
parameters:
|
||||
- in: query
|
||||
name: subscribe
|
||||
schema:
|
||||
type: boolean
|
||||
required: false
|
||||
- in: query
|
||||
name: uri
|
||||
description: Get a value
|
||||
name: command
|
||||
schema:
|
||||
type: string
|
||||
format: uri
|
||||
- in: query
|
||||
name: key
|
||||
schema:
|
||||
type: string
|
||||
- in: query
|
||||
name: topics
|
||||
schema:
|
||||
type: string
|
||||
- in: query
|
||||
name: id
|
||||
schema:
|
||||
type: string
|
||||
- in: query
|
||||
name: topic
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
description: A generic JSONDocument, may be empty too {}
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/AnyPayload'
|
||||
enum:
|
||||
- version
|
||||
- times
|
||||
required: true
|
||||
|
||||
responses:
|
||||
200:
|
||||
$ref: '#/components/responses/Success'
|
||||
description: Successfull command execution
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/TagValuePair'
|
||||
403:
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
404:
|
||||
$ref: '#/components/responses/NotFound'
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "Daemon.h"
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class ALBRequestHandler: public Poco::Net::HTTPRequestHandler
|
||||
/// Return a HTML document with the current date and time.
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "Daemon.h"
|
||||
#include "OpenAPIRequest.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class AuthClient * AuthClient::instance_ = nullptr;
|
||||
|
||||
int AuthClient::Start() {
|
||||
@@ -38,7 +38,7 @@ namespace uCentral {
|
||||
} else {
|
||||
Types::StringPairVec QueryData;
|
||||
QueryData.push_back(std::make_pair("token",SessionToken));
|
||||
OpenAPIRequestGet Req(uSERVICE_SECURITY,
|
||||
OpenAPIRequestGet Req( uSERVICE_SECURITY,
|
||||
"/api/v1/validateToken",
|
||||
QueryData,
|
||||
5000);
|
||||
@@ -56,4 +56,33 @@ namespace uCentral {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AuthClient::IsTokenAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo) {
|
||||
SubMutexGuard G(Mutex_);
|
||||
|
||||
auto User = UserCache_.find(SessionToken);
|
||||
if(User != UserCache_.end() && !IsTokenExpired(User->second.webtoken)) {
|
||||
UInfo = User->second;
|
||||
return true;
|
||||
} else {
|
||||
Types::StringPairVec QueryData;
|
||||
QueryData.push_back(std::make_pair("token",SessionToken));
|
||||
OpenAPIRequestGet Req(uSERVICE_SECURITY,
|
||||
"/api/v1/validateToken",
|
||||
QueryData,
|
||||
5000);
|
||||
Poco::JSON::Object::Ptr Response;
|
||||
if(Req.Do(Response)==Poco::Net::HTTPResponse::HTTP_OK) {
|
||||
if(Response->has("tokenInfo") && Response->has("userInfo")) {
|
||||
SecurityObjects::UserInfoAndPolicy P;
|
||||
P.from_json(Response);
|
||||
UserCache_[SessionToken] = P;
|
||||
UInfo = P;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -13,9 +13,9 @@
|
||||
#include "RESTAPI_SecurityObjects.h"
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class AuthClient : public SubSystemServer {
|
||||
class AuthClient : public SubSystemServer {
|
||||
public:
|
||||
explicit AuthClient() noexcept:
|
||||
SubSystemServer("Authentication", "AUTH-CLNT", "authentication")
|
||||
@@ -31,12 +31,12 @@ namespace uCentral {
|
||||
|
||||
int Start() override;
|
||||
void Stop() override;
|
||||
bool IsAuthorized(Poco::Net::HTTPServerRequest & Request, std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo );
|
||||
bool IsAuthorized(Poco::Net::HTTPServerRequest & Request, std::string &SessionToken, OpenWifi::SecurityObjects::UserInfoAndPolicy & UInfo );
|
||||
void RemovedCachedToken(const std::string &Token);
|
||||
|
||||
bool IsTokenAuthorized(const std::string &Token, SecurityObjects::UserInfoAndPolicy & UInfo);
|
||||
private:
|
||||
static AuthClient *instance_;
|
||||
SecurityObjects::UserInfoCache UserCache_;
|
||||
OpenWifi::SecurityObjects::UserInfoCache UserCache_;
|
||||
};
|
||||
|
||||
inline AuthClient * AuthClient() { return AuthClient::instance(); }
|
||||
|
||||
@@ -1,170 +0,0 @@
|
||||
//
|
||||
// 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 "CallbackManager.h"
|
||||
#include "Daemon.h"
|
||||
|
||||
#include "Poco/Net/HTTPClientSession.h"
|
||||
#include "Poco/Net/HTTPSClientSession.h"
|
||||
#include "Poco/Net/HTTPRequest.h"
|
||||
#include "Poco/Net/HTTPResponse.h"
|
||||
#include "Poco/URI.h"
|
||||
|
||||
namespace uCentral {
|
||||
class CallbackManager *CallbackManager::instance_ = nullptr;
|
||||
|
||||
CallbackManager::CallbackManager() noexcept:
|
||||
SubSystemServer("CallbackManager", "CBACK-MGR", "ucentral.callback")
|
||||
{
|
||||
}
|
||||
|
||||
int CallbackManager::Start() {
|
||||
Logger_.notice("Starting...");
|
||||
Mgr_.start(*this);
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool CallbackManager::InitHosts() {
|
||||
// get all the hosts we are registering with and register ourselves...
|
||||
|
||||
if(Daemon()->ConfigGetString("ucentral.callback.enable","false") == "false") {
|
||||
Logger_.information("CALLBACK system disabled.");
|
||||
return false;
|
||||
}
|
||||
|
||||
MyIDCallbackId_ = Daemon()->ConfigGetString("ucentral.callback.id","");
|
||||
if(MyIDCallbackId_.empty()) {
|
||||
Logger_.information("CALLBACK system disabled. No CallbackID present in ucentral.callback.id");
|
||||
return false;
|
||||
}
|
||||
|
||||
// now get all the hosts we need to register with...
|
||||
auto Index = 0 ;
|
||||
while(true) {
|
||||
std::string root = "ucentral.callback." + std::to_string(Index);
|
||||
|
||||
auto Local = Daemon()->ConfigGetString(root + ".local","");
|
||||
auto Remote = Daemon()->ConfigGetString(root + ".remote","");
|
||||
auto LocalKey = Daemon()->ConfigGetString(root + ".localkey","");
|
||||
auto RemoteKey = Daemon()->ConfigGetString(root + ".localkey","");
|
||||
auto Topics = Daemon()->ConfigGetString(root + ".topics","");
|
||||
|
||||
if(Local.empty() || Remote.empty() || LocalKey.empty() || Topics.empty() || RemoteKey.empty())
|
||||
break;
|
||||
|
||||
CallbackHost H{
|
||||
.Local = "https://" + Local + "/api/v1/callbackChannel",
|
||||
.LocalKey = LocalKey,
|
||||
.Remote = "https://" + Remote + "/api/v1/callbackChannel",
|
||||
.RemoteKey = RemoteKey,
|
||||
.Topics = Topics,
|
||||
.LastContact = 0,
|
||||
.NextContact = 0,
|
||||
.Registered = false
|
||||
};
|
||||
Hosts_.push_back(H);
|
||||
Index++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DoRequest(Poco::Net::HTTPSClientSession& Session, Poco::Net::HTTPRequest& Request, Poco::Net::HTTPResponse& Response)
|
||||
{
|
||||
std::string Content{R"lit({ "comment" : "registration from uCentralGW" })lit"};
|
||||
std::stringstream Body(Content);
|
||||
Request.setContentType("application/json");
|
||||
Request.setContentLength(Content.length());
|
||||
std::ostream& OS = Session.sendRequest(Request);
|
||||
Poco::StreamCopier::copyStream(Body, OS);
|
||||
Session.receiveResponse(Response);
|
||||
return (Response.getStatus() == Poco::Net::HTTPResponse::HTTP_OK);
|
||||
}
|
||||
|
||||
bool CallbackManager::RegisterHosts() {
|
||||
|
||||
if(MyIDCallbackId_.empty())
|
||||
return false;
|
||||
|
||||
for(auto &i:Hosts_) {
|
||||
if(!i.Registered || (time(nullptr)-i.LastContact)>300) {
|
||||
Poco::URI Uri(i.Remote);
|
||||
|
||||
Uri.addQueryParameter("subscribe", "true");
|
||||
Uri.addQueryParameter("uri", i.Local);
|
||||
Uri.addQueryParameter("topics", i.Topics);
|
||||
Uri.addQueryParameter("key", i.LocalKey);
|
||||
Uri.addQueryParameter("id", MyIDCallbackId_);
|
||||
|
||||
Poco::Net::HTTPSClientSession Session(Uri.getHost(), Uri.getPort());
|
||||
Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Uri.getPathAndQuery(),
|
||||
Poco::Net::HTTPMessage::HTTP_1_1);
|
||||
Request.add("X-API-KEY", i.RemoteKey);
|
||||
|
||||
Poco::Net::HTTPResponse Response;
|
||||
|
||||
i.LastContact = time(nullptr);
|
||||
i.Registered = DoRequest(Session, Request, Response);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CallbackManager::run() {
|
||||
Running_ = true;
|
||||
|
||||
uint64_t LastContact = time(nullptr);
|
||||
|
||||
InitHosts();
|
||||
RegisterHosts();
|
||||
|
||||
while(Running_) {
|
||||
if((time(nullptr) - LastContact) >300) {
|
||||
RegisterHosts();
|
||||
LastContact = time(nullptr);
|
||||
}
|
||||
if(Calls_.empty()) {
|
||||
Poco::Thread::sleep(2000);
|
||||
} else {
|
||||
|
||||
CallBackMessage E;
|
||||
{
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
E = Calls_.front();
|
||||
}
|
||||
|
||||
std::cout << "Call: " << E.Message << " JSON:" << E.JSONDoc << std::endl;
|
||||
|
||||
{
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
Calls_.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CallbackManager::Stop() {
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
|
||||
Logger_.notice("Stopping...");
|
||||
Running_ = false ;
|
||||
Mgr_.join();
|
||||
}
|
||||
|
||||
bool CallbackManager::AddMessage(const CallBackMessage &Msg) {
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
|
||||
Calls_.push(Msg);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // end of namespace
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
//
|
||||
// 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_CALLBACKMANAGER_H
|
||||
#define UCENTRALGW_CALLBACKMANAGER_H
|
||||
|
||||
#include <queue>
|
||||
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
|
||||
class CallbackManager : public SubSystemServer, Poco::Runnable {
|
||||
public:
|
||||
struct CallBackMessage {
|
||||
std::string Message;
|
||||
std::string JSONDoc;
|
||||
};
|
||||
|
||||
struct CallbackHost {
|
||||
std::string Local;
|
||||
std::string LocalKey;
|
||||
std::string Remote;
|
||||
std::string RemoteKey;
|
||||
std::string Topics;
|
||||
uint64_t LastContact;
|
||||
uint64_t NextContact;
|
||||
bool Registered;
|
||||
};
|
||||
|
||||
static CallbackManager *instance() {
|
||||
if (instance_ == nullptr) {
|
||||
instance_ = new CallbackManager;
|
||||
}
|
||||
return instance_;
|
||||
}
|
||||
|
||||
void run() override;
|
||||
int Start() override;
|
||||
void Stop() override;
|
||||
bool AddMessage(const CallBackMessage &Msg);
|
||||
bool InitHosts();
|
||||
bool RegisterHosts();
|
||||
|
||||
private:
|
||||
static CallbackManager *instance_;
|
||||
Poco::Thread Mgr_;
|
||||
std::atomic_bool Running_ = false;
|
||||
std::queue<CallBackMessage> Calls_;
|
||||
std::string MyIDCallbackId_;
|
||||
std::vector<CallbackHost> Hosts_;
|
||||
|
||||
CallbackManager() noexcept;
|
||||
};
|
||||
|
||||
inline CallbackManager * CallbackManager() { return CallbackManager::instance(); }
|
||||
|
||||
} // end of namespace
|
||||
|
||||
#endif // UCENTRALGW_CALLBACKMANAGER_H
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "Poco/JSON/Parser.h"
|
||||
#include "Poco/File.h"
|
||||
|
||||
namespace uCentral::Config {
|
||||
namespace OpenWifi::Config {
|
||||
|
||||
static std::string DefaultConfiguration;
|
||||
|
||||
@@ -232,7 +232,7 @@ namespace uCentral::Config {
|
||||
}
|
||||
catch ( const Poco::Exception & E )
|
||||
{
|
||||
uCentral::Daemon::instance()->logger().warning(Poco::format("%s: Failed with: %s", std::string(__func__) , E.displayText()));
|
||||
Daemon::instance()->logger().warning(Poco::format("%s: Failed with: %s", std::string(__func__) , E.displayText()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <string>
|
||||
#include "Poco/JSON/Object.h"
|
||||
|
||||
namespace uCentral::Config {
|
||||
namespace OpenWifi::Config {
|
||||
|
||||
class Config {
|
||||
public:
|
||||
|
||||
@@ -1,164 +0,0 @@
|
||||
//
|
||||
// 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 "CommandChannel.h"
|
||||
#include "AuthClient.h"
|
||||
#include "CommandManager.h"
|
||||
#include "Daemon.h"
|
||||
#include "FileUploader.h"
|
||||
#include "RESTAPI_server.h"
|
||||
#include "StorageService.h"
|
||||
#include "WebSocketServer.h"
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
namespace uCentral {
|
||||
|
||||
class CommandChannel * CommandChannel::instance_ = nullptr;
|
||||
|
||||
std::string CommandChannel::ProcessCommand(const std::string &Command) {
|
||||
std::vector<std::string> Tokens{};
|
||||
std::string Result{"OK"};
|
||||
|
||||
|
||||
try {
|
||||
size_t pos, old_pos = 0 ;
|
||||
|
||||
Logger_.notice(Poco::format("COMMAND: %s",Command));
|
||||
|
||||
while((pos = Command.find(' ', old_pos)) != std::string::npos) {
|
||||
Tokens.push_back(Command.substr(old_pos,pos-old_pos));
|
||||
old_pos = pos + 1 ;
|
||||
}
|
||||
|
||||
Tokens.push_back(Command.substr(old_pos));
|
||||
boost::algorithm::to_lower(Tokens[0]);
|
||||
boost::algorithm::to_lower(Tokens[1]);
|
||||
|
||||
if(Tokens[0]=="set") {
|
||||
if(Tokens[1]=="loglevel") {
|
||||
if(!Daemon()->SetSubsystemLogLevel(Tokens[3],Tokens[2]))
|
||||
Result = "ERROR: Invalid: set logLevel subsystem name:" + Tokens[3];
|
||||
}
|
||||
} else if(Tokens[0]=="get") {
|
||||
if(Tokens[1]=="loglevel") {
|
||||
std::cout << "LogLevels:" << std::endl;
|
||||
std::cout << " Auth: " << AuthClient()->Logger().getLevel() << std::endl;
|
||||
std::cout << " uFileUploader: " << FileUploader()->Logger().getLevel() << std::endl;
|
||||
std::cout << " WebSocket: " << WebSocketServer()->Logger().getLevel() << std::endl;
|
||||
std::cout << " Storage: " << Storage()->Logger().getLevel() << std::endl;
|
||||
std::cout << " RESTAPI: " << RESTAPI_server()->Logger().getLevel() << std::endl;
|
||||
std::cout << " CommandManager: " << Logger_.getLevel() << std::endl;
|
||||
std::cout << " DeviceRegistry: " << DeviceRegistry()->Logger().getLevel() << std::endl;
|
||||
} else if (Tokens[1]=="stats") {
|
||||
|
||||
} else {
|
||||
Result = "ERROR: Invalid: get command:" + Tokens[1];
|
||||
}
|
||||
} else if(Tokens[0]=="restart") {
|
||||
Logger_.information("RESTART...");
|
||||
} else if(Tokens[0]=="stop") {
|
||||
Logger_.information("STOP...");
|
||||
} else if(Tokens[0]=="stats") {
|
||||
Logger_.information("STATS...");
|
||||
} else {
|
||||
Result = "ERROR: Invalid command: " + Tokens[0];
|
||||
}
|
||||
Logger_.notice(Poco::format("COMMAND-RESULT: %s",Result));
|
||||
}
|
||||
catch ( const Poco::Exception & E) {
|
||||
Logger_.warning(Poco::format("COMMAND: Poco exception %s in performing command.",E.displayText()));
|
||||
}
|
||||
catch ( const std::exception & E) {
|
||||
Logger_.warning(Poco::format("COMMAND: std::exception %s in performing command.",std::string(E.what())));
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// This class handles all client connections.
|
||||
class UnixSocketServerConnection: public Poco::Net::TCPServerConnection
|
||||
{
|
||||
public:
|
||||
explicit UnixSocketServerConnection(const Poco::Net::StreamSocket & S, Poco::Logger & Logger):
|
||||
TCPServerConnection(S),
|
||||
Logger_(Logger)
|
||||
{
|
||||
}
|
||||
|
||||
void run() override
|
||||
{
|
||||
try
|
||||
{
|
||||
std::string Message;
|
||||
std::vector<char> buffer(1024);
|
||||
int n = 1;
|
||||
while (n > 0)
|
||||
{
|
||||
n = socket().receiveBytes(&buffer[0], (int)buffer.size());
|
||||
buffer[n] = '\0';
|
||||
Message += &buffer[0];
|
||||
Logger_.information(Poco::format("COMMAND-CHANNEL: %s",Message));
|
||||
if(buffer.size() > n && !Message.empty())
|
||||
{
|
||||
CommandChannel()->ProcessCommand(Message);
|
||||
Message.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const Poco::Exception & E)
|
||||
{
|
||||
Logger_.log(E);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Poco::Logger & Logger_;
|
||||
};
|
||||
|
||||
class UnixSocketServerConnectionFactory: public Poco::Net::TCPServerConnectionFactory
|
||||
{
|
||||
public:
|
||||
explicit UnixSocketServerConnectionFactory() :
|
||||
Logger_(CommandChannel()->Logger())
|
||||
{
|
||||
}
|
||||
|
||||
Poco::Net::TCPServerConnection* createConnection(const Poco::Net::StreamSocket& socket) override
|
||||
{
|
||||
return new UnixSocketServerConnection(socket,Logger_);
|
||||
}
|
||||
private:
|
||||
Poco::Logger & Logger_;
|
||||
};
|
||||
|
||||
CommandChannel::CommandChannel() noexcept:
|
||||
SubSystemServer("CommandChannel", "COMMAND-CHANNEL", "commandchannel")
|
||||
{
|
||||
}
|
||||
|
||||
void CommandChannel::Stop() {
|
||||
Logger_.notice("Stopping...");
|
||||
Srv_->stop();
|
||||
}
|
||||
|
||||
int CommandChannel::Start() {
|
||||
Poco::File F(Daemon()->ConfigPath("ucentral.system.commandchannel","/tmp/app.ucentralgw"));
|
||||
try {
|
||||
if (F.exists())
|
||||
F.remove();
|
||||
} catch (const Poco::Exception &E ) {
|
||||
|
||||
}
|
||||
SocketFile_ = std::make_unique<Poco::File>(F);
|
||||
UnixSocket_ = std::make_unique<Poco::Net::SocketAddress>(Poco::Net::SocketAddress::UNIX_LOCAL, SocketFile_->path());
|
||||
Svs_ = std::make_unique<Poco::Net::ServerSocket>(*UnixSocket_);
|
||||
Srv_ = std::make_unique<Poco::Net::TCPServer>(new UnixSocketServerConnectionFactory, *Svs_);
|
||||
Srv_->start();
|
||||
Logger_.notice("Starting...");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
//
|
||||
// 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_COMMANDCHANNEL_H
|
||||
#define UCENTRALGW_COMMANDCHANNEL_H
|
||||
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/Net/Socket.h"
|
||||
#include "Poco/Net/SocketAddress.h"
|
||||
#include "Poco/Net/TCPServer.h"
|
||||
#include "Poco/Net/TCPServerConnection.h"
|
||||
#include "Poco/Net/TCPServerConnectionFactory.h"
|
||||
#include "Poco/Net/StreamSocket.h"
|
||||
#include "Poco/Net/ServerSocket.h"
|
||||
|
||||
namespace uCentral {
|
||||
|
||||
class CommandChannel : public SubSystemServer {
|
||||
public:
|
||||
static CommandChannel *instance() {
|
||||
if (instance_ == nullptr) {
|
||||
instance_ = new CommandChannel;
|
||||
}
|
||||
return instance_;
|
||||
}
|
||||
|
||||
int Start() override;
|
||||
void Stop() override;
|
||||
std::string ProcessCommand(const std::string &Command);
|
||||
|
||||
private:
|
||||
static CommandChannel * instance_;
|
||||
std::unique_ptr<Poco::File> SocketFile_;
|
||||
std::unique_ptr<Poco::Net::SocketAddress> UnixSocket_;
|
||||
std::unique_ptr<Poco::Net::ServerSocket> Svs_;
|
||||
std::unique_ptr<Poco::Net::TCPServer> Srv_;
|
||||
|
||||
CommandChannel() noexcept;
|
||||
};
|
||||
|
||||
inline CommandChannel * CommandChannel() { return CommandChannel::instance(); }
|
||||
} //namespace
|
||||
|
||||
#endif // UCENTRALGW_COMMANDCHANNEL_H
|
||||
@@ -18,9 +18,7 @@
|
||||
|
||||
#include "Poco/JSON/Parser.h"
|
||||
|
||||
#define DBG std::cout << __LINE__ << " " __FILE__ << std::endl;
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class CommandManager * CommandManager::instance_ = nullptr;
|
||||
|
||||
@@ -33,15 +31,18 @@ namespace uCentral {
|
||||
Running_ = true;
|
||||
while(Running_)
|
||||
{
|
||||
Poco::Thread::trySleep(10000);
|
||||
Poco::Thread::trySleep(30000);
|
||||
if(!Running_)
|
||||
break;
|
||||
std::vector<GWObjects::CommandDetails> Commands;
|
||||
|
||||
if(Storage()->GetReadyToExecuteCommands(0,1000,Commands))
|
||||
if(Storage()->GetReadyToExecuteCommands(1,200,Commands))
|
||||
{
|
||||
for(auto & Cmd: Commands)
|
||||
{
|
||||
if(!Running_)
|
||||
break;
|
||||
|
||||
if(!SendCommand(Cmd)) {
|
||||
Logger_.information(Poco::format("Failed to send command '%s' to %s",Cmd.Command,Cmd.SerialNumber));
|
||||
}
|
||||
@@ -95,8 +96,6 @@ namespace uCentral {
|
||||
std::stringstream ToSend;
|
||||
Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
|
||||
|
||||
std::cout << "Count: " << Promise.use_count() << std::endl;
|
||||
|
||||
OutStandingRequests_[Id_] = std::make_pair(std::move(Promise),UUID);
|
||||
Age_[Id_] = time(nullptr);
|
||||
Id_++;
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "RESTAPI_GWobjects.h"
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class CommandManager : public SubSystemServer, Poco::Runnable {
|
||||
public:
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
|
||||
#include "Daemon.h"
|
||||
|
||||
#include "CallbackManager.h"
|
||||
#include "CommandChannel.h"
|
||||
#include "CommandManager.h"
|
||||
#include "DeviceRegistry.h"
|
||||
#include "FileUploader.h"
|
||||
@@ -29,8 +27,9 @@
|
||||
#include "RESTAPI_InternalServer.h"
|
||||
#include "AuthClient.h"
|
||||
#include "StorageArchiver.h"
|
||||
#include "SerialNumberCache.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class Daemon *Daemon::instance_ = nullptr;
|
||||
|
||||
class Daemon *Daemon::instance() {
|
||||
@@ -42,6 +41,7 @@ namespace uCentral {
|
||||
vDAEMON_BUS_TIMER,
|
||||
Types::SubSystemVec{
|
||||
Storage(),
|
||||
SerialNumberCache(),
|
||||
AuthClient(),
|
||||
DeviceRegistry(),
|
||||
RESTAPI_server(),
|
||||
@@ -50,8 +50,6 @@ namespace uCentral {
|
||||
CommandManager(),
|
||||
FileUploader(),
|
||||
OUIServer(),
|
||||
CommandChannel(),
|
||||
CallbackManager(),
|
||||
StorageArchiver(),
|
||||
});
|
||||
}
|
||||
@@ -73,7 +71,7 @@ namespace uCentral {
|
||||
auto Type = Line.substr(0, P1);
|
||||
auto List = Line.substr(P1+1);
|
||||
|
||||
Types::StringVec Tokens = uCentral::Utils::Split(List);
|
||||
Types::StringVec Tokens = Utils::Split(List);
|
||||
|
||||
auto Entry = DeviceTypeIdentifications_.find(Type);
|
||||
if(DeviceTypeIdentifications_.end() == Entry) {
|
||||
@@ -98,7 +96,7 @@ namespace uCentral {
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
try {
|
||||
auto App = uCentral::Daemon::instance();
|
||||
auto App = OpenWifi::Daemon::instance();
|
||||
auto ExitCode = App->run(argc, argv);
|
||||
delete App;
|
||||
|
||||
|
||||
@@ -25,10 +25,11 @@
|
||||
#include "Poco/Crypto/CipherFactory.h"
|
||||
#include "Poco/Crypto/Cipher.h"
|
||||
|
||||
#include "Dashboard.h"
|
||||
#include "MicroService.h"
|
||||
#include "uCentralTypes.h"
|
||||
#include "OpenWifiTypes.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
static const char * vDAEMON_PROPERTIES_FILENAME = "ucentralgw.properties";
|
||||
static const char * vDAEMON_ROOT_ENV_VAR = "UCENTRALGW_ROOT";
|
||||
@@ -50,10 +51,13 @@ namespace uCentral {
|
||||
[[nodiscard]] std::string IdentifyDevice(const std::string & Compatible) const;
|
||||
void initialize(Poco::Util::Application &self);
|
||||
static Daemon *instance();
|
||||
inline DeviceDashboard & GetDashboard() { return DB_; }
|
||||
private:
|
||||
static Daemon *instance_;
|
||||
bool AutoProvisioning_ = false;
|
||||
Types::StringMapStringSet DeviceTypeIdentifications_;
|
||||
DeviceDashboard DB_;
|
||||
|
||||
};
|
||||
|
||||
inline Daemon * Daemon() { return Daemon::instance(); }
|
||||
|
||||
21
src/Dashboard.cpp
Normal file
21
src/Dashboard.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// Created by stephane bourque on 2021-07-21.
|
||||
//
|
||||
|
||||
#include "Dashboard.h"
|
||||
#include "DeviceRegistry.h"
|
||||
#include "StorageService.h"
|
||||
|
||||
namespace OpenWifi {
|
||||
void DeviceDashboard::Create() {
|
||||
uint64_t Now = std::time(nullptr);
|
||||
|
||||
if(LastRun_==0 || (Now-LastRun_)>120) {
|
||||
DB_.reset();
|
||||
Storage()->AnalyzeCommands(DB_.commands);
|
||||
// DeviceRegistry()->AnalyzeRegistry(DB_);
|
||||
Storage()->AnalyzeDevices(DB_);
|
||||
LastRun_ = Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
23
src/Dashboard.h
Normal file
23
src/Dashboard.h
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// Created by stephane bourque on 2021-07-21.
|
||||
//
|
||||
|
||||
#ifndef UCENTRALGW_DASHBOARD_H
|
||||
#define UCENTRALGW_DASHBOARD_H
|
||||
|
||||
#include "OpenWifiTypes.h"
|
||||
#include "RESTAPI_GWobjects.h"
|
||||
|
||||
namespace OpenWifi {
|
||||
class DeviceDashboard {
|
||||
public:
|
||||
void Create();
|
||||
const GWObjects::Dashboard & Report() const { return DB_;}
|
||||
private:
|
||||
GWObjects::Dashboard DB_;
|
||||
uint64_t LastRun_=0;
|
||||
inline void Reset() { DB_.reset(); }
|
||||
};
|
||||
}
|
||||
|
||||
#endif // UCENTRALGW_DASHBOARD_H
|
||||
@@ -12,8 +12,11 @@
|
||||
#include "WebSocketServer.h"
|
||||
|
||||
#include "DeviceRegistry.h"
|
||||
#include "OUIServer.h"
|
||||
#include "Poco/JSON/Object.h"
|
||||
#include "Poco/JSON/Parser.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class DeviceRegistry *DeviceRegistry::instance_ = nullptr;
|
||||
|
||||
DeviceRegistry::DeviceRegistry() noexcept:
|
||||
@@ -78,7 +81,7 @@ namespace uCentral {
|
||||
}
|
||||
}
|
||||
|
||||
bool DeviceRegistry::GetHealthcheck(const std::string &SerialNumber, std::string & CheckData) {
|
||||
bool DeviceRegistry::GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
|
||||
auto Device = Devices_.find(SerialNumber);
|
||||
@@ -89,7 +92,7 @@ namespace uCentral {
|
||||
return false;
|
||||
}
|
||||
|
||||
void DeviceRegistry::SetHealthcheck(const std::string &SerialNumber, const std::string &CheckData) {
|
||||
void DeviceRegistry::SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck & CheckData) {
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
|
||||
auto Device = Devices_.find(SerialNumber);
|
||||
@@ -152,7 +155,6 @@ namespace uCentral {
|
||||
Device->second->Conn_.Address = "";
|
||||
Device->second->WSConn_ = nullptr;
|
||||
Device->second->Conn_.Connected = false;
|
||||
Device->second->Conn_.LastContact = time(nullptr);
|
||||
Device->second->Conn_.VerifiedCertificate = GWObjects::NO_CERTIFICATE;
|
||||
}
|
||||
|
||||
@@ -177,26 +179,103 @@ namespace uCentral {
|
||||
}
|
||||
}
|
||||
|
||||
/* bool Service::SendCommand(uCentral::Objects::CommandDetails & Cmd)
|
||||
{
|
||||
std::string ComputeCertificateTag( GWObjects::CertificateValidation V) {
|
||||
switch(V) {
|
||||
case GWObjects::NO_CERTIFICATE: return "no certificate";
|
||||
case GWObjects::VALID_CERTIFICATE: return "non TIP certificate";
|
||||
case GWObjects::MISMATCH_SERIAL: return "serial mismatch";
|
||||
case GWObjects::VERIFIED: return "verified";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
const uint64_t SECONDS_MONTH = 30*24*60*60;
|
||||
const uint64_t SECONDS_WEEK = 7*24*60*60;
|
||||
const uint64_t SECONDS_DAY = 1*24*60*60;
|
||||
const uint64_t SECONDS_HOUR = 1*24*60*60;
|
||||
|
||||
std::string ComputeUpLastContactTag(uint64_t T1) {
|
||||
uint64_t T = T1 - std::time(nullptr);
|
||||
if( T>SECONDS_MONTH) return ">month";
|
||||
if( T>SECONDS_WEEK) return ">week";
|
||||
if( T>SECONDS_DAY) return ">day";
|
||||
if( T>SECONDS_HOUR) return ">hour";
|
||||
return "now";
|
||||
}
|
||||
|
||||
std::string ComputeSanityTag(uint64_t T) {
|
||||
if( T==100) return "100%";
|
||||
if( T>90) return ">90%";
|
||||
if( T>60) return ">60%";
|
||||
return "<60%";
|
||||
}
|
||||
|
||||
std::string ComputeUpTimeTag(uint64_t T) {
|
||||
if( T>SECONDS_MONTH) return ">month";
|
||||
if( T>SECONDS_WEEK) return ">week";
|
||||
if( T>SECONDS_DAY) return ">day";
|
||||
if( T>SECONDS_HOUR) return ">hour";
|
||||
return "now";
|
||||
}
|
||||
|
||||
std::string ComputeLoadTag(uint64_t T) {
|
||||
float V=100.0*((float)T/65536.0);
|
||||
if(V<5.0) return "< 5%";
|
||||
if(V<25.0) return "< 25%";
|
||||
if(V<50.0) return "< 50%";
|
||||
if(V<75.0) return "< 75%";
|
||||
return ">75%";
|
||||
}
|
||||
|
||||
std::string ComputeFreeMemoryTag(uint64_t Free, uint64_t Total) {
|
||||
float V = 100.0 * ((float)Free/(float(Total)));
|
||||
if(V<5.0) return "< 5%";
|
||||
if(V<25.0) return "< 25%";
|
||||
if(V<50.0) return "< 50%";
|
||||
if(V<75.0) return "< 75%";
|
||||
return ">75%";
|
||||
}
|
||||
|
||||
bool DeviceRegistry::AnalyzeRegistry(GWObjects::Dashboard &D) {
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
|
||||
auto Device = Devices_.find(Cmd.SerialNumber);
|
||||
for(auto const &[SerialNumber,Connection]:Devices_) {
|
||||
Types::UpdateCountedMap(D.status, Connection->Conn_.Connected ? "connected" : "not connected");
|
||||
Types::UpdateCountedMap(D.vendors, OUIServer()->GetManufacturer(SerialNumber));
|
||||
Types::UpdateCountedMap(D.certificates, ComputeCertificateTag(Connection->Conn_.VerifiedCertificate));
|
||||
Types::UpdateCountedMap(D.lastContact, ComputeUpLastContactTag(Connection->Conn_.LastContact));
|
||||
Types::UpdateCountedMap(D.healths, ComputeSanityTag(Connection->LastHealthcheck.Sanity));
|
||||
Types::UpdateCountedMap(D.deviceType, Connection->Conn_.Compatible);
|
||||
if(!Connection->LastStats.empty()) {
|
||||
Poco::JSON::Parser P;
|
||||
|
||||
auto RawObject = P.parse(Connection->LastStats).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if(RawObject->has("unit")) {
|
||||
auto Unit = RawObject->getObject("unit");
|
||||
if (Unit->has("uptime")) {
|
||||
Types::UpdateCountedMap(D.upTimes, ComputeUpTimeTag(Unit->get("uptime")));
|
||||
}
|
||||
if (Unit->has("memory")) {
|
||||
auto Memory = Unit->getObject("memory");
|
||||
uint64_t Free = Memory->get("free");
|
||||
uint64_t Total = Memory->get("total");
|
||||
Types::UpdateCountedMap(D.memoryUsed, ComputeFreeMemoryTag(Free, Total));
|
||||
}
|
||||
if (Unit->has("load")) {
|
||||
auto Load = Unit->getArray("load");
|
||||
Types::UpdateCountedMap(D.load1,
|
||||
ComputeLoadTag(Load->getElement<uint64_t>(0)));
|
||||
Types::UpdateCountedMap(D.load5,
|
||||
ComputeLoadTag(Load->getElement<uint64_t>(1)));
|
||||
Types::UpdateCountedMap(D.load15,
|
||||
ComputeLoadTag(Load->getElement<uint64_t>(2)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
if (Device != Devices_.end()) {
|
||||
if (Device->second->Conn_.Connected) {
|
||||
if (Device->second->WSConn_ != nullptr) {
|
||||
auto *WSConn = static_cast<uCentral::WebSocket::WSConnection *>(Device->second->WSConn_);
|
||||
WSConn->SendCommand(Cmd);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(...) {
|
||||
Logger_.error(Poco::format("COMMAND(%s): Cannot send command %s.",Cmd.SerialNumber, Cmd.Command));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
} // namespace
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
// class uCentral::WebSocket::WSConnection;
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class WSConnection;
|
||||
class DeviceRegistry : public SubSystemServer {
|
||||
@@ -25,7 +25,7 @@ namespace uCentral {
|
||||
WSConnection *WSConn_;
|
||||
GWObjects::ConnectionState Conn_;
|
||||
std::string LastStats;
|
||||
std::string LastHealthcheck;
|
||||
GWObjects::HealthCheck LastHealthcheck;
|
||||
};
|
||||
|
||||
static DeviceRegistry *instance() {
|
||||
@@ -41,8 +41,8 @@ namespace uCentral {
|
||||
void SetStatistics(const std::string &SerialNumber, const std::string &stats);
|
||||
bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
|
||||
void SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
|
||||
bool GetHealthcheck(const std::string &SerialNumber, std::string & Statistics);
|
||||
void SetHealthcheck(const std::string &SerialNumber, const std::string &stats);
|
||||
bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData);
|
||||
void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H);
|
||||
GWObjects::ConnectionState * Register(const std::string & SerialNumber, WSConnection *);
|
||||
void UnRegister(const std::string & SerialNumber, WSConnection *);
|
||||
bool SendCommand(GWObjects::CommandDetails & Command);
|
||||
@@ -50,6 +50,8 @@ namespace uCentral {
|
||||
bool SendFrame(const std::string & SerialNumber, const std::string & Payload);
|
||||
void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID);
|
||||
|
||||
bool AnalyzeRegistry(GWObjects::Dashboard &D);
|
||||
|
||||
private:
|
||||
static DeviceRegistry *instance_;
|
||||
std::map<std::string,std::unique_ptr<ConnectionEntry>> Devices_;
|
||||
|
||||
@@ -26,15 +26,9 @@
|
||||
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class FileUploader *FileUploader::instance_ = nullptr;
|
||||
|
||||
FileUploader::FileUploader() noexcept:
|
||||
SubSystemServer("FileUploader", "FILE-UPLOAD", "ucentral.fileuploader")
|
||||
{
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
}
|
||||
|
||||
static const std::string URI_BASE{"/v1/upload/"};
|
||||
|
||||
int FileUploader::Start() {
|
||||
@@ -48,7 +42,16 @@ namespace uCentral {
|
||||
|
||||
Logger_.information(l);
|
||||
|
||||
Path_ = Daemon()->ConfigPath("ucentral.fileuploader.path","/tmp");
|
||||
Poco::File UploadsDir(Daemon()->ConfigPath("ucentral.fileuploader.path","/tmp"));
|
||||
Path_ = UploadsDir.path();
|
||||
if(!UploadsDir.exists()) {
|
||||
try {
|
||||
UploadsDir.createDirectory();
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.log(E);
|
||||
Path_ = "/tmp";
|
||||
}
|
||||
}
|
||||
|
||||
auto Sock{Svr.CreateSecureSocket(Logger_)};
|
||||
|
||||
@@ -69,6 +72,8 @@ namespace uCentral {
|
||||
Servers_.push_back(std::move(NewServer));
|
||||
}
|
||||
|
||||
MaxSize_ = 1000 * Daemon()->ConfigGetInt("ucentral.fileuploader.maxsize", 10000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -107,10 +112,10 @@ namespace uCentral {
|
||||
OutStandingUploads_.erase(UUID);
|
||||
}
|
||||
|
||||
class MyPartHandler: public Poco::Net::PartHandler
|
||||
class FileUploaderPartHandler: public Poco::Net::PartHandler
|
||||
{
|
||||
public:
|
||||
MyPartHandler(std::string UUID, Poco::Logger & Logger):
|
||||
FileUploaderPartHandler(std::string UUID, Poco::Logger & Logger):
|
||||
UUID_(std::move(UUID)),
|
||||
Logger_(Logger)
|
||||
{
|
||||
@@ -118,42 +123,54 @@ namespace uCentral {
|
||||
|
||||
void handlePart(const Poco::Net::MessageHeader& Header, std::istream& Stream) override
|
||||
{
|
||||
FileType_ = Header.get("Content-Type", "(unspecified)");
|
||||
if (Header.has("Content-Disposition"))
|
||||
{
|
||||
std::string Disposition;
|
||||
Poco::Net::NameValueCollection Parameters;
|
||||
Poco::Net::MessageHeader::splitParameters(Header["Content-Disposition"], Disposition, Parameters);
|
||||
Name_ = Parameters.get("name", "(unnamed)");
|
||||
}
|
||||
try {
|
||||
Name_ = "(unnamed)";
|
||||
if (Header.has("Content-Disposition")) {
|
||||
std::string Disposition;
|
||||
Poco::Net::NameValueCollection Parameters;
|
||||
Poco::Net::MessageHeader::splitParameters(Header["Content-Disposition"],
|
||||
Disposition, Parameters);
|
||||
Name_ = Parameters.get("filename", "(unnamed)");
|
||||
}
|
||||
|
||||
Poco::CountingInputStream InputStream(Stream);
|
||||
std::string TmpFileName = FileUploader()->Path() + "/" + UUID_ + ".upload.start" ;
|
||||
std::string FinalFileName = FileUploader()->Path() + "/" + UUID_ ;
|
||||
Poco::TemporaryFile TmpFile;
|
||||
std::string FinalFileName = FileUploader()->Path() + "/" + UUID_;
|
||||
Logger_.information(Poco::format("FILE-UPLOADER: uploading trace for %s", UUID_));
|
||||
|
||||
Logger_.information(Poco::format("FILE-UPLOADER: uploading %s",TmpFileName));
|
||||
Poco::CountingInputStream InputStream(Stream);
|
||||
std::ofstream OutputStream(TmpFile.path(), std::ofstream::out);
|
||||
Poco::StreamCopier::copyStream(InputStream, OutputStream);
|
||||
Length_ = TmpFile.getSize();
|
||||
|
||||
std::ofstream OutputStream(TmpFileName, std::ofstream::out);
|
||||
Poco::StreamCopier::copyStream(InputStream, OutputStream);
|
||||
Length_ = InputStream.chars();
|
||||
rename(TmpFileName.c_str(),FinalFileName.c_str());
|
||||
}
|
||||
if (Length_ < FileUploader()->MaxSize()) {
|
||||
rename(TmpFile.path().c_str(), FinalFileName.c_str());
|
||||
Good_=true;
|
||||
} else {
|
||||
Error_ = "File is too large.";
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E ) {
|
||||
Logger_.log(E);
|
||||
Error_ = std::string("Upload caused an internal error: ") + E.what() ;
|
||||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] uint64_t Length() const { return Length_; }
|
||||
[[nodiscard]] const std::string& Name() const { return Name_; }
|
||||
[[nodiscard]] const std::string& ContentType() const { return FileType_; }
|
||||
[[nodiscard]] bool Good() const { return Good_; }
|
||||
std::string & Error() { return Error_; }
|
||||
|
||||
private:
|
||||
uint64_t Length_=0;
|
||||
std::string FileType_;
|
||||
bool Good_=false;
|
||||
std::string Name_;
|
||||
std::string UUID_;
|
||||
std::string Error_;
|
||||
Poco::Logger & Logger_;
|
||||
};
|
||||
|
||||
|
||||
class FormRequestHandler: public Poco::Net::HTTPRequestHandler
|
||||
/// Return a HTML document with the current date and time.
|
||||
{
|
||||
public:
|
||||
explicit FormRequestHandler(std::string UUID, Poco::Logger & L):
|
||||
@@ -165,62 +182,27 @@ namespace uCentral {
|
||||
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
|
||||
{
|
||||
try {
|
||||
MyPartHandler partHandler(UUID_,Logger_);
|
||||
FileUploaderPartHandler partHandler(UUID_,Logger_);
|
||||
|
||||
Poco::Net::HTMLForm form(Request, Request.stream(), partHandler);
|
||||
Response.setChunkedTransferEncoding(true);
|
||||
Response.setContentType("text/html");
|
||||
std::ostream &ResponseStream = Response.send();
|
||||
|
||||
ResponseStream <<
|
||||
"<html>\n"
|
||||
"<head>\n"
|
||||
"<title>POCO Form Server Sample</title>\n"
|
||||
"</head>\n"
|
||||
"<body>\n"
|
||||
"<h1>POCO Form Server Sample</h1>\n"
|
||||
"<h2>GET Form</h2>\n"
|
||||
"<form method=\"GET\" action=\"/form\">\n"
|
||||
"<input type=\"text\" name=\"text\" size=\"31\">\n"
|
||||
"<input type=\"submit\" value=\"GET\">\n"
|
||||
"</form>\n"
|
||||
"<h2>POST Form</h2>\n"
|
||||
"<form method=\"POST\" action=\"/form\">\n"
|
||||
"<input type=\"text\" name=\"text\" size=\"31\">\n"
|
||||
"<input type=\"submit\" value=\"POST\">\n"
|
||||
"</form>\n"
|
||||
"<h2>File Upload</h2>\n"
|
||||
"<form method=\"POST\" action=\"/form\" enctype=\"multipart/form-data\">\n"
|
||||
"<input type=\"file\" name=\"file\" size=\"31\"> \n"
|
||||
"<input type=\"submit\" value=\"Upload\">\n"
|
||||
"</form>\n";
|
||||
Response.setChunkedTransferEncoding(true);
|
||||
Response.setContentType("application/json");
|
||||
|
||||
ResponseStream << "<h2>Request</h2><p>\n";
|
||||
ResponseStream << "Method: " << Request.getMethod() << "<br>\n";
|
||||
ResponseStream << "URI: " << Request.getURI() << "<br>\n";
|
||||
for (auto & i:Request) {
|
||||
ResponseStream << i.first << ": " << i.second << "<br>\n";
|
||||
}
|
||||
|
||||
ResponseStream << "</p>";
|
||||
|
||||
if (!form.empty()) {
|
||||
ResponseStream << "<h2>Form</h2><p>\n";
|
||||
for (const auto & i:form)
|
||||
ResponseStream << i.first << ": " << i.second << "<br>\n";
|
||||
ResponseStream << "</p>";
|
||||
}
|
||||
|
||||
if (!partHandler.Name().empty()) {
|
||||
ResponseStream << "<h2>Upload</h2><p>\n";
|
||||
ResponseStream << "Name: " << partHandler.Name() << "<br>\n";
|
||||
ResponseStream << "Type: " << partHandler.ContentType() << "<br>\n";
|
||||
ResponseStream << "Size: " << partHandler.Length() << "<br>\n";
|
||||
ResponseStream << "</p>";
|
||||
}
|
||||
ResponseStream << "</body>\n";
|
||||
|
||||
Storage()->AttachFileToCommand(UUID_);
|
||||
Poco::JSON::Object Answer;
|
||||
if (partHandler.Good()) {
|
||||
Answer.set("filename", UUID_);
|
||||
Answer.set("error", 0);
|
||||
Storage()->AttachFileToCommand(UUID_);
|
||||
} else {
|
||||
Answer.set("filename", UUID_);
|
||||
Answer.set("error", 13);
|
||||
Answer.set("errorText", partHandler.Error() );
|
||||
Storage()->CancelWaitFile(UUID_, partHandler.Error() );
|
||||
}
|
||||
std::ostream &ResponseStream = Response.send();
|
||||
Poco::JSON::Stringifier::stringify(Answer, ResponseStream);
|
||||
return;
|
||||
}
|
||||
catch( const Poco::Exception & E )
|
||||
{
|
||||
@@ -237,7 +219,7 @@ namespace uCentral {
|
||||
|
||||
Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
|
||||
|
||||
Logger_.debug(Poco::format("REQUEST(%s): %s %s", uCentral::Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
|
||||
Logger_.debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
|
||||
|
||||
// The UUID should be after the /v1/upload/ part...
|
||||
auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);
|
||||
|
||||
@@ -15,8 +15,9 @@
|
||||
#include "Poco/Net/HTTPRequestHandler.h"
|
||||
#include "Poco/Net/HTTPRequestHandlerFactory.h"
|
||||
#include "Poco/Net/HTTPServerRequest.h"
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class FileUploader : public SubSystemServer {
|
||||
public:
|
||||
@@ -35,6 +36,8 @@ namespace uCentral {
|
||||
return instance_;
|
||||
}
|
||||
|
||||
[[nodiscard]] inline uint64_t MaxSize() const { return MaxSize_; }
|
||||
|
||||
private:
|
||||
static FileUploader *instance_;
|
||||
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
|
||||
@@ -42,8 +45,13 @@ namespace uCentral {
|
||||
std::string FullName_;
|
||||
std::map<std::string,uint64_t> OutStandingUploads_;
|
||||
std::string Path_;
|
||||
uint64_t MaxSize_=10000000;
|
||||
|
||||
FileUploader() noexcept;
|
||||
explicit FileUploader() noexcept:
|
||||
SubSystemServer("FileUploader", "FILE-UPLOAD", "ucentral.fileuploader")
|
||||
{
|
||||
SubMutexGuard Guard(Mutex_);
|
||||
}
|
||||
};
|
||||
|
||||
class FileUpLoaderRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "Daemon.h"
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class KafkaManager *KafkaManager::instance_ = nullptr;
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace uCentral {
|
||||
SystemInfoWrapper_ = R"lit({ "system" : { "id" : )lit" +
|
||||
std::to_string(Daemon()->ID()) +
|
||||
R"lit( , "host" : ")lit" + Daemon()->PrivateEndPoint() +
|
||||
R"lit(" } , "payload" : ")lit" ;
|
||||
R"lit(" } , "payload" : )lit" ;
|
||||
cppkafka::Producer Producer(Config);
|
||||
ProducerRunning_ = true;
|
||||
while(ProducerRunning_) {
|
||||
@@ -87,6 +87,13 @@ namespace uCentral {
|
||||
}
|
||||
}
|
||||
|
||||
void KafkaManager::PartitionAssignment(const cppkafka::TopicPartitionList& partitions) {
|
||||
Logger_.information(Poco::format("Partition assigned: %Lu...",(uint64_t )partitions.front().get_partition()));
|
||||
}
|
||||
void KafkaManager::PartitionRevocation(const cppkafka::TopicPartitionList& partitions) {
|
||||
Logger_.information(Poco::format("Partition revocation: %Lu...",(uint64_t )partitions.front().get_partition()));
|
||||
}
|
||||
|
||||
void KafkaManager::ConsumerThr() {
|
||||
cppkafka::Configuration Config({
|
||||
{ "client.id", Daemon()->ConfigGetString("ucentral.kafka.client.id") },
|
||||
@@ -105,14 +112,23 @@ namespace uCentral {
|
||||
Config.set_default_topic_configuration(topic_config);
|
||||
|
||||
cppkafka::Consumer Consumer(Config);
|
||||
Consumer.set_assignment_callback([this](const cppkafka::TopicPartitionList& partitions) {
|
||||
Logger_.information(Poco::format("Partition assigned: %Lu...",(uint64_t )partitions.front().get_partition()));
|
||||
Consumer.set_assignment_callback([this](cppkafka::TopicPartitionList& partitions) {
|
||||
if(!partitions.empty()) {
|
||||
Logger_.information(Poco::format("Partition assigned: %Lu...",
|
||||
(uint64_t)partitions.front().get_partition()));
|
||||
}
|
||||
});
|
||||
Consumer.set_revocation_callback([this](const cppkafka::TopicPartitionList& partitions) {
|
||||
Logger_.information(Poco::format("Partition revocation: %Lu...",(uint64_t )partitions.front().get_partition()));
|
||||
if(!partitions.empty()) {
|
||||
Logger_.information(Poco::format("Partition revocation: %Lu...",
|
||||
(uint64_t)partitions.front().get_partition()));
|
||||
}
|
||||
});
|
||||
|
||||
Types::StringVec Topics;
|
||||
bool AutoCommit = Daemon()->ConfigGetBool("ucentral.kafka.auto.commit",false);
|
||||
auto BatchSize = Daemon()->ConfigGetInt("ucentral.kafka.consumer.batchsize",20);
|
||||
|
||||
Types::StringVec Topics;
|
||||
for(const auto &i:Notifiers_)
|
||||
Topics.push_back(i.first);
|
||||
|
||||
@@ -121,28 +137,31 @@ namespace uCentral {
|
||||
ConsumerRunning_ = true;
|
||||
while(ConsumerRunning_) {
|
||||
try {
|
||||
cppkafka::Message Msg = Consumer.poll(std::chrono::milliseconds(200));
|
||||
if (!Msg)
|
||||
continue;
|
||||
if (Msg.get_error()) {
|
||||
if (!Msg.is_eof()) {
|
||||
Logger_.error(Poco::format("Error: %s", Msg.get_error().to_string()));
|
||||
}
|
||||
Consumer.commit(Msg);
|
||||
continue;
|
||||
}
|
||||
SubMutexGuard G(ConsumerMutex_);
|
||||
auto It = Notifiers_.find(Msg.get_topic());
|
||||
if (It != Notifiers_.end()) {
|
||||
Types::TopicNotifyFunctionList &FL = It->second;
|
||||
std::string Key{Msg.get_key()};
|
||||
std::string Payload{Msg.get_payload()};
|
||||
for (auto &F : FL) {
|
||||
std::thread T(F.first, Key, Payload);
|
||||
T.detach();
|
||||
}
|
||||
}
|
||||
Consumer.commit(Msg);
|
||||
std::vector<cppkafka::Message> MsgVec = Consumer.poll_batch(BatchSize, std::chrono::milliseconds(200));
|
||||
for(auto const &Msg:MsgVec) {
|
||||
if (!Msg)
|
||||
continue;
|
||||
if (Msg.get_error()) {
|
||||
if (!Msg.is_eof()) {
|
||||
Logger_.error(Poco::format("Error: %s", Msg.get_error().to_string()));
|
||||
}if(!AutoCommit)
|
||||
Consumer.async_commit(Msg);
|
||||
continue;
|
||||
}
|
||||
SubMutexGuard G(ConsumerMutex_);
|
||||
auto It = Notifiers_.find(Msg.get_topic());
|
||||
if (It != Notifiers_.end()) {
|
||||
Types::TopicNotifyFunctionList &FL = It->second;
|
||||
std::string Key{Msg.get_key()};
|
||||
std::string Payload{Msg.get_payload()};
|
||||
for (auto &F : FL) {
|
||||
std::thread T(F.first, Key, Payload);
|
||||
T.detach();
|
||||
}
|
||||
}
|
||||
if (!AutoCommit)
|
||||
Consumer.async_commit(Msg);
|
||||
}
|
||||
} catch (const cppkafka::HandleException &E) {
|
||||
Logger_.warning(Poco::format("Caught a Kafka exception (consumer): %s",std::string{E.what()}));
|
||||
} catch (const Poco::Exception &E) {
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
#include <thread>
|
||||
|
||||
#include "SubSystemServer.h"
|
||||
#include "uCentralTypes.h"
|
||||
#include "OpenWifiTypes.h"
|
||||
|
||||
#include "cppkafka/cppkafka.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class KafkaManager : public SubSystemServer {
|
||||
public:
|
||||
@@ -47,6 +47,8 @@ namespace uCentral {
|
||||
int RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction & F);
|
||||
void UnregisterTopicWatcher(const std::string &Topic, int FunctionId);
|
||||
void WakeUp();
|
||||
void PartitionAssignment(const cppkafka::TopicPartitionList& partitions);
|
||||
void PartitionRevocation(const cppkafka::TopicPartitionList& partitions);
|
||||
|
||||
private:
|
||||
static KafkaManager *instance_;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#ifndef UCENTRALGW_KAFKA_TOPICS_H
|
||||
#define UCENTRALGW_KAFKA_TOPICS_H
|
||||
|
||||
namespace uCentral::KafkaTopics {
|
||||
namespace OpenWifi::KafkaTopics {
|
||||
static const std::string HEALTHCHECK{"healthcheck"};
|
||||
static const std::string STATE{"state"};
|
||||
static const std::string CONNECTION{"connection"};
|
||||
@@ -13,6 +13,7 @@ namespace uCentral::KafkaTopics {
|
||||
static const std::string ALERTS{"alerts"};
|
||||
static const std::string COMMAND{"command"};
|
||||
static const std::string SERVICE_EVENTS{"service_events"};
|
||||
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
|
||||
|
||||
namespace ServiceEvents {
|
||||
static const std::string EVENT_JOIN{"join"};
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "AuthClient.h"
|
||||
#endif
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
void MyErrorHandler::exception(const Poco::Exception & E) {
|
||||
Poco::Thread * CurrentThread = Poco::Thread::current();
|
||||
@@ -112,6 +112,16 @@ namespace uCentral {
|
||||
} else {
|
||||
logger().error("Bad bus message.");
|
||||
}
|
||||
|
||||
auto i=Services_.begin();
|
||||
auto Now = (uint64_t )std::time(nullptr);
|
||||
for(;i!=Services_.end();) {
|
||||
if((Now - i->second.LastUpdate)>60) {
|
||||
i = Services_.erase(i);
|
||||
} else
|
||||
++i;
|
||||
}
|
||||
|
||||
} catch (const Poco::Exception &E) {
|
||||
logger().log(E);
|
||||
}
|
||||
@@ -140,11 +150,6 @@ namespace uCentral {
|
||||
}
|
||||
|
||||
void MicroService::initialize(Poco::Util::Application &self) {
|
||||
|
||||
std::string V{APP_VERSION};
|
||||
std::string B{BUILD_NUMBER};
|
||||
Version_ = V + "(" + B + ")";
|
||||
|
||||
// add the default services
|
||||
SubSystems_.push_back(KafkaManager());
|
||||
SubSystems_.push_back(ALBHealthCheckServer());
|
||||
@@ -187,7 +192,8 @@ namespace uCentral {
|
||||
}
|
||||
}
|
||||
std::string KeyFile = ConfigPath("ucentral.service.key");
|
||||
AppKey_ = Poco::SharedPtr<Poco::Crypto::RSAKey>(new Poco::Crypto::RSAKey("", KeyFile, ""));
|
||||
std::string KeyFilePassword = ConfigPath("ucentral.service.key.password" , "" );
|
||||
AppKey_ = Poco::SharedPtr<Poco::Crypto::RSAKey>(new Poco::Crypto::RSAKey("", KeyFile, KeyFilePassword));
|
||||
Cipher_ = CipherFactory_.createCipher(*AppKey_);
|
||||
ID_ = Utils::GetSystemId();
|
||||
if(!DebugMode_)
|
||||
|
||||
@@ -24,14 +24,16 @@
|
||||
#include "Poco/Net/HTTPServerRequest.h"
|
||||
#include "Poco/Process.h"
|
||||
|
||||
#include "uCentralTypes.h"
|
||||
#include "OpenWifiTypes.h"
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
static const std::string uSERVICE_SECURITY{"ucentralsec"};
|
||||
static const std::string uSERVICE_GATEWAY{"ucentralgw"};
|
||||
static const std::string uSERVICE_FIRMWARE{ "ucentralfws"};
|
||||
static const std::string uSERVICE_FIRMWARE{ "ucentralfms"};
|
||||
static const std::string uSERVICE_TOPOLOGY{ "owtopo"};
|
||||
static const std::string uSERVICE_PROVISIONING{ "owprov"};
|
||||
|
||||
class MyErrorHandler : public Poco::ErrorHandler {
|
||||
public:
|
||||
@@ -79,7 +81,11 @@ namespace uCentral {
|
||||
DAEMON_CONFIG_ENV_VAR(std::move(ConfigVar)),
|
||||
DAEMON_APP_NAME(std::move(AppName)),
|
||||
DAEMON_BUS_TIMER(BusTimer),
|
||||
SubSystems_(std::move(Subsystems)) {}
|
||||
SubSystems_(std::move(Subsystems)) {
|
||||
std::string V{APP_VERSION};
|
||||
std::string B{BUILD_NUMBER};
|
||||
Version_ = V + "(" + B + ")";
|
||||
}
|
||||
|
||||
int main(const ArgVec &args) override;
|
||||
void initialize(Application &self) override;
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class OUIServer * OUIServer::instance_;
|
||||
|
||||
int OUIServer::Start() {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class OUIServer : public SubSystemServer {
|
||||
public:
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include "Utils.h"
|
||||
#include "Daemon.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
OpenAPIRequestGet::OpenAPIRequestGet( const std::string & ServiceType,
|
||||
const std::string & EndPoint,
|
||||
@@ -32,7 +32,7 @@ namespace uCentral {
|
||||
|
||||
int OpenAPIRequestGet::Do(Poco::JSON::Object::Ptr &ResponseObject) {
|
||||
try {
|
||||
auto Services = Daemon()->GetServices(Type_);
|
||||
auto Services = Daemon()->GetServices(Type_);
|
||||
for(auto const &Svc:Services) {
|
||||
Poco::URI URI(Svc.PrivateEndPoint);
|
||||
Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort());
|
||||
@@ -42,7 +42,7 @@ namespace uCentral {
|
||||
URI.addQueryParameter(qp.first, qp.second);
|
||||
|
||||
std::string Path(URI.getPathAndQuery());
|
||||
Session.setTimeout(Poco::Timespan(5, 0));
|
||||
Session.setTimeout(Poco::Timespan(msTimeout_/1000, msTimeout_ % 1000));
|
||||
|
||||
Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Path,
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
|
||||
#include "Poco/JSON/Object.h"
|
||||
|
||||
#include "uCentralTypes.h"
|
||||
#include "OpenWifiTypes.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class OpenAPIRequestGet {
|
||||
public:
|
||||
|
||||
68
src/OpenWifiTypes.h
Normal file
68
src/OpenWifiTypes.h
Normal file
@@ -0,0 +1,68 @@
|
||||
//
|
||||
// Created by stephane bourque on 2021-06-13.
|
||||
//
|
||||
|
||||
#ifndef UCENTRALGW_UCENTRALTYPES_H
|
||||
#define UCENTRALGW_UCENTRALTYPES_H
|
||||
|
||||
#include "SubSystemServer.h"
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <utility>
|
||||
#include <queue>
|
||||
|
||||
#include "Poco/StringTokenizer.h"
|
||||
|
||||
namespace OpenWifi::Types {
|
||||
typedef std::pair<std::string,std::string> StringPair;
|
||||
typedef std::vector<StringPair> StringPairVec;
|
||||
typedef std::queue<StringPair> StringPairQueue;
|
||||
typedef std::vector<std::string> StringVec;
|
||||
typedef std::set<std::string> StringSet;
|
||||
typedef std::vector<SubSystemServer*> SubSystemVec;
|
||||
typedef std::map<std::string,std::set<std::string>> StringMapStringSet;
|
||||
typedef std::function<void(std::string, std::string)> TopicNotifyFunction;
|
||||
typedef std::list<std::pair<TopicNotifyFunction,int>> TopicNotifyFunctionList;
|
||||
typedef std::map<std::string, TopicNotifyFunctionList> NotifyTable;
|
||||
typedef std::map<std::string,uint64_t> CountedMap;
|
||||
|
||||
typedef std::string UUID_t;
|
||||
typedef std::vector<UUID_t> UUIDvec_t;
|
||||
|
||||
inline void UpdateCountedMap(CountedMap &M, const std::string &S, uint64_t Increment=1) {
|
||||
auto it = M.find(S);
|
||||
if(it==M.end())
|
||||
M[S] = Increment;
|
||||
else
|
||||
it->second += Increment;
|
||||
}
|
||||
|
||||
inline std::string to_string( const StringVec &V) {
|
||||
std::string Result;
|
||||
|
||||
bool first=true;
|
||||
for(const auto &i:V) {
|
||||
if(first) {
|
||||
Result += i;
|
||||
first = false;
|
||||
} else {
|
||||
Result += ",";
|
||||
Result += i;
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
inline void from_string(const std::string &S, StringVec &V) {
|
||||
Poco::StringTokenizer Tokens(S,",",Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY);
|
||||
|
||||
for(auto const &i:Tokens)
|
||||
V.emplace_back(i);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // UCENTRALGW_UCENTRALTYPES_H
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "RESTAPI_protocol.h"
|
||||
#include "StorageService.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_BlackList::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace uCentral {
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
|
||||
try {
|
||||
auto SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
auto SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
|
||||
if (!SerialNumber.empty()) {
|
||||
if (Storage()->DeleteBlackListDevice(SerialNumber)) {
|
||||
@@ -63,7 +63,10 @@ namespace uCentral {
|
||||
void RESTAPI_BlackList::DoGet(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
try {
|
||||
InitQueryBlock();
|
||||
if(!InitQueryBlock()) {
|
||||
BadRequest(Request, Response, "Illegal parameter value.");
|
||||
return;
|
||||
}
|
||||
std::vector<GWObjects::BlackListedDevice> Devices;
|
||||
|
||||
Poco::JSON::Array Objects;
|
||||
@@ -75,7 +78,7 @@ namespace uCentral {
|
||||
}
|
||||
}
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::DEVICES, Objects);
|
||||
RetObj.set(RESTAPI::Protocol::DEVICES, Objects);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
@@ -91,18 +94,18 @@ namespace uCentral {
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::DEVICES) &&
|
||||
Obj->isArray(uCentral::RESTAPI::Protocol::DEVICES)) {
|
||||
if (Obj->has(RESTAPI::Protocol::DEVICES) &&
|
||||
Obj->isArray(RESTAPI::Protocol::DEVICES)) {
|
||||
std::vector<GWObjects::BlackListedDevice> Devices;
|
||||
auto DeviceArray = Obj->getArray(uCentral::RESTAPI::Protocol::DEVICES);
|
||||
auto DeviceArray = Obj->getArray(RESTAPI::Protocol::DEVICES);
|
||||
for (const auto &i : *DeviceArray) {
|
||||
Poco::JSON::Parser pp;
|
||||
auto InnerObj = pp.parse(i).extract<Poco::JSON::Object::Ptr>();
|
||||
Poco::DynamicStruct Vars = *InnerObj;
|
||||
if (Vars.contains(uCentral::RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Vars.contains(uCentral::RESTAPI::Protocol::REASON)) {
|
||||
auto SerialNumber = Vars[uCentral::RESTAPI::Protocol::SERIALNUMBER].toString();
|
||||
auto Reason = Vars[uCentral::RESTAPI::Protocol::REASON].toString();
|
||||
if (Vars.contains(RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Vars.contains(RESTAPI::Protocol::REASON)) {
|
||||
auto SerialNumber = Vars[RESTAPI::Protocol::SERIALNUMBER].toString();
|
||||
auto Reason = Vars[RESTAPI::Protocol::REASON].toString();
|
||||
GWObjects::BlackListedDevice D{.SerialNumber = SerialNumber,
|
||||
.Reason = Reason,
|
||||
.Author = UserInfo_.webtoken.username_,
|
||||
|
||||
@@ -11,15 +11,16 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_BlackList : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_BlackList(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_BlackList(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
|
||||
|
||||
@@ -19,16 +19,16 @@
|
||||
#include "RESTAPI_utils.h"
|
||||
#include "Utils.h"
|
||||
|
||||
using uCentral::RESTAPI_utils::field_to_json;
|
||||
using uCentral::RESTAPI_utils::field_from_json;
|
||||
using uCentral::RESTAPI_utils::EmbedDocument;
|
||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||
using OpenWifi::RESTAPI_utils::EmbedDocument;
|
||||
|
||||
namespace uCentral::GWObjects {
|
||||
namespace OpenWifi::GWObjects {
|
||||
|
||||
void Device::to_json(Poco::JSON::Object &Obj) const {
|
||||
field_to_json(Obj,"serialNumber", SerialNumber);
|
||||
#ifdef TIP_GATEWAY_SERVICE
|
||||
field_to_json(Obj,"deviceType", uCentral::Daemon::instance()->IdentifyDevice(Compatible));
|
||||
field_to_json(Obj,"deviceType", Daemon::instance()->IdentifyDevice(Compatible));
|
||||
#endif
|
||||
field_to_json(Obj,"macAddress", MACAddress);
|
||||
field_to_json(Obj,"manufacturer", Manufacturer);
|
||||
@@ -57,13 +57,15 @@ namespace uCentral::GWObjects {
|
||||
if (DeviceRegistry()->GetState(SerialNumber, ConState)) {
|
||||
ConState.to_json(Obj);
|
||||
} else {
|
||||
field_to_json(Obj,"ipAddress", "N/A");
|
||||
field_to_json(Obj,"ipAddress", "");
|
||||
field_to_json(Obj,"txBytes", (uint64_t) 0);
|
||||
field_to_json(Obj,"rxBytes", (uint64_t )0);
|
||||
field_to_json(Obj,"messageCount", (uint64_t )0);
|
||||
field_to_json(Obj,"connected", false);
|
||||
field_to_json(Obj,"lastContact", "N/A");
|
||||
field_to_json(Obj,"lastContact", "");
|
||||
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE");
|
||||
field_to_json(Obj,"associations_2G", (uint64_t) 0);
|
||||
field_to_json(Obj,"associations_5G", (uint64_t) 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -176,6 +178,9 @@ namespace uCentral::GWObjects {
|
||||
field_to_json(Obj,"connected", Connected);
|
||||
field_to_json(Obj,"firmware", Firmware);
|
||||
field_to_json(Obj,"lastContact", LastContact);
|
||||
field_to_json(Obj,"associations_2G", Associations_2G);
|
||||
field_to_json(Obj,"associations_5G", Associations_5G);
|
||||
|
||||
switch(VerifiedCertificate) {
|
||||
case NO_CERTIFICATE:
|
||||
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break;
|
||||
@@ -203,5 +208,40 @@ namespace uCentral::GWObjects {
|
||||
field_to_json(Obj,"password",DevicePassword);
|
||||
}
|
||||
|
||||
void Dashboard::to_json(Poco::JSON::Object &Obj) const {
|
||||
field_to_json(Obj,"commands",commands);
|
||||
field_to_json(Obj,"upTimes",upTimes);
|
||||
field_to_json(Obj,"memoryUsed",memoryUsed);
|
||||
field_to_json(Obj,"load1",load1);
|
||||
field_to_json(Obj,"load5",load5);
|
||||
field_to_json(Obj,"load15",load15);
|
||||
field_to_json(Obj,"vendors",vendors);
|
||||
field_to_json(Obj,"status",status);
|
||||
field_to_json(Obj,"deviceType",deviceType);
|
||||
field_to_json(Obj,"healths",healths);
|
||||
field_to_json(Obj,"certificates",certificates);
|
||||
field_to_json(Obj,"lastContact",lastContact);
|
||||
field_to_json(Obj,"associations",associations);
|
||||
field_to_json(Obj,"snapshot",snapshot);
|
||||
field_to_json(Obj,"numberOfDevices",numberOfDevices);
|
||||
}
|
||||
|
||||
void Dashboard::reset() {
|
||||
commands.clear();
|
||||
upTimes.clear();
|
||||
memoryUsed.clear();
|
||||
load1.clear();
|
||||
load5.clear();
|
||||
load15.clear();
|
||||
vendors.clear();
|
||||
status.clear();
|
||||
deviceType.clear();
|
||||
healths.clear();
|
||||
certificates.clear();
|
||||
lastContact.clear();
|
||||
associations.clear();
|
||||
numberOfDevices = 0 ;
|
||||
snapshot = std::time(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "Poco/JSON/Object.h"
|
||||
#include "RESTAPI_SecurityObjects.h"
|
||||
|
||||
namespace uCentral::GWObjects {
|
||||
namespace OpenWifi::GWObjects {
|
||||
|
||||
enum CertificateValidation {
|
||||
NO_CERTIFICATE,
|
||||
@@ -24,14 +24,17 @@ namespace uCentral::GWObjects {
|
||||
struct ConnectionState {
|
||||
uint64_t MessageCount = 0 ;
|
||||
std::string SerialNumber;
|
||||
std::string Address = "N/A";
|
||||
std::string Address;
|
||||
uint64_t UUID = 0 ;
|
||||
uint64_t PendingUUID = 0 ;
|
||||
uint64_t TX = 0, RX = 0;
|
||||
uint64_t Associations_2G=0;
|
||||
uint64_t Associations_5G=0;
|
||||
bool Connected = false;
|
||||
uint64_t LastContact=0;
|
||||
std::string Firmware;
|
||||
CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
|
||||
std::string Compatible;
|
||||
void to_json(Poco::JSON::Object &Obj) const;
|
||||
};
|
||||
|
||||
@@ -156,6 +159,26 @@ namespace uCentral::GWObjects {
|
||||
std::string DevicePassword;
|
||||
void to_json(Poco::JSON::Object &Obj) const;
|
||||
};
|
||||
|
||||
struct Dashboard {
|
||||
uint64_t snapshot;
|
||||
uint64_t numberOfDevices;
|
||||
Types::CountedMap commands;
|
||||
Types::CountedMap upTimes;
|
||||
Types::CountedMap memoryUsed;
|
||||
Types::CountedMap load1;
|
||||
Types::CountedMap load5;
|
||||
Types::CountedMap load15;
|
||||
Types::CountedMap vendors;
|
||||
Types::CountedMap status;
|
||||
Types::CountedMap deviceType;
|
||||
Types::CountedMap healths;
|
||||
Types::CountedMap certificates;
|
||||
Types::CountedMap lastContact;
|
||||
Types::CountedMap associations;
|
||||
void to_json(Poco::JSON::Object &Obj) const;
|
||||
void reset();
|
||||
};
|
||||
}
|
||||
|
||||
#endif //UCENTRAL_RESTAPI_OBJECTS_H
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "Poco/URI.h"
|
||||
|
||||
#include "RESTAPI_BlackList.h"
|
||||
#include "RESTAPI_callback.h"
|
||||
#include "RESTAPI_command.h"
|
||||
#include "RESTAPI_commands.h"
|
||||
#include "RESTAPI_default_configuration.h"
|
||||
@@ -16,11 +15,10 @@
|
||||
#include "RESTAPI_device_handler.h"
|
||||
#include "RESTAPI_devices_handler.h"
|
||||
#include "RESTAPI_file.h"
|
||||
#include "RESTAPI_system_command.h"
|
||||
#include "RESTAPI_ouis.h"
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class RESTAPI_InternalServer *RESTAPI_InternalServer::instance_ = nullptr;
|
||||
|
||||
@@ -61,13 +59,13 @@ namespace uCentral {
|
||||
|
||||
Poco::Net::HTTPRequestHandler *InternalRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
|
||||
|
||||
Logger_.debug(Poco::format("REQUEST(%s): %s %s", uCentral::Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
|
||||
Logger_.debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
|
||||
|
||||
Poco::URI uri(Request.getURI());
|
||||
const auto & Path = uri.getPath();
|
||||
RESTAPIHandler::BindingMap Bindings;
|
||||
|
||||
return RESTAPI_Router<
|
||||
return RESTAPI_Router_I<
|
||||
RESTAPI_devices_handler,
|
||||
RESTAPI_device_handler,
|
||||
RESTAPI_device_commandHandler,
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "Poco/Net/HTTPServerRequest.h"
|
||||
#include "Poco/Net/NetException.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class RESTAPI_InternalServer : public SubSystemServer {
|
||||
|
||||
|
||||
@@ -13,8 +13,9 @@
|
||||
#include "StorageService.h"
|
||||
#include "DeviceRegistry.h"
|
||||
#include "CommandManager.h"
|
||||
#include "uCentralProtocol.h"
|
||||
|
||||
namespace uCentral::RESTAPI_RPC {
|
||||
namespace OpenWifi::RESTAPI_RPC {
|
||||
void SetCommandAsPending(GWObjects::CommandDetails &Cmd,
|
||||
Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response, RESTAPIHandler *Handler) {
|
||||
@@ -70,6 +71,12 @@ namespace uCentral::RESTAPI_RPC {
|
||||
Cmd.Status = "completed";
|
||||
Cmd.Completed = time(nullptr);
|
||||
|
||||
if(Cmd.ErrorCode && Cmd.Command==uCentralProtocol::TRACE) {
|
||||
Cmd.WaitingForFile = 0;
|
||||
Cmd.AttachDate = Cmd.AttachSize = 0 ;
|
||||
Cmd.AttachType = "";
|
||||
}
|
||||
|
||||
// Add the completed command to the database...
|
||||
Storage()->AddCommand(Cmd.SerialNumber, Cmd,Storage::COMMAND_COMPLETED);
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#include "RESTAPI_GWobjects.h"
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral::RESTAPI_RPC {
|
||||
namespace OpenWifi::RESTAPI_RPC {
|
||||
|
||||
bool WaitForRPC(GWObjects::CommandDetails &Cmd,
|
||||
Poco::Net::HTTPServerRequest &Request,
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
#include "RESTAPI_SecurityObjects.h"
|
||||
#include "RESTAPI_utils.h"
|
||||
|
||||
using uCentral::RESTAPI_utils::field_to_json;
|
||||
using uCentral::RESTAPI_utils::field_from_json;
|
||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||
|
||||
namespace uCentral::SecurityObjects {
|
||||
namespace OpenWifi::SecurityObjects {
|
||||
|
||||
void AclTemplate::to_json(Poco::JSON::Object &Obj) const {
|
||||
field_to_json(Obj,"Read",Read_);
|
||||
@@ -26,12 +26,12 @@ namespace uCentral::SecurityObjects {
|
||||
}
|
||||
|
||||
ResourceAccessType ResourceAccessTypeFromString(const std::string &s) {
|
||||
if(s=="READ") return READ;
|
||||
if(s=="MODIFY") return MODIFY;
|
||||
if(s=="DELETE") return DELETE;
|
||||
if(s=="CREATE") return CREATE;
|
||||
if(s=="TEST") return TEST;
|
||||
if(s=="MOVE") return MOVE;
|
||||
if(!Poco::icompare(s,"READ")) return READ;
|
||||
if(!Poco::icompare(s,"MODIFY")) return MODIFY;
|
||||
if(!Poco::icompare(s,"DELETE")) return DELETE;
|
||||
if(!Poco::icompare(s,"CREATE")) return CREATE;
|
||||
if(!Poco::icompare(s,"TEST")) return TEST;
|
||||
if(!Poco::icompare(s,"MOVE")) return MOVE;
|
||||
return NONE;
|
||||
}
|
||||
|
||||
@@ -48,17 +48,17 @@ namespace uCentral::SecurityObjects {
|
||||
}
|
||||
|
||||
USER_ROLE UserTypeFromString(const std::string &U) {
|
||||
if (U=="root")
|
||||
if (!Poco::icompare(U,"root"))
|
||||
return ROOT;
|
||||
else if (U=="admin")
|
||||
else if (!Poco::icompare(U,"admin"))
|
||||
return ADMIN;
|
||||
else if (U=="subscriber")
|
||||
else if (!Poco::icompare(U,"subscriber"))
|
||||
return SUBSCRIBER;
|
||||
else if (U=="csr")
|
||||
else if (!Poco::icompare(U,"csr"))
|
||||
return CSR;
|
||||
else if (U=="system")
|
||||
else if (!Poco::icompare(U, "system"))
|
||||
return SYSTEM;
|
||||
else if (U=="special")
|
||||
else if (!Poco::icompare(U, "special"))
|
||||
return SPECIAL;
|
||||
return UNKNOWN;
|
||||
}
|
||||
@@ -71,6 +71,7 @@ namespace uCentral::SecurityObjects {
|
||||
case CSR: return "csr";
|
||||
case SYSTEM: return "system";
|
||||
case SPECIAL: return "special";
|
||||
case ADMIN: return "admin";
|
||||
default: return "unknown";
|
||||
}
|
||||
}
|
||||
@@ -302,6 +303,20 @@ namespace uCentral::SecurityObjects {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes) {
|
||||
try {
|
||||
SecurityObjects::NoteInfoVec NIV;
|
||||
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
|
||||
for(auto const &i:NIV) {
|
||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note};
|
||||
Notes.push_back(ii);
|
||||
}
|
||||
} catch(...) {
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ProfileAction::to_json(Poco::JSON::Object &Obj) const {
|
||||
field_to_json(Obj,"resource", resource);
|
||||
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
#define UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
||||
|
||||
#include "Poco/JSON/Object.h"
|
||||
#include "uCentralTypes.h"
|
||||
#include "OpenWifiTypes.h"
|
||||
|
||||
namespace uCentral::SecurityObjects {
|
||||
namespace OpenWifi::SecurityObjects {
|
||||
|
||||
struct AclTemplate {
|
||||
bool Read_ = true;
|
||||
@@ -41,16 +41,6 @@ namespace uCentral::SecurityObjects {
|
||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||
};
|
||||
|
||||
enum AUTH_ERROR {
|
||||
SUCCESS,
|
||||
PASSWORD_CHANGE_REQUIRED,
|
||||
PASSWORD_DOES_NOT_MATCH,
|
||||
PASSWORD_ALREADY_USED,
|
||||
USERNAME_PENDING_VERIFICATION,
|
||||
PASSWORD_INVALID,
|
||||
INTERNAL_ERROR
|
||||
};
|
||||
|
||||
enum USER_ROLE {
|
||||
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, SPECIAL
|
||||
};
|
||||
@@ -104,6 +94,8 @@ namespace uCentral::SecurityObjects {
|
||||
};
|
||||
typedef std::vector<UserInfo> UserInfoVec;
|
||||
|
||||
bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
||||
|
||||
struct InternalServiceInfo {
|
||||
std::string privateURI;
|
||||
std::string publicURI;
|
||||
@@ -124,9 +116,9 @@ namespace uCentral::SecurityObjects {
|
||||
struct SystemEndpoint {
|
||||
std::string type;
|
||||
uint64_t id = 0;
|
||||
std::string vendor;
|
||||
std::string vendor{"OpenWiFi"};
|
||||
std::string uri;
|
||||
std::string authenticationType;
|
||||
std::string authenticationType{"internal_v1"};
|
||||
void to_json(Poco::JSON::Object &Obj) const;
|
||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||
};
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
//
|
||||
// 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 "RESTAPI_callback.h"
|
||||
#include "Poco/JSON/Object.h"
|
||||
#include "Poco/JSON/Parser.h"
|
||||
|
||||
#include "RESTAPI_protocol.h"
|
||||
#include "StorageService.h"
|
||||
|
||||
namespace uCentral {
|
||||
void RESTAPI_callback::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
return;
|
||||
|
||||
if (!ValidateAPIKey(Request, Response))
|
||||
return;
|
||||
|
||||
ParseParameters(Request);
|
||||
|
||||
try {
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST)
|
||||
DoPost(Request, Response);
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
|
||||
void RESTAPI_callback::DoPost(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
try {
|
||||
Poco::JSON::Parser parser;
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
Poco::DynamicStruct ds = *Obj;
|
||||
|
||||
auto Topic = GetParameter(uCentral::RESTAPI::Protocol::TOPIC, "");
|
||||
if (Topic == "ucentralfws") {
|
||||
if (ds.contains(uCentral::RESTAPI::Protocol::FIRMWARES) &&
|
||||
ds[uCentral::RESTAPI::Protocol::FIRMWARES].isArray()) {
|
||||
std::cout << "Proper manifest received..." << std::endl;
|
||||
Logger_.information("New manifest...");
|
||||
OK(Request, Response);
|
||||
return;
|
||||
} else {
|
||||
std::cout << __LINE__ << std::endl;
|
||||
Logger_.information("Bad manifest. JSON does not contain firmwares");
|
||||
}
|
||||
} else {
|
||||
Logger_.information("Missing topic in callback.");
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
//
|
||||
// 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_CALLBACK_H
|
||||
#define UCENTRALGW_RESTAPI_CALLBACK_H
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
class RESTAPI_callback : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_callback(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
void DoPost(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response);
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/callbackChannel"};}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // UCENTRALGW_RESTAPI_CALLBACK_H
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "RESTAPI_protocol.h"
|
||||
#include "StorageService.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
@@ -24,7 +24,7 @@ void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
ParseParameters(Request);
|
||||
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
auto CommandUUID = GetBinding(uCentral::RESTAPI::Protocol::COMMANDUUID, "");
|
||||
auto CommandUUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
|
||||
GWObjects::CommandDetails Command;
|
||||
if (Storage()->GetCommand(CommandUUID, Command)) {
|
||||
Poco::JSON::Object RetObj;
|
||||
@@ -33,7 +33,7 @@ void RESTAPI_command::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
} else
|
||||
NotFound(Request, Response);
|
||||
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
|
||||
auto CommandUUID = GetBinding(uCentral::RESTAPI::Protocol::COMMANDUUID, "");
|
||||
auto CommandUUID = GetBinding(RESTAPI::Protocol::COMMANDUUID, "");
|
||||
if (Storage()->DeleteCommand(CommandUUID)) {
|
||||
OK(Request, Response);
|
||||
} else {
|
||||
|
||||
@@ -11,14 +11,15 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_command : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_command(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_command(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/command/{commandUUID}"};}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "StorageService.h"
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
@@ -22,9 +22,12 @@ void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
|
||||
try {
|
||||
ParseParameters(Request);
|
||||
InitQueryBlock();
|
||||
if(!InitQueryBlock()) {
|
||||
BadRequest(Request, Response, "Illegal parameter value.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
std::vector<GWObjects::CommandDetails> Commands;
|
||||
@@ -41,7 +44,7 @@ void RESTAPI_commands::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
ArrayObj.add(Obj);
|
||||
}
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::COMMANDS, ArrayObj);
|
||||
RetObj.set(RESTAPI::Protocol::COMMANDS, ArrayObj);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
return;
|
||||
|
||||
|
||||
@@ -11,14 +11,15 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_commands : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_commands(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_commands(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/commands"};}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "RESTAPI_protocol.h"
|
||||
#include "StorageService.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_default_configuration::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
@@ -23,7 +23,7 @@ void RESTAPI_default_configuration::handleRequest(Poco::Net::HTTPServerRequest &
|
||||
if (!IsAuthorized(Request, Response))
|
||||
return;
|
||||
|
||||
std::string Name = GetBinding(uCentral::RESTAPI::Protocol::NAME, "");
|
||||
std::string Name = GetBinding(RESTAPI::Protocol::NAME, "");
|
||||
ParseParameters(Request);
|
||||
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
|
||||
@@ -11,15 +11,16 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_default_configuration : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_default_configuration(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_default_configuration(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{
|
||||
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configuration/{name}"};}
|
||||
|
||||
@@ -13,45 +13,49 @@
|
||||
#include "RESTAPI_protocol.h"
|
||||
#include "StorageService.h"
|
||||
|
||||
namespace uCentral {
|
||||
void RESTAPI_default_configurations::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
return;
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_default_configurations::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
return;
|
||||
|
||||
if (!IsAuthorized(Request, Response))
|
||||
return;
|
||||
if (!IsAuthorized(Request, Response))
|
||||
return;
|
||||
|
||||
try {
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
ParseParameters(Request);
|
||||
InitQueryBlock();
|
||||
try {
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
ParseParameters(Request);
|
||||
if(!InitQueryBlock()) {
|
||||
BadRequest(Request, Response, "Illegal parameter value.");
|
||||
return;
|
||||
}
|
||||
|
||||
Logger_.information(
|
||||
Poco::format("DEFAULT_CONFIGURATIONS: from %Lu, limit of %Lu, filter=%s.",
|
||||
(int64_t)QB_.Offset, (int64_t)QB_.Limit, QB_.Filter));
|
||||
RESTAPIHandler::PrintBindings();
|
||||
Logger_.information(
|
||||
Poco::format("DEFAULT_CONFIGURATIONS: from %Lu, limit of %Lu, filter=%s.",
|
||||
(int64_t)QB_.Offset, (int64_t)QB_.Limit, QB_.Filter));
|
||||
RESTAPIHandler::PrintBindings();
|
||||
|
||||
std::vector<GWObjects::DefaultConfiguration> DefConfigs;
|
||||
std::vector<GWObjects::DefaultConfiguration> DefConfigs;
|
||||
|
||||
Storage()->GetDefaultConfigurations(QB_.Offset, QB_.Limit, DefConfigs);
|
||||
Storage()->GetDefaultConfigurations(QB_.Offset, QB_.Limit, DefConfigs);
|
||||
|
||||
Poco::JSON::Array Objects;
|
||||
for (const auto &i : DefConfigs) {
|
||||
Poco::JSON::Object Obj;
|
||||
i.to_json(Obj);
|
||||
Objects.add(Obj);
|
||||
}
|
||||
Poco::JSON::Array Objects;
|
||||
for (const auto &i : DefConfigs) {
|
||||
Poco::JSON::Object Obj;
|
||||
i.to_json(Obj);
|
||||
Objects.add(Obj);
|
||||
}
|
||||
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::CONFIGURATIONS, Objects);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
} else
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.warning(
|
||||
Poco::format("%s: Failed with: %s", std::string(__func__), E.displayText()));
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(RESTAPI::Protocol::CONFIGURATIONS, Objects);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
} else
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.warning(
|
||||
Poco::format("%s: Failed with: %s", std::string(__func__), E.displayText()));
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,14 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_default_configurations : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_default_configurations(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_default_configurations(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}){};
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal){};
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/default_configurations"};}
|
||||
|
||||
32
src/RESTAPI_deviceDashboardHandler.cpp
Normal file
32
src/RESTAPI_deviceDashboardHandler.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
//
|
||||
// Created by stephane bourque on 2021-07-21.
|
||||
//
|
||||
|
||||
#include "RESTAPI_deviceDashboardHandler.h"
|
||||
#include "Daemon.h"
|
||||
#include "Dashboard.h"
|
||||
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_deviceDashboardHandler::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
return;
|
||||
|
||||
if (!IsAuthorized(Request, Response))
|
||||
return;
|
||||
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
DoGet(Request, Response);
|
||||
} else {
|
||||
BadRequest(Request, Response, "Unsupported method.");
|
||||
}
|
||||
}
|
||||
|
||||
void RESTAPI_deviceDashboardHandler::DoGet(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
|
||||
Daemon()->GetDashboard().Create();
|
||||
Poco::JSON::Object Answer;
|
||||
Daemon()->GetDashboard().Report().to_json(Answer);
|
||||
ReturnObject(Request, Answer, Response);
|
||||
}
|
||||
}
|
||||
26
src/RESTAPI_deviceDashboardHandler.h
Normal file
26
src/RESTAPI_deviceDashboardHandler.h
Normal file
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// Created by stephane bourque on 2021-07-21.
|
||||
//
|
||||
|
||||
#ifndef UCENTRALGW_RESTAPI_DEVICEDASHBOARDHANDLER_H
|
||||
#define UCENTRALGW_RESTAPI_DEVICEDASHBOARDHANDLER_H
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_deviceDashboardHandler : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_deviceDashboardHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{
|
||||
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}, Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/deviceDashboard"};}
|
||||
void DoGet(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // UCENTRALGW_RESTAPI_DEVICEDASHBOARDHANDLER_H
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "KafkaManager.h"
|
||||
#include "Kafka_topics.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
@@ -40,14 +40,14 @@ void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &
|
||||
if (!IsAuthorized(Request, Response))
|
||||
return;
|
||||
|
||||
std::string Command = GetBinding(uCentral::RESTAPI::Protocol::COMMAND, "");
|
||||
std::string Command = GetBinding(RESTAPI::Protocol::COMMAND, "");
|
||||
if (Command.empty()) {
|
||||
Logger_.error(Poco::format("Unrecognized command '%s'", Command));
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
SerialNumber_ = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
SerialNumber_ = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
if (SerialNumber_.empty()) {
|
||||
Logger_.error(Poco::format("Missing serial number for command '%s'", Command));
|
||||
BadRequest(Request, Response);
|
||||
@@ -55,66 +55,69 @@ void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &
|
||||
}
|
||||
|
||||
ParseParameters(Request);
|
||||
InitQueryBlock();
|
||||
if(!InitQueryBlock()) {
|
||||
BadRequest(Request, Response, "Illegal parameter value.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Command == uCentral::RESTAPI::Protocol::CAPABILITIES &&
|
||||
if (Command == RESTAPI::Protocol::CAPABILITIES &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
|
||||
GetCapabilities(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::CAPABILITIES &&
|
||||
} else if (Command == RESTAPI::Protocol::CAPABILITIES &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
|
||||
DeleteCapabilities(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::LOGS &&
|
||||
} else if (Command == RESTAPI::Protocol::LOGS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
|
||||
GetLogs(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::LOGS &&
|
||||
} else if (Command == RESTAPI::Protocol::LOGS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
|
||||
DeleteLogs(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::HEALTHCHECKS &&
|
||||
} else if (Command == RESTAPI::Protocol::HEALTHCHECKS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
|
||||
GetChecks(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::HEALTHCHECKS &&
|
||||
} else if (Command == RESTAPI::Protocol::HEALTHCHECKS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
|
||||
DeleteChecks(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::STATISTICS &&
|
||||
} else if (Command == RESTAPI::Protocol::STATISTICS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
|
||||
GetStatistics(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::STATISTICS &&
|
||||
} else if (Command == RESTAPI::Protocol::STATISTICS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_DELETE) {
|
||||
DeleteStatistics(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::STATUS &&
|
||||
} else if (Command == RESTAPI::Protocol::STATUS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
|
||||
GetStatus(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::PERFORM &&
|
||||
} else if (Command == RESTAPI::Protocol::PERFORM &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
ExecuteCommand(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::CONFIGURE &&
|
||||
} else if (Command == RESTAPI::Protocol::CONFIGURE &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
Configure(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::UPGRADE &&
|
||||
} else if (Command == RESTAPI::Protocol::UPGRADE &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
Upgrade(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::REBOOT &&
|
||||
} else if (Command == RESTAPI::Protocol::REBOOT &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
Reboot(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::FACTORY &&
|
||||
} else if (Command == RESTAPI::Protocol::FACTORY &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
Factory(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::LEDS &&
|
||||
} else if (Command == RESTAPI::Protocol::LEDS &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
LEDs(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::TRACE &&
|
||||
} else if (Command == RESTAPI::Protocol::TRACE &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
Trace(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::REQUEST &&
|
||||
} else if (Command == RESTAPI::Protocol::REQUEST &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
MakeRequest(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::WIFISCAN &&
|
||||
} else if (Command == RESTAPI::Protocol::WIFISCAN &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
WifiScan(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::EVENTQUEUE &&
|
||||
} else if (Command == RESTAPI::Protocol::EVENTQUEUE &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_POST) {
|
||||
EventQueue(Request, Response);
|
||||
} else if (Command == uCentral::RESTAPI::Protocol::RTTY &&
|
||||
} else if (Command == RESTAPI::Protocol::RTTY &&
|
||||
Request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET) {
|
||||
Rtty(Request, Response);
|
||||
} else {
|
||||
@@ -122,7 +125,7 @@ void RESTAPI_device_commandHandler::handleRequest(Poco::Net::HTTPServerRequest &
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -134,14 +137,14 @@ void RESTAPI_device_commandHandler::GetCapabilities(Poco::Net::HTTPServerRequest
|
||||
if (Storage()->GetDeviceCapabilities(SerialNumber_, Caps)) {
|
||||
Poco::JSON::Object RetObj;
|
||||
Caps.to_json(RetObj);
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
} else {
|
||||
NotFound(Request, Response);
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -155,7 +158,7 @@ void RESTAPI_device_commandHandler::DeleteCapabilities(Poco::Net::HTTPServerRequ
|
||||
NotFound(Request, Response);
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -168,7 +171,7 @@ void RESTAPI_device_commandHandler::GetStatistics(Poco::Net::HTTPServerRequest &
|
||||
Storage()->GetLifetimeStats(SerialNumber_, Stats);
|
||||
Poco::JSON::Parser P;
|
||||
if (Stats.empty())
|
||||
Stats = uCentral::uCentralProtocol::EMPTY_JSON_DOC;
|
||||
Stats = uCentralProtocol::EMPTY_JSON_DOC;
|
||||
auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>();
|
||||
ReturnObject(Request, *Obj, Response);
|
||||
} else if (QB_.LastOnly) {
|
||||
@@ -176,7 +179,7 @@ void RESTAPI_device_commandHandler::GetStatistics(Poco::Net::HTTPServerRequest &
|
||||
if (DeviceRegistry()->GetStatistics(SerialNumber_, Stats)) {
|
||||
Poco::JSON::Parser P;
|
||||
if (Stats.empty())
|
||||
Stats = uCentral::uCentralProtocol::EMPTY_JSON_DOC;
|
||||
Stats = uCentralProtocol::EMPTY_JSON_DOC;
|
||||
auto Obj = P.parse(Stats).extract<Poco::JSON::Object::Ptr>();
|
||||
ReturnObject(Request, *Obj, Response);
|
||||
} else {
|
||||
@@ -197,13 +200,13 @@ void RESTAPI_device_commandHandler::GetStatistics(Poco::Net::HTTPServerRequest &
|
||||
ArrayObj.add(Obj);
|
||||
}
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::DATA, ArrayObj);
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
RetObj.set(RESTAPI::Protocol::DATA, ArrayObj);
|
||||
RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -227,7 +230,7 @@ void RESTAPI_device_commandHandler::DeleteStatistics(Poco::Net::HTTPServerReques
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -246,7 +249,7 @@ void RESTAPI_device_commandHandler::GetStatus(Poco::Net::HTTPServerRequest &Requ
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -258,19 +261,19 @@ void RESTAPI_device_commandHandler::Configure(Poco::Net::HTTPServerRequest &Requ
|
||||
Poco::JSON::Parser Parser;
|
||||
auto Obj = Parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::UUID) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::CONFIGURATION)) {
|
||||
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(RESTAPI::Protocol::UUID) &&
|
||||
Obj->has(RESTAPI::Protocol::CONFIGURATION)) {
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
auto UUID = Obj->get(uCentral::RESTAPI::Protocol::UUID);
|
||||
auto Configuration = GetS(uCentral::RESTAPI::Protocol::CONFIGURATION, Obj,
|
||||
uCentral::uCentralProtocol::EMPTY_JSON_DOC);
|
||||
auto UUID = Obj->get(RESTAPI::Protocol::UUID);
|
||||
auto Configuration = GetS(RESTAPI::Protocol::CONFIGURATION, Obj,
|
||||
uCentralProtocol::EMPTY_JSON_DOC);
|
||||
auto When = GetWhen(Obj);
|
||||
|
||||
uint64_t NewUUID;
|
||||
@@ -283,17 +286,17 @@ void RESTAPI_device_commandHandler::Configure(Poco::Net::HTTPServerRequest &Requ
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = Daemon()->CreateUUID();
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::CONFIGURE;
|
||||
Cmd.Command = uCentralProtocol::CONFIGURE;
|
||||
Cmd.RunAt = When;
|
||||
|
||||
uCentral::Config::Config Cfg(Configuration);
|
||||
Config::Config Cfg(Configuration);
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
Poco::JSON::Object CfgObj;
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::UUID, NewUUID);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentral::uCentralProtocol::CONFIG, Cfg.to_json());
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::UUID, NewUUID);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::CONFIG, Cfg.to_json());
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -305,7 +308,7 @@ void RESTAPI_device_commandHandler::Configure(Poco::Net::HTTPServerRequest &Requ
|
||||
}
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -316,16 +319,16 @@ void RESTAPI_device_commandHandler::Upgrade(Poco::Net::HTTPServerRequest &Reques
|
||||
Poco::JSON::Parser parser;
|
||||
auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::URI) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
if (Obj->has(RESTAPI::Protocol::URI) &&
|
||||
Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
auto URI = GetS(uCentral::RESTAPI::Protocol::URI, Obj);
|
||||
auto URI = GetS(RESTAPI::Protocol::URI, Obj);
|
||||
auto When = GetWhen(Obj);
|
||||
|
||||
GWObjects::CommandDetails Cmd;
|
||||
@@ -333,14 +336,14 @@ void RESTAPI_device_commandHandler::Upgrade(Poco::Net::HTTPServerRequest &Reques
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = Daemon()->CreateUUID();
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::UPGRADE;
|
||||
Cmd.Command = uCentralProtocol::UPGRADE;
|
||||
Cmd.RunAt = When;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::URI, URI);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::URI, URI);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -350,7 +353,7 @@ void RESTAPI_device_commandHandler::Upgrade(Poco::Net::HTTPServerRequest &Reques
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -374,13 +377,13 @@ void RESTAPI_device_commandHandler::GetLogs(Poco::Net::HTTPServerRequest &Reques
|
||||
ArrayObj.add(Obj);
|
||||
}
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::VALUES, ArrayObj);
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
RetObj.set(RESTAPI::Protocol::VALUES, ArrayObj);
|
||||
RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -394,7 +397,7 @@ void RESTAPI_device_commandHandler::DeleteLogs(Poco::Net::HTTPServerRequest &Req
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -405,13 +408,11 @@ void RESTAPI_device_commandHandler::GetChecks(Poco::Net::HTTPServerRequest &Requ
|
||||
std::vector<GWObjects::HealthCheck> Checks;
|
||||
|
||||
if (QB_.LastOnly) {
|
||||
std::string Healthcheck;
|
||||
if (DeviceRegistry()->GetHealthcheck(SerialNumber_, Healthcheck)) {
|
||||
Poco::JSON::Parser P;
|
||||
if (Healthcheck.empty())
|
||||
Healthcheck = uCentral::uCentralProtocol::EMPTY_JSON_DOC;
|
||||
auto Obj = P.parse(Healthcheck).extract<Poco::JSON::Object::Ptr>();
|
||||
ReturnObject(Request, *Obj, Response);
|
||||
GWObjects::HealthCheck HC;
|
||||
if (DeviceRegistry()->GetHealthcheck(SerialNumber_, HC)) {
|
||||
Poco::JSON::Object Answer;
|
||||
HC.to_json(Answer);
|
||||
ReturnObject(Request, Answer, Response);
|
||||
} else {
|
||||
NotFound(Request, Response);
|
||||
}
|
||||
@@ -431,13 +432,13 @@ void RESTAPI_device_commandHandler::GetChecks(Poco::Net::HTTPServerRequest &Requ
|
||||
}
|
||||
|
||||
Poco::JSON::Object RetObj;
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::VALUES, ArrayObj);
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
RetObj.set(RESTAPI::Protocol::VALUES, ArrayObj);
|
||||
RetObj.set(RESTAPI::Protocol::SERIALNUMBER, SerialNumber_);
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -450,7 +451,7 @@ void RESTAPI_device_commandHandler::DeleteChecks(Poco::Net::HTTPServerRequest &R
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -462,18 +463,18 @@ void RESTAPI_device_commandHandler::ExecuteCommand(Poco::Net::HTTPServerRequest
|
||||
Poco::JSON::Parser parser;
|
||||
auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::COMMAND) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::PAYLOAD)) {
|
||||
if (Obj->has(RESTAPI::Protocol::COMMAND) &&
|
||||
Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(RESTAPI::Protocol::PAYLOAD)) {
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
auto Command = GetS(uCentral::RESTAPI::Protocol::COMMAND, Obj);
|
||||
auto Payload = GetS(uCentral::RESTAPI::Protocol::PAYLOAD, Obj);
|
||||
auto Command = GetS(RESTAPI::Protocol::COMMAND, Obj);
|
||||
auto Payload = GetS(RESTAPI::Protocol::PAYLOAD, Obj);
|
||||
auto When = GetWhen(Obj);
|
||||
|
||||
GWObjects::CommandDetails Cmd;
|
||||
@@ -492,10 +493,10 @@ void RESTAPI_device_commandHandler::ExecuteCommand(Poco::Net::HTTPServerRequest
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::COMMAND, Command);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentral::uCentralProtocol::PAYLOAD, PayloadObject);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::COMMAND, Command);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::PAYLOAD, PayloadObject);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -505,7 +506,7 @@ void RESTAPI_device_commandHandler::ExecuteCommand(Poco::Net::HTTPServerRequest
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -517,8 +518,8 @@ void RESTAPI_device_commandHandler::Reboot(Poco::Net::HTTPServerRequest &Request
|
||||
Poco::JSON::Parser IncomingParser;
|
||||
auto Obj = IncomingParser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
@@ -529,13 +530,13 @@ void RESTAPI_device_commandHandler::Reboot(Poco::Net::HTTPServerRequest &Request
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = Daemon()->CreateUUID();
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::REBOOT;
|
||||
Cmd.Command = uCentralProtocol::REBOOT;
|
||||
Cmd.RunAt = When;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -545,7 +546,7 @@ void RESTAPI_device_commandHandler::Reboot(Poco::Net::HTTPServerRequest &Request
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -558,17 +559,17 @@ void RESTAPI_device_commandHandler::Factory(Poco::Net::HTTPServerRequest &Reques
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::KEEPREDIRECTOR) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
if (Obj->has(RESTAPI::Protocol::KEEPREDIRECTOR) &&
|
||||
Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
auto KeepRedirector = GetB(uCentral::RESTAPI::Protocol::KEEPREDIRECTOR, Obj, true);
|
||||
auto KeepRedirector = GetB(RESTAPI::Protocol::KEEPREDIRECTOR, Obj, true);
|
||||
uint64_t When = GetWhen(Obj);
|
||||
|
||||
GWObjects::CommandDetails Cmd;
|
||||
@@ -576,14 +577,14 @@ void RESTAPI_device_commandHandler::Factory(Poco::Net::HTTPServerRequest &Reques
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = Daemon()->CreateUUID();
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::FACTORY;
|
||||
Cmd.Command = uCentralProtocol::FACTORY;
|
||||
Cmd.RunAt = When;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::KEEP_REDIRECTOR, KeepRedirector ? 1 : 0);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::KEEP_REDIRECTOR, KeepRedirector ? 1 : 0);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -593,7 +594,7 @@ void RESTAPI_device_commandHandler::Factory(Poco::Net::HTTPServerRequest &Reques
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -605,26 +606,26 @@ void RESTAPI_device_commandHandler::LEDs(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::uCentralProtocol::PATTERN) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
if (Obj->has(uCentralProtocol::PATTERN) &&
|
||||
Obj->has(RESTAPI::Protocol::SERIALNUMBER)) {
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
auto Pattern =
|
||||
GetS(uCentral::uCentralProtocol::PATTERN, Obj, uCentral::uCentralProtocol::BLINK);
|
||||
if (Pattern != uCentral::uCentralProtocol::ON &&
|
||||
Pattern != uCentral::uCentralProtocol::OFF &&
|
||||
Pattern != uCentral::uCentralProtocol::BLINK) {
|
||||
GetS(uCentralProtocol::PATTERN, Obj, uCentralProtocol::BLINK);
|
||||
if (Pattern != uCentralProtocol::ON &&
|
||||
Pattern != uCentralProtocol::OFF &&
|
||||
Pattern != uCentralProtocol::BLINK) {
|
||||
Logger_.warning(Poco::format("LEDs(%s): Bad pattern", SerialNumber_));
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
auto Duration = Get(uCentral::uCentralProtocol::DURATION, Obj, 30);
|
||||
auto Duration = Get(uCentralProtocol::DURATION, Obj, 30);
|
||||
auto When = GetWhen(Obj);
|
||||
Logger_.information(Poco::format("LEDS(%s): Pattern:%s Duration: %Lu", SerialNumber_,
|
||||
Pattern, Duration));
|
||||
@@ -634,14 +635,14 @@ void RESTAPI_device_commandHandler::LEDs(Poco::Net::HTTPServerRequest &Request,
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = Daemon()->CreateUUID();
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::LEDS;
|
||||
Cmd.Command = uCentralProtocol::LEDS;
|
||||
Cmd.RunAt = When;
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::DURATION, Duration);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentral::uCentralProtocol::PATTERN, Pattern);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::DURATION, Duration);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::PATTERN, Pattern);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -651,7 +652,7 @@ void RESTAPI_device_commandHandler::LEDs(Poco::Net::HTTPServerRequest &Request,
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -663,22 +664,22 @@ void RESTAPI_device_commandHandler::Trace(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
(Obj->has(uCentral::RESTAPI::Protocol::NETWORK) ||
|
||||
Obj->has(uCentral::RESTAPI::Protocol::INTERFACE))) {
|
||||
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
(Obj->has(RESTAPI::Protocol::NETWORK) ||
|
||||
Obj->has(RESTAPI::Protocol::INTERFACE))) {
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
BadRequest(Request, Response, "Missing serial number.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto Duration = Get(uCentral::RESTAPI::Protocol::DURATION, Obj);
|
||||
auto Duration = Get(RESTAPI::Protocol::DURATION, Obj, 30);
|
||||
auto When = GetWhen(Obj);
|
||||
auto NumberOfPackets = Get(uCentral::RESTAPI::Protocol::NUMBEROFPACKETS, Obj);
|
||||
auto NumberOfPackets = Get(RESTAPI::Protocol::NUMBEROFPACKETS, Obj, 100);
|
||||
|
||||
auto Network = GetS(uCentral::RESTAPI::Protocol::NETWORK, Obj);
|
||||
auto Interface = GetS(uCentral::RESTAPI::Protocol::INTERFACE, Obj);
|
||||
auto Network = GetS(RESTAPI::Protocol::NETWORK, Obj);
|
||||
auto Interface = GetS(RESTAPI::Protocol::INTERFACE, Obj);
|
||||
auto UUID = Daemon()->CreateUUID();
|
||||
auto URI = FileUploader()->FullName() + UUID;
|
||||
|
||||
@@ -686,31 +687,33 @@ void RESTAPI_device_commandHandler::Trace(Poco::Net::HTTPServerRequest &Request,
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = UUID;
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::TRACE;
|
||||
Cmd.Command = uCentralProtocol::TRACE;
|
||||
Cmd.RunAt = When;
|
||||
Cmd.WaitingForFile = 1;
|
||||
Cmd.AttachType = uCentral::RESTAPI::Protocol::PCAP_FILE_TYPE;
|
||||
Cmd.AttachType = RESTAPI::Protocol::PCAP_FILE_TYPE;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::DURATION, Duration);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentral::uCentralProtocol::PACKETS, NumberOfPackets);
|
||||
Params.set(uCentral::uCentralProtocol::NETWORK, Network);
|
||||
Params.set(uCentral::uCentralProtocol::INTERFACE, Interface);
|
||||
Params.set(uCentral::uCentralProtocol::URI, URI);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::DURATION, Duration);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::PACKETS, NumberOfPackets);
|
||||
Params.set(uCentralProtocol::NETWORK, Network);
|
||||
Params.set(uCentralProtocol::INTERFACE, Interface);
|
||||
Params.set(uCentralProtocol::URI, URI);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
Cmd.Details = ParamStream.str();
|
||||
|
||||
FileUploader()->AddUUID(UUID);
|
||||
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(3000), nullptr, this);
|
||||
return;
|
||||
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(5000), nullptr, this);
|
||||
} else {
|
||||
BadRequest(Request, Response, "Missing SerialNumber, Network, or Interface.");
|
||||
}
|
||||
return;
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -723,62 +726,64 @@ void RESTAPI_device_commandHandler::WifiScan(Poco::Net::HTTPServerRequest &Reque
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
if (SerialNumber_ != SNum) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((Obj->has(uCentral::RESTAPI::Protocol::BANDS) &&
|
||||
Obj->isArray(uCentral::RESTAPI::Protocol::BANDS) ||
|
||||
(Obj->has(uCentral::RESTAPI::Protocol::CHANNELS) &&
|
||||
Obj->isArray(uCentral::RESTAPI::Protocol::CHANNELS)) ||
|
||||
(!Obj->has(uCentral::RESTAPI::Protocol::BANDS) &&
|
||||
!Obj->has(uCentral::RESTAPI::Protocol::CHANNELS)))) {
|
||||
bool Verbose = GetB(uCentral::RESTAPI::Protocol::VERBOSE, Obj);
|
||||
if ((Obj->has(RESTAPI::Protocol::BANDS) &&
|
||||
Obj->isArray(RESTAPI::Protocol::BANDS) ||
|
||||
(Obj->has(RESTAPI::Protocol::CHANNELS) &&
|
||||
Obj->isArray(RESTAPI::Protocol::CHANNELS)) ||
|
||||
(!Obj->has(RESTAPI::Protocol::BANDS) &&
|
||||
!Obj->has(RESTAPI::Protocol::CHANNELS)))) {
|
||||
bool Verbose = GetB(RESTAPI::Protocol::VERBOSE, Obj);
|
||||
auto UUID = Daemon()->CreateUUID();
|
||||
GWObjects::CommandDetails Cmd;
|
||||
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = UUID;
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::WIFISCAN;
|
||||
Cmd.Command = uCentralProtocol::WIFISCAN;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::VERBOSE, Verbose);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::VERBOSE, Verbose);
|
||||
|
||||
if (Obj->has(uCentral::uCentralProtocol::BANDS)) {
|
||||
Params.set(uCentral::uCentralProtocol::BANDS,
|
||||
Obj->get(uCentral::RESTAPI::Protocol::BANDS));
|
||||
} else if (Obj->has(uCentral::uCentralProtocol::CHANNELS)) {
|
||||
Params.set(uCentral::uCentralProtocol::CHANNELS,
|
||||
Obj->get(uCentral::RESTAPI::Protocol::CHANNELS));
|
||||
if (Obj->has(uCentralProtocol::BANDS)) {
|
||||
Params.set(uCentralProtocol::BANDS,
|
||||
Obj->get(RESTAPI::Protocol::BANDS));
|
||||
} else if (Obj->has(uCentralProtocol::CHANNELS)) {
|
||||
Params.set(uCentralProtocol::CHANNELS,
|
||||
Obj->get(RESTAPI::Protocol::CHANNELS));
|
||||
}
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::ACTIVESCAN)) {
|
||||
if (Obj->has(RESTAPI::Protocol::ACTIVESCAN)) {
|
||||
Params.set(
|
||||
uCentral::uCentralProtocol::ACTIVE,
|
||||
(int)(Obj->get(uCentral::RESTAPI::Protocol::ACTIVESCAN).toString() == "true")
|
||||
uCentralProtocol::ACTIVE,
|
||||
(int)(Obj->get(RESTAPI::Protocol::ACTIVESCAN).toString() == "true")
|
||||
? 1
|
||||
: 0);
|
||||
} else {
|
||||
Params.set(uCentral::uCentralProtocol::ACTIVE, 0);
|
||||
Params.set(uCentralProtocol::ACTIVE, 0);
|
||||
}
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
Cmd.Details = ParamStream.str();
|
||||
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(20000), nullptr, this);
|
||||
KafkaManager()->PostMessage(uCentral::KafkaTopics::WIFISCAN, SerialNumber_,
|
||||
Cmd.Results);
|
||||
if(Cmd.ErrorCode==0) {
|
||||
KafkaManager()->PostMessage(KafkaTopics::WIFISCAN, SerialNumber_,
|
||||
Cmd.Results);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -791,11 +796,11 @@ void RESTAPI_device_commandHandler::EventQueue(Poco::Net::HTTPServerRequest &Req
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(uCentral::RESTAPI::Protocol::TYPES) &&
|
||||
Obj->isArray(uCentral::RESTAPI::Protocol::TYPES)) {
|
||||
auto SNum = Obj->get(uCentral::RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto Types = Obj->getArray(uCentral::RESTAPI::Protocol::TYPES);
|
||||
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->isArray(RESTAPI::Protocol::TYPES)) {
|
||||
|
||||
auto SNum = Obj->get(RESTAPI::Protocol::SERIALNUMBER).toString();
|
||||
auto Types = Obj->getArray(RESTAPI::Protocol::TYPES);
|
||||
|
||||
if (SerialNumber_ == SNum) {
|
||||
auto UUID = Daemon()->CreateUUID();
|
||||
@@ -804,23 +809,26 @@ void RESTAPI_device_commandHandler::EventQueue(Poco::Net::HTTPServerRequest &Req
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.UUID = UUID;
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.Command = uCentral::uCentralProtocol::EVENT;
|
||||
Cmd.Command = uCentralProtocol::EVENT;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::TYPES, Types);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::TYPES, Types);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
Cmd.Details = ParamStream.str();
|
||||
|
||||
RESTAPI_RPC::WaitForCommand(Cmd, Params, Request, Response, std::chrono::milliseconds(20000), nullptr, this);
|
||||
if(Cmd.ErrorCode==0) {
|
||||
KafkaManager()->PostMessage(KafkaTopics::DEVICE_EVENT_QUEUE, SerialNumber_,
|
||||
Cmd.Results);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -833,15 +841,15 @@ void RESTAPI_device_commandHandler::MakeRequest(Poco::Net::HTTPServerRequest &Re
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>();
|
||||
|
||||
if (Obj->has(uCentral::RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(uCentral::uCentralProtocol::MESSAGE)) {
|
||||
if (Obj->has(RESTAPI::Protocol::SERIALNUMBER) &&
|
||||
Obj->has(uCentralProtocol::MESSAGE)) {
|
||||
|
||||
auto SNum = GetS(uCentral::RESTAPI::Protocol::SERIALNUMBER, Obj);
|
||||
auto MessageType = GetS(uCentral::uCentralProtocol::MESSAGE, Obj);
|
||||
auto SNum = GetS(RESTAPI::Protocol::SERIALNUMBER, Obj);
|
||||
auto MessageType = GetS(uCentralProtocol::MESSAGE, Obj);
|
||||
|
||||
if ((SerialNumber_ != SNum) ||
|
||||
(MessageType != uCentral::uCentralProtocol::STATE &&
|
||||
MessageType != uCentral::uCentralProtocol::HEALTHCHECK)) {
|
||||
(MessageType != uCentralProtocol::STATE &&
|
||||
MessageType != uCentralProtocol::HEALTHCHECK)) {
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
}
|
||||
@@ -852,15 +860,15 @@ void RESTAPI_device_commandHandler::MakeRequest(Poco::Net::HTTPServerRequest &Re
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.UUID = Daemon()->CreateUUID();
|
||||
Cmd.Command = uCentral::uCentralProtocol::REQUEST;
|
||||
Cmd.Command = uCentralProtocol::REQUEST;
|
||||
Cmd.RunAt = When;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentral::uCentralProtocol::MESSAGE, MessageType);
|
||||
Params.set(uCentral::uCentralProtocol::REQUEST_UUID, Cmd.UUID);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::WHEN, When);
|
||||
Params.set(uCentralProtocol::MESSAGE, MessageType);
|
||||
Params.set(uCentralProtocol::REQUEST_UUID, Cmd.UUID);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -870,7 +878,7 @@ void RESTAPI_device_commandHandler::MakeRequest(Poco::Net::HTTPServerRequest &Re
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
@@ -881,7 +889,7 @@ void RESTAPI_device_commandHandler::Rtty(Poco::Net::HTTPServerRequest &Request,
|
||||
if (Daemon()->ConfigGetString("rtty.enabled", "false") == "true") {
|
||||
GWObjects::Device Device;
|
||||
if (Storage()->GetDevice(SerialNumber_, Device)) {
|
||||
auto CommandUUID = uCentral::Daemon::instance()->CreateUUID();
|
||||
auto CommandUUID = Daemon::instance()->CreateUUID();
|
||||
|
||||
GWObjects::RttySessionDetails Rtty{
|
||||
.SerialNumber = SerialNumber_,
|
||||
@@ -904,19 +912,19 @@ void RESTAPI_device_commandHandler::Rtty(Poco::Net::HTTPServerRequest &Request,
|
||||
Cmd.SerialNumber = SerialNumber_;
|
||||
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
|
||||
Cmd.UUID = CommandUUID;
|
||||
Cmd.Command = uCentral::uCentralProtocol::RTTY;
|
||||
Cmd.Command = uCentralProtocol::RTTY;
|
||||
|
||||
Poco::JSON::Object Params;
|
||||
|
||||
Params.set(uCentral::uCentralProtocol::METHOD, uCentral::uCentralProtocol::RTTY);
|
||||
Params.set(uCentral::uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentral::uCentralProtocol::ID, Rtty.ConnectionId);
|
||||
Params.set(uCentral::uCentralProtocol::TOKEN, Rtty.Token);
|
||||
Params.set(uCentral::uCentralProtocol::SERVER, Rtty.Server);
|
||||
Params.set(uCentral::uCentralProtocol::PORT, Rtty.Port);
|
||||
Params.set(uCentral::uCentralProtocol::USER, UserInfo_.webtoken.username_);
|
||||
Params.set(uCentral::uCentralProtocol::TIMEOUT, Rtty.TimeOut);
|
||||
Params.set(uCentral::uCentralProtocol::PASSWORD, Device.DevicePassword);
|
||||
Params.set(uCentralProtocol::METHOD, uCentralProtocol::RTTY);
|
||||
Params.set(uCentralProtocol::SERIAL, SerialNumber_);
|
||||
Params.set(uCentralProtocol::ID, Rtty.ConnectionId);
|
||||
Params.set(uCentralProtocol::TOKEN, Rtty.Token);
|
||||
Params.set(uCentralProtocol::SERVER, Rtty.Server);
|
||||
Params.set(uCentralProtocol::PORT, Rtty.Port);
|
||||
Params.set(uCentralProtocol::USER, UserInfo_.webtoken.username_);
|
||||
Params.set(uCentralProtocol::TIMEOUT, Rtty.TimeOut);
|
||||
Params.set(uCentralProtocol::PASSWORD, Device.DevicePassword);
|
||||
|
||||
std::stringstream ParamStream;
|
||||
Params.stringify(ParamStream);
|
||||
@@ -932,7 +940,7 @@ void RESTAPI_device_commandHandler::Rtty(Poco::Net::HTTPServerRequest &Request,
|
||||
return;
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.error(Poco::format("%s: failed with %s", std::string(__func__), E.displayText()));
|
||||
Logger_.log(E);
|
||||
}
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
|
||||
@@ -11,15 +11,16 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_device_commandHandler : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_device_commandHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_device_commandHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{
|
||||
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) override;
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "StorageService.h"
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
@@ -23,7 +23,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
|
||||
|
||||
ParseParameters(Request);
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
GWObjects::Device Device;
|
||||
|
||||
if (Storage()->GetDevice(SerialNumber, Device)) {
|
||||
@@ -34,7 +34,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
|
||||
NotFound(Request, Response);
|
||||
}
|
||||
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
|
||||
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
|
||||
if (Storage()->DeleteDevice(SerialNumber)) {
|
||||
OK(Request, Response);
|
||||
@@ -42,7 +42,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
|
||||
NotFound(Request, Response);
|
||||
}
|
||||
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST) {
|
||||
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
|
||||
Poco::JSON::Parser IncomingParser;
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
@@ -57,7 +57,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
|
||||
for(auto &i:Device.Notes)
|
||||
i.createdBy = UserInfo_.userinfo.email;
|
||||
|
||||
if (!uCentral::Utils::ValidSerialNumber(Device.SerialNumber)) {
|
||||
if (!Utils::ValidSerialNumber(Device.SerialNumber)) {
|
||||
Logger_.warning(Poco::format("CREATE-DEVICE(%s): Illegal name.", Device.SerialNumber));
|
||||
BadRequest(Request, Response);
|
||||
return;
|
||||
@@ -74,7 +74,7 @@ void RESTAPI_device_handler::handleRequest(Poco::Net::HTTPServerRequest &Request
|
||||
BadRequest(Request, Response);
|
||||
}
|
||||
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_PUT) {
|
||||
std::string SerialNumber = GetBinding(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
std::string SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
|
||||
Poco::JSON::Parser IncomingParser;
|
||||
Poco::JSON::Object::Ptr Obj =
|
||||
|
||||
@@ -10,19 +10,19 @@
|
||||
#define UCENTRAL_RESTAPI_DEVICEHANDLER_H
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
#include "Poco/Net/HTTPServerRequest.h"
|
||||
#include "Poco/Net/HTTPServerResponse.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_device_handler : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_device_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_device_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{
|
||||
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_PUT, Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/device/{serialNumber}"}; };
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
#include "Utils.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_devices_handler::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
|
||||
@@ -29,11 +29,14 @@ namespace uCentral {
|
||||
try {
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
ParseParameters(Request);
|
||||
InitQueryBlock();
|
||||
auto serialOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::SERIALONLY, false);
|
||||
auto countOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::COUNTONLY, false);
|
||||
if(!InitQueryBlock()) {
|
||||
BadRequest(Request, Response, "Illegal parameter value.");
|
||||
return;
|
||||
}
|
||||
auto serialOnly = GetBoolParameter(RESTAPI::Protocol::SERIALONLY, false);
|
||||
auto countOnly = GetBoolParameter(RESTAPI::Protocol::COUNTONLY, false);
|
||||
auto deviceWithStatus =
|
||||
GetBoolParameter(uCentral::RESTAPI::Protocol::DEVICEWITHSTATUS, false);
|
||||
GetBoolParameter(RESTAPI::Protocol::DEVICEWITHSTATUS, false);
|
||||
|
||||
Logger_.debug(Poco::format("DEVICES: from %Lu, limit of %Lu, filter='%s'.",
|
||||
(uint64_t)QB_.Offset, (uint64_t)QB_.Limit, QB_.Filter));
|
||||
@@ -45,7 +48,7 @@ namespace uCentral {
|
||||
if (!QB_.Select.empty()) {
|
||||
|
||||
Poco::JSON::Array Objects;
|
||||
std::vector<std::string> Numbers = uCentral::Utils::Split(QB_.Select);
|
||||
std::vector<std::string> Numbers = Utils::Split(QB_.Select);
|
||||
for (auto &i : Numbers) {
|
||||
GWObjects::Device D;
|
||||
if (Storage()->GetDevice(i, D)) {
|
||||
@@ -62,14 +65,14 @@ namespace uCentral {
|
||||
}
|
||||
|
||||
if (deviceWithStatus)
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::DEVICESWITHSTATUS, Objects);
|
||||
RetObj.set(RESTAPI::Protocol::DEVICESWITHSTATUS, Objects);
|
||||
else
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::DEVICES, Objects);
|
||||
RetObj.set(RESTAPI::Protocol::DEVICES, Objects);
|
||||
|
||||
} else if (countOnly == true) {
|
||||
uint64_t Count = 0;
|
||||
if (Storage()->GetDeviceCount(Count)) {
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::COUNT, Count);
|
||||
RetObj.set(RESTAPI::Protocol::COUNT, Count);
|
||||
}
|
||||
} else if (serialOnly) {
|
||||
std::vector<std::string> SerialNumbers;
|
||||
@@ -78,7 +81,7 @@ namespace uCentral {
|
||||
for (const auto &i : SerialNumbers) {
|
||||
Objects.add(i);
|
||||
}
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::SERIALNUMBERS, Objects);
|
||||
RetObj.set(RESTAPI::Protocol::SERIALNUMBERS, Objects);
|
||||
} else {
|
||||
std::vector<GWObjects::Device> Devices;
|
||||
Storage()->GetDevices(QB_.Offset, QB_.Limit, Devices);
|
||||
@@ -92,9 +95,9 @@ namespace uCentral {
|
||||
Objects.add(Obj);
|
||||
}
|
||||
if (deviceWithStatus)
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::DEVICESWITHSTATUS, Objects);
|
||||
RetObj.set(RESTAPI::Protocol::DEVICESWITHSTATUS, Objects);
|
||||
else
|
||||
RetObj.set(uCentral::RESTAPI::Protocol::DEVICES, Objects);
|
||||
RetObj.set(RESTAPI::Protocol::DEVICES, Objects);
|
||||
}
|
||||
ReturnObject(Request, RetObj, Response);
|
||||
return;
|
||||
|
||||
@@ -11,13 +11,14 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_devices_handler : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_devices_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_devices_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}){};
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal){};
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/devices"}; };
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <fstream>
|
||||
#include "RESTAPI_protocol.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
void RESTAPI_file::handleRequest(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
@@ -28,8 +28,8 @@ namespace uCentral {
|
||||
ParseParameters(Request);
|
||||
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
auto UUID = GetBinding(uCentral::RESTAPI::Protocol::FILEUUID, "");
|
||||
auto SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
auto UUID = GetBinding(RESTAPI::Protocol::FILEUUID, "");
|
||||
auto SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
|
||||
// does the file exist
|
||||
Poco::File DownloadFile(FileUploader()->Path() + "/" + UUID);
|
||||
@@ -45,7 +45,7 @@ namespace uCentral {
|
||||
return;
|
||||
|
||||
} else if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
|
||||
auto UUID = GetBinding(uCentral::RESTAPI::Protocol::FILEUUID, "");
|
||||
auto UUID = GetBinding(RESTAPI::Protocol::FILEUUID, "");
|
||||
|
||||
if (UUID.empty()) {
|
||||
BadRequest(Request, Response);
|
||||
|
||||
@@ -11,14 +11,15 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_file : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_file(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_file(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
|
||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||
Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/file/{uuid}"};}
|
||||
|
||||
@@ -25,17 +25,18 @@
|
||||
#include "RESTAPI_handler.h"
|
||||
#include "RESTAPI_protocol.h"
|
||||
#include "Utils.h"
|
||||
#include "Daemon.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
bool RESTAPIHandler::ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &bindings) {
|
||||
std::string Param, Value;
|
||||
|
||||
bindings.clear();
|
||||
std::vector<std::string> PathItems = uCentral::Utils::Split(Request, '/');
|
||||
std::vector<std::string> PathItems = Utils::Split(Request, '/');
|
||||
|
||||
for(const auto &EndPoint:EndPoints) {
|
||||
std::vector<std::string> ParamItems = uCentral::Utils::Split(EndPoint, '/');
|
||||
std::vector<std::string> ParamItems = Utils::Split(EndPoint, '/');
|
||||
if (PathItems.size() != ParamItems.size())
|
||||
continue;
|
||||
|
||||
@@ -63,9 +64,9 @@ namespace uCentral {
|
||||
}
|
||||
|
||||
void RESTAPIHandler::ParseParameters(Poco::Net::HTTPServerRequest &request) {
|
||||
|
||||
Poco::URI uri(request.getURI());
|
||||
Parameters_ = uri.getQueryParameters();
|
||||
InitQueryBlock();
|
||||
}
|
||||
|
||||
static bool is_number(const std::string &s) {
|
||||
@@ -110,6 +111,26 @@ namespace uCentral {
|
||||
return Default;
|
||||
}
|
||||
|
||||
bool RESTAPIHandler::HasParameter(const std::string &Name, std::string &Value) {
|
||||
for (const auto &i : Parameters_) {
|
||||
if (i.first == Name) {
|
||||
Value = i.second;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RESTAPIHandler::HasParameter(const std::string &Name, uint64_t & Value) {
|
||||
for (const auto &i : Parameters_) {
|
||||
if (i.first == Name) {
|
||||
Value = std::stoi(i.second);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::string &RESTAPIHandler::GetBinding(const std::string &Name, const std::string &Default) {
|
||||
auto E = Bindings_.find(Poco::toLower(Name));
|
||||
if (E == Bindings_.end())
|
||||
@@ -246,18 +267,33 @@ namespace uCentral {
|
||||
}
|
||||
|
||||
void RESTAPIHandler::SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
|
||||
Response.set("Content-Type",Utils::FindMediaType(File));
|
||||
Poco::Path P(File.path());
|
||||
Response.set("Content-Disposition", "attachment; filename=" + P.getBaseName() );
|
||||
Response.set("Content-Transfer-Encoding","binary");
|
||||
auto MT = Utils::FindMediaType(File);
|
||||
if(MT.Encoding==Utils::BINARY) {
|
||||
Response.set("Content-Transfer-Encoding","binary");
|
||||
Response.set("Accept-Ranges", "bytes");
|
||||
}
|
||||
Response.set("Cache-Control", "private");
|
||||
Response.set("Pragma", "private");
|
||||
Response.set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT");
|
||||
AddCORS(Request, Response);
|
||||
Response.sendFile(File.path(),MT.ContentType);
|
||||
}
|
||||
|
||||
void RESTAPIHandler::SendFile(Poco::TemporaryFile &TempAvatar, const std::string &Type, const std::string & Name, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
|
||||
auto MT = Utils::FindMediaType(Name);
|
||||
if(MT.Encoding==Utils::BINARY) {
|
||||
Response.set("Content-Transfer-Encoding","binary");
|
||||
Response.set("Accept-Ranges", "bytes");
|
||||
}
|
||||
Response.set("Content-Disposition", "attachment; filename=" + Name );
|
||||
Response.set("Accept-Ranges", "bytes");
|
||||
Response.set("Cache-Control", "private");
|
||||
Response.set("Pragma", "private");
|
||||
Response.set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT");
|
||||
Response.set("Content-Length", std::to_string(File.getSize()));
|
||||
AddCORS(Request, Response);
|
||||
Response.sendFile(File.path(),Utils::FindMediaType(File));
|
||||
}
|
||||
Response.sendFile(TempAvatar.path(),MT.ContentType);
|
||||
}
|
||||
|
||||
void RESTAPIHandler::SendHTMLFileBack(Poco::File & File,
|
||||
Poco::Net::HTTPServerRequest &Request,
|
||||
@@ -291,10 +327,6 @@ namespace uCentral {
|
||||
bool RESTAPIHandler::ContinueProcessing(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_OPTIONS) {
|
||||
/* std::cout << "REQUEST:" << std::endl;
|
||||
for(const auto &[f,s]:Request)
|
||||
std::cout << "First: " << f << " second:" << s << std::endl;
|
||||
*/
|
||||
ProcessOptions(Request, Response);
|
||||
return false;
|
||||
} else if (std::find(Methods_.begin(), Methods_.end(), Request.getMethod()) == Methods_.end()) {
|
||||
@@ -307,45 +339,34 @@ namespace uCentral {
|
||||
|
||||
bool RESTAPIHandler::IsAuthorized(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
if(SessionToken_.empty()) {
|
||||
try {
|
||||
Poco::Net::OAuth20Credentials Auth(Request);
|
||||
if(Internal_) {
|
||||
return Daemon()->IsValidAPIKEY(Request);
|
||||
} else {
|
||||
if (SessionToken_.empty()) {
|
||||
try {
|
||||
Poco::Net::OAuth20Credentials Auth(Request);
|
||||
|
||||
if (Auth.getScheme() == "Bearer") {
|
||||
SessionToken_ = Auth.getBearerToken();
|
||||
}
|
||||
} catch(const Poco::Exception &E) {
|
||||
Logger_.log(E);
|
||||
}
|
||||
}
|
||||
#ifdef TIP_SECURITY_SERVICE
|
||||
if (AuthService()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
|
||||
if (Auth.getScheme() == "Bearer") {
|
||||
SessionToken_ = Auth.getBearerToken();
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
Logger_.log(E);
|
||||
}
|
||||
}
|
||||
#ifdef TIP_SECURITY_SERVICE
|
||||
if (AuthService()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
|
||||
#else
|
||||
if (AuthClient()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
|
||||
if (AuthClient()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
|
||||
#endif
|
||||
return true;
|
||||
} else {
|
||||
UnAuthorized(Request, Response);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RESTAPIHandler::IsAuthorized(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response, std::string &UserName) {
|
||||
|
||||
#ifdef TIP_SECURITY_SERVICE
|
||||
if (AuthService()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
|
||||
#else
|
||||
if (AuthClient()->IsAuthorized(Request, SessionToken_, UserInfo_)) {
|
||||
#endif
|
||||
UserName = UserInfo_.webtoken.username_;
|
||||
return true;
|
||||
} else {
|
||||
UnAuthorized(Request, Response);
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
} else {
|
||||
UnAuthorized(Request, Response);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
bool RESTAPIHandler::ValidateAPIKey(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
auto Key = Request.get("X-API-KEY", "");
|
||||
@@ -355,7 +376,7 @@ namespace uCentral {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
*/
|
||||
void RESTAPIHandler::ReturnObject(Poco::Net::HTTPServerRequest &Request, Poco::JSON::Object &Object,
|
||||
Poco::Net::HTTPServerResponse &Response) {
|
||||
PrepareResponse(Request, Response);
|
||||
@@ -363,18 +384,25 @@ namespace uCentral {
|
||||
Poco::JSON::Stringifier::stringify(Object, Answer);
|
||||
}
|
||||
|
||||
void RESTAPIHandler::InitQueryBlock() {
|
||||
QB_.SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
QB_.StartDate = GetParameter(uCentral::RESTAPI::Protocol::STARTDATE, 0);
|
||||
QB_.EndDate = GetParameter(uCentral::RESTAPI::Protocol::ENDDATE, 0);
|
||||
QB_.Offset = GetParameter(uCentral::RESTAPI::Protocol::OFFSET, 0);
|
||||
QB_.Limit = GetParameter(uCentral::RESTAPI::Protocol::LIMIT, 100);
|
||||
QB_.Filter = GetParameter(uCentral::RESTAPI::Protocol::FILTER, "");
|
||||
QB_.Select = GetParameter(uCentral::RESTAPI::Protocol::SELECT, "");
|
||||
QB_.Lifetime = GetBoolParameter(uCentral::RESTAPI::Protocol::LIFETIME,false);
|
||||
QB_.LogType = GetParameter(uCentral::RESTAPI::Protocol::LOGTYPE,0);
|
||||
QB_.LastOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::LASTONLY,false);
|
||||
QB_.Newest = GetBoolParameter(uCentral::RESTAPI::Protocol::NEWEST,false);
|
||||
bool RESTAPIHandler::InitQueryBlock() {
|
||||
if(QueryBlockInitialized_)
|
||||
return true;
|
||||
QueryBlockInitialized_=true;
|
||||
QB_.SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, "");
|
||||
QB_.StartDate = GetParameter(RESTAPI::Protocol::STARTDATE, 0);
|
||||
QB_.EndDate = GetParameter(RESTAPI::Protocol::ENDDATE, 0);
|
||||
QB_.Offset = GetParameter(RESTAPI::Protocol::OFFSET, 1);
|
||||
QB_.Limit = GetParameter(RESTAPI::Protocol::LIMIT, 100);
|
||||
QB_.Filter = GetParameter(RESTAPI::Protocol::FILTER, "");
|
||||
QB_.Select = GetParameter(RESTAPI::Protocol::SELECT, "");
|
||||
QB_.Lifetime = GetBoolParameter(RESTAPI::Protocol::LIFETIME,false);
|
||||
QB_.LogType = GetParameter(RESTAPI::Protocol::LOGTYPE,0);
|
||||
QB_.LastOnly = GetBoolParameter(RESTAPI::Protocol::LASTONLY,false);
|
||||
QB_.Newest = GetBoolParameter(RESTAPI::Protocol::NEWEST,false);
|
||||
|
||||
if(QB_.Offset<1)
|
||||
QB_.Offset=1;
|
||||
return true;
|
||||
}
|
||||
|
||||
[[nodiscard]] uint64_t RESTAPIHandler::Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default){
|
||||
@@ -396,7 +424,7 @@ namespace uCentral {
|
||||
}
|
||||
|
||||
[[nodiscard]] uint64_t RESTAPIHandler::GetWhen(const Poco::JSON::Object::Ptr &Obj) {
|
||||
return RESTAPIHandler::Get(uCentral::RESTAPI::Protocol::WHEN, Obj);
|
||||
return RESTAPIHandler::Get(RESTAPI::Protocol::WHEN, Obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@
|
||||
|
||||
#include "Poco/Logger.h"
|
||||
#include "Poco/File.h"
|
||||
#include "Poco/TemporaryFile.h"
|
||||
#include "Poco/JSON/Object.h"
|
||||
#include "Poco/CountingStream.h"
|
||||
#include "Poco/NullStream.h"
|
||||
|
||||
#include "RESTAPI_SecurityObjects.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
class RESTAPI_PartHandler: public Poco::Net::PartHandler
|
||||
{
|
||||
@@ -90,8 +91,8 @@ namespace uCentral {
|
||||
|
||||
typedef std::map<std::string, std::string> BindingMap;
|
||||
|
||||
RESTAPIHandler(BindingMap map, Poco::Logger &l, std::vector<std::string> Methods)
|
||||
: Bindings_(std::move(map)), Logger_(l), Methods_(std::move(Methods)) {}
|
||||
RESTAPIHandler(BindingMap map, Poco::Logger &l, std::vector<std::string> Methods, bool Internal=false)
|
||||
: Bindings_(std::move(map)), Logger_(l), Methods_(std::move(Methods)), Internal_(Internal) {}
|
||||
|
||||
static bool ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &Keys);
|
||||
void PrintBindings();
|
||||
@@ -110,10 +111,8 @@ namespace uCentral {
|
||||
|
||||
bool IsAuthorized(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response);
|
||||
bool IsAuthorized(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response, std::string &UserName);
|
||||
bool ValidateAPIKey(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response);
|
||||
/* bool ValidateAPIKey(Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response); */
|
||||
|
||||
uint64_t GetParameter(const std::string &Name, uint64_t Default);
|
||||
std::string GetParameter(const std::string &Name, const std::string &Default);
|
||||
@@ -136,16 +135,19 @@ namespace uCentral {
|
||||
Poco::Net::HTTPServerRequest &Request,
|
||||
Poco::Net::HTTPServerResponse &Response ,
|
||||
const Types::StringPairVec & FormVars);
|
||||
void SendFile(Poco::TemporaryFile &TempAvatar, const std::string &Type, const std::string & Name, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response);
|
||||
|
||||
void SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response);
|
||||
|
||||
const std::string &GetBinding(const std::string &Name, const std::string &Default);
|
||||
void InitQueryBlock();
|
||||
bool InitQueryBlock();
|
||||
|
||||
[[nodiscard]] static uint64_t Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default=0);
|
||||
[[nodiscard]] static std::string GetS(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, const std::string & Default="");
|
||||
[[nodiscard]] static bool GetB(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, bool Default=false);
|
||||
[[nodiscard]] static uint64_t GetWhen(const Poco::JSON::Object::Ptr &Obj);
|
||||
bool HasParameter(const std::string &QueryParameter, std::string &Value);
|
||||
bool HasParameter(const std::string &QueryParameter, uint64_t & Value);
|
||||
|
||||
protected:
|
||||
BindingMap Bindings_;
|
||||
@@ -155,6 +157,8 @@ namespace uCentral {
|
||||
SecurityObjects::UserInfoAndPolicy UserInfo_;
|
||||
std::vector<std::string> Methods_;
|
||||
QueryBlock QB_;
|
||||
bool Internal_=false;
|
||||
bool QueryBlockInitialized_=false;
|
||||
};
|
||||
|
||||
class RESTAPI_UnknownRequestHandler : public RESTAPIHandler {
|
||||
@@ -165,7 +169,7 @@ namespace uCentral {
|
||||
Poco::Net::HTTPServerResponse &Response) override {
|
||||
if (!IsAuthorized(Request, Response))
|
||||
return;
|
||||
BadRequest(Request, Response);
|
||||
BadRequest(Request, Response, "Unknown API endpoint");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -181,10 +185,10 @@ namespace uCentral {
|
||||
}
|
||||
|
||||
template<typename T, typename... Args>
|
||||
RESTAPIHandler * RESTAPI_Router(const std::string & RequestedPath, RESTAPIHandler::BindingMap &Bindings, Poco::Logger & Logger) {
|
||||
RESTAPIHandler * RESTAPI_Router(const std::string & RequestedPath, RESTAPIHandler::BindingMap &Bindings, Poco::Logger & Logger ) {
|
||||
static_assert(test_has_PathName_method((T*)nullptr), "Class must have a static PathName() method.");
|
||||
if(RESTAPIHandler::ParseBindings(RequestedPath,T::PathName(),Bindings)) {
|
||||
return new T(Bindings, Logger);
|
||||
return new T(Bindings, Logger, false);
|
||||
}
|
||||
|
||||
if constexpr (sizeof...(Args) == 0) {
|
||||
@@ -194,6 +198,21 @@ namespace uCentral {
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T, typename... Args>
|
||||
RESTAPIHandler * RESTAPI_Router_I(const std::string & RequestedPath, RESTAPIHandler::BindingMap &Bindings, Poco::Logger & Logger) {
|
||||
static_assert(test_has_PathName_method((T*)nullptr), "Class must have a static PathName() method.");
|
||||
if(RESTAPIHandler::ParseBindings(RequestedPath,T::PathName(),Bindings)) {
|
||||
return new T(Bindings, Logger, true);
|
||||
}
|
||||
|
||||
if constexpr (sizeof...(Args) == 0) {
|
||||
return new RESTAPI_UnknownRequestHandler(Bindings,Logger);
|
||||
} else {
|
||||
return RESTAPI_Router_I<Args...>(RequestedPath, Bindings, Logger);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif //UCENTRAL_RESTAPI_HANDLER_H
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "Utils.h"
|
||||
#include "OUIServer.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
|
||||
void RESTAPI_ouis::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) {
|
||||
if (!ContinueProcessing(Request, Response))
|
||||
@@ -21,7 +21,7 @@ namespace uCentral {
|
||||
if (Request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) {
|
||||
Poco::JSON::Array Objects;
|
||||
auto Select = GetParameter("macList","");
|
||||
std::vector<std::string> Macs = uCentral::Utils::Split(Select);
|
||||
std::vector<std::string> Macs = Utils::Split(Select);
|
||||
for (auto &i : Macs) {
|
||||
Poco::JSON::Object O;
|
||||
auto Manufacturer = OUIServer()->GetManufacturer(i);
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
|
||||
#include "RESTAPI_handler.h"
|
||||
|
||||
namespace uCentral {
|
||||
namespace OpenWifi {
|
||||
class RESTAPI_ouis : public RESTAPIHandler {
|
||||
public:
|
||||
RESTAPI_ouis(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L)
|
||||
RESTAPI_ouis(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal)
|
||||
: RESTAPIHandler(bindings, L,
|
||||
std::vector<std::string>{
|
||||
Poco::Net::HTTPRequest::HTTP_GET, Poco::Net::HTTPRequest::HTTP_POST,
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}) {}
|
||||
Poco::Net::HTTPRequest::HTTP_OPTIONS}, Internal) {}
|
||||
void handleRequest(Poco::Net::HTTPServerRequest &request,
|
||||
Poco::Net::HTTPServerResponse &response) override;
|
||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/ouis"};}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user