mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralfms.git
synced 2025-10-30 10:22:24 +00:00
Compare commits
353 Commits
v2.4.0-RC4
...
v2.8.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07f2b3944e | ||
|
|
7760230f02 | ||
|
|
6223ade0f6 | ||
|
|
64e6a6f70a | ||
|
|
c67367ec4d | ||
|
|
fe3c5d7c4a | ||
|
|
da52cf5823 | ||
|
|
3c8d8697e0 | ||
|
|
7b0c61ff5e | ||
|
|
e9a9416332 | ||
|
|
2255988b4c | ||
|
|
106c9353fc | ||
|
|
6c7fc8e310 | ||
|
|
e151b45d51 | ||
|
|
1584ff1ebe | ||
|
|
82ccb08d6b | ||
|
|
82b184a79f | ||
|
|
71c37edde7 | ||
|
|
0c8fa44935 | ||
|
|
32714f95b6 | ||
|
|
13cbf8c603 | ||
|
|
48c95c3101 | ||
|
|
857055750f | ||
|
|
96b22ef09b | ||
|
|
acff9afff2 | ||
|
|
1e250be2cd | ||
|
|
93a8624645 | ||
|
|
b9bf57e1f2 | ||
|
|
f203622299 | ||
|
|
698282658c | ||
|
|
5baacac9bf | ||
|
|
8ca4531c99 | ||
|
|
a6e0cd453b | ||
|
|
5e39f63fd2 | ||
|
|
9b081c6924 | ||
|
|
be2150d845 | ||
|
|
2d6f1879f5 | ||
|
|
e870a381a8 | ||
|
|
0cc0d0204e | ||
|
|
498e55f933 | ||
|
|
a9b3cb9821 | ||
|
|
29736da681 | ||
|
|
28f890002b | ||
|
|
0ec0a4fd95 | ||
|
|
6dce398ddc | ||
|
|
eca0e8883a | ||
|
|
43cc667a59 | ||
|
|
a084230cbd | ||
|
|
59c5ed51c0 | ||
|
|
1128fd3c23 | ||
|
|
ee4f1fac93 | ||
|
|
a1a600de77 | ||
|
|
9d64c2dabd | ||
|
|
4f6c9728ef | ||
|
|
167933e422 | ||
|
|
f661bb579a | ||
|
|
1e14eb1611 | ||
|
|
dae57a7492 | ||
|
|
d30014372b | ||
|
|
a9f37ae30d | ||
|
|
23bc11f26e | ||
|
|
caa25f0a1e | ||
|
|
b86e80be6d | ||
|
|
880a14b651 | ||
|
|
fa5d1b982a | ||
|
|
e803885d24 | ||
|
|
17b7e1de59 | ||
|
|
15d7ae635c | ||
|
|
244423132e | ||
|
|
ad149a8e40 | ||
|
|
59020f8809 | ||
|
|
4c5dbea4fb | ||
|
|
8fa42ab75d | ||
|
|
ad1d7301a1 | ||
|
|
6ad2f0ba1b | ||
|
|
aad7cf752a | ||
|
|
ff8fa5e625 | ||
|
|
6e38083912 | ||
|
|
98509fdab7 | ||
|
|
2bbaf44e88 | ||
|
|
c187710ddf | ||
|
|
c04a0c47ba | ||
|
|
7492e68a73 | ||
|
|
912903cc49 | ||
|
|
2a1cc8dc2a | ||
|
|
4e344eac03 | ||
|
|
9be24a146d | ||
|
|
2b9e934ac1 | ||
|
|
db5dffe2b8 | ||
|
|
e527983fa6 | ||
|
|
e0ef8d1dbf | ||
|
|
bc1a2b2ab8 | ||
|
|
06da583a6d | ||
|
|
39e8fbc863 | ||
|
|
88adcf6e78 | ||
|
|
dc6455813a | ||
|
|
fed5739afc | ||
|
|
f2fd761558 | ||
|
|
139c3ba217 | ||
|
|
ec8d304ae7 | ||
|
|
578580ad95 | ||
|
|
5e719c9b90 | ||
|
|
96b59c700a | ||
|
|
bbaa5da556 | ||
|
|
5df2701c21 | ||
|
|
ebd890dc79 | ||
|
|
23729bdde0 | ||
|
|
f02d932059 | ||
|
|
c450328e05 | ||
|
|
cf461eadb0 | ||
|
|
73ee40acde | ||
|
|
acd5800206 | ||
|
|
c5b613ecff | ||
|
|
892a756aae | ||
|
|
ccf1834c0b | ||
|
|
f5c4b3b37b | ||
|
|
33f8d5afb2 | ||
|
|
8b37fe2c8c | ||
|
|
66433efb61 | ||
|
|
085aa109c3 | ||
|
|
63043acce8 | ||
|
|
2612a74567 | ||
|
|
38e86e4de6 | ||
|
|
d0ba0eac22 | ||
|
|
0a59afa1fa | ||
|
|
7df6151da8 | ||
|
|
6351082acf | ||
|
|
de6abed9ae | ||
|
|
ba97fd59df | ||
|
|
8ef97f6300 | ||
|
|
f24fb790eb | ||
|
|
1c786ec360 | ||
|
|
c001eb77d8 | ||
|
|
7e7ddd953f | ||
|
|
477f59ca9b | ||
|
|
e0548a2696 | ||
|
|
a900b7e28e | ||
|
|
ef63dcd5b9 | ||
|
|
946c4bc1df | ||
|
|
7fb5be32be | ||
|
|
7cc719fcd6 | ||
|
|
9ea29b6088 | ||
|
|
24e25daa11 | ||
|
|
9a5063b6cf | ||
|
|
f0188afdc1 | ||
|
|
f5c1f808d8 | ||
|
|
eb2e039d48 | ||
|
|
adafc84cb8 | ||
|
|
2eff4174c3 | ||
|
|
dcc39392cf | ||
|
|
f19276e63e | ||
|
|
9ba9b82c31 | ||
|
|
602ca394ed | ||
|
|
29d961323b | ||
|
|
0530f255b4 | ||
|
|
6ff02c5f06 | ||
|
|
cfb0e6e219 | ||
|
|
bb19c0e70b | ||
|
|
d197323dba | ||
|
|
a374baceb8 | ||
|
|
63fb788653 | ||
|
|
8ccb95bf45 | ||
|
|
4433e1b189 | ||
|
|
c592af964a | ||
|
|
4fef783d30 | ||
|
|
2267fe7fc0 | ||
|
|
354c17ed3a | ||
|
|
bfb9018642 | ||
|
|
e075b8d7ab | ||
|
|
7328728006 | ||
|
|
c61236d613 | ||
|
|
fc09604442 | ||
|
|
72aeafde48 | ||
|
|
f55705ff64 | ||
|
|
adfd583f9f | ||
|
|
e0b160cdc4 | ||
|
|
b18f178601 | ||
|
|
1bf2d5c413 | ||
|
|
1908217e38 | ||
|
|
8dc2c4645d | ||
|
|
63d5d8ac92 | ||
|
|
5dd1a87376 | ||
|
|
7a3827a425 | ||
|
|
672d92ad96 | ||
|
|
aef714855b | ||
|
|
98ef247fab | ||
|
|
1831bb59c7 | ||
|
|
714742cf58 | ||
|
|
dec87434d2 | ||
|
|
83e957fd2e | ||
|
|
3cc000c4c3 | ||
|
|
60e5d45e74 | ||
|
|
15215a4c7d | ||
|
|
2d3717bb98 | ||
|
|
ea0caa0815 | ||
|
|
e46170f138 | ||
|
|
9387c82b0d | ||
|
|
b1a480fa6e | ||
|
|
25b841915f | ||
|
|
48d20ad443 | ||
|
|
b908255a8d | ||
|
|
c6baee3c7e | ||
|
|
1116245f78 | ||
|
|
833ef911b7 | ||
|
|
fcc93770bd | ||
|
|
496eabf20c | ||
|
|
3819ce4fbe | ||
|
|
36f6f8088b | ||
|
|
ec8b32ed0c | ||
|
|
f27f5078b4 | ||
|
|
400ee5d767 | ||
|
|
bea6a172ac | ||
|
|
51abcf9f0d | ||
|
|
7c39080ba2 | ||
|
|
932dd65df4 | ||
|
|
7e1dbea118 | ||
|
|
762b3ac60d | ||
|
|
d3eebf5b89 | ||
|
|
6e35848cd5 | ||
|
|
8afbec7c64 | ||
|
|
70b63704c0 | ||
|
|
773c72a0cc | ||
|
|
2904d7c258 | ||
|
|
d05aec1276 | ||
|
|
d03f767a1f | ||
|
|
9b5f30ce91 | ||
|
|
3067d5c90b | ||
|
|
7a13576746 | ||
|
|
85d8667da5 | ||
|
|
a2a0aa2e49 | ||
|
|
902c5e2837 | ||
|
|
caf86af949 | ||
|
|
2a90955d3c | ||
|
|
d0e7bbfb09 | ||
|
|
cb1b843c87 | ||
|
|
0af7ee372f | ||
|
|
35ef1d5182 | ||
|
|
ea66f54339 | ||
|
|
17052b1841 | ||
|
|
c5649f4b42 | ||
|
|
1836265c08 | ||
|
|
9bebaea65f | ||
|
|
45b5e77060 | ||
|
|
b018d6c941 | ||
|
|
c5135d4d72 | ||
|
|
66edc4026e | ||
|
|
e6d8d4b7e5 | ||
|
|
7eb724ffe0 | ||
|
|
6e6d39a309 | ||
|
|
f4944c1ab9 | ||
|
|
d9bf707579 | ||
|
|
6b09a373d2 | ||
|
|
084c9c2a38 | ||
|
|
5f5f8f6af5 | ||
|
|
5f922377d3 | ||
|
|
208fd05389 | ||
|
|
0055320331 | ||
|
|
fc4e66418a | ||
|
|
3b394627ba | ||
|
|
21815a6f85 | ||
|
|
24f93004d5 | ||
|
|
2023ca4cf9 | ||
|
|
694191f1d9 | ||
|
|
27bad516d2 | ||
|
|
9b1cae679d | ||
|
|
a53fc99753 | ||
|
|
1b0c11cbe0 | ||
|
|
68028c1137 | ||
|
|
8d63fa2bda | ||
|
|
0c015595d9 | ||
|
|
b17fd923ed | ||
|
|
b6f035b54e | ||
|
|
c22765896e | ||
|
|
4b0d2e6a18 | ||
|
|
75d3ee7722 | ||
|
|
2a5d864b2a | ||
|
|
419dd9d12f | ||
|
|
7474727d91 | ||
|
|
2e842918bc | ||
|
|
0f36f15b64 | ||
|
|
0262d00b0d | ||
|
|
da2f8341db | ||
|
|
47b014d502 | ||
|
|
7036d960e5 | ||
|
|
eb8a858e05 | ||
|
|
4527248545 | ||
|
|
783b7bd32e | ||
|
|
76c34c5b7e | ||
|
|
316e51a0e2 | ||
|
|
f2f8edd905 | ||
|
|
68389ec1e8 | ||
|
|
615408acff | ||
|
|
0a4bd59c56 | ||
|
|
479e3cc96c | ||
|
|
0e6ce5d6d9 | ||
|
|
507e8dadb5 | ||
|
|
3e72a41686 | ||
|
|
50050fe16d | ||
|
|
3344f5bb13 | ||
|
|
b4ab5192d3 | ||
|
|
707014d698 | ||
|
|
e34874f68b | ||
|
|
2244e9fcab | ||
|
|
4f4fe39edc | ||
|
|
7f143c6eaf | ||
|
|
f2b6339470 | ||
|
|
79622fd5ca | ||
|
|
090c019175 | ||
|
|
c32a7bd91f | ||
|
|
00fb2bab4f | ||
|
|
b4862aa11c | ||
|
|
f476d4711b | ||
|
|
ad436b0a7c | ||
|
|
5f0bf8b37f | ||
|
|
69d42a1074 | ||
|
|
69f4ac6035 | ||
|
|
27aa44ac30 | ||
|
|
edc855063a | ||
|
|
be520211bf | ||
|
|
506150cbee | ||
|
|
64f941e9ac | ||
|
|
d30e1715fe | ||
|
|
be01b70d4c | ||
|
|
6f6d539a14 | ||
|
|
6d1285cb77 | ||
|
|
e170f23300 | ||
|
|
d02a19d649 | ||
|
|
6546c14b3e | ||
|
|
4a80848fd9 | ||
|
|
935139067f | ||
|
|
e3cceeab32 | ||
|
|
d061e126bc | ||
|
|
7612196acc | ||
|
|
7c098c7925 | ||
|
|
814e9bf781 | ||
|
|
44bb657c48 | ||
|
|
fab5e85f03 | ||
|
|
3a7dae3855 | ||
|
|
f9b14c7723 | ||
|
|
53e2caa3cb | ||
|
|
fcb67912b0 | ||
|
|
76376ec7c0 | ||
|
|
31e3b5e606 | ||
|
|
266570f7d0 | ||
|
|
8414e0386a | ||
|
|
993405851a | ||
|
|
7e0da73c54 | ||
|
|
cd93e29a99 | ||
|
|
049cb888c1 | ||
|
|
0495bf88e8 | ||
|
|
95d8ef42ae | ||
|
|
d057bacd9c | ||
|
|
b87ee360e5 |
108
.github/workflows/ci.yml
vendored
108
.github/workflows/ci.yml
vendored
@@ -13,6 +13,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- 'release/*'
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -25,41 +26,78 @@ jobs:
|
|||||||
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
|
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
DOCKER_REGISTRY_USERNAME: ucentral
|
DOCKER_REGISTRY_USERNAME: ucentral
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- name: Checkout actions repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
- name: Build Docker image
|
|
||||||
run: docker build -t wlan-cloud-owfms:${{ github.sha }} .
|
|
||||||
|
|
||||||
- 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-owfms:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/owfms:$tag
|
|
||||||
done
|
|
||||||
- name: Log into Docker registry
|
|
||||||
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/main'
|
|
||||||
uses: docker/login-action@v1
|
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.DOCKER_REGISTRY_URL }}
|
repository: Telecominfraproject/.github
|
||||||
username: ${{ env.DOCKER_REGISTRY_USERNAME }}
|
path: github
|
||||||
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Push Docker images
|
- name: Build and push Docker image
|
||||||
if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/main'
|
uses: ./github/composite-actions/docker-image-build
|
||||||
|
with:
|
||||||
|
image_name: owfms
|
||||||
|
registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
|
registry_user: ucentral
|
||||||
|
registry_password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Notify on failure via Slack
|
||||||
|
if: failure() && github.ref == 'refs/heads/main'
|
||||||
|
uses: rtCamp/action-slack-notify@v2
|
||||||
|
env:
|
||||||
|
SLACK_USERNAME: GitHub Actions failure notifier
|
||||||
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
|
SLACK_COLOR: "${{ job.status }}"
|
||||||
|
SLACK_ICON: https://raw.githubusercontent.com/quintessence/slack-icons/master/images/github-logo-slack-icon.png
|
||||||
|
SLACK_TITLE: Docker build failed for OWFMS service
|
||||||
|
|
||||||
|
trigger-testing:
|
||||||
|
if: startsWith(github.ref, 'refs/pull/')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: docker
|
||||||
|
steps:
|
||||||
|
- name: Get base branch name and set as output
|
||||||
|
id: get_base_branch
|
||||||
run: |
|
run: |
|
||||||
docker images | grep ${{ env.DOCKER_REGISTRY_URL }}/owfms | awk -F ' ' '{print $1":"$2}' | xargs -I {} docker push {}
|
echo "branch=$(echo ${GITHUB_BASE_REF##*/})" >> $GITHUB_OUTPUT
|
||||||
|
echo "owgw_branch=$(echo ${GITHUB_BASE_REF##*/} | sed 's/main/master/g')" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Checkout actions repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: Telecominfraproject/.github
|
||||||
|
path: github
|
||||||
|
|
||||||
|
- name: Trigger testing of OpenWifi Docker Compose deployment and wait for result
|
||||||
|
uses: ./github/composite-actions/trigger-workflow-and-wait
|
||||||
|
env:
|
||||||
|
BASE_BRANCH: ${{ steps.get_base_branch.outputs.branch }}
|
||||||
|
OWGW_BASE_BRANCH: ${{ steps.get_base_branch.outputs.owgw_branch }}
|
||||||
|
with:
|
||||||
|
owner: Telecominfraproject
|
||||||
|
repo: wlan-testing
|
||||||
|
workflow: ow_docker-compose.yml
|
||||||
|
token: ${{ secrets.WLAN_TESTING_PAT }}
|
||||||
|
ref: master
|
||||||
|
inputs: '{"deployment_version": "${{ env.BASE_BRANCH }}", "owgw_version": "${{ env.OWGW_BASE_BRANCH }}", "owsec_version": "${{ env.BASE_BRANCH }}", "owfms_version": "${{ github.sha }}", "owprov_version": "${{ env.BASE_BRANCH }}", "owanalytics_version": "${{ env.BASE_BRANCH }}", "owsub_version": "${{ env.BASE_BRANCH }}", "microservice": "owfms"}'
|
||||||
|
|
||||||
|
trigger-deploy-to-dev:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
|
needs:
|
||||||
|
- docker
|
||||||
|
steps:
|
||||||
|
- name: Checkout actions repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: Telecominfraproject/.github
|
||||||
|
path: github
|
||||||
|
|
||||||
|
- name: Trigger deployment of the latest version to dev instance and wait for result
|
||||||
|
uses: ./github/composite-actions/trigger-workflow-and-wait
|
||||||
|
with:
|
||||||
|
owner: Telecominfraproject
|
||||||
|
repo: wlan-testing
|
||||||
|
workflow: ucentralgw-dev-deployment.yaml
|
||||||
|
token: ${{ secrets.WLAN_TESTING_PAT }}
|
||||||
|
ref: master
|
||||||
|
inputs: '{"force_latest": "true"}'
|
||||||
|
|||||||
9
.github/workflows/cleanup.yml
vendored
9
.github/workflows/cleanup.yml
vendored
@@ -4,6 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- 'release/*'
|
||||||
types: [ closed ]
|
types: [ closed ]
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
@@ -16,4 +17,10 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- run: |
|
- run: |
|
||||||
export PR_BRANCH_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
|
export PR_BRANCH_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
|
||||||
curl -uucentral:${{ secrets.DOCKER_REGISTRY_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral/owfms/$PR_BRANCH_TAG"
|
|
||||||
|
if [[ ! $PR_BRANCH_TAG =~ (main|master|release-*) ]]; then
|
||||||
|
echo "PR branch is $PR_BRANCH_TAG, deleting Docker image"
|
||||||
|
curl -s -uucentral:${{ secrets.DOCKER_REGISTRY_PASSWORD }} -X DELETE "https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral/owfms/$PR_BRANCH_TAG"
|
||||||
|
else
|
||||||
|
echo "PR branch is $PR_BRANCH_TAG, not deleting Docker image"
|
||||||
|
fi
|
||||||
|
|||||||
24
.github/workflows/enforce-jira-issue-key.yml
vendored
Normal file
24
.github/workflows/enforce-jira-issue-key.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: Ensure Jira issue is linked
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, edited, reopened, synchronize]
|
||||||
|
branches:
|
||||||
|
- 'release/*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_for_issue_key:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout actions repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: Telecominfraproject/.github
|
||||||
|
path: github
|
||||||
|
|
||||||
|
- name: Run JIRA check
|
||||||
|
uses: ./github/composite-actions/enforce-jira-issue-key
|
||||||
|
with:
|
||||||
|
jira_base_url: ${{ secrets.TIP_JIRA_URL }}
|
||||||
|
jira_user_email: ${{ secrets.TIP_JIRA_USER_EMAIL }}
|
||||||
|
jira_api_token: ${{ secrets.TIP_JIRA_API_TOKEN }}
|
||||||
41
.github/workflows/openapi-pages.yml
vendored
Normal file
41
.github/workflows/openapi-pages.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: Update OpenAPI docs on GitHub Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'openapi/**'
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docsgen:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Generate static HTML page with docs from OpenAPI definition
|
||||||
|
run: |
|
||||||
|
docker run --rm -v "${PWD}:/local" openapitools/openapi-generator-cli:v6.2.1 generate -i https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentralfms/main/openapi/owfms.yaml -g html2 --skip-validate-spec -o /local/
|
||||||
|
|
||||||
|
- name: Update OpenAPI docs
|
||||||
|
run: |
|
||||||
|
mkdir tmp-docs
|
||||||
|
mv index.html tmp-docs/index.html
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
|
||||||
|
echo https://tip-automation:${{ secrets.GIT_PUSH_PAT }}@github.com > ~/.git-credentials
|
||||||
|
git config --global credential.helper store
|
||||||
|
git config --global user.email "tip-automation@telecominfraproject.com"
|
||||||
|
git config --global user.name "TIP Automation User"
|
||||||
|
git pull
|
||||||
|
git checkout gh-pages || git checkout -b gh-pages
|
||||||
|
rm -rf docs
|
||||||
|
mv tmp-docs docs
|
||||||
|
git add docs
|
||||||
|
git commit -m'Update OpenAPI docs for GitHub pages'
|
||||||
|
git push --set-upstream origin gh-pages
|
||||||
46
.github/workflows/release.yml
vendored
Normal file
46
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: Release chart package
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
helm-package:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
env:
|
||||||
|
HELM_REPO_URL: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
||||||
|
HELM_REPO_USERNAME: ucentral
|
||||||
|
steps:
|
||||||
|
- name: Checkout uCentral assembly chart repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
path: wlan-cloud-ucentralfms
|
||||||
|
|
||||||
|
- name: Build package
|
||||||
|
working-directory: wlan-cloud-ucentralfms/helm
|
||||||
|
run: |
|
||||||
|
helm plugin install https://github.com/aslafy-z/helm-git --version 0.10.0
|
||||||
|
helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
helm repo update
|
||||||
|
helm dependency update
|
||||||
|
mkdir dist
|
||||||
|
helm package . -d dist
|
||||||
|
|
||||||
|
- name: Generate GitHub release body
|
||||||
|
working-directory: wlan-cloud-ucentralfms/helm
|
||||||
|
run: |
|
||||||
|
pip3 install yq -q
|
||||||
|
echo "Docker image - tip-tip-wlan-cloud-ucentral.jfrog.io/owfms:$GITHUB_REF_NAME" > release.txt
|
||||||
|
echo "Helm charted may be attached to this release" >> release.txt
|
||||||
|
echo "Deployment artifacts may be found in https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/$GITHUB_REF_NAME" >> release.txt
|
||||||
|
|
||||||
|
- name: Create GitHub release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
body_path: wlan-cloud-ucentralfms/helm/release.txt
|
||||||
|
files: wlan-cloud-ucentralfms/helm/dist/*
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -20,5 +20,4 @@ _deps
|
|||||||
*.zip
|
*.zip
|
||||||
result.json
|
result.json
|
||||||
pidfile
|
pidfile
|
||||||
|
test_scripts/curl/result.json
|
||||||
|
|
||||||
|
|||||||
120
CMakeLists.txt
120
CMakeLists.txt
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
project(owfms VERSION 2.4.0)
|
project(owfms VERSION 2.8.0)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
@@ -15,27 +15,37 @@ if(UNIX AND NOT APPLE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
|
||||||
file(READ build BUILD_NUM)
|
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/build BUILD_NUM)
|
||||||
if(BUILD_INCREMENT)
|
if(BUILD_INCREMENT)
|
||||||
MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
|
MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
|
||||||
file(WRITE build ${BUILD_NUM})
|
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
set(BUILD_NUM 1)
|
set(BUILD_NUM 1)
|
||||||
file(WRITE build ${BUILD_NUM})
|
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(BUILD_SHARED_LIBS 1)
|
find_package(Git QUIET)
|
||||||
add_definitions(-DAPP_VERSION="${CMAKE_PROJECT_VERSION}" -DBUILD_NUMBER="${BUILD_NUM}" -DAWS_CUSTOM_MEMORY_MANAGEMENT)
|
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
|
||||||
|
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE GIT_RESULT
|
||||||
|
OUTPUT_VARIABLE GIT_HASH)
|
||||||
|
if(NOT GIT_RESULT EQUAL "0")
|
||||||
|
message(FATAL_ERROR "git rev-parse --short HEAD failed with ${GIT_RESULT}")
|
||||||
|
endif()
|
||||||
|
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(Boost_USE_STATIC_LIBS OFF)
|
# set(BUILD_SHARED_LIBS 1)
|
||||||
set(Boost_USE_MULTITHREADED ON)
|
# add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT)
|
||||||
set(Boost_USE_STATIC_RUNTIME OFF)
|
|
||||||
|
|
||||||
find_package(Boost REQUIRED system)
|
|
||||||
find_package(OpenSSL REQUIRED)
|
find_package(OpenSSL REQUIRED)
|
||||||
find_package(AWSSDK REQUIRED COMPONENTS s3)
|
find_package(fmt REQUIRED)
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
||||||
|
find_package(AWSSDK REQUIRED COMPONENTS s3)
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
|
||||||
if(SMALL_BUILD)
|
if(SMALL_BUILD)
|
||||||
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
|
||||||
@@ -48,21 +58,73 @@ endif()
|
|||||||
|
|
||||||
include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
|
include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
|
||||||
|
|
||||||
|
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
|
||||||
|
|
||||||
|
add_compile_options(-Wall -Wextra)
|
||||||
|
add_definitions(-DPOCO_LOG_DEBUG="1")
|
||||||
|
|
||||||
|
if(ASAN)
|
||||||
|
add_compile_options(-fsanitize=address)
|
||||||
|
add_link_options(-fsanitize=address)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable( owfms
|
add_executable( owfms
|
||||||
build
|
build
|
||||||
|
src/ow_version.h.in
|
||||||
src/framework/CountryCodes.h
|
src/framework/CountryCodes.h
|
||||||
src/framework/KafkaTopics.h
|
src/framework/KafkaTopics.h
|
||||||
src/framework/MicroService.h
|
src/framework/MicroService.h
|
||||||
src/framework/OpenWifiTypes.h
|
src/framework/OpenWifiTypes.h
|
||||||
src/framework/orm.h
|
src/framework/orm.h
|
||||||
src/framework/RESTAPI_errors.h
|
|
||||||
src/framework/RESTAPI_protocol.h
|
|
||||||
src/framework/StorageClass.h
|
src/framework/StorageClass.h
|
||||||
src/framework/uCentral_Protocol.h
|
src/framework/MicroServiceErrorHandler.h
|
||||||
|
src/framework/UI_WebSocketClientServer.cpp
|
||||||
|
src/framework/UI_WebSocketClientServer.h
|
||||||
|
src/framework/UI_WebSocketClientNotifications.cpp
|
||||||
|
src/framework/UI_WebSocketClientNotifications.h
|
||||||
|
src/framework/utils.h
|
||||||
|
src/framework/utils.cpp
|
||||||
|
src/framework/AppServiceRegistry.h
|
||||||
|
src/framework/SubSystemServer.cpp
|
||||||
|
src/framework/SubSystemServer.h
|
||||||
|
src/framework/RESTAPI_utils.h
|
||||||
|
src/framework/AuthClient.cpp
|
||||||
|
src/framework/AuthClient.h
|
||||||
|
src/framework/MicroServiceNames.h
|
||||||
|
src/framework/MicroServiceFuncs.h
|
||||||
|
src/framework/OpenAPIRequests.cpp
|
||||||
|
src/framework/OpenAPIRequests.h
|
||||||
|
src/framework/MicroServiceFuncs.cpp
|
||||||
|
src/framework/ALBserver.cpp
|
||||||
|
src/framework/ALBserver.h
|
||||||
|
src/framework/KafkaManager.cpp
|
||||||
|
src/framework/KafkaManager.h
|
||||||
|
src/framework/RESTAPI_RateLimiter.h
|
||||||
|
src/framework/WebSocketLogger.h
|
||||||
|
src/framework/RESTAPI_GenericServerAccounting.h
|
||||||
|
src/framework/RESTAPI_SystemConfiguration.h
|
||||||
|
src/framework/CIDR.h
|
||||||
|
src/framework/RESTAPI_Handler.cpp
|
||||||
|
src/framework/RESTAPI_Handler.h
|
||||||
|
src/framework/RESTAPI_ExtServer.h
|
||||||
|
src/framework/RESTAPI_ExtServer.cpp
|
||||||
|
src/framework/RESTAPI_IntServer.cpp
|
||||||
|
src/framework/RESTAPI_IntServer.h
|
||||||
|
src/framework/RESTAPI_SystemCommand.h
|
||||||
|
src/framework/RESTAPI_WebSocketServer.h
|
||||||
|
src/framework/EventBusManager.cpp
|
||||||
|
src/framework/EventBusManager.h
|
||||||
|
src/framework/RESTAPI_PartHandler.h
|
||||||
|
src/framework/MicroService.cpp
|
||||||
|
src/framework/MicroServiceExtra.h
|
||||||
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
|
src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
|
||||||
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
|
|
||||||
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
|
src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
|
||||||
src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
|
src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
|
||||||
|
src/RESTObjects/RESTAPI_CertObjects.cpp src/RESTObjects/RESTAPI_CertObjects.h
|
||||||
|
src/RESTObjects/RESTAPI_OWLSobjects.cpp src/RESTObjects/RESTAPI_OWLSobjects.h
|
||||||
|
src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
|
||||||
|
src/RESTObjects/RESTAPI_AnalyticsObjects.cpp src/RESTObjects/RESTAPI_AnalyticsObjects.h
|
||||||
|
src/RESTObjects/RESTAPI_SubObjects.cpp src/RESTObjects/RESTAPI_SubObjects.h
|
||||||
src/RESTAPI/RESTAPI_firmwaresHandler.cpp src/RESTAPI/RESTAPI_firmwaresHandler.h
|
src/RESTAPI/RESTAPI_firmwaresHandler.cpp src/RESTAPI/RESTAPI_firmwaresHandler.h
|
||||||
src/RESTAPI/RESTAPI_firmwareHandler.cpp src/RESTAPI/RESTAPI_firmwareHandler.h
|
src/RESTAPI/RESTAPI_firmwareHandler.cpp src/RESTAPI/RESTAPI_firmwareHandler.h
|
||||||
src/RESTAPI/RESTAPI_historyHandler.cpp src/RESTAPI/RESTAPI_historyHandler.h
|
src/RESTAPI/RESTAPI_historyHandler.cpp src/RESTAPI/RESTAPI_historyHandler.h
|
||||||
@@ -70,28 +132,30 @@ add_executable( owfms
|
|||||||
src/RESTAPI/RESTAPI_connectedDevicesHandler.cpp src/RESTAPI/RESTAPI_connectedDevicesHandler.h
|
src/RESTAPI/RESTAPI_connectedDevicesHandler.cpp src/RESTAPI/RESTAPI_connectedDevicesHandler.h
|
||||||
src/RESTAPI/RESTAPI_deviceReportHandler.cpp src/RESTAPI/RESTAPI_deviceReportHandler.h
|
src/RESTAPI/RESTAPI_deviceReportHandler.cpp src/RESTAPI/RESTAPI_deviceReportHandler.h
|
||||||
src/RESTAPI/RESTAPI_connectedDeviceHandler.cpp src/RESTAPI/RESTAPI_connectedDeviceHandler.h
|
src/RESTAPI/RESTAPI_connectedDeviceHandler.cpp src/RESTAPI/RESTAPI_connectedDeviceHandler.h
|
||||||
src/storage/storage_tables.cpp
|
src/RESTAPI/RESTAPI_Routers.cpp
|
||||||
src/storage/storage_firmwares.cpp
|
|
||||||
src/storage/storage_firmwares.h src/storage/storage_history.cpp
|
|
||||||
src/storage/storage_history.h src/storage/storage_deviceTypes.cpp
|
|
||||||
src/storage/storage_deviceInfo.cpp src/storage/storage_deviceInfo.h
|
|
||||||
src/APIServers.cpp
|
|
||||||
src/Dashboard.cpp src/Dashboard.h
|
src/Dashboard.cpp src/Dashboard.h
|
||||||
src/Daemon.cpp src/Daemon.h
|
src/Daemon.cpp src/Daemon.h
|
||||||
src/StorageService.cpp src/StorageService.h
|
src/StorageService.cpp src/StorageService.h
|
||||||
src/ManifestCreator.cpp src/ManifestCreator.h
|
src/ManifestCreator.cpp src/ManifestCreator.h
|
||||||
src/framework/MicroService.h
|
|
||||||
src/NewConnectionHandler.cpp src/NewConnectionHandler.h
|
src/NewConnectionHandler.cpp src/NewConnectionHandler.h
|
||||||
src/LatestFirmwareCache.cpp src/LatestFirmwareCache.h
|
src/LatestFirmwareCache.cpp src/LatestFirmwareCache.h
|
||||||
src/DeviceCache.cpp src/DeviceCache.h
|
src/DeviceCache.cpp src/DeviceCache.h
|
||||||
src/FirmwareCache.cpp src/FirmwareCache.h
|
src/FirmwareCache.cpp src/FirmwareCache.h
|
||||||
src/SDK/Prov_SDK.cpp src/SDK/Prov_SDK.h
|
src/SDK/Prov_SDK.cpp src/SDK/Prov_SDK.h
|
||||||
src/AutoUpdater.cpp src/AutoUpdater.h src/SDK/GW_SDK.cpp src/SDK/GW_SDK.h
|
src/AutoUpdater.cpp src/AutoUpdater.h src/SDK/GW_SDK.cpp src/SDK/GW_SDK.h
|
||||||
|
src/NewCommandHandler.cpp src/NewCommandHandler.h
|
||||||
|
src/storage/orm_history.cpp src/storage/orm_history.h
|
||||||
|
src/storage/orm_firmwares.cpp src/storage/orm_firmwares.h
|
||||||
|
src/storage/orm_deviceInfo.cpp src/storage/orm_deviceInfo.h
|
||||||
|
src/RESTAPI/RESTAPI_deviceInformation_handler.cpp
|
||||||
|
src/RESTAPI/RESTAPI_deviceInformation_handler.h)
|
||||||
|
|
||||||
|
target_link_libraries( owfms PUBLIC
|
||||||
|
${Poco_LIBRARIES}
|
||||||
|
${MySQL_LIBRARIES}
|
||||||
|
${ZLIB_LIBRARIES}
|
||||||
|
${AWSSDK_LINK_LIBRARIES}
|
||||||
|
fmt::fmt
|
||||||
|
CppKafka::cppkafka
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(owfms PUBLIC
|
|
||||||
${Poco_LIBRARIES} ${MySQL_LIBRARIES}
|
|
||||||
${Boost_LIBRARIES}
|
|
||||||
${ZLIB_LIBRARIES} ${AWSSDK_LINK_LIBRARIES}
|
|
||||||
CppKafka::cppkafka )
|
|
||||||
|
|
||||||
|
|||||||
106
Dockerfile
106
Dockerfile
@@ -1,36 +1,21 @@
|
|||||||
FROM alpine AS builder
|
ARG DEBIAN_VERSION=11.5-slim
|
||||||
|
ARG POCO_VERSION=poco-tip-v2
|
||||||
|
ARG CPPKAFKA_VERSION=tip-v1
|
||||||
|
|
||||||
RUN apk add --update --no-cache \
|
FROM debian:$DEBIAN_VERSION AS build-base
|
||||||
openssl openssh \
|
|
||||||
ncurses-libs \
|
|
||||||
bash util-linux coreutils curl libcurl \
|
|
||||||
make cmake gcc g++ libstdc++ libgcc git zlib-dev \
|
|
||||||
openssl-dev boost-dev curl-dev util-linux-dev \
|
|
||||||
unixodbc-dev postgresql-dev mariadb-dev \
|
|
||||||
librdkafka-dev
|
|
||||||
|
|
||||||
RUN git clone https://github.com/stephb9959/poco /poco
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||||
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
|
make cmake g++ git curl zip unzip pkg-config \
|
||||||
RUN git clone https://github.com/nlohmann/json /json
|
libpq-dev libmariadb-dev libmariadbclient-dev-compat \
|
||||||
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
|
librdkafka-dev libboost-all-dev libssl-dev \
|
||||||
RUN git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp /aws-sdk-cpp
|
zlib1g-dev ca-certificates libcurl4-openssl-dev libfmt-dev
|
||||||
|
|
||||||
WORKDIR /aws-sdk-cpp
|
FROM build-base AS poco-build
|
||||||
RUN mkdir cmake-build
|
|
||||||
WORKDIR cmake-build
|
|
||||||
RUN cmake .. -DBUILD_ONLY="s3" \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow -Wno-error=uninitialized" \
|
|
||||||
-DAUTORUN_UNIT_TESTS=OFF
|
|
||||||
RUN cmake --build . --config Release -j8
|
|
||||||
RUN cmake --build . --target install
|
|
||||||
|
|
||||||
WORKDIR /cppkafka
|
ARG POCO_VERSION
|
||||||
RUN mkdir cmake-build
|
|
||||||
WORKDIR cmake-build
|
ADD https://api.github.com/repos/AriliaWireless/poco/git/refs/tags/${POCO_VERSION} version.json
|
||||||
RUN cmake ..
|
RUN git clone https://github.com/AriliaWireless/poco --branch ${POCO_VERSION} /poco
|
||||||
RUN cmake --build . --config Release -j8
|
|
||||||
RUN cmake --build . --target install
|
|
||||||
|
|
||||||
WORKDIR /poco
|
WORKDIR /poco
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
@@ -39,56 +24,77 @@ RUN cmake ..
|
|||||||
RUN cmake --build . --config Release -j8
|
RUN cmake --build . --config Release -j8
|
||||||
RUN cmake --build . --target install
|
RUN cmake --build . --target install
|
||||||
|
|
||||||
WORKDIR /json
|
FROM build-base AS cppkafka-build
|
||||||
RUN mkdir cmake-build
|
|
||||||
WORKDIR cmake-build
|
|
||||||
RUN cmake ..
|
|
||||||
RUN make
|
|
||||||
RUN make install
|
|
||||||
|
|
||||||
WORKDIR /json-schema-validator
|
ARG CPPKAFKA_VERSION
|
||||||
|
|
||||||
|
ADD https://api.github.com/repos/AriliaWireless/cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
|
||||||
|
RUN git clone https://github.com/AriliaWireless/cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
|
||||||
|
|
||||||
|
WORKDIR /cppkafka
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
WORKDIR cmake-build
|
WORKDIR cmake-build
|
||||||
RUN cmake ..
|
RUN cmake ..
|
||||||
RUN make
|
RUN cmake --build . --config Release -j8
|
||||||
RUN make install
|
RUN cmake --build . --target install
|
||||||
|
|
||||||
|
FROM build-base AS owfms-build
|
||||||
|
|
||||||
ADD CMakeLists.txt build /owfms/
|
ADD CMakeLists.txt build /owfms/
|
||||||
|
ADD overlays /owfms/overlays
|
||||||
ADD cmake /owfms/cmake
|
ADD cmake /owfms/cmake
|
||||||
ADD src /owfms/src
|
ADD src /owfms/src
|
||||||
|
ADD .git /owfms/.git
|
||||||
|
ARG VCPKG_VERSION=2022.11.14
|
||||||
|
RUN git clone --depth 1 --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg && \
|
||||||
|
./vcpkg/bootstrap-vcpkg.sh && \
|
||||||
|
mkdir /vcpkg/custom-triplets && \
|
||||||
|
cp /vcpkg/triplets/x64-linux.cmake /vcpkg/custom-triplets/x64-linux.cmake && \
|
||||||
|
sed -i 's/set(VCPKG_LIBRARY.*/set(VCPKG_LIBRARY_LINKAGE dynamic)/g' /vcpkg/custom-triplets/x64-linux.cmake && \
|
||||||
|
./vcpkg/vcpkg install aws-sdk-cpp[s3]:x64-linux json-schema-validator:x64-linux --overlay-triplets=/vcpkg/custom-triplets --overlay-ports=/owfms/overlays
|
||||||
|
|
||||||
|
COPY --from=poco-build /usr/local/include /usr/local/include
|
||||||
|
COPY --from=poco-build /usr/local/lib /usr/local/lib
|
||||||
|
COPY --from=cppkafka-build /usr/local/include /usr/local/include
|
||||||
|
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
|
||||||
|
|
||||||
WORKDIR /owfms
|
WORKDIR /owfms
|
||||||
RUN mkdir cmake-build
|
RUN mkdir cmake-build
|
||||||
WORKDIR /owfms/cmake-build
|
WORKDIR /owfms/cmake-build
|
||||||
RUN cmake ..
|
RUN cmake -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
||||||
RUN cmake --build . --config Release -j8
|
RUN cmake --build . --config Release -j8
|
||||||
|
|
||||||
FROM alpine
|
FROM debian:$DEBIAN_VERSION
|
||||||
|
|
||||||
ENV OWFMS_USER=owfms \
|
ENV OWFMS_USER=owfms \
|
||||||
OWFMS_ROOT=/owfms-data \
|
OWFMS_ROOT=/owfms-data \
|
||||||
OWFMS_CONFIG=/owfms-data
|
OWFMS_CONFIG=/owfms-data
|
||||||
|
|
||||||
RUN addgroup -S "$OWFMS_USER" && \
|
RUN useradd "$OWFMS_USER"
|
||||||
adduser -S -G "$OWFMS_USER" "$OWFMS_USER"
|
|
||||||
|
|
||||||
RUN mkdir /openwifi
|
RUN mkdir /openwifi
|
||||||
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
|
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
|
||||||
chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
||||||
RUN apk add --update --no-cache librdkafka curl-dev mariadb-connector-c libpq unixodbc su-exec gettext ca-certificates bash jq curl
|
|
||||||
|
|
||||||
COPY --from=builder /owfms/cmake-build/owfms /openwifi/owfms
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||||
COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/
|
librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
|
||||||
COPY --from=builder /poco/cmake-build/lib/* /lib/
|
libmariadb-dev-compat libpq5 postgresql-client libfmt7 sqlite3
|
||||||
COPY --from=builder /aws-sdk-cpp/cmake-build/aws-cpp-sdk-core/libaws-cpp-sdk-core.so /lib/
|
|
||||||
COPY --from=builder /aws-sdk-cpp/cmake-build/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so /lib/
|
COPY readiness_check /readiness_check
|
||||||
|
COPY test_scripts/curl/cli /cli
|
||||||
|
|
||||||
COPY owfms.properties.tmpl /
|
COPY owfms.properties.tmpl /
|
||||||
COPY docker-entrypoint.sh /
|
COPY docker-entrypoint.sh /
|
||||||
|
COPY wait-for-postgres.sh /
|
||||||
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
|
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
|
||||||
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem
|
-O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
|
||||||
|
|
||||||
COPY readiness_check /readiness_check
|
COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms
|
||||||
|
COPY --from=owfms-build /vcpkg/installed/x64-linux/lib/ /usr/local/lib/
|
||||||
|
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/ /usr/local/lib/
|
||||||
|
COPY --from=poco-build /poco/cmake-build/lib/ /usr/local/lib/
|
||||||
|
|
||||||
|
RUN ldconfig
|
||||||
|
|
||||||
EXPOSE 16004 17004 16104
|
EXPOSE 16004 17004 16104
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ The uCentralFMS is a micro-service part of the OpenWiFi ecosystem. uCentralFMS i
|
|||||||
to facilitate the task of upgrade and maintaining the proper firmware for all the devices
|
to facilitate the task of upgrade and maintaining the proper firmware for all the devices
|
||||||
used in your OpenWiFi solution. You may either [build it](#building) or use the [Docker version](#docker).
|
used in your OpenWiFi solution. You may either [build it](#building) or use the [Docker version](#docker).
|
||||||
|
|
||||||
|
## OpenAPI
|
||||||
|
You may get static page with OpenAPI docs generated from the definition on [GitHub Page](https://telecominfraproject.github.io/wlan-cloud-ucentralfms/).
|
||||||
|
|
||||||
|
Also you may use [Swagger UI](https://petstore.swagger.io/#/) with OpenAPI definition file raw link (i.e. [latest version file](https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentralfms/main/openapi/owfms.yaml)) to get interactive docs page.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
In order to build the uCentralFMS, you will need to install its dependencies, which includes the following:
|
In order to build the uCentralFMS, you will need to install its dependencies, which includes the following:
|
||||||
- cmake
|
- cmake
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ "$SELFSIGNED_CERTS" = 'true' ]; then
|
if [ "$SELFSIGNED_CERTS" = 'true' ]; then
|
||||||
update-ca-certificates
|
update-ca-certificates
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; then
|
if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
|
||||||
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWFMS_ROOT/certs/restapi-ca.pem"} \
|
RESTAPI_HOST_ROOTCA=${RESTAPI_HOST_ROOTCA:-"\$OWFMS_ROOT/certs/restapi-ca.pem"} \
|
||||||
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16004"} \
|
RESTAPI_HOST_PORT=${RESTAPI_HOST_PORT:-"16004"} \
|
||||||
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWFMS_ROOT/certs/restapi-cert.pem"} \
|
RESTAPI_HOST_CERT=${RESTAPI_HOST_CERT:-"\$OWFMS_ROOT/certs/restapi-cert.pem"} \
|
||||||
@@ -22,6 +22,9 @@ if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; t
|
|||||||
SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17004"} \
|
SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17004"} \
|
||||||
SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16004"} \
|
SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16004"} \
|
||||||
SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
|
SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
|
||||||
|
SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \
|
||||||
|
FIRMWAREDB_REFRESH=${FIRMWAREDB_REFRESH:-"86400"} \
|
||||||
|
FIRMWAREDB_MAXAGE=${FIRMWAREDB_MAXAGE:-"90"} \
|
||||||
S3_BUCKETNAME=${S3_BUCKETNAME:-"ucentral-ap-firmware"} \
|
S3_BUCKETNAME=${S3_BUCKETNAME:-"ucentral-ap-firmware"} \
|
||||||
S3_REGION=${S3_REGION:-"us-east-1"} \
|
S3_REGION=${S3_REGION:-"us-east-1"} \
|
||||||
S3_SECRET=${S3_SECRET:-"*******************************************"} \
|
S3_SECRET=${S3_SECRET:-"*******************************************"} \
|
||||||
@@ -29,6 +32,10 @@ if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWFMS_CONFIG"/owfms.properties ]]; t
|
|||||||
S3_BUCKET_URI=${S3_BUCKET_URI:-"ucentral-ap-firmware.s3.amazonaws.com"} \
|
S3_BUCKET_URI=${S3_BUCKET_URI:-"ucentral-ap-firmware.s3.amazonaws.com"} \
|
||||||
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
|
KAFKA_ENABLE=${KAFKA_ENABLE:-"true"} \
|
||||||
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
|
KAFKA_BROKERLIST=${KAFKA_BROKERLIST:-"localhost:9092"} \
|
||||||
|
KAFKA_SSL_CA_LOCATION=${KAFKA_SSL_CA_LOCATION:-""} \
|
||||||
|
KAFKA_SSL_CERTIFICATE_LOCATION=${KAFKA_SSL_CERTIFICATE_LOCATION:-""} \
|
||||||
|
KAFKA_SSL_KEY_LOCATION=${KAFKA_SSL_KEY_LOCATION:-""} \
|
||||||
|
KAFKA_SSL_KEY_PASSWORD=${KAFKA_SSL_KEY_PASSWORD:-""} \
|
||||||
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
|
STORAGE_TYPE=${STORAGE_TYPE:-"sqlite"} \
|
||||||
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
|
STORAGE_TYPE_POSTGRESQL_HOST=${STORAGE_TYPE_POSTGRESQL_HOST:-"localhost"} \
|
||||||
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owfms"} \
|
STORAGE_TYPE_POSTGRESQL_USERNAME=${STORAGE_TYPE_POSTGRESQL_USERNAME:-"owfms"} \
|
||||||
@@ -47,7 +54,7 @@ if [ "$1" = '/openwifi/owfms' -a "$(id -u)" = '0' ]; then
|
|||||||
if [ "$RUN_CHOWN" = 'true' ]; then
|
if [ "$RUN_CHOWN" = 'true' ]; then
|
||||||
chown -R "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
chown -R "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
|
||||||
fi
|
fi
|
||||||
exec su-exec "$OWFMS_USER" "$@"
|
exec gosu "$OWFMS_USER" "$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
2
helm/.gitignore
vendored
2
helm/.gitignore
vendored
@@ -1 +1,3 @@
|
|||||||
*.swp
|
*.swp
|
||||||
|
Chart.lock
|
||||||
|
charts/
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ name: owfms
|
|||||||
version: 0.1.0
|
version: 0.1.0
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
||||||
version: 10.9.2
|
version: 10.9.2
|
||||||
condition: postgresql.enabled
|
condition: postgresql.enabled
|
||||||
- name: mysql
|
- name: mysql
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
||||||
version: 8.8.3
|
version: 8.8.3
|
||||||
condition: mysql.enabled
|
condition: mysql.enabled
|
||||||
- name: mariadb
|
- name: mariadb
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
||||||
version: 9.4.2
|
version: 9.4.2
|
||||||
condition: mariadb.enabled
|
condition: mariadb.enabled
|
||||||
|
|||||||
@@ -70,7 +70,8 @@ The following table lists the configurable parameters of the chart and their def
|
|||||||
| persistence.size | string | Defines PV size | `'10Gi'` |
|
| persistence.size | string | Defines PV size | `'10Gi'` |
|
||||||
| public_env_variables | hash | Defines list of environment variables to be passed to the Firmware | |
|
| public_env_variables | hash | Defines list of environment variables to be passed to the Firmware | |
|
||||||
| configProperties | hash | Configuration properties that should be passed to the application in `owfms.properties`. May be passed by key in set (i.e. `configProperties."rtty\.token"`) | |
|
| configProperties | hash | Configuration properties that should be passed to the application in `owfms.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 the Firmware (PEM format is adviced to be used) (see `volumes.owfms` on where it is mounted) | |
|
| existingCertsSecret | string | Existing Kubernetes secret containing all required certificates and private keys for microservice operation. If set, certificates from `certs` key are ignored | `""` |
|
||||||
|
| certs | hash | Defines files (keys and certificates) that should be passed to the Gateway (PEM format is adviced to be used) (see `volumes.owfms` on where it is mounted). If `existingCertsSecret` is set, certificates passed this way will not be used. | |
|
||||||
|
|
||||||
|
|
||||||
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||||
|
|||||||
@@ -30,3 +30,13 @@ Create chart name and version as used by the chart label.
|
|||||||
{{- define "owfms.chart" -}}
|
{{- define "owfms.chart" -}}
|
||||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "owfms.ingress.apiVersion" -}}
|
||||||
|
{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" -}}
|
||||||
|
{{- print "networking.k8s.io/v1" -}}
|
||||||
|
{{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}}
|
||||||
|
{{- print "networking.k8s.io/v1beta1" -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- print "extensions/v1beta1" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{{- $root := . -}}
|
{{- $root := . -}}
|
||||||
|
{{- $storageType := index .Values.configProperties "storage.type" -}}
|
||||||
---
|
---
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
@@ -13,6 +14,7 @@ spec:
|
|||||||
replicas: {{ .Values.replicaCount }}
|
replicas: {{ .Values.replicaCount }}
|
||||||
strategy:
|
strategy:
|
||||||
type: {{ .Values.strategyType }}
|
type: {{ .Values.strategyType }}
|
||||||
|
revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app.kubernetes.io/name: {{ include "owfms.name" . }}
|
app.kubernetes.io/name: {{ include "owfms.name" . }}
|
||||||
@@ -35,6 +37,49 @@ spec:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
spec:
|
spec:
|
||||||
|
|
||||||
|
initContainers:
|
||||||
|
- name: wait-kafka
|
||||||
|
image: "{{ .Values.images.dockerize.repository }}:{{ .Values.images.dockerize.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.images.dockerize.pullPolicy }}
|
||||||
|
args:
|
||||||
|
- -wait
|
||||||
|
- tcp://{{ index .Values.configProperties "openwifi.kafka.brokerlist" }}
|
||||||
|
- -timeout
|
||||||
|
- 600s
|
||||||
|
|
||||||
|
{{- if eq $storageType "postgresql" }}
|
||||||
|
- name: wait-postgres
|
||||||
|
image: "{{ .Values.images.owfms.repository }}:{{ .Values.images.owfms.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.images.owfms.pullPolicy }}
|
||||||
|
command:
|
||||||
|
- /wait-for-postgres.sh
|
||||||
|
- {{ index .Values.configProperties "storage.type.postgresql.host" }}
|
||||||
|
- echo
|
||||||
|
- "PostgreSQL is ready"
|
||||||
|
env:
|
||||||
|
- name: KUBERNETES_DEPLOYED
|
||||||
|
value: "{{ now }}"
|
||||||
|
{{- range $key, $value := .Values.public_env_variables }}
|
||||||
|
- name: {{ $key }}
|
||||||
|
value: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := .Values.secret_env_variables }}
|
||||||
|
- name: {{ $key }}
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "owfms.fullname" $root }}-env
|
||||||
|
key: {{ $key }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- range .Values.volumes.owfms }}
|
||||||
|
- name: {{ .name }}
|
||||||
|
mountPath: {{ .mountPath }}
|
||||||
|
{{- if .subPath }}
|
||||||
|
subPath: {{ .subPath }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
containers:
|
containers:
|
||||||
|
|
||||||
- name: owfms
|
- name: owfms
|
||||||
@@ -86,8 +131,10 @@ spec:
|
|||||||
{{- toYaml . | nindent 12 }}
|
{{- toYaml . | nindent 12 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{- with .Values.securityContext }}
|
||||||
securityContext:
|
securityContext:
|
||||||
fsGroup: 101
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
{{- range $image, $imageValue := .Values.images }}
|
{{- range $image, $imageValue := .Values.images }}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{{- range $ingress, $ingressValue := .Values.ingresses }}
|
{{- range $ingress, $ingressValue := .Values.ingresses }}
|
||||||
{{- if $ingressValue.enabled }}
|
{{- if $ingressValue.enabled }}
|
||||||
---
|
---
|
||||||
apiVersion: extensions/v1beta1
|
apiVersion: {{ include "owfms.ingress.apiVersion" $root }}
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ include "owfms.fullname" $root }}-{{ $ingress }}
|
name: {{ include "owfms.fullname" $root }}-{{ $ingress }}
|
||||||
@@ -36,11 +36,25 @@ spec:
|
|||||||
paths:
|
paths:
|
||||||
{{- range $ingressValue.paths }}
|
{{- range $ingressValue.paths }}
|
||||||
- path: {{ .path }}
|
- path: {{ .path }}
|
||||||
|
{{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
|
||||||
|
pathType: {{ .pathType | default "ImplementationSpecific" }}
|
||||||
|
{{- end }}
|
||||||
backend:
|
backend:
|
||||||
|
{{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
|
||||||
|
service:
|
||||||
|
name: {{ include "owfms.fullname" $root }}-{{ .serviceName }}
|
||||||
|
port:
|
||||||
|
{{- if kindIs "string" .servicePort }}
|
||||||
|
name: {{ .servicePort }}
|
||||||
|
{{- else }}
|
||||||
|
number: {{ .servicePort }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
serviceName: {{ include "owfms.fullname" $root }}-{{ .serviceName }}
|
serviceName: {{ include "owfms.fullname" $root }}-{{ .serviceName }}
|
||||||
servicePort: {{ .servicePort }}
|
servicePort: {{ .servicePort }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# System
|
# System
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
strategyType: Recreate
|
strategyType: Recreate
|
||||||
|
revisionHistoryLimit: 2
|
||||||
|
|
||||||
nameOverride: ""
|
nameOverride: ""
|
||||||
fullnameOverride: ""
|
fullnameOverride: ""
|
||||||
@@ -8,16 +9,20 @@ fullnameOverride: ""
|
|||||||
images:
|
images:
|
||||||
owfms:
|
owfms:
|
||||||
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
|
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms
|
||||||
tag: main
|
tag: v2.8.0
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
# regcred:
|
# regcred:
|
||||||
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
# username: username
|
# username: username
|
||||||
# password: password
|
# password: password
|
||||||
|
dockerize:
|
||||||
|
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/dockerize
|
||||||
|
tag: 0.16.0
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
|
||||||
services:
|
services:
|
||||||
owfms:
|
owfms:
|
||||||
type: LoadBalancer
|
type: ClusterIP
|
||||||
ports:
|
ports:
|
||||||
restapi:
|
restapi:
|
||||||
servicePort: 16004
|
servicePort: 16004
|
||||||
@@ -38,8 +43,6 @@ checks:
|
|||||||
exec:
|
exec:
|
||||||
command:
|
command:
|
||||||
- /readiness_check
|
- /readiness_check
|
||||||
failureThreshold: 1
|
|
||||||
|
|
||||||
|
|
||||||
ingresses:
|
ingresses:
|
||||||
restapi:
|
restapi:
|
||||||
@@ -51,6 +54,7 @@ ingresses:
|
|||||||
- restapi.chart-example.local
|
- restapi.chart-example.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
serviceName: owfms
|
serviceName: owfms
|
||||||
servicePort: restapi
|
servicePort: restapi
|
||||||
|
|
||||||
@@ -67,7 +71,7 @@ volumes:
|
|||||||
mountPath: /owfms-data/certs
|
mountPath: /owfms-data/certs
|
||||||
volumeDefinition: |
|
volumeDefinition: |
|
||||||
secret:
|
secret:
|
||||||
secretName: {{ include "owfms.fullname" . }}-certs
|
secretName: {{ if .Values.existingCertsSecret }}{{ .Values.existingCertsSecret }}{{ else }}{{ include "owfms.fullname" . }}-certs{{ end }}
|
||||||
# Change this if you want to use another volume type
|
# Change this if you want to use another volume type
|
||||||
- name: persist
|
- name: persist
|
||||||
mountPath: /owfms-data/persist
|
mountPath: /owfms-data/persist
|
||||||
@@ -87,6 +91,9 @@ resources: {}
|
|||||||
# cpu: 100m
|
# cpu: 100m
|
||||||
# memory: 128Mi
|
# memory: 128Mi
|
||||||
|
|
||||||
|
securityContext:
|
||||||
|
fsGroup: 1000
|
||||||
|
|
||||||
nodeSelector: {}
|
nodeSelector: {}
|
||||||
|
|
||||||
tolerations: []
|
tolerations: []
|
||||||
@@ -140,7 +147,7 @@ configProperties:
|
|||||||
s3.region: us-east-1
|
s3.region: us-east-1
|
||||||
s3.retry: 60
|
s3.retry: 60
|
||||||
s3.bucket.uri: ucentral-ap-firmware.s3.amazonaws.com
|
s3.bucket.uri: ucentral-ap-firmware.s3.amazonaws.com
|
||||||
firmwaredb.refresh: 1800
|
firmwaredb.refresh: 86400
|
||||||
# ALB
|
# ALB
|
||||||
alb.enable: "true"
|
alb.enable: "true"
|
||||||
alb.port: 16104
|
alb.port: 16104
|
||||||
@@ -151,6 +158,10 @@ configProperties:
|
|||||||
openwifi.kafka.brokerlist: localhost:9092
|
openwifi.kafka.brokerlist: localhost:9092
|
||||||
openwifi.kafka.auto.commit: false
|
openwifi.kafka.auto.commit: false
|
||||||
openwifi.kafka.queue.buffering.max.ms: 50
|
openwifi.kafka.queue.buffering.max.ms: 50
|
||||||
|
openwifi.kafka.ssl.ca.location: ""
|
||||||
|
openwifi.kafka.ssl.certificate.location: ""
|
||||||
|
openwifi.kafka.ssl.key.location: ""
|
||||||
|
openwifi.kafka.ssl.key.password: ""
|
||||||
# Storage
|
# Storage
|
||||||
storage.type: sqlite # (sqlite|postgresql|mysql|odbc)
|
storage.type: sqlite # (sqlite|postgresql|mysql|odbc)
|
||||||
## SQLite
|
## SQLite
|
||||||
@@ -180,22 +191,9 @@ configProperties:
|
|||||||
openwifi.system.uri.ui: https://localhost
|
openwifi.system.uri.ui: https://localhost
|
||||||
openwifi.system.commandchannel: /tmp/app_owfms
|
openwifi.system.commandchannel: /tmp/app_owfms
|
||||||
# Logging
|
# Logging
|
||||||
logging.formatters.f1.class: PatternFormatter
|
logging.type: console
|
||||||
logging.formatters.f1.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
|
logging.path: $OWFMS_ROOT/logs
|
||||||
logging.formatters.f1.times: UTC
|
logging.level: debug
|
||||||
logging.channels.c1.class: ConsoleChannel
|
|
||||||
logging.channels.c1.formatter: f1
|
|
||||||
logging.channels.c2.class: FileChannel
|
|
||||||
logging.channels.c2.path: /tmp/log_owfms
|
|
||||||
logging.channels.c2.formatter.class: PatternFormatter
|
|
||||||
logging.channels.c2.formatter.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
|
|
||||||
logging.channels.c2.rotation: "20 M"
|
|
||||||
logging.channels.c2.archive: timestamp
|
|
||||||
logging.channels.c2.purgeCount: 20
|
|
||||||
logging.channels.c3.class: ConsoleChannel
|
|
||||||
logging.channels.c3.pattern: "%s: [%p] %t"
|
|
||||||
logging.loggers.root.channel: c1
|
|
||||||
logging.loggers.root.level: debug
|
|
||||||
|
|
||||||
# -> Secret part
|
# -> Secret part
|
||||||
# REST API
|
# REST API
|
||||||
@@ -212,6 +210,9 @@ configProperties:
|
|||||||
storage.type.mysql.username: stephb
|
storage.type.mysql.username: stephb
|
||||||
storage.type.mysql.password: snoopy99
|
storage.type.mysql.password: snoopy99
|
||||||
|
|
||||||
|
# NOTE: List of required certificates may be found in "certs" key. Alternative way to pass required certificates is to create external secret with all required certificates and set secret name in "existingCertsSecret" key. Details may be found in https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/chart#tldr
|
||||||
|
existingCertsSecret: ""
|
||||||
|
|
||||||
certs:
|
certs:
|
||||||
# restapi-ca.pem: ""
|
# restapi-ca.pem: ""
|
||||||
# restapi-cert.pem: ""
|
# restapi-cert.pem: ""
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ openapi: 3.0.1
|
|||||||
info:
|
info:
|
||||||
title: uCentral Firmware Service API
|
title: uCentral Firmware Service API
|
||||||
description: A process to manage new uCentral firmware distribution.
|
description: A process to manage new uCentral firmware distribution.
|
||||||
version: 2.0.0
|
version: 2.5.0
|
||||||
license:
|
license:
|
||||||
name: BSD3
|
name: BSD3
|
||||||
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
|
||||||
@@ -30,53 +30,13 @@ components:
|
|||||||
|
|
||||||
responses:
|
responses:
|
||||||
NotFound:
|
NotFound:
|
||||||
description: The specified resource was not found.
|
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/NotFound'
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
ErrorCode:
|
|
||||||
type: integer
|
|
||||||
ErrorDetails:
|
|
||||||
type: string
|
|
||||||
ErrorDescription:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
description: The requested does not have sufficient rights to perform the operation.
|
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/Unauthorized'
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
ErrorCode:
|
|
||||||
type: integer
|
|
||||||
enum:
|
|
||||||
- 0 # Success
|
|
||||||
- 1 # PASSWORD_CHANGE_REQUIRED,
|
|
||||||
- 2 # INVALID_CREDENTIALS,
|
|
||||||
- 3 # PASSWORD_ALREADY_USED,
|
|
||||||
- 4 # USERNAME_PENDING_VERIFICATION,
|
|
||||||
- 5 # PASSWORD_INVALID,
|
|
||||||
- 6 # INTERNAL_ERROR,
|
|
||||||
- 7 # ACCESS_DENIED,
|
|
||||||
- 8 # INVALID_TOKEN
|
|
||||||
ErrorDetails:
|
|
||||||
type: string
|
|
||||||
ErrorDescription:
|
|
||||||
type: string
|
|
||||||
|
|
||||||
Success:
|
Success:
|
||||||
description: The requested operation was performed.
|
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/Success'
|
||||||
content:
|
BadRequest:
|
||||||
application/json:
|
$ref: 'https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml#/components/responses/BadRequest'
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
Operation:
|
|
||||||
type: string
|
|
||||||
Details:
|
|
||||||
type: string
|
|
||||||
Code:
|
|
||||||
type: integer
|
|
||||||
|
|
||||||
schemas:
|
schemas:
|
||||||
FirmwareDetails:
|
FirmwareDetails:
|
||||||
@@ -135,6 +95,25 @@ components:
|
|||||||
items:
|
items:
|
||||||
$ref: '#/components/schemas/FirmwareDetails'
|
$ref: '#/components/schemas/FirmwareDetails'
|
||||||
|
|
||||||
|
DeviceCurrentInfo:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
serialNumber:
|
||||||
|
type: string
|
||||||
|
revision:
|
||||||
|
type: string
|
||||||
|
upgraded:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
|
||||||
|
DeviceCurrentInfoList:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
devices:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/DeviceCurrentInfo'
|
||||||
|
|
||||||
RevisionHistoryEntry:
|
RevisionHistoryEntry:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -252,6 +231,26 @@ components:
|
|||||||
totalSecondsOld:
|
totalSecondsOld:
|
||||||
$ref: '#/components/schemas/TagIntPairList'
|
$ref: '#/components/schemas/TagIntPairList'
|
||||||
|
|
||||||
|
DeviceInformation:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
serialNumber:
|
||||||
|
type: string
|
||||||
|
history:
|
||||||
|
$ref: '#/components/schemas/RevisionHistoryEntryList'
|
||||||
|
currentFirmware:
|
||||||
|
type: string
|
||||||
|
currentFirmwareDate:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
latestFirmware:
|
||||||
|
type: string
|
||||||
|
latestFirmwareDate:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
latestFirmwareAvailable:
|
||||||
|
type: boolean
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
##
|
##
|
||||||
## These are endpoints that all services in the uCentral stack must provide
|
## These are endpoints that all services in the uCentral stack must provide
|
||||||
@@ -450,9 +449,10 @@ paths:
|
|||||||
required: false
|
required: false
|
||||||
- in: query
|
- in: query
|
||||||
name: latestOnly
|
name: latestOnly
|
||||||
description: Return only the latest firwares
|
description: Return only the latest firmware
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
default: false
|
||||||
required: false
|
required: false
|
||||||
- in: query
|
- in: query
|
||||||
name: deviceType
|
name: deviceType
|
||||||
@@ -463,19 +463,28 @@ paths:
|
|||||||
name: revisionSet
|
name: revisionSet
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
default: false
|
||||||
required: false
|
required: false
|
||||||
- in: query
|
- in: query
|
||||||
name: deviceSet
|
name: deviceSet
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
required: false
|
required: false
|
||||||
|
- in: query
|
||||||
|
name: rcOnly
|
||||||
|
schema:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
required: false
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
description: List firmwares
|
description: List firmwares
|
||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/FirmwareDetailsList'
|
oneOf:
|
||||||
|
- $ref: '#/components/schemas/FirmwareDetailsList'
|
||||||
|
- $ref: '#/components/schemas/FirmwareDetails'
|
||||||
403:
|
403:
|
||||||
$ref: '#/components/responses/Unauthorized'
|
$ref: '#/components/responses/Unauthorized'
|
||||||
404:
|
404:
|
||||||
@@ -622,13 +631,31 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
required: false
|
required: false
|
||||||
|
- in: query
|
||||||
|
description: Return current device list and current firmware
|
||||||
|
name: currentList
|
||||||
|
schema:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
required: false
|
||||||
|
example: You must set {serialNumber} to 000000000000
|
||||||
|
- in: query
|
||||||
|
description: Return current device list and current firmware
|
||||||
|
name: unknownList
|
||||||
|
schema:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
required: false
|
||||||
|
example: You must set {serialNumber} to 000000000000
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
description: List of device history upgrade.
|
description: List of device history upgrade.
|
||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/RevisionHistoryEntryList'
|
oneOf:
|
||||||
|
- $ref: '#/components/schemas/RevisionHistoryEntryList'
|
||||||
|
- $ref: '#/components/schemas/DeviceCurrentInfoList'
|
||||||
403:
|
403:
|
||||||
$ref: '#/components/responses/Unauthorized'
|
$ref: '#/components/responses/Unauthorized'
|
||||||
404:
|
404:
|
||||||
@@ -783,6 +810,28 @@ paths:
|
|||||||
404:
|
404:
|
||||||
$ref: '#/components/responses/NotFound'
|
$ref: '#/components/responses/NotFound'
|
||||||
|
|
||||||
|
/deviceInformation/{serialNumber}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Device Information
|
||||||
|
summary: receive a repor on a single decide
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: serialNumber
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
aabbccdd1234
|
||||||
|
required: true
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
$ref: '#/components/schemas/DeviceInformation'
|
||||||
|
403:
|
||||||
|
$ref: '#/components/responses/Unauthorized'
|
||||||
|
404:
|
||||||
|
$ref: '#/components/responses/NotFound'
|
||||||
|
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
##
|
##
|
||||||
## These are endpoints that all services in the uCentral stack must provide
|
## These are endpoints that all services in the uCentral stack must provide
|
||||||
|
|||||||
1
overlays/curl/portfile.cmake
Normal file
1
overlays/curl/portfile.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
|
||||||
4
overlays/curl/vcpkg.json
Normal file
4
overlays/curl/vcpkg.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"name": "curl",
|
||||||
|
"version-string": "7.74.0-1.3+deb11u3"
|
||||||
|
}
|
||||||
1
overlays/openssl/portfile.cmake
Normal file
1
overlays/openssl/portfile.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
|
||||||
4
overlays/openssl/vcpkg.json
Normal file
4
overlays/openssl/vcpkg.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"name": "openssl",
|
||||||
|
"version-string": "1.1.1n-0+deb11u3"
|
||||||
|
}
|
||||||
1
overlays/zlib/portfile.cmake
Normal file
1
overlays/zlib/portfile.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
|
||||||
4
overlays/zlib/vcpkg.json
Normal file
4
overlays/zlib/vcpkg.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"name": "zlib",
|
||||||
|
"version-string": "1:1.2.11.dfsg-2+deb11u2"
|
||||||
|
}
|
||||||
@@ -35,6 +35,8 @@ openwifi.system.uri.private = https://localhost:17004
|
|||||||
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004
|
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004
|
||||||
openwifi.system.commandchannel = /tmp/app.owfms
|
openwifi.system.commandchannel = /tmp/app.owfms
|
||||||
openwifi.system.uri.ui = ucentral-ui.arilia.com
|
openwifi.system.uri.ui = ucentral-ui.arilia.com
|
||||||
|
openwifi.security.restapi.disable = false
|
||||||
|
|
||||||
firmwaredb.refresh = 1800
|
firmwaredb.refresh = 1800
|
||||||
firmwaredb.maxage = 90
|
firmwaredb.maxage = 90
|
||||||
|
|
||||||
@@ -68,6 +70,10 @@ openwifi.kafka.enable = true
|
|||||||
openwifi.kafka.brokerlist = a1.arilia.com:9092
|
openwifi.kafka.brokerlist = a1.arilia.com:9092
|
||||||
openwifi.kafka.auto.commit = false
|
openwifi.kafka.auto.commit = false
|
||||||
openwifi.kafka.queue.buffering.max.ms = 50
|
openwifi.kafka.queue.buffering.max.ms = 50
|
||||||
|
openwifi.kafka.ssl.ca.location =
|
||||||
|
openwifi.kafka.ssl.certificate.location =
|
||||||
|
openwifi.kafka.ssl.key.location =
|
||||||
|
openwifi.kafka.ssl.key.password =
|
||||||
|
|
||||||
#
|
#
|
||||||
# This section select which form of persistence you need
|
# This section select which form of persistence you need
|
||||||
@@ -108,37 +114,9 @@ storage.type.mysql.connectiontimeout = 60
|
|||||||
# Logging: please leave as is for now.
|
# Logging: please leave as is for now.
|
||||||
#
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
logging.formatters.f1.class = PatternFormatter
|
logging.type = file
|
||||||
logging.formatters.f1.pattern = %s: [%p] %t
|
logging.path = $OWFMS_ROOT/logs
|
||||||
logging.formatters.f1.times = UTC
|
logging.level = debug
|
||||||
logging.channels.c1.class = ConsoleChannel
|
|
||||||
logging.channels.c1.formatter = f1
|
|
||||||
|
|
||||||
# This is where the logs will be written. This path MUST exist
|
|
||||||
logging.channels.c2.class = FileChannel
|
|
||||||
logging.channels.c2.path = $OWFMS_ROOT/logs/log
|
|
||||||
logging.channels.c2.formatter.class = PatternFormatter
|
|
||||||
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
|
||||||
logging.channels.c2.rotation = 20 M
|
|
||||||
logging.channels.c2.archive = timestamp
|
|
||||||
logging.channels.c2.purgeCount = 20
|
|
||||||
logging.channels.c3.class = ConsoleChannel
|
|
||||||
logging.channels.c3.pattern = %s: [%p] %t
|
|
||||||
|
|
||||||
# External Channel
|
|
||||||
logging.loggers.root.channel = c2
|
|
||||||
logging.loggers.root.level = debug
|
|
||||||
|
|
||||||
# Inline Channel with PatternFormatter
|
|
||||||
# logging.loggers.l1.name = logger1
|
|
||||||
# logging.loggers.l1.channel.class = ConsoleChannel
|
|
||||||
# logging.loggers.l1.channel.pattern = %s: [%p] %t
|
|
||||||
# logging.loggers.l1.level = information
|
|
||||||
# SplitterChannel
|
|
||||||
# logging.channels.splitter.class = SplitterChannel
|
|
||||||
# logging.channels.splitter.channels = l1,l2
|
|
||||||
# logging.loggers.l2.name = logger2
|
|
||||||
# logging.loggers.l2.channel = splitter
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,8 +36,10 @@ openwifi.system.uri.private = ${SYSTEM_URI_PRIVATE}
|
|||||||
openwifi.system.uri.public = ${SYSTEM_URI_PUBLIC}
|
openwifi.system.uri.public = ${SYSTEM_URI_PUBLIC}
|
||||||
openwifi.system.commandchannel = /tmp/app.ucentralfms
|
openwifi.system.commandchannel = /tmp/app.ucentralfms
|
||||||
openwifi.system.uri.ui = ${SYSTEM_URI_UI}
|
openwifi.system.uri.ui = ${SYSTEM_URI_UI}
|
||||||
firmwaredb.refresh = 1800
|
openwifi.security.restapi.disable = ${SECURITY_RESTAPI_DISABLE}
|
||||||
firmwaredb.maxage = 90
|
|
||||||
|
firmwaredb.refresh = ${FIRMWAREDB_REFRESH}
|
||||||
|
firmwaredb.maxage = ${FIRMWAREDB_MAXAGE}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware Microservice Specific Section
|
# Firmware Microservice Specific Section
|
||||||
@@ -67,6 +69,10 @@ openwifi.kafka.enable = ${KAFKA_ENABLE}
|
|||||||
openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST}
|
openwifi.kafka.brokerlist = ${KAFKA_BROKERLIST}
|
||||||
openwifi.kafka.auto.commit = false
|
openwifi.kafka.auto.commit = false
|
||||||
openwifi.kafka.queue.buffering.max.ms = 50
|
openwifi.kafka.queue.buffering.max.ms = 50
|
||||||
|
openwifi.kafka.ssl.ca.location = ${KAFKA_SSL_CA_LOCATION}
|
||||||
|
openwifi.kafka.ssl.certificate.location = ${KAFKA_SSL_CERTIFICATE_LOCATION}
|
||||||
|
openwifi.kafka.ssl.key.location = ${KAFKA_SSL_KEY_LOCATION}
|
||||||
|
openwifi.kafka.ssl.key.password = ${KAFKA_SSL_KEY_PASSWORD}
|
||||||
|
|
||||||
#
|
#
|
||||||
# This section select which form of persistence you need
|
# This section select which form of persistence you need
|
||||||
@@ -104,37 +110,6 @@ storage.type.mysql.connectiontimeout = 60
|
|||||||
# Logging: please leave as is for now.
|
# Logging: please leave as is for now.
|
||||||
#
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
logging.formatters.f1.class = PatternFormatter
|
logging.type = console
|
||||||
logging.formatters.f1.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
logging.path = $OWFMS_ROOT/logs
|
||||||
logging.formatters.f1.times = UTC
|
logging.level = debug
|
||||||
logging.channels.c1.class = ConsoleChannel
|
|
||||||
logging.channels.c1.formatter = f1
|
|
||||||
|
|
||||||
# This is where the logs will be written. This path MUST exist
|
|
||||||
logging.channels.c2.class = FileChannel
|
|
||||||
logging.channels.c2.path = $OWFMS_ROOT/logs/log
|
|
||||||
logging.channels.c2.formatter.class = PatternFormatter
|
|
||||||
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
|
|
||||||
logging.channels.c2.rotation = 20 M
|
|
||||||
logging.channels.c2.archive = timestamp
|
|
||||||
logging.channels.c2.purgeCount = 20
|
|
||||||
logging.channels.c3.class = ConsoleChannel
|
|
||||||
logging.channels.c3.pattern = %s: [%p] %t
|
|
||||||
|
|
||||||
# External Channel
|
|
||||||
logging.loggers.root.channel = c1
|
|
||||||
logging.loggers.root.level = debug
|
|
||||||
|
|
||||||
# Inline Channel with PatternFormatter
|
|
||||||
# logging.loggers.l1.name = logger1
|
|
||||||
# logging.loggers.l1.channel.class = ConsoleChannel
|
|
||||||
# logging.loggers.l1.channel.pattern = %s: [%p] %t
|
|
||||||
# logging.loggers.l1.level = information
|
|
||||||
# SplitterChannel
|
|
||||||
# logging.channels.splitter.class = SplitterChannel
|
|
||||||
# logging.channels.splitter.channels = l1,l2
|
|
||||||
# logging.loggers.l2.name = logger2
|
|
||||||
# logging.loggers.l2.channel = splitter
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,29 +13,29 @@ then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${OWSEC}" == "" ]]
|
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
|
||||||
then
|
then
|
||||||
|
if [[ "${OWSEC}" == "" ]]
|
||||||
|
then
|
||||||
echo "You must set the variable OWSEC in order to use this script. Something like"
|
echo "You must set the variable OWSEC in order to use this script. Something like"
|
||||||
echo "OWSEC=security.isp.com:16001"
|
echo "OWSEC=security.isp.com:16001"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${OWSEC_USERNAME}" == "" ]]
|
if [[ "${OWSEC_USERNAME}" == "" ]]
|
||||||
then
|
then
|
||||||
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
|
echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
|
||||||
echo "OWSEC_USERNAME=tip@ucentral.com"
|
echo "OWSEC_USERNAME=tip@ucentral.com"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${OWSEC_PASSWORD}" == "" ]]
|
if [[ "${OWSEC_PASSWORD}" == "" ]]
|
||||||
then
|
then
|
||||||
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
|
echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
|
||||||
echo "OWSEC_PASSWORD=openwifi"
|
echo "OWSEC_PASSWORD=openwifi"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
|
|
||||||
then
|
|
||||||
# Get OAuth token from OWSEC and cache it or use cached one
|
# Get OAuth token from OWSEC and cache it or use cached one
|
||||||
payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
|
payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
|
||||||
if [[ -f "/tmp/token" ]]
|
if [[ -f "/tmp/token" ]]
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by stephane bourque on 2021-10-23.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
#include "RESTAPI/RESTAPI_firmwareHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_firmwaresHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_firmwareAgeHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_connectedDeviceHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_historyHandler.h"
|
|
||||||
#include "RESTAPI/RESTAPI_deviceReportHandler.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
|
||||||
|
|
||||||
Poco::Net::HTTPRequestHandler * RESTAPI_external_server(const char *Path, RESTAPIHandler::BindingMap &Bindings,
|
|
||||||
Poco::Logger & L, RESTAPI_GenericServer & S) {
|
|
||||||
return RESTAPI_Router<
|
|
||||||
RESTAPI_firmwaresHandler,
|
|
||||||
RESTAPI_firmwareHandler,
|
|
||||||
RESTAPI_system_command,
|
|
||||||
RESTAPI_firmwareAgeHandler,
|
|
||||||
RESTAPI_connectedDevicesHandler,
|
|
||||||
RESTAPI_connectedDeviceHandler,
|
|
||||||
RESTAPI_historyHandler,
|
|
||||||
RESTAPI_deviceReportHandler
|
|
||||||
>(Path,Bindings,L, S);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::Net::HTTPRequestHandler * RESTAPI_internal_server(const char *Path, RESTAPIHandler::BindingMap &Bindings,
|
|
||||||
Poco::Logger & L, RESTAPI_GenericServer & S) {
|
|
||||||
return RESTAPI_Router_I<
|
|
||||||
RESTAPI_firmwaresHandler,
|
|
||||||
RESTAPI_firmwareHandler,
|
|
||||||
RESTAPI_system_command,
|
|
||||||
RESTAPI_connectedDevicesHandler,
|
|
||||||
RESTAPI_connectedDeviceHandler
|
|
||||||
>(Path, Bindings, L, S);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,23 +8,34 @@
|
|||||||
#include "LatestFirmwareCache.h"
|
#include "LatestFirmwareCache.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
|
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int AutoUpdater::Start() {
|
int AutoUpdater::Start() {
|
||||||
Running_ = true;
|
poco_information(Logger(),"Starting...");
|
||||||
AutoUpdaterFrequency_ = MicroService::instance().ConfigGetInt("autoupdater.frequency",600);
|
AutoUpdaterEnabled_ = MicroServiceConfigGetBool("autoupdater.enabled", false);
|
||||||
AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false);
|
if(AutoUpdaterEnabled_) {
|
||||||
if(AutoUpdaterEnabled_)
|
Running_ = false;
|
||||||
Thr_.start(*this);
|
AutoUpdaterFrequency_ = MicroServiceConfigGetInt("autoupdater.frequency",600);
|
||||||
|
AutoUpdaterCallBack_ = std::make_unique<Poco::TimerCallback<AutoUpdater>>(*this, &AutoUpdater::onTimer);
|
||||||
|
Timer_.setStartInterval(5 * 60 * 1000); // first run in 5 minutes
|
||||||
|
Timer_.setPeriodicInterval(AutoUpdaterFrequency_ * 1000);
|
||||||
|
Timer_.start(*AutoUpdaterCallBack_);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::Stop() {
|
void AutoUpdater::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
Running_ = false;
|
Running_ = false;
|
||||||
if(AutoUpdaterEnabled_) {
|
if(AutoUpdaterEnabled_) {
|
||||||
Thr_.wakeUp();
|
Timer_.stop();
|
||||||
Thr_.join();
|
|
||||||
}
|
}
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::ToBeUpgraded(std::string serialNumber, std::string DeviceType) {
|
void AutoUpdater::ToBeUpgraded(std::string serialNumber, std::string DeviceType) {
|
||||||
@@ -34,31 +45,29 @@ namespace OpenWifi {
|
|||||||
Queue_.emplace_back(std::make_pair(std::move(serialNumber),std::move(DeviceType)));
|
Queue_.emplace_back(std::make_pair(std::move(serialNumber),std::move(DeviceType)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::run() {
|
void AutoUpdater::onTimer([[maybe_unused]] Poco::Timer & timer) {
|
||||||
while(Running_) {
|
Utils::SetThreadName("auto-updater");
|
||||||
Poco::Thread::trySleep(2000);
|
Running_ = true;
|
||||||
if(!Running_)
|
|
||||||
break;
|
|
||||||
std::unique_lock L(Mutex_);
|
std::unique_lock L(Mutex_);
|
||||||
while(!Queue_.empty() && Running_) {
|
while(!Queue_.empty() && Running_) {
|
||||||
auto Entry = Queue_.front();
|
auto Entry = Queue_.front();
|
||||||
Queue_.pop_front();
|
Queue_.pop_front();
|
||||||
try {
|
try {
|
||||||
Logger_.debug(Poco::format("Preparing to upgrade %s",Entry.first));
|
poco_debug(Logger(),fmt::format("Preparing to upgrade {}",Entry.first));
|
||||||
auto CacheEntry = Cache_.find(Entry.first);
|
auto CacheEntry = Cache_.find(Entry.first);
|
||||||
uint64_t Now = std::time(nullptr);
|
uint64_t now = Utils::Now();
|
||||||
std::string firmwareUpgrade;
|
std::string firmwareUpgrade;
|
||||||
bool firmwareRCOnly;
|
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-now)>300) {
|
||||||
if(CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck-Now)>300) {
|
|
||||||
// get the firmware settings for that device.
|
// get the firmware settings for that device.
|
||||||
SerialCache C;
|
SerialCache C;
|
||||||
C.LastCheck = Now;
|
C.LastCheck = now;
|
||||||
|
bool firmwareRCOnly;
|
||||||
if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
|
if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
|
||||||
Logger_.debug(Poco::format("Found firmware options for %s",Entry.first));
|
poco_debug(Logger(),fmt::format("Found firmware options for {}",Entry.first));
|
||||||
C.firmwareRCOnly = firmwareRCOnly;
|
C.firmwareRCOnly = firmwareRCOnly;
|
||||||
C.firmwareUpgrade = firmwareUpgrade;
|
C.firmwareUpgrade = firmwareUpgrade;
|
||||||
} else {
|
} else {
|
||||||
Logger_.debug(Poco::format("Found no firmware options for %s",Entry.first));
|
poco_debug(Logger(),fmt::format("Found no firmware options for {}",Entry.first));
|
||||||
C.firmwareRCOnly = firmwareRCOnly;
|
C.firmwareRCOnly = firmwareRCOnly;
|
||||||
C.firmwareUpgrade = firmwareUpgrade;
|
C.firmwareUpgrade = firmwareUpgrade;
|
||||||
}
|
}
|
||||||
@@ -68,7 +77,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(firmwareUpgrade=="no") {
|
if(firmwareUpgrade=="no") {
|
||||||
Logger_.information(Poco::format("Device %s not upgradable. Provisioning service settings.",Entry.first));
|
poco_information(Logger(),fmt::format("Device {} not upgradable. Provisioning service settings.",Entry.first));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,29 +85,28 @@ namespace OpenWifi {
|
|||||||
FMSObjects::Firmware fwDetails;
|
FMSObjects::Firmware fwDetails;
|
||||||
auto LF = LatestFirmwareCache()->FindLatestFirmware(Entry.second, fwEntry );
|
auto LF = LatestFirmwareCache()->FindLatestFirmware(Entry.second, fwEntry );
|
||||||
if(LF) {
|
if(LF) {
|
||||||
if(StorageService()->GetFirmware(fwEntry.Id,fwDetails)) {
|
if(StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id,fwDetails)) {
|
||||||
// send the command to upgrade this device...
|
// send the command to upgrade this device...
|
||||||
Logger_.information(Poco::format("Upgrading %s to version %s", Entry.first, fwEntry.Revision));
|
poco_information(Logger(),fmt::format("Upgrading {} to version {}", Entry.first, fwEntry.Revision));
|
||||||
if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
|
if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
|
||||||
Logger_.information(Poco::format("Upgrade command sent for %s",Entry.first));
|
poco_information(Logger(),fmt::format("Upgrade command sent for {}",Entry.first));
|
||||||
} else {
|
} else {
|
||||||
Logger_.information(Poco::format("Upgrade command not sent for %s",Entry.first));
|
poco_information(Logger(),fmt::format("Upgrade command not sent for {}",Entry.first));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger_.information(Poco::format("Firmware for device %s (%s) cannot be found.", Entry.first, Entry.second ));
|
poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger_.information(Poco::format("Firmware for device %s (%s) cannot be found.", Entry.first, Entry.second ));
|
poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
Logger_.information(Poco::format("Exception during auto update for device %s.", Entry.first ));
|
poco_information(Logger(),fmt::format("Exception during auto update for device {}.", Entry.first ));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoUpdater::reinitialize(Poco::Util::Application &self) {
|
void AutoUpdater::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
|
||||||
Logger_.information("Reinitializing.");
|
poco_information(Logger(),"Reinitializing.");
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,15 +2,17 @@
|
|||||||
// Created by stephane bourque on 2021-10-04.
|
// Created by stephane bourque on 2021-10-04.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef OWFMS_AUTOUPDATER_H
|
#pragma once
|
||||||
#define OWFMS_AUTOUPDATER_H
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
|
||||||
|
#include "framework/SubSystemServer.h"
|
||||||
#include "Poco/Util/Application.h"
|
#include "Poco/Util/Application.h"
|
||||||
|
#include "Poco/Timer.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class AutoUpdater : public SubSystemServer, Poco::Runnable {
|
|
||||||
|
class AutoUpdater : public SubSystemServer { // };, Poco::Runnable {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct SerialCache {
|
struct SerialCache {
|
||||||
@@ -19,14 +21,13 @@ class AutoUpdater : public SubSystemServer, Poco::Runnable {
|
|||||||
bool firmwareRCOnly=false;
|
bool firmwareRCOnly=false;
|
||||||
};
|
};
|
||||||
|
|
||||||
static AutoUpdater *instance() {
|
static auto instance() {
|
||||||
static AutoUpdater *instance_ = new AutoUpdater;
|
static auto instance_ = new AutoUpdater;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Start() override;
|
int Start() override;
|
||||||
void Stop() override;
|
void Stop() override;
|
||||||
void run() final;
|
|
||||||
void ToBeUpgraded(std::string serialNumber, std::string DeviceType);
|
void ToBeUpgraded(std::string serialNumber, std::string DeviceType);
|
||||||
inline void Reset() {
|
inline void Reset() {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
@@ -34,21 +35,23 @@ class AutoUpdater : public SubSystemServer, Poco::Runnable {
|
|||||||
Queue_.clear();
|
Queue_.clear();
|
||||||
}
|
}
|
||||||
void reinitialize(Poco::Util::Application &self) final;
|
void reinitialize(Poco::Util::Application &self) final;
|
||||||
|
void onTimer(Poco::Timer & timer);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::atomic_bool Running_=false;
|
std::atomic_bool Running_=false;
|
||||||
Poco::Thread Thr_;
|
|
||||||
std::map<std::string,SerialCache> Cache_;
|
std::map<std::string,SerialCache> Cache_;
|
||||||
std::deque<std::pair<std::string,std::string>> Queue_;
|
std::deque<std::pair<std::string,std::string>> Queue_;
|
||||||
uint64_t AutoUpdaterFrequency_=600;
|
uint64_t AutoUpdaterFrequency_=600;
|
||||||
bool AutoUpdaterEnabled_=true;
|
bool AutoUpdaterEnabled_=true;
|
||||||
|
Poco::Timer Timer_;
|
||||||
|
std::unique_ptr<Poco::TimerCallback<AutoUpdater>> AutoUpdaterCallBack_;
|
||||||
|
|
||||||
explicit AutoUpdater() noexcept:
|
explicit AutoUpdater() noexcept:
|
||||||
SubSystemServer("AutoUpdater", "AUTO-UPDATER", "autoupdater")
|
SubSystemServer("AutoUpdater", "AUTO-UPDATER", "autoupdater")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline AutoUpdater * AutoUpdater() { return AutoUpdater::instance(); }
|
inline auto AutoUpdater() { return AutoUpdater::instance(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //OWFMS_AUTOUPDATER_H
|
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
#include "DeviceCache.h"
|
#include "DeviceCache.h"
|
||||||
#include "FirmwareCache.h"
|
#include "FirmwareCache.h"
|
||||||
#include "AutoUpdater.h"
|
#include "AutoUpdater.h"
|
||||||
|
#include "NewCommandHandler.h"
|
||||||
|
|
||||||
|
#include "framework/UI_WebSocketClientServer.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class Daemon *Daemon::instance_ = nullptr;
|
class Daemon *Daemon::instance_ = nullptr;
|
||||||
@@ -35,19 +38,21 @@ namespace OpenWifi {
|
|||||||
DeviceCache(),
|
DeviceCache(),
|
||||||
NewConnectionHandler(),
|
NewConnectionHandler(),
|
||||||
ManifestCreator(),
|
ManifestCreator(),
|
||||||
AutoUpdater()
|
AutoUpdater(),
|
||||||
|
NewCommandHandler(),
|
||||||
|
UI_WebSocketClientServer()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Daemon::initialize(Poco::Util::Application &self) {
|
void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {
|
||||||
MicroService::initialize(*this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MicroServicePostInitialization() {
|
void DaemonPostInitialization(Poco::Util::Application &self) {
|
||||||
|
Daemon()->PostInitialization(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|||||||
18
src/Daemon.h
18
src/Daemon.h
@@ -7,16 +7,18 @@
|
|||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/MicroService.h"
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
#include "framework/MicroServiceNames.h"
|
||||||
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "Dashboard.h"
|
#include "Dashboard.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
static const char * vDAEMON_PROPERTIES_FILENAME = "owfms.properties";
|
[[maybe_unused]] static const char * vDAEMON_PROPERTIES_FILENAME = "owfms.properties";
|
||||||
static const char * vDAEMON_ROOT_ENV_VAR = "OWFMS_ROOT";
|
[[maybe_unused]] static const char * vDAEMON_ROOT_ENV_VAR = "OWFMS_ROOT";
|
||||||
static const char * vDAEMON_CONFIG_ENV_VAR = "OWFMS_CONFIG";
|
[[maybe_unused]] static const char * vDAEMON_CONFIG_ENV_VAR = "OWFMS_CONFIG";
|
||||||
static const char * vDAEMON_APP_NAME = uSERVICE_FIRMWARE.c_str();
|
[[maybe_unused]] static const char * vDAEMON_APP_NAME = uSERVICE_FIRMWARE.c_str();
|
||||||
static const uint64_t vDAEMON_BUS_TIMER = 10000;
|
[[maybe_unused]] static const uint64_t vDAEMON_BUS_TIMER = 10000;
|
||||||
|
|
||||||
class Daemon : public MicroService {
|
class Daemon : public MicroService {
|
||||||
public:
|
public:
|
||||||
@@ -28,11 +30,9 @@ namespace OpenWifi {
|
|||||||
const SubSystemVec & SubSystems) :
|
const SubSystemVec & SubSystems) :
|
||||||
MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
|
MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
|
||||||
|
|
||||||
void initialize(Poco::Util::Application &self);
|
void PostInitialization(Poco::Util::Application &self);
|
||||||
static Daemon *instance();
|
static Daemon *instance();
|
||||||
inline void ResetDashboard() { DB_.Reset(); }
|
inline DeviceDashboard & GetDashboard() { return DB_; }
|
||||||
inline void CreateDashboard() { DB_.Create(); }
|
|
||||||
inline const FMSObjects::DeviceReport & GetDashboard() { return DB_.Report(); }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Daemon *instance_;
|
static Daemon *instance_;
|
||||||
|
|||||||
@@ -4,15 +4,48 @@
|
|||||||
|
|
||||||
#include "Dashboard.h"
|
#include "Dashboard.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void DeviceDashboard::Create() {
|
|
||||||
uint64_t Now = std::time(nullptr);
|
|
||||||
|
|
||||||
if(LastRun_==0 || (Now-LastRun_)>120) {
|
bool DeviceDashboard::Get(FMSObjects::DeviceReport &D, Poco::Logger & Logger) {
|
||||||
DB_.reset();
|
uint64_t Now = Utils::Now();
|
||||||
StorageService()->GenerateDeviceReport(DB_);
|
if(!ValidDashboard_ || LastRun_==0 || (Now-LastRun_)>120) {
|
||||||
LastRun_ = Now;
|
Generate(D, Logger);
|
||||||
|
} else {
|
||||||
|
std::lock_guard G(DataMutex_);
|
||||||
|
D = DB_;
|
||||||
|
}
|
||||||
|
return ValidDashboard_;
|
||||||
|
};
|
||||||
|
|
||||||
|
void DeviceDashboard::Generate(FMSObjects::DeviceReport &D, Poco::Logger & Logger ) {
|
||||||
|
if (GeneratingDashboard_.load()) {
|
||||||
|
// std::cout << "Trying to generate dashboard but already being generated" << std::endl;
|
||||||
|
while(GeneratingDashboard_.load()) {
|
||||||
|
Poco::Thread::trySleep(100);
|
||||||
|
}
|
||||||
|
std::lock_guard G(DataMutex_);
|
||||||
|
D = DB_;
|
||||||
|
} else {
|
||||||
|
GeneratingDashboard_ = true;
|
||||||
|
ValidDashboard_ = false;
|
||||||
|
try {
|
||||||
|
// std::cout << "Generating dashboard." << std::endl;
|
||||||
|
poco_information(Logger, "DASHBOARD: Generating a new dashboard.");
|
||||||
|
FMSObjects::DeviceReport NewData;
|
||||||
|
StorageService()->DevicesDB().GenerateDeviceReport(NewData);
|
||||||
|
LastRun_ = Utils::Now();
|
||||||
|
NewData.snapshot = LastRun_;
|
||||||
|
D = NewData;
|
||||||
|
std::lock_guard G(DataMutex_);
|
||||||
|
DB_ = NewData;
|
||||||
|
ValidDashboard_=true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
GeneratingDashboard_ = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,22 +2,26 @@
|
|||||||
// Created by stephane bourque on 2021-07-21.
|
// Created by stephane bourque on 2021-07-21.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALGW_DASHBOARD_H
|
#pragma once
|
||||||
#define UCENTRALGW_DASHBOARD_H
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
|
#include "Poco/Logger.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class DeviceDashboard {
|
class DeviceDashboard {
|
||||||
public:
|
public:
|
||||||
void Create();
|
bool Get(FMSObjects::DeviceReport &D, Poco::Logger &Logger);
|
||||||
const FMSObjects::DeviceReport & Report() const { return DB_;}
|
|
||||||
inline void Reset() { LastRun_=0; DB_.reset(); }
|
|
||||||
private:
|
private:
|
||||||
|
std::mutex DataMutex_;
|
||||||
|
volatile std::atomic_bool GeneratingDashboard_ = false;
|
||||||
|
volatile bool ValidDashboard_ = false;
|
||||||
FMSObjects::DeviceReport DB_;
|
FMSObjects::DeviceReport DB_;
|
||||||
uint64_t LastRun_=0;
|
uint64_t LastRun_ = 0;
|
||||||
|
|
||||||
|
void Generate(FMSObjects::DeviceReport &D, Poco::Logger &Logger);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // UCENTRALGW_DASHBOARD_H
|
|
||||||
|
|||||||
@@ -7,10 +7,13 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int DeviceCache::Start() {
|
int DeviceCache::Start() {
|
||||||
|
poco_information(Logger(),"Starting...");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceCache::Stop() {
|
void DeviceCache::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceCache::AddToCache(
|
void DeviceCache::AddToCache(
|
||||||
|
|||||||
@@ -2,11 +2,10 @@
|
|||||||
// Created by stephane bourque on 2021-07-13.
|
// Created by stephane bourque on 2021-07-13.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_DEVICECACHE_H
|
#pragma once
|
||||||
#define UCENTRALFMS_DEVICECACHE_H
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "framework/MicroService.h"
|
#include "framework/SubSystemServer.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -19,8 +18,8 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class DeviceCache : public SubSystemServer {
|
class DeviceCache : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static DeviceCache *instance() {
|
static auto instance() {
|
||||||
static DeviceCache *instance_ = new DeviceCache;
|
static auto instance_ = new DeviceCache;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,9 +39,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline DeviceCache * DeviceCache() { return DeviceCache::instance(); }
|
inline auto DeviceCache() { return DeviceCache::instance(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //UCENTRALFMS_DEVICECACHE_H
|
|
||||||
|
|||||||
@@ -7,18 +7,20 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int FirmwareCache::Start() {
|
int FirmwareCache::Start() {
|
||||||
|
poco_information(Logger(),"Starting...");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareCache::Stop() {
|
void FirmwareCache::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision) {
|
std::shared_ptr<FMSObjects::Firmware> GetFirmware([[maybe_unused]] const std::string & DeviceType, [[maybe_unused]] const std::string & Revision) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F) {
|
std::shared_ptr<FMSObjects::Firmware> AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,13 @@
|
|||||||
// Created by stephane bourque on 2021-07-26.
|
// Created by stephane bourque on 2021-07-26.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_FIRMWARECACHE_H
|
#pragma once
|
||||||
#define UCENTRALFMS_FIRMWARECACHE_H
|
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "framework/MicroService.h"
|
#include "framework/SubSystemServer.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -17,8 +16,8 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
class FirmwareCache: public SubSystemServer {
|
class FirmwareCache: public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static FirmwareCache *instance() {
|
static auto instance() {
|
||||||
static FirmwareCache *instance_= new FirmwareCache;
|
static auto instance_= new FirmwareCache;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,7 +27,6 @@ namespace OpenWifi {
|
|||||||
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision);
|
std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision);
|
||||||
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
|
std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::atomic_bool Running_=false;
|
std::atomic_bool Running_=false;
|
||||||
FirmwareCacheMap Cache_;
|
FirmwareCacheMap Cache_;
|
||||||
@@ -38,9 +36,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline FirmwareCache * FirmwareCache() { return FirmwareCache::instance(); }
|
inline auto FirmwareCache() { return FirmwareCache::instance(); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //UCENTRALFMS_FIRMWARECACHE_H
|
|
||||||
|
|||||||
@@ -8,11 +8,14 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int LatestFirmwareCache::Start() {
|
int LatestFirmwareCache::Start() {
|
||||||
StorageService()->PopulateLatestFirmwareCache();
|
poco_information(Logger(),"Starting...");
|
||||||
|
StorageService()->FirmwaresDB().PopulateLatestFirmwareCache();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LatestFirmwareCache::Stop() {
|
void LatestFirmwareCache::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LatestFirmwareCache::AddToCache(const std::string & DeviceType, const std::string &Revision, const std::string &Id, uint64_t TimeStamp) {
|
bool LatestFirmwareCache::AddToCache(const std::string & DeviceType, const std::string &Revision, const std::string &Id, uint64_t TimeStamp) {
|
||||||
@@ -20,14 +23,26 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
RevisionSet_.insert(Revision);
|
RevisionSet_.insert(Revision);
|
||||||
DeviceSet_.insert(DeviceType);
|
DeviceSet_.insert(DeviceType);
|
||||||
|
|
||||||
auto E = Cache_.find(DeviceType);
|
auto E = Cache_.find(DeviceType);
|
||||||
if((E==Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
|
if((E==Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
|
||||||
Cache_[DeviceType] = LatestFirmwareCacheEntry{ .Id=Id,
|
Cache_[DeviceType] = LatestFirmwareCacheEntry{
|
||||||
|
.Id=Id,
|
||||||
.TimeStamp=TimeStamp,
|
.TimeStamp=TimeStamp,
|
||||||
.Revision=Revision};
|
.Revision=Revision};
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
if(!IsRC(Revision))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
auto rcE = rcCache_.find(DeviceType);
|
||||||
|
if((rcE==rcCache_.end()) || (TimeStamp >= rcE->second.TimeStamp)) {
|
||||||
|
rcCache_[DeviceType] = LatestFirmwareCacheEntry{
|
||||||
|
.Id=Id,
|
||||||
|
.TimeStamp=TimeStamp,
|
||||||
|
.Revision=Revision};
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
|
bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
|
||||||
@@ -38,10 +53,21 @@ namespace OpenWifi {
|
|||||||
Entry = E->second;
|
Entry = E->second;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
|
||||||
|
auto E=rcCache_.find(DeviceType);
|
||||||
|
if(E!=rcCache_.end()) {
|
||||||
|
Entry = E->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
|
bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
|
|
||||||
@@ -52,6 +78,16 @@ namespace OpenWifi {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
|
||||||
|
auto E=rcCache_.find(DeviceType);
|
||||||
|
if(E!=rcCache_.end()) {
|
||||||
|
return E->second.Revision==Revision;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LatestFirmwareCache::DumpCache() {
|
void LatestFirmwareCache::DumpCache() {
|
||||||
std::lock_guard G(Mutex_);
|
std::lock_guard G(Mutex_);
|
||||||
|
|||||||
@@ -2,16 +2,17 @@
|
|||||||
// Created by stephane bourque on 2021-07-13.
|
// Created by stephane bourque on 2021-07-13.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_LATESTFIRMWARECACHE_H
|
#pragma once
|
||||||
#define UCENTRALFMS_LATESTFIRMWARECACHE_H
|
|
||||||
|
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Poco/Net/HTTPServerRequest.h"
|
#include "Poco/Net/HTTPServerRequest.h"
|
||||||
#include "Poco/Net/HTTPServerResponse.h"
|
#include "Poco/Net/HTTPServerResponse.h"
|
||||||
#include "Poco/JWT/Signer.h"
|
#include "Poco/JWT/Signer.h"
|
||||||
#include "Poco/SHA2Engine.h"
|
#include "Poco/SHA2Engine.h"
|
||||||
|
#include "Poco/StringTokenizer.h"
|
||||||
|
|
||||||
#include "RESTObjects/RESTAPI_SecurityObjects.h"
|
#include "RESTObjects/RESTAPI_SecurityObjects.h"
|
||||||
#include "framework/MicroService.h"
|
#include "framework/SubSystemServer.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -21,11 +22,12 @@ namespace OpenWifi {
|
|||||||
std::string Revision;
|
std::string Revision;
|
||||||
};
|
};
|
||||||
typedef std::map<std::string, LatestFirmwareCacheEntry> LatestFirmwareCacheMap;
|
typedef std::map<std::string, LatestFirmwareCacheEntry> LatestFirmwareCacheMap;
|
||||||
|
typedef std::map<std::string, LatestFirmwareCacheEntry> rcOnlyLatestFirmwareCacheMap;
|
||||||
|
|
||||||
class LatestFirmwareCache : public SubSystemServer {
|
class LatestFirmwareCache : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static LatestFirmwareCache *instance() {
|
static auto instance() {
|
||||||
static LatestFirmwareCache *instance_ = new LatestFirmwareCache;
|
static auto instance_ = new LatestFirmwareCache;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,23 +36,32 @@ namespace OpenWifi {
|
|||||||
bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp);
|
bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp);
|
||||||
// void AddRevision(const std::string &Revision);
|
// void AddRevision(const std::string &Revision);
|
||||||
bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
|
bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
|
||||||
|
bool FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
|
||||||
|
|
||||||
|
inline static bool IsRC(const std::string & Revision) {
|
||||||
|
// OpenWrt 21.02-SNAPSHOT r16399+120-c67509efd7 / TIP-v2.5.0-36b5478
|
||||||
|
auto Tokens = Poco::StringTokenizer(Revision,"/", Poco::StringTokenizer::TOK_TRIM);
|
||||||
|
if(Tokens.count()!=2)
|
||||||
|
return false;
|
||||||
|
return (Tokens[1].substr(0,5) == "TIP-v");
|
||||||
|
}
|
||||||
|
|
||||||
void DumpCache();
|
void DumpCache();
|
||||||
inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; };
|
inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; };
|
||||||
inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; };
|
inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; };
|
||||||
bool IsLatest(const std::string &DeviceType, const std::string &Revision);
|
bool IsLatest(const std::string &DeviceType, const std::string &Revision);
|
||||||
|
bool IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LatestFirmwareCacheMap Cache_;
|
LatestFirmwareCacheMap Cache_;
|
||||||
|
rcOnlyLatestFirmwareCacheMap rcCache_;
|
||||||
Types::StringSet RevisionSet_;
|
Types::StringSet RevisionSet_;
|
||||||
Types::StringSet DeviceSet_;
|
Types::StringSet DeviceSet_;
|
||||||
explicit LatestFirmwareCache() noexcept:
|
explicit LatestFirmwareCache() noexcept:
|
||||||
SubSystemServer("FirmwareCache", "FIRMWARE-CACHE", "FirmwareCache")
|
SubSystemServer("LatestFirmwareCache", "LATEST-FIRMWARE-CACHE", "LatestFirmwareCache")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline LatestFirmwareCache * LatestFirmwareCache() { return LatestFirmwareCache::instance(); }
|
inline auto LatestFirmwareCache() { return LatestFirmwareCache::instance(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //UCENTRALFMS_LATESTFIRMWARECACHE_H
|
|
||||||
|
|||||||
@@ -14,32 +14,25 @@
|
|||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "LatestFirmwareCache.h"
|
#include "LatestFirmwareCache.h"
|
||||||
|
|
||||||
|
#include "framework/utils.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
void ManifestCreator::run() {
|
void ManifestCreator::onTimer([[maybe_unused]] Poco::Timer &timer) {
|
||||||
Running_ = true;
|
Utils::SetThreadName("manifest");
|
||||||
bool FirstRun = true;
|
poco_information(Logger(),"Performing DB refresh");
|
||||||
|
|
||||||
while(Running_) {
|
|
||||||
Poco::Thread::trySleep(FirstRun ? 10000 : DBRefresh_*1000);
|
|
||||||
if(!Running_)
|
|
||||||
break;
|
|
||||||
FirstRun = false;
|
|
||||||
Logger_.information("Performing DB refresh");
|
|
||||||
S3BucketContent BucketList;
|
S3BucketContent BucketList;
|
||||||
StorageService()->RemoveOldFirmware();
|
StorageService()->FirmwaresDB().RemoveOldFirmware();
|
||||||
ReadBucket(BucketList);
|
ReadBucket(BucketList);
|
||||||
if(!Running_)
|
poco_information(Logger(),fmt::format("Found {} firmware entries in S3 repository.", BucketList.size()));
|
||||||
break;
|
|
||||||
Logger_.information(Poco::format("Found %Lu firmware entries in S3 repository.",(uint64_t)BucketList.size()));
|
|
||||||
ComputeManifest(BucketList);
|
ComputeManifest(BucketList);
|
||||||
AddManifestToDB(BucketList);
|
AddManifestToDB(BucketList);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
|
bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
|
||||||
|
|
||||||
uint64_t Limit = std::time(nullptr) - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0;
|
uint64_t Limit = Utils::Now() - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0;
|
||||||
for(auto &[Name,Entry]:BucketContent) {
|
for(auto &[Name,Entry]:BucketContent) {
|
||||||
std::string C = Entry.S3ContentManifest;
|
std::string C = Entry.S3ContentManifest;
|
||||||
|
|
||||||
@@ -59,7 +52,7 @@ namespace OpenWifi {
|
|||||||
Entry.Image = ParsedContent->get("image").toString();
|
Entry.Image = ParsedContent->get("image").toString();
|
||||||
auto FullNme = Name + "-upgrade.bin";
|
auto FullNme = Name + "-upgrade.bin";
|
||||||
if(FullNme!=Entry.Image) {
|
if(FullNme!=Entry.Image) {
|
||||||
Logger_.error(Poco::format("MANIFEST(%s): Image name does not match manifest name (%s).",Name,Entry.Image));
|
poco_error(Logger(),fmt::format("MANIFEST({}): Image name does not match manifest name ({}).",Name,Entry.Image));
|
||||||
Entry.Valid = false;
|
Entry.Valid = false;
|
||||||
BadFormat++;
|
BadFormat++;
|
||||||
continue;
|
continue;
|
||||||
@@ -71,19 +64,19 @@ namespace OpenWifi {
|
|||||||
Entry.Valid = false;
|
Entry.Valid = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger_.error(Poco::format("MANIFEST(%s): Entry does not have a valid JSON manifest.",Name));
|
poco_error(Logger(),fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.",Name));
|
||||||
MissingJson++;
|
MissingJson++;
|
||||||
Entry.Valid = false;
|
Entry.Valid = false;
|
||||||
}
|
}
|
||||||
} catch (const Poco::Exception &E ) {
|
} catch (const Poco::Exception &E ) {
|
||||||
Logger_.log(E);
|
Logger().log(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger_.information(Poco::format("Accepted %Lu firmwares.", Accepted));
|
poco_information(Logger(),fmt::format("Accepted {} firmwares.", Accepted));
|
||||||
Logger_.information(Poco::format("Rejected %Lu too old firmwares.", Rejected));
|
poco_information(Logger(),fmt::format("Rejected {} too old firmwares.", Rejected));
|
||||||
Logger_.information(Poco::format("Rejected %Lu bad JSON.", BadFormat));
|
poco_information(Logger(),fmt::format("Rejected {} bad JSON.", BadFormat));
|
||||||
Logger_.information(Poco::format("Rejected %Lu missing JSON.", MissingJson));
|
poco_information(Logger(),fmt::format("Rejected {} missing JSON.", MissingJson));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -98,18 +91,18 @@ namespace OpenWifi {
|
|||||||
if(BucketEntry.URI.find("-staging-")!=std::string::npos)
|
if(BucketEntry.URI.find("-staging-")!=std::string::npos)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(BucketEntry.Valid && !StorageService()->GetFirmwareByName(R,BucketEntry.Compatible,F)) {
|
if(BucketEntry.Valid && !StorageService()->FirmwaresDB().GetFirmwareByName(R,BucketEntry.Compatible,F)) {
|
||||||
F.id = MicroService::instance().CreateUUID();
|
F.id = MicroServiceCreateUUID();
|
||||||
F.release = Release;
|
F.release = Release;
|
||||||
F.size = BucketEntry.S3Size;
|
F.size = BucketEntry.S3Size;
|
||||||
F.created = std::time(nullptr);
|
F.created = Utils::Now();
|
||||||
F.imageDate = BucketEntry.S3TimeStamp;
|
F.imageDate = BucketEntry.S3TimeStamp;
|
||||||
F.image = BucketEntry.S3Name;
|
F.image = BucketEntry.Image;
|
||||||
F.uri = BucketEntry.URI;
|
F.uri = BucketEntry.URI;
|
||||||
F.revision = BucketEntry.Revision;
|
F.revision = BucketEntry.Revision;
|
||||||
F.deviceType = BucketEntry.Compatible;
|
F.deviceType = BucketEntry.Compatible;
|
||||||
if(StorageService()->AddFirmware(F)) {
|
if(StorageService()->FirmwaresDB().AddFirmware(F)) {
|
||||||
Logger_.information(Poco::format("Adding firmware '%s'",Release));
|
poco_information(Logger(),fmt::format("Adding firmware '{}', size={}",Release,F.size));
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,14 +111,15 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ManifestCreator::Start() {
|
int ManifestCreator::Start() {
|
||||||
S3BucketName_ = MicroService::instance().ConfigGetString("s3.bucketname");
|
Running_ = true;
|
||||||
S3Region_ = MicroService::instance().ConfigGetString("s3.region");
|
S3BucketName_ = MicroServiceConfigGetString("s3.bucketname","");
|
||||||
S3Secret_ = MicroService::instance().ConfigGetString("s3.secret");
|
S3Region_ = MicroServiceConfigGetString("s3.region","");
|
||||||
S3Key_ = MicroService::instance().ConfigGetString("s3.key");
|
S3Secret_ = MicroServiceConfigGetString("s3.secret","");
|
||||||
S3Retry_ = MicroService::instance().ConfigGetInt("s3.retry",60);
|
S3Key_ = MicroServiceConfigGetString("s3.key","");
|
||||||
|
S3Retry_ = MicroServiceConfigGetInt("s3.retry",60);
|
||||||
|
|
||||||
DBRefresh_ = MicroService::instance().ConfigGetInt("firmwaredb.refresh",30*60);
|
DBRefresh_ = MicroServiceConfigGetInt("firmwaredb.refresh",30*60);
|
||||||
MaxAge_ = MicroService::instance().ConfigGetInt("firmwaredb.maxage",90) * 24 * 60 * 60;
|
MaxAge_ = MicroServiceConfigGetInt("firmwaredb.maxage",90) * 24 * 60 * 60;
|
||||||
|
|
||||||
AwsConfig_.enableTcpKeepAlive = true;
|
AwsConfig_.enableTcpKeepAlive = true;
|
||||||
AwsConfig_.enableEndpointDiscovery = true;
|
AwsConfig_.enableEndpointDiscovery = true;
|
||||||
@@ -135,23 +129,21 @@ namespace OpenWifi {
|
|||||||
AwsCreds_.SetAWSAccessKeyId(S3Key_);
|
AwsCreds_.SetAWSAccessKeyId(S3Key_);
|
||||||
AwsCreds_.SetAWSSecretKey(S3Secret_);
|
AwsCreds_.SetAWSSecretKey(S3Secret_);
|
||||||
|
|
||||||
Worker_.start(*this);
|
ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(*this, &ManifestCreator::onTimer);
|
||||||
|
Timer_.setStartInterval(1 * 60 * 1000); // first run in 1 minutes
|
||||||
|
Timer_.setPeriodicInterval((long)(DBRefresh_ * 1000));
|
||||||
|
Timer_.start(*ManifestCreatorCallBack_);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManifestCreator::Stop() {
|
void ManifestCreator::Stop() {
|
||||||
if(Running_) {
|
if(Running_) {
|
||||||
Running_ = false;
|
Running_ = false;
|
||||||
Worker_.wakeUp();
|
Timer_.stop();
|
||||||
Worker_.join();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ManifestCreator::Update() {
|
|
||||||
Worker_.wakeUp();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ManifestCreator::CloseBucket() {
|
void ManifestCreator::CloseBucket() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +172,7 @@ namespace OpenWifi {
|
|||||||
static const std::string UPGRADE("-upgrade.bin");
|
static const std::string UPGRADE("-upgrade.bin");
|
||||||
|
|
||||||
std::string URIBase = "https://";
|
std::string URIBase = "https://";
|
||||||
URIBase += MicroService::instance().ConfigGetString("s3.bucket.uri");
|
URIBase += MicroServiceConfigGetString("s3.bucket.uri","");
|
||||||
|
|
||||||
Bucket.clear();
|
Bucket.clear();
|
||||||
|
|
||||||
@@ -196,7 +188,7 @@ namespace OpenWifi {
|
|||||||
while(!isDone) {
|
while(!isDone) {
|
||||||
Outcome = S3Client.ListObjectsV2(Request);
|
Outcome = S3Client.ListObjectsV2(Request);
|
||||||
if(!Outcome.IsSuccess()) {
|
if(!Outcome.IsSuccess()) {
|
||||||
Logger_.error(Poco::format("Error while doing ListObjectsV2: %s, %s",
|
poco_error(Logger(),fmt::format("Error while doing ListObjectsV2: {}, {}",
|
||||||
std::string{Outcome.GetError().GetExceptionName()},
|
std::string{Outcome.GetError().GetExceptionName()},
|
||||||
std::string{Outcome.GetError().GetMessage()}));
|
std::string{Outcome.GetError().GetMessage()}));
|
||||||
return false;
|
return false;
|
||||||
@@ -236,11 +228,16 @@ namespace OpenWifi {
|
|||||||
It->second.S3ContentManifest = Content;
|
It->second.S3ContentManifest = Content;
|
||||||
} else {
|
} else {
|
||||||
Bucket.emplace(Release, S3BucketEntry{
|
Bucket.emplace(Release, S3BucketEntry{
|
||||||
|
.Valid = false,
|
||||||
|
.S3Name = "",
|
||||||
.S3ContentManifest = Content,
|
.S3ContentManifest = Content,
|
||||||
|
.S3TimeStamp = 0 ,
|
||||||
|
.S3Size = 0 ,
|
||||||
.Revision = Revision,
|
.Revision = Revision,
|
||||||
.Image = Image,
|
.Image = Image,
|
||||||
.Compatible = Compatible,
|
.Compatible = Compatible,
|
||||||
.Timestamp = TimeStamp});
|
.Timestamp = TimeStamp,
|
||||||
|
.URI = ""});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,10 +254,17 @@ namespace OpenWifi {
|
|||||||
It->second.S3Name = ReleaseName;
|
It->second.S3Name = ReleaseName;
|
||||||
It->second.URI = URI;
|
It->second.URI = URI;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Bucket.emplace(ReleaseName, S3BucketEntry{
|
Bucket.emplace(ReleaseName, S3BucketEntry{
|
||||||
.S3Name = ReleaseName,
|
.Valid = false,
|
||||||
|
.S3Name = "",
|
||||||
|
.S3ContentManifest = "",
|
||||||
.S3TimeStamp = S3TimeStamp,
|
.S3TimeStamp = S3TimeStamp,
|
||||||
.S3Size = S3Size,
|
.S3Size = S3Size ,
|
||||||
|
.Revision = "",
|
||||||
|
.Image = "",
|
||||||
|
.Compatible = "",
|
||||||
|
.Timestamp = 0 ,
|
||||||
.URI = URI});
|
.URI = URI});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -280,7 +284,7 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
// std::cout << "Count:" << Count << " Runs:" << Runs << std::endl;
|
// std::cout << "Count:" << Count << " Runs:" << Runs << std::endl;
|
||||||
if(!Outcome.IsSuccess()) {
|
if(!Outcome.IsSuccess()) {
|
||||||
Logger_.error(Poco::format("Error while doing ListObjectsV2: %s, %s",
|
poco_error(Logger(),fmt::format("Error while doing ListObjectsV2: {}, {}",
|
||||||
std::string{Outcome.GetError().GetExceptionName()},
|
std::string{Outcome.GetError().GetExceptionName()},
|
||||||
std::string{Outcome.GetError().GetMessage()}));
|
std::string{Outcome.GetError().GetMessage()}));
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
// Created by stephane bourque on 2021-06-02.
|
// Created by stephane bourque on 2021-06-02.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFWS_MANIFESTCREATOR_H
|
#pragma once
|
||||||
#define UCENTRALFWS_MANIFESTCREATOR_H
|
|
||||||
|
|
||||||
#include <aws/core/Aws.h>
|
#include <aws/core/Aws.h>
|
||||||
#include <aws/s3/S3Client.h>
|
#include <aws/s3/S3Client.h>
|
||||||
#include <aws/core/auth/AWSCredentials.h>
|
#include <aws/core/auth/AWSCredentials.h>
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/SubSystemServer.h"
|
||||||
|
#include "Poco/Timer.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -28,17 +28,15 @@ namespace OpenWifi {
|
|||||||
};
|
};
|
||||||
typedef std::map<const std::string, S3BucketEntry> S3BucketContent;
|
typedef std::map<const std::string, S3BucketEntry> S3BucketContent;
|
||||||
|
|
||||||
class ManifestCreator : public SubSystemServer, Poco::Runnable {
|
class ManifestCreator : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
static ManifestCreator *instance() {
|
static auto instance() {
|
||||||
static ManifestCreator *instance_ = new ManifestCreator;
|
static auto instance_ = new ManifestCreator;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void run() override;
|
|
||||||
int Start() override;
|
int Start() override;
|
||||||
void Stop() override;
|
void Stop() override;
|
||||||
bool Update();
|
|
||||||
|
|
||||||
bool ComputeManifest(S3BucketContent & BucketContent);
|
bool ComputeManifest(S3BucketContent & BucketContent);
|
||||||
bool AddManifestToDB(S3BucketContent & BucketContent);
|
bool AddManifestToDB(S3BucketContent & BucketContent);
|
||||||
@@ -48,10 +46,9 @@ namespace OpenWifi {
|
|||||||
void CloseBucket();
|
void CloseBucket();
|
||||||
void Print(const S3BucketContent &B);
|
void Print(const S3BucketContent &B);
|
||||||
uint64_t MaxAge() const { return MaxAge_; }
|
uint64_t MaxAge() const { return MaxAge_; }
|
||||||
|
void onTimer(Poco::Timer & timer);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static ManifestCreator *instance_;
|
|
||||||
Poco::Thread Worker_;
|
|
||||||
std::atomic_bool Running_ = false;
|
std::atomic_bool Running_ = false;
|
||||||
Aws::String S3BucketName_;
|
Aws::String S3BucketName_;
|
||||||
Aws::String S3Region_;
|
Aws::String S3Region_;
|
||||||
@@ -62,14 +59,14 @@ namespace OpenWifi {
|
|||||||
Aws::Auth::AWSCredentials AwsCreds_;
|
Aws::Auth::AWSCredentials AwsCreds_;
|
||||||
uint64_t DBRefresh_ = 30 * 60;
|
uint64_t DBRefresh_ = 30 * 60;
|
||||||
uint64_t MaxAge_ = 0 ;
|
uint64_t MaxAge_ = 0 ;
|
||||||
|
Poco::Timer Timer_;
|
||||||
|
std::unique_ptr<Poco::TimerCallback<ManifestCreator>> ManifestCreatorCallBack_;
|
||||||
|
|
||||||
ManifestCreator() noexcept:
|
ManifestCreator() noexcept:
|
||||||
SubSystemServer("ManifestCreator", "MANIFEST-MGR", "manifestcreator") {
|
SubSystemServer("ManifestCreator", "MANIFEST-MGR", "manifestcreator") {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline ManifestCreator * ManifestCreator() { return ManifestCreator::instance(); };
|
inline auto ManifestCreator() { return ManifestCreator::instance(); };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //UCENTRALFWS_MANIFESTCREATOR_H
|
|
||||||
|
|||||||
91
src/NewCommandHandler.cpp
Normal file
91
src/NewCommandHandler.cpp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-11-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "NewCommandHandler.h"
|
||||||
|
#include "StorageService.h"
|
||||||
|
|
||||||
|
#include "framework/KafkaManager.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
void NewCommandHandler::run() {
|
||||||
|
Running_ = true ;
|
||||||
|
Utils::SetThreadName("cmd-handler");
|
||||||
|
while(Running_) {
|
||||||
|
Poco::Thread::trySleep(2000);
|
||||||
|
|
||||||
|
if(!Running_)
|
||||||
|
break;
|
||||||
|
|
||||||
|
while(!NewCommands_.empty()) {
|
||||||
|
if(!Running_)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Types::StringPair S;
|
||||||
|
{
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
S = NewCommands_.front();
|
||||||
|
NewCommands_.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
auto SerialNumber = S.first;
|
||||||
|
auto M = nlohmann::json::parse(S.second);
|
||||||
|
|
||||||
|
std::string EndPoint;
|
||||||
|
|
||||||
|
if(M.contains(uCentralProtocol::SYSTEM)) {
|
||||||
|
auto SystemObj = M[uCentralProtocol::SYSTEM];
|
||||||
|
if(SystemObj.contains(uCentralProtocol::HOST))
|
||||||
|
EndPoint = SystemObj[uCentralProtocol::HOST];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(M.contains(uCentralProtocol::PAYLOAD)) {
|
||||||
|
auto PayloadSection = M[uCentralProtocol::PAYLOAD];
|
||||||
|
if(PayloadSection.contains("command")) {
|
||||||
|
auto Command = PayloadSection["command"];
|
||||||
|
if(Command=="delete_device") {
|
||||||
|
auto pSerialNumber = PayloadSection["payload"]["serialNumber"];
|
||||||
|
if(pSerialNumber==SerialNumber) {
|
||||||
|
poco_debug(Logger(),fmt::format("Removing device '{}' from upgrade history.",SerialNumber));
|
||||||
|
StorageService()->HistoryDB().DeleteHistory(SerialNumber);
|
||||||
|
poco_debug(Logger(),fmt::format("Removing device '{}' from device table.",SerialNumber));
|
||||||
|
StorageService()->DevicesDB().DeleteDevice(SerialNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger().log(E);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int NewCommandHandler::Start() {
|
||||||
|
Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->CommandReceived(s1,s2); };
|
||||||
|
WatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::COMMAND, F);
|
||||||
|
Worker_.start(*this);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void NewCommandHandler::Stop() {
|
||||||
|
KafkaManager()->UnregisterTopicWatcher(KafkaTopics::COMMAND, WatcherId_);
|
||||||
|
Running_ = false;
|
||||||
|
Worker_.wakeUp();
|
||||||
|
Worker_.join();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool NewCommandHandler::Update() {
|
||||||
|
Worker_.wakeUp();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NewCommandHandler::CommandReceived( const std::string & Key, const std::string & Message) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
NewCommands_.push(std::make_pair(Key,Message));
|
||||||
|
}
|
||||||
|
}
|
||||||
38
src/NewCommandHandler.h
Normal file
38
src/NewCommandHandler.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-11-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "framework/SubSystemServer.h"
|
||||||
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
class NewCommandHandler : public SubSystemServer, Poco::Runnable {
|
||||||
|
public:
|
||||||
|
static auto instance() {
|
||||||
|
static auto instance_ = new NewCommandHandler;
|
||||||
|
return instance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() override;
|
||||||
|
int Start() override;
|
||||||
|
void Stop() override;
|
||||||
|
bool Update();
|
||||||
|
void CommandReceived( const std::string & Key, const std::string & Message);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Poco::Thread Worker_;
|
||||||
|
std::atomic_bool Running_ = false;
|
||||||
|
int WatcherId_=0;
|
||||||
|
Types::StringPairQueue NewCommands_;
|
||||||
|
|
||||||
|
NewCommandHandler() noexcept:
|
||||||
|
SubSystemServer("NewCommandHandler", "NEWCOM-MGR", "commanmdhandler") {
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
inline auto NewCommandHandler() { return NewCommandHandler::instance(); };
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,14 +5,17 @@
|
|||||||
#include "NewConnectionHandler.h"
|
#include "NewConnectionHandler.h"
|
||||||
#include "framework/KafkaTopics.h"
|
#include "framework/KafkaTopics.h"
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
#include "framework/ow_constants.h"
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Poco/JSON/Parser.h"
|
#include "Poco/JSON/Parser.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "LatestFirmwareCache.h"
|
#include "LatestFirmwareCache.h"
|
||||||
#include "framework/uCentral_Protocol.h"
|
|
||||||
#include "DeviceCache.h"
|
#include "DeviceCache.h"
|
||||||
#include "AutoUpdater.h"
|
#include "AutoUpdater.h"
|
||||||
|
|
||||||
|
#include "framework/KafkaManager.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
{ "system" : { "id" : 6715803232063 , "host" : "https://localhost:17002" } ,
|
{ "system" : { "id" : 6715803232063 , "host" : "https://localhost:17002" } ,
|
||||||
"payload" : "{"capabilities":{"compatible":"linksys_ea8300","model":"Linksys EA8300 (Dallas)","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","switch":{"switch0":{"enable":true,"ports":[{"device":"eth0","need_tag":false,"num":0,"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],"reset":true,"roles":[{"device":"eth0","ports":"1 2 3 4 0","role":"lan"}]}},"wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5G"],"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865696178}}},"firmware":"OpenWrt 21.02-SNAPSHOT r16011+53-6fd65c6573 / TIP-devel-0825cb93","serial":"24f5a207a130","uuid":1623866223}}
|
"payload" : "{"capabilities":{"compatible":"linksys_ea8300","model":"Linksys EA8300 (Dallas)","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","switch":{"switch0":{"enable":true,"ports":[{"device":"eth0","need_tag":false,"num":0,"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],"reset":true,"roles":[{"device":"eth0","ports":"1 2 3 4 0","role":"lan"}]}},"wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5G"],"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865696178}}},"firmware":"OpenWrt 21.02-SNAPSHOT r16011+53-6fd65c6573 / TIP-devel-0825cb93","serial":"24f5a207a130","uuid":1623866223}}
|
||||||
@@ -22,6 +25,7 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
void NewConnectionHandler::run() {
|
void NewConnectionHandler::run() {
|
||||||
|
Utils::SetThreadName("conn-handler");
|
||||||
Running_ = true ;
|
Running_ = true ;
|
||||||
while(Running_) {
|
while(Running_) {
|
||||||
Poco::Thread::trySleep(2000);
|
Poco::Thread::trySleep(2000);
|
||||||
@@ -64,15 +68,15 @@ namespace OpenWifi {
|
|||||||
auto Revision = Storage::TrimRevision(PayloadObj->get(uCentralProtocol::FIRMWARE).toString());
|
auto Revision = Storage::TrimRevision(PayloadObj->get(uCentralProtocol::FIRMWARE).toString());
|
||||||
// std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << " DeviceType: " << DeviceType << " Revision:" << Revision << std::endl;
|
// std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << " DeviceType: " << DeviceType << " Revision:" << Revision << std::endl;
|
||||||
FMSObjects::FirmwareAgeDetails FA;
|
FMSObjects::FirmwareAgeDetails FA;
|
||||||
if(StorageService()->ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
if(StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
||||||
StorageService()->SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint);
|
StorageService()->DevicesDB().SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint);
|
||||||
if(FA.age)
|
if(FA.age)
|
||||||
Logger_.information(Poco::format("Device %s connection. Firmware is %s older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age)));
|
poco_information(Logger(),fmt::format("Device {} connection. Firmware is {} older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age)));
|
||||||
else
|
else
|
||||||
Logger_.information(Poco::format("Device %s connection. Device firmware is up to date.",SerialNumber));
|
poco_information(Logger(),fmt::format("Device {} connection. Device firmware is up to date.",SerialNumber));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Logger_.information(Poco::format("Device %s connection. Firmware age cannot be determined",SerialNumber));
|
poco_information(Logger(),fmt::format("Device {} connection. Firmware age cannot be determined.",SerialNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
||||||
@@ -86,7 +90,7 @@ namespace OpenWifi {
|
|||||||
if(DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) {
|
if(DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) {
|
||||||
auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER).toString();
|
auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER).toString();
|
||||||
auto Timestamp = DisconnectMessage->get(uCentralProtocol::TIMESTAMP);
|
auto Timestamp = DisconnectMessage->get(uCentralProtocol::TIMESTAMP);
|
||||||
StorageService()->SetDeviceDisconnected(SNum,EndPoint);
|
StorageService()->DevicesDB().SetDeviceDisconnected(SNum,EndPoint);
|
||||||
// std::cout << "DISCONNECTION:" << SerialNumber << std::endl;
|
// std::cout << "DISCONNECTION:" << SerialNumber << std::endl;
|
||||||
}
|
}
|
||||||
} else if(PayloadObj->has(uCentralProtocol::PING)) {
|
} else if(PayloadObj->has(uCentralProtocol::PING)) {
|
||||||
@@ -98,7 +102,7 @@ namespace OpenWifi {
|
|||||||
auto Revision = Storage::TrimRevision(PingMessage->get(uCentralProtocol::FIRMWARE).toString());
|
auto Revision = Storage::TrimRevision(PingMessage->get(uCentralProtocol::FIRMWARE).toString());
|
||||||
auto Serial = PingMessage->get( uCentralProtocol::SERIALNUMBER).toString();
|
auto Serial = PingMessage->get( uCentralProtocol::SERIALNUMBER).toString();
|
||||||
auto DeviceType = PingMessage->get( uCentralProtocol::COMPATIBLE).toString();
|
auto DeviceType = PingMessage->get( uCentralProtocol::COMPATIBLE).toString();
|
||||||
StorageService()->SetDeviceRevision(Serial, Revision, DeviceType, EndPoint);
|
StorageService()->DevicesDB().SetDeviceRevision(Serial, Revision, DeviceType, EndPoint);
|
||||||
DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
|
DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
|
||||||
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
if(!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
|
||||||
// std::cout << "Device(ping): " << SerialNumber << " to be upgraded ... " << std::endl;
|
// std::cout << "Device(ping): " << SerialNumber << " to be upgraded ... " << std::endl;
|
||||||
@@ -108,13 +112,14 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger_.log(E);
|
Logger().log(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int NewConnectionHandler::Start() {
|
int NewConnectionHandler::Start() {
|
||||||
|
poco_information(Logger(),"Starting...");
|
||||||
Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->ConnectionReceived(s1,s2); };
|
Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->ConnectionReceived(s1,s2); };
|
||||||
ConnectionWatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::CONNECTION, F);
|
ConnectionWatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::CONNECTION, F);
|
||||||
Worker_.start(*this);
|
Worker_.start(*this);
|
||||||
@@ -122,10 +127,12 @@ namespace OpenWifi {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void NewConnectionHandler::Stop() {
|
void NewConnectionHandler::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
KafkaManager()->UnregisterTopicWatcher(KafkaTopics::CONNECTION, ConnectionWatcherId_);
|
KafkaManager()->UnregisterTopicWatcher(KafkaTopics::CONNECTION, ConnectionWatcherId_);
|
||||||
Running_ = false;
|
Running_ = false;
|
||||||
Worker_.wakeUp();
|
Worker_.wakeUp();
|
||||||
Worker_.join();
|
Worker_.join();
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
};
|
};
|
||||||
|
|
||||||
bool NewConnectionHandler::Update() {
|
bool NewConnectionHandler::Update() {
|
||||||
|
|||||||
@@ -2,11 +2,9 @@
|
|||||||
// Created by stephane bourque on 2021-07-13.
|
// Created by stephane bourque on 2021-07-13.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_NEWCONNECTIONHANDLER_H
|
#pragma once
|
||||||
#define UCENTRALFMS_NEWCONNECTIONHANDLER_H
|
|
||||||
|
|
||||||
|
#include "framework/SubSystemServer.h"
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
@@ -14,8 +12,8 @@ namespace OpenWifi {
|
|||||||
class NewConnectionHandler : public SubSystemServer, Poco::Runnable {
|
class NewConnectionHandler : public SubSystemServer, Poco::Runnable {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static NewConnectionHandler *instance() {
|
static auto instance() {
|
||||||
static NewConnectionHandler *instance_ = new NewConnectionHandler;
|
static auto instance_ = new NewConnectionHandler;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,8 +27,7 @@ namespace OpenWifi {
|
|||||||
private:
|
private:
|
||||||
Poco::Thread Worker_;
|
Poco::Thread Worker_;
|
||||||
std::atomic_bool Running_ = false;
|
std::atomic_bool Running_ = false;
|
||||||
int ConnectionWatcherId_=0;
|
uint64_t ConnectionWatcherId_=0;
|
||||||
int HealthcheckWatcherId_=0;
|
|
||||||
Types::StringPairQueue NewConnections_;
|
Types::StringPairQueue NewConnections_;
|
||||||
|
|
||||||
NewConnectionHandler() noexcept:
|
NewConnectionHandler() noexcept:
|
||||||
@@ -38,7 +35,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
inline NewConnectionHandler * NewConnectionHandler() { return NewConnectionHandler::instance(); };
|
inline auto NewConnectionHandler() { return NewConnectionHandler::instance(); };
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //UCENTRALFMS_NEWCONNECTIONHANDLER_H
|
|
||||||
|
|||||||
49
src/RESTAPI/RESTAPI_Routers.cpp
Normal file
49
src/RESTAPI/RESTAPI_Routers.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-10-23.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_firmwareHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_firmwaresHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_firmwareAgeHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_connectedDeviceHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_historyHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_deviceReportHandler.h"
|
||||||
|
#include "RESTAPI/RESTAPI_deviceInformation_handler.h"
|
||||||
|
#include "framework/RESTAPI_SystemCommand.h"
|
||||||
|
#include "framework/RESTAPI_WebSocketServer.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
|
||||||
|
Poco::Logger & L, RESTAPI_GenericServerAccounting & S, uint64_t TransactionId) {
|
||||||
|
return RESTAPI_Router<
|
||||||
|
RESTAPI_firmwaresHandler,
|
||||||
|
RESTAPI_firmwareHandler,
|
||||||
|
RESTAPI_system_command,
|
||||||
|
RESTAPI_firmwareAgeHandler,
|
||||||
|
RESTAPI_connectedDevicesHandler,
|
||||||
|
RESTAPI_connectedDeviceHandler,
|
||||||
|
RESTAPI_historyHandler,
|
||||||
|
RESTAPI_deviceReportHandler,
|
||||||
|
RESTAPI_deviceInformation_handler,
|
||||||
|
RESTAPI_webSocketServer
|
||||||
|
>(Path,Bindings,L, S, TransactionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
|
||||||
|
Poco::Logger & L, RESTAPI_GenericServerAccounting & S, uint64_t TransactionId) {
|
||||||
|
return RESTAPI_Router_I<
|
||||||
|
RESTAPI_firmwaresHandler,
|
||||||
|
RESTAPI_firmwareHandler,
|
||||||
|
RESTAPI_system_command,
|
||||||
|
RESTAPI_firmwareAgeHandler,
|
||||||
|
RESTAPI_connectedDevicesHandler,
|
||||||
|
RESTAPI_connectedDeviceHandler,
|
||||||
|
RESTAPI_historyHandler,
|
||||||
|
RESTAPI_deviceReportHandler,
|
||||||
|
RESTAPI_deviceInformation_handler
|
||||||
|
>(Path, Bindings, L, S, TransactionId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,8 +5,7 @@
|
|||||||
#include "RESTAPI_connectedDeviceHandler.h"
|
#include "RESTAPI_connectedDeviceHandler.h"
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/RESTAPI_protocol.h"
|
#include "framework/ow_constants.h"
|
||||||
#include "framework/RESTAPI_errors.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
@@ -18,7 +17,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::DeviceConnectionInformation DevInfo;
|
FMSObjects::DeviceConnectionInformation DevInfo;
|
||||||
if(StorageService()->GetDevice(SerialNumber, DevInfo)) {
|
if(StorageService()->DevicesDB().GetDevice(SerialNumber, DevInfo)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
DevInfo.to_json(Answer);
|
DevInfo.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
|
|||||||
@@ -5,19 +5,20 @@
|
|||||||
#ifndef UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
|
#ifndef UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
|
||||||
#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
|
#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_connectedDeviceHandler : public RESTAPIHandler {
|
class RESTAPI_connectedDeviceHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/connectedDevice/{serialNumber}"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevice/{serialNumber}"};}
|
||||||
|
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
|
|||||||
@@ -8,14 +8,14 @@
|
|||||||
#include "RESTAPI_connectedDevicesHandler.h"
|
#include "RESTAPI_connectedDevicesHandler.h"
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/RESTAPI_protocol.h"
|
#include "framework/ow_constants.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void RESTAPI_connectedDevicesHandler::DoGet() {
|
void RESTAPI_connectedDevicesHandler::DoGet() {
|
||||||
std::vector<FMSObjects::DeviceConnectionInformation> Devices;
|
std::vector<FMSObjects::DeviceConnectionInformation> Devices;
|
||||||
Poco::JSON::Object AnswerObj;
|
Poco::JSON::Object AnswerObj;
|
||||||
Poco::JSON::Array AnswerArr;
|
Poco::JSON::Array AnswerArr;
|
||||||
if (StorageService()->GetDevices(QB_.Offset, QB_.Limit, Devices)) {
|
if (StorageService()->DevicesDB().GetDevices(QB_.Offset, QB_.Limit, Devices)) {
|
||||||
for (const auto &i:Devices) {
|
for (const auto &i:Devices) {
|
||||||
Poco::JSON::Object Obj;
|
Poco::JSON::Object Obj;
|
||||||
i.to_json(Obj);
|
i.to_json(Obj);
|
||||||
|
|||||||
@@ -6,19 +6,20 @@
|
|||||||
#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
|
#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
|
||||||
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_connectedDevicesHandler : public RESTAPIHandler {
|
class RESTAPI_connectedDevicesHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/connectedDevices"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevices"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
|
|||||||
47
src/RESTAPI/RESTAPI_deviceInformation_handler.cpp
Normal file
47
src/RESTAPI/RESTAPI_deviceInformation_handler.cpp
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-03-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "RESTAPI_deviceInformation_handler.h"
|
||||||
|
#include "StorageService.h"
|
||||||
|
#include "LatestFirmwareCache.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
void RESTAPI_deviceInformation_handler::DoGet() {
|
||||||
|
auto SerialNumber = GetBinding("serialNumber","");
|
||||||
|
|
||||||
|
if(SerialNumber.empty() || !Utils::ValidSerialNumber(SerialNumber)) {
|
||||||
|
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
FMSObjects::DeviceInformation DI;
|
||||||
|
|
||||||
|
// Let's get the history
|
||||||
|
StorageService()->HistoryDB().GetHistory(SerialNumber,0,100,DI.history.history);
|
||||||
|
|
||||||
|
// Let's get the DeviceConnectionInformation
|
||||||
|
FMSObjects::DeviceConnectionInformation DCI;
|
||||||
|
StorageService()->DevicesDB().GetDevice(SerialNumber,DCI);
|
||||||
|
|
||||||
|
LatestFirmwareCacheEntry LFE;
|
||||||
|
LatestFirmwareCache()->FindLatestFirmware(DCI.deviceType,LFE);
|
||||||
|
|
||||||
|
FMSObjects::Firmware Latest;
|
||||||
|
StorageService()->FirmwaresDB().GetFirmware(LFE.Id,Latest);
|
||||||
|
|
||||||
|
DI.serialNumber = SerialNumber;
|
||||||
|
DI.currentFirmware = DCI.revision;
|
||||||
|
DI.latestFirmware = LFE.Revision;
|
||||||
|
DI.latestFirmwareDate = LFE.TimeStamp;
|
||||||
|
DI.latestFirmwareURI = Latest.uri;
|
||||||
|
FirmwaresDB::RecordName FI;
|
||||||
|
StorageService()->FirmwaresDB().GetFirmwareByRevision(DCI.revision,DCI.deviceType,FI);
|
||||||
|
DI.currentFirmwareDate = FI.imageDate;
|
||||||
|
|
||||||
|
DI.latestFirmwareAvailable = (LFE.Revision != DCI.revision);
|
||||||
|
|
||||||
|
Poco::JSON::Object Answer;
|
||||||
|
DI.to_json(Answer);
|
||||||
|
return ReturnObject(Answer);
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/RESTAPI/RESTAPI_deviceInformation_handler.h
Normal file
26
src/RESTAPI/RESTAPI_deviceInformation_handler.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-03-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
class RESTAPI_deviceInformation_handler : public RESTAPIHandler {
|
||||||
|
public:
|
||||||
|
RESTAPI_deviceInformation_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
|
: RESTAPIHandler(bindings, L,
|
||||||
|
std::vector<std::string>
|
||||||
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
|
Server,
|
||||||
|
TransactionId,
|
||||||
|
Internal) {}
|
||||||
|
static auto PathName() { return std::list<std::string>{"/api/v1/deviceInformation/{serialNumber}"};}
|
||||||
|
void DoGet() final;
|
||||||
|
void DoDelete() final {};
|
||||||
|
void DoPost() final {};
|
||||||
|
void DoPut() final {};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -3,16 +3,19 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "RESTAPI_deviceReportHandler.h"
|
#include "RESTAPI_deviceReportHandler.h"
|
||||||
#include "StorageService.h"
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Daemon.h"
|
#include "Daemon.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void RESTAPI_deviceReportHandler::DoGet() {
|
void RESTAPI_deviceReportHandler::DoGet() {
|
||||||
Daemon()->CreateDashboard();
|
poco_information(Logger(),fmt::format("GET-DASHBOARD: {}", Requester()));
|
||||||
Poco::JSON::Object O;
|
FMSObjects::DeviceReport Data;
|
||||||
Daemon()->GetDashboard().to_json(O);
|
if(Daemon()->GetDashboard().Get(Data, Logger())) {
|
||||||
ReturnObject(O);
|
Poco::JSON::Object Answer;
|
||||||
|
Data.to_json(Answer);
|
||||||
|
return ReturnObject(Answer);
|
||||||
|
}
|
||||||
|
return BadRequest(RESTAPI::Errors::InternalError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,28 +2,25 @@
|
|||||||
// Created by stephane bourque on 2021-07-19.
|
// Created by stephane bourque on 2021-07-19.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
|
#pragma once
|
||||||
#define UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_deviceReportHandler : public RESTAPIHandler {
|
class RESTAPI_deviceReportHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/deviceReport"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/deviceReport"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
void DoPut() final {};
|
void DoPut() final {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //UCENTRALFMS_RESTAPI_DEVICEREPORTHANDLER_H
|
|
||||||
|
|||||||
@@ -7,20 +7,17 @@
|
|||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "Poco/JSON/Parser.h"
|
#include "Poco/JSON/Parser.h"
|
||||||
#include "DeviceCache.h"
|
#include "DeviceCache.h"
|
||||||
#include "framework/uCentral_Protocol.h"
|
#include "framework/ow_constants.h"
|
||||||
#include "framework/RESTAPI_protocol.h"
|
|
||||||
#include "framework/RESTAPI_errors.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void RESTAPI_firmwareAgeHandler::DoGet() {
|
void RESTAPI_firmwareAgeHandler::DoGet() {
|
||||||
if (!QB_.Select.empty()) {
|
if (!QB_.Select.empty()) {
|
||||||
Poco::JSON::Array Objects;
|
Poco::JSON::Array Objects;
|
||||||
std::vector<std::string> Numbers = Utils::Split(QB_.Select);
|
for (auto &i : SelectedRecords()) {
|
||||||
for (auto &i : Numbers) {
|
|
||||||
DeviceCacheEntry E;
|
DeviceCacheEntry E;
|
||||||
if (DeviceCache()->GetDevice(i, E)) {
|
if (DeviceCache()->GetDevice(i, E)) {
|
||||||
FMSObjects::FirmwareAgeDetails FA;
|
FMSObjects::FirmwareAgeDetails FA;
|
||||||
if(StorageService()->ComputeFirmwareAge(E.deviceType,E.revision,FA)) {
|
if(StorageService()->FirmwaresDB().ComputeFirmwareAge(E.deviceType,E.revision,FA)) {
|
||||||
Poco::JSON::Object O;
|
Poco::JSON::Object O;
|
||||||
FA.to_json(O);
|
FA.to_json(O);
|
||||||
O.set(uCentralProtocol::SERIALNUMBER,i);
|
O.set(uCentralProtocol::SERIALNUMBER,i);
|
||||||
@@ -50,7 +47,7 @@ namespace OpenWifi {
|
|||||||
Revision = Storage::TrimRevision(Revision);
|
Revision = Storage::TrimRevision(Revision);
|
||||||
|
|
||||||
FMSObjects::FirmwareAgeDetails FA;
|
FMSObjects::FirmwareAgeDetails FA;
|
||||||
if (StorageService()->ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
if (StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
|
|
||||||
FA.to_json(Answer);
|
FA.to_json(Answer);
|
||||||
|
|||||||
@@ -5,19 +5,20 @@
|
|||||||
#ifndef UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
|
#ifndef UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
|
||||||
#define UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
|
#define UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_firmwareAgeHandler : public RESTAPIHandler {
|
class RESTAPI_firmwareAgeHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/firmwareAge"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/firmwareAge"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
|
|||||||
@@ -4,22 +4,22 @@
|
|||||||
|
|
||||||
#include "Poco/JSON/Parser.h"
|
#include "Poco/JSON/Parser.h"
|
||||||
|
|
||||||
#include "RESTAPI_firmwareHandler.h"
|
#include "RESTAPI/RESTAPI_firmwareHandler.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/uCentral_Protocol.h"
|
#include "framework/ow_constants.h"
|
||||||
#include "framework/RESTAPI_protocol.h"
|
#include "framework/MicroServiceFuncs.h"
|
||||||
#include "framework/RESTAPI_errors.h"
|
#include "framework/utils.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void
|
void
|
||||||
RESTAPI_firmwareHandler::DoPost() {
|
RESTAPI_firmwareHandler::DoPost() {
|
||||||
auto Obj = ParseStream();
|
const auto &Obj = ParsedBody_;
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if (!F.from_json(Obj)) {
|
if (!F.from_json(Obj)) {
|
||||||
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
||||||
}
|
}
|
||||||
F.id = MicroService::instance().CreateUUID();
|
F.id = MicroServiceCreateUUID();
|
||||||
if(StorageService()->AddFirmware(F)) {
|
if(StorageService()->FirmwaresDB().AddFirmware(F)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
F.to_json(Answer);
|
F.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
@@ -36,7 +36,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if (StorageService()->GetFirmware(UUID, F)) {
|
if (StorageService()->FirmwaresDB().GetFirmware(UUID, F)) {
|
||||||
Poco::JSON::Object Object;
|
Poco::JSON::Object Object;
|
||||||
F.to_json(Object);
|
F.to_json(Object);
|
||||||
return ReturnObject(Object);
|
return ReturnObject(Object);
|
||||||
@@ -51,7 +51,7 @@ namespace OpenWifi {
|
|||||||
return BadRequest(RESTAPI::Errors::MissingUUID);
|
return BadRequest(RESTAPI::Errors::MissingUUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StorageService()->DeleteFirmware(UUID)) {
|
if (StorageService()->FirmwaresDB().DeleteFirmware(UUID)) {
|
||||||
return OK();
|
return OK();
|
||||||
}
|
}
|
||||||
BadRequest(RESTAPI::Errors::CouldNotBeDeleted);
|
BadRequest(RESTAPI::Errors::CouldNotBeDeleted);
|
||||||
@@ -64,11 +64,11 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if(!StorageService()->GetFirmware(UUID, F)) {
|
if(!StorageService()->FirmwaresDB().GetFirmware(UUID, F)) {
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Obj = ParseStream();
|
const auto & Obj = ParsedBody_;
|
||||||
FMSObjects::Firmware NewFirmware;
|
FMSObjects::Firmware NewFirmware;
|
||||||
if(!NewFirmware.from_json(Obj)) {
|
if(!NewFirmware.from_json(Obj)) {
|
||||||
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
|
||||||
@@ -80,12 +80,12 @@ namespace OpenWifi {
|
|||||||
SecurityObjects::NoteInfoVec NIV;
|
SecurityObjects::NoteInfoVec NIV;
|
||||||
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString());
|
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString());
|
||||||
for(auto const &i:NIV) {
|
for(auto const &i:NIV) {
|
||||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UserInfo_.userinfo.email, .note=i.note};
|
SecurityObjects::NoteInfo ii{.created=(uint64_t)Utils::Now(), .createdBy=UserInfo_.userinfo.email, .note=i.note};
|
||||||
F.notes.push_back(ii);
|
F.notes.push_back(ii);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(StorageService()->UpdateFirmware(UUID, F)) {
|
if(StorageService()->FirmwaresDB().UpdateFirmware(UUID, F)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
F.to_json(Answer);
|
F.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
#ifndef UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
|
#ifndef UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
|
||||||
#define UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
|
#define UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_firmwareHandler : public RESTAPIHandler {
|
class RESTAPI_firmwareHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
@@ -19,8 +19,9 @@ namespace OpenWifi {
|
|||||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/firmware/{id}"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/firmware/{id}"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final;
|
void DoDelete() final;
|
||||||
void DoPost() final;
|
void DoPost() final;
|
||||||
|
|||||||
@@ -5,18 +5,17 @@
|
|||||||
#include "RESTAPI_firmwaresHandler.h"
|
#include "RESTAPI_firmwaresHandler.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "LatestFirmwareCache.h"
|
#include "LatestFirmwareCache.h"
|
||||||
#include "framework/RESTAPI_protocol.h"
|
#include "framework/ow_constants.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void
|
void
|
||||||
RESTAPI_firmwaresHandler::DoGet() {
|
RESTAPI_firmwaresHandler::DoGet() {
|
||||||
std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
|
std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
|
||||||
bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY, false);
|
bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY);
|
||||||
bool RevisionSet = GetBoolParameter(RESTAPI::Protocol::REVISIONSET, false);
|
bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY);
|
||||||
bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY, false);
|
bool rcOnly = GetBoolParameter("rcOnly");
|
||||||
bool DeviceSet = GetBoolParameter(RESTAPI::Protocol::DEVICESET, false);
|
|
||||||
|
|
||||||
if(DeviceSet) {
|
if(GetBoolParameter(RESTAPI::Protocol::DEVICESET)) {
|
||||||
auto Revisions = LatestFirmwareCache()->GetDevices();
|
auto Revisions = LatestFirmwareCache()->GetDevices();
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
for (const auto &i:Revisions) {
|
for (const auto &i:Revisions) {
|
||||||
@@ -27,7 +26,7 @@ namespace OpenWifi {
|
|||||||
return ReturnObject(RetObj);
|
return ReturnObject(RetObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RevisionSet) {
|
if(GetBoolParameter(RESTAPI::Protocol::REVISIONSET)) {
|
||||||
auto Revisions = LatestFirmwareCache()->GetRevisions();
|
auto Revisions = LatestFirmwareCache()->GetRevisions();
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
for (const auto &i:Revisions) {
|
for (const auto &i:Revisions) {
|
||||||
@@ -42,12 +41,18 @@ namespace OpenWifi {
|
|||||||
if(!DeviceType.empty()) {
|
if(!DeviceType.empty()) {
|
||||||
if(LatestOnly) {
|
if(LatestOnly) {
|
||||||
LatestFirmwareCacheEntry Entry;
|
LatestFirmwareCacheEntry Entry;
|
||||||
if(!LatestFirmwareCache()->FindLatestFirmware(DeviceType,Entry)) {
|
if(rcOnly) {
|
||||||
|
if (!LatestFirmwareCache()->FindLatestRCOnlyFirmware(DeviceType, Entry)) {
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (!LatestFirmwareCache()->FindLatestFirmware(DeviceType, Entry)) {
|
||||||
|
return NotFound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FMSObjects::Firmware F;
|
FMSObjects::Firmware F;
|
||||||
if(StorageService()->GetFirmware(Entry.Id,F)) {
|
if(StorageService()->FirmwaresDB().GetFirmware(Entry.Id,F)) {
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
F.to_json(Answer);
|
F.to_json(Answer);
|
||||||
return ReturnObject(Answer);
|
return ReturnObject(Answer);
|
||||||
@@ -55,9 +60,11 @@ namespace OpenWifi {
|
|||||||
return NotFound();
|
return NotFound();
|
||||||
} else {
|
} else {
|
||||||
std::vector<FMSObjects::Firmware> List;
|
std::vector<FMSObjects::Firmware> List;
|
||||||
if (StorageService()->GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
for (const auto &i:List) {
|
for (const auto &i:List) {
|
||||||
|
if(rcOnly && !LatestFirmwareCache::IsRC(i.revision))
|
||||||
|
continue;
|
||||||
if(IdOnly) {
|
if(IdOnly) {
|
||||||
ObjectArray.add(i.id);
|
ObjectArray.add(i.id);
|
||||||
} else {
|
} else {
|
||||||
@@ -78,8 +85,10 @@ namespace OpenWifi {
|
|||||||
std::vector<FMSObjects::Firmware> List;
|
std::vector<FMSObjects::Firmware> List;
|
||||||
Poco::JSON::Array ObjectArray;
|
Poco::JSON::Array ObjectArray;
|
||||||
Poco::JSON::Object Answer;
|
Poco::JSON::Object Answer;
|
||||||
if (StorageService()->GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
|
||||||
for (const auto &i:List) {
|
for (const auto &i:List) {
|
||||||
|
if(rcOnly && !LatestFirmwareCache::IsRC(i.revision))
|
||||||
|
continue;
|
||||||
if(IdOnly) {
|
if(IdOnly) {
|
||||||
ObjectArray.add(i.id);
|
ObjectArray.add(i.id);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -5,20 +5,21 @@
|
|||||||
#ifndef UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
|
#ifndef UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
|
||||||
#define UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
|
#define UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_Handler.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_firmwaresHandler : public RESTAPIHandler {
|
class RESTAPI_firmwaresHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
|
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/firmwares"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/firmwares"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final {};
|
void DoDelete() final {};
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
|
|||||||
@@ -4,8 +4,7 @@
|
|||||||
|
|
||||||
#include "RESTAPI_historyHandler.h"
|
#include "RESTAPI_historyHandler.h"
|
||||||
#include "StorageService.h"
|
#include "StorageService.h"
|
||||||
#include "framework/RESTAPI_protocol.h"
|
#include "framework/ow_constants.h"
|
||||||
#include "framework/RESTAPI_errors.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
void
|
void
|
||||||
@@ -16,8 +15,28 @@ namespace OpenWifi {
|
|||||||
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
|
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto unknownList = GetBoolParameter("unknownList");
|
||||||
|
if(SerialNumber=="000000000000" && unknownList) {
|
||||||
|
// so let's get all the devices, filter the latest record
|
||||||
|
FMSObjects::DeviceCurrentInfoList L;
|
||||||
|
StorageService()->HistoryDB().GetUnknownDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
|
||||||
|
Poco::JSON::Object Answer;
|
||||||
|
L.to_json(Answer);
|
||||||
|
return ReturnObject(Answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto currentList = GetBoolParameter("currentList");
|
||||||
|
if(SerialNumber=="000000000000" && currentList) {
|
||||||
|
// so let's get all the devices, filter the latest record
|
||||||
|
FMSObjects::DeviceCurrentInfoList L;
|
||||||
|
StorageService()->HistoryDB().GetDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
|
||||||
|
Poco::JSON::Object Answer;
|
||||||
|
L.to_json(Answer);
|
||||||
|
return ReturnObject(Answer);
|
||||||
|
}
|
||||||
|
|
||||||
FMSObjects::RevisionHistoryEntryVec H;
|
FMSObjects::RevisionHistoryEntryVec H;
|
||||||
if (StorageService()->GetHistory(SerialNumber, QB_.Offset, QB_.Limit, H)) {
|
if (StorageService()->HistoryDB().GetHistory(SerialNumber, QB_.Offset, QB_.Limit, H)) {
|
||||||
Poco::JSON::Array A;
|
Poco::JSON::Array A;
|
||||||
for (auto const &i:H) {
|
for (auto const &i:H) {
|
||||||
Poco::JSON::Object O;
|
Poco::JSON::Object O;
|
||||||
@@ -38,7 +57,7 @@ namespace OpenWifi {
|
|||||||
return BadRequest(RESTAPI::Errors::IdOrSerialEmpty);
|
return BadRequest(RESTAPI::Errors::IdOrSerialEmpty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!StorageService()->DeleteHistory(SerialNumber, Id)) {
|
if (!StorageService()->HistoryDB().DeleteHistory(SerialNumber, Id)) {
|
||||||
return OK();
|
return OK();
|
||||||
}
|
}
|
||||||
NotFound();
|
NotFound();
|
||||||
|
|||||||
@@ -2,30 +2,26 @@
|
|||||||
// Created by stephane bourque on 2021-07-13.
|
// Created by stephane bourque on 2021-07-13.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
|
#pragma once
|
||||||
#define UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
|
|
||||||
|
|
||||||
|
#include "framework/RESTAPI_Handler.h"
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
class RESTAPI_historyHandler : public RESTAPIHandler {
|
class RESTAPI_historyHandler : public RESTAPIHandler {
|
||||||
public:
|
public:
|
||||||
RESTAPI_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, bool Internal)
|
RESTAPI_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal)
|
||||||
: RESTAPIHandler(bindings, L,
|
: RESTAPIHandler(bindings, L,
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
{Poco::Net::HTTPRequest::HTTP_GET,
|
{Poco::Net::HTTPRequest::HTTP_GET,
|
||||||
Poco::Net::HTTPRequest::HTTP_DELETE,
|
Poco::Net::HTTPRequest::HTTP_DELETE,
|
||||||
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
Poco::Net::HTTPRequest::HTTP_OPTIONS},
|
||||||
Server,
|
Server,
|
||||||
|
TransactionId,
|
||||||
Internal) {}
|
Internal) {}
|
||||||
static const std::list<const char *> PathName() { return std::list<const char *>{"/api/v1/revisionHistory/{serialNumber}"};}
|
static auto PathName() { return std::list<std::string>{"/api/v1/revisionHistory/{serialNumber}"};}
|
||||||
void DoGet() final;
|
void DoGet() final;
|
||||||
void DoDelete() final;
|
void DoDelete() final;
|
||||||
void DoPost() final {};
|
void DoPost() final {};
|
||||||
void DoPut() final {};
|
void DoPut() final {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //UCENTRALFMS_RESTAPI_HISTORYHANDLER_H
|
|
||||||
|
|||||||
624
src/RESTObjects/RESTAPI_AnalyticsObjects.cpp
Normal file
624
src/RESTObjects/RESTAPI_AnalyticsObjects.cpp
Normal file
@@ -0,0 +1,624 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-01-10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "RESTAPI_AnalyticsObjects.h"
|
||||||
|
#include "RESTAPI_ProvObjects.h"
|
||||||
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
|
||||||
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
|
|
||||||
|
namespace OpenWifi::AnalyticsObjects {
|
||||||
|
|
||||||
|
void Report::reset() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Report::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {
|
||||||
|
}
|
||||||
|
|
||||||
|
void VenueInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id",id);
|
||||||
|
field_to_json(Obj,"name",name);
|
||||||
|
field_to_json(Obj,"description",description);
|
||||||
|
field_to_json(Obj,"retention",retention);
|
||||||
|
field_to_json(Obj,"interval",interval);
|
||||||
|
field_to_json(Obj,"monitorSubVenues",monitorSubVenues);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VenueInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id",id);
|
||||||
|
field_from_json(Obj,"name",name);
|
||||||
|
field_from_json(Obj,"description",description);
|
||||||
|
field_from_json(Obj,"retention",retention);
|
||||||
|
field_from_json(Obj,"interval",interval);
|
||||||
|
field_from_json(Obj,"monitorSubVenues",monitorSubVenues);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoardInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json(Obj,"venueList",venueList);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BoardInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json(Obj,"venueList",venueList);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"boardId",boardId);
|
||||||
|
field_to_json(Obj,"type",type);
|
||||||
|
field_to_json(Obj,"serialNumber",serialNumber);
|
||||||
|
field_to_json(Obj,"deviceType",deviceType);
|
||||||
|
field_to_json(Obj,"lastContact",lastContact);
|
||||||
|
field_to_json(Obj,"lastPing",lastPing);
|
||||||
|
field_to_json(Obj,"lastState",lastState);
|
||||||
|
field_to_json(Obj,"lastFirmware",lastFirmware);
|
||||||
|
field_to_json(Obj,"lastFirmwareUpdate",lastFirmwareUpdate);
|
||||||
|
field_to_json(Obj,"lastConnection",lastConnection);
|
||||||
|
field_to_json(Obj,"lastDisconnection",lastDisconnection);
|
||||||
|
field_to_json(Obj,"pings",pings);
|
||||||
|
field_to_json(Obj,"states",states);
|
||||||
|
field_to_json(Obj,"connected",connected);
|
||||||
|
field_to_json(Obj,"connectionIp",connectionIp);
|
||||||
|
field_to_json(Obj,"associations_2g",associations_2g);
|
||||||
|
field_to_json(Obj,"associations_5g",associations_5g);
|
||||||
|
field_to_json(Obj,"associations_6g",associations_6g);
|
||||||
|
field_to_json(Obj,"health",health);
|
||||||
|
field_to_json(Obj,"lastHealth",lastHealth);
|
||||||
|
field_to_json(Obj,"locale",locale);
|
||||||
|
field_to_json(Obj,"uptime",uptime);
|
||||||
|
field_to_json(Obj,"memory",memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"boardId",boardId);
|
||||||
|
field_from_json(Obj,"type",type);
|
||||||
|
field_from_json(Obj,"serialNumber",serialNumber);
|
||||||
|
field_from_json(Obj,"deviceType",deviceType);
|
||||||
|
field_from_json(Obj,"lastContact",lastContact);
|
||||||
|
field_from_json(Obj,"lastPing",lastPing);
|
||||||
|
field_from_json(Obj,"lastState",lastState);
|
||||||
|
field_from_json(Obj,"lastFirmware",lastFirmware);
|
||||||
|
field_from_json(Obj,"lastFirmwareUpdate",lastFirmwareUpdate);
|
||||||
|
field_from_json(Obj,"lastConnection",lastConnection);
|
||||||
|
field_from_json(Obj,"lastDisconnection",lastDisconnection);
|
||||||
|
field_from_json(Obj,"pings",pings);
|
||||||
|
field_from_json(Obj,"states",states);
|
||||||
|
field_from_json(Obj,"connected",connected);
|
||||||
|
field_from_json(Obj,"connectionIp",connectionIp);
|
||||||
|
field_from_json(Obj,"associations_2g",associations_2g);
|
||||||
|
field_from_json(Obj,"associations_5g",associations_5g);
|
||||||
|
field_from_json(Obj,"associations_6g",associations_6g);
|
||||||
|
field_from_json(Obj,"health",health);
|
||||||
|
field_from_json(Obj,"lastHealth",lastHealth);
|
||||||
|
field_from_json(Obj,"locale",locale);
|
||||||
|
field_from_json(Obj,"uptime",uptime);
|
||||||
|
field_from_json(Obj,"memory",memory);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceInfoList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"devices",devices);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"devices",devices);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UE_rate::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"bitrate",bitrate);
|
||||||
|
field_to_json(Obj,"mcs",mcs);
|
||||||
|
field_to_json(Obj,"nss",nss);
|
||||||
|
field_to_json(Obj,"ht",ht);
|
||||||
|
field_to_json(Obj,"sgi",sgi);
|
||||||
|
field_to_json(Obj,"chwidth",chwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UE_rate::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"bitrate",bitrate);
|
||||||
|
field_from_json(Obj,"mcs",mcs);
|
||||||
|
field_from_json(Obj,"nss",nss);
|
||||||
|
field_from_json(Obj,"ht",ht);
|
||||||
|
field_from_json(Obj,"sgi",sgi);
|
||||||
|
field_from_json(Obj,"chwidth",chwidth);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UETimePoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"station",station);
|
||||||
|
field_to_json(Obj,"rssi",rssi);
|
||||||
|
field_to_json(Obj,"tx_bytes",tx_bytes);
|
||||||
|
field_to_json(Obj,"rx_bytes",rx_bytes);
|
||||||
|
field_to_json(Obj,"tx_duration",tx_duration);
|
||||||
|
field_to_json(Obj,"rx_packets",rx_packets);
|
||||||
|
field_to_json(Obj,"tx_packets",tx_packets);
|
||||||
|
field_to_json(Obj,"tx_retries",tx_retries);
|
||||||
|
field_to_json(Obj,"tx_failed",tx_failed);
|
||||||
|
field_to_json(Obj,"connected",connected);
|
||||||
|
field_to_json(Obj,"inactive",inactive);
|
||||||
|
field_to_json(Obj,"tx_rate",tx_rate);
|
||||||
|
field_to_json(Obj,"rx_rate",rx_rate);
|
||||||
|
// field_to_json(Obj, "tidstats", tidstats);
|
||||||
|
|
||||||
|
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_to_json(Obj,"tx_failed_pct",tx_failed_pct);
|
||||||
|
field_to_json(Obj,"tx_retries_pct",tx_retries_pct);
|
||||||
|
field_to_json(Obj,"tx_duration_pct",tx_duration_pct);
|
||||||
|
|
||||||
|
field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
||||||
|
field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
||||||
|
field_to_json(Obj,"tx_packets_delta",tx_packets_delta);
|
||||||
|
field_to_json(Obj,"rx_packets_delta",rx_packets_delta);
|
||||||
|
field_to_json(Obj,"tx_failed_delta",tx_failed_delta);
|
||||||
|
field_to_json(Obj,"tx_retries_delta",tx_retries_delta);
|
||||||
|
field_to_json(Obj,"tx_duration_delta",tx_duration_delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UETimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"station",station);
|
||||||
|
field_from_json(Obj,"rssi",rssi);
|
||||||
|
field_from_json(Obj,"tx_bytes",tx_bytes);
|
||||||
|
field_from_json(Obj,"rx_bytes",rx_bytes);
|
||||||
|
field_from_json(Obj,"tx_duration",tx_duration);
|
||||||
|
field_from_json(Obj,"rx_packets",rx_packets);
|
||||||
|
field_from_json(Obj,"tx_packets",tx_packets);
|
||||||
|
field_from_json(Obj,"tx_retries",tx_retries);
|
||||||
|
field_from_json(Obj,"tx_failed",tx_failed);
|
||||||
|
field_from_json(Obj,"connected",connected);
|
||||||
|
field_from_json(Obj,"inactive",inactive);
|
||||||
|
field_from_json(Obj,"tx_rate",tx_rate);
|
||||||
|
field_from_json(Obj,"rx_rate",rx_rate);
|
||||||
|
// field_from_json(Obj,"tidstats",tidstats);
|
||||||
|
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_from_json(Obj,"tx_failed_pct",tx_failed_pct);
|
||||||
|
field_from_json(Obj,"tx_retries_pct",tx_retries_pct);
|
||||||
|
field_from_json(Obj,"tx_duration_pct",tx_duration_pct);
|
||||||
|
field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
||||||
|
field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
||||||
|
field_from_json(Obj,"tx_packets_delta",tx_packets_delta);
|
||||||
|
field_from_json(Obj,"rx_packets_delta",rx_packets_delta);
|
||||||
|
field_from_json(Obj,"tx_failed_delta",tx_failed_delta);
|
||||||
|
field_from_json(Obj,"tx_retries_delta",tx_retries_delta);
|
||||||
|
field_from_json(Obj,"tx_duration_delta",tx_duration_delta);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void APTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"collisions",collisions);
|
||||||
|
field_to_json(Obj,"multicast",multicast);
|
||||||
|
field_to_json(Obj,"rx_bytes",rx_bytes);
|
||||||
|
field_to_json(Obj,"rx_dropped",rx_dropped);
|
||||||
|
field_to_json(Obj,"rx_errors",rx_errors);
|
||||||
|
field_to_json(Obj,"rx_packets",rx_packets);
|
||||||
|
field_to_json(Obj,"tx_bytes",tx_bytes);
|
||||||
|
field_to_json(Obj,"tx_packets",tx_packets);
|
||||||
|
field_to_json(Obj,"tx_dropped",tx_dropped);
|
||||||
|
field_to_json(Obj,"tx_errors",tx_errors);
|
||||||
|
field_to_json(Obj,"tx_packets",tx_packets);
|
||||||
|
|
||||||
|
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
||||||
|
field_to_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
||||||
|
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_to_json(Obj,"rx_errors_pct",rx_errors_pct);
|
||||||
|
field_to_json(Obj,"tx_errors_pct",tx_errors_pct);
|
||||||
|
|
||||||
|
field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
||||||
|
field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
||||||
|
field_to_json(Obj,"rx_dropped_delta",rx_dropped_delta);
|
||||||
|
field_to_json(Obj,"tx_dropped_delta",tx_dropped_delta);
|
||||||
|
field_to_json(Obj,"rx_packets_delta",rx_packets_delta);
|
||||||
|
field_to_json(Obj,"tx_packets_delta",tx_packets_delta);
|
||||||
|
field_to_json(Obj,"rx_errors_delta",rx_errors_delta);
|
||||||
|
field_to_json(Obj,"tx_errors_delta",tx_errors_delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool APTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"collisions",collisions);
|
||||||
|
field_from_json(Obj,"multicast",multicast);
|
||||||
|
field_from_json(Obj,"rx_bytes",rx_bytes);
|
||||||
|
field_from_json(Obj,"rx_dropped",rx_dropped);
|
||||||
|
field_from_json(Obj,"rx_errors",rx_errors);
|
||||||
|
field_from_json(Obj,"rx_packets",rx_packets);
|
||||||
|
field_from_json(Obj,"tx_bytes",tx_bytes);
|
||||||
|
field_from_json(Obj,"tx_packets",tx_packets);
|
||||||
|
field_from_json(Obj,"tx_dropped",tx_dropped);
|
||||||
|
field_from_json(Obj,"tx_errors",tx_errors);
|
||||||
|
field_from_json(Obj,"tx_packets",tx_packets);
|
||||||
|
|
||||||
|
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
||||||
|
field_from_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
||||||
|
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_from_json(Obj,"rx_errors_pct",rx_errors_pct);
|
||||||
|
field_from_json(Obj,"tx_errors_pct",tx_errors_pct);
|
||||||
|
|
||||||
|
field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta);
|
||||||
|
field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta);
|
||||||
|
field_from_json(Obj,"rx_dropped_delta",rx_dropped_delta);
|
||||||
|
field_from_json(Obj,"tx_dropped_delta",tx_dropped_delta);
|
||||||
|
field_from_json(Obj,"rx_packets_delta",rx_packets_delta);
|
||||||
|
field_from_json(Obj,"tx_packets_delta",tx_packets_delta);
|
||||||
|
field_from_json(Obj,"rx_errors_delta",rx_errors_delta);
|
||||||
|
field_from_json(Obj,"tx_errors_delta",tx_errors_delta);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIDstat_entry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"rx_msdu",rx_msdu);
|
||||||
|
field_to_json(Obj,"tx_msdu",tx_msdu);
|
||||||
|
field_to_json(Obj,"tx_msdu_failed",tx_msdu_failed);
|
||||||
|
field_to_json(Obj,"tx_msdu_retries",tx_msdu_retries);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TIDstat_entry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"rx_msdu",rx_msdu);
|
||||||
|
field_from_json(Obj,"tx_msdu",tx_msdu);
|
||||||
|
field_from_json(Obj,"tx_msdu_failed",tx_msdu_failed);
|
||||||
|
field_from_json(Obj,"tx_msdu_retries",tx_msdu_retries);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadioTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"band",band);
|
||||||
|
field_to_json(Obj,"channel_width",channel_width);
|
||||||
|
field_to_json(Obj,"active_ms",active_ms);
|
||||||
|
field_to_json(Obj,"busy_ms",busy_ms);
|
||||||
|
field_to_json(Obj,"receive_ms",receive_ms);
|
||||||
|
field_to_json(Obj,"transmit_ms",transmit_ms);
|
||||||
|
field_to_json(Obj,"tx_power",tx_power);
|
||||||
|
field_to_json(Obj,"channel",channel);
|
||||||
|
field_to_json(Obj,"temperature",temperature);
|
||||||
|
field_to_json(Obj,"noise",noise);
|
||||||
|
field_to_json(Obj,"active_pct",active_pct);
|
||||||
|
field_to_json(Obj,"busy_pct",busy_pct);
|
||||||
|
field_to_json(Obj,"receive_pct",receive_pct);
|
||||||
|
field_to_json(Obj,"transmit_pct",transmit_pct);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadioTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"band",band);
|
||||||
|
field_from_json(Obj,"channel_width",channel_width);
|
||||||
|
field_from_json(Obj,"active_ms",active_ms);
|
||||||
|
field_from_json(Obj,"busy_ms",busy_ms);
|
||||||
|
field_from_json(Obj,"receive_ms",receive_ms);
|
||||||
|
field_from_json(Obj,"transmit_ms",transmit_ms);
|
||||||
|
field_from_json(Obj,"tx_power",tx_power);
|
||||||
|
field_from_json(Obj,"channel",channel);
|
||||||
|
field_from_json(Obj,"temperature",temperature);
|
||||||
|
field_from_json(Obj,"noise",noise);
|
||||||
|
field_from_json(Obj,"active_pct",active_pct);
|
||||||
|
field_from_json(Obj,"busy_pct",busy_pct);
|
||||||
|
field_from_json(Obj,"receive_pct",receive_pct);
|
||||||
|
field_from_json(Obj,"transmit_pct",transmit_pct);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AveragePoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"min",min);
|
||||||
|
field_to_json(Obj,"max",max);
|
||||||
|
field_to_json(Obj,"avg",avg);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AveragePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"min",min);
|
||||||
|
field_from_json(Obj,"max",max);
|
||||||
|
field_from_json(Obj,"avg",avg);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSIDTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"bssid",bssid);
|
||||||
|
field_to_json(Obj,"mode",mode);
|
||||||
|
field_to_json(Obj,"ssid",ssid);
|
||||||
|
field_to_json(Obj,"band",band);
|
||||||
|
field_to_json(Obj,"channel",channel);
|
||||||
|
field_to_json(Obj,"associations",associations);
|
||||||
|
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_to_json(Obj,"tx_failed_pct",tx_failed_pct);
|
||||||
|
field_to_json(Obj,"tx_retries_pct",tx_retries_pct);
|
||||||
|
field_to_json(Obj,"tx_duration_pct",tx_duration_pct);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SSIDTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"bssid",bssid);
|
||||||
|
field_from_json(Obj,"mode",mode);
|
||||||
|
field_from_json(Obj,"ssid",ssid);
|
||||||
|
field_from_json(Obj,"band",band);
|
||||||
|
field_from_json(Obj,"channel",channel);
|
||||||
|
field_from_json(Obj,"associations",associations);
|
||||||
|
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_from_json(Obj,"tx_failed_pct",tx_failed_pct);
|
||||||
|
field_from_json(Obj,"tx_retries_pct",tx_retries_pct);
|
||||||
|
field_from_json(Obj,"tx_duration_pct",tx_duration_pct);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceTimePoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id",id);
|
||||||
|
field_to_json(Obj,"boardId",boardId);
|
||||||
|
field_to_json(Obj,"timestamp",timestamp);
|
||||||
|
field_to_json(Obj,"ap_data",ap_data);
|
||||||
|
field_to_json(Obj,"ssid_data",ssid_data);
|
||||||
|
field_to_json(Obj,"radio_data",radio_data);
|
||||||
|
field_to_json(Obj,"device_info",device_info);
|
||||||
|
field_to_json(Obj,"serialNumber",serialNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id",id);
|
||||||
|
field_from_json(Obj,"boardId",boardId);
|
||||||
|
field_from_json(Obj,"timestamp",timestamp);
|
||||||
|
field_from_json(Obj,"ap_data",ap_data);
|
||||||
|
field_from_json(Obj,"ssid_data",ssid_data);
|
||||||
|
field_from_json(Obj,"radio_data",radio_data);
|
||||||
|
field_from_json(Obj,"device_info",device_info);
|
||||||
|
field_from_json(Obj,"serialNumber",serialNumber);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceTimePointAnalysis::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"noise",noise);
|
||||||
|
field_to_json(Obj,"temperature",temperature);
|
||||||
|
field_to_json(Obj,"active_pct",active_pct);
|
||||||
|
field_to_json(Obj,"busy_pct",busy_pct);
|
||||||
|
field_to_json(Obj,"receive_pct",receive_pct);
|
||||||
|
field_to_json(Obj,"transmit_pct",transmit_pct);
|
||||||
|
field_to_json(Obj,"tx_power",tx_power);
|
||||||
|
field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
||||||
|
field_to_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
||||||
|
field_to_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_to_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_to_json(Obj,"rx_errors_pct",rx_errors_pct);
|
||||||
|
field_to_json(Obj,"tx_errors_pct",tx_errors_pct);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceTimePointAnalysis::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"noise",noise);
|
||||||
|
field_from_json(Obj,"temperature",temperature);
|
||||||
|
field_from_json(Obj,"active_pct",active_pct);
|
||||||
|
field_from_json(Obj,"busy_pct",busy_pct);
|
||||||
|
field_from_json(Obj,"receive_pct",receive_pct);
|
||||||
|
field_from_json(Obj,"transmit_pct",transmit_pct);
|
||||||
|
field_from_json(Obj,"tx_power",tx_power);
|
||||||
|
field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw);
|
||||||
|
field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw);
|
||||||
|
field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct);
|
||||||
|
field_from_json(Obj,"tx_dropped_pct",tx_dropped_pct);
|
||||||
|
field_from_json(Obj,"rx_packets_bw",rx_packets_bw);
|
||||||
|
field_from_json(Obj,"tx_packets_bw",tx_packets_bw);
|
||||||
|
field_from_json(Obj,"rx_errors_pct",rx_errors_pct);
|
||||||
|
field_from_json(Obj,"tx_errors_pct",tx_errors_pct);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceTimePointList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"points",points);
|
||||||
|
field_to_json(Obj,"stats",stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceTimePointList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"points",points);
|
||||||
|
field_from_json(Obj,"stats",stats);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceTimePointStats::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"firstPoint",firstPoint);
|
||||||
|
field_to_json(Obj,"lastPoint",lastPoint);
|
||||||
|
field_to_json(Obj,"count",count);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceTimePointStats::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"firstPoint",firstPoint);
|
||||||
|
field_from_json(Obj,"lastPoint",lastPoint);
|
||||||
|
field_from_json(Obj,"count",count);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WifiClientRate::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"bitrate",bitrate);
|
||||||
|
field_to_json(Obj,"chwidth",chwidth);
|
||||||
|
field_to_json(Obj,"mcs",mcs);
|
||||||
|
field_to_json(Obj,"nss",nss);
|
||||||
|
field_to_json(Obj,"vht",vht);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WifiClientRate::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"bitrate",bitrate);
|
||||||
|
field_from_json(Obj,"chwidth",chwidth);
|
||||||
|
field_from_json(Obj,"mcs",mcs);
|
||||||
|
field_from_json(Obj,"nss",nss);
|
||||||
|
field_from_json(Obj,"vht",vht);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"timestamp",timestamp);
|
||||||
|
field_to_json(Obj,"station_id",station_id);
|
||||||
|
field_to_json(Obj,"bssid",bssid);
|
||||||
|
field_to_json(Obj,"ssid",ssid);
|
||||||
|
field_to_json(Obj,"rssi",rssi);
|
||||||
|
field_to_json(Obj,"rx_bitrate",rx_bitrate);
|
||||||
|
field_to_json(Obj,"rx_chwidth",rx_chwidth);
|
||||||
|
field_to_json(Obj,"rx_mcs",rx_mcs);
|
||||||
|
field_to_json(Obj,"rx_nss",rx_nss);
|
||||||
|
field_to_json(Obj,"rx_vht",rx_vht);
|
||||||
|
field_to_json(Obj,"tx_bitrate",tx_bitrate);
|
||||||
|
field_to_json(Obj,"tx_chwidth",tx_chwidth);
|
||||||
|
field_to_json(Obj,"tx_mcs",tx_mcs);
|
||||||
|
field_to_json(Obj,"tx_nss",tx_nss);
|
||||||
|
field_to_json(Obj,"tx_vht",tx_vht);
|
||||||
|
field_to_json(Obj,"rx_bytes",rx_bytes);
|
||||||
|
field_to_json(Obj,"tx_bytes",tx_bytes);
|
||||||
|
field_to_json(Obj,"rx_duration",rx_duration);
|
||||||
|
field_to_json(Obj,"tx_duration",tx_duration);
|
||||||
|
field_to_json(Obj,"rx_packets",rx_packets);
|
||||||
|
field_to_json(Obj,"tx_packets",tx_packets);
|
||||||
|
field_to_json(Obj,"ipv4",ipv4);
|
||||||
|
field_to_json(Obj,"ipv6",ipv6);
|
||||||
|
field_to_json(Obj,"channel_width",channel_width);
|
||||||
|
field_to_json(Obj,"noise",noise);
|
||||||
|
field_to_json(Obj,"tx_power",tx_power);
|
||||||
|
field_to_json(Obj,"channel",channel);
|
||||||
|
field_to_json(Obj,"active_ms",active_ms);
|
||||||
|
field_to_json(Obj,"busy_ms",busy_ms);
|
||||||
|
field_to_json(Obj,"receive_ms",receive_ms);
|
||||||
|
field_to_json(Obj,"mode",mode);
|
||||||
|
field_to_json(Obj,"ack_signal",ack_signal);
|
||||||
|
field_to_json(Obj,"ack_signal_avg",ack_signal_avg);
|
||||||
|
field_to_json(Obj,"connected",connected);
|
||||||
|
field_to_json(Obj,"inactive",inactive);
|
||||||
|
field_to_json(Obj,"tx_retries",tx_retries);
|
||||||
|
field_to_json(Obj,"venue_id",venue_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"timestamp",timestamp);
|
||||||
|
field_from_json(Obj,"station_id",station_id);
|
||||||
|
field_from_json(Obj,"bssid",bssid);
|
||||||
|
field_from_json(Obj,"ssid",ssid);
|
||||||
|
field_from_json(Obj,"rssi",rssi);
|
||||||
|
field_from_json(Obj,"rx_bitrate",rx_bitrate);
|
||||||
|
field_from_json(Obj,"rx_chwidth",rx_chwidth);
|
||||||
|
field_from_json(Obj,"rx_mcs",rx_mcs);
|
||||||
|
field_from_json(Obj,"rx_nss",rx_nss);
|
||||||
|
field_from_json(Obj,"rx_vht",rx_vht);
|
||||||
|
field_from_json(Obj,"tx_bitrate",tx_bitrate);
|
||||||
|
field_from_json(Obj,"tx_chwidth",tx_chwidth);
|
||||||
|
field_from_json(Obj,"tx_mcs",tx_mcs);
|
||||||
|
field_from_json(Obj,"tx_nss",tx_nss);
|
||||||
|
field_from_json(Obj,"tx_vht",tx_vht);
|
||||||
|
field_from_json(Obj,"rx_bytes",rx_bytes);
|
||||||
|
field_from_json(Obj,"tx_bytes",tx_bytes);
|
||||||
|
field_from_json(Obj,"rx_duration",rx_duration);
|
||||||
|
field_from_json(Obj,"tx_duration",tx_duration);
|
||||||
|
field_from_json(Obj,"rx_packets",rx_packets);
|
||||||
|
field_from_json(Obj,"tx_packets",tx_packets);
|
||||||
|
field_from_json(Obj,"ipv4",ipv4);
|
||||||
|
field_from_json(Obj,"ipv6",ipv6);
|
||||||
|
field_from_json(Obj,"channel_width",channel_width);
|
||||||
|
field_from_json(Obj,"noise",noise);
|
||||||
|
field_from_json(Obj,"tx_power",tx_power);
|
||||||
|
field_from_json(Obj,"channel",channel);
|
||||||
|
field_from_json(Obj,"active_ms",active_ms);
|
||||||
|
field_from_json(Obj,"busy_ms",busy_ms);
|
||||||
|
field_from_json(Obj,"receive_ms",receive_ms);
|
||||||
|
field_from_json(Obj,"mode",mode);
|
||||||
|
field_from_json(Obj,"ack_signal",ack_signal);
|
||||||
|
field_from_json(Obj,"ack_signal_avg",ack_signal_avg);
|
||||||
|
field_from_json(Obj,"connected",connected);
|
||||||
|
field_from_json(Obj,"inactive",inactive);
|
||||||
|
field_from_json(Obj,"tx_retries",tx_retries);
|
||||||
|
field_from_json(Obj,"venue_id",venue_id);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
423
src/RESTObjects/RESTAPI_AnalyticsObjects.h
Normal file
423
src/RESTObjects/RESTAPI_AnalyticsObjects.h
Normal file
@@ -0,0 +1,423 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-01-10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "RESTAPI_ProvObjects.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
namespace AnalyticsObjects {
|
||||||
|
|
||||||
|
struct Report {
|
||||||
|
uint64_t snapShot = 0;
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VenueInfo {
|
||||||
|
OpenWifi::Types::UUID_t id;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
uint64_t retention = 0;
|
||||||
|
uint64_t interval = 0;
|
||||||
|
bool monitorSubVenues = false;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BoardInfo {
|
||||||
|
ProvObjects::ObjectInfo info;
|
||||||
|
std::vector<VenueInfo> venueList;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
|
||||||
|
inline bool operator<(const BoardInfo &bb) const {
|
||||||
|
return info.id < bb.info.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator==(const BoardInfo &bb) const {
|
||||||
|
return info.id == bb.info.id;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceInfo {
|
||||||
|
std::string boardId;
|
||||||
|
std::string type;
|
||||||
|
std::string serialNumber;
|
||||||
|
std::string deviceType;
|
||||||
|
uint64_t lastContact = 0 ;
|
||||||
|
uint64_t lastPing = 0;
|
||||||
|
uint64_t lastState = 0;
|
||||||
|
std::string lastFirmware;
|
||||||
|
uint64_t lastFirmwareUpdate = 0;
|
||||||
|
uint64_t lastConnection = 0;
|
||||||
|
uint64_t lastDisconnection = 0;
|
||||||
|
uint64_t pings = 0;
|
||||||
|
uint64_t states = 0;
|
||||||
|
bool connected = false;
|
||||||
|
std::string connectionIp;
|
||||||
|
uint64_t associations_2g = 0;
|
||||||
|
uint64_t associations_5g = 0;
|
||||||
|
uint64_t associations_6g = 0;
|
||||||
|
uint64_t health = 0;
|
||||||
|
uint64_t lastHealth = 0;
|
||||||
|
std::string locale;
|
||||||
|
uint64_t uptime = 0;
|
||||||
|
double memory = 0.0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceInfoList {
|
||||||
|
std::vector<DeviceInfo> devices;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
enum wifi_band {
|
||||||
|
band_2g = 0, band_5g = 1, band_6g = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TIDstat_entry {
|
||||||
|
uint64_t rx_msdu = 0,
|
||||||
|
tx_msdu = 0,
|
||||||
|
tx_msdu_failed = 0,
|
||||||
|
tx_msdu_retries = 0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UE_rate {
|
||||||
|
uint64_t bitrate=0;
|
||||||
|
uint64_t mcs=0;
|
||||||
|
uint64_t nss=0;
|
||||||
|
bool ht=false;
|
||||||
|
bool sgi=false;
|
||||||
|
uint64_t chwidth=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AveragePoint {
|
||||||
|
double min = 0.0,
|
||||||
|
max = 0.0,
|
||||||
|
avg = 0.0;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct UETimePoint {
|
||||||
|
std::string station;
|
||||||
|
int64_t rssi = 0;
|
||||||
|
uint64_t tx_bytes = 0,
|
||||||
|
rx_bytes = 0,
|
||||||
|
tx_duration = 0,
|
||||||
|
rx_packets = 0,
|
||||||
|
tx_packets = 0,
|
||||||
|
tx_retries = 0,
|
||||||
|
tx_failed = 0,
|
||||||
|
connected = 0,
|
||||||
|
inactive = 0;
|
||||||
|
|
||||||
|
double tx_bytes_bw = 0.0 ,
|
||||||
|
rx_bytes_bw = 0.0 ,
|
||||||
|
tx_packets_bw = 0.0 ,
|
||||||
|
rx_packets_bw = 0.0 ,
|
||||||
|
tx_failed_pct = 0.0 ,
|
||||||
|
tx_retries_pct = 0.0 ,
|
||||||
|
tx_duration_pct = 0.0;
|
||||||
|
|
||||||
|
uint64_t tx_bytes_delta = 0,
|
||||||
|
rx_bytes_delta = 0,
|
||||||
|
tx_duration_delta = 0,
|
||||||
|
rx_packets_delta = 0,
|
||||||
|
tx_packets_delta = 0,
|
||||||
|
tx_retries_delta = 0,
|
||||||
|
tx_failed_delta = 0;
|
||||||
|
|
||||||
|
UE_rate tx_rate,
|
||||||
|
rx_rate;
|
||||||
|
std::vector<TIDstat_entry> tidstats;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
enum SSID_MODES {
|
||||||
|
unknown = 0,
|
||||||
|
ap,
|
||||||
|
mesh,
|
||||||
|
sta,
|
||||||
|
wds_ap,
|
||||||
|
wds_sta,
|
||||||
|
wds_repeater
|
||||||
|
};
|
||||||
|
|
||||||
|
inline SSID_MODES SSID_Mode(const std::string &m) {
|
||||||
|
if (m == "ap")
|
||||||
|
return ap;
|
||||||
|
if (m == "sta")
|
||||||
|
return sta;
|
||||||
|
if (m == "mesh")
|
||||||
|
return mesh;
|
||||||
|
if (m == "wds-ap")
|
||||||
|
return wds_ap;
|
||||||
|
if (m == "wds-sta")
|
||||||
|
return wds_sta;
|
||||||
|
if (m == "wds-repeater")
|
||||||
|
return wds_repeater;
|
||||||
|
return unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SSIDTimePoint {
|
||||||
|
std::string bssid,
|
||||||
|
mode,
|
||||||
|
ssid;
|
||||||
|
uint64_t band=0,
|
||||||
|
channel=0;
|
||||||
|
std::vector<UETimePoint> associations;
|
||||||
|
|
||||||
|
AveragePoint tx_bytes_bw,
|
||||||
|
rx_bytes_bw,
|
||||||
|
tx_packets_bw,
|
||||||
|
rx_packets_bw,
|
||||||
|
tx_failed_pct,
|
||||||
|
tx_retries_pct,
|
||||||
|
tx_duration_pct;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct APTimePoint {
|
||||||
|
uint64_t collisions = 0,
|
||||||
|
multicast = 0,
|
||||||
|
rx_bytes = 0,
|
||||||
|
rx_dropped = 0,
|
||||||
|
rx_errors = 0,
|
||||||
|
rx_packets = 0,
|
||||||
|
tx_bytes = 0,
|
||||||
|
tx_dropped = 0,
|
||||||
|
tx_errors = 0,
|
||||||
|
tx_packets = 0;
|
||||||
|
|
||||||
|
double tx_bytes_bw = 0.0 ,
|
||||||
|
rx_bytes_bw = 0.0 ,
|
||||||
|
rx_dropped_pct = 0.0,
|
||||||
|
tx_dropped_pct = 0.0,
|
||||||
|
rx_packets_bw = 0.0,
|
||||||
|
tx_packets_bw = 0.0,
|
||||||
|
rx_errors_pct = 0.0 ,
|
||||||
|
tx_errors_pct = 0.0;
|
||||||
|
|
||||||
|
uint64_t tx_bytes_delta = 0,
|
||||||
|
rx_bytes_delta = 0 ,
|
||||||
|
rx_dropped_delta = 0,
|
||||||
|
tx_dropped_delta = 0,
|
||||||
|
rx_packets_delta = 0,
|
||||||
|
tx_packets_delta = 0,
|
||||||
|
rx_errors_delta = 0,
|
||||||
|
tx_errors_delta = 0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadioTimePoint {
|
||||||
|
uint64_t band = 0,
|
||||||
|
channel_width = 0;
|
||||||
|
uint64_t active_ms = 0,
|
||||||
|
busy_ms = 0,
|
||||||
|
receive_ms = 0,
|
||||||
|
transmit_ms = 0,
|
||||||
|
tx_power = 0,
|
||||||
|
channel = 0;
|
||||||
|
int64_t temperature = 0,
|
||||||
|
noise = 0;
|
||||||
|
|
||||||
|
double active_pct = 0.0 ,
|
||||||
|
busy_pct = 0.0,
|
||||||
|
receive_pct = 0.0,
|
||||||
|
transmit_pct = 0.0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct DeviceTimePoint {
|
||||||
|
std::string id;
|
||||||
|
std::string boardId;
|
||||||
|
uint64_t timestamp = 0;
|
||||||
|
APTimePoint ap_data;
|
||||||
|
std::vector<SSIDTimePoint> ssid_data;
|
||||||
|
std::vector<RadioTimePoint> radio_data;
|
||||||
|
AnalyticsObjects::DeviceInfo device_info;
|
||||||
|
std::string serialNumber;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
|
||||||
|
inline bool operator<(const DeviceTimePoint &rhs) const {
|
||||||
|
if(timestamp < rhs.timestamp)
|
||||||
|
return true;
|
||||||
|
if(timestamp > rhs.timestamp)
|
||||||
|
return false;
|
||||||
|
if(device_info.serialNumber < rhs.device_info.serialNumber)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator==(const DeviceTimePoint &rhs) const {
|
||||||
|
return timestamp==rhs.timestamp && device_info.serialNumber==rhs.device_info.serialNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>(const DeviceTimePoint &rhs) const {
|
||||||
|
if(timestamp > rhs.timestamp)
|
||||||
|
return true;
|
||||||
|
if(timestamp < rhs.timestamp)
|
||||||
|
return false;
|
||||||
|
if(device_info.serialNumber > rhs.device_info.serialNumber)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceTimePointAnalysis {
|
||||||
|
uint64_t timestamp;
|
||||||
|
|
||||||
|
AveragePoint noise;
|
||||||
|
AveragePoint temperature;
|
||||||
|
AveragePoint active_pct;
|
||||||
|
AveragePoint busy_pct;
|
||||||
|
AveragePoint receive_pct;
|
||||||
|
AveragePoint transmit_pct;
|
||||||
|
AveragePoint tx_power;
|
||||||
|
|
||||||
|
AveragePoint tx_bytes_bw;
|
||||||
|
AveragePoint rx_bytes_bw;
|
||||||
|
AveragePoint rx_dropped_pct;
|
||||||
|
AveragePoint tx_dropped_pct;
|
||||||
|
AveragePoint rx_packets_bw;
|
||||||
|
AveragePoint tx_packets_bw;
|
||||||
|
AveragePoint rx_errors_pct;
|
||||||
|
AveragePoint tx_errors_pct;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceTimePointList {
|
||||||
|
std::vector<DeviceTimePoint> points;
|
||||||
|
std::vector<DeviceTimePointAnalysis> stats;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BandwidthAnalysisEntry {
|
||||||
|
uint64_t timestamp = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BandwidthAnalysis {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AverageValueSigned {
|
||||||
|
int64_t peak=0, avg=0, low=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AverageValueUnsigned {
|
||||||
|
uint64_t peak=0, avg=0, low=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadioAnalysis {
|
||||||
|
uint64_t timestamp=0;
|
||||||
|
AverageValueSigned noise, temperature;
|
||||||
|
AverageValueUnsigned active_ms,
|
||||||
|
busy_ms,
|
||||||
|
transmit_ms,
|
||||||
|
receive_ms;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceTimePointStats {
|
||||||
|
uint64_t firstPoint=0;
|
||||||
|
uint64_t lastPoint=0;
|
||||||
|
uint64_t count=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WifiClientRate {
|
||||||
|
uint32_t bitrate=0;
|
||||||
|
uint32_t chwidth=0;
|
||||||
|
uint16_t mcs=0;
|
||||||
|
uint16_t nss=0;
|
||||||
|
bool vht=false;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WifiClientHistory {
|
||||||
|
uint64_t timestamp=Utils::Now();
|
||||||
|
std::string station_id;
|
||||||
|
std::string bssid;
|
||||||
|
std::string ssid;
|
||||||
|
int64_t rssi=0;
|
||||||
|
uint32_t rx_bitrate=0;
|
||||||
|
uint32_t rx_chwidth=0;
|
||||||
|
uint16_t rx_mcs=0;
|
||||||
|
uint16_t rx_nss=0;
|
||||||
|
bool rx_vht=false;
|
||||||
|
uint32_t tx_bitrate=0;
|
||||||
|
uint32_t tx_chwidth=0;
|
||||||
|
uint16_t tx_mcs=0;
|
||||||
|
uint16_t tx_nss=0;
|
||||||
|
bool tx_vht=false;
|
||||||
|
uint64_t rx_bytes=0;
|
||||||
|
uint64_t tx_bytes=0;
|
||||||
|
uint64_t rx_duration=0;
|
||||||
|
uint64_t tx_duration=0;
|
||||||
|
uint64_t rx_packets=0;
|
||||||
|
uint64_t tx_packets=0;
|
||||||
|
std::string ipv4;
|
||||||
|
std::string ipv6;
|
||||||
|
uint64_t channel_width=0;
|
||||||
|
int64_t noise=0;
|
||||||
|
uint64_t tx_power=0;
|
||||||
|
uint64_t channel=0;
|
||||||
|
uint64_t active_ms=0;
|
||||||
|
uint64_t busy_ms=0;
|
||||||
|
uint64_t receive_ms=0;
|
||||||
|
std::string mode;
|
||||||
|
int64_t ack_signal=0;
|
||||||
|
int64_t ack_signal_avg=0;
|
||||||
|
uint64_t connected=0;
|
||||||
|
uint64_t inactive=0;
|
||||||
|
uint64_t tx_retries=0;
|
||||||
|
std::string venue_id;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
210
src/RESTObjects/RESTAPI_CertObjects.cpp
Normal file
210
src/RESTObjects/RESTAPI_CertObjects.cpp
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-12-07.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "RESTAPI_CertObjects.h"
|
||||||
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
|
||||||
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
|
|
||||||
|
namespace OpenWifi::CertObjects {
|
||||||
|
void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"entity", entity);
|
||||||
|
field_to_json(Obj,"creator", creator);
|
||||||
|
field_to_json(Obj,"type", type);
|
||||||
|
field_to_json(Obj,"status", status);
|
||||||
|
field_to_json(Obj,"certificate", certificate);
|
||||||
|
field_to_json(Obj,"key", key);
|
||||||
|
field_to_json(Obj,"devid", devid);
|
||||||
|
field_to_json(Obj,"cas", cas);
|
||||||
|
field_to_json(Obj,"manufacturer", manufacturer);
|
||||||
|
field_to_json(Obj,"model", model);
|
||||||
|
field_to_json(Obj,"redirector", redirector);
|
||||||
|
field_to_json(Obj,"commonName", commonName);
|
||||||
|
field_to_json(Obj,"certificateId", certificateId);
|
||||||
|
field_to_json(Obj,"batch", batch);
|
||||||
|
field_to_json(Obj,"created", created);
|
||||||
|
field_to_json(Obj,"modified", modified);
|
||||||
|
field_to_json(Obj,"revoked", revoked);
|
||||||
|
field_to_json(Obj,"revokeCount", revokeCount);
|
||||||
|
field_to_json(Obj,"synched", synched);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id", id);
|
||||||
|
field_from_json(Obj,"entity", entity);
|
||||||
|
field_from_json(Obj,"creator", creator);
|
||||||
|
field_from_json(Obj,"type", type);
|
||||||
|
field_from_json(Obj,"status", status);
|
||||||
|
field_from_json(Obj,"certificate", certificate);
|
||||||
|
field_from_json(Obj,"key", key);
|
||||||
|
field_from_json(Obj,"devid", devid);
|
||||||
|
field_from_json(Obj,"cas", cas);
|
||||||
|
field_from_json(Obj,"manufacturer", manufacturer);
|
||||||
|
field_from_json(Obj,"model", model);
|
||||||
|
field_from_json(Obj,"redirector", redirector);
|
||||||
|
field_from_json(Obj,"commonName", commonName);
|
||||||
|
field_from_json(Obj,"certificateId", certificateId);
|
||||||
|
field_from_json(Obj,"batch", batch);
|
||||||
|
field_from_json(Obj,"created", created);
|
||||||
|
field_from_json(Obj,"modified", modified);
|
||||||
|
field_from_json(Obj,"revoked", revoked);
|
||||||
|
field_from_json(Obj,"revokeCount", revokeCount);
|
||||||
|
field_from_json(Obj,"synched", synched);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"creator", creator);
|
||||||
|
field_to_json(Obj,"name", name);
|
||||||
|
field_to_json(Obj,"description", description);
|
||||||
|
field_to_json(Obj,"defaultRedirector", defaultRedirector);
|
||||||
|
field_to_json(Obj,"apiKey", apiKey);
|
||||||
|
field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
||||||
|
field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
||||||
|
field_to_json(Obj,"organization", organization);
|
||||||
|
field_to_json(Obj,"created", created);
|
||||||
|
field_to_json(Obj,"modified", modified);
|
||||||
|
field_to_json(Obj,"suspended", suspended);
|
||||||
|
field_to_json(Obj,"deleted", deleted);
|
||||||
|
field_to_json(Obj,"notes", notes);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id", id);
|
||||||
|
field_from_json(Obj,"creator", creator);
|
||||||
|
field_from_json(Obj,"name", name);
|
||||||
|
field_from_json(Obj,"description", description);
|
||||||
|
field_from_json(Obj,"defaultRedirector", defaultRedirector);
|
||||||
|
field_from_json(Obj,"apiKey", apiKey);
|
||||||
|
field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
||||||
|
field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
||||||
|
field_from_json(Obj,"organization", organization);
|
||||||
|
field_from_json(Obj,"created", created);
|
||||||
|
field_from_json(Obj,"modified", modified);
|
||||||
|
field_from_json(Obj,"suspended", suspended);
|
||||||
|
field_from_json(Obj,"deleted", deleted);
|
||||||
|
field_from_json(Obj,"notes", notes);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BatchEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"entity", entity);
|
||||||
|
field_to_json(Obj,"creator", creator);
|
||||||
|
field_to_json(Obj,"name", name);
|
||||||
|
field_to_json(Obj,"description", description);
|
||||||
|
field_to_json(Obj,"manufacturer", manufacturer);
|
||||||
|
field_to_json(Obj,"model", model);
|
||||||
|
field_to_json(Obj,"redirector", redirector);
|
||||||
|
field_to_json(Obj,"commonNames", commonNames);
|
||||||
|
field_to_json(Obj,"jobHistory", jobHistory);
|
||||||
|
field_to_json(Obj,"notes", notes);
|
||||||
|
field_to_json(Obj,"submitted", submitted);
|
||||||
|
field_to_json(Obj,"started", started);
|
||||||
|
field_to_json(Obj,"completed", completed);
|
||||||
|
field_to_json(Obj,"modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id", id);
|
||||||
|
field_from_json(Obj,"entity", entity);
|
||||||
|
field_from_json(Obj,"creator", creator);
|
||||||
|
field_from_json(Obj,"name", name);
|
||||||
|
field_from_json(Obj,"description", description);
|
||||||
|
field_from_json(Obj,"manufacturer", manufacturer);
|
||||||
|
field_from_json(Obj,"model", model);
|
||||||
|
field_from_json(Obj,"redirector", redirector);
|
||||||
|
field_from_json(Obj,"commonNames", commonNames);
|
||||||
|
field_from_json(Obj,"jobHistory", jobHistory);
|
||||||
|
field_from_json(Obj,"notes", notes);
|
||||||
|
field_from_json(Obj,"submitted", submitted);
|
||||||
|
field_from_json(Obj,"started", started);
|
||||||
|
field_from_json(Obj,"completed", completed);
|
||||||
|
field_from_json(Obj,"modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JobEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"entity", entity);
|
||||||
|
field_to_json(Obj,"creator", creator);
|
||||||
|
field_to_json(Obj,"batch", batch);
|
||||||
|
field_to_json(Obj,"commonNames", commonNames);
|
||||||
|
field_to_json(Obj,"completedNames", completedNames);
|
||||||
|
field_to_json(Obj,"errorNames", errorNames);
|
||||||
|
field_to_json(Obj,"status", status);
|
||||||
|
field_to_json(Obj,"command", command);
|
||||||
|
field_to_json(Obj,"parameters", parameters);
|
||||||
|
field_to_json(Obj,"submitted", submitted);
|
||||||
|
field_to_json(Obj,"started", started);
|
||||||
|
field_to_json(Obj,"completed", completed);
|
||||||
|
field_to_json(Obj,"requesterUsername", requesterUsername);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id", id);
|
||||||
|
field_from_json(Obj,"entity", entity);
|
||||||
|
field_from_json(Obj,"creator", creator);
|
||||||
|
field_from_json(Obj,"batch", batch);
|
||||||
|
field_from_json(Obj,"commonNames", commonNames);
|
||||||
|
field_from_json(Obj,"completedNames", completedNames);
|
||||||
|
field_from_json(Obj,"errorNames", errorNames);
|
||||||
|
field_from_json(Obj,"status", status);
|
||||||
|
field_from_json(Obj,"command", command);
|
||||||
|
field_from_json(Obj,"parameters", parameters);
|
||||||
|
field_from_json(Obj,"submitted", submitted);
|
||||||
|
field_from_json(Obj,"started", started);
|
||||||
|
field_from_json(Obj,"completed", completed);
|
||||||
|
field_from_json(Obj,"requesterUsername", requesterUsername);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DashBoardYearlyStats::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "year", year);
|
||||||
|
field_to_json(Obj, "activeCerts", activeCerts);
|
||||||
|
field_to_json(Obj, "revokedCerts", revokedCerts);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dashboard::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"snapshot", snapshot);
|
||||||
|
field_to_json(Obj,"numberOfIssuedCerts", numberOfIssuedCerts);
|
||||||
|
field_to_json(Obj,"numberOfRevokedCerts", numberOfRevokedCerts);
|
||||||
|
field_to_json(Obj,"activeCertsPerOrganization", activeCertsPerOrganization);
|
||||||
|
field_to_json(Obj,"revokedCertsPerOrganization", revokedCertsPerOrganization);
|
||||||
|
field_to_json(Obj,"numberOfRedirectors", numberOfRedirectors);
|
||||||
|
field_to_json(Obj,"deviceTypes", deviceTypes);
|
||||||
|
field_to_json(Obj,"monthlyNumberOfCerts", monthlyNumberOfCerts);
|
||||||
|
field_to_json(Obj,"monthlyNumberOfCertsPerOrgPerYear", monthlyNumberOfCertsPerOrgPerYear);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dashboard::reset() {
|
||||||
|
snapshot=0;
|
||||||
|
numberOfRevokedCerts = numberOfIssuedCerts = 0;
|
||||||
|
activeCertsPerOrganization.clear();
|
||||||
|
revokedCertsPerOrganization.clear();
|
||||||
|
numberOfRedirectors.clear();
|
||||||
|
deviceTypes.clear();
|
||||||
|
monthlyNumberOfCerts.clear();
|
||||||
|
monthlyNumberOfCertsPerOrgPerYear.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
123
src/RESTObjects/RESTAPI_CertObjects.h
Normal file
123
src/RESTObjects/RESTAPI_CertObjects.h
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-12-07.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
#include "RESTObjects/RESTAPI_SecurityObjects.h"
|
||||||
|
|
||||||
|
namespace OpenWifi::CertObjects {
|
||||||
|
|
||||||
|
struct CertificateEntry {
|
||||||
|
OpenWifi::Types::UUID_t id;
|
||||||
|
OpenWifi::Types::UUID_t entity;
|
||||||
|
OpenWifi::Types::UUID_t creator;
|
||||||
|
std::string type;
|
||||||
|
std::string status;
|
||||||
|
std::string certificate;
|
||||||
|
std::string key;
|
||||||
|
std::string devid;
|
||||||
|
std::string cas;
|
||||||
|
std::string manufacturer;
|
||||||
|
std::string model;
|
||||||
|
std::string redirector;
|
||||||
|
std::string commonName;
|
||||||
|
std::string certificateId;
|
||||||
|
OpenWifi::Types::UUID_t batch;
|
||||||
|
uint64_t created = 0;
|
||||||
|
uint64_t modified = 0;
|
||||||
|
uint64_t revoked = 0;
|
||||||
|
uint64_t revokeCount = 0;
|
||||||
|
uint64_t synched = 0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct EntityEntry {
|
||||||
|
OpenWifi::Types::UUID_t id;
|
||||||
|
OpenWifi::Types::UUID_t creator;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
std::string defaultRedirector;
|
||||||
|
std::string apiKey;
|
||||||
|
std::string serverEnrollmentProfile;
|
||||||
|
std::string clientEnrollmentProfile;
|
||||||
|
std::string organization;
|
||||||
|
SecurityObjects::NoteInfoVec notes;
|
||||||
|
bool suspended=false;
|
||||||
|
bool deleted=false;
|
||||||
|
uint64_t created = 0 ;
|
||||||
|
uint64_t modified = 0 ;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BatchEntry {
|
||||||
|
OpenWifi::Types::UUID_t id;
|
||||||
|
OpenWifi::Types::UUID_t entity;
|
||||||
|
OpenWifi::Types::UUID_t creator;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
std::string manufacturer;
|
||||||
|
std::string model;
|
||||||
|
std::string redirector;
|
||||||
|
std::vector<std::string> commonNames;
|
||||||
|
std::vector<std::string> jobHistory;
|
||||||
|
SecurityObjects::NoteInfoVec notes;
|
||||||
|
uint64_t submitted = 0 ;
|
||||||
|
uint64_t started = 0 ;
|
||||||
|
uint64_t completed = 0 ;
|
||||||
|
uint64_t modified = 0 ;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct JobEntry {
|
||||||
|
OpenWifi::Types::UUID_t id;
|
||||||
|
OpenWifi::Types::UUID_t entity;
|
||||||
|
OpenWifi::Types::UUID_t creator;
|
||||||
|
OpenWifi::Types::UUID_t batch;
|
||||||
|
std::string command;
|
||||||
|
OpenWifi::Types::StringVec commonNames;
|
||||||
|
OpenWifi::Types::StringVec completedNames;
|
||||||
|
OpenWifi::Types::StringVec errorNames;
|
||||||
|
Types::StringPairVec parameters;
|
||||||
|
std::string status;
|
||||||
|
uint64_t submitted=0;
|
||||||
|
uint64_t started=0;
|
||||||
|
uint64_t completed=0;
|
||||||
|
std::string requesterUsername;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DashBoardYearlyStats {
|
||||||
|
uint64_t year=0;
|
||||||
|
OpenWifi::Types::Counted3DMapSII activeCerts;
|
||||||
|
OpenWifi::Types::Counted3DMapSII revokedCerts;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Dashboard {
|
||||||
|
uint64_t snapshot=0;
|
||||||
|
uint64_t numberOfIssuedCerts=0;
|
||||||
|
uint64_t numberOfRevokedCerts=0;
|
||||||
|
OpenWifi::Types::CountedMap activeCertsPerOrganization;
|
||||||
|
OpenWifi::Types::CountedMap revokedCertsPerOrganization;
|
||||||
|
OpenWifi::Types::CountedMap numberOfRedirectors;
|
||||||
|
OpenWifi::Types::CountedMap deviceTypes;
|
||||||
|
OpenWifi::Types::CountedMap monthlyNumberOfCerts;
|
||||||
|
std::vector<DashBoardYearlyStats> monthlyNumberOfCertsPerOrgPerYear;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
void reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,7 +3,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "RESTAPI_FMSObjects.h"
|
#include "RESTAPI_FMSObjects.h"
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
@@ -233,10 +234,10 @@ namespace OpenWifi::FMSObjects {
|
|||||||
UnknownFirmwares_.clear();
|
UnknownFirmwares_.clear();
|
||||||
totalSecondsOld_.clear();
|
totalSecondsOld_.clear();
|
||||||
numberOfDevices = 0 ;
|
numberOfDevices = 0 ;
|
||||||
snapshot = std::time(nullptr);
|
snapshot = Utils::Now();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DeviceReport::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool DeviceReport::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -245,4 +246,65 @@ namespace OpenWifi::FMSObjects {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceInformation::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "serialNumber",serialNumber);
|
||||||
|
field_to_json(Obj, "history", history);
|
||||||
|
field_to_json(Obj, "currentFirmware", currentFirmware);
|
||||||
|
field_to_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
||||||
|
field_to_json(Obj, "latestFirmware", latestFirmware);
|
||||||
|
field_to_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
||||||
|
field_to_json(Obj, "latestFirmwareAvailable",latestFirmwareAvailable);
|
||||||
|
field_to_json(Obj, "latestFirmwareURI",latestFirmwareURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceInformation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "serialNumber",serialNumber);
|
||||||
|
field_from_json(Obj, "history", history);
|
||||||
|
field_from_json(Obj, "currentFirmware", currentFirmware);
|
||||||
|
field_from_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
||||||
|
field_from_json(Obj, "latestFirmware", latestFirmware);
|
||||||
|
field_from_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
||||||
|
field_from_json(Obj, "latestFirmwareAvailable",latestFirmwareAvailable);
|
||||||
|
field_from_json(Obj, "latestFirmwareURI",latestFirmwareURI);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceCurrentInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "serialNumber",serialNumber);
|
||||||
|
field_to_json(Obj, "revision", revision);
|
||||||
|
field_to_json(Obj, "upgraded", upgraded);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceCurrentInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "serialNumber",serialNumber);
|
||||||
|
field_from_json(Obj, "revision", revision);
|
||||||
|
field_from_json(Obj, "upgraded", upgraded);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceCurrentInfoList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "devices",devices);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceCurrentInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "devices",devices);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#ifndef UCENTRALFMS_RESTAPI_FMSOBJECTS_H
|
#pragma once
|
||||||
#define UCENTRALFMS_RESTAPI_FMSOBJECTS_H
|
|
||||||
|
|
||||||
|
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
#include "RESTAPI_SecurityObjects.h"
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
@@ -127,7 +125,35 @@ namespace OpenWifi::FMSObjects {
|
|||||||
void reset();
|
void reset();
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DeviceInformation {
|
||||||
|
std::string serialNumber;
|
||||||
|
RevisionHistoryEntryList history;
|
||||||
|
std::string currentFirmware;
|
||||||
|
uint64_t currentFirmwareDate=0;
|
||||||
|
std::string latestFirmware;
|
||||||
|
uint64_t latestFirmwareDate=0;
|
||||||
|
bool latestFirmwareAvailable;
|
||||||
|
std::string latestFirmwareURI;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceCurrentInfo {
|
||||||
|
std::string serialNumber;
|
||||||
|
std::string revision;
|
||||||
|
uint64_t upgraded=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceCurrentInfoList {
|
||||||
|
std::vector<DeviceCurrentInfo> devices;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif //UCENTRALFMS_RESTAPI_FMSOBJECTS_H
|
|
||||||
|
|||||||
@@ -11,11 +11,13 @@
|
|||||||
|
|
||||||
#include "Daemon.h"
|
#include "Daemon.h"
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
#include "DeviceRegistry.h"
|
#include "AP_WS_Server.h"
|
||||||
|
#include "CapabilitiesCache.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "RESTAPI_GWobjects.h"
|
#include "RESTAPI_GWobjects.h"
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
@@ -26,7 +28,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
void Device::to_json(Poco::JSON::Object &Obj) const {
|
void Device::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"serialNumber", SerialNumber);
|
field_to_json(Obj,"serialNumber", SerialNumber);
|
||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
field_to_json(Obj,"deviceType", Daemon::instance()->IdentifyDevice(Compatible));
|
field_to_json(Obj,"deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
|
||||||
#endif
|
#endif
|
||||||
field_to_json(Obj,"macAddress", MACAddress);
|
field_to_json(Obj,"macAddress", MACAddress);
|
||||||
field_to_json(Obj,"manufacturer", Manufacturer);
|
field_to_json(Obj,"manufacturer", Manufacturer);
|
||||||
@@ -44,6 +46,14 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"compatible", Compatible);
|
field_to_json(Obj,"compatible", Compatible);
|
||||||
field_to_json(Obj,"fwUpdatePolicy", FWUpdatePolicy);
|
field_to_json(Obj,"fwUpdatePolicy", FWUpdatePolicy);
|
||||||
field_to_json(Obj,"devicePassword", DevicePassword);
|
field_to_json(Obj,"devicePassword", DevicePassword);
|
||||||
|
field_to_json(Obj,"subscriber", subscriber);
|
||||||
|
field_to_json(Obj,"entity", entity);
|
||||||
|
field_to_json(Obj,"modified", modified);
|
||||||
|
field_to_json(Obj,"locale", locale);
|
||||||
|
field_to_json(Obj,"restrictedDevice", restrictedDevice);
|
||||||
|
field_to_json(Obj,"pendingConfiguration", pendingConfiguration);
|
||||||
|
field_to_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd);
|
||||||
|
field_to_json(Obj,"restrictionDetails", restrictionDetails);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
|
void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
|
||||||
@@ -52,7 +62,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
#ifdef TIP_GATEWAY_SERVICE
|
#ifdef TIP_GATEWAY_SERVICE
|
||||||
ConnectionState ConState;
|
ConnectionState ConState;
|
||||||
|
|
||||||
if (DeviceRegistry()->GetState(SerialNumber, ConState)) {
|
if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
|
||||||
ConState.to_json(Obj);
|
ConState.to_json(Obj);
|
||||||
} else {
|
} else {
|
||||||
field_to_json(Obj,"ipAddress", "");
|
field_to_json(Obj,"ipAddress", "");
|
||||||
@@ -64,11 +74,12 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE");
|
field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE");
|
||||||
field_to_json(Obj,"associations_2G", (uint64_t) 0);
|
field_to_json(Obj,"associations_2G", (uint64_t) 0);
|
||||||
field_to_json(Obj,"associations_5G", (uint64_t) 0);
|
field_to_json(Obj,"associations_5G", (uint64_t) 0);
|
||||||
|
field_to_json(Obj,"associations_6G", (uint64_t) 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool Device::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"serialNumber",SerialNumber);
|
field_from_json(Obj,"serialNumber",SerialNumber);
|
||||||
field_from_json(Obj,"deviceType",DeviceType);
|
field_from_json(Obj,"deviceType",DeviceType);
|
||||||
@@ -80,6 +91,13 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_from_json(Obj,"location",Location);
|
field_from_json(Obj,"location",Location);
|
||||||
field_from_json(Obj,"venue",Venue);
|
field_from_json(Obj,"venue",Venue);
|
||||||
field_from_json(Obj,"compatible",Compatible);
|
field_from_json(Obj,"compatible",Compatible);
|
||||||
|
field_from_json(Obj,"subscriber", subscriber);
|
||||||
|
field_from_json(Obj,"entity", entity);
|
||||||
|
field_from_json(Obj,"locale", locale);
|
||||||
|
field_from_json(Obj,"restrictedDevice", restrictedDevice);
|
||||||
|
field_from_json(Obj,"pendingConfiguration", pendingConfiguration);
|
||||||
|
field_from_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd);
|
||||||
|
field_from_json(Obj,"restrictionDetails", restrictionDetails);
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
}
|
}
|
||||||
@@ -145,9 +163,10 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"custom", Custom);
|
field_to_json(Obj,"custom", Custom);
|
||||||
field_to_json(Obj,"waitingForFile", WaitingForFile);
|
field_to_json(Obj,"waitingForFile", WaitingForFile);
|
||||||
field_to_json(Obj,"attachFile", AttachDate);
|
field_to_json(Obj,"attachFile", AttachDate);
|
||||||
|
field_to_json(Obj,"executionTime", executionTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DefaultConfiguration::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"name",Name);
|
field_from_json(Obj,"name",Name);
|
||||||
field_from_json(Obj,"configuration",Configuration);
|
field_from_json(Obj,"configuration",Configuration);
|
||||||
@@ -166,7 +185,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"created", created);
|
field_to_json(Obj,"created", created);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BlackListedDevice::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool BlackListedDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"serialNumber",serialNumber);
|
field_from_json(Obj,"serialNumber",serialNumber);
|
||||||
field_from_json(Obj,"author",author);
|
field_from_json(Obj,"author",author);
|
||||||
@@ -179,7 +198,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
|
void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"serialNumber", SerialNumber);
|
|
||||||
field_to_json(Obj,"ipAddress", Address);
|
field_to_json(Obj,"ipAddress", Address);
|
||||||
field_to_json(Obj,"txBytes", TX);
|
field_to_json(Obj,"txBytes", TX);
|
||||||
field_to_json(Obj,"rxBytes", RX);
|
field_to_json(Obj,"rxBytes", RX);
|
||||||
@@ -190,6 +208,17 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"lastContact", LastContact);
|
field_to_json(Obj,"lastContact", LastContact);
|
||||||
field_to_json(Obj,"associations_2G", Associations_2G);
|
field_to_json(Obj,"associations_2G", Associations_2G);
|
||||||
field_to_json(Obj,"associations_5G", Associations_5G);
|
field_to_json(Obj,"associations_5G", Associations_5G);
|
||||||
|
field_to_json(Obj,"associations_6G", Associations_6G);
|
||||||
|
field_to_json(Obj,"webSocketClients", webSocketClients);
|
||||||
|
field_to_json(Obj,"websocketPackets", websocketPackets);
|
||||||
|
field_to_json(Obj,"kafkaClients", kafkaClients);
|
||||||
|
field_to_json(Obj,"kafkaPackets", kafkaPackets);
|
||||||
|
field_to_json(Obj,"locale", locale);
|
||||||
|
field_to_json(Obj,"started", started);
|
||||||
|
field_to_json(Obj,"sessionId", sessionId);
|
||||||
|
field_to_json(Obj,"connectionCompletionTime", connectionCompletionTime);
|
||||||
|
field_to_json(Obj,"totalConnectionTime", Utils::Now() - started);
|
||||||
|
field_to_json(Obj,"certificateExpiryDate", certificateExpiryDate);
|
||||||
|
|
||||||
switch(VerifiedCertificate) {
|
switch(VerifiedCertificate) {
|
||||||
case NO_CERTIFICATE:
|
case NO_CERTIFICATE:
|
||||||
@@ -205,6 +234,23 @@ namespace OpenWifi::GWObjects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceConnectionStatistics::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"averageConnectionTime", averageConnectionTime);
|
||||||
|
field_to_json(Obj,"connectedDevices", connectedDevices );
|
||||||
|
field_to_json(Obj,"connectingDevices", connectingDevices );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceConnectionStatistics::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"averageConnectionTime", averageConnectionTime);
|
||||||
|
field_from_json(Obj,"connectedDevices", connectedDevices );
|
||||||
|
field_from_json(Obj,"connectingDevices", connectingDevices );
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void RttySessionDetails::to_json(Poco::JSON::Object &Obj) const {
|
void RttySessionDetails::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"serialNumber", SerialNumber);
|
field_to_json(Obj,"serialNumber", SerialNumber);
|
||||||
field_to_json(Obj,"server", Server);
|
field_to_json(Obj,"server", Server);
|
||||||
@@ -251,7 +297,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
lastContact.clear();
|
lastContact.clear();
|
||||||
associations.clear();
|
associations.clear();
|
||||||
numberOfDevices = 0 ;
|
numberOfDevices = 0 ;
|
||||||
snapshot = std::time(nullptr);
|
snapshot = Utils::Now();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const{
|
void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const{
|
||||||
@@ -259,5 +305,243 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj,"capabilities", capabilities);
|
field_to_json(Obj,"capabilities", capabilities);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void ScriptRequest::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"serialNumber",serialNumber);
|
||||||
|
field_to_json(Obj,"timeout",timeout);
|
||||||
|
field_to_json(Obj,"type",type);
|
||||||
|
field_to_json(Obj,"scriptId",scriptId);
|
||||||
|
field_to_json(Obj,"script",script);
|
||||||
|
field_to_json(Obj,"when",when);
|
||||||
|
field_to_json(Obj,"signature", signature);
|
||||||
|
field_to_json(Obj,"deferred", deferred);
|
||||||
|
field_to_json(Obj,"uri", uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"serialNumber",serialNumber);
|
||||||
|
field_from_json(Obj,"timeout",timeout);
|
||||||
|
field_from_json(Obj,"type",type);
|
||||||
|
field_from_json(Obj,"script",script);
|
||||||
|
field_from_json(Obj,"scriptId",scriptId);
|
||||||
|
field_from_json(Obj,"when",when);
|
||||||
|
field_from_json(Obj,"signature", signature);
|
||||||
|
field_from_json(Obj,"deferred", deferred);
|
||||||
|
field_from_json(Obj,"uri", uri);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadiusProxyPoolList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"pools",pools);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadiusProxyPoolList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"pools",pools);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadiusProxyPool::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"name",name);
|
||||||
|
field_to_json(Obj,"description",description);
|
||||||
|
field_to_json(Obj,"authConfig",authConfig);
|
||||||
|
field_to_json(Obj,"acctConfig",acctConfig);
|
||||||
|
field_to_json(Obj,"coaConfig",coaConfig);
|
||||||
|
field_to_json(Obj,"useByDefault",useByDefault);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"name",name);
|
||||||
|
field_from_json(Obj,"description",description);
|
||||||
|
field_from_json(Obj,"authConfig",authConfig);
|
||||||
|
field_from_json(Obj,"acctConfig",acctConfig);
|
||||||
|
field_from_json(Obj,"coaConfig",coaConfig);
|
||||||
|
field_from_json(Obj,"useByDefault",useByDefault);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadiusProxyServerConfig::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"strategy",strategy);
|
||||||
|
field_to_json(Obj,"monitor",monitor);
|
||||||
|
field_to_json(Obj,"monitorMethod",monitorMethod);
|
||||||
|
field_to_json(Obj,"methodParameters",methodParameters);
|
||||||
|
field_to_json(Obj,"servers",servers);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadiusProxyServerConfig::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"strategy",strategy);
|
||||||
|
field_from_json(Obj,"monitor",monitor);
|
||||||
|
field_from_json(Obj,"monitorMethod",monitorMethod);
|
||||||
|
field_from_json(Obj,"methodParameters",methodParameters);
|
||||||
|
field_from_json(Obj,"servers",servers);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadiusProxyServerEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"name",name);
|
||||||
|
field_to_json(Obj,"ip",ip);
|
||||||
|
field_to_json(Obj,"port",port);
|
||||||
|
field_to_json(Obj,"weight",weight);
|
||||||
|
field_to_json(Obj,"secret",secret);
|
||||||
|
field_to_json(Obj,"certificate",certificate);
|
||||||
|
field_to_json(Obj,"radsec",radsec);
|
||||||
|
field_to_json(Obj,"allowSelfSigned",allowSelfSigned);
|
||||||
|
field_to_json(Obj,"radsecPort",radsecPort);
|
||||||
|
field_to_json(Obj,"radsecSecret",radsecSecret);
|
||||||
|
field_to_json(Obj,"radsecCacerts",radsecCacerts);
|
||||||
|
field_to_json(Obj,"radsecCert",radsecCert);
|
||||||
|
field_to_json(Obj,"radsecKey",radsecKey);
|
||||||
|
field_to_json(Obj,"radsecRealms",radsecRealms);
|
||||||
|
field_to_json(Obj,"ignore",ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadiusProxyServerEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"name",name);
|
||||||
|
field_from_json(Obj,"ip",ip);
|
||||||
|
field_from_json(Obj,"port",port);
|
||||||
|
field_from_json(Obj,"weight",weight);
|
||||||
|
field_from_json(Obj,"secret",secret);
|
||||||
|
field_from_json(Obj,"certificate",certificate);
|
||||||
|
field_from_json(Obj,"radsec",radsec);
|
||||||
|
field_from_json(Obj,"allowSelfSigned",allowSelfSigned);
|
||||||
|
field_from_json(Obj,"radsecSecret",radsecSecret);
|
||||||
|
field_from_json(Obj,"radsecPort",radsecPort);
|
||||||
|
field_from_json(Obj,"radsecCacerts",radsecCacerts);
|
||||||
|
field_from_json(Obj,"radsecCert",radsecCert);
|
||||||
|
field_from_json(Obj,"radsecKey",radsecKey);
|
||||||
|
field_from_json(Obj,"radsecRealms",radsecRealms);
|
||||||
|
field_from_json(Obj,"ignore",ignore);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"name", name);
|
||||||
|
field_to_json(Obj,"description", description);
|
||||||
|
field_to_json(Obj,"uri", uri);
|
||||||
|
field_to_json(Obj,"content", content);
|
||||||
|
field_to_json(Obj,"version", version);
|
||||||
|
field_to_json(Obj,"type", type);
|
||||||
|
field_to_json(Obj,"created", created);
|
||||||
|
field_to_json(Obj,"modified", modified);
|
||||||
|
field_to_json(Obj,"author", author);
|
||||||
|
field_to_json(Obj,"restricted", restricted);
|
||||||
|
field_to_json(Obj,"deferred", deferred);
|
||||||
|
field_to_json(Obj,"timeout", timeout);
|
||||||
|
field_to_json(Obj,"defaultUploadURI", defaultUploadURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id", id);
|
||||||
|
field_from_json(Obj,"name", name);
|
||||||
|
field_from_json(Obj,"description", description);
|
||||||
|
field_from_json(Obj,"uri", uri);
|
||||||
|
field_from_json(Obj,"content", content);
|
||||||
|
field_from_json(Obj,"version", version);
|
||||||
|
field_from_json(Obj,"type", type);
|
||||||
|
field_from_json(Obj,"created", created);
|
||||||
|
field_from_json(Obj,"modified", modified);
|
||||||
|
field_from_json(Obj,"author", author);
|
||||||
|
field_from_json(Obj,"restricted", restricted);
|
||||||
|
field_from_json(Obj,"deferred", deferred);
|
||||||
|
field_from_json(Obj,"timeout", timeout);
|
||||||
|
field_from_json(Obj,"defaultUploadURI", defaultUploadURI);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEntryList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"scripts",scripts);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScriptEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"scripts",scripts);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"vendor", vendor);
|
||||||
|
field_to_json(Obj,"algo", algo);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceRestrictionsKeyInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"vendor", vendor);
|
||||||
|
field_from_json(Obj,"algo", algo);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceRestrictions::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"dfs", dfs);
|
||||||
|
field_to_json(Obj,"ssh", ssh);
|
||||||
|
field_to_json(Obj,"rtty", rtty);
|
||||||
|
field_to_json(Obj,"tty", tty);
|
||||||
|
field_to_json(Obj,"developer", developer);
|
||||||
|
field_to_json(Obj,"upgrade", upgrade);
|
||||||
|
field_to_json(Obj,"commands", commands);
|
||||||
|
field_to_json(Obj,"country", country);
|
||||||
|
field_to_json(Obj,"key_info", key_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceRestrictions::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"dfs", dfs);
|
||||||
|
field_from_json(Obj,"ssh", ssh);
|
||||||
|
field_from_json(Obj,"rtty", rtty);
|
||||||
|
field_from_json(Obj,"tty", tty);
|
||||||
|
field_from_json(Obj,"developer", developer);
|
||||||
|
field_from_json(Obj,"upgrade", upgrade);
|
||||||
|
field_from_json(Obj,"commands", commands);
|
||||||
|
field_from_json(Obj,"country", country);
|
||||||
|
field_from_json(Obj,"key_info", key_info);
|
||||||
|
return true;
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceRestrictionsKeyInfo::operator!=(const OpenWifi::GWObjects::DeviceRestrictionsKeyInfo &T) const {
|
||||||
|
return (T.algo!=algo) || (T.vendor!=vendor);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceRestrictions::operator!=(const OpenWifi::GWObjects::DeviceRestrictions &T) const {
|
||||||
|
return ( (T.dfs!=dfs) ||
|
||||||
|
(T.rtty!=rtty) ||
|
||||||
|
(T.upgrade!=upgrade) ||
|
||||||
|
(T.commands != commands) ||
|
||||||
|
(T.developer != developer) ||
|
||||||
|
(T.ssh !=ssh) ||
|
||||||
|
(T.key_info != key_info) ||
|
||||||
|
(T.country != country) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,7 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRAL_RESTAPI_OBJECTS_H
|
#pragma once
|
||||||
#define UCENTRAL_RESTAPI_OBJECTS_H
|
|
||||||
|
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
#include "RESTAPI_SecurityObjects.h"
|
||||||
@@ -23,21 +22,58 @@ namespace OpenWifi::GWObjects {
|
|||||||
|
|
||||||
struct ConnectionState {
|
struct ConnectionState {
|
||||||
uint64_t MessageCount = 0 ;
|
uint64_t MessageCount = 0 ;
|
||||||
std::string SerialNumber;
|
|
||||||
std::string Address;
|
std::string Address;
|
||||||
uint64_t UUID = 0 ;
|
uint64_t UUID = 0 ;
|
||||||
uint64_t PendingUUID = 0 ;
|
uint64_t PendingUUID = 0 ;
|
||||||
uint64_t TX = 0, RX = 0;
|
uint64_t TX = 0, RX = 0;
|
||||||
uint64_t Associations_2G=0;
|
uint64_t Associations_2G=0;
|
||||||
uint64_t Associations_5G=0;
|
uint64_t Associations_5G=0;
|
||||||
|
uint64_t Associations_6G=0;
|
||||||
bool Connected = false;
|
bool Connected = false;
|
||||||
uint64_t LastContact=0;
|
uint64_t LastContact=0;
|
||||||
std::string Firmware;
|
std::string Firmware;
|
||||||
CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
|
CertificateValidation VerifiedCertificate = NO_CERTIFICATE;
|
||||||
std::string Compatible;
|
std::string Compatible;
|
||||||
|
uint64_t kafkaClients=0;
|
||||||
|
uint64_t webSocketClients=0;
|
||||||
|
uint64_t kafkaPackets=0;
|
||||||
|
uint64_t websocketPackets=0;
|
||||||
|
std::string locale;
|
||||||
|
uint64_t started=0;
|
||||||
|
uint64_t sessionId=0;
|
||||||
|
double connectionCompletionTime=0.0;
|
||||||
|
std::uint64_t certificateExpiryDate=0;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DeviceRestrictionsKeyInfo {
|
||||||
|
std::string vendor;
|
||||||
|
std::string algo;
|
||||||
|
|
||||||
|
bool operator !=(const DeviceRestrictionsKeyInfo &b) const;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceRestrictions {
|
||||||
|
bool dfs = false;
|
||||||
|
bool ssh = false;
|
||||||
|
bool rtty = false;
|
||||||
|
bool tty = false;
|
||||||
|
bool developer = false;
|
||||||
|
bool upgrade = false;
|
||||||
|
bool commands = false;
|
||||||
|
std::vector<std::string> country;
|
||||||
|
DeviceRestrictionsKeyInfo key_info;
|
||||||
|
|
||||||
|
bool operator !=(const DeviceRestrictions &D) const;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct Device {
|
struct Device {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
std::string DeviceType;
|
std::string DeviceType;
|
||||||
@@ -50,40 +86,58 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string Firmware;
|
std::string Firmware;
|
||||||
std::string Compatible;
|
std::string Compatible;
|
||||||
std::string FWUpdatePolicy;
|
std::string FWUpdatePolicy;
|
||||||
uint64_t UUID;
|
uint64_t UUID = 0 ;
|
||||||
uint64_t CreationTimestamp;
|
uint64_t CreationTimestamp = 0 ;
|
||||||
uint64_t LastConfigurationChange;
|
uint64_t LastConfigurationChange = 0 ;
|
||||||
uint64_t LastConfigurationDownload;
|
uint64_t LastConfigurationDownload = 0 ;
|
||||||
uint64_t LastFWUpdate;
|
uint64_t LastFWUpdate = 0 ;
|
||||||
std::string Venue;
|
std::string Venue;
|
||||||
std::string DevicePassword;
|
std::string DevicePassword;
|
||||||
|
std::string subscriber;
|
||||||
|
std::string entity;
|
||||||
|
uint64_t modified=0;
|
||||||
|
std::string locale;
|
||||||
|
bool restrictedDevice=false;
|
||||||
|
std::string pendingConfiguration;
|
||||||
|
std::string pendingConfigurationCmd;
|
||||||
|
DeviceRestrictions restrictionDetails;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
void to_json_with_status(Poco::JSON::Object &Obj) const;
|
void to_json_with_status(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
void Print() const;
|
void Print() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DeviceConnectionStatistics {
|
||||||
|
std::uint64_t connectedDevices = 0;
|
||||||
|
std::uint64_t averageConnectionTime = 0;
|
||||||
|
std::uint64_t connectingDevices = 0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct Statistics {
|
struct Statistics {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
uint64_t UUID;
|
uint64_t UUID = 0 ;
|
||||||
std::string Data;
|
std::string Data;
|
||||||
uint64_t Recorded;
|
uint64_t Recorded = 0;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct HealthCheck {
|
struct HealthCheck {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
uint64_t UUID;
|
uint64_t UUID = 0 ;
|
||||||
std::string Data;
|
std::string Data;
|
||||||
uint64_t Recorded;
|
uint64_t Recorded = 0 ;
|
||||||
uint64_t Sanity;
|
uint64_t Sanity = 0 ;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Capabilities {
|
struct Capabilities {
|
||||||
std::string Capabilities;
|
std::string Capabilities;
|
||||||
uint64_t FirstUpdate;
|
uint64_t FirstUpdate = 0 ;
|
||||||
uint64_t LastUpdate;
|
uint64_t LastUpdate = 0 ;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -101,22 +155,22 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
std::string Log;
|
std::string Log;
|
||||||
std::string Data;
|
std::string Data;
|
||||||
uint64_t Severity;
|
uint64_t Severity = 0 ;
|
||||||
uint64_t Recorded;
|
uint64_t Recorded = 0 ;
|
||||||
uint64_t LogType;
|
uint64_t LogType = 0 ;
|
||||||
uint64_t UUID;
|
uint64_t UUID = 0 ;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DefaultConfiguration {
|
struct DefaultConfiguration {
|
||||||
std::string Name;
|
std::string Name;
|
||||||
std::string Configuration;
|
std::string Configuration;
|
||||||
std::string Models;
|
Types::StringVec Models;
|
||||||
std::string Description;
|
std::string Description;
|
||||||
uint64_t Created;
|
uint64_t Created;
|
||||||
uint64_t LastModified;
|
uint64_t LastModified;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CommandDetails {
|
struct CommandDetails {
|
||||||
@@ -138,6 +192,7 @@ namespace OpenWifi::GWObjects {
|
|||||||
uint64_t AttachDate = 0 ;
|
uint64_t AttachDate = 0 ;
|
||||||
uint64_t AttachSize = 0 ;
|
uint64_t AttachSize = 0 ;
|
||||||
std::string AttachType;
|
std::string AttachType;
|
||||||
|
double executionTime = 0.0;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -147,26 +202,26 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::string author;
|
std::string author;
|
||||||
uint64_t created;
|
uint64_t created;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RttySessionDetails {
|
struct RttySessionDetails {
|
||||||
std::string SerialNumber;
|
std::string SerialNumber;
|
||||||
std::string Server;
|
std::string Server;
|
||||||
uint64_t Port;
|
uint64_t Port = 0 ;
|
||||||
std::string Token;
|
std::string Token;
|
||||||
uint64_t TimeOut;
|
uint64_t TimeOut = 0 ;
|
||||||
std::string ConnectionId;
|
std::string ConnectionId;
|
||||||
uint64_t Started;
|
uint64_t Started = 0 ;
|
||||||
std::string CommandUUID;
|
std::string CommandUUID;
|
||||||
uint64_t ViewPort;
|
uint64_t ViewPort = 0 ;
|
||||||
std::string DevicePassword;
|
std::string DevicePassword;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Dashboard {
|
struct Dashboard {
|
||||||
uint64_t snapshot;
|
uint64_t snapshot = 0 ;
|
||||||
uint64_t numberOfDevices;
|
uint64_t numberOfDevices = 0 ;
|
||||||
Types::CountedMap commands;
|
Types::CountedMap commands;
|
||||||
Types::CountedMap upTimes;
|
Types::CountedMap upTimes;
|
||||||
Types::CountedMap memoryUsed;
|
Types::CountedMap memoryUsed;
|
||||||
@@ -190,6 +245,98 @@ namespace OpenWifi::GWObjects {
|
|||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
#endif //UCENTRAL_RESTAPI_OBJECTS_H
|
struct ScriptEntry {
|
||||||
|
std::string id;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
std::string uri;
|
||||||
|
std::string content;
|
||||||
|
std::string version;
|
||||||
|
std::string type;
|
||||||
|
std::uint64_t created;
|
||||||
|
std::uint64_t modified;
|
||||||
|
std::string author;
|
||||||
|
Types::StringVec restricted;
|
||||||
|
bool deferred=false;
|
||||||
|
std::uint64_t timeout=30;
|
||||||
|
std::string defaultUploadURI;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ScriptEntryList {
|
||||||
|
std::vector<ScriptEntry> scripts;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ScriptRequest {
|
||||||
|
std::string serialNumber;
|
||||||
|
uint64_t timeout=30;
|
||||||
|
std::string type;
|
||||||
|
std::string script;
|
||||||
|
std::string scriptId;
|
||||||
|
std::uint64_t when;
|
||||||
|
std::string signature;
|
||||||
|
bool deferred;
|
||||||
|
std::string uri;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadiusProxyServerEntry {
|
||||||
|
std::string name;
|
||||||
|
std::string ip;
|
||||||
|
uint16_t port=0;
|
||||||
|
uint64_t weight=0;
|
||||||
|
std::string secret;
|
||||||
|
std::string certificate;
|
||||||
|
bool radsec=false;
|
||||||
|
bool allowSelfSigned=false;
|
||||||
|
uint16_t radsecPort=2083;
|
||||||
|
std::string radsecSecret;
|
||||||
|
std::string radsecKey;
|
||||||
|
std::string radsecCert;
|
||||||
|
std::vector<std::string> radsecCacerts;
|
||||||
|
std::vector<std::string> radsecRealms;
|
||||||
|
bool ignore=false;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadiusProxyServerConfig {
|
||||||
|
std::string strategy;
|
||||||
|
bool monitor=false;
|
||||||
|
std::string monitorMethod;
|
||||||
|
std::vector<std::string> methodParameters;
|
||||||
|
std::vector<RadiusProxyServerEntry> servers;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadiusProxyPool {
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
RadiusProxyServerConfig authConfig;
|
||||||
|
RadiusProxyServerConfig acctConfig;
|
||||||
|
RadiusProxyServerConfig coaConfig;
|
||||||
|
bool useByDefault=false;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadiusProxyPoolList {
|
||||||
|
std::vector<RadiusProxyPool> pools;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
110
src/RESTObjects/RESTAPI_OWLSobjects.cpp
Normal file
110
src/RESTObjects/RESTAPI_OWLSobjects.cpp
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-08-31.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
|
||||||
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
|
using OpenWifi::RESTAPI_utils::EmbedDocument;
|
||||||
|
|
||||||
|
#include "RESTAPI_OWLSobjects.h"
|
||||||
|
|
||||||
|
// SIM -> 0x53/0x073, 0x49/0x69, 0x4d/0x6d
|
||||||
|
|
||||||
|
namespace OpenWifi::OWLSObjects {
|
||||||
|
|
||||||
|
void SimulationDetails::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"name", name);
|
||||||
|
field_to_json(Obj,"gateway", gateway);
|
||||||
|
field_to_json(Obj,"certificate", certificate);
|
||||||
|
field_to_json(Obj,"key", key);
|
||||||
|
field_to_json(Obj,"macPrefix", macPrefix);
|
||||||
|
field_to_json(Obj,"deviceType", deviceType);
|
||||||
|
field_to_json(Obj,"devices", devices);
|
||||||
|
field_to_json(Obj,"healthCheckInterval", healthCheckInterval);
|
||||||
|
field_to_json(Obj,"stateInterval", stateInterval);
|
||||||
|
field_to_json(Obj,"minAssociations", minAssociations);
|
||||||
|
field_to_json(Obj,"maxAssociations", maxAssociations);
|
||||||
|
field_to_json(Obj,"minClients", minClients);
|
||||||
|
field_to_json(Obj,"maxClients", maxClients);
|
||||||
|
field_to_json(Obj,"simulationLength", simulationLength);
|
||||||
|
field_to_json(Obj,"threads", threads);
|
||||||
|
field_to_json(Obj,"clientInterval", clientInterval);
|
||||||
|
field_to_json(Obj,"keepAlive", keepAlive);
|
||||||
|
field_to_json(Obj,"reconnectInterval", reconnectInterval);
|
||||||
|
field_to_json(Obj,"concurrentDevices", concurrentDevices);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SimulationDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id", id);
|
||||||
|
field_from_json(Obj,"name", name);
|
||||||
|
field_from_json(Obj,"gateway", gateway);
|
||||||
|
field_from_json(Obj,"certificate", certificate);
|
||||||
|
field_from_json(Obj,"key", key);
|
||||||
|
field_from_json(Obj,"macPrefix", macPrefix);
|
||||||
|
field_from_json(Obj,"deviceType", deviceType);
|
||||||
|
field_from_json(Obj,"devices", devices);
|
||||||
|
field_from_json(Obj,"healthCheckInterval", healthCheckInterval);
|
||||||
|
field_from_json(Obj,"stateInterval", stateInterval);
|
||||||
|
field_from_json(Obj,"minAssociations", minAssociations);
|
||||||
|
field_from_json(Obj,"maxAssociations", maxAssociations);
|
||||||
|
field_from_json(Obj,"minClients", minClients);
|
||||||
|
field_from_json(Obj,"maxClients", maxClients);
|
||||||
|
field_from_json(Obj,"simulationLength", simulationLength);
|
||||||
|
field_from_json(Obj,"threads", threads);
|
||||||
|
field_from_json(Obj,"clientInterval", clientInterval);
|
||||||
|
field_from_json(Obj,"keepAlive", keepAlive);
|
||||||
|
field_from_json(Obj,"reconnectInterval", reconnectInterval);
|
||||||
|
field_from_json(Obj,"concurrentDevices", concurrentDevices);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimulationDetailsList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"list", list);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SimulationDetailsList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"list", list);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SimulationStatus::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id", id);
|
||||||
|
field_to_json(Obj,"simulationId", simulationId);
|
||||||
|
field_to_json(Obj,"state", state);
|
||||||
|
field_to_json(Obj,"tx", tx);
|
||||||
|
field_to_json(Obj,"rx", rx);
|
||||||
|
field_to_json(Obj,"msgsTx", msgsTx);
|
||||||
|
field_to_json(Obj,"msgsRx", msgsRx);
|
||||||
|
field_to_json(Obj,"liveDevices", liveDevices);
|
||||||
|
field_to_json(Obj,"timeToFullDevices", timeToFullDevices);
|
||||||
|
field_to_json(Obj,"startTime", startTime);
|
||||||
|
field_to_json(Obj,"endTime", endTime);
|
||||||
|
field_to_json(Obj,"errorDevices", errorDevices);
|
||||||
|
field_to_json(Obj,"owner", owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dashboard::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Dashboard::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dashboard::reset() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
77
src/RESTObjects/RESTAPI_OWLSobjects.h
Normal file
77
src/RESTObjects/RESTAPI_OWLSobjects.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-08-31.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UCENTRALSIM_RESTAPI_OWLSOBJECTS_H
|
||||||
|
#define UCENTRALSIM_RESTAPI_OWLSOBJECTS_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "Poco/JSON/Object.h"
|
||||||
|
|
||||||
|
namespace OpenWifi::OWLSObjects {
|
||||||
|
|
||||||
|
struct SimulationDetails {
|
||||||
|
std::string id;
|
||||||
|
std::string name;
|
||||||
|
std::string gateway;
|
||||||
|
std::string certificate;
|
||||||
|
std::string key;
|
||||||
|
std::string macPrefix;
|
||||||
|
std::string deviceType;
|
||||||
|
uint64_t devices = 5;
|
||||||
|
uint64_t healthCheckInterval = 60;
|
||||||
|
uint64_t stateInterval = 60 ;
|
||||||
|
uint64_t minAssociations = 1;
|
||||||
|
uint64_t maxAssociations = 3;
|
||||||
|
uint64_t minClients = 1 ;
|
||||||
|
uint64_t maxClients = 3;
|
||||||
|
uint64_t simulationLength = 60 * 60;
|
||||||
|
uint64_t threads = 16;
|
||||||
|
uint64_t clientInterval = 1;
|
||||||
|
uint64_t keepAlive = 300;
|
||||||
|
uint64_t reconnectInterval = 30 ;
|
||||||
|
uint64_t concurrentDevices = 5;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SimulationDetailsList {
|
||||||
|
std::vector<SimulationDetails> list;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SimulationStatus {
|
||||||
|
std::string id;
|
||||||
|
std::string simulationId;
|
||||||
|
std::string state;
|
||||||
|
uint64_t tx;
|
||||||
|
uint64_t rx;
|
||||||
|
uint64_t msgsTx;
|
||||||
|
uint64_t msgsRx;
|
||||||
|
uint64_t liveDevices;
|
||||||
|
uint64_t timeToFullDevices;
|
||||||
|
uint64_t startTime;
|
||||||
|
uint64_t endTime;
|
||||||
|
uint64_t errorDevices;
|
||||||
|
std::string owner;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Dashboard {
|
||||||
|
int O;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif //UCENTRALSIM_RESTAPI_OWLSOBJECTS_H
|
||||||
@@ -8,7 +8,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "RESTAPI_ProvObjects.h"
|
#include "RESTAPI_ProvObjects.h"
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
@@ -91,8 +93,13 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_to_json( Obj,"devices",devices);
|
field_to_json( Obj,"devices",devices);
|
||||||
field_to_json( Obj,"rrm",rrm);
|
field_to_json( Obj,"deviceRules",deviceRules);
|
||||||
field_to_json( Obj,"sourceIP",sourceIP);
|
field_to_json( Obj,"sourceIP",sourceIP);
|
||||||
|
field_to_json( Obj,"variables", variables);
|
||||||
|
field_to_json( Obj,"managementPolicies", managementPolicies);
|
||||||
|
field_to_json( Obj,"managementRoles", managementRoles);
|
||||||
|
field_to_json( Obj,"maps", maps);
|
||||||
|
field_to_json( Obj,"configurations", configurations);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -106,8 +113,13 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_from_json( Obj,"devices",devices);
|
field_from_json( Obj,"devices",devices);
|
||||||
field_from_json( Obj,"rrm",rrm);
|
field_from_json( Obj,"deviceRules",deviceRules);
|
||||||
field_from_json( Obj,"sourceIP",sourceIP);
|
field_from_json( Obj,"sourceIP",sourceIP);
|
||||||
|
field_from_json( Obj,"variables", variables);
|
||||||
|
field_from_json( Obj,"managementPolicies", managementPolicies);
|
||||||
|
field_from_json( Obj,"managementRoles", managementRoles);
|
||||||
|
field_from_json( Obj,"maps", maps);
|
||||||
|
field_from_json( Obj,"configurations", configurations);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -142,10 +154,16 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"design",design);
|
field_to_json( Obj,"design",design);
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_to_json( Obj,"contact",contact);
|
field_to_json( Obj,"contacts",contacts);
|
||||||
field_to_json( Obj,"location",location);
|
field_to_json( Obj,"location",location);
|
||||||
field_to_json( Obj,"rrm",rrm);
|
field_to_json( Obj,"deviceRules",deviceRules);
|
||||||
field_to_json( Obj,"sourceIP",sourceIP);
|
field_to_json( Obj,"sourceIP",sourceIP);
|
||||||
|
field_to_json( Obj,"variables", variables);
|
||||||
|
field_to_json( Obj,"managementPolicies", managementPolicies);
|
||||||
|
field_to_json( Obj,"managementRoles", managementRoles);
|
||||||
|
field_to_json( Obj,"maps", maps);
|
||||||
|
field_to_json( Obj,"configurations", configurations);
|
||||||
|
field_to_json( Obj,"boards", boards);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -160,10 +178,16 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"design",design);
|
field_from_json( Obj,"design",design);
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_from_json( Obj,"contact",contact);
|
field_from_json( Obj,"contacts",contacts);
|
||||||
field_from_json( Obj,"location",location);
|
field_from_json( Obj,"location",location);
|
||||||
field_from_json( Obj,"rrm",rrm);
|
field_from_json( Obj,"deviceRules",deviceRules);
|
||||||
field_from_json( Obj,"sourceIP",sourceIP);
|
field_from_json( Obj,"sourceIP",sourceIP);
|
||||||
|
field_from_json( Obj,"variables", variables);
|
||||||
|
field_from_json( Obj,"managementPolicies", managementPolicies);
|
||||||
|
field_from_json( Obj,"managementRoles", managementRoles);
|
||||||
|
field_from_json( Obj,"maps", maps);
|
||||||
|
field_from_json( Obj,"configurations", configurations);
|
||||||
|
field_from_json( Obj,"boards", boards);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
|
||||||
@@ -171,6 +195,89 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Operator::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_to_json( Obj,"managementRoles",managementRoles);
|
||||||
|
field_to_json( Obj,"deviceRules",deviceRules);
|
||||||
|
field_to_json( Obj,"variables",variables);
|
||||||
|
field_to_json( Obj,"defaultOperator",defaultOperator);
|
||||||
|
field_to_json( Obj,"sourceIP",sourceIP);
|
||||||
|
field_to_json( Obj,"registrationId",registrationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Operator::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_from_json( Obj,"managementRoles",managementRoles);
|
||||||
|
field_from_json( Obj,"deviceRules",deviceRules);
|
||||||
|
field_from_json( Obj,"variables",variables);
|
||||||
|
field_from_json( Obj,"defaultOperator",defaultOperator);
|
||||||
|
field_from_json( Obj,"sourceIP",sourceIP);
|
||||||
|
field_from_json( Obj,"registrationId",registrationId);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OperatorList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"operators",operators);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OperatorList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"operators",operators);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServiceClass::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"operatorId",operatorId);
|
||||||
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_to_json( Obj,"cost",cost);
|
||||||
|
field_to_json( Obj,"currency",currency);
|
||||||
|
field_to_json( Obj,"period",period);
|
||||||
|
field_to_json( Obj,"billingCode",billingCode);
|
||||||
|
field_to_json( Obj,"variables",variables);
|
||||||
|
field_to_json( Obj,"defaultService",defaultService);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ServiceClass::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"operatorId",operatorId);
|
||||||
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_from_json( Obj,"cost",cost);
|
||||||
|
field_from_json( Obj,"currency",currency);
|
||||||
|
field_from_json( Obj,"period",period);
|
||||||
|
field_from_json( Obj,"billingCode",billingCode);
|
||||||
|
field_from_json( Obj,"variables",variables);
|
||||||
|
field_from_json( Obj,"defaultService",defaultService);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServiceClassList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"serviceClasses",serviceClasses);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ServiceClassList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"serviceClasses",serviceClasses);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const {
|
void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json( Obj,"id",id);
|
field_to_json( Obj,"id",id);
|
||||||
field_to_json( Obj,"entity",loginId);
|
field_to_json( Obj,"entity",loginId);
|
||||||
@@ -193,6 +300,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"users",users);
|
field_to_json( Obj,"users",users);
|
||||||
field_to_json( Obj,"entity",entity);
|
field_to_json( Obj,"entity",entity);
|
||||||
|
field_to_json( Obj,"venue",venue);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -201,6 +309,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"users",users);
|
field_from_json( Obj,"users",users);
|
||||||
field_from_json( Obj,"entity",entity);
|
field_from_json( Obj,"entity",entity);
|
||||||
|
field_from_json( Obj,"venue",venue);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
}
|
}
|
||||||
@@ -249,6 +358,92 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OperatorLocation::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"type",type);
|
||||||
|
field_to_json( Obj,"buildingName",buildingName);
|
||||||
|
field_to_json( Obj,"addressLines",addressLines);
|
||||||
|
field_to_json( Obj,"city",city);
|
||||||
|
field_to_json( Obj,"state",state);
|
||||||
|
field_to_json( Obj,"postal",postal);
|
||||||
|
field_to_json( Obj,"country",country);
|
||||||
|
field_to_json( Obj,"phones",phones);
|
||||||
|
field_to_json( Obj,"mobiles",mobiles);
|
||||||
|
field_to_json( Obj,"geoCode",geoCode);
|
||||||
|
field_to_json( Obj,"operatorId",operatorId);
|
||||||
|
field_to_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
||||||
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OperatorLocation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"type", type);
|
||||||
|
field_from_json( Obj,"buildingName",buildingName);
|
||||||
|
field_from_json( Obj,"addressLines",addressLines);
|
||||||
|
field_from_json( Obj,"city",city);
|
||||||
|
field_from_json( Obj,"state",state);
|
||||||
|
field_from_json( Obj,"postal",postal);
|
||||||
|
field_from_json( Obj,"country",country);
|
||||||
|
field_from_json( Obj,"phones",phones);
|
||||||
|
field_from_json( Obj,"mobiles",mobiles);
|
||||||
|
field_from_json( Obj,"geoCode",geoCode);
|
||||||
|
field_from_json( Obj,"operatorId",operatorId);
|
||||||
|
field_from_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
||||||
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubLocation::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"type",type);
|
||||||
|
field_to_json( Obj,"buildingName",buildingName);
|
||||||
|
field_to_json( Obj,"addressLines",addressLines);
|
||||||
|
field_to_json( Obj,"city",city);
|
||||||
|
field_to_json( Obj,"state",state);
|
||||||
|
field_to_json( Obj,"postal",postal);
|
||||||
|
field_to_json( Obj,"country",country);
|
||||||
|
field_to_json( Obj,"phones",phones);
|
||||||
|
field_to_json( Obj,"mobiles",mobiles);
|
||||||
|
field_to_json( Obj,"geoCode",geoCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubLocation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"type", type);
|
||||||
|
field_from_json( Obj,"buildingName",buildingName);
|
||||||
|
field_from_json( Obj,"addressLines",addressLines);
|
||||||
|
field_from_json( Obj,"city",city);
|
||||||
|
field_from_json( Obj,"state",state);
|
||||||
|
field_from_json( Obj,"postal",postal);
|
||||||
|
field_from_json( Obj,"country",country);
|
||||||
|
field_from_json( Obj,"phones",phones);
|
||||||
|
field_from_json( Obj,"mobiles",mobiles);
|
||||||
|
field_from_json( Obj,"geoCode",geoCode);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OperatorLocationList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj, "locations", locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OperatorLocationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj, "locations", locations);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Contact::to_json(Poco::JSON::Object &Obj) const {
|
void Contact::to_json(Poco::JSON::Object &Obj) const {
|
||||||
info.to_json(Obj);
|
info.to_json(Obj);
|
||||||
field_to_json( Obj,"type", to_string(type));
|
field_to_json( Obj,"type", to_string(type));
|
||||||
@@ -295,20 +490,119 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OperatorContact::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"type", type);
|
||||||
|
field_to_json( Obj,"title",title);
|
||||||
|
field_to_json( Obj,"salutation",salutation);
|
||||||
|
field_to_json( Obj,"firstname",firstname);
|
||||||
|
field_to_json( Obj,"lastname",lastname);
|
||||||
|
field_to_json( Obj,"initials",initials);
|
||||||
|
field_to_json( Obj,"visual",visual);
|
||||||
|
field_to_json( Obj,"mobiles",mobiles);
|
||||||
|
field_to_json( Obj,"phones",phones);
|
||||||
|
field_to_json( Obj,"primaryEmail",primaryEmail);
|
||||||
|
field_to_json( Obj,"secondaryEmail",secondaryEmail);
|
||||||
|
field_to_json( Obj,"accessPIN",accessPIN);
|
||||||
|
field_to_json( Obj,"operatorId",operatorId);
|
||||||
|
field_to_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
||||||
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OperatorContact::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"type", type);
|
||||||
|
field_from_json( Obj,"title",title);
|
||||||
|
field_from_json( Obj,"salutation",salutation);
|
||||||
|
field_from_json( Obj,"firstname",firstname);
|
||||||
|
field_from_json( Obj,"lastname",lastname);
|
||||||
|
field_from_json( Obj,"initials",initials);
|
||||||
|
field_from_json( Obj,"visual",visual);
|
||||||
|
field_from_json( Obj,"mobiles",mobiles);
|
||||||
|
field_from_json( Obj,"phones",phones);
|
||||||
|
field_from_json( Obj,"primaryEmail",primaryEmail);
|
||||||
|
field_from_json( Obj,"secondaryEmail",secondaryEmail);
|
||||||
|
field_from_json( Obj,"accessPIN",accessPIN);
|
||||||
|
field_from_json( Obj,"operatorId",operatorId);
|
||||||
|
field_from_json( Obj,"subscriberDeviceId",subscriberDeviceId);
|
||||||
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubContact::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"type", type);
|
||||||
|
field_to_json( Obj,"title",title);
|
||||||
|
field_to_json( Obj,"salutation",salutation);
|
||||||
|
field_to_json( Obj,"firstname",firstname);
|
||||||
|
field_to_json( Obj,"lastname",lastname);
|
||||||
|
field_to_json( Obj,"initials",initials);
|
||||||
|
field_to_json( Obj,"visual",visual);
|
||||||
|
field_to_json( Obj,"mobiles",mobiles);
|
||||||
|
field_to_json( Obj,"phones",phones);
|
||||||
|
field_to_json( Obj,"primaryEmail",primaryEmail);
|
||||||
|
field_to_json( Obj,"secondaryEmail",secondaryEmail);
|
||||||
|
field_to_json( Obj,"accessPIN",accessPIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubContact::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"type", type);
|
||||||
|
field_from_json( Obj,"title",title);
|
||||||
|
field_from_json( Obj,"salutation",salutation);
|
||||||
|
field_from_json( Obj,"firstname",firstname);
|
||||||
|
field_from_json( Obj,"lastname",lastname);
|
||||||
|
field_from_json( Obj,"initials",initials);
|
||||||
|
field_from_json( Obj,"visual",visual);
|
||||||
|
field_from_json( Obj,"mobiles",mobiles);
|
||||||
|
field_from_json( Obj,"phones",phones);
|
||||||
|
field_from_json( Obj,"primaryEmail",primaryEmail);
|
||||||
|
field_from_json( Obj,"secondaryEmail",secondaryEmail);
|
||||||
|
field_from_json( Obj,"accessPIN",accessPIN);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OperatorContactList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj, "contacts", contacts);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OperatorContactList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj, "contacts", contacts);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void InventoryTag::to_json(Poco::JSON::Object &Obj) const {
|
void InventoryTag::to_json(Poco::JSON::Object &Obj) const {
|
||||||
info.to_json(Obj);
|
info.to_json(Obj);
|
||||||
field_to_json(Obj, "serialNumber", serialNumber);
|
field_to_json( Obj, "serialNumber", serialNumber);
|
||||||
field_to_json(Obj, "venue", venue);
|
field_to_json( Obj, "venue", venue);
|
||||||
field_to_json(Obj, "entity", entity);
|
field_to_json( Obj, "entity", entity);
|
||||||
field_to_json(Obj, "subscriber", subscriber);
|
field_to_json( Obj, "subscriber", subscriber);
|
||||||
field_to_json(Obj, "deviceType", deviceType);
|
field_to_json( Obj, "deviceType", deviceType);
|
||||||
field_to_json(Obj, "qrCode", qrCode);
|
field_to_json( Obj, "qrCode", qrCode);
|
||||||
field_to_json(Obj, "geoCode", geoCode);
|
field_to_json( Obj, "geoCode", geoCode);
|
||||||
field_to_json(Obj, "location", location);
|
field_to_json( Obj, "location", location);
|
||||||
field_to_json(Obj, "contact", contact);
|
field_to_json( Obj, "contact", contact);
|
||||||
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_to_json( Obj, "deviceConfiguration",deviceConfiguration);
|
||||||
field_to_json( Obj,"rrm",rrm);
|
field_to_json( Obj,"deviceRules",deviceRules);
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj, "managementPolicy",managementPolicy);
|
||||||
|
field_to_json( Obj, "state",state);
|
||||||
|
field_to_json( Obj, "devClass",devClass);
|
||||||
|
field_to_json( Obj, "locale",locale);
|
||||||
|
field_to_json( Obj, "realMacAddress",realMacAddress);
|
||||||
|
field_to_json( Obj, "doNotAllowOverrides",doNotAllowOverrides);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -319,13 +613,18 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_from_json( Obj,"entity",entity);
|
field_from_json( Obj,"entity",entity);
|
||||||
field_from_json( Obj,"subscriber",subscriber);
|
field_from_json( Obj,"subscriber",subscriber);
|
||||||
field_from_json( Obj,"deviceType",deviceType);
|
field_from_json( Obj,"deviceType",deviceType);
|
||||||
field_from_json(Obj, "qrCode", qrCode);
|
field_from_json( Obj,"qrCode", qrCode);
|
||||||
field_from_json( Obj,"geoCode",geoCode);
|
field_from_json( Obj,"geoCode",geoCode);
|
||||||
field_from_json( Obj,"location",location);
|
field_from_json( Obj,"location",location);
|
||||||
field_from_json( Obj,"contact",contact);
|
field_from_json( Obj,"contact",contact);
|
||||||
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
|
||||||
field_from_json( Obj,"rrm",rrm);
|
field_from_json( Obj,"deviceRules",deviceRules);
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_from_json( Obj,"state",state);
|
||||||
|
field_from_json( Obj,"devClass",devClass);
|
||||||
|
field_from_json( Obj,"locale",locale);
|
||||||
|
field_from_json( Obj,"realMacAddress",realMacAddress);
|
||||||
|
field_from_json( Obj, "doNotAllowOverrides",doNotAllowOverrides);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -333,6 +632,40 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InventoryConfigApplyResult::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj, "appliedConfiguration", appliedConfiguration);
|
||||||
|
field_to_json( Obj, "warnings", warnings);
|
||||||
|
field_to_json( Obj, "errors", errors);
|
||||||
|
field_to_json( Obj, "errorCode", errorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InventoryConfigApplyResult::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj, "appliedConfiguration", appliedConfiguration);
|
||||||
|
field_from_json( Obj, "warnings", warnings);
|
||||||
|
field_from_json( Obj, "errors", errors);
|
||||||
|
field_from_json( Obj, "errorCode", errorCode);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InventoryTagList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"taglist",taglist);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InventoryTagList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"taglist",taglist);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
void DeviceConfigurationElement::to_json(Poco::JSON::Object &Obj) const {
|
void DeviceConfigurationElement::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json( Obj,"name", name);
|
field_to_json( Obj,"name", name);
|
||||||
field_to_json( Obj,"description", description);
|
field_to_json( Obj,"description", description);
|
||||||
@@ -357,12 +690,14 @@ namespace OpenWifi::ProvObjects {
|
|||||||
info.to_json(Obj);
|
info.to_json(Obj);
|
||||||
field_to_json( Obj,"managementPolicy",managementPolicy);
|
field_to_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_to_json( Obj,"deviceTypes",deviceTypes);
|
field_to_json( Obj,"deviceTypes",deviceTypes);
|
||||||
|
field_to_json( Obj,"subscriberOnly",subscriberOnly);
|
||||||
|
field_to_json( Obj,"entity", entity);
|
||||||
|
field_to_json( Obj,"venue", venue);
|
||||||
|
field_to_json( Obj,"subscriber", subscriber);
|
||||||
field_to_json( Obj,"configuration",configuration);
|
field_to_json( Obj,"configuration",configuration);
|
||||||
field_to_json( Obj,"inUse",inUse);
|
field_to_json( Obj,"inUse",inUse);
|
||||||
field_to_json( Obj,"variables",variables);
|
field_to_json( Obj,"variables",variables);
|
||||||
field_to_json( Obj,"rrm",rrm);
|
field_to_json( Obj,"deviceRules",deviceRules);
|
||||||
field_to_json( Obj,"firmwareUpgrade",firmwareUpgrade);
|
|
||||||
field_to_json( Obj,"firmwareRCOnly",firmwareRCOnly);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -370,12 +705,14 @@ namespace OpenWifi::ProvObjects {
|
|||||||
info.from_json(Obj);
|
info.from_json(Obj);
|
||||||
field_from_json( Obj,"managementPolicy",managementPolicy);
|
field_from_json( Obj,"managementPolicy",managementPolicy);
|
||||||
field_from_json( Obj,"deviceTypes",deviceTypes);
|
field_from_json( Obj,"deviceTypes",deviceTypes);
|
||||||
field_from_json( Obj,"configuration",configuration);
|
|
||||||
field_from_json( Obj,"inUse",inUse);
|
field_from_json( Obj,"inUse",inUse);
|
||||||
field_from_json( Obj,"variables",variables);
|
field_from_json( Obj,"variables",variables);
|
||||||
field_from_json( Obj,"rrm",rrm);
|
field_from_json( Obj,"subscriberOnly",subscriberOnly);
|
||||||
field_from_json( Obj,"firmwareUpgrade",firmwareUpgrade);
|
field_from_json( Obj,"entity", entity);
|
||||||
field_from_json( Obj,"firmwareRCOnly",firmwareRCOnly);
|
field_from_json( Obj,"venue", venue);
|
||||||
|
field_from_json( Obj,"subscriber", subscriber);
|
||||||
|
field_from_json( Obj,"configuration",configuration);
|
||||||
|
field_from_json( Obj,"deviceRules",deviceRules);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -440,11 +777,11 @@ namespace OpenWifi::ProvObjects {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserList::to_json(Poco::JSON::Object &Obj) const {
|
void UuidList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "list", list);
|
field_to_json(Obj, "list", list);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UserList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool UuidList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "list", list);
|
field_from_json(Obj, "list", list);
|
||||||
return true;
|
return true;
|
||||||
@@ -456,12 +793,14 @@ namespace OpenWifi::ProvObjects {
|
|||||||
|
|
||||||
void ObjectACL::to_json(Poco::JSON::Object &Obj) const {
|
void ObjectACL::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "users", users);
|
field_to_json(Obj, "users", users);
|
||||||
|
field_to_json(Obj, "roles", roles);
|
||||||
field_to_json(Obj, "access", access);
|
field_to_json(Obj, "access", access);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj, "users", users);
|
field_from_json(Obj, "users", users);
|
||||||
|
field_from_json(Obj, "roles", roles);
|
||||||
field_from_json(Obj, "access", access);
|
field_from_json(Obj, "access", access);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
@@ -491,16 +830,34 @@ namespace OpenWifi::ProvObjects {
|
|||||||
field_to_json( Obj,"creator",creator);
|
field_to_json( Obj,"creator",creator);
|
||||||
field_to_json( Obj,"visibility",visibility);
|
field_to_json( Obj,"visibility",visibility);
|
||||||
field_to_json( Obj,"access",access);
|
field_to_json( Obj,"access",access);
|
||||||
|
field_to_json( Obj,"managementPolicy", managementPolicy);
|
||||||
|
field_to_json( Obj,"venue", venue);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
info.from_json(Obj);
|
info.from_json(Obj);
|
||||||
field_from_json( Obj,"data",data);
|
RESTAPI_utils::field_from_json( Obj,"data",data);
|
||||||
field_from_json( Obj,"entity",entity);
|
RESTAPI_utils::field_from_json( Obj,"entity",entity);
|
||||||
field_from_json( Obj,"creator",creator);
|
RESTAPI_utils::field_from_json( Obj,"creator",creator);
|
||||||
field_from_json( Obj,"visibility",visibility);
|
RESTAPI_utils::field_from_json( Obj,"visibility",visibility);
|
||||||
field_from_json( Obj,"access",access);
|
RESTAPI_utils::field_from_json( Obj,"access",access);
|
||||||
|
RESTAPI_utils::field_from_json( Obj,"managementPolicy", managementPolicy);
|
||||||
|
RESTAPI_utils::field_from_json( Obj,"venue", venue);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SerialNumberList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
RESTAPI_utils::field_to_json( Obj,"serialNumbers",serialNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SerialNumberList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
RESTAPI_utils::field_from_json( Obj,"serialNumbers",serialNumbers);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -509,12 +866,227 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MapList::to_json(Poco::JSON::Object &Obj) const {
|
void MapList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json( Obj,"list",list);
|
RESTAPI_utils::field_to_json( Obj,"list",list);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool MapList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json( Obj,"list",list);
|
RESTAPI_utils::field_from_json( Obj,"list",list);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SignupEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"email", email);
|
||||||
|
field_to_json( Obj,"userId", userId);
|
||||||
|
field_to_json( Obj,"macAddress", macAddress);
|
||||||
|
field_to_json( Obj,"serialNumber", serialNumber);
|
||||||
|
field_to_json( Obj,"submitted", submitted);
|
||||||
|
field_to_json( Obj,"completed", completed);
|
||||||
|
field_to_json( Obj,"status", status);
|
||||||
|
field_to_json( Obj,"error", error);
|
||||||
|
field_to_json( Obj,"statusCode", statusCode);
|
||||||
|
field_to_json( Obj,"deviceID", deviceID);
|
||||||
|
field_to_json( Obj,"registrationId",registrationId);
|
||||||
|
field_to_json( Obj,"operatorId",operatorId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SignupEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"email", email);
|
||||||
|
field_from_json( Obj,"userId", userId);
|
||||||
|
field_from_json( Obj,"macAddress", macAddress);
|
||||||
|
field_from_json( Obj,"serialNumber", serialNumber);
|
||||||
|
field_from_json( Obj,"submitted", submitted);
|
||||||
|
field_from_json( Obj,"completed", completed);
|
||||||
|
field_from_json( Obj,"status", status);
|
||||||
|
field_from_json( Obj,"error", error);
|
||||||
|
field_from_json( Obj,"statusCode", statusCode);
|
||||||
|
field_from_json( Obj,"deviceID", deviceID);
|
||||||
|
field_from_json( Obj,"registrationId",registrationId);
|
||||||
|
field_from_json( Obj,"operatorId",operatorId);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Variable::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"type", type);
|
||||||
|
field_to_json( Obj,"weight", weight);
|
||||||
|
field_to_json( Obj,"prefix", prefix);
|
||||||
|
field_to_json( Obj,"value", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Variable::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"type", type);
|
||||||
|
field_from_json( Obj,"weight", weight);
|
||||||
|
field_from_json( Obj,"prefix", prefix);
|
||||||
|
field_from_json( Obj,"value", value);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VariableList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"variables", variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VariableList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"variables", variables);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VariableBlock::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"variables", variables);
|
||||||
|
field_to_json( Obj,"entity", entity);
|
||||||
|
field_to_json( Obj,"venue", venue);
|
||||||
|
field_to_json( Obj,"subscriber", subscriber);
|
||||||
|
field_to_json( Obj,"inventory", inventory);
|
||||||
|
field_to_json( Obj,"configurations", configurations);
|
||||||
|
field_to_json( Obj,"managementPolicy", managementPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VariableBlock::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"variables", variables);
|
||||||
|
field_from_json( Obj,"entity", entity);
|
||||||
|
field_from_json( Obj,"venue", venue);
|
||||||
|
field_from_json( Obj,"subscriber", subscriber);
|
||||||
|
field_from_json( Obj,"inventory", inventory);
|
||||||
|
field_from_json( Obj,"configurations", configurations);
|
||||||
|
field_from_json( Obj,"managementPolicy", managementPolicy);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VariableBlockList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"variableBlocks", variableBlocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VariableBlockList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"variableBlocks", variableBlocks);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigurationDetails::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"configuration", configuration);
|
||||||
|
field_to_json( Obj,"rrm", rrm);
|
||||||
|
field_to_json( Obj,"firmwareRCOnly", firmwareRCOnly);
|
||||||
|
field_to_json( Obj,"firmwareUpgrade", firmwareUpgrade);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ConfigurationDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"configuration", configuration);
|
||||||
|
field_from_json( Obj,"rrm", rrm);
|
||||||
|
field_from_json( Obj,"firmwareRCOnly", firmwareRCOnly);
|
||||||
|
field_from_json( Obj,"firmwareUpgrade", firmwareUpgrade);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriberDevice::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
info.to_json(Obj);
|
||||||
|
field_to_json( Obj,"serialNumber", serialNumber);
|
||||||
|
field_to_json( Obj,"deviceType", deviceType);
|
||||||
|
field_to_json( Obj,"operatorId", operatorId);
|
||||||
|
field_to_json( Obj,"subscriberId", subscriberId);
|
||||||
|
field_to_json( Obj,"location", location);
|
||||||
|
field_to_json( Obj,"contact", contact);
|
||||||
|
field_to_json( Obj,"managementPolicy", managementPolicy);
|
||||||
|
field_to_json( Obj,"serviceClass", serviceClass);
|
||||||
|
field_to_json( Obj,"qrCode", qrCode);
|
||||||
|
field_to_json( Obj,"geoCode", geoCode);
|
||||||
|
field_to_json( Obj,"deviceRules",deviceRules);
|
||||||
|
field_to_json( Obj,"state", state);
|
||||||
|
field_to_json( Obj,"locale", locale);
|
||||||
|
field_to_json( Obj,"billingCode", billingCode);
|
||||||
|
field_to_json( Obj,"configuration", configuration);
|
||||||
|
field_to_json( Obj,"suspended", suspended);
|
||||||
|
field_to_json( Obj,"realMacAddress", realMacAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubscriberDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
info.from_json(Obj);
|
||||||
|
field_from_json( Obj,"serialNumber", serialNumber);
|
||||||
|
field_from_json( Obj,"deviceType", deviceType);
|
||||||
|
field_from_json( Obj,"operatorId", operatorId);
|
||||||
|
field_from_json( Obj,"subscriberId", subscriberId);
|
||||||
|
field_from_json( Obj,"location", location);
|
||||||
|
field_from_json( Obj,"contact", contact);
|
||||||
|
field_from_json( Obj,"managementPolicy", managementPolicy);
|
||||||
|
field_from_json( Obj,"serviceClass", serviceClass);
|
||||||
|
field_from_json( Obj,"qrCode", qrCode);
|
||||||
|
field_from_json( Obj,"geoCode", geoCode);
|
||||||
|
field_from_json( Obj,"deviceRules",deviceRules);
|
||||||
|
field_from_json( Obj,"state", state);
|
||||||
|
field_from_json( Obj,"locale", locale);
|
||||||
|
field_from_json( Obj,"billingCode", billingCode);
|
||||||
|
field_from_json( Obj,"configuration", configuration);
|
||||||
|
field_from_json( Obj,"suspended", suspended);
|
||||||
|
field_from_json( Obj,"realMacAddress", realMacAddress);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriberDeviceList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json( Obj,"subscriberDevices", subscriberDevices);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubscriberDeviceList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json( Obj,"subscriberDevices", subscriberDevices);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VenueDeviceList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id",id);
|
||||||
|
field_to_json(Obj,"name",name);
|
||||||
|
field_to_json(Obj,"description",description);
|
||||||
|
field_to_json(Obj,"devices",devices);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VenueDeviceList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id",id);
|
||||||
|
field_from_json(Obj,"name",name);
|
||||||
|
field_from_json(Obj,"description",description);
|
||||||
|
field_from_json(Obj,"devices",devices);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
@@ -523,7 +1095,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
||||||
uint64_t Now = std::time(nullptr);
|
uint64_t Now = Utils::Now();
|
||||||
if(O->has("name"))
|
if(O->has("name"))
|
||||||
I.name = O->get("name").toString();
|
I.name = O->get("name").toString();
|
||||||
|
|
||||||
@@ -544,7 +1116,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
||||||
uint64_t Now = std::time(nullptr);
|
uint64_t Now = Utils::Now();
|
||||||
if(O->has("name"))
|
if(O->has("name"))
|
||||||
I.name = O->get("name").toString();
|
I.name = O->get("name").toString();
|
||||||
|
|
||||||
@@ -562,8 +1134,111 @@ namespace OpenWifi::ProvObjects {
|
|||||||
}
|
}
|
||||||
I.notes = N;
|
I.notes = N;
|
||||||
I.modified = I.created = Now;
|
I.modified = I.created = Now;
|
||||||
I.id = MicroService::instance().CreateUUID();
|
I.id = MicroServiceCreateUUID();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
bool CreateObjectInfo([[maybe_unused]] const SecurityObjects::UserInfo &U, ObjectInfo &I) {
|
||||||
|
I.modified = I.created = Utils::Now();
|
||||||
|
I.id = MicroServiceCreateUUID();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeviceRules::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"rcOnly",rcOnly);
|
||||||
|
field_to_json(Obj,"rrm",rrm);
|
||||||
|
field_to_json(Obj,"firmwareUpgrade",firmwareUpgrade);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DeviceRules::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"rcOnly",rcOnly);
|
||||||
|
field_from_json(Obj,"rrm",rrm);
|
||||||
|
field_from_json(Obj,"firmwareUpgrade",firmwareUpgrade);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RRMAlgorithmDetails::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"name",name);
|
||||||
|
field_to_json(Obj,"parameters",parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RRMAlgorithmDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"name",name);
|
||||||
|
field_from_json(Obj,"parameters",parameters);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RRMDetails::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"vendor",vendor);
|
||||||
|
field_to_json(Obj,"schedule",schedule);
|
||||||
|
field_to_json(Obj,"algorithms",algorithms);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RRMDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"vendor",vendor);
|
||||||
|
field_from_json(Obj,"schedule",schedule);
|
||||||
|
field_from_json(Obj,"algorithms",algorithms);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigurationOverride::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"source",source);
|
||||||
|
field_to_json(Obj,"reason",reason);
|
||||||
|
field_to_json(Obj,"parameterName",parameterName);
|
||||||
|
field_to_json(Obj,"parameterType",parameterType);
|
||||||
|
field_to_json(Obj,"parameterValue",parameterValue);
|
||||||
|
field_to_json(Obj,"modified",modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ConfigurationOverride::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"source",source);
|
||||||
|
field_from_json(Obj,"reason",reason);
|
||||||
|
field_from_json(Obj,"parameterName",parameterName);
|
||||||
|
field_from_json(Obj,"parameterType",parameterType);
|
||||||
|
field_from_json(Obj,"parameterValue",parameterValue);
|
||||||
|
field_from_json(Obj,"modified",modified);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigurationOverrideList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"serialNumber",serialNumber);
|
||||||
|
field_to_json(Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_to_json(Obj,"overrides",overrides);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ConfigurationOverrideList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"serialNumber",serialNumber);
|
||||||
|
field_from_json(Obj,"managementPolicy",managementPolicy);
|
||||||
|
field_from_json(Obj,"overrides",overrides);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,12 +6,9 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#ifndef OWPROV_RESTAPI_PROVOBJECTS_H
|
#include "RESTObjects/RESTAPI_SecurityObjects.h"
|
||||||
#define OWPROV_RESTAPI_PROVOBJECTS_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
|
||||||
|
|
||||||
namespace OpenWifi::ProvObjects {
|
namespace OpenWifi::ProvObjects {
|
||||||
|
|
||||||
@@ -35,6 +32,13 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SerialNumberList {
|
||||||
|
Types::UUIDvec_t serialNumbers;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct ManagementPolicyEntry {
|
struct ManagementPolicyEntry {
|
||||||
Types::UUIDvec_t users;
|
Types::UUIDvec_t users;
|
||||||
Types::UUIDvec_t resources;
|
Types::UUIDvec_t resources;
|
||||||
@@ -50,12 +54,37 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::vector<ManagementPolicyEntry> entries;
|
std::vector<ManagementPolicyEntry> entries;
|
||||||
Types::StringVec inUse;
|
Types::StringVec inUse;
|
||||||
Types::UUID_t entity;
|
Types::UUID_t entity;
|
||||||
|
Types::UUID_t venue;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
typedef std::vector<ManagementPolicy> ManagementPolicyVec;
|
typedef std::vector<ManagementPolicy> ManagementPolicyVec;
|
||||||
|
|
||||||
|
struct RRMAlgorithmDetails {
|
||||||
|
std::string name;
|
||||||
|
std::string parameters;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RRMDetails {
|
||||||
|
std::string vendor;
|
||||||
|
std::string schedule;
|
||||||
|
std::vector<RRMAlgorithmDetails> algorithms;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DeviceRules {
|
||||||
|
std::string rcOnly{"inherit"};
|
||||||
|
std::string rrm{"inherit"};
|
||||||
|
std::string firmwareUpgrade{"inherit"};
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct Entity {
|
struct Entity {
|
||||||
ObjectInfo info;
|
ObjectInfo info;
|
||||||
Types::UUID_t parent;
|
Types::UUID_t parent;
|
||||||
@@ -66,8 +95,13 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
Types::UUIDvec_t deviceConfiguration;
|
Types::UUIDvec_t deviceConfiguration;
|
||||||
Types::UUIDvec_t devices;
|
Types::UUIDvec_t devices;
|
||||||
std::string rrm;
|
DeviceRules deviceRules;
|
||||||
Types::StringVec sourceIP;
|
Types::StringVec sourceIP;
|
||||||
|
Types::UUIDvec_t variables;
|
||||||
|
Types::UUIDvec_t managementPolicies;
|
||||||
|
Types::UUIDvec_t managementRoles;
|
||||||
|
Types::UUIDvec_t maps;
|
||||||
|
Types::UUIDvec_t configurations;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
@@ -94,10 +128,16 @@ namespace OpenWifi::ProvObjects {
|
|||||||
DiGraph topology;
|
DiGraph topology;
|
||||||
std::string design;
|
std::string design;
|
||||||
Types::UUIDvec_t deviceConfiguration;
|
Types::UUIDvec_t deviceConfiguration;
|
||||||
std::string contact;
|
Types::UUIDvec_t contacts;
|
||||||
std::string location;
|
std::string location;
|
||||||
std::string rrm;
|
DeviceRules deviceRules;
|
||||||
Types::StringVec sourceIP;
|
Types::StringVec sourceIP;
|
||||||
|
Types::UUIDvec_t variables;
|
||||||
|
Types::UUIDvec_t configurations;
|
||||||
|
Types::UUIDvec_t maps;
|
||||||
|
Types::UUIDvec_t managementPolicies;
|
||||||
|
Types::UUIDvec_t managementRoles;
|
||||||
|
Types::UUIDvec_t boards;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
@@ -119,6 +159,7 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::UUIDvec_t users;
|
Types::UUIDvec_t users;
|
||||||
Types::StringVec inUse;
|
Types::StringVec inUse;
|
||||||
Types::UUID_t entity;
|
Types::UUID_t entity;
|
||||||
|
Types::UUID_t venue;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
@@ -182,6 +223,51 @@ namespace OpenWifi::ProvObjects {
|
|||||||
};
|
};
|
||||||
typedef std::vector<Location> LocationVec;
|
typedef std::vector<Location> LocationVec;
|
||||||
|
|
||||||
|
struct OperatorLocation {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string type;
|
||||||
|
std::string buildingName;
|
||||||
|
Types::StringVec addressLines;
|
||||||
|
std::string city;
|
||||||
|
std::string state;
|
||||||
|
std::string postal;
|
||||||
|
std::string country;
|
||||||
|
Types::StringVec phones;
|
||||||
|
Types::StringVec mobiles;
|
||||||
|
std::string geoCode;
|
||||||
|
Types::UUID_t operatorId;
|
||||||
|
Types::UUID_t subscriberDeviceId;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
typedef std::vector<Location> LocationVec;
|
||||||
|
|
||||||
|
struct SubLocation {
|
||||||
|
std::string type;
|
||||||
|
std::string buildingName;
|
||||||
|
Types::StringVec addressLines;
|
||||||
|
std::string city;
|
||||||
|
std::string state;
|
||||||
|
std::string postal;
|
||||||
|
std::string country;
|
||||||
|
Types::StringVec phones;
|
||||||
|
Types::StringVec mobiles;
|
||||||
|
std::string geoCode;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OperatorLocationList {
|
||||||
|
std::vector<OperatorLocation> locations;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
enum ContactType {
|
enum ContactType {
|
||||||
CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER,
|
CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER,
|
||||||
CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN
|
CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN
|
||||||
@@ -245,6 +331,55 @@ namespace OpenWifi::ProvObjects {
|
|||||||
};
|
};
|
||||||
typedef std::vector<Contact> ContactVec;
|
typedef std::vector<Contact> ContactVec;
|
||||||
|
|
||||||
|
struct OperatorContact {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string type;
|
||||||
|
std::string title;
|
||||||
|
std::string salutation;
|
||||||
|
std::string firstname;
|
||||||
|
std::string lastname;
|
||||||
|
std::string initials;
|
||||||
|
std::string visual;
|
||||||
|
Types::StringVec mobiles;
|
||||||
|
Types::StringVec phones;
|
||||||
|
std::string primaryEmail;
|
||||||
|
std::string secondaryEmail;
|
||||||
|
std::string accessPIN;
|
||||||
|
Types::UUID_t operatorId;
|
||||||
|
Types::UUID_t subscriberDeviceId;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubContact {
|
||||||
|
std::string type;
|
||||||
|
std::string title;
|
||||||
|
std::string salutation;
|
||||||
|
std::string firstname;
|
||||||
|
std::string lastname;
|
||||||
|
std::string initials;
|
||||||
|
std::string visual;
|
||||||
|
Types::StringVec mobiles;
|
||||||
|
Types::StringVec phones;
|
||||||
|
std::string primaryEmail;
|
||||||
|
std::string secondaryEmail;
|
||||||
|
std::string accessPIN;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OperatorContactList {
|
||||||
|
std::vector<OperatorContact> contacts;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<OperatorContact> OperatorContactVec;
|
||||||
|
|
||||||
struct DeviceConfigurationElement {
|
struct DeviceConfigurationElement {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string description;
|
std::string description;
|
||||||
@@ -262,16 +397,19 @@ namespace OpenWifi::ProvObjects {
|
|||||||
Types::StringVec deviceTypes;
|
Types::StringVec deviceTypes;
|
||||||
DeviceConfigurationElementVec configuration;
|
DeviceConfigurationElementVec configuration;
|
||||||
Types::StringVec inUse;
|
Types::StringVec inUse;
|
||||||
Types::StringPairVec variables;
|
Types::UUIDvec_t variables;
|
||||||
std::string rrm;
|
DeviceRules deviceRules;
|
||||||
std::string firmwareUpgrade;
|
bool subscriberOnly=false;
|
||||||
bool firmwareRCOnly=false;
|
std::string venue;
|
||||||
|
std::string entity;
|
||||||
|
std::string subscriber;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
typedef std::vector<DeviceConfiguration> DeviceConfigurationVec;
|
typedef std::vector<DeviceConfiguration> DeviceConfigurationVec;
|
||||||
|
|
||||||
|
|
||||||
struct InventoryTag {
|
struct InventoryTag {
|
||||||
ObjectInfo info;
|
ObjectInfo info;
|
||||||
std::string serialNumber;
|
std::string serialNumber;
|
||||||
@@ -284,14 +422,37 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string location;
|
std::string location;
|
||||||
std::string contact;
|
std::string contact;
|
||||||
std::string deviceConfiguration;
|
std::string deviceConfiguration;
|
||||||
std::string rrm;
|
DeviceRules deviceRules;
|
||||||
Types::UUID_t managementPolicy;
|
Types::UUID_t managementPolicy;
|
||||||
|
std::string state;
|
||||||
|
std::string devClass;
|
||||||
|
std::string locale;
|
||||||
|
std::string realMacAddress;
|
||||||
|
bool doNotAllowOverrides=false;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<InventoryTag> InventoryTagVec;
|
typedef std::vector<InventoryTag> InventoryTagVec;
|
||||||
|
|
||||||
|
struct InventoryTagList {
|
||||||
|
InventoryTagVec taglist;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InventoryConfigApplyResult {
|
||||||
|
std::string appliedConfiguration;
|
||||||
|
Types::StringVec errors;
|
||||||
|
Types::StringVec warnings;
|
||||||
|
uint64_t errorCode;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
struct Report {
|
struct Report {
|
||||||
uint64_t snapShot=0;
|
uint64_t snapShot=0;
|
||||||
Types::CountedMap tenants;
|
Types::CountedMap tenants;
|
||||||
@@ -324,16 +485,21 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UserList {
|
struct UuidList {
|
||||||
std::vector<std::string> list;
|
Types::UUIDvec_t list;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ACLACCESS {
|
||||||
|
NONE = 0, READ=1, MODIFY=2, CREATE=3, DELETE=4
|
||||||
|
};
|
||||||
|
|
||||||
struct ObjectACL {
|
struct ObjectACL {
|
||||||
UserList users;
|
UuidList users;
|
||||||
std::string access;
|
UuidList roles;
|
||||||
|
uint64_t access = (uint64_t) NONE;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
@@ -351,8 +517,10 @@ namespace OpenWifi::ProvObjects {
|
|||||||
std::string data;
|
std::string data;
|
||||||
std::string entity;
|
std::string entity;
|
||||||
std::string creator;
|
std::string creator;
|
||||||
std::string visibility;
|
std::string visibility{"private"};
|
||||||
ObjectACLList access;
|
ObjectACLList access;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
std::string venue;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
@@ -365,10 +533,189 @@ namespace OpenWifi::ProvObjects {
|
|||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum SignupStatusCodes {
|
||||||
|
SignupCreated = 0 ,
|
||||||
|
SignupWaitingForEmail,
|
||||||
|
SignupWaitingForDevice,
|
||||||
|
SignupSuccess,
|
||||||
|
SignupFailure,
|
||||||
|
SignupCanceled,
|
||||||
|
SignupTimedOut
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SignupEntry {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string email;
|
||||||
|
std::string userId;
|
||||||
|
std::string macAddress;
|
||||||
|
std::string serialNumber;
|
||||||
|
uint64_t submitted = 0 ;
|
||||||
|
uint64_t completed = 0 ;
|
||||||
|
std::string status;
|
||||||
|
uint64_t error=0;
|
||||||
|
uint64_t statusCode=0;
|
||||||
|
std::string deviceID;
|
||||||
|
std::string registrationId;
|
||||||
|
std::string operatorId;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Variable {
|
||||||
|
std::string type;
|
||||||
|
uint64_t weight=0;
|
||||||
|
std::string prefix;
|
||||||
|
std::string value;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VariableList {
|
||||||
|
std::vector<Variable> variables;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VariableBlock {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::vector<Variable> variables;
|
||||||
|
std::string entity;
|
||||||
|
std::string venue;
|
||||||
|
std::string subscriber;
|
||||||
|
std::string inventory;
|
||||||
|
Types::UUIDvec_t configurations;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VariableBlockList {
|
||||||
|
std::vector<VariableBlock> variableBlocks;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Operator {
|
||||||
|
ObjectInfo info;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
Types::UUIDvec_t managementRoles;
|
||||||
|
DeviceRules deviceRules;
|
||||||
|
std::vector<Variable> variables;
|
||||||
|
bool defaultOperator=false;
|
||||||
|
Types::StringVec sourceIP;
|
||||||
|
std::string registrationId;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OperatorList {
|
||||||
|
std::vector<Operator> operators;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VenueDeviceList {
|
||||||
|
std::string id;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
Types::UUIDvec_t devices;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ServiceClass {
|
||||||
|
ObjectInfo info;
|
||||||
|
Types::UUID_t operatorId;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
double cost=0.0;
|
||||||
|
std::string currency;
|
||||||
|
std::string period;
|
||||||
|
std::string billingCode;
|
||||||
|
std::vector<Variable> variables;
|
||||||
|
bool defaultService=false;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ServiceClassList {
|
||||||
|
std::vector<ServiceClass> serviceClasses;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ConfigurationDetails {
|
||||||
|
DeviceConfigurationElementVec configuration;
|
||||||
|
std::string rrm{"inherit"};
|
||||||
|
std::string firmwareUpgrade{"inherit"};
|
||||||
|
std::string firmwareRCOnly{"inherit"};
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubscriberDevice {
|
||||||
|
ObjectInfo info;
|
||||||
|
std::string serialNumber;
|
||||||
|
std::string deviceType;
|
||||||
|
Types::UUID_t operatorId;
|
||||||
|
Types::UUID_t subscriberId;
|
||||||
|
SubLocation location;
|
||||||
|
SubContact contact;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
Types::UUID_t serviceClass;
|
||||||
|
std::string qrCode;
|
||||||
|
std::string geoCode;
|
||||||
|
DeviceRules deviceRules;
|
||||||
|
std::string state;
|
||||||
|
std::string locale;
|
||||||
|
std::string billingCode;
|
||||||
|
DeviceConfigurationElementVec configuration;
|
||||||
|
bool suspended=false;
|
||||||
|
std::string realMacAddress;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubscriberDeviceList {
|
||||||
|
std::vector<SubscriberDevice> subscriberDevices;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ConfigurationOverride {
|
||||||
|
std::string source;
|
||||||
|
std::string reason;
|
||||||
|
std::string parameterName;
|
||||||
|
std::string parameterType;
|
||||||
|
std::string parameterValue;
|
||||||
|
std::uint64_t modified;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ConfigurationOverrideList {
|
||||||
|
std::string serialNumber;
|
||||||
|
Types::UUID_t managementPolicy;
|
||||||
|
std::vector<ConfigurationOverride> overrides;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
||||||
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
||||||
|
bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif //OWPROV_RESTAPI_PROVOBJECTS_H
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "Poco/JSON/Parser.h"
|
#include "Poco/JSON/Parser.h"
|
||||||
#include "Poco/JSON/Stringifier.h"
|
#include "Poco/JSON/Stringifier.h"
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/RESTAPI_utils.h"
|
||||||
#include "RESTAPI_SecurityObjects.h"
|
#include "RESTAPI_SecurityObjects.h"
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
@@ -54,6 +54,8 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
return ADMIN;
|
return ADMIN;
|
||||||
else if (!Poco::icompare(U,"subscriber"))
|
else if (!Poco::icompare(U,"subscriber"))
|
||||||
return SUBSCRIBER;
|
return SUBSCRIBER;
|
||||||
|
else if (!Poco::icompare(U,"partner"))
|
||||||
|
return PARTNER;
|
||||||
else if (!Poco::icompare(U,"csr"))
|
else if (!Poco::icompare(U,"csr"))
|
||||||
return CSR;
|
return CSR;
|
||||||
else if (!Poco::icompare(U, "system"))
|
else if (!Poco::icompare(U, "system"))
|
||||||
@@ -72,6 +74,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
case ROOT: return "root";
|
case ROOT: return "root";
|
||||||
case ADMIN: return "admin";
|
case ADMIN: return "admin";
|
||||||
case SUBSCRIBER: return "subscriber";
|
case SUBSCRIBER: return "subscriber";
|
||||||
|
case PARTNER: return "partner";
|
||||||
case CSR: return "csr";
|
case CSR: return "csr";
|
||||||
case SYSTEM: return "system";
|
case SYSTEM: return "system";
|
||||||
case INSTALLER: return "installer";
|
case INSTALLER: return "installer";
|
||||||
@@ -92,6 +95,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "PortalLogin", PortalLogin_);
|
field_from_json(Obj, "PortalLogin", PortalLogin_);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: AclTemplate" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -109,6 +113,8 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"userMustChangePassword",userMustChangePassword);
|
field_to_json(Obj,"userMustChangePassword",userMustChangePassword);
|
||||||
field_to_json(Obj,"errorCode", errorCode);
|
field_to_json(Obj,"errorCode", errorCode);
|
||||||
Obj.set("aclTemplate",AclTemplateObj);
|
Obj.set("aclTemplate",AclTemplateObj);
|
||||||
|
field_to_json(Obj,"errorCode", errorCode);
|
||||||
|
field_to_json(Obj,"lastRefresh", lastRefresh_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
@@ -125,9 +131,10 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "created", created_);
|
field_from_json(Obj, "created", created_);
|
||||||
field_from_json(Obj, "username", username_);
|
field_from_json(Obj, "username", username_);
|
||||||
field_from_json(Obj, "userMustChangePassword",userMustChangePassword);
|
field_from_json(Obj, "userMustChangePassword",userMustChangePassword);
|
||||||
|
field_from_json(Obj,"lastRefresh", lastRefresh_);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: WebToken" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -138,14 +145,14 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"primary", primary);
|
field_to_json(Obj,"primary", primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MobilePhoneNumber::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool MobilePhoneNumber::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"number",number);
|
field_from_json(Obj,"number",number);
|
||||||
field_from_json(Obj,"verified",verified);
|
field_from_json(Obj,"verified",verified);
|
||||||
field_from_json(Obj,"primary",primary);
|
field_from_json(Obj,"primary",primary);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: MobilePhoneNumber" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -155,13 +162,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"method", method);
|
field_to_json(Obj,"method", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MfaAuthInfo::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool MfaAuthInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"enabled",enabled);
|
field_from_json(Obj,"enabled",enabled);
|
||||||
field_from_json(Obj,"method",method);
|
field_from_json(Obj,"method",method);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: MfaAuthInfo" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -169,15 +176,17 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
void UserLoginLoginExtensions::to_json(Poco::JSON::Object &Obj) const {
|
void UserLoginLoginExtensions::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "mobiles", mobiles);
|
field_to_json(Obj, "mobiles", mobiles);
|
||||||
field_to_json(Obj, "mfa", mfa);
|
field_to_json(Obj, "mfa", mfa);
|
||||||
|
field_to_json(Obj, "authenticatorSecret", authenticatorSecret);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UserLoginLoginExtensions::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool UserLoginLoginExtensions::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"mobiles",mobiles);
|
field_from_json(Obj, "mobiles",mobiles);
|
||||||
field_from_json(Obj,"mfa",mfa);
|
field_from_json(Obj, "mfa",mfa);
|
||||||
|
field_from_json(Obj, "authenticatorSecret", authenticatorSecret);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: UserLoginLoginExtensions" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -189,7 +198,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj, "method", method);
|
field_to_json(Obj, "method", method);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MFAChallengeRequest::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool MFAChallengeRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"uuid",uuid);
|
field_from_json(Obj,"uuid",uuid);
|
||||||
field_from_json(Obj,"question",question);
|
field_from_json(Obj,"question",question);
|
||||||
@@ -197,7 +206,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"method",method);
|
field_from_json(Obj,"method",method);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: MFAChallengeRequest" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -205,23 +214,22 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const {
|
void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj, "uuid", uuid);
|
field_to_json(Obj, "uuid", uuid);
|
||||||
field_to_json(Obj, "answer", answer);
|
field_to_json(Obj, "answer", answer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MFAChallengeResponse::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool MFAChallengeResponse::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"uuid",uuid);
|
field_from_json(Obj,"uuid",uuid);
|
||||||
field_from_json(Obj,"answer",answer);
|
field_from_json(Obj,"answer",answer);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: MFAChallengeResponse" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserInfo::to_json(Poco::JSON::Object &Obj) const {
|
void UserInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"Id",Id);
|
field_to_json(Obj,"id",id);
|
||||||
field_to_json(Obj,"name",name);
|
field_to_json(Obj,"name",name);
|
||||||
field_to_json(Obj,"description", description);
|
field_to_json(Obj,"description", description);
|
||||||
field_to_json(Obj,"avatar", avatar);
|
field_to_json(Obj,"avatar", avatar);
|
||||||
@@ -251,11 +259,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"lastPasswords",lastPasswords);
|
field_to_json(Obj,"lastPasswords",lastPasswords);
|
||||||
field_to_json(Obj,"oauthType",oauthType);
|
field_to_json(Obj,"oauthType",oauthType);
|
||||||
field_to_json(Obj,"oauthUserInfo",oauthUserInfo);
|
field_to_json(Obj,"oauthUserInfo",oauthUserInfo);
|
||||||
|
field_to_json(Obj,"modified",modified);
|
||||||
|
field_to_json(Obj,"signingUp",signingUp);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"Id",Id);
|
field_from_json(Obj,"id",id);
|
||||||
field_from_json(Obj,"name",name);
|
field_from_json(Obj,"name",name);
|
||||||
field_from_json(Obj,"description",description);
|
field_from_json(Obj,"description",description);
|
||||||
field_from_json(Obj,"avatar",avatar);
|
field_from_json(Obj,"avatar",avatar);
|
||||||
@@ -265,6 +275,8 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"currentLoginURI",currentLoginURI);
|
field_from_json(Obj,"currentLoginURI",currentLoginURI);
|
||||||
field_from_json(Obj,"locale",locale);
|
field_from_json(Obj,"locale",locale);
|
||||||
field_from_json(Obj,"notes",notes);
|
field_from_json(Obj,"notes",notes);
|
||||||
|
field_from_json(Obj,"location", location);
|
||||||
|
field_from_json(Obj,"owner", owner);
|
||||||
field_from_json<USER_ROLE>(Obj,"userRole",userRole, UserTypeFromString);
|
field_from_json<USER_ROLE>(Obj,"userRole",userRole, UserTypeFromString);
|
||||||
field_from_json(Obj,"securityPolicy",securityPolicy);
|
field_from_json(Obj,"securityPolicy",securityPolicy);
|
||||||
field_from_json(Obj,"userTypeProprietaryInfo",userTypeProprietaryInfo);
|
field_from_json(Obj,"userTypeProprietaryInfo",userTypeProprietaryInfo);
|
||||||
@@ -283,13 +295,29 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"lastPasswords",lastPasswords);
|
field_from_json(Obj,"lastPasswords",lastPasswords);
|
||||||
field_from_json(Obj,"oauthType",oauthType);
|
field_from_json(Obj,"oauthType",oauthType);
|
||||||
field_from_json(Obj,"oauthUserInfo",oauthUserInfo);
|
field_from_json(Obj,"oauthUserInfo",oauthUserInfo);
|
||||||
|
field_from_json(Obj,"modified",modified);
|
||||||
|
field_from_json(Obj,"signingUp",signingUp);
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
|
std::cout << "Cannot parse: UserInfo" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void UserInfoList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"users",users);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UserInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"users",users);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: InternalServiceInfo" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const {
|
void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"privateURI",privateURI);
|
field_to_json(Obj,"privateURI",privateURI);
|
||||||
field_to_json(Obj,"publicURI",publicURI);
|
field_to_json(Obj,"publicURI",publicURI);
|
||||||
@@ -303,7 +331,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"token",token);
|
field_from_json(Obj,"token",token);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: InternalServiceInfo" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -321,7 +349,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "services", services);
|
field_from_json(Obj, "services", services);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: InternalSystemServices" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -343,7 +371,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "authenticationType", authenticationType);
|
field_from_json(Obj, "authenticationType", authenticationType);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: SystemEndpoint" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -357,7 +385,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "endpoints", endpoints);
|
field_from_json(Obj, "endpoints", endpoints);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
std::cout << "Cannot parse: SystemEndpointList" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -376,7 +404,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj, "userInfo", userinfo);
|
field_from_json(Obj, "userInfo", userinfo);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: UserInfoAndPolicy" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -387,14 +415,14 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"note", note);
|
field_to_json(Obj,"note", note);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NoteInfo::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool NoteInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"created",created);
|
field_from_json(Obj,"created",created);
|
||||||
field_from_json(Obj,"createdBy",createdBy);
|
field_from_json(Obj,"createdBy",createdBy);
|
||||||
field_from_json(Obj,"note",note);
|
field_from_json(Obj,"note", note);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: NoteInfo" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -405,20 +433,20 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
SecurityObjects::NoteInfoVec NIV;
|
SecurityObjects::NoteInfoVec NIV;
|
||||||
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
|
NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString());
|
||||||
for(auto const &i:NIV) {
|
for(auto const &i:NIV) {
|
||||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note};
|
SecurityObjects::NoteInfo ii{.created=(uint64_t)Utils::Now(), .createdBy=UInfo.email, .note=i.note};
|
||||||
Notes.push_back(ii);
|
Notes.push_back(ii);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: MergeNotes" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) {
|
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) {
|
||||||
for(auto const &i:NewNotes) {
|
for(auto const &i:NewNotes) {
|
||||||
SecurityObjects::NoteInfo ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note};
|
SecurityObjects::NoteInfo ii{.created=(uint64_t)Utils::Now(), .createdBy=UInfo.email, .note=i.note};
|
||||||
ExistingNotes.push_back(ii);
|
ExistingNotes.push_back(ii);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -429,13 +457,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
|
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProfileAction::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool ProfileAction::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"resource",resource);
|
field_from_json(Obj,"resource",resource);
|
||||||
field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString );
|
field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString );
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: ProfileAction" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -449,7 +477,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"notes", notes);
|
field_to_json(Obj,"notes", notes);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SecurityProfile::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool SecurityProfile::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id",id);
|
field_from_json(Obj,"id",id);
|
||||||
field_from_json(Obj,"name",name);
|
field_from_json(Obj,"name",name);
|
||||||
@@ -459,7 +487,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"notes",notes);
|
field_from_json(Obj,"notes",notes);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: SecurityProfile" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -468,12 +496,12 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj, "profiles", profiles);
|
field_to_json(Obj, "profiles", profiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SecurityProfileList::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool SecurityProfileList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"profiles",profiles);
|
field_from_json(Obj,"profiles",profiles);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: SecurityProfileList" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -491,10 +519,10 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_to_json(Obj,"expires",expires);
|
field_to_json(Obj,"expires",expires);
|
||||||
field_to_json(Obj,"completed",completed);
|
field_to_json(Obj,"completed",completed);
|
||||||
field_to_json(Obj,"canceled",canceled);
|
field_to_json(Obj,"canceled",canceled);
|
||||||
|
field_to_json(Obj,"userAction",userAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ActionLink::from_json(Poco::JSON::Object::Ptr &Obj) {
|
bool ActionLink::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id",id);
|
field_from_json(Obj,"id",id);
|
||||||
field_from_json(Obj,"action",action);
|
field_from_json(Obj,"action",action);
|
||||||
@@ -508,11 +536,163 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
field_from_json(Obj,"expires",expires);
|
field_from_json(Obj,"expires",expires);
|
||||||
field_from_json(Obj,"completed",completed);
|
field_from_json(Obj,"completed",completed);
|
||||||
field_from_json(Obj,"canceled",canceled);
|
field_from_json(Obj,"canceled",canceled);
|
||||||
|
field_from_json(Obj,"userAction",userAction);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: ActionLink" << std::endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Preferences::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id",id);
|
||||||
|
field_to_json(Obj,"modified",modified);
|
||||||
|
field_to_json(Obj,"data",data);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Preferences::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id",id);
|
||||||
|
field_from_json(Obj,"modified",modified);
|
||||||
|
field_from_json(Obj,"data",data);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: Preferences" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubMfaConfig::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"id",id);
|
||||||
|
field_to_json(Obj,"type",type);
|
||||||
|
field_to_json(Obj,"sms",sms);
|
||||||
|
field_to_json(Obj,"email",email);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubMfaConfig::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"id",id);
|
||||||
|
field_from_json(Obj,"type",type);
|
||||||
|
field_from_json(Obj,"sms",sms);
|
||||||
|
field_from_json(Obj,"email",email);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: SubMfaConfig" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Token::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"token",token);
|
||||||
|
field_to_json(Obj,"refreshToken",refreshToken);
|
||||||
|
field_to_json(Obj,"tokenType",tokenType);
|
||||||
|
field_to_json(Obj,"userName",userName);
|
||||||
|
field_to_json(Obj,"created",created);
|
||||||
|
field_to_json(Obj,"expires",expires);
|
||||||
|
field_to_json(Obj,"idleTimeout",idleTimeout);
|
||||||
|
field_to_json(Obj,"revocationDate",revocationDate);
|
||||||
|
field_to_json(Obj,"lastRefresh", lastRefresh);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Token::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj,"token",token);
|
||||||
|
field_from_json(Obj,"refreshToken",refreshToken);
|
||||||
|
field_from_json(Obj,"tokenType",tokenType);
|
||||||
|
field_from_json(Obj,"userName",userName);
|
||||||
|
field_from_json(Obj,"created",created);
|
||||||
|
field_from_json(Obj,"expires",expires);
|
||||||
|
field_from_json(Obj,"idleTimeout",idleTimeout);
|
||||||
|
field_from_json(Obj,"revocationDate",revocationDate);
|
||||||
|
field_from_json(Obj,"lastRefresh", lastRefresh);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: Token" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoginRecordInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj,"sessionId",sessionId);
|
||||||
|
field_to_json(Obj,"userId",userId);
|
||||||
|
field_to_json(Obj,"email",email);
|
||||||
|
field_to_json(Obj,"login",login);
|
||||||
|
field_to_json(Obj,"logout",logout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiKeyAccessRight::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "service", service);
|
||||||
|
field_to_json(Obj, "access", access);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiKeyAccessRight::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "service", service);
|
||||||
|
field_from_json(Obj, "access", access);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: Token" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiKeyAccessRightList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "acls", acls);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiKeyAccessRightList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "acls", acls);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: Token" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiKeyEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "id", id);
|
||||||
|
field_to_json(Obj, "userUuid", userUuid);
|
||||||
|
field_to_json(Obj, "name", name);
|
||||||
|
field_to_json(Obj, "apiKey", apiKey);
|
||||||
|
field_to_json(Obj, "salt", salt);
|
||||||
|
field_to_json(Obj, "description", description);
|
||||||
|
field_to_json(Obj, "expiresOn", expiresOn);
|
||||||
|
field_to_json(Obj, "rights", rights);
|
||||||
|
field_to_json(Obj, "lastUse", lastUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiKeyEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "id", id);
|
||||||
|
field_from_json(Obj, "userUuid", userUuid);
|
||||||
|
field_from_json(Obj, "name", name);
|
||||||
|
field_from_json(Obj, "apiKey", apiKey);
|
||||||
|
field_from_json(Obj, "salt", salt);
|
||||||
|
field_from_json(Obj, "description", description);
|
||||||
|
field_from_json(Obj, "expiresOn", expiresOn);
|
||||||
|
field_from_json(Obj, "rights", rights);
|
||||||
|
field_from_json(Obj, "lastUse", lastUse);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: Token" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiKeyEntryList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "apiKeys", apiKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiKeyEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "apiKeys", apiKeys);
|
||||||
|
return true;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "Cannot parse: Token" << std::endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,21 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
#pragma once
|
||||||
#define UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
|
||||||
|
|
||||||
#include "Poco/JSON/Object.h"
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
#include "Poco/JSON/Object.h"
|
||||||
|
#include "Poco/Data/LOB.h"
|
||||||
|
#include "Poco/Data/LOBStream.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
namespace OpenWifi::SecurityObjects {
|
namespace OpenWifi {
|
||||||
|
uint64_t Now();
|
||||||
|
namespace SecurityObjects {
|
||||||
|
|
||||||
|
typedef std::string USER_ID_TYPE;
|
||||||
|
|
||||||
struct AclTemplate {
|
struct AclTemplate {
|
||||||
bool Read_ = true;
|
bool Read_ = true;
|
||||||
@@ -21,8 +29,13 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
bool Delete_ = true;
|
bool Delete_ = true;
|
||||||
bool PortalLogin_ = true;
|
bool PortalLogin_ = true;
|
||||||
|
|
||||||
|
AclTemplate() noexcept = default;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj); };
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert( std::is_nothrow_move_constructible_v<AclTemplate> );
|
||||||
|
|
||||||
struct WebToken {
|
struct WebToken {
|
||||||
std::string access_token_;
|
std::string access_token_;
|
||||||
@@ -36,24 +49,26 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
uint64_t idle_timeout_=0;
|
uint64_t idle_timeout_=0;
|
||||||
AclTemplate acl_template_;
|
AclTemplate acl_template_;
|
||||||
uint64_t created_=0;
|
uint64_t created_=0;
|
||||||
|
uint64_t lastRefresh_=0;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum USER_ROLE {
|
enum USER_ROLE {
|
||||||
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING
|
UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING, PARTNER
|
||||||
};
|
};
|
||||||
|
|
||||||
USER_ROLE UserTypeFromString(const std::string &U);
|
USER_ROLE UserTypeFromString(const std::string &U);
|
||||||
std::string UserTypeToString(USER_ROLE U);
|
std::string UserTypeToString(USER_ROLE U);
|
||||||
|
|
||||||
struct NoteInfo {
|
struct NoteInfo {
|
||||||
uint64_t created = std::time(nullptr);
|
uint64_t created=0; // = Utils::Now();
|
||||||
std::string createdBy;
|
std::string createdBy;
|
||||||
std::string note;
|
std::string note;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
typedef std::vector<NoteInfo> NoteInfoVec;
|
typedef std::vector<NoteInfo> NoteInfoVec;
|
||||||
|
|
||||||
@@ -63,7 +78,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
bool primary = false;
|
bool primary = false;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MfaAuthInfo {
|
struct MfaAuthInfo {
|
||||||
@@ -71,25 +86,26 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
std::string method;
|
std::string method;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UserLoginLoginExtensions {
|
struct UserLoginLoginExtensions {
|
||||||
std::vector<MobilePhoneNumber> mobiles;
|
std::vector<MobilePhoneNumber> mobiles;
|
||||||
struct MfaAuthInfo mfa;
|
struct MfaAuthInfo mfa;
|
||||||
|
std::string authenticatorSecret;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MFAChallengeRequest {
|
struct MFAChallengeRequest {
|
||||||
std::string uuid;
|
std::string uuid;
|
||||||
std::string question;
|
std::string question;
|
||||||
std::string method;
|
std::string method;
|
||||||
uint64_t created = std::time(nullptr);
|
uint64_t created = Utils::Now();
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MFAChallengeResponse {
|
struct MFAChallengeResponse {
|
||||||
@@ -97,11 +113,11 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
std::string answer;
|
std::string answer;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UserInfo {
|
struct UserInfo {
|
||||||
std::string Id;
|
std::string id;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string description;
|
std::string description;
|
||||||
std::string avatar;
|
std::string avatar;
|
||||||
@@ -128,15 +144,24 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
std::string securityPolicy;
|
std::string securityPolicy;
|
||||||
uint64_t securityPolicyChange = 0 ;
|
uint64_t securityPolicyChange = 0 ;
|
||||||
std::string currentPassword;
|
std::string currentPassword;
|
||||||
Types::StringVec lastPasswords;
|
OpenWifi::Types::StringVec lastPasswords;
|
||||||
std::string oauthType;
|
std::string oauthType;
|
||||||
std::string oauthUserInfo;
|
std::string oauthUserInfo;
|
||||||
|
uint64_t modified;
|
||||||
|
std::string signingUp;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
typedef std::vector<UserInfo> UserInfoVec;
|
typedef std::vector<UserInfo> UserInfoVec;
|
||||||
|
|
||||||
|
struct UserInfoList {
|
||||||
|
std::vector<UserInfo> users;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
// bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
// bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
||||||
bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes);
|
||||||
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes);
|
bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes);
|
||||||
@@ -200,7 +225,7 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
std::string resource;
|
std::string resource;
|
||||||
ResourceAccessType access;
|
ResourceAccessType access;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
typedef std::vector<ProfileAction> ProfileActionVec;
|
typedef std::vector<ProfileAction> ProfileActionVec;
|
||||||
|
|
||||||
@@ -212,19 +237,23 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
std::string role;
|
std::string role;
|
||||||
NoteInfoVec notes;
|
NoteInfoVec notes;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
typedef std::vector<SecurityProfile> SecurityProfileVec;
|
typedef std::vector<SecurityProfile> SecurityProfileVec;
|
||||||
|
|
||||||
struct SecurityProfileList {
|
struct SecurityProfileList {
|
||||||
SecurityProfileVec profiles;
|
SecurityProfileVec profiles;
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum LinkActions {
|
enum LinkActions {
|
||||||
FORGOT_PASSWORD=1,
|
FORGOT_PASSWORD=1,
|
||||||
VERIFY_EMAIL
|
VERIFY_EMAIL,
|
||||||
|
SUB_FORGOT_PASSWORD,
|
||||||
|
SUB_VERIFY_EMAIL,
|
||||||
|
SUB_SIGNUP,
|
||||||
|
EMAIL_INVITATION
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ActionLink {
|
struct ActionLink {
|
||||||
@@ -236,14 +265,104 @@ namespace OpenWifi::SecurityObjects {
|
|||||||
std::string locale;
|
std::string locale;
|
||||||
std::string message;
|
std::string message;
|
||||||
uint64_t sent=0;
|
uint64_t sent=0;
|
||||||
uint64_t created=std::time(nullptr);
|
uint64_t created=Utils::Now();
|
||||||
uint64_t expires=0;
|
uint64_t expires=0;
|
||||||
uint64_t completed=0;
|
uint64_t completed=0;
|
||||||
uint64_t canceled=0;
|
uint64_t canceled=0;
|
||||||
|
bool userAction=true;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
bool from_json(Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
#endif //UCENTRAL_RESTAPI_SECURITYOBJECTS_H
|
struct Preferences {
|
||||||
|
std::string id;
|
||||||
|
uint64_t modified;
|
||||||
|
Types::StringPairVec data;
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubMfaConfig {
|
||||||
|
std::string id;
|
||||||
|
std::string type;
|
||||||
|
std::string sms;
|
||||||
|
std::string email;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Token {
|
||||||
|
std::string token;
|
||||||
|
std::string refreshToken;
|
||||||
|
std::string tokenType;
|
||||||
|
std::string userName;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t expires=0;
|
||||||
|
uint64_t idleTimeout=0;
|
||||||
|
uint64_t revocationDate=0;
|
||||||
|
uint64_t lastRefresh=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Avatar {
|
||||||
|
std::string id;
|
||||||
|
std::string type;
|
||||||
|
uint64_t created=0;
|
||||||
|
std::string name;
|
||||||
|
Poco::Data::BLOB avatar;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LoginRecordInfo {
|
||||||
|
std::string sessionId;
|
||||||
|
std::string userId;
|
||||||
|
std::string email;
|
||||||
|
uint64_t login=0;
|
||||||
|
uint64_t logout=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ApiKeyAccessRight {
|
||||||
|
std::string service;
|
||||||
|
std::string access;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ApiKeyAccessRightList {
|
||||||
|
std::vector<ApiKeyAccessRight> acls;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ApiKeyEntry {
|
||||||
|
Types::UUID_t id;
|
||||||
|
Types::UUID_t userUuid;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
std::string apiKey;
|
||||||
|
std::string salt;
|
||||||
|
std::uint64_t created;
|
||||||
|
std::uint64_t expiresOn=0;
|
||||||
|
ApiKeyAccessRightList rights;
|
||||||
|
std::uint64_t lastUse=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ApiKeyEntryList {
|
||||||
|
std::vector<ApiKeyEntry> apiKeys;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
602
src/RESTObjects/RESTAPI_SubObjects.cpp
Normal file
602
src/RESTObjects/RESTAPI_SubObjects.cpp
Normal file
@@ -0,0 +1,602 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-10-27.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "RESTAPI_SubObjects.h"
|
||||||
|
#include "framework/RESTAPI_utils.h"
|
||||||
|
|
||||||
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
|
|
||||||
|
namespace OpenWifi::SubObjects {
|
||||||
|
|
||||||
|
void HomeDeviceMode::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "enableLEDS", enableLEDS);
|
||||||
|
field_to_json(Obj, "type", type);
|
||||||
|
field_to_json(Obj, "subnet", subnet);
|
||||||
|
field_to_json(Obj, "subnetMask", subnetMask);
|
||||||
|
field_to_json(Obj, "startIP", startIP);
|
||||||
|
field_to_json(Obj, "endIP", endIP);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
field_to_json(Obj, "subnetV6", subnetV6);
|
||||||
|
field_to_json(Obj, "subnetMaskV6", subnetMaskV6);
|
||||||
|
field_to_json(Obj, "startIPV6", startIPV6);
|
||||||
|
field_to_json(Obj, "endIPV6", endIPV6);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HomeDeviceMode::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "enableLEDS", enableLEDS);
|
||||||
|
field_from_json(Obj, "type", type);
|
||||||
|
field_from_json(Obj, "subnet", subnet);
|
||||||
|
field_from_json(Obj, "subnetMask", subnetMask);
|
||||||
|
field_from_json(Obj, "startIP", startIP);
|
||||||
|
field_from_json(Obj, "endIP", endIP);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
field_from_json(Obj, "subnetV6", subnetV6);
|
||||||
|
field_from_json(Obj, "subnetMaskV6", subnetMaskV6);
|
||||||
|
field_from_json(Obj, "startIPV6", startIPV6);
|
||||||
|
field_from_json(Obj, "endIPV6", endIPV6);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IPReservation::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "nickname", nickname);
|
||||||
|
field_to_json(Obj, "ipAddress", ipAddress);
|
||||||
|
field_to_json(Obj, "macAddress", macAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPReservation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "nickname", nickname);
|
||||||
|
field_from_json(Obj, "ipAddress", ipAddress);
|
||||||
|
field_from_json(Obj, "macAddress", macAddress);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IPReservationList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "id", id);
|
||||||
|
field_to_json(Obj, "reservations", reservations);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IPReservationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "id", id);
|
||||||
|
field_from_json(Obj, "reservations", reservations);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DnsConfiguration::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "ISP", ISP);
|
||||||
|
field_to_json(Obj, "custom", custom);
|
||||||
|
field_to_json(Obj, "primary", primary);
|
||||||
|
field_to_json(Obj, "secondary", secondary);
|
||||||
|
field_to_json(Obj, "primaryV6", primaryV6);
|
||||||
|
field_to_json(Obj, "secondaryV6", secondaryV6);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DnsConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "ISP", ISP);
|
||||||
|
field_from_json(Obj, "custom", custom);
|
||||||
|
field_from_json(Obj, "primary", primary);
|
||||||
|
field_from_json(Obj, "secondary", secondary);
|
||||||
|
field_from_json(Obj, "primaryV6", primaryV6);
|
||||||
|
field_from_json(Obj, "secondaryV6", secondaryV6);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InternetConnection::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "type", type);
|
||||||
|
field_to_json(Obj, "username", username);
|
||||||
|
field_to_json(Obj, "password", password);
|
||||||
|
field_to_json(Obj, "ipAddress", ipAddress);
|
||||||
|
field_to_json(Obj, "subnetMask", subnetMask);
|
||||||
|
field_to_json(Obj, "defaultGateway", defaultGateway);
|
||||||
|
field_to_json(Obj, "sendHostname", sendHostname);
|
||||||
|
field_to_json(Obj, "primaryDns", primaryDns);
|
||||||
|
field_to_json(Obj, "secondaryDns", secondaryDns);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
field_to_json(Obj, "ipV6Support", ipV6Support);
|
||||||
|
field_to_json(Obj, "ipAddressV6", ipAddressV6);
|
||||||
|
field_to_json(Obj, "subnetMaskV6", subnetMaskV6);
|
||||||
|
field_to_json(Obj, "defaultGatewayV6", defaultGatewayV6);
|
||||||
|
field_to_json(Obj, "primaryDnsV6", primaryDnsV6);
|
||||||
|
field_to_json(Obj, "secondaryDnsV6", secondaryDnsV6);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InternetConnection::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "type", type);
|
||||||
|
field_from_json(Obj, "username", username);
|
||||||
|
field_from_json(Obj, "password", password);
|
||||||
|
field_from_json(Obj, "ipAddress", ipAddress);
|
||||||
|
field_from_json(Obj, "subnetMask", subnetMask);
|
||||||
|
field_from_json(Obj, "defaultGateway", defaultGateway);
|
||||||
|
field_from_json(Obj, "sendHostname", sendHostname);
|
||||||
|
field_from_json(Obj, "primaryDns", primaryDns);
|
||||||
|
field_from_json(Obj, "secondaryDns", secondaryDns);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
field_from_json(Obj, "ipV6Support", ipV6Support);
|
||||||
|
field_from_json(Obj, "ipAddressV6", ipAddressV6);
|
||||||
|
field_from_json(Obj, "subnetMaskV6", subnetMaskV6);
|
||||||
|
field_from_json(Obj, "defaultGatewayV6", defaultGatewayV6);
|
||||||
|
field_from_json(Obj, "primaryDnsV6", primaryDnsV6);
|
||||||
|
field_from_json(Obj, "secondaryDnsV6", secondaryDnsV6);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WifiNetwork::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "type", type);
|
||||||
|
field_to_json(Obj, "name", name);
|
||||||
|
field_to_json(Obj, "password", password);
|
||||||
|
field_to_json(Obj, "encryption", encryption);
|
||||||
|
field_to_json(Obj, "bands", bands);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WifiNetwork::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "type", type);
|
||||||
|
field_from_json(Obj, "name", name);
|
||||||
|
field_from_json(Obj, "password", password);
|
||||||
|
field_from_json(Obj, "encryption", encryption);
|
||||||
|
field_from_json(Obj, "bands", bands);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WifiNetworkList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "wifiNetworks", wifiNetworks);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WifiNetworkList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "wifiNetworks", wifiNetworks);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessTime::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "day", day);
|
||||||
|
field_to_json(Obj, "rangeList", rangeList);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AccessTime::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "day", day);
|
||||||
|
field_from_json(Obj, "rangeList", rangeList);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessTimes::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "schedule", schedule);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AccessTimes::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "schedule", schedule);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriberDevice::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "name", name);
|
||||||
|
field_to_json(Obj, "description", description);
|
||||||
|
field_to_json(Obj, "macAddress", macAddress);
|
||||||
|
field_to_json(Obj, "manufacturer", manufacturer);
|
||||||
|
field_to_json(Obj, "firstContact", firstContact);
|
||||||
|
field_to_json(Obj, "lastContact", lastContact);
|
||||||
|
field_to_json(Obj, "group", group);
|
||||||
|
field_to_json(Obj, "icon", icon);
|
||||||
|
field_to_json(Obj, "suspended", suspended);
|
||||||
|
field_to_json(Obj, "ip", ip);
|
||||||
|
field_to_json(Obj, "schedule", schedule);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubscriberDevice::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "name", name);
|
||||||
|
field_from_json(Obj, "description", description);
|
||||||
|
field_from_json(Obj, "macAddress", macAddress);
|
||||||
|
field_from_json(Obj, "manufacturer", manufacturer);
|
||||||
|
field_from_json(Obj, "firstContact", firstContact);
|
||||||
|
field_from_json(Obj, "lastContact", lastContact);
|
||||||
|
field_from_json(Obj, "group", group);
|
||||||
|
field_from_json(Obj, "icon", icon);
|
||||||
|
field_from_json(Obj, "suspended", suspended);
|
||||||
|
field_from_json(Obj, "ip", ip);
|
||||||
|
field_from_json(Obj, "schedule", schedule);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriberDeviceList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "devices", devices);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubscriberDeviceList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "devices", devices);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Association::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "name", name);
|
||||||
|
field_to_json(Obj, "ssid", ssid);
|
||||||
|
field_to_json(Obj, "macAddress", macAddress);
|
||||||
|
field_to_json(Obj, "rssi", rssi);
|
||||||
|
field_to_json(Obj, "power", power);
|
||||||
|
field_to_json(Obj, "ipv4", ipv4);
|
||||||
|
field_to_json(Obj, "ipv6", ipv6);
|
||||||
|
field_to_json(Obj, "tx", tx);
|
||||||
|
field_to_json(Obj, "rx", rx);
|
||||||
|
field_to_json(Obj, "manufacturer", manufacturer);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Association::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "name", name);
|
||||||
|
field_from_json(Obj, "ssid", ssid);
|
||||||
|
field_from_json(Obj, "macAddress", macAddress);
|
||||||
|
field_from_json(Obj, "rssi", rssi);
|
||||||
|
field_from_json(Obj, "power", power);
|
||||||
|
field_from_json(Obj, "ipv4", ipv4);
|
||||||
|
field_from_json(Obj, "ipv6", ipv6);
|
||||||
|
field_from_json(Obj, "tx", tx);
|
||||||
|
field_from_json(Obj, "rx", rx);
|
||||||
|
field_from_json(Obj, "manufacturer", manufacturer);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AssociationList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "associations", associations);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AssociationList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "associations", associations);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "macAddress", macAddress);
|
||||||
|
field_to_json(Obj, "speed", speed);
|
||||||
|
field_to_json(Obj, "mode", mode);
|
||||||
|
field_to_json(Obj, "ipv4", ipv4);
|
||||||
|
field_to_json(Obj, "ipv6", ipv6);
|
||||||
|
field_to_json(Obj, "tx", tx);
|
||||||
|
field_to_json(Obj, "rx", rx);
|
||||||
|
field_to_json(Obj, "manufacturer", manufacturer);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Client::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "macAddress", macAddress);
|
||||||
|
field_from_json(Obj, "speed", speed);
|
||||||
|
field_from_json(Obj, "mode", mode);
|
||||||
|
field_from_json(Obj, "ipv4", ipv4);
|
||||||
|
field_from_json(Obj, "ipv6", ipv6);
|
||||||
|
field_from_json(Obj, "tx", tx);
|
||||||
|
field_from_json(Obj, "rx", rx);
|
||||||
|
field_from_json(Obj, "manufacturer", manufacturer);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "clients", clients);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClientList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "clients", clients);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Location::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "buildingName", buildingName);
|
||||||
|
field_to_json(Obj, "addressLines", addressLines);
|
||||||
|
field_to_json(Obj, "city", city);
|
||||||
|
field_to_json(Obj, "state", state);
|
||||||
|
field_to_json(Obj, "postal", postal);
|
||||||
|
field_to_json(Obj, "country", country);
|
||||||
|
field_to_json(Obj, "phones", phones);
|
||||||
|
field_to_json(Obj, "mobiles", mobiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Location::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "buildingName", buildingName);
|
||||||
|
field_from_json(Obj, "addressLines", addressLines);
|
||||||
|
field_from_json(Obj, "city", city);
|
||||||
|
field_from_json(Obj, "state", state);
|
||||||
|
field_from_json(Obj, "postal", postal);
|
||||||
|
field_from_json(Obj, "country", country);
|
||||||
|
field_from_json(Obj, "phones", phones);
|
||||||
|
field_from_json(Obj, "mobiles", mobiles);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadioHE::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "multipleBSSID", multipleBSSID);
|
||||||
|
field_to_json(Obj, "ema", ema);
|
||||||
|
field_to_json(Obj, "bssColor", bssColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadioHE::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "multipleBSSID", multipleBSSID);
|
||||||
|
field_from_json(Obj, "ema", ema);
|
||||||
|
field_from_json(Obj, "bssColor", bssColor);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadioRates::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "beacon", beacon);
|
||||||
|
field_to_json(Obj, "multicast", multicast);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadioRates::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "beacon", beacon);
|
||||||
|
field_from_json(Obj, "multicast", multicast);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadioInformation::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "band", band);
|
||||||
|
field_to_json(Obj, "bandwidth", bandwidth);
|
||||||
|
field_to_json(Obj, "channel", channel);
|
||||||
|
field_to_json(Obj, "country", country);
|
||||||
|
field_to_json(Obj, "channelMode", channelMode);
|
||||||
|
field_to_json(Obj, "channelWidth", channelWidth);
|
||||||
|
field_to_json(Obj, "requireMode", requireMode);
|
||||||
|
field_to_json(Obj, "txpower", txpower);
|
||||||
|
field_to_json(Obj, "legacyRates", legacyRates);
|
||||||
|
field_to_json(Obj, "beaconInterval", beaconInterval);
|
||||||
|
field_to_json(Obj, "dtimPeriod", dtimPeriod);
|
||||||
|
field_to_json(Obj, "maximumClients", maximumClients);
|
||||||
|
field_to_json(Obj, "rates", rates);
|
||||||
|
field_to_json(Obj, "he", he);
|
||||||
|
field_to_json(Obj, "rawInfo", rawInfo);
|
||||||
|
field_to_json(Obj, "allowDFS", allowDFS);
|
||||||
|
field_to_json(Obj, "mimo", mimo);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RadioInformation::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "band", band);
|
||||||
|
field_from_json(Obj, "bandwidth", bandwidth);
|
||||||
|
field_from_json(Obj, "channel", channel);
|
||||||
|
field_from_json(Obj, "country", country);
|
||||||
|
field_from_json(Obj, "channelMode", channelMode);
|
||||||
|
field_from_json(Obj, "channelWidth", channelWidth);
|
||||||
|
field_from_json(Obj, "requireMode", requireMode);
|
||||||
|
field_from_json(Obj, "txpower", txpower);
|
||||||
|
field_from_json(Obj, "legacyRates", legacyRates);
|
||||||
|
field_from_json(Obj, "beaconInterval", beaconInterval);
|
||||||
|
field_from_json(Obj, "dtimPeriod", dtimPeriod);
|
||||||
|
field_from_json(Obj, "maximumClients", maximumClients);
|
||||||
|
field_from_json(Obj, "rates", rates);
|
||||||
|
field_from_json(Obj, "he", he);
|
||||||
|
field_from_json(Obj, "rawInfo", rawInfo);
|
||||||
|
field_from_json(Obj, "allowDFS", allowDFS);
|
||||||
|
field_from_json(Obj, "mimo", mimo);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessPoint::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "id", id);
|
||||||
|
field_to_json(Obj, "macAddress", macAddress);
|
||||||
|
field_to_json(Obj, "serialNumber", serialNumber);
|
||||||
|
field_to_json(Obj, "name", name);
|
||||||
|
field_to_json(Obj, "deviceType", deviceType);
|
||||||
|
field_to_json(Obj, "subscriberDevices", subscriberDevices);
|
||||||
|
field_to_json(Obj, "ipReservations", ipReservations);
|
||||||
|
field_to_json(Obj, "address", address);
|
||||||
|
field_to_json(Obj, "wifiNetworks", wifiNetworks);
|
||||||
|
field_to_json(Obj, "internetConnection", internetConnection);
|
||||||
|
field_to_json(Obj, "deviceMode", deviceMode);
|
||||||
|
field_to_json(Obj, "dnsConfiguration", dnsConfiguration);
|
||||||
|
field_to_json(Obj, "radios", radios);
|
||||||
|
field_to_json(Obj, "automaticUpgrade", automaticUpgrade);
|
||||||
|
field_to_json(Obj, "configurationUUID", configurationUUID);
|
||||||
|
field_to_json(Obj, "currentFirmware", currentFirmware);
|
||||||
|
field_to_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
||||||
|
field_to_json(Obj, "latestFirmware", latestFirmware);
|
||||||
|
field_to_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
||||||
|
field_to_json(Obj, "newFirmwareAvailable", newFirmwareAvailable);
|
||||||
|
field_to_json(Obj, "latestFirmwareURI", latestFirmwareURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AccessPoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "id", id);
|
||||||
|
field_from_json(Obj, "macAddress", macAddress);
|
||||||
|
field_from_json(Obj, "serialNumber", serialNumber);
|
||||||
|
field_from_json(Obj, "name", name);
|
||||||
|
field_from_json(Obj, "deviceType", deviceType);
|
||||||
|
field_from_json(Obj, "subscriberDevices", subscriberDevices);
|
||||||
|
field_from_json(Obj, "ipReservations", ipReservations);
|
||||||
|
field_from_json(Obj, "address", address);
|
||||||
|
field_from_json(Obj, "wifiNetworks", wifiNetworks);
|
||||||
|
field_from_json(Obj, "internetConnection", internetConnection);
|
||||||
|
field_from_json(Obj, "deviceMode", deviceMode);
|
||||||
|
field_from_json(Obj, "dnsConfiguration", dnsConfiguration);
|
||||||
|
field_from_json(Obj, "radios", radios);
|
||||||
|
field_from_json(Obj, "automaticUpgrade", automaticUpgrade);
|
||||||
|
field_from_json(Obj, "configurationUUID", configurationUUID);
|
||||||
|
field_from_json(Obj, "currentFirmware", currentFirmware);
|
||||||
|
field_from_json(Obj, "currentFirmwareDate", currentFirmwareDate);
|
||||||
|
field_from_json(Obj, "latestFirmware", latestFirmware);
|
||||||
|
field_from_json(Obj, "latestFirmwareDate", latestFirmwareDate);
|
||||||
|
field_from_json(Obj, "newFirmwareAvailable", newFirmwareAvailable);
|
||||||
|
field_from_json(Obj, "latestFirmwareURI", latestFirmwareURI);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessPointList::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "list", list);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AccessPointList::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "list", list);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriberInfo::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "id", id);
|
||||||
|
field_to_json(Obj, "userId", userId);
|
||||||
|
field_to_json(Obj, "firstName", firstName);
|
||||||
|
field_to_json(Obj, "initials", initials);
|
||||||
|
field_to_json(Obj, "lastName", lastName);
|
||||||
|
field_to_json(Obj, "phoneNumber", phoneNumber);
|
||||||
|
field_to_json(Obj, "secondaryEmail", secondaryEmail);
|
||||||
|
field_to_json(Obj, "accessPoints", accessPoints);
|
||||||
|
field_to_json(Obj, "serviceAddress", serviceAddress);
|
||||||
|
field_to_json(Obj, "billingAddress", billingAddress);
|
||||||
|
field_to_json(Obj, "created", created);
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SubscriberInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "id", id);
|
||||||
|
field_from_json(Obj, "userId", userId);
|
||||||
|
field_from_json(Obj, "firstName", firstName);
|
||||||
|
field_from_json(Obj, "initials", initials);
|
||||||
|
field_from_json(Obj, "lastName", lastName);
|
||||||
|
field_from_json(Obj, "phoneNumber", phoneNumber);
|
||||||
|
field_from_json(Obj, "secondaryEmail", secondaryEmail);
|
||||||
|
field_from_json(Obj, "accessPoints", accessPoints);
|
||||||
|
field_from_json(Obj, "serviceAddress", serviceAddress);
|
||||||
|
field_from_json(Obj, "billingAddress", billingAddress);
|
||||||
|
field_from_json(Obj, "created", created);
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatsEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "timestamp", timestamp);
|
||||||
|
field_to_json(Obj, "tx", tx);
|
||||||
|
field_to_json(Obj, "rx", rx);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StatsEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "timestamp", timestamp);
|
||||||
|
field_from_json(Obj, "tx", tx);
|
||||||
|
field_from_json(Obj, "rx", rx);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatsBlock::to_json(Poco::JSON::Object &Obj) const {
|
||||||
|
field_to_json(Obj, "modified", modified);
|
||||||
|
field_to_json(Obj, "external", external);
|
||||||
|
field_to_json(Obj, "internal", internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StatsBlock::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
|
try {
|
||||||
|
field_from_json(Obj, "modified", modified);
|
||||||
|
field_from_json(Obj, "external", external);
|
||||||
|
field_from_json(Obj, "internal", internal);
|
||||||
|
return true;
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
322
src/RESTObjects/RESTAPI_SubObjects.h
Normal file
322
src/RESTObjects/RESTAPI_SubObjects.h
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-10-27.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OWSUB_RESTAPI_SUBOBJECTS_H
|
||||||
|
#define OWSUB_RESTAPI_SUBOBJECTS_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "Poco/JSON/Object.h"
|
||||||
|
|
||||||
|
namespace OpenWifi::SubObjects {
|
||||||
|
|
||||||
|
struct HomeDeviceMode {
|
||||||
|
bool enableLEDS = true;
|
||||||
|
std::string type; // bridge, manual, automatic
|
||||||
|
std::string subnet;
|
||||||
|
std::string subnetMask;
|
||||||
|
std::string startIP;
|
||||||
|
std::string endIP;
|
||||||
|
uint64_t created = 0 ;
|
||||||
|
uint64_t modified = 0 ;
|
||||||
|
std::string subnetV6;
|
||||||
|
int subnetMaskV6=0;
|
||||||
|
std::string startIPV6;
|
||||||
|
std::string endIPV6;
|
||||||
|
std::string leaseTime;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IPReservation {
|
||||||
|
std::string nickname;
|
||||||
|
std::string ipAddress;
|
||||||
|
std::string macAddress;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IPReservationList {
|
||||||
|
std::string id;
|
||||||
|
std::vector<IPReservation> reservations;
|
||||||
|
uint64_t created = 0 ;
|
||||||
|
uint64_t modified = 0 ;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DnsConfiguration {
|
||||||
|
bool ISP=false;
|
||||||
|
bool custom=false;
|
||||||
|
std::string primary;
|
||||||
|
std::string secondary;
|
||||||
|
std::string primaryV6;
|
||||||
|
std::string secondaryV6;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InternetConnection {
|
||||||
|
std::string type; // automatic, pppoe, manual
|
||||||
|
std::string username;
|
||||||
|
std::string password;
|
||||||
|
std::string ipAddress;
|
||||||
|
std::string subnetMask;
|
||||||
|
std::string defaultGateway;
|
||||||
|
bool sendHostname = true;
|
||||||
|
std::string primaryDns;
|
||||||
|
std::string secondaryDns;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t modified=0;
|
||||||
|
bool ipV6Support=false;
|
||||||
|
std::string ipAddressV6;
|
||||||
|
int subnetMaskV6=0;
|
||||||
|
std::string defaultGatewayV6;
|
||||||
|
std::string primaryDnsV6;
|
||||||
|
std::string secondaryDnsV6;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WifiNetwork {
|
||||||
|
std::string type; // main, guest
|
||||||
|
std::string name;
|
||||||
|
std::string password;
|
||||||
|
std::string encryption;
|
||||||
|
std::vector<std::string> bands;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WifiNetworkList {
|
||||||
|
std::vector<WifiNetwork> wifiNetworks;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t modified=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AccessTime {
|
||||||
|
std::string day;
|
||||||
|
std::vector<std::string> rangeList;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AccessTimes {
|
||||||
|
std::vector<AccessTime> schedule;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t modified=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubscriberDevice {
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
std::string macAddress;
|
||||||
|
std::string manufacturer;
|
||||||
|
uint64_t firstContact=0;
|
||||||
|
uint64_t lastContact=0;
|
||||||
|
std::string group;
|
||||||
|
std::string icon;
|
||||||
|
bool suspended=false;
|
||||||
|
std::string ip;
|
||||||
|
std::vector<AccessTimes> schedule;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubscriberDeviceList {
|
||||||
|
std::vector<SubscriberDevice> devices;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t modified=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Association {
|
||||||
|
std::string name;
|
||||||
|
std::string ssid;
|
||||||
|
std::string macAddress;
|
||||||
|
int rssi=0;
|
||||||
|
int power=0;
|
||||||
|
std::string ipv4;
|
||||||
|
std::string ipv6;
|
||||||
|
uint64_t tx=0;
|
||||||
|
uint64_t rx=0;
|
||||||
|
std::string manufacturer;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AssociationList {
|
||||||
|
std::vector<Association> associations;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t modified=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Client {
|
||||||
|
std::string macAddress;
|
||||||
|
std::string speed;
|
||||||
|
std::string mode;
|
||||||
|
std::string ipv4;
|
||||||
|
std::string ipv6;
|
||||||
|
uint64_t tx=0;
|
||||||
|
uint64_t rx=0;
|
||||||
|
std::string manufacturer;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ClientList {
|
||||||
|
std::vector<Client> clients;
|
||||||
|
uint64_t created=0;
|
||||||
|
uint64_t modified=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Location {
|
||||||
|
std::string buildingName;
|
||||||
|
std::vector<std::string> addressLines;
|
||||||
|
std::string city;
|
||||||
|
std::string state;
|
||||||
|
std::string postal;
|
||||||
|
std::string country;
|
||||||
|
std::vector<std::string> phones;
|
||||||
|
std::vector<std::string> mobiles;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadioHE {
|
||||||
|
bool multipleBSSID = false;
|
||||||
|
bool ema = false;
|
||||||
|
uint64_t bssColor = 64;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadioRates {
|
||||||
|
uint64_t beacon = 6000;
|
||||||
|
uint64_t multicast = 24000;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RadioInformation {
|
||||||
|
std::string band;
|
||||||
|
uint64_t bandwidth;
|
||||||
|
uint64_t channel = 0 ;
|
||||||
|
std::string country;
|
||||||
|
std::string channelMode{"HE"};
|
||||||
|
uint64_t channelWidth = 80;
|
||||||
|
std::string requireMode;
|
||||||
|
uint64_t txpower=0;
|
||||||
|
bool legacyRates = false;
|
||||||
|
uint64_t beaconInterval = 100;
|
||||||
|
uint64_t dtimPeriod = 2;
|
||||||
|
uint64_t maximumClients = 64;
|
||||||
|
RadioRates rates;
|
||||||
|
RadioHE he;
|
||||||
|
bool allowDFS=false;
|
||||||
|
std::string mimo;
|
||||||
|
std::vector<std::string> rawInfo;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AccessPoint {
|
||||||
|
std::string id;
|
||||||
|
std::string macAddress;
|
||||||
|
std::string serialNumber;
|
||||||
|
std::string name;
|
||||||
|
std::string deviceType;
|
||||||
|
SubscriberDeviceList subscriberDevices;
|
||||||
|
IPReservationList ipReservations;
|
||||||
|
Location address;
|
||||||
|
WifiNetworkList wifiNetworks;
|
||||||
|
InternetConnection internetConnection;
|
||||||
|
HomeDeviceMode deviceMode;
|
||||||
|
DnsConfiguration dnsConfiguration;
|
||||||
|
std::vector<RadioInformation> radios;
|
||||||
|
bool automaticUpgrade = true;
|
||||||
|
std::string configurationUUID;
|
||||||
|
std::string currentFirmware;
|
||||||
|
uint64_t currentFirmwareDate;
|
||||||
|
std::string latestFirmware;
|
||||||
|
uint64_t latestFirmwareDate;
|
||||||
|
bool newFirmwareAvailable;
|
||||||
|
std::string latestFirmwareURI;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AccessPointList {
|
||||||
|
std::vector<AccessPoint> list;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubscriberInfo {
|
||||||
|
std::string id;
|
||||||
|
std::string userId;
|
||||||
|
std::string firstName;
|
||||||
|
std::string initials;
|
||||||
|
std::string lastName;
|
||||||
|
std::string phoneNumber;
|
||||||
|
std::string secondaryEmail;
|
||||||
|
AccessPointList accessPoints;
|
||||||
|
Location serviceAddress;
|
||||||
|
Location billingAddress;
|
||||||
|
uint64_t created = 0;
|
||||||
|
uint64_t modified = 0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct StatsEntry {
|
||||||
|
uint64_t timestamp=0;
|
||||||
|
uint64_t tx=0;
|
||||||
|
uint64_t rx=0;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct StatsBlock {
|
||||||
|
uint64_t modified=0;
|
||||||
|
std::vector<StatsEntry> external, internal;
|
||||||
|
|
||||||
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //OWSUB_RESTAPI_SUBOBJECTS_H
|
||||||
@@ -3,12 +3,14 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "GW_SDK.h"
|
#include "GW_SDK.h"
|
||||||
#include "Daemon.h"
|
|
||||||
#include "Poco/Net/HTTPResponse.h"
|
#include "Poco/Net/HTTPResponse.h"
|
||||||
|
|
||||||
|
#include "framework/MicroServiceNames.h"
|
||||||
|
#include "framework/OpenAPIRequests.h"
|
||||||
|
|
||||||
namespace OpenWifi::SDK::GW {
|
namespace OpenWifi::SDK::GW {
|
||||||
|
|
||||||
bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, uint64_t When ) {
|
bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, [[maybe_unused]] uint64_t When ) {
|
||||||
Types::StringPairVec QueryData;
|
Types::StringPairVec QueryData;
|
||||||
Poco::JSON::Object Body;
|
Poco::JSON::Object Body;
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,9 @@
|
|||||||
// Created by stephane bourque on 2021-10-05.
|
// Created by stephane bourque on 2021-10-05.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef OWFMS_GW_SDK_H
|
#pragma once
|
||||||
#define OWFMS_GW_SDK_H
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include "framework/MicroService.h"
|
|
||||||
|
|
||||||
namespace OpenWifi::SDK::GW {
|
namespace OpenWifi::SDK::GW {
|
||||||
|
|
||||||
@@ -14,4 +12,3 @@ namespace OpenWifi::SDK::GW {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //OWFMS_GW_SDK_H
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
// Created by stephane bourque on 2021-10-04.
|
// Created by stephane bourque on 2021-10-04.
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include "framework/OpenAPIRequests.h"
|
||||||
|
#include "framework/MicroServiceNames.h"
|
||||||
|
|
||||||
namespace OpenWifi::SDK::Prov {
|
namespace OpenWifi::SDK::Prov {
|
||||||
bool GetFirmwareOptions( const std::string & serialNumber, std::string &firmwareUpgrade,
|
bool GetFirmwareOptions( const std::string & serialNumber, std::string &firmwareUpgrade,
|
||||||
|
|||||||
@@ -2,10 +2,9 @@
|
|||||||
// Created by stephane bourque on 2021-10-04.
|
// Created by stephane bourque on 2021-10-04.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef OWFMS_PROV_SDK_H
|
#pragma once
|
||||||
#define OWFMS_PROV_SDK_H
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
#include <string>
|
||||||
|
|
||||||
namespace OpenWifi::SDK::Prov {
|
namespace OpenWifi::SDK::Prov {
|
||||||
|
|
||||||
@@ -14,5 +13,3 @@ namespace OpenWifi::SDK::Prov {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif //OWFMS_PROV_SDK_H
|
|
||||||
|
|||||||
@@ -11,21 +11,27 @@
|
|||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
int Storage::Start() {
|
int Storage::Start() {
|
||||||
|
poco_information(Logger(),"Starting...");
|
||||||
std::lock_guard Guard(Mutex_);
|
std::lock_guard Guard(Mutex_);
|
||||||
|
|
||||||
Logger_.setLevel(Poco::Message::PRIO_NOTICE);
|
|
||||||
|
|
||||||
StorageClass::Start();
|
StorageClass::Start();
|
||||||
|
|
||||||
Create_Tables();
|
HistoryDB_ = std::make_unique<OpenWifi::HistoryDB>(dbType_,*Pool_, Logger());
|
||||||
|
FirmwaresDB_ = std::make_unique<OpenWifi::FirmwaresDB>(dbType_,*Pool_, Logger());
|
||||||
|
DevicesDB_ = std::make_unique<OpenWifi::DevicesDB>(dbType_,*Pool_, Logger());
|
||||||
|
|
||||||
|
HistoryDB_->Create();
|
||||||
|
FirmwaresDB_->Create();
|
||||||
|
DevicesDB_->Create();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Storage::Stop() {
|
void Storage::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
std::lock_guard Guard(Mutex_);
|
std::lock_guard Guard(Mutex_);
|
||||||
Logger_.notice("Stopping.");
|
|
||||||
StorageClass::Stop();
|
StorageClass::Stop();
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Storage::TrimRevision(const std::string &R) {
|
std::string Storage::TrimRevision(const std::string &R) {
|
||||||
|
|||||||
@@ -6,69 +6,48 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef UCENTRAL_USTORAGESERVICE_H
|
#pragma once
|
||||||
#define UCENTRAL_USTORAGESERVICE_H
|
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include "framework/StorageClass.h"
|
#include "framework/StorageClass.h"
|
||||||
|
|
||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
#include "RESTObjects/RESTAPI_FMSObjects.h"
|
||||||
#include "storage/storage_firmwares.h"
|
|
||||||
#include "storage/storage_history.h"
|
#include "storage/orm_history.h"
|
||||||
#include "storage/storage_deviceTypes.h"
|
#include "storage/orm_firmwares.h"
|
||||||
#include "storage/storage_deviceInfo.h"
|
#include "storage/orm_deviceInfo.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
class Storage : public StorageClass {
|
class Storage : public StorageClass {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
int Create_Tables();
|
|
||||||
int Create_Firmwares();
|
|
||||||
int Create_History();
|
|
||||||
int Create_DeviceTypes();
|
|
||||||
int Create_DeviceInfo();
|
|
||||||
|
|
||||||
bool AddFirmware(FMSObjects::Firmware & F);
|
|
||||||
bool UpdateFirmware(std::string & UUID, FMSObjects::Firmware & C);
|
|
||||||
bool DeleteFirmware(std::string & UUID);
|
|
||||||
bool GetFirmware(std::string & UUID, FMSObjects::Firmware & C);
|
|
||||||
bool GetFirmwares(uint64_t From, uint64_t HowMany, std::string & Compatible, FMSObjects::FirmwareVec & Firmwares);
|
|
||||||
bool BuildFirmwareManifest(Poco::JSON::Object & Manifest, uint64_t & Version);
|
|
||||||
bool GetFirmwareByName(std::string & Release, std::string &DeviceType,FMSObjects::Firmware & C );
|
|
||||||
bool GetFirmwareByRevision(std::string & Revision, std::string &DeviceType,FMSObjects::Firmware & C );
|
|
||||||
bool ComputeFirmwareAge(std::string & DeviceType, std::string & Revision, FMSObjects::FirmwareAgeDetails &AgeDetails);
|
|
||||||
|
|
||||||
bool GetHistory(std::string &SerialNumber,uint64_t From, uint64_t HowMany,FMSObjects::RevisionHistoryEntryVec &History);
|
|
||||||
bool AddHistory(FMSObjects::RevisionHistoryEntry &History);
|
|
||||||
|
|
||||||
void PopulateLatestFirmwareCache();
|
|
||||||
void RemoveOldFirmware();
|
|
||||||
|
|
||||||
int Start() override;
|
int Start() override;
|
||||||
void Stop() override;
|
void Stop() override;
|
||||||
|
|
||||||
bool SetDeviceRevision(std::string &SerialNumber, std::string & Revision, std::string & DeviceType, std::string &EndPoint);
|
int Create_Tables();
|
||||||
bool AddHistory( std::string & SerialNumber, std::string &DeviceType, std::string & PreviousRevision, std::string & NewVersion);
|
int Create_DeviceTypes();
|
||||||
bool DeleteHistory( std::string & SerialNumber, std::string &Id);
|
int Create_DeviceInfo();
|
||||||
|
|
||||||
bool GetDevices(uint64_t From, uint64_t HowMany, std::vector<FMSObjects::DeviceConnectionInformation> & Devices);
|
bool BuildFirmwareManifest(Poco::JSON::Object & Manifest, uint64_t & Version);
|
||||||
bool GetDevice(std::string &SerialNumber, FMSObjects::DeviceConnectionInformation & Device);
|
|
||||||
bool SetDeviceDisconnected(std::string &SerialNumber, std::string &EndPoint);
|
|
||||||
|
|
||||||
bool GenerateDeviceReport(FMSObjects::DeviceReport &Report);
|
|
||||||
static std::string TrimRevision(const std::string &R);
|
static std::string TrimRevision(const std::string &R);
|
||||||
static Storage *instance() {
|
static auto instance() {
|
||||||
static Storage *instance_ = new Storage;
|
static auto instance_ = new Storage;
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OpenWifi::HistoryDB & HistoryDB() { return * HistoryDB_; }
|
||||||
|
OpenWifi::FirmwaresDB & FirmwaresDB() { return * FirmwaresDB_; }
|
||||||
|
OpenWifi::DevicesDB & DevicesDB() { return * DevicesDB_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
std::unique_ptr<OpenWifi::HistoryDB> HistoryDB_;
|
||||||
|
std::unique_ptr<OpenWifi::FirmwaresDB> FirmwaresDB_;
|
||||||
|
std::unique_ptr<OpenWifi::DevicesDB> DevicesDB_;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline class Storage * StorageService() { return Storage::instance(); };
|
inline auto StorageService() { return Storage::instance(); };
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
#endif //UCENTRAL_USTORAGESERVICE_H
|
|
||||||
|
|||||||
77
src/framework/ALBserver.cpp
Normal file
77
src/framework/ALBserver.cpp
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "ALBserver.h"
|
||||||
|
|
||||||
|
#include "framework/utils.h"
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
void ALBRequestHandler::handleRequest([[maybe_unused]] Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) {
|
||||||
|
Utils::SetThreadName("alb-request");
|
||||||
|
try {
|
||||||
|
if((id_ % 100) == 0) {
|
||||||
|
Logger_.debug(fmt::format("ALB-REQUEST({}): ALB Request {}.", Request.clientAddress().toString(), id_));
|
||||||
|
}
|
||||||
|
Response.setChunkedTransferEncoding(true);
|
||||||
|
Response.setContentType("text/html");
|
||||||
|
Response.setDate(Poco::Timestamp());
|
||||||
|
Response.setStatus(Poco::Net::HTTPResponse::HTTP_OK);
|
||||||
|
Response.setKeepAlive(true);
|
||||||
|
Response.set("Connection", "keep-alive");
|
||||||
|
Response.setVersion(Poco::Net::HTTPMessage::HTTP_1_1);
|
||||||
|
std::ostream &Answer = Response.send();
|
||||||
|
Answer << "process Alive and kicking!";
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ALBRequestHandlerFactory::ALBRequestHandlerFactory(Poco::Logger & L):
|
||||||
|
Logger_(L) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ALBRequestHandler* ALBRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request) {
|
||||||
|
if (request.getURI() == "/")
|
||||||
|
return new ALBRequestHandler(Logger_, req_id_++);
|
||||||
|
else
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALBHealthCheckServer::ALBHealthCheckServer() :
|
||||||
|
SubSystemServer("ALBHealthCheckServer", "ALB-SVR", "alb")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int ALBHealthCheckServer::Start() {
|
||||||
|
if(MicroServiceConfigGetBool("alb.enable",false)) {
|
||||||
|
poco_information(Logger(),"Starting...");
|
||||||
|
Running_=true;
|
||||||
|
Port_ = (int)MicroServiceConfigGetInt("alb.port",15015);
|
||||||
|
Poco::Net::IPAddress Addr(Poco::Net::IPAddress::wildcard(
|
||||||
|
Poco::Net::Socket::supportsIPv6() ? Poco::Net::AddressFamily::IPv6
|
||||||
|
: Poco::Net::AddressFamily::IPv4));
|
||||||
|
Poco::Net::SocketAddress SockAddr(Addr, Port_);
|
||||||
|
Poco::Net::ServerSocket ClientSocket(SockAddr, 64);
|
||||||
|
|
||||||
|
Socket_ = std::make_unique<Poco::Net::ServerSocket>(SockAddr, Port_);
|
||||||
|
auto Params = new Poco::Net::HTTPServerParams;
|
||||||
|
Params->setName("ws:alb");
|
||||||
|
Server_ = std::make_unique<Poco::Net::HTTPServer>(new ALBRequestHandlerFactory(Logger()), *Socket_, Params);
|
||||||
|
Server_->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ALBHealthCheckServer::Stop() {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
if(Running_)
|
||||||
|
Server_->stopAll(true);
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
63
src/framework/ALBserver.h
Normal file
63
src/framework/ALBserver.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "framework/SubSystemServer.h"
|
||||||
|
|
||||||
|
#include "Poco/Net/HTTPRequestHandler.h"
|
||||||
|
#include "Poco/Net/HTTPServerRequest.h"
|
||||||
|
#include "Poco/Net/HTTPServerResponse.h"
|
||||||
|
#include "Poco/Net/HTTPRequestHandlerFactory.h"
|
||||||
|
#include "Poco/Net/HTTPServer.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
class ALBRequestHandler: public Poco::Net::HTTPRequestHandler {
|
||||||
|
public:
|
||||||
|
explicit ALBRequestHandler(Poco::Logger & L, uint64_t id)
|
||||||
|
: Logger_(L), id_(id) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleRequest([[maybe_unused]] Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Poco::Logger & Logger_;
|
||||||
|
uint64_t id_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ALBRequestHandlerFactory: public Poco::Net::HTTPRequestHandlerFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ALBRequestHandlerFactory(Poco::Logger & L);
|
||||||
|
ALBRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest& request) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Poco::Logger &Logger_;
|
||||||
|
inline static std::atomic_uint64_t req_id_=1;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ALBHealthCheckServer : public SubSystemServer {
|
||||||
|
public:
|
||||||
|
ALBHealthCheckServer();
|
||||||
|
|
||||||
|
static auto instance() {
|
||||||
|
static auto instance = new ALBHealthCheckServer;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Start() override;
|
||||||
|
void Stop() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<Poco::Net::HTTPServer> Server_;
|
||||||
|
std::unique_ptr<Poco::Net::ServerSocket> Socket_;
|
||||||
|
int Port_ = 0;
|
||||||
|
mutable std::atomic_bool Running_=false;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline auto ALBHealthCheckServer() { return ALBHealthCheckServer::instance(); }
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
|
|
||||||
99
src/framework/API_Proxy.h
Normal file
99
src/framework/API_Proxy.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2021-11-30.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Poco/Logger.h"
|
||||||
|
#include "Poco/JSON/Parser.h"
|
||||||
|
#include "Poco/Net/HTTPServerRequest.h"
|
||||||
|
#include "Poco/Net/HTTPServerResponse.h"
|
||||||
|
#include "Poco/Net/HTTPSClientSession.h"
|
||||||
|
#include "Poco/URI.h"
|
||||||
|
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
inline void API_Proxy( Poco::Logger &Logger,
|
||||||
|
Poco::Net::HTTPServerRequest *Request,
|
||||||
|
Poco::Net::HTTPServerResponse *Response,
|
||||||
|
const char * ServiceType,
|
||||||
|
const char * PathRewrite,
|
||||||
|
uint64_t msTimeout_ = 10000 ) {
|
||||||
|
try {
|
||||||
|
auto Services = MicroServiceGetServices(ServiceType);
|
||||||
|
for(auto const &Svc:Services) {
|
||||||
|
Poco::URI SourceURI(Request->getURI());
|
||||||
|
Poco::URI DestinationURI(Svc.PrivateEndPoint);
|
||||||
|
DestinationURI.setPath(PathRewrite);
|
||||||
|
DestinationURI.setQuery(SourceURI.getQuery());
|
||||||
|
|
||||||
|
// std::cout << " Source: " << SourceURI.toString() << std::endl;
|
||||||
|
// std::cout << "Destination: " << DestinationURI.toString() << std::endl;
|
||||||
|
|
||||||
|
Poco::Net::HTTPSClientSession Session(DestinationURI.getHost(), DestinationURI.getPort());
|
||||||
|
Session.setKeepAlive(true);
|
||||||
|
Session.setTimeout(Poco::Timespan(msTimeout_/1000, msTimeout_ % 1000));
|
||||||
|
Poco::Net::HTTPRequest ProxyRequest(Request->getMethod(),
|
||||||
|
DestinationURI.getPathAndQuery(),
|
||||||
|
Poco::Net::HTTPMessage::HTTP_1_1);
|
||||||
|
if(Request->has("Authorization")) {
|
||||||
|
ProxyRequest.add("Authorization", Request->get("Authorization"));
|
||||||
|
} else {
|
||||||
|
ProxyRequest.add("X-API-KEY", Svc.AccessKey);
|
||||||
|
ProxyRequest.add("X-INTERNAL-NAME", MicroServicePublicEndPoint());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Request->getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) {
|
||||||
|
Session.sendRequest(ProxyRequest);
|
||||||
|
Poco::Net::HTTPResponse ProxyResponse;
|
||||||
|
Session.receiveResponse(ProxyResponse);
|
||||||
|
Response->setStatus(ProxyResponse.getStatus());
|
||||||
|
Response->send();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Poco::JSON::Parser P;
|
||||||
|
std::stringstream SS;
|
||||||
|
try {
|
||||||
|
auto Body = P.parse(Request->stream()).extract<Poco::JSON::Object::Ptr>();
|
||||||
|
Poco::JSON::Stringifier::condense(Body,SS);
|
||||||
|
SS << "\r\n\r\n";
|
||||||
|
} catch(const Poco::Exception &E) {
|
||||||
|
Logger.log(E);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SS.str().empty()) {
|
||||||
|
Session.sendRequest(ProxyRequest);
|
||||||
|
} else {
|
||||||
|
ProxyRequest.setContentType("application/json");
|
||||||
|
ProxyRequest.setContentLength(SS.str().size());
|
||||||
|
std::ostream & os = Session.sendRequest(ProxyRequest);
|
||||||
|
os << SS.str() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::HTTPResponse ProxyResponse;
|
||||||
|
std::stringstream SSR;
|
||||||
|
try {
|
||||||
|
std::istream &ProxyResponseStream = Session.receiveResponse(ProxyResponse);
|
||||||
|
Poco::JSON::Parser P2;
|
||||||
|
auto ProxyResponseBody = P2.parse(ProxyResponseStream).extract<Poco::JSON::Object::Ptr>();
|
||||||
|
Poco::JSON::Stringifier::condense(ProxyResponseBody,SSR);
|
||||||
|
Response->setContentType("application/json");
|
||||||
|
Response->setContentLength(SSR.str().size());
|
||||||
|
Response->setStatus(ProxyResponse.getStatus());
|
||||||
|
Response->sendBuffer(SSR.str().c_str(),SSR.str().size());
|
||||||
|
return;
|
||||||
|
} catch( const Poco::Exception & E) {
|
||||||
|
|
||||||
|
}
|
||||||
|
Response->setStatus(ProxyResponse.getStatus());
|
||||||
|
Response->send();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger.log(E);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
102
src/framework/AppServiceRegistry.h
Normal file
102
src/framework/AppServiceRegistry.h
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Poco/StreamCopier.h"
|
||||||
|
#include "Poco/File.h"
|
||||||
|
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
|
||||||
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
|
||||||
|
class AppServiceRegistry {
|
||||||
|
public:
|
||||||
|
AppServiceRegistry() {
|
||||||
|
FileName = MicroServiceDataDirectory() + "/registry.json";
|
||||||
|
Poco::File F(FileName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(F.exists()) {
|
||||||
|
std::ostringstream OS;
|
||||||
|
std::ifstream IF(FileName);
|
||||||
|
Poco::StreamCopier::copyStream(IF, OS);
|
||||||
|
Registry_ = nlohmann::json::parse(OS.str());
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
Registry_ = nlohmann::json::parse("{}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static AppServiceRegistry & instance() {
|
||||||
|
static auto instance_= new AppServiceRegistry;
|
||||||
|
return *instance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ~AppServiceRegistry() {
|
||||||
|
Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Save() {
|
||||||
|
std::istringstream IS( to_string(Registry_));
|
||||||
|
std::ofstream OF;
|
||||||
|
OF.open(FileName,std::ios::binary | std::ios::trunc);
|
||||||
|
Poco::StreamCopier::copyStream(IS, OF);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Set(const char *Key, uint64_t Value ) {
|
||||||
|
Registry_[Key] = Value;
|
||||||
|
Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Set(const char *Key, const std::string &Value ) {
|
||||||
|
Registry_[Key] = Value;
|
||||||
|
Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Set(const char *Key, bool Value ) {
|
||||||
|
Registry_[Key] = Value;
|
||||||
|
Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Get(const char *Key, bool & Value ) {
|
||||||
|
if(Registry_[Key].is_boolean()) {
|
||||||
|
Value = Registry_[Key].get<bool>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Get(const char *Key, uint64_t & Value ) {
|
||||||
|
if(Registry_[Key].is_number_unsigned()) {
|
||||||
|
Value = Registry_[Key].get<uint64_t>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Get(const char *Key, std::string & Value ) {
|
||||||
|
if(Registry_[Key].is_string()) {
|
||||||
|
Value = Registry_[Key].get<std::string>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string FileName;
|
||||||
|
nlohmann::json Registry_;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline auto AppServiceRegistry() { return AppServiceRegistry::instance(); }
|
||||||
|
|
||||||
|
}
|
||||||
129
src/framework/AuthClient.cpp
Normal file
129
src/framework/AuthClient.cpp
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Poco/Net/HTTPServerResponse.h"
|
||||||
|
|
||||||
|
#include "framework/AuthClient.h"
|
||||||
|
#include "framework/MicroServiceNames.h"
|
||||||
|
#include "framework/OpenAPIRequests.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
bool AuthClient::RetrieveTokenInformation(const std::string & SessionToken,
|
||||||
|
SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted, bool Sub) {
|
||||||
|
try {
|
||||||
|
Types::StringPairVec QueryData;
|
||||||
|
QueryData.push_back(std::make_pair("token",SessionToken));
|
||||||
|
std::string AlternateURIForLogging = fmt::format("{}?token={}", Sub ? "/api/v1/validateSubToken" : "/api/v1/validateToken", Utils::SanitizeToken(SessionToken));
|
||||||
|
OpenAPIRequestGet Req( uSERVICE_SECURITY,
|
||||||
|
Sub ? "/api/v1/validateSubToken" : "/api/v1/validateToken",
|
||||||
|
QueryData,
|
||||||
|
10000,
|
||||||
|
AlternateURIForLogging
|
||||||
|
);
|
||||||
|
Poco::JSON::Object::Ptr Response;
|
||||||
|
|
||||||
|
auto StatusCode = Req.Do(Response);
|
||||||
|
if(StatusCode==Poco::Net::HTTPServerResponse::HTTP_GATEWAY_TIMEOUT) {
|
||||||
|
Contacted = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Contacted = true;
|
||||||
|
if(StatusCode==Poco::Net::HTTPServerResponse::HTTP_OK) {
|
||||||
|
if(Response->has("tokenInfo") && Response->has("userInfo")) {
|
||||||
|
UInfo.from_json(Response);
|
||||||
|
if(IsTokenExpired(UInfo.webtoken)) {
|
||||||
|
Expired = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Expired = false;
|
||||||
|
Cache_.update(SessionToken, UInfo);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
poco_error(Logger(),fmt::format("Failed to retrieve token={} for TID={}", Utils::SanitizeToken(SessionToken), TID));
|
||||||
|
}
|
||||||
|
Expired = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AuthClient::IsAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted, bool Sub) {
|
||||||
|
auto User = Cache_.get(SessionToken);
|
||||||
|
if(!User.isNull()) {
|
||||||
|
if(IsTokenExpired(User->webtoken)) {
|
||||||
|
Expired = true;
|
||||||
|
Cache_.remove(SessionToken);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Expired = false;
|
||||||
|
UInfo = *User;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return RetrieveTokenInformation(SessionToken, UInfo, TID, Expired, Contacted, Sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AuthClient::RetrieveApiKeyInformation(const std::string & SessionToken,
|
||||||
|
SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted) {
|
||||||
|
try {
|
||||||
|
Types::StringPairVec QueryData;
|
||||||
|
QueryData.push_back(std::make_pair("apikey",SessionToken));
|
||||||
|
std::string AlternateURIForLogging = fmt::format("/api/v1/validateApiKey?apiKey={}", Utils::SanitizeToken(SessionToken));
|
||||||
|
OpenAPIRequestGet Req( uSERVICE_SECURITY,
|
||||||
|
"/api/v1/validateApiKey" ,
|
||||||
|
QueryData,
|
||||||
|
10000,
|
||||||
|
AlternateURIForLogging);
|
||||||
|
Poco::JSON::Object::Ptr Response;
|
||||||
|
|
||||||
|
auto StatusCode = Req.Do(Response);
|
||||||
|
if(StatusCode==Poco::Net::HTTPServerResponse::HTTP_GATEWAY_TIMEOUT) {
|
||||||
|
Contacted = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Contacted = true;
|
||||||
|
if(StatusCode==Poco::Net::HTTPServerResponse::HTTP_OK) {
|
||||||
|
if(Response->has("tokenInfo") && Response->has("userInfo") && Response->has("expiresOn")) {
|
||||||
|
UInfo.from_json(Response);
|
||||||
|
Expired = false;
|
||||||
|
ApiKeyCache_.update(SessionToken, ApiKeyCacheEntry{ .UserInfo = UInfo, .ExpiresOn = Response->get("expiresOn")});
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
poco_error(Logger(),fmt::format("Failed to retrieve api key={} for TID={}", Utils::SanitizeToken(SessionToken), TID));
|
||||||
|
}
|
||||||
|
Expired = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AuthClient::IsValidApiKey(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy &UInfo,
|
||||||
|
std::uint64_t TID, bool &Expired, bool &Contacted) {
|
||||||
|
auto User = ApiKeyCache_.get(SessionToken);
|
||||||
|
if (!User.isNull()) {
|
||||||
|
if(User->ExpiresOn < Utils::Now()) {
|
||||||
|
Expired = false;
|
||||||
|
UInfo = User->UserInfo;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
ApiKeyCache_.remove(SessionToken);
|
||||||
|
}
|
||||||
|
return RetrieveApiKeyInformation(SessionToken, UInfo, TID, Expired, Contacted);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
79
src/framework/AuthClient.h
Normal file
79
src/framework/AuthClient.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "framework/SubSystemServer.h"
|
||||||
|
#include "RESTObjects/RESTAPI_SecurityObjects.h"
|
||||||
|
#include "Poco/ExpireLRUCache.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
class AuthClient : public SubSystemServer {
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AuthClient() noexcept:
|
||||||
|
SubSystemServer("Authentication", "AUTH-CLNT", "authentication")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto instance() {
|
||||||
|
static auto instance_ = new AuthClient;
|
||||||
|
return instance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ApiKeyCacheEntry {
|
||||||
|
OpenWifi::SecurityObjects::UserInfoAndPolicy UserInfo;
|
||||||
|
std::uint64_t ExpiresOn;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline int Start() override {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Stop() override {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
Cache_.clear();
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void RemovedCachedToken(const std::string &Token) {
|
||||||
|
Cache_.remove(Token);
|
||||||
|
ApiKeyCache_.remove(Token);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool IsTokenExpired(const SecurityObjects::WebToken &T) {
|
||||||
|
return ((T.expires_in_+T.created_) < Utils::Now());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RetrieveTokenInformation(const std::string & SessionToken,
|
||||||
|
SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted, bool Sub=false);
|
||||||
|
|
||||||
|
bool RetrieveApiKeyInformation(const std::string & SessionToken,
|
||||||
|
SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted);
|
||||||
|
|
||||||
|
bool IsAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted, bool Sub = false);
|
||||||
|
|
||||||
|
bool IsValidApiKey(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo,
|
||||||
|
std::uint64_t TID,
|
||||||
|
bool & Expired, bool & Contacted);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Poco::ExpireLRUCache<std::string,OpenWifi::SecurityObjects::UserInfoAndPolicy> Cache_{512,1200000 };
|
||||||
|
Poco::ExpireLRUCache<std::string,ApiKeyCacheEntry> ApiKeyCache_{512,1200000 };
|
||||||
|
};
|
||||||
|
|
||||||
|
inline auto AuthClient() { return AuthClient::instance(); }
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
|
|
||||||
155
src/framework/CIDR.h
Normal file
155
src/framework/CIDR.h
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "Poco/Net/IPAddress.h"
|
||||||
|
#include "Poco/StringTokenizer.h"
|
||||||
|
|
||||||
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
|
||||||
|
namespace OpenWifi::CIDR {
|
||||||
|
|
||||||
|
static bool cidr_match(const in_addr &addr, const in_addr &net, uint8_t bits) {
|
||||||
|
if (bits == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !((addr.s_addr ^ net.s_addr) & htonl(0xFFFFFFFFu << (32 - bits)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool cidr6_match(const in6_addr &address, const in6_addr &network, uint8_t bits) {
|
||||||
|
#ifdef __linux__
|
||||||
|
const uint32_t *a = address.s6_addr32;
|
||||||
|
const uint32_t *n = network.s6_addr32;
|
||||||
|
#else
|
||||||
|
const uint32_t *a = address.__u6_addr.__u6_addr32;
|
||||||
|
const uint32_t *n = network.__u6_addr.__u6_addr32;
|
||||||
|
#endif
|
||||||
|
int bits_whole, bits_incomplete;
|
||||||
|
bits_whole = bits >> 5; // number of whole u32
|
||||||
|
bits_incomplete = bits & 0x1F; // number of bits in incomplete u32
|
||||||
|
if (bits_whole) {
|
||||||
|
if (memcmp(a, n, bits_whole << 2) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bits_incomplete) {
|
||||||
|
uint32_t mask = htonl((0xFFFFFFFFu) << (32 - bits_incomplete));
|
||||||
|
if ((a[bits_whole] ^ n[bits_whole]) & mask) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ConvertStringToLong(const char *S, unsigned long &L) {
|
||||||
|
char *end;
|
||||||
|
L = std::strtol(S, &end, 10);
|
||||||
|
return end != S;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool CidrIPinRange(const Poco::Net::IPAddress &IP, const std::string &Range) {
|
||||||
|
Poco::StringTokenizer TimeTokens(Range, "/", Poco::StringTokenizer::TOK_TRIM);
|
||||||
|
|
||||||
|
Poco::Net::IPAddress RangeIP;
|
||||||
|
if (Poco::Net::IPAddress::tryParse(TimeTokens[0], RangeIP)) {
|
||||||
|
if (TimeTokens.count() == 2) {
|
||||||
|
if (RangeIP.family() == Poco::Net::IPAddress::IPv4) {
|
||||||
|
unsigned long MaskLength;
|
||||||
|
if (ConvertStringToLong(TimeTokens[1].c_str(), MaskLength)) {
|
||||||
|
return cidr_match(*static_cast<const in_addr *>(RangeIP.addr()),
|
||||||
|
*static_cast<const in_addr *>(IP.addr()), MaskLength);
|
||||||
|
}
|
||||||
|
} else if (RangeIP.family() == Poco::Net::IPAddress::IPv6) {
|
||||||
|
unsigned long MaskLength;
|
||||||
|
if (ConvertStringToLong(TimeTokens[1].c_str(), MaskLength)) {
|
||||||
|
return cidr6_match(*static_cast<const in6_addr *>(RangeIP.addr()),
|
||||||
|
*static_cast<const in6_addr *>(IP.addr()), MaskLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Ranges can be a single IP, of IP1-IP2, of A set of IPs: IP1,IP2,IP3, or a cidr IP/24
|
||||||
|
// These can work for IPv6 too...
|
||||||
|
//
|
||||||
|
static bool ValidateRange(const std::string &R) {
|
||||||
|
|
||||||
|
auto Tokens = Poco::StringTokenizer(R, "-");
|
||||||
|
if (Tokens.count() == 2) {
|
||||||
|
Poco::Net::IPAddress a, b;
|
||||||
|
if (!Poco::Net::IPAddress::tryParse(Tokens[0], a) &&
|
||||||
|
Poco::Net::IPAddress::tryParse(Tokens[1], b))
|
||||||
|
return false;
|
||||||
|
return a.family() == b.family();
|
||||||
|
}
|
||||||
|
|
||||||
|
Tokens = Poco::StringTokenizer(R, ",");
|
||||||
|
if (Tokens.count() > 1) {
|
||||||
|
return std::all_of(Tokens.begin(), Tokens.end(), [](const std::string &A) {
|
||||||
|
Poco::Net::IPAddress a;
|
||||||
|
return Poco::Net::IPAddress::tryParse(A, a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Tokens = Poco::StringTokenizer(R, "/");
|
||||||
|
if (Tokens.count() == 2) {
|
||||||
|
Poco::Net::IPAddress a;
|
||||||
|
if (!Poco::Net::IPAddress::tryParse(Tokens[0], a))
|
||||||
|
return false;
|
||||||
|
if (std::atoi(Tokens[1].c_str()) == 0)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::IPAddress a;
|
||||||
|
return Poco::Net::IPAddress::tryParse(R, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool IpInRange(const Poco::Net::IPAddress &target, const std::string &R) {
|
||||||
|
|
||||||
|
auto Tokens = Poco::StringTokenizer(R, "-");
|
||||||
|
if (Tokens.count() == 2) {
|
||||||
|
auto a = Poco::Net::IPAddress::parse(Tokens[0]);
|
||||||
|
auto b = Poco::Net::IPAddress::parse(Tokens[1]);
|
||||||
|
if (target.family() != a.family())
|
||||||
|
return false;
|
||||||
|
return (a <= target && b >= target);
|
||||||
|
}
|
||||||
|
|
||||||
|
Tokens = Poco::StringTokenizer(R, ",");
|
||||||
|
if (Tokens.count() > 1) {
|
||||||
|
return std::any_of(Tokens.begin(), Tokens.end(), [target](const std::string &Element) {
|
||||||
|
return Poco::Net::IPAddress::parse(Element) == target;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Tokens = Poco::StringTokenizer(R, "/");
|
||||||
|
if (Tokens.count() == 2) {
|
||||||
|
return CidrIPinRange(target, R);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Poco::Net::IPAddress::parse(R) == target;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] inline bool IpInRanges(const std::string &IP, const Types::StringVec &R) {
|
||||||
|
Poco::Net::IPAddress Target;
|
||||||
|
|
||||||
|
if (!Poco::Net::IPAddress::tryParse(IP, Target))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return std::any_of(cbegin(R), cend(R),
|
||||||
|
[Target](const std::string &i) { return IpInRange(Target, i); });
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] inline bool ValidateIpRanges(const Types::StringVec &Ranges) {
|
||||||
|
return std::all_of(cbegin(Ranges), cend(Ranges), ValidateRange);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,16 +6,22 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include "ConfigurationValidator.h"
|
#include "ConfigurationValidator.h"
|
||||||
#include "framework/CountryCodes.h"
|
#include "framework/CountryCodes.h"
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
|
||||||
#include "Poco/StringTokenizer.h"
|
#include "Poco/StringTokenizer.h"
|
||||||
|
#include "Poco/URI.h"
|
||||||
|
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi {
|
||||||
|
|
||||||
static const std::string GitUCentralJSONSchemaFile{"https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"};
|
static const std::string GitUCentralJSONSchemaFile{
|
||||||
|
"https://raw.githubusercontent.com/Telecominfraproject/wlan-ucentral-schema/main/ucentral.schema.json"};
|
||||||
|
|
||||||
static json DefaultUCentralSchema = R"(
|
static json DefaultUCentralSchema = R"(
|
||||||
{
|
{
|
||||||
"$id": "https://openwrt.org/ucentral.schema.json",
|
"$id": "https://openwrt.org/ucentral.schema.json",
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
@@ -75,6 +81,10 @@ namespace OpenWifi {
|
|||||||
"name": {
|
"name": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"hostname": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "hostname"
|
||||||
|
},
|
||||||
"location": {
|
"location": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
@@ -101,12 +111,14 @@ namespace OpenWifi {
|
|||||||
"items": {
|
"items": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
|
"CS0",
|
||||||
"CS1",
|
"CS1",
|
||||||
"CS2",
|
"CS2",
|
||||||
"CS3",
|
"CS3",
|
||||||
"CS4",
|
"CS4",
|
||||||
"CS5",
|
"CS5",
|
||||||
"CS6",
|
"CS6",
|
||||||
|
"CS7",
|
||||||
"AF11",
|
"AF11",
|
||||||
"AF12",
|
"AF12",
|
||||||
"AF13",
|
"AF13",
|
||||||
@@ -120,12 +132,15 @@ namespace OpenWifi {
|
|||||||
"AF42",
|
"AF42",
|
||||||
"AF43",
|
"AF43",
|
||||||
"DF",
|
"DF",
|
||||||
"EF"
|
"EF",
|
||||||
|
"VA",
|
||||||
|
"LE"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"globals.wireless-multimedia": {
|
"globals.wireless-multimedia.table": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"UP0": {
|
"UP0": {
|
||||||
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
|
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
|
||||||
@@ -153,11 +168,19 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"globals.wireless-multimedia-profile": {
|
"globals.wireless-multimedia.profile": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"profile": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"enterprise"
|
"enterprise",
|
||||||
|
"rfc8325",
|
||||||
|
"3gpp"
|
||||||
]
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"globals": {
|
"globals": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -177,12 +200,12 @@ namespace OpenWifi {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"wireless-multimedia": {
|
"wireless-multimedia": {
|
||||||
"oneOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/$defs/globals.wireless-multimedia"
|
"$ref": "#/$defs/globals.wireless-multimedia.table"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$ref": "#/$defs/globals.wireless-multimedia-profile"
|
"$ref": "#/$defs/globals.wireless-multimedia.profile"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -375,7 +398,7 @@ namespace OpenWifi {
|
|||||||
"oneOf": [
|
"oneOf": [
|
||||||
{
|
{
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"maximum": 171,
|
"maximum": 196,
|
||||||
"minimum": 1
|
"minimum": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -384,6 +407,14 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"valid-channels": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 196,
|
||||||
|
"minimum": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
"country": {
|
"country": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"maxLength": 2,
|
"maxLength": 2,
|
||||||
@@ -392,6 +423,10 @@ namespace OpenWifi {
|
|||||||
"US"
|
"US"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"allow-dfs": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
"channel-mode": {
|
"channel-mode": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
@@ -490,17 +525,17 @@ namespace OpenWifi {
|
|||||||
"maximum": 4050
|
"maximum": 4050
|
||||||
},
|
},
|
||||||
"proto": {
|
"proto": {
|
||||||
"decription": "The L2 vlan tag that shall be added (1q,1ad) ",
|
"decription": "The L2 vlan tag that shall be added (1q,1ad ) ",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"802.1ad",
|
"802.1ad",
|
||||||
"802.1q"
|
"802.1q"
|
||||||
],
|
],
|
||||||
"default": "802.1q"
|
"default": "802.1q"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"interface.bridge": {
|
"interface.bridge": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mtu": {
|
"mtu": {
|
||||||
@@ -641,6 +676,47 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"interface.ipv4.port-forward": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"protocol": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"tcp",
|
||||||
|
"udp",
|
||||||
|
"any"
|
||||||
|
],
|
||||||
|
"default": "any"
|
||||||
|
},
|
||||||
|
"external-port": {
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 65535,
|
||||||
|
"format": "uc-portrange"
|
||||||
|
},
|
||||||
|
"internal-address": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "ipv4",
|
||||||
|
"example": "0.0.0.120"
|
||||||
|
},
|
||||||
|
"internal-port": {
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 65535,
|
||||||
|
"format": "uc-portrange"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"external-port",
|
||||||
|
"internal-address"
|
||||||
|
]
|
||||||
|
},
|
||||||
"interface.ipv4": {
|
"interface.ipv4": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -694,6 +770,12 @@ namespace OpenWifi {
|
|||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/$defs/interface.ipv4.dhcp-lease"
|
"$ref": "#/$defs/interface.ipv4.dhcp-lease"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"port-forward": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/interface.ipv4.port-forward"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -723,6 +805,96 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"interface.ipv6.port-forward": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"protocol": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"tcp",
|
||||||
|
"udp",
|
||||||
|
"any"
|
||||||
|
],
|
||||||
|
"default": "any"
|
||||||
|
},
|
||||||
|
"external-port": {
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 65535,
|
||||||
|
"format": "uc-portrange"
|
||||||
|
},
|
||||||
|
"internal-address": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "ipv6",
|
||||||
|
"example": "::1234:abcd"
|
||||||
|
},
|
||||||
|
"internal-port": {
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 65535,
|
||||||
|
"format": "uc-portrange"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"external-port",
|
||||||
|
"internal-address"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"interface.ipv6.traffic-allow": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"protocol": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "any"
|
||||||
|
},
|
||||||
|
"source-address": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-cidr6",
|
||||||
|
"example": "2001:db8:1234:abcd::/64",
|
||||||
|
"default": "::/0"
|
||||||
|
},
|
||||||
|
"source-ports": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 1,
|
||||||
|
"items": {
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 65535,
|
||||||
|
"format": "uc-portrange"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"destination-address": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "ipv6",
|
||||||
|
"example": "::1000"
|
||||||
|
},
|
||||||
|
"destination-ports": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 1,
|
||||||
|
"items": {
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 65535,
|
||||||
|
"format": "uc-portrange"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"destination-address"
|
||||||
|
]
|
||||||
|
},
|
||||||
"interface.ipv6": {
|
"interface.ipv6": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -754,6 +926,18 @@ namespace OpenWifi {
|
|||||||
},
|
},
|
||||||
"dhcpv6": {
|
"dhcpv6": {
|
||||||
"$ref": "#/$defs/interface.ipv6.dhcpv6"
|
"$ref": "#/$defs/interface.ipv6.dhcpv6"
|
||||||
|
},
|
||||||
|
"port-forward": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/interface.ipv6.port-forward"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"traffic-allow": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/interface.ipv6.traffic-allow"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -839,7 +1023,7 @@ namespace OpenWifi {
|
|||||||
},
|
},
|
||||||
"gateway-fqdn": {
|
"gateway-fqdn": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "fqdn",
|
"format": "uc-fqdn",
|
||||||
"default": "ucentral.splash"
|
"default": "ucentral.splash"
|
||||||
},
|
},
|
||||||
"max-clients": {
|
"max-clients": {
|
||||||
@@ -874,6 +1058,7 @@ namespace OpenWifi {
|
|||||||
"psk",
|
"psk",
|
||||||
"psk2",
|
"psk2",
|
||||||
"psk-mixed",
|
"psk-mixed",
|
||||||
|
"psk2-radius",
|
||||||
"wpa",
|
"wpa",
|
||||||
"wpa2",
|
"wpa2",
|
||||||
"wpa-mixed",
|
"wpa-mixed",
|
||||||
@@ -934,6 +1119,10 @@ namespace OpenWifi {
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
|
"reduced-neighbor-reporting": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"lci": {
|
"lci": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
@@ -1124,9 +1313,48 @@ namespace OpenWifi {
|
|||||||
"local": {
|
"local": {
|
||||||
"$ref": "#/$defs/interface.ssid.radius.local"
|
"$ref": "#/$defs/interface.ssid.radius.local"
|
||||||
},
|
},
|
||||||
|
"dynamic-authorization": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"host": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uc-ip",
|
||||||
|
"examples": [
|
||||||
|
"192.168.1.10"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"minimum": 1024,
|
||||||
|
"examples": [
|
||||||
|
1812
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"secret": {
|
||||||
|
"type": "string",
|
||||||
|
"examples": [
|
||||||
|
"secret"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"authentication": {
|
"authentication": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
"$ref": "#/$defs/interface.ssid.radius.server"
|
"$ref": "#/$defs/interface.ssid.radius.server"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"mac-filter": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"accounting": {
|
"accounting": {
|
||||||
"allOf": [
|
"allOf": [
|
||||||
{
|
{
|
||||||
@@ -1467,6 +1695,11 @@ namespace OpenWifi {
|
|||||||
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
|
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"fils-discovery-interval": {
|
||||||
|
"type": "integer",
|
||||||
|
"default": 20,
|
||||||
|
"maximum": 10000
|
||||||
|
},
|
||||||
"encryption": {
|
"encryption": {
|
||||||
"$ref": "#/$defs/interface.ssid.encryption"
|
"$ref": "#/$defs/interface.ssid.encryption"
|
||||||
},
|
},
|
||||||
@@ -1788,6 +2021,11 @@ namespace OpenWifi {
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": 32,
|
"minimum": 32,
|
||||||
"default": 1000
|
"default": 1000
|
||||||
|
},
|
||||||
|
"priority": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0,
|
||||||
|
"default": 7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1934,7 +2172,7 @@ namespace OpenWifi {
|
|||||||
"properties": {
|
"properties": {
|
||||||
"controller": {
|
"controller": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "ip",
|
"format": "uc-ip",
|
||||||
"example": "192.168.10.1"
|
"example": "192.168.10.1"
|
||||||
},
|
},
|
||||||
"datapath-description": {
|
"datapath-description": {
|
||||||
@@ -1951,6 +2189,11 @@ namespace OpenWifi {
|
|||||||
],
|
],
|
||||||
"default": "ssl"
|
"default": "ssl"
|
||||||
},
|
},
|
||||||
|
"port": {
|
||||||
|
"type": "integer",
|
||||||
|
"maximum": 65535,
|
||||||
|
"default": 6653
|
||||||
|
},
|
||||||
"ca-certificate": {
|
"ca-certificate": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
@@ -2018,9 +2261,42 @@ namespace OpenWifi {
|
|||||||
"auto-channel": {
|
"auto-channel": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"service.quality-of-service.class-selector": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"CS0",
|
||||||
|
"CS1",
|
||||||
|
"CS2",
|
||||||
|
"CS3",
|
||||||
|
"CS4",
|
||||||
|
"CS5",
|
||||||
|
"CS6",
|
||||||
|
"CS7",
|
||||||
|
"AF11",
|
||||||
|
"AF12",
|
||||||
|
"AF13",
|
||||||
|
"AF21",
|
||||||
|
"AF22",
|
||||||
|
"AF23",
|
||||||
|
"AF31",
|
||||||
|
"AF32",
|
||||||
|
"AF33",
|
||||||
|
"AF41",
|
||||||
|
"AF42",
|
||||||
|
"AF43",
|
||||||
|
"DF",
|
||||||
|
"EF",
|
||||||
|
"VA",
|
||||||
|
"LE"
|
||||||
|
]
|
||||||
|
},
|
||||||
"service.quality-of-service": {
|
"service.quality-of-service": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -2039,23 +2315,26 @@ namespace OpenWifi {
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"default": 0
|
"default": 0
|
||||||
},
|
},
|
||||||
|
"bulk-detection": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"dscp": {
|
||||||
|
"$ref": "#/$defs/service.quality-of-service.class-selector",
|
||||||
|
"default": "CS0"
|
||||||
|
},
|
||||||
|
"packets-per-second": {
|
||||||
|
"type": "number",
|
||||||
|
"default": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"classifier": {
|
"classifier": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"dscp": {
|
"dscp": {
|
||||||
"type": "string",
|
"$ref": "#/$defs/service.quality-of-service.class-selector",
|
||||||
"enum": [
|
|
||||||
"CS0",
|
|
||||||
"CS1",
|
|
||||||
"CS2",
|
|
||||||
"CS3",
|
|
||||||
"CS4",
|
|
||||||
"CS5",
|
|
||||||
"CS6",
|
|
||||||
"CS7"
|
|
||||||
],
|
|
||||||
"default": "CS1"
|
"default": "CS1"
|
||||||
},
|
},
|
||||||
"ports": {
|
"ports": {
|
||||||
@@ -2083,12 +2362,25 @@ namespace OpenWifi {
|
|||||||
"default": true
|
"default": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"dns": {
|
"dns": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"fqdn": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "fqdn"
|
"format": "uc-fqdn"
|
||||||
|
},
|
||||||
|
"suffix-matching": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"reclassify": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2111,21 +2403,36 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"service.airtime-policies": {
|
"service.airtime-fairness": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"dns-match": {
|
"voice-weight": {
|
||||||
"type": "array",
|
"type": "number",
|
||||||
"items": {
|
"default": 4
|
||||||
"type": "string",
|
|
||||||
"examples": [
|
|
||||||
"*.voice.example.com"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"dns-weight": {
|
"packet-threshold": {
|
||||||
"type": "integer",
|
"type": "number",
|
||||||
|
"default": 100
|
||||||
|
},
|
||||||
|
"bulk-threshold": {
|
||||||
|
"type": "number",
|
||||||
|
"default": 50
|
||||||
|
},
|
||||||
|
"priority-threshold": {
|
||||||
|
"type": "number",
|
||||||
|
"default": 30
|
||||||
|
},
|
||||||
|
"weight-normal": {
|
||||||
|
"type": "number",
|
||||||
"default": 256
|
"default": 256
|
||||||
|
},
|
||||||
|
"weight-priority": {
|
||||||
|
"type": "number",
|
||||||
|
"default": 394
|
||||||
|
},
|
||||||
|
"weight-bulk": {
|
||||||
|
"type": "number",
|
||||||
|
"default": 128
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2180,8 +2487,8 @@ namespace OpenWifi {
|
|||||||
"facebook-wifi": {
|
"facebook-wifi": {
|
||||||
"$ref": "#/$defs/service.facebook-wifi"
|
"$ref": "#/$defs/service.facebook-wifi"
|
||||||
},
|
},
|
||||||
"airtime-policies": {
|
"airtime-fairness": {
|
||||||
"$ref": "#/$defs/service.airtime-policies"
|
"$ref": "#/$defs/service.airtime-fairness"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2312,35 +2619,50 @@ namespace OpenWifi {
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
)"_json;
|
||||||
}
|
|
||||||
)"_json;
|
|
||||||
|
|
||||||
class ConfigurationValidator *ConfigurationValidator::instance_ = nullptr;
|
class custom_error_handler : public nlohmann::json_schema::basic_error_handler
|
||||||
|
{
|
||||||
|
void error(const nlohmann::json_pointer<nlohmann::basic_json<>> &pointer, const json &instance,
|
||||||
|
const std::string &message) override
|
||||||
|
{
|
||||||
|
nlohmann::json_schema::basic_error_handler::error(pointer, instance, message);
|
||||||
|
std::cout << "ERROR: '" << pointer << "' - '" << instance << "': " << message << "\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void ConfigurationValidator::Init() {
|
void ConfigurationValidator::Init() {
|
||||||
if(Initialized_)
|
if(Initialized_)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string GitSchema;
|
std::string GitSchema;
|
||||||
|
// if(MicroServiceConfigGetBool("ucentral.datamodel.internal",true)) {
|
||||||
|
RootSchema_ = DefaultUCentralSchema;
|
||||||
|
poco_information(Logger(),"Using uCentral validation from built-in default.");
|
||||||
|
Initialized_ = Working_ = true;
|
||||||
|
return;
|
||||||
|
// }
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) {
|
auto GitURI = MicroServiceConfigGetString("ucentral.datamodel.uri",GitUCentralJSONSchemaFile);
|
||||||
auto schema = json::parse(GitSchema);
|
if(Utils::wgets(GitURI, GitSchema)) {
|
||||||
Validator_->set_root_schema(schema);
|
RootSchema_ = json::parse(GitSchema);
|
||||||
Logger_.information("Using uCentral validation schema from GIT.");
|
poco_information(Logger(),"Using uCentral validation schema from GIT.");
|
||||||
} else {
|
} else {
|
||||||
std::string FileName{ MicroService::instance().DataDir() + "/ucentral.schema.json" };
|
std::string FileName{ MicroServiceDataDirectory() + "/ucentral.schema.json" };
|
||||||
std::ifstream input(FileName);
|
std::ifstream input(FileName);
|
||||||
std::stringstream schema_file;
|
std::stringstream schema_file;
|
||||||
schema_file << input.rdbuf();
|
schema_file << input.rdbuf();
|
||||||
input.close();
|
input.close();
|
||||||
auto schema = json::parse(schema_file.str());
|
RootSchema_ = json::parse(schema_file.str());
|
||||||
Validator_->set_root_schema(schema);
|
poco_information(Logger(),"Using uCentral validation schema from local file.");
|
||||||
Logger_.information("Using uCentral validation schema from local file.");
|
|
||||||
}
|
}
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Validator_->set_root_schema(DefaultUCentralSchema);
|
RootSchema_ = DefaultUCentralSchema;
|
||||||
Logger_.information("Using uCentral validation from built-in default.");
|
poco_information(Logger(),"Using uCentral validation from built-in default.");
|
||||||
}
|
}
|
||||||
Initialized_ = Working_ = true;
|
Initialized_ = Working_ = true;
|
||||||
}
|
}
|
||||||
@@ -2392,6 +2714,17 @@ namespace OpenWifi {
|
|||||||
return IsCIDRv4(value) || IsCIDRv6(value);
|
return IsCIDRv4(value) || IsCIDRv6(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool IsPortRangeIsValid(const std::string &r) {
|
||||||
|
const auto ports = Poco::StringTokenizer("-",r,Poco::StringTokenizer::TOK_TRIM);
|
||||||
|
|
||||||
|
for(const auto &port:ports) {
|
||||||
|
uint32_t port_num = std::stoul(port);
|
||||||
|
if(port_num==0 || port_num>65535)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value)
|
void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value)
|
||||||
{
|
{
|
||||||
static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"};
|
static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"};
|
||||||
@@ -2414,7 +2747,7 @@ namespace OpenWifi {
|
|||||||
} else if(format == "uc-mac") {
|
} else if(format == "uc-mac") {
|
||||||
if(std::regex_match(value,mac_regex))
|
if(std::regex_match(value,mac_regex))
|
||||||
return;
|
return;
|
||||||
throw std::invalid_argument(value + " is not a valid MAC: should be something like 2e60:3500::/64.");
|
throw std::invalid_argument(value + " is not a valid MAC: should be something like 11:22:33:44:55:66");
|
||||||
} else if(format == "uc-timeout") {
|
} else if(format == "uc-timeout") {
|
||||||
if(std::regex_match(value,uc_timeout_regex))
|
if(std::regex_match(value,uc_timeout_regex))
|
||||||
return;
|
return;
|
||||||
@@ -2425,7 +2758,7 @@ namespace OpenWifi {
|
|||||||
if(std::regex_match(value,host_regex))
|
if(std::regex_match(value,host_regex))
|
||||||
return;
|
return;
|
||||||
throw std::invalid_argument(value + " is not a proper FQDN.");
|
throw std::invalid_argument(value + " is not a proper FQDN.");
|
||||||
} else if(format == "fqdn") {
|
} else if(format == "fqdn" || format=="uc-fqdn") {
|
||||||
if(std::regex_match(value,host_regex))
|
if(std::regex_match(value,host_regex))
|
||||||
return;
|
return;
|
||||||
throw std::invalid_argument(value + " is not a proper FQDN.");
|
throw std::invalid_argument(value + " is not a proper FQDN.");
|
||||||
@@ -2442,16 +2775,20 @@ namespace OpenWifi {
|
|||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com.");
|
throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com.");
|
||||||
|
} else if(format == "uc-portrange") {
|
||||||
|
try {
|
||||||
|
if(IsPortRangeIsValid(value))
|
||||||
|
return;
|
||||||
|
throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port.");
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port.");
|
||||||
} else if(format == "ip") {
|
} else if(format == "ip") {
|
||||||
if (IsIP(value))
|
if (IsIP(value))
|
||||||
return;
|
return;
|
||||||
throw std::invalid_argument(value + " is not a valid IP address.");
|
throw std::invalid_argument(value + " is not a valid IP address.");
|
||||||
} else {
|
} else {
|
||||||
try {
|
|
||||||
nlohmann::json_schema::default_string_format_check(format,value);
|
nlohmann::json_schema::default_string_format_check(format,value);
|
||||||
} catch (const std::logic_error &E) {
|
|
||||||
std::string Error{"JSON Schema validation: "};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2459,19 +2796,32 @@ namespace OpenWifi {
|
|||||||
if(Working_) {
|
if(Working_) {
|
||||||
try {
|
try {
|
||||||
auto Doc = json::parse(C);
|
auto Doc = json::parse(C);
|
||||||
Validator_->validate(Doc);
|
custom_error_handler CE;
|
||||||
|
json_validator Validator(nullptr, my_format_checker);
|
||||||
|
Validator.set_root_schema(RootSchema_);
|
||||||
|
Validator.validate(Doc,CE);
|
||||||
return true;
|
return true;
|
||||||
|
} catch (const std::invalid_argument &E) {
|
||||||
|
std::cout << "1 Validation failed, here is why: " << E.what() << "\n";
|
||||||
|
Error = E.what();
|
||||||
|
return false;
|
||||||
|
} catch (const std::logic_error &E) {
|
||||||
|
std::cout << "2 Validation failed, here is why: " << E.what() << "\n";
|
||||||
|
Error = E.what();
|
||||||
|
return false;
|
||||||
} catch(const std::exception &E) {
|
} catch(const std::exception &E) {
|
||||||
Error = E.what();
|
Error = E.what();
|
||||||
std::cout << "Validation failed, here is why: " << E.what() << "\n";
|
std::cout << "3 Validation failed, here is why: " << E.what() << "\n";
|
||||||
return false;
|
return false;
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << "4 Some kind of bullshit exception..." << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigurationValidator::reinitialize(Poco::Util::Application &self) {
|
void ConfigurationValidator::reinitialize([[maybe_unused]] Poco::Util::Application &self) {
|
||||||
Logger_.information("Reinitializing.");
|
poco_information(Logger(),"Reinitializing.");
|
||||||
Working_ = Initialized_ = false;
|
Working_ = Initialized_ = false;
|
||||||
Init();
|
Init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,10 @@
|
|||||||
// Created by stephane bourque on 2021-09-14.
|
// Created by stephane bourque on 2021-09-14.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef OWPROV_CONFIGURATIONVALIDATOR_H
|
#pragma once
|
||||||
#define OWPROV_CONFIGURATIONVALIDATOR_H
|
|
||||||
|
|
||||||
#include <nlohmann/json-schema.hpp>
|
#include <nlohmann/json-schema.hpp>
|
||||||
#include "framework/MicroService.h"
|
#include "framework/SubSystemServer.h"
|
||||||
|
|
||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
using nlohmann::json_schema::json_validator;
|
using nlohmann::json_schema::json_validator;
|
||||||
@@ -15,9 +14,8 @@ namespace OpenWifi {
|
|||||||
class ConfigurationValidator : public SubSystemServer {
|
class ConfigurationValidator : public SubSystemServer {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static ConfigurationValidator *instance() {
|
static auto instance() {
|
||||||
if(instance_== nullptr)
|
static auto instance_ = new ConfigurationValidator;
|
||||||
instance_ = new ConfigurationValidator;
|
|
||||||
return instance_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,19 +26,17 @@ namespace OpenWifi {
|
|||||||
void reinitialize(Poco::Util::Application &self) override;
|
void reinitialize(Poco::Util::Application &self) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static ConfigurationValidator * instance_;
|
|
||||||
bool Initialized_=false;
|
bool Initialized_=false;
|
||||||
bool Working_=false;
|
bool Working_=false;
|
||||||
void Init();
|
void Init();
|
||||||
std::unique_ptr<json_validator> Validator_=std::make_unique<json_validator>(nullptr, my_format_checker);
|
nlohmann::json RootSchema_;
|
||||||
|
|
||||||
ConfigurationValidator():
|
ConfigurationValidator():
|
||||||
SubSystemServer("configvalidator", "CFG-VALIDATOR", "config.validator") {
|
SubSystemServer("ConfigValidator", "CFG-VALIDATOR", "config.validator") {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline ConfigurationValidator * ConfigurationValidator() { return ConfigurationValidator::instance(); }
|
inline auto ConfigurationValidator() { return ConfigurationValidator::instance(); }
|
||||||
inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); }
|
inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); }
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //OWPROV_CONFIGURATIONVALIDATOR_H
|
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
// Created by stephane bourque on 2021-10-08.
|
// Created by stephane bourque on 2021-10-08.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef OWPROV_COUNTRYCODES_H
|
#pragma once
|
||||||
#define OWPROV_COUNTRYCODES_H
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -270,4 +269,3 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //OWPROV_COUNTRYCODES_H
|
|
||||||
|
|||||||
49
src/framework/EventBusManager.cpp
Normal file
49
src/framework/EventBusManager.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "framework/EventBusManager.h"
|
||||||
|
#include "framework/KafkaManager.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
EventBusManager::EventBusManager(Poco::Logger &L) :
|
||||||
|
Logger_(L) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventBusManager::run() {
|
||||||
|
Running_ = true;
|
||||||
|
Utils::SetThreadName("fmwk:EventMgr");
|
||||||
|
auto Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN);
|
||||||
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,MicroServicePrivateEndPoint(),Msg, false);
|
||||||
|
while(Running_) {
|
||||||
|
Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer());
|
||||||
|
if(!Running_)
|
||||||
|
break;
|
||||||
|
Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE);
|
||||||
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,MicroServicePrivateEndPoint(),Msg, false);
|
||||||
|
}
|
||||||
|
Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE);
|
||||||
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,MicroServicePrivateEndPoint(),Msg, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
void EventBusManager::Start() {
|
||||||
|
poco_information(Logger(),"Starting...");
|
||||||
|
if(KafkaManager()->Enabled()) {
|
||||||
|
Thread_.start(*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventBusManager::Stop() {
|
||||||
|
if(KafkaManager()->Enabled()) {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
Running_ = false;
|
||||||
|
Thread_.wakeUp();
|
||||||
|
Thread_.join();
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
28
src/framework/EventBusManager.h
Normal file
28
src/framework/EventBusManager.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Poco/Runnable.h"
|
||||||
|
#include "Poco/Logger.h"
|
||||||
|
#include "Poco/Thread.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
class EventBusManager : public Poco::Runnable {
|
||||||
|
public:
|
||||||
|
explicit EventBusManager(Poco::Logger &L);
|
||||||
|
void run() final;
|
||||||
|
void Start();
|
||||||
|
void Stop();
|
||||||
|
inline Poco::Logger & Logger() { return Logger_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable std::atomic_bool Running_ = false;
|
||||||
|
Poco::Thread Thread_;
|
||||||
|
Poco::Logger &Logger_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
|
|
||||||
365
src/framework/KafkaManager.cpp
Normal file
365
src/framework/KafkaManager.cpp
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "KafkaManager.h"
|
||||||
|
|
||||||
|
#include "framework/MicroServiceFuncs.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
void KafkaLoggerFun([[maybe_unused]] cppkafka::KafkaHandleBase & handle, int level, const std::string & facility, const std::string &message) {
|
||||||
|
switch ((cppkafka::LogLevel) level) {
|
||||||
|
case cppkafka::LogLevel::LogNotice: {
|
||||||
|
poco_notice(KafkaManager()->Logger(),fmt::format("kafka-log: facility: {} message: {}",facility, message));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cppkafka::LogLevel::LogDebug: {
|
||||||
|
poco_debug(KafkaManager()->Logger(),fmt::format("kafka-log: facility: {} message: {}",facility, message));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cppkafka::LogLevel::LogInfo: {
|
||||||
|
poco_information(KafkaManager()->Logger(),fmt::format("kafka-log: facility: {} message: {}",facility, message));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cppkafka::LogLevel::LogWarning: {
|
||||||
|
poco_warning(KafkaManager()->Logger(), fmt::format("kafka-log: facility: {} message: {}",facility, message));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cppkafka::LogLevel::LogAlert:
|
||||||
|
case cppkafka::LogLevel::LogCrit: {
|
||||||
|
poco_critical(KafkaManager()->Logger(),fmt::format("kafka-log: facility: {} message: {}",facility, message));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cppkafka::LogLevel::LogErr:
|
||||||
|
case cppkafka::LogLevel::LogEmerg:
|
||||||
|
default: {
|
||||||
|
poco_error(KafkaManager()->Logger(),fmt::format("kafka-log: facility: {} message: {}",facility, message));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void KafkaErrorFun([[maybe_unused]] cppkafka::KafkaHandleBase & handle, int error, const std::string &reason) {
|
||||||
|
poco_error(KafkaManager()->Logger(),fmt::format("kafka-error: {}, reason: {}", error, reason));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void AddKafkaSecurity(cppkafka::Configuration & Config) {
|
||||||
|
auto CA = MicroServiceConfigGetString("openwifi.kafka.ssl.ca.location","");
|
||||||
|
auto Certificate = MicroServiceConfigGetString("openwifi.kafka.ssl.certificate.location","");
|
||||||
|
auto Key = MicroServiceConfigGetString("openwifi.kafka.ssl.key.location","");
|
||||||
|
auto Password = MicroServiceConfigGetString("openwifi.kafka.ssl.key.password","");
|
||||||
|
|
||||||
|
if(CA.empty() || Certificate.empty() || Key.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Config.set("ssl.ca.location", CA);
|
||||||
|
Config.set("ssl.certificate.location", Certificate);
|
||||||
|
Config.set("ssl.key.location", Key);
|
||||||
|
if(!Password.empty())
|
||||||
|
Config.set("ssl.key.password", Password);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void KafkaManager::initialize(Poco::Util::Application & self) {
|
||||||
|
SubSystemServer::initialize(self);
|
||||||
|
KafkaEnabled_ = MicroServiceConfigGetBool("openwifi.kafka.enable",false);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void KafkaProducer::run() {
|
||||||
|
Poco::Logger &Logger_ = Poco::Logger::create("KAFKA-PRODUCER", KafkaManager()->Logger().getChannel());
|
||||||
|
poco_information(Logger_,"Starting...");
|
||||||
|
|
||||||
|
Utils::SetThreadName("Kafka:Prod");
|
||||||
|
cppkafka::Configuration Config({
|
||||||
|
{ "client.id", MicroServiceConfigGetString("openwifi.kafka.client.id", "") },
|
||||||
|
{ "metadata.broker.list", MicroServiceConfigGetString("openwifi.kafka.brokerlist", "") }
|
||||||
|
});
|
||||||
|
|
||||||
|
AddKafkaSecurity(Config);
|
||||||
|
|
||||||
|
Config.set_log_callback(KafkaLoggerFun);
|
||||||
|
Config.set_error_callback(KafkaErrorFun);
|
||||||
|
|
||||||
|
KafkaManager()->SystemInfoWrapper_ = R"lit({ "system" : { "id" : )lit" +
|
||||||
|
std::to_string(MicroServiceID()) +
|
||||||
|
R"lit( , "host" : ")lit" + MicroServicePrivateEndPoint() +
|
||||||
|
R"lit(" } , "payload" : )lit" ;
|
||||||
|
|
||||||
|
cppkafka::Producer Producer(Config);
|
||||||
|
Running_ = true;
|
||||||
|
|
||||||
|
Poco::AutoPtr<Poco::Notification> Note(Queue_.waitDequeueNotification());
|
||||||
|
while(Note && Running_) {
|
||||||
|
try {
|
||||||
|
auto Msg = dynamic_cast<KafkaMessage *>(Note.get());
|
||||||
|
if (Msg != nullptr) {
|
||||||
|
Producer.produce(
|
||||||
|
cppkafka::MessageBuilder(Msg->Topic()).key(Msg->Key()).payload(Msg->Payload()));
|
||||||
|
}
|
||||||
|
} catch (const cppkafka::HandleException &E) {
|
||||||
|
poco_warning(Logger_,fmt::format("Caught a Kafka exception (producer): {}", E.what()));
|
||||||
|
} catch( const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
} catch (...) {
|
||||||
|
poco_error(Logger_,"std::exception");
|
||||||
|
}
|
||||||
|
Note = Queue_.waitDequeueNotification();
|
||||||
|
}
|
||||||
|
poco_information(Logger_,"Stopped...");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void KafkaConsumer::run() {
|
||||||
|
Utils::SetThreadName("Kafka:Cons");
|
||||||
|
|
||||||
|
Poco::Logger &Logger_ = Poco::Logger::create("KAFKA-CONSUMER", KafkaManager()->Logger().getChannel());
|
||||||
|
|
||||||
|
poco_information(Logger_,"Starting...");
|
||||||
|
|
||||||
|
cppkafka::Configuration Config({
|
||||||
|
{ "client.id", MicroServiceConfigGetString("openwifi.kafka.client.id","") },
|
||||||
|
{ "metadata.broker.list", MicroServiceConfigGetString("openwifi.kafka.brokerlist","") },
|
||||||
|
{ "group.id", MicroServiceConfigGetString("openwifi.kafka.group.id","") },
|
||||||
|
{ "enable.auto.commit", MicroServiceConfigGetBool("openwifi.kafka.auto.commit",false) },
|
||||||
|
{ "auto.offset.reset", "latest" } ,
|
||||||
|
{ "enable.partition.eof", false }
|
||||||
|
});
|
||||||
|
|
||||||
|
AddKafkaSecurity(Config);
|
||||||
|
|
||||||
|
Config.set_log_callback(KafkaLoggerFun);
|
||||||
|
Config.set_error_callback(KafkaErrorFun);
|
||||||
|
|
||||||
|
cppkafka::TopicConfiguration topic_config = {
|
||||||
|
{ "auto.offset.reset", "smallest" }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Now configure it to be the default topic config
|
||||||
|
Config.set_default_topic_configuration(topic_config);
|
||||||
|
|
||||||
|
cppkafka::Consumer Consumer(Config);
|
||||||
|
Consumer.set_assignment_callback([&](cppkafka::TopicPartitionList& partitions) {
|
||||||
|
if(!partitions.empty()) {
|
||||||
|
poco_information(Logger_,fmt::format("Partition assigned: {}...",
|
||||||
|
partitions.front().get_partition()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Consumer.set_revocation_callback([&](const cppkafka::TopicPartitionList& partitions) {
|
||||||
|
if(!partitions.empty()) {
|
||||||
|
poco_information(Logger_,fmt::format("Partition revocation: {}...",
|
||||||
|
partitions.front().get_partition()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
bool AutoCommit = MicroServiceConfigGetBool("openwifi.kafka.auto.commit",false);
|
||||||
|
auto BatchSize = MicroServiceConfigGetInt("openwifi.kafka.consumer.batchsize",20);
|
||||||
|
|
||||||
|
Types::StringVec Topics;
|
||||||
|
KafkaManager()->Topics(Topics);
|
||||||
|
Consumer.subscribe(Topics);
|
||||||
|
|
||||||
|
Running_ = true;
|
||||||
|
while(Running_) {
|
||||||
|
try {
|
||||||
|
std::vector<cppkafka::Message> MsgVec = Consumer.poll_batch(BatchSize, std::chrono::milliseconds(100));
|
||||||
|
for(auto const &Msg:MsgVec) {
|
||||||
|
if (!Msg)
|
||||||
|
continue;
|
||||||
|
if (Msg.get_error()) {
|
||||||
|
if (!Msg.is_eof()) {
|
||||||
|
poco_error(Logger_,fmt::format("Error: {}", Msg.get_error().to_string()));
|
||||||
|
}
|
||||||
|
if(!AutoCommit)
|
||||||
|
Consumer.async_commit(Msg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
KafkaManager()->Dispatch(Msg.get_topic(), Msg.get_key(),Msg.get_payload() );
|
||||||
|
if (!AutoCommit)
|
||||||
|
Consumer.async_commit(Msg);
|
||||||
|
}
|
||||||
|
} catch (const cppkafka::HandleException &E) {
|
||||||
|
poco_warning(Logger_,fmt::format("Caught a Kafka exception (consumer): {}", E.what()));
|
||||||
|
} catch (const Poco::Exception &E) {
|
||||||
|
Logger_.log(E);
|
||||||
|
} catch (...) {
|
||||||
|
poco_error(Logger_,"std::exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Consumer.unsubscribe();
|
||||||
|
poco_information(Logger_,"Stopped...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaProducer::Start() {
|
||||||
|
if(!Running_) {
|
||||||
|
Running_=true;
|
||||||
|
Worker_.start(*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaProducer::Stop() {
|
||||||
|
if(Running_) {
|
||||||
|
Running_=false;
|
||||||
|
Queue_.wakeUpAll();
|
||||||
|
Worker_.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaProducer::Produce(const std::string &Topic, const std::string &Key, const std::string &Payload) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
Queue_.enqueueNotification( new KafkaMessage(Topic,Key,Payload));
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaConsumer::Start() {
|
||||||
|
if(!Running_) {
|
||||||
|
Running_=true;
|
||||||
|
Worker_.start(*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaConsumer::Stop() {
|
||||||
|
if(Running_) {
|
||||||
|
Running_=false;
|
||||||
|
Worker_.wakeUp();
|
||||||
|
Worker_.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaDispatcher::Start() {
|
||||||
|
if(!Running_) {
|
||||||
|
Running_=true;
|
||||||
|
Worker_.start(*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaDispatcher::Stop() {
|
||||||
|
if(Running_) {
|
||||||
|
Running_=false;
|
||||||
|
Queue_.wakeUpAll();
|
||||||
|
Worker_.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto KafkaDispatcher::RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
auto It = Notifiers_.find(Topic);
|
||||||
|
if(It == Notifiers_.end()) {
|
||||||
|
Types::TopicNotifyFunctionList L;
|
||||||
|
L.emplace(L.end(),std::make_pair(F,FunctionId_));
|
||||||
|
Notifiers_[Topic] = std::move(L);
|
||||||
|
} else {
|
||||||
|
It->second.emplace(It->second.end(),std::make_pair(F,FunctionId_));
|
||||||
|
}
|
||||||
|
return FunctionId_++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaDispatcher::UnregisterTopicWatcher(const std::string &Topic, int Id) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
auto It = Notifiers_.find(Topic);
|
||||||
|
if(It != Notifiers_.end()) {
|
||||||
|
Types::TopicNotifyFunctionList & L = It->second;
|
||||||
|
for(auto it=L.begin(); it!=L.end(); it++)
|
||||||
|
if(it->second == Id) {
|
||||||
|
L.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaDispatcher::Dispatch(const std::string &Topic, const std::string &Key, const std::string &Payload) {
|
||||||
|
std::lock_guard G(Mutex_);
|
||||||
|
auto It = Notifiers_.find(Topic);
|
||||||
|
if(It!=Notifiers_.end()) {
|
||||||
|
Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaDispatcher::run() {
|
||||||
|
Poco::Logger &Logger_ = Poco::Logger::create("KAFKA-DISPATCHER", KafkaManager()->Logger().getChannel());
|
||||||
|
poco_information(Logger_,"Starting...");
|
||||||
|
Poco::AutoPtr<Poco::Notification> Note(Queue_.waitDequeueNotification());
|
||||||
|
Utils::SetThreadName("kafka:dispatch");
|
||||||
|
while(Note && Running_) {
|
||||||
|
auto Msg = dynamic_cast<KafkaMessage*>(Note.get());
|
||||||
|
if(Msg!= nullptr) {
|
||||||
|
auto It = Notifiers_.find(Msg->Topic());
|
||||||
|
if (It != Notifiers_.end()) {
|
||||||
|
const auto & FL = It->second;
|
||||||
|
for(const auto &[CallbackFunc,_]:FL) {
|
||||||
|
CallbackFunc(Msg->Key(), Msg->Payload());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Note = Queue_.waitDequeueNotification();
|
||||||
|
}
|
||||||
|
poco_information(Logger_,"Stopped...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaDispatcher::Topics(std::vector<std::string> &T) {
|
||||||
|
T.clear();
|
||||||
|
for(const auto &[TopicName,_]:Notifiers_)
|
||||||
|
T.push_back(TopicName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int KafkaManager::Start() {
|
||||||
|
if(!KafkaEnabled_)
|
||||||
|
return 0;
|
||||||
|
ConsumerThr_.Start();
|
||||||
|
ProducerThr_.Start();
|
||||||
|
Dispatcher_.Start();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::Stop() {
|
||||||
|
if(KafkaEnabled_) {
|
||||||
|
poco_information(Logger(),"Stopping...");
|
||||||
|
Dispatcher_.Stop();
|
||||||
|
ProducerThr_.Stop();
|
||||||
|
ConsumerThr_.Stop();
|
||||||
|
poco_information(Logger(),"Stopped...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::PostMessage(const std::string &topic, const std::string & key, const std::string &PayLoad, bool WrapMessage ) {
|
||||||
|
if(KafkaEnabled_) {
|
||||||
|
ProducerThr_.Produce(topic,key,WrapMessage ? WrapSystemId(PayLoad) : PayLoad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::Dispatch(const std::string &Topic, const std::string & Key, const std::string &Payload) {
|
||||||
|
Dispatcher_.Dispatch(Topic, Key, Payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] std::string KafkaManager::WrapSystemId(const std::string & PayLoad) {
|
||||||
|
return SystemInfoWrapper_ + PayLoad + "}";
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t KafkaManager::RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F) {
|
||||||
|
if(KafkaEnabled_) {
|
||||||
|
return Dispatcher_.RegisterTopicWatcher(Topic,F);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::UnregisterTopicWatcher(const std::string &Topic, uint64_t Id) {
|
||||||
|
if(KafkaEnabled_) {
|
||||||
|
Dispatcher_.UnregisterTopicWatcher(Topic, Id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::Topics(std::vector<std::string> &T) {
|
||||||
|
Dispatcher_.Topics(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::PartitionAssignment(const cppkafka::TopicPartitionList& partitions) {
|
||||||
|
poco_information(Logger(),fmt::format("Partition assigned: {}...", partitions.front().get_partition()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void KafkaManager::PartitionRevocation(const cppkafka::TopicPartitionList& partitions) {
|
||||||
|
poco_information(Logger(),fmt::format("Partition revocation: {}...",partitions.front().get_partition()));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
122
src/framework/KafkaManager.h
Normal file
122
src/framework/KafkaManager.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
//
|
||||||
|
// Created by stephane bourque on 2022-10-25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Poco/Notification.h"
|
||||||
|
#include "Poco/NotificationQueue.h"
|
||||||
|
|
||||||
|
#include "framework/SubSystemServer.h"
|
||||||
|
#include "framework/OpenWifiTypes.h"
|
||||||
|
#include "framework/utils.h"
|
||||||
|
#include "framework/KafkaTopics.h"
|
||||||
|
|
||||||
|
#include "cppkafka/cppkafka.h"
|
||||||
|
|
||||||
|
namespace OpenWifi {
|
||||||
|
|
||||||
|
class KafkaMessage: public Poco::Notification {
|
||||||
|
public:
|
||||||
|
KafkaMessage( const std::string &Topic, const std::string &Key, const std::string & Payload) :
|
||||||
|
Topic_(Topic), Key_(Key), Payload_(Payload) {
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const std::string & Topic() { return Topic_; }
|
||||||
|
inline const std::string & Key() { return Key_; }
|
||||||
|
inline const std::string & Payload() { return Payload_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string Topic_;
|
||||||
|
std::string Key_;
|
||||||
|
std::string Payload_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class KafkaProducer : public Poco::Runnable {
|
||||||
|
public:
|
||||||
|
void run () override;
|
||||||
|
void Start();
|
||||||
|
void Stop();
|
||||||
|
void Produce(const std::string &Topic, const std::string &Key, const std::string &Payload);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::recursive_mutex Mutex_;
|
||||||
|
Poco::Thread Worker_;
|
||||||
|
mutable std::atomic_bool Running_=false;
|
||||||
|
Poco::NotificationQueue Queue_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class KafkaConsumer : public Poco::Runnable {
|
||||||
|
public:
|
||||||
|
void run() override;
|
||||||
|
void Start();
|
||||||
|
void Stop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::recursive_mutex Mutex_;
|
||||||
|
Poco::Thread Worker_;
|
||||||
|
mutable std::atomic_bool Running_=false;
|
||||||
|
};
|
||||||
|
|
||||||
|
class KafkaDispatcher : public Poco::Runnable {
|
||||||
|
public:
|
||||||
|
void Start();
|
||||||
|
void Stop();
|
||||||
|
auto RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
|
||||||
|
void UnregisterTopicWatcher(const std::string &Topic, int Id);
|
||||||
|
void Dispatch(const std::string &Topic, const std::string &Key, const std::string &Payload);
|
||||||
|
void run() override;
|
||||||
|
void Topics(std::vector<std::string> &T);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::recursive_mutex Mutex_;
|
||||||
|
Types::NotifyTable Notifiers_;
|
||||||
|
Poco::Thread Worker_;
|
||||||
|
mutable std::atomic_bool Running_=false;
|
||||||
|
uint64_t FunctionId_=1;
|
||||||
|
Poco::NotificationQueue Queue_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class KafkaManager : public SubSystemServer {
|
||||||
|
public:
|
||||||
|
|
||||||
|
friend class KafkaConsumer;
|
||||||
|
friend class KafkaProducer;
|
||||||
|
|
||||||
|
inline void initialize(Poco::Util::Application & self) override;
|
||||||
|
|
||||||
|
static auto instance() {
|
||||||
|
static auto instance_ = new KafkaManager;
|
||||||
|
return instance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Start() override;
|
||||||
|
void Stop() override;
|
||||||
|
|
||||||
|
void PostMessage(const std::string &topic, const std::string & key, const std::string &PayLoad, bool WrapMessage = true );
|
||||||
|
void Dispatch(const std::string &Topic, const std::string & Key, const std::string &Payload);
|
||||||
|
[[nodiscard]] std::string WrapSystemId(const std::string & PayLoad);
|
||||||
|
[[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; }
|
||||||
|
uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
|
||||||
|
void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id);
|
||||||
|
void Topics(std::vector<std::string> &T);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool KafkaEnabled_ = false;
|
||||||
|
std::string SystemInfoWrapper_;
|
||||||
|
KafkaProducer ProducerThr_;
|
||||||
|
KafkaConsumer ConsumerThr_;
|
||||||
|
KafkaDispatcher Dispatcher_;
|
||||||
|
|
||||||
|
void PartitionAssignment(const cppkafka::TopicPartitionList& partitions);
|
||||||
|
void PartitionRevocation(const cppkafka::TopicPartitionList& partitions);
|
||||||
|
|
||||||
|
KafkaManager() noexcept:
|
||||||
|
SubSystemServer("KafkaManager", "KAFKA-SVR", "openwifi.kafka") {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline auto KafkaManager() { return KafkaManager::instance(); }
|
||||||
|
|
||||||
|
} // namespace OpenWifi
|
||||||
|
|
||||||
@@ -5,9 +5,10 @@
|
|||||||
// Created by Stephane Bourque on 2021-03-04.
|
// Created by Stephane Bourque on 2021-03-04.
|
||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
#ifndef UCENTRALGW_KAFKA_TOPICS_H
|
|
||||||
#define UCENTRALGW_KAFKA_TOPICS_H
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
namespace OpenWifi::KafkaTopics {
|
namespace OpenWifi::KafkaTopics {
|
||||||
static const std::string HEALTHCHECK{"healthcheck"};
|
static const std::string HEALTHCHECK{"healthcheck"};
|
||||||
static const std::string STATE{"state"};
|
static const std::string STATE{"state"};
|
||||||
@@ -17,6 +18,8 @@ namespace OpenWifi::KafkaTopics {
|
|||||||
static const std::string COMMAND{"command"};
|
static const std::string COMMAND{"command"};
|
||||||
static const std::string SERVICE_EVENTS{"service_events"};
|
static const std::string SERVICE_EVENTS{"service_events"};
|
||||||
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
|
static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
|
||||||
|
static const std::string DEVICE_TELEMETRY{"device_telemetry"};
|
||||||
|
static const std::string PROVISIONING_CHANGE{"provisioning_change"};
|
||||||
|
|
||||||
namespace ServiceEvents {
|
namespace ServiceEvents {
|
||||||
static const std::string EVENT_JOIN{"join"};
|
static const std::string EVENT_JOIN{"join"};
|
||||||
@@ -37,4 +40,3 @@ namespace OpenWifi::KafkaTopics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // UCENTRALGW_KAFKA_TOPICS_H
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user