mirror of
https://github.com/outbackdingo/parodus.git
synced 2026-01-27 18:20:04 +00:00
Compare commits
163 Commits
1.1.2
...
xmidt_send
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
60c37daa18 | ||
|
|
f51b4ef9c2 | ||
|
|
254c9f6763 | ||
|
|
8876fa9239 | ||
|
|
42fc9eb26e | ||
|
|
e8e652b076 | ||
|
|
dc935f9a09 | ||
|
|
d1462de56a | ||
|
|
223e7db81c | ||
|
|
cd763823fc | ||
|
|
8537f27ece | ||
|
|
6381d9c55f | ||
|
|
980b7a88db | ||
|
|
e3c37b6764 | ||
|
|
67d58441ef | ||
|
|
f6ffda05ad | ||
|
|
6aee851944 | ||
|
|
aaa93e137d | ||
|
|
21e8c74f23 | ||
|
|
0248e7b241 | ||
|
|
da019382c6 | ||
|
|
aecbd885d5 | ||
|
|
0443c45924 | ||
|
|
314c840755 | ||
|
|
69f7e3eba0 | ||
|
|
e643f9e2fc | ||
|
|
7d2e9733d0 | ||
|
|
23c18da03e | ||
|
|
2218637f2c | ||
|
|
54f9983eff | ||
|
|
a577854172 | ||
|
|
e054ef580f | ||
|
|
79eb7ba6ef | ||
|
|
a291b047b6 | ||
|
|
656b1b0b58 | ||
|
|
22ecf0ef76 | ||
|
|
c97a3a3a20 | ||
|
|
46273d9766 | ||
|
|
7efed14c20 | ||
|
|
6d39163d47 | ||
|
|
5b0d3e19f3 | ||
|
|
0d8bb960f6 | ||
|
|
5d537fb139 | ||
|
|
47fcd6bdae | ||
|
|
24e1790ccb | ||
|
|
89fdd97d44 | ||
|
|
5ae2325fb6 | ||
|
|
9bad1142ab | ||
|
|
339b93cfd3 | ||
|
|
a34db44c90 | ||
|
|
bdec80dd07 | ||
|
|
1833c30e83 | ||
|
|
5b26fe38f5 | ||
|
|
f3a4daeb74 | ||
|
|
aaeb1f6612 | ||
|
|
0fb6288255 | ||
|
|
0fd3b76f27 | ||
|
|
48722ffa7c | ||
|
|
bf5d555d96 | ||
|
|
c02b141f7c | ||
|
|
9f40b7efe5 | ||
|
|
2a184e24c9 | ||
|
|
233a167cb4 | ||
|
|
5562d7ec48 | ||
|
|
49513df8f8 | ||
|
|
d0e6c5bd75 | ||
|
|
66f1f4d4fb | ||
|
|
19b4f56913 | ||
|
|
c30d5a3362 | ||
|
|
c98e2e2fb8 | ||
|
|
c78625f35a | ||
|
|
aeea6fbb03 | ||
|
|
d2d1590329 | ||
|
|
e693c09ca3 | ||
|
|
0b9f739323 | ||
|
|
d901efd10c | ||
|
|
824bcb81cf | ||
|
|
671fc5be59 | ||
|
|
4bf8683192 | ||
|
|
9300d76a8e | ||
|
|
dee98922a6 | ||
|
|
b9fa918c15 | ||
|
|
a278a7017d | ||
|
|
69cf210a34 | ||
|
|
77b587aa9d | ||
|
|
441ecf702f | ||
|
|
bdc2733d8e | ||
|
|
1f24671c0f | ||
|
|
3de4ec59c1 | ||
|
|
a01ad8f15c | ||
|
|
1d2e51e31e | ||
|
|
9e808acf7d | ||
|
|
19f2fe1419 | ||
|
|
b99c06a67b | ||
|
|
f57ebc1cd7 | ||
|
|
1df770a91b | ||
|
|
a582bb3252 | ||
|
|
42dd20263b | ||
|
|
ac100c0f4e | ||
|
|
290289f2f1 | ||
|
|
8e9b98b697 | ||
|
|
b148d40c53 | ||
|
|
dc6486f200 | ||
|
|
ad2d43b4f6 | ||
|
|
54cfdd9c52 | ||
|
|
19056ddfec | ||
|
|
1d85742497 | ||
|
|
e29dd26d2b | ||
|
|
5aae91763a | ||
|
|
9afa49140a | ||
|
|
4305dc8eef | ||
|
|
f44fc2c8d9 | ||
|
|
16543800d2 | ||
|
|
bcb4840a41 | ||
|
|
b173828777 | ||
|
|
2df8cdfeb5 | ||
|
|
eba1309169 | ||
|
|
70c1c64550 | ||
|
|
e825c19ef3 | ||
|
|
95170d95c7 | ||
|
|
33142a6ce7 | ||
|
|
7b3ee1dd5a | ||
|
|
f2308e2966 | ||
|
|
9c55157da7 | ||
|
|
1c254e28fe | ||
|
|
8955787640 | ||
|
|
b633938bc7 | ||
|
|
b0aeaf1fb2 | ||
|
|
ea726e0c10 | ||
|
|
cbdf5d2be9 | ||
|
|
3d369cafb2 | ||
|
|
c0dbdb5028 | ||
|
|
12a7765f98 | ||
|
|
88c87917a4 | ||
|
|
0905387d49 | ||
|
|
a8167fa417 | ||
|
|
6ab601e758 | ||
|
|
45536eb4e1 | ||
|
|
8208d3bfd0 | ||
|
|
4fc60b6b3c | ||
|
|
990d9df7e2 | ||
|
|
fe52d9a55e | ||
|
|
9cfc734c51 | ||
|
|
153add9bec | ||
|
|
8b553f8a29 | ||
|
|
7679fdaf4a | ||
|
|
1c09a80493 | ||
|
|
bfad8ed44b | ||
|
|
17c7faff50 | ||
|
|
01120da9ac | ||
|
|
c7c6fb4926 | ||
|
|
f4b2c252ae | ||
|
|
8794ce2092 | ||
|
|
a61e97633b | ||
|
|
4d3d6ec99d | ||
|
|
e6ac264e47 | ||
|
|
70c9975ae9 | ||
|
|
11a2b6f123 | ||
|
|
81d8f59bbd | ||
|
|
846b0588c2 | ||
|
|
ad44ff0221 | ||
|
|
513647ceef | ||
|
|
2ec3443b1d |
24
.github/scripts/get_sonarcloud.sh
vendored
Executable file
24
.github/scripts/get_sonarcloud.sh
vendored
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
curl -s -L -O https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip
|
||||
unzip -q -o build-wrapper-linux-x86.zip
|
||||
|
||||
|
||||
SONAR_VERSION=`curl -s https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ |grep -o "sonar-scanner-cli-[0-9.]*-linux.zip"|sort -r|uniq|head -n 1`
|
||||
curl -s -L -O https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$SONAR_VERSION
|
||||
curl -s -L -O https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$SONAR_VERSION.sha256
|
||||
echo " $SONAR_VERSION" >> $SONAR_VERSION.sha256
|
||||
sha256sum -c $SONAR_VERSION.sha256
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
exit 1
|
||||
fi
|
||||
unzip -q $SONAR_VERSION
|
||||
|
||||
output=`ls | grep -o "sonar-scanner-[0-9.]*-linux"`
|
||||
|
||||
echo "Using $output"
|
||||
|
||||
mv $output sonar-scanner
|
||||
50
.github/workflows/codeql-analysis.yml
vendored
Normal file
50
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: LGTM Analysis
|
||||
|
||||
on:
|
||||
create:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
schedule:
|
||||
- cron: '12 9 * * 3'
|
||||
|
||||
jobs:
|
||||
codeql:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
# Install the dependent packages
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt-get -y install valgrind libcunit1 libcunit1-doc libcunit1-dev libmsgpack-dev gcovr libtool
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: cpp
|
||||
queries: security-extended
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
72
.github/workflows/push.yml
vendored
Normal file
72
.github/workflows/push.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: CI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'AUTHORS'
|
||||
- 'LICENSE'
|
||||
- 'NOTICE'
|
||||
- '**.md'
|
||||
- '.gitignore'
|
||||
tags-ignore:
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+'
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Unit Tests
|
||||
runs-on: [ ubuntu-latest ]
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
# Install the dependent packages
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt-get -y install valgrind libcunit1 libcunit1-doc libcunit1-dev libmsgpack-dev gcovr libtool
|
||||
pip install codecov
|
||||
|
||||
- name: Make Build Directory
|
||||
run: mkdir build
|
||||
|
||||
- name: Get Sonarcloud Binaries
|
||||
working-directory: build
|
||||
run: |
|
||||
../.github/scripts/get_sonarcloud.sh
|
||||
|
||||
- name: CMake
|
||||
working-directory: build
|
||||
run: |
|
||||
cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=${DISABLE_VALGRIND} -DENABLE_SESHAT:BOOL=true -DFEATURE_DNS_QUERY:BOOL=true
|
||||
|
||||
|
||||
- name: Build
|
||||
working-directory: build
|
||||
run: |
|
||||
build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir bw-output make all test
|
||||
|
||||
- name: Merge GCOV Reports for Sonarcloud
|
||||
working-directory: build
|
||||
run: |
|
||||
gcovr --sonarqube coverage.xml -r ..
|
||||
|
||||
- name: Upload SonarCloud
|
||||
run: |
|
||||
build/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=https://sonarcloud.io -Dproject.settings=.sonar-project.properties -Dsonar.login=${{ secrets.SONAR_TOKEN }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Upload Codecov.io
|
||||
uses: codecov/codecov-action@v1
|
||||
with:
|
||||
directory: .
|
||||
fail_ci_if_error: true
|
||||
49
.github/workflows/release.yml
vendored
Normal file
49
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
# Push events to matching v#.#.#*, ex: v1.2.3, v.2.4.6-beta
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+*'
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: [ ubuntu-latest ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Determine repo name
|
||||
run: |
|
||||
echo "repo_name=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
|
||||
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||
echo "release_slug=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
- name: Create tarball and sha256
|
||||
run: |
|
||||
git archive --format=tar.gz -o ${release_slug}.tar.gz --prefix=${release_slug}/ ${version}
|
||||
git archive --format=zip -o ${release_slug}.zip --prefix=${release_slug}/ ${version}
|
||||
sha256sum ${release_slug}.tar.gz ${release_slug}.zip > ${release_slug}-sha256sums.txt
|
||||
mkdir artifacts
|
||||
cp ${release_slug}* artifacts/.
|
||||
- name: Prepare Release Body
|
||||
id: prep
|
||||
run: |
|
||||
export version=${GITHUB_REF#refs/tags/}
|
||||
export NOTES=$(cat CHANGELOG.md | perl -0777 -ne 'print "$1\n" if /.*## \[${version}\]\s(.*?)\s+## \[(v\d+.\d+.\d+)\].*/s')
|
||||
export TODAY=`date +'%m/%d/%Y'`
|
||||
echo ::set-output name=rname::$(echo ${version} ${TODAY})
|
||||
echo ::set-output name=body::${NOTES}
|
||||
- name: create release
|
||||
id: create_release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
name: ${{ steps.prep.outputs.rname }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
bodyFile: ${{ steps.prep.outputs.body }}
|
||||
artifacts: "artifacts/*"
|
||||
token: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||
33
.github/workflows/tag.yml
vendored
Normal file
33
.github/workflows/tag.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: tag
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "CHANGELOG.md" # only try to tag if the CHANGELOG has been updated.
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: [ ubuntu-latest ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
token: '${{ secrets.PERSONAL_ACCESS_TOKEN }}'
|
||||
fetch-depth: 0
|
||||
- name: set up bot
|
||||
run: |
|
||||
git config --global user.name "xmidt-bot"
|
||||
git config --global user.email "$BOT_EMAIL"
|
||||
- name: export variables and tag commit
|
||||
run: |
|
||||
export OLD_VERSION=$(git describe --tags `git rev-list --tags --max-count=1` | tail -1)
|
||||
export TAG=$(cat CHANGELOG.md | perl -0777 -ne 'print "$1" if /.*## \[Unreleased\]\s+## \[(v\d+.\d+.\d+)\].*/s')
|
||||
export BINVER=$(cat CMakeLists.txt | perl -0777 -ne 'print "v$1" if /.*project\s*\(.*\s*VERSION\s*(\d+.\d+.\d+).*\s*\)/s')
|
||||
export TODAY=`date +'%m/%d/%Y'`
|
||||
export NOTES=$(cat CHANGELOG.md | perl -0777 -ne 'print "$ENV{TODAY}\n\n$1\n" if /.*## \[$ENV{TAG}\]\s(.*?)\s+## \[(v\d+.\d+.\d+)\].*/s')
|
||||
if [[ "$TAG" != "" && "$TAG" != "$BINVER" ]]; then echo "CHANGELOG.md($TAG) and CMakeLists.txt VERSION($BINVER) do not match"; fi
|
||||
if [[ "$TAG" != "" && "$TAG" != "$OLD_VERSION" && "$TAG" == "$BINVER" ]]; then git tag -a "$TAG" -m "$NOTES"; git push origin --tags; echo $?; fi
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -34,3 +34,5 @@
|
||||
tags
|
||||
|
||||
build/
|
||||
|
||||
tests/jwt_key.tst
|
||||
|
||||
34
.sonar-project.properties
Normal file
34
.sonar-project.properties
Normal file
@@ -0,0 +1,34 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Reference:
|
||||
# https://github.com/SonarSource/sonarcloud_example_go-sqscanner-travis/blob/master/sonar-project.properties
|
||||
|
||||
|
||||
# =====================================================
|
||||
# Standard properties
|
||||
# =====================================================
|
||||
|
||||
sonar.organization=xmidt-org
|
||||
sonar.projectKey=xmidt-org_parodus
|
||||
sonar.projectName=parodus
|
||||
|
||||
sonar.sources=src
|
||||
|
||||
# =====================================================
|
||||
# Meta-data for the project
|
||||
# =====================================================
|
||||
|
||||
sonar.links.homepage=https://github.com/xmidt-org/parodus
|
||||
sonar.links.ci=https://github.com/xmidt-org/parodus/actions
|
||||
sonar.links.scm=https://github.com/xmidt-org/parodus
|
||||
sonar.links.issue=https://github.com/xmidt-org/parodus/issues
|
||||
|
||||
# =====================================================
|
||||
# Properties specific to C
|
||||
# =====================================================
|
||||
sonar.cfamily.build-wrapper-output=build/bw-output
|
||||
sonar.cfamily.threads=2
|
||||
sonar.cfamily.cache.enabled=false
|
||||
sonar.coverageReportPaths=build/coverage.xml
|
||||
|
||||
43
.travis.yml
43
.travis.yml
@@ -1,43 +0,0 @@
|
||||
dist: trusty
|
||||
sudo: required
|
||||
|
||||
language: c
|
||||
compiler:
|
||||
- gcc
|
||||
|
||||
addons:
|
||||
coverity_scan:
|
||||
project:
|
||||
name: "Comcast/parodus"
|
||||
description: "C implementation of the WebPA client coordinator"
|
||||
notification_email: weston_schmidt@alumni.purdue.edu
|
||||
build_command_prepend: "mkdir coverity_build && cd coverity_build && cmake .."
|
||||
build_command: "make"
|
||||
branch_pattern: ignore
|
||||
|
||||
before_install:
|
||||
- sudo pip install codecov
|
||||
- echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
|
||||
|
||||
install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -y -qq check libcunit1 libcunit1-dev uuid-dev valgrind
|
||||
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=false -DENABLE_SESHAT:BOOL=true -DFEATURE_DNS_QUERY:BOOL=true
|
||||
- make
|
||||
- export ARGS="-V"
|
||||
- make test
|
||||
|
||||
after_success:
|
||||
- codecov
|
||||
|
||||
env:
|
||||
global:
|
||||
- secure: EwQu1WDUgIF5qM5tnKj/+NCPz9t15y289bbqFo0wDhyfTlJGS9buQeJNeVLtNJBEOngpo+AkaPGvh/d9NZ0vLdxu+K/e+HhA6kOTxUrCHD8+4oX9XpVs/XvQmD1COlJYeeqd8bJMKtlFtonGdMJogxpEFQzv4fQjmoARvL2ciV4OB0MBcD5Lsb72L3a0aJT69F6WFuDpgGj2eIQyCDSTPNIi2X7EA8R33lxnntFDn8Vj6qSBbVOI2S5R5S+JUCMp1Q1ZbEqmh6j+wKtszWj8wGqfz8Ol5+GYl511bExb+hwvV5zen0Ol0+2LQmSpYhbQZ7prfI8AclLLwhDUrP+WDOv34vwd4EWQ1OoLqG23HbBygCxPSBIB6ZxPtVkzjVlOK8qqIB5QXqCyq8sPKlrXfntOQ+Ha938cIA+A0ag+26MLbhDGj8k3Os7BdY/oqNTKADZQdxfGKhCiA9qO2clpMyRXoE0q6hv9dYoG/2c4sxH8DKsT8XY/QbGmiBsk0DWHcpxkObCsHUxVKi+gIBGSL/tSjz2IJfQVZkdl2hhcyStGuPKbiwAlW3HydMk0VgRhVmHBIc41Cv7vPdMEVf/XiFhr2utRX468M/LR8vkhhokKl1xkVIiquwCPYPzZVAFARHTlaBMhz9kQVtTAHf2JkHuM9XcLWKW996FiSeswKyI=
|
||||
- secure: LQK36EsQdIJw7eSW1yz+yh3+yJdp8cznynBjE3whOEVI2KHZimr+vtK5hxE6TH0QjYyrb/BFgRql6CtLprpaABSEC9gpqpahu50jiAkjKC8DtfSloAbH5jj+ZllaPjURocerllNLVZxiRM/WCuJAy0nzBpAyx62YmVlEYi+zYD67d3wG6gLwso6l2DWuPPze6t5NmbUmH9hNk52++TZalwMtZFdibQoYm64vCTT5gycujw6ZDa8GD0m+Yryvc20kLlWPOVS9lN1iEGo98/gj8Ops8w0iw6k7SfEkvvFsKEUDr77wAN5Tk4tGq7odVrD/y3W9AsHkkSb1B6RqVWkcW3SjCAQc03jhdaBxXwcoJZcYahY21CB12EP7p0HSjEbvIzNpk0D9MulsGaMPlOudnKdG0/kmD7oIAiXjfC7PiPBBFIc/cVF5VAKNTUInEVfcKvlLpqDatwjB+qgb7pld24dUPuJw+yOgglk7J7xckJYHFTHhk0PWI5oN66dndj3yyJp4dz1v64ViFFTG4PO4YPJydZxRxolg1eGMuG0UIYJK6RWcSQ+ZPBm4p78J8xfHtgUkvWvrHJoXC1qAzqx1XRzbHEeTJgbKgLrWY+B6nbNotw1RDX4lNDirp5EI6GqezoFJToZkqe3MRs8DrqhaFjUbbEzAxznRWmxnWNN3Ujc=
|
||||
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
|
||||
# via the "travis encrypt" command using the project repo's public key
|
||||
- secure: "V/W4Z9/3uXpS83CvlZ1XfDAbHPIA2ID5G5s9GPcsUqoOASQdc6Y/DPejUlot+DgtiHOEdTr9n5iWDOuxqjcVnjVd6ag9i2m0PMqDhPj3fnUJM6dAeXIBda/qSuTsJTX4cIwb371R77cLcIUm35IEOSIAQOBCjh7RCf3ivGPUp+wobTonkNzDw6xqO90hx7NLnxwGSCcaNBFKOcLL0e7DXspp18lTWCSSaHELzXOyLlhZnWhC5tiFUIZk1ixm/cO1YEQH9AzgPJ5OYs+On0j8VT8XWMsxHu0zfkZkdZMAEOQbO6u4HBDePIfp+PoF1LwtX/UXfaEkUHZ0kNVXHfsN/KP7NHgTbASe9EXp+R4pcKEy4ZEbx+xpp7FlMQSJYiYiQbJ2FBrjwRPreXiHyCqn8htd0YNOTH4UykvO3NYxlTaMf9aE041lnLjUY18TuXrILz6SzMsGV+nYqfIci/NPuj/57k7nw127a93S4Mr/phXts9ZL8I7kagd8wKv3m5+7rmIfuSfS2kg2pTa0hk5uMqFWLG8AilUQ5t1ChylzPcl/Gdgi9OP0pG2WyUmkqOiSqhwwdg2ZCwptodwuonfbdKMSBuHOS8lLU1bGyCRdWsMoscSv/xn4t3ikzBsSDiKgI8xq2+aqQyHDeVneqAk1BbxiNIwoJeyVXq2EKU6MlgI="
|
||||
12
.whitesource
Normal file
12
.whitesource
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"scanSettings": {
|
||||
"baseBranches": []
|
||||
},
|
||||
"checkRunSettings": {
|
||||
"vulnerableCheckRunConclusionLevel": "failure",
|
||||
"displayMode": "diff"
|
||||
},
|
||||
"issueSettings": {
|
||||
"minSeverityLevel": "LOW"
|
||||
}
|
||||
}
|
||||
54
CHANGELOG.md
54
CHANGELOG.md
@@ -5,18 +5,47 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
- Security: Added support to use auth token during initial connect to cloud
|
||||
- Fix re-registration fails that lose a socket
|
||||
- Fix mutex error in service alive
|
||||
- Security: Mutual Authentication (mTLS or two way TLS)
|
||||
- Rename command line options for MTLS cert and Key
|
||||
- Add additional HTTP headers for call to Themis from Convey
|
||||
- Add callback handler for initial cloud connection status change event
|
||||
- Fix Parodus connection stuck on interface up down received together
|
||||
- Update to use nopoll version 1.0.3
|
||||
|
||||
## [1.1.4]
|
||||
- on connect retry, requery jwt only if it failed before
|
||||
- put two timestamps in connection health file; start conn and current
|
||||
- change health file update interval to 240sec
|
||||
- use jitter in backoff delay
|
||||
- sendMessage to check cloud status == ONLINE before sending
|
||||
- when killed with SIGTERM, close will use msg in close reason file.
|
||||
|
||||
## [1.1.3]
|
||||
- Add callback handler for ping status change event
|
||||
- Fixed nopoll_conn_unref crash
|
||||
- Update retry timestamp in connection-health-file
|
||||
- fix so that parodus can be killed, even if in a connection fail loop
|
||||
- provide signal handlers so we shut down properly when INCLUDE_BREAKPAD active
|
||||
- send status code and reason in websocket close message
|
||||
- dont try to install handler for signal 9
|
||||
|
||||
## [1.1.2]
|
||||
- Add pause/resume heartBeatTimer
|
||||
- parodus event handler to listen to interface_down and interface_up event
|
||||
- Pause connection retry during interface_down event
|
||||
|
||||
## [1.1.1]
|
||||
- Update to use nanomsg v. 1.1.4
|
||||
- requestNewAuthToken will clear the token if it fails.
|
||||
- request auth token on every retry, not just after 403
|
||||
- update to use nopoll v 1.0.2
|
||||
- Add pause/resume heartBeatTimer
|
||||
- parodus event handler to listen to interface_down and interface_up event
|
||||
- Pause connection retry during interface_down event
|
||||
|
||||
## [1.0.4]
|
||||
- Fix re-registration fails that lose a socket
|
||||
- Fix mutex error in service alive
|
||||
- Security: Mutual Authentication (mTLS or two way TLS)
|
||||
- Rename command line options for MTLS cert and Key
|
||||
|
||||
## [1.0.3]
|
||||
- Security: Added support to use auth token during initial connect to cloud
|
||||
|
||||
## [1.0.2] - 2019-02-08
|
||||
- Refactored connection.c and updated corresponding unit tests
|
||||
@@ -66,6 +95,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
|
||||
### Security
|
||||
- Added command line arguments for secure token read and acquire. Token presented to cloud for authentication verification.
|
||||
- Added support for override functions to support drop root capabilities for parodus process
|
||||
|
||||
## [1.0.0] - 2017-11-17
|
||||
### Added
|
||||
@@ -75,7 +105,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||
### Added
|
||||
- Initial creation
|
||||
|
||||
[Unreleased]: https://github.com/Comcast/parodus/compare/1.0.1...HEAD
|
||||
[Unreleased]: https://github.com/Comcast/parodus/compare/1.1.4...HEAD
|
||||
[1.1.4]: https://github.com/Comcast/parodus/compare/1.1.3...1.1.4
|
||||
[1.1.3]: https://github.com/Comcast/parodus/compare/1.1.2...1.1.3
|
||||
[1.1.2]: https://github.com/Comcast/parodus/compare/1.1.1...1.1.2
|
||||
[1.1.1]: https://github.com/Comcast/parodus/compare/1.0.4...1.1.1
|
||||
[1.0.4]: https://github.com/Comcast/parodus/compare/1.0.3...1.0.4
|
||||
[1.0.3]: https://github.com/Comcast/parodus/compare/1.0.2...1.0.3
|
||||
[1.0.2]: https://github.com/Comcast/parodus/compare/1.0.1...1.0.2
|
||||
[1.0.1]: https://github.com/Comcast/parodus/compare/1.0.0...1.0.1
|
||||
[1.0.0]: https://github.com/Comcast/parodus/compare/79fa7438de2b14ae64f869d52f5c127497bf9c3f...1.0.0
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.7)
|
||||
|
||||
#project(parodus VERSION 1.1.15)
|
||||
project(parodus)
|
||||
|
||||
include(ExternalProject)
|
||||
@@ -42,6 +43,13 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/cjwt
|
||||
)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
include_directories(${INCLUDE_DIR}/rbus
|
||||
${INCLUDE_DIR}/rbus-core
|
||||
${INCLUDE_DIR}/rtmessage
|
||||
)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
# Get git commit hash
|
||||
#-------------------------------------------------------------------------------
|
||||
execute_process(
|
||||
@@ -85,7 +93,7 @@ add_dependencies(libtrower-base64 trower-base64)
|
||||
ExternalProject_Add(nopoll
|
||||
PREFIX ${PREFIX_DIR}/nopoll
|
||||
GIT_REPOSITORY https://github.com/Comcast/nopoll.git
|
||||
GIT_TAG "1.0.2"
|
||||
GIT_TAG "1.0.3"
|
||||
CONFIGURE_COMMAND COMMAND <SOURCE_DIR>/autogen.sh --prefix=${PREFIX}
|
||||
--includedir=${INCLUDE_DIR}
|
||||
--libdir=${LIBRARY_DIR}
|
||||
@@ -164,8 +172,8 @@ add_dependencies(libcimplog cimplog)
|
||||
ExternalProject_Add(wrp-c
|
||||
DEPENDS trower-base64 msgpack cimplog
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c
|
||||
GIT_REPOSITORY https://github.com/Comcast/wrp-c.git
|
||||
GIT_TAG "1.0.1"
|
||||
GIT_REPOSITORY https://github.com/xmidt-org/wrp-c.git
|
||||
GIT_TAG "71f8a39fe39f98da007ed4cdabbb192be1da1685"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
-DMSGPACK_ENABLE_CXX=OFF
|
||||
-DMSGPACK_BUILD_EXAMPLES=OFF
|
||||
@@ -228,6 +236,51 @@ include_directories(${INCLUDE_DIR}
|
||||
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
# rtMessage external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(rtMessage
|
||||
DEPENDS cJSON
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rtMessage
|
||||
GIT_REPOSITORY https://github.com/rdkcmf/rdk-rtmessage.git
|
||||
GIT_TAG rdk-next
|
||||
CMAKE_ARGS += -DBUILD_RTMESSAGE_LIB=ON
|
||||
-DBUILD_RTMESSAGE_SAMPLE_APP=ON
|
||||
-DBUILD_FOR_DESKTOP=OFF
|
||||
-DCJSON_BUILD=OFF
|
||||
-DBUILD_DATAPROVIDER_LIB=ON
|
||||
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(librtMessage STATIC SHARED IMPORTED)
|
||||
add_dependencies(librtMessage rtMessage)
|
||||
|
||||
# rbus-core external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(rbus-core
|
||||
DEPENDS rtMessage
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus-core
|
||||
GIT_REPOSITORY https://github.com/rdkcmf/rbuscore.git
|
||||
GIT_TAG rdk-next
|
||||
CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
-DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(librbus-core STATIC SHARED IMPORTED)
|
||||
add_dependencies(librbus-core rbus-core)
|
||||
|
||||
# rbus external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(rbus
|
||||
DEPENDS rtMessage rbus-core
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus
|
||||
GIT_REPOSITORY https://github.com/rdkcmf/rbus.git
|
||||
GIT_TAG rdk-next
|
||||
CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
|
||||
add_library(librbus STATIC SHARED IMPORTED)
|
||||
add_dependencies(librbus rbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if (BUILD_TESTING)
|
||||
# cmocka external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -252,6 +305,14 @@ if (FEATURE_DNS_QUERY)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFEATURE_DNS_QUERY ")
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_WEBCFGBIN ")
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if (WAN_FAILOVER_SUPPORTED)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWAN_FAILOVER_SUPPORTED ")
|
||||
endif (WAN_FAILOVER_SUPPORTED)
|
||||
|
||||
link_directories ( ${LIBRARY_DIR} ${COMMON_LIBRARY_DIR} ${LIBRARY_DIR64} )
|
||||
add_subdirectory(src)
|
||||
if (BUILD_TESTING)
|
||||
|
||||
14
README.md
14
README.md
@@ -1,10 +1,16 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2016-2021 Comcast Cable Communications Management, LLC
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
-->
|
||||
# parodus
|
||||
|
||||
[](https://travis-ci.org/xmidt-org/parodus)
|
||||
[](http://codecov.io/github/Comcast/parodus?branch=master)
|
||||
[](https://github.com/xmidt-org/parodus/actions)
|
||||
[](http://codecov.io/github/xmidt-org/parodus?branch=master)
|
||||
[](https://scan.coverity.com/projects/comcast-parodus)
|
||||
[](https://github.com/Comcast/parodus/blob/master/LICENSE)
|
||||
[](CHANGELOG.md)
|
||||
[](https://sonarcloud.io/dashboard?id=xmidt-org_parodus)
|
||||
[](https://lgtm.com/projects/g/xmidt-org/parodus/context:cpp)
|
||||
[](https://github.com/xmidt-org/parodus/blob/master/LICENSE)
|
||||
[](CHANGELOG.md)
|
||||
|
||||
|
||||
C implementation of the XMiDT client coordinator
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
set(SOURCES main.c mutex.c networking.c nopoll_helpers.c heartBeat.c nopoll_handlers.c
|
||||
ParodusInternal.c string_helpers.c time.c config.c conn_interface.c
|
||||
connection.c spin_thread.c client_list.c service_alive.c
|
||||
upstream.c downstream.c thread_tasks.c partners_check.c token.c
|
||||
crud_interface.c crud_tasks.c crud_internal.c close_retry.c auth_token.c)
|
||||
upstream.c downstream.c thread_tasks.c partners_check.c token.c event_handler.c
|
||||
crud_interface.c crud_tasks.c crud_internal.c close_retry.c auth_token.c privilege.c)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} seshat_interface.c)
|
||||
@@ -23,6 +23,15 @@ else()
|
||||
set(SOURCES ${SOURCES} seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(SOURCES ${SOURCES} upstream_rbus.c xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if (WAN_FAILOVER_SUPPORTED)
|
||||
message(STATUS "WAN_FAILOVER_SUPPORTED is supported")
|
||||
else()
|
||||
message(STATUS "WAN_FAILOVER_SUPPORTED is not supported")
|
||||
endif (WAN_FAILOVER_SUPPORTED)
|
||||
|
||||
add_executable(parodus ${SOURCES})
|
||||
|
||||
@@ -53,5 +62,7 @@ if (ENABLE_SESHAT)
|
||||
target_link_libraries (parodus -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
target_link_libraries (parodus -lrbus -lrbus-core -lrtMessage)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
install (TARGETS parodus DESTINATION bin)
|
||||
|
||||
@@ -69,9 +69,9 @@ char* getWebpaConveyHeader()
|
||||
cJSON_AddStringToObject(response, WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol);
|
||||
}
|
||||
|
||||
if(strlen(get_parodus_cfg()->webpa_interface_used)!=0)
|
||||
if(strlen(getWebpaInterface())!=0)
|
||||
{
|
||||
cJSON_AddStringToObject(response, WEBPA_INTERFACE, get_parodus_cfg()->webpa_interface_used);
|
||||
cJSON_AddStringToObject(response, WEBPA_INTERFACE, getWebpaInterface());
|
||||
}
|
||||
|
||||
if(strlen(get_parodus_cfg()->hw_last_reboot_reason)!=0)
|
||||
@@ -131,6 +131,27 @@ char* getWebpaConveyHeader()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int readFromFile(const char *file_name, char **data)
|
||||
{
|
||||
FILE *fp;
|
||||
int ch_count = 0;
|
||||
fp = fopen(file_name, "r+");
|
||||
if (fp == NULL)
|
||||
{
|
||||
ParodusError("Failed to open file %s (errno %d)\n", file_name, errno);
|
||||
return 0;
|
||||
}
|
||||
fseek(fp, 0, SEEK_END);
|
||||
ch_count = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
*data = (char *) malloc(sizeof(char) * (ch_count + 1));
|
||||
fread(*data, 1, ch_count,fp);
|
||||
(*data)[ch_count] ='\0';
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *diff)
|
||||
{
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
#define UNUSED(x) (void )(x)
|
||||
#define NANO_SOCKET_SEND_TIMEOUT_MS 2000
|
||||
#define NANO_SOCKET_RCV_TIMEOUT_MS 500
|
||||
@@ -107,6 +108,8 @@ typedef struct {
|
||||
|
||||
//--- Used in connection.c for backoff delay timer
|
||||
typedef struct {
|
||||
unsigned long start_time;
|
||||
struct timespec ts;
|
||||
int count;
|
||||
int max_count;
|
||||
int delay;
|
||||
@@ -124,7 +127,7 @@ typedef struct {
|
||||
// wait_connection_ready, and nopoll_connect
|
||||
typedef struct {
|
||||
noPollCtx *nopoll_ctx;
|
||||
server_list_t server_list;
|
||||
server_list_t *server_list;
|
||||
server_t *current_server;
|
||||
header_info_t header_info;
|
||||
char *extra_headers; // need to be freed
|
||||
@@ -136,7 +139,6 @@ typedef struct {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
extern bool g_shutdown;
|
||||
extern ParodusMsg *ParodusMsgQ;
|
||||
int numLoops;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -154,10 +156,18 @@ char* getWebpaConveyHeader();
|
||||
void *CRUDHandlerTask();
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg);
|
||||
|
||||
int readFromFile(const char *file_name, char **data);
|
||||
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *result);
|
||||
|
||||
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
void subscribeRBUSevent();
|
||||
int regXmidtSendDataMethod();
|
||||
#endif
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void setWebpaInterface(char *value);
|
||||
#endif
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* For interface_down_event Flag */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
@@ -174,8 +184,11 @@ void set_interface_down_event();
|
||||
pthread_cond_t *get_interface_down_con();
|
||||
|
||||
pthread_mutex_t *get_interface_down_mut();
|
||||
|
||||
|
||||
pthread_cond_t *get_global_cloud_status_cond(void);
|
||||
|
||||
pthread_mutex_t *get_global_cloud_status_mut(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
130
src/auth_token.c
130
src/auth_token.c
@@ -24,6 +24,7 @@
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include "config.h"
|
||||
#include "connection.h"
|
||||
#include "auth_token.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include <cjwt/cjwt.h>
|
||||
@@ -31,16 +32,22 @@
|
||||
#include <curl/curl.h>
|
||||
#include <uuid/uuid.h>
|
||||
|
||||
#define MAX_BUF_SIZE 128
|
||||
#define MAX_BUF_SIZE 256
|
||||
#define CURL_TIMEOUT_SEC 25L
|
||||
#define MAX_CURL_RETRY_COUNT 3
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void createCurlheader(char *mac_header, char *serial_header, char *uuid_header, char *transaction_uuid, struct curl_slist *list, struct curl_slist **header_list);
|
||||
void createCurlheader(struct curl_slist *list, struct curl_slist **header_list);
|
||||
long g_response_code;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int getGlobalResponseCode()
|
||||
{
|
||||
return g_response_code;
|
||||
}
|
||||
/*
|
||||
* @brief Initialize curl object with required options. create newToken using libcurl.
|
||||
* @param[out] newToken auth token string obtained from JWT curl response
|
||||
@@ -57,12 +64,8 @@ int requestNewAuthToken(char *newToken, size_t len, int r_count)
|
||||
struct curl_slist *list = NULL;
|
||||
struct curl_slist *headers_list = NULL;
|
||||
|
||||
char *mac_header = NULL;
|
||||
char *serial_header = NULL;
|
||||
char *uuid_header = NULL;
|
||||
char *transaction_uuid = NULL;
|
||||
char webpa_interface[64]={'\0'};
|
||||
double total;
|
||||
long response_code;
|
||||
|
||||
struct token_data data;
|
||||
data.size = 0;
|
||||
@@ -73,14 +76,15 @@ int requestNewAuthToken(char *newToken, size_t len, int r_count)
|
||||
{
|
||||
data.data[0] = '\0';
|
||||
|
||||
createCurlheader(mac_header, serial_header, uuid_header, transaction_uuid, list, &headers_list);
|
||||
createCurlheader(list, &headers_list);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, get_parodus_cfg()->token_server_url);
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, CURL_TIMEOUT_SEC);
|
||||
|
||||
if(get_parodus_cfg()->webpa_interface_used !=NULL && strlen(get_parodus_cfg()->webpa_interface_used) >0)
|
||||
parStrncpy(webpa_interface, getWebpaInterface(), sizeof(webpa_interface));
|
||||
if(webpa_interface !=NULL && strlen(webpa_interface) >0)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, get_parodus_cfg()->webpa_interface_used);
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, webpa_interface);
|
||||
}
|
||||
/* set callback for writing received data */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_fn);
|
||||
@@ -118,8 +122,8 @@ int requestNewAuthToken(char *newToken, size_t len, int r_count)
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
|
||||
ParodusInfo("themis curl response %d http_code %d\n", res, response_code);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &g_response_code);
|
||||
ParodusInfo("themis curl response %d http_code %d\n", res, g_response_code);
|
||||
|
||||
time_res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total);
|
||||
if(time_res == 0)
|
||||
@@ -137,10 +141,18 @@ int requestNewAuthToken(char *newToken, size_t len, int r_count)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(response_code == 200)
|
||||
if(getGlobalResponseCode() == 200)
|
||||
{
|
||||
ParodusInfo("cURL success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed response from auth token server %s\n", data.data);
|
||||
curl_easy_cleanup(curl);
|
||||
data.size = 0;
|
||||
memset (data.data, 0, len);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
@@ -251,52 +263,60 @@ char* generate_trans_uuid()
|
||||
}
|
||||
|
||||
/* @brief function to create curl header contains mac, serial number and uuid.
|
||||
* @param[in] mac_header mac address header key value pair
|
||||
* @param[in] serial_header serial number key value pair
|
||||
* @param[in] uuid_header transaction uuid key value pair
|
||||
* @param[in] h the auth headers to populate
|
||||
* @param[in] list temp curl header list
|
||||
* @param[out] header_list output curl header list
|
||||
*/
|
||||
void createCurlheader(char *mac_header, char *serial_header, char *uuid_header, char *transaction_uuid, struct curl_slist *list, struct curl_slist **header_list)
|
||||
void createCurlheader(struct curl_slist *list, struct curl_slist **header_list)
|
||||
{
|
||||
mac_header = (char *) malloc(sizeof(char)*MAX_BUF_SIZE);
|
||||
if(mac_header !=NULL)
|
||||
{
|
||||
snprintf(mac_header, MAX_BUF_SIZE, "X-Midt-Mac-Address: %s", get_parodus_cfg()->hw_mac);
|
||||
ParodusPrint("mac_header formed %s\n", mac_header);
|
||||
list = curl_slist_append(list, mac_header);
|
||||
free(mac_header);
|
||||
mac_header = NULL;
|
||||
}
|
||||
char buf[MAX_BUF_SIZE];
|
||||
char *uuid = NULL;
|
||||
|
||||
serial_header = (char *) malloc(sizeof(char)*MAX_BUF_SIZE);
|
||||
if(serial_header !=NULL)
|
||||
{
|
||||
snprintf(serial_header, MAX_BUF_SIZE, "X-Midt-Serial-Number: %s", get_parodus_cfg()->hw_serial_number);
|
||||
ParodusPrint("serial_header formed %s\n", serial_header);
|
||||
list = curl_slist_append(list, serial_header);
|
||||
free(serial_header);
|
||||
serial_header = NULL;
|
||||
}
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Mac-Address: %s", get_parodus_cfg()->hw_mac);
|
||||
ParodusPrint("mac_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
transaction_uuid = generate_trans_uuid();
|
||||
if(transaction_uuid !=NULL)
|
||||
{
|
||||
uuid_header = (char *) malloc(sizeof(char)*MAX_BUF_SIZE);
|
||||
if(uuid_header !=NULL)
|
||||
{
|
||||
snprintf(uuid_header, MAX_BUF_SIZE, "X-Midt-Uuid: %s", transaction_uuid);
|
||||
ParodusInfo("uuid_header formed %s\n", uuid_header);
|
||||
list = curl_slist_append(list, uuid_header);
|
||||
free(transaction_uuid);
|
||||
transaction_uuid = NULL;
|
||||
free(uuid_header);
|
||||
uuid_header = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to generate transaction_uuid\n");
|
||||
}
|
||||
*header_list = list;
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Serial-Number: %s", get_parodus_cfg()->hw_serial_number);
|
||||
ParodusPrint("serial_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
uuid = generate_trans_uuid();
|
||||
if(uuid !=NULL) {
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Uuid: %s", uuid);
|
||||
ParodusInfo("uuid_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
free(uuid);
|
||||
} else {
|
||||
ParodusError("Failed to generate transaction_uuid\n");
|
||||
}
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Partner-Id: %s", get_parodus_cfg()->partner_id);
|
||||
ParodusInfo("partnerid_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Hardware-Model: %s", get_parodus_cfg()->hw_model);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Hardware-Manufacturer: %s", get_parodus_cfg()->hw_manufacturer);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Firmware-Name: %s", get_parodus_cfg()->fw_name);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Protocol: %s", get_parodus_cfg()->webpa_protocol);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Interface-Used: %s", getWebpaInterface());
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Last-Reboot-Reason: %s", get_parodus_cfg()->hw_last_reboot_reason);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Last-Reconnect-Reason: %s", get_global_reconnect_reason());
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Boot-Retry-Wait: %d", get_parodus_cfg()->boot_retry_wait);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
*header_list = list;
|
||||
}
|
||||
|
||||
@@ -294,3 +294,24 @@ int sendMsgtoRegisteredClients(char *dest,const char **Msg,size_t msgSize)
|
||||
release_global_node ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
//To check client registration status with parodus.
|
||||
int checkClientStatus(char *serviceName)
|
||||
{
|
||||
reg_list_item_t *temp = NULL;
|
||||
temp = get_global_node();
|
||||
while (NULL != temp)
|
||||
{
|
||||
ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name);
|
||||
// Sending message to registered clients
|
||||
if( strcmp(serviceName, temp->service_name) == 0)
|
||||
{
|
||||
release_global_node ();
|
||||
return 1;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
release_global_node ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ int sendMsgtoRegisteredClients(char *dest,const char **Msg,size_t msgSize);
|
||||
|
||||
reg_list_item_t * get_global_node(void);
|
||||
void release_global_node (void);
|
||||
|
||||
int checkClientStatus();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
106
src/config.c
106
src/config.c
@@ -33,13 +33,30 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
//For sending cond signal when cloud status is ONLINE
|
||||
pthread_mutex_t cloud_status_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t cloud_status_cond=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
char webpa_interface[64]={'\0'};
|
||||
|
||||
char cloud_status[32]={'\0'};
|
||||
static ParodusCfg parodusCfg;
|
||||
static unsigned int rsa_algorithms =
|
||||
(1<<alg_rs256) | (1<<alg_rs384) | (1<<alg_rs512);
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
pthread_cond_t *get_global_cloud_status_cond(void)
|
||||
{
|
||||
return &cloud_status_cond;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_cloud_status_mut(void)
|
||||
{
|
||||
return &cloud_status_mut;
|
||||
}
|
||||
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
@@ -61,6 +78,27 @@ void reset_cloud_disconnect_reason(ParodusCfg *cfg)
|
||||
cfg->cloud_disconnect = NULL;
|
||||
}
|
||||
|
||||
void set_cloud_status(char *status)
|
||||
{
|
||||
if(status != NULL)
|
||||
{
|
||||
pthread_mutex_lock(&config_mut);
|
||||
get_parodus_cfg()->cloud_status = status;
|
||||
if(strcmp (status, CLOUD_STATUS_ONLINE) == 0)
|
||||
{
|
||||
pthread_cond_signal(&cloud_status_cond);
|
||||
}
|
||||
pthread_mutex_unlock(&config_mut);
|
||||
}
|
||||
}
|
||||
|
||||
char *get_cloud_status(void)
|
||||
{
|
||||
pthread_mutex_lock(&config_mut);
|
||||
parStrncpy(cloud_status, get_parodus_cfg()->cloud_status, sizeof(cloud_status));
|
||||
pthread_mutex_unlock(&config_mut);
|
||||
return cloud_status;
|
||||
}
|
||||
|
||||
const char *get_tok (const char *src, int delim, char *result, int resultsize)
|
||||
{
|
||||
@@ -146,9 +184,9 @@ void read_key_from_file (const char *fname, char *buf, size_t buflen)
|
||||
int parse_mac_address (char *target, const char *arg)
|
||||
{
|
||||
int count = 0;
|
||||
int i;
|
||||
int i, j;
|
||||
char c;
|
||||
|
||||
char *mac = target;
|
||||
for (i=0; (c=arg[i]) != 0; i++) {
|
||||
if (c !=':')
|
||||
count++;
|
||||
@@ -160,6 +198,13 @@ int parse_mac_address (char *target, const char *arg)
|
||||
*(target++) = c;
|
||||
}
|
||||
*target = 0; // terminating null
|
||||
|
||||
//convert mac to lowercase
|
||||
for(j = 0; mac[j]; j++)
|
||||
{
|
||||
mac[j] = tolower(mac[j]);
|
||||
}
|
||||
ParodusPrint("mac in lowercase is %s\n", mac);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -214,8 +259,13 @@ int parse_webpa_url__ (const char *full_url,
|
||||
if(openBracket != NULL){
|
||||
//Remove [ from server address
|
||||
char *remove = server_addr;
|
||||
int i;
|
||||
|
||||
// Strings can overlap, so don't use strncpy()
|
||||
remove++;
|
||||
parStrncpy (server_addr, remove, server_addr_buflen);
|
||||
for( i = 0; i < server_addr_buflen; i++ ) {
|
||||
server_addr[i] = remove[i];
|
||||
}
|
||||
closeBracket = strchr(server_addr,']');
|
||||
if(closeBracket != NULL){
|
||||
//Remove ] by making it as null
|
||||
@@ -366,6 +416,7 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
{"token-server-url", required_argument, 0, 'U'},
|
||||
{"crud-config-file", required_argument, 0, 'C'},
|
||||
{"connection-health-file", required_argument, 0, 'S'},
|
||||
{"close-reason-file", required_argument, 0, 'R'},
|
||||
{"mtls-client-key-path", required_argument, 0, 'K'},
|
||||
{"mtls-client-cert-path", required_argument, 0,'M'},
|
||||
{0, 0, 0, 0}
|
||||
@@ -384,6 +435,7 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
parStrncpy (cfg->jwt_key, "", sizeof(cfg->jwt_key));
|
||||
cfg->crud_config_file = NULL;
|
||||
cfg->connection_health_file = NULL;
|
||||
cfg->close_reason_file = NULL;
|
||||
cfg->client_cert_path = NULL;
|
||||
cfg->token_server_url = NULL;
|
||||
cfg->cloud_status = NULL;
|
||||
@@ -394,8 +446,9 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
|
||||
/* getopt_long stores the option index here. */
|
||||
int option_index = 0;
|
||||
c = getopt_long (argc, argv, "m:s:f:d:r:n:b:u:t:o:i:l:p:e:D:j:a:k:c:T:w:J:46:C:S:K:M",
|
||||
long_options, &option_index);
|
||||
c = getopt_long (argc, argv,
|
||||
"m:s:f:d:r:n:b:u:t:o:i:l:p:e:D:j:a:k:c:T:w:J:46:C:S:R:K:M",
|
||||
long_options, &option_index);
|
||||
|
||||
/* Detect the end of the options. */
|
||||
if (c == -1)
|
||||
@@ -538,17 +591,22 @@ int parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
ParodusInfo("connection_health_file is %s\n", cfg->connection_health_file);
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
cfg->close_reason_file = strdup(optarg);
|
||||
ParodusInfo("sigterm_close_reason_file is %s\n", cfg->close_reason_file);
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
cfg->crud_config_file = strdup(optarg);
|
||||
ParodusInfo("crud_config_file is %s\n", cfg->crud_config_file);
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
case 'P':
|
||||
cfg->client_cert_path = strdup(optarg);
|
||||
ParodusInfo("client_cert_path is %s\n", cfg->client_cert_path);
|
||||
break;
|
||||
|
||||
case 'U':
|
||||
case 'U':
|
||||
cfg->token_server_url = strdup(optarg);
|
||||
ParodusInfo("token_server_url is %s\n", cfg->token_server_url);
|
||||
break;
|
||||
@@ -637,6 +695,7 @@ void setDefaultValuesToCfg(ParodusCfg *cfg)
|
||||
ParodusPrint("cfg->webpa_uuid is :%s\n", cfg->webpa_uuid);
|
||||
cfg->crud_config_file = NULL;
|
||||
cfg->connection_health_file = NULL;
|
||||
cfg->close_reason_file = NULL;
|
||||
cfg->client_cert_path = NULL;
|
||||
cfg->token_server_url = NULL;
|
||||
|
||||
@@ -710,7 +769,7 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
if(strlen(config->webpa_interface_used )!=0)
|
||||
{
|
||||
parStrncpy(cfg->webpa_interface_used, config->webpa_interface_used,sizeof(cfg->webpa_interface_used));
|
||||
parStrncpy(getWebpaInterface(), config->webpa_interface_used,sizeof(getWebpaInterface()));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -797,6 +856,15 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
ParodusPrint("connection_health_file is NULL. set to empty\n");
|
||||
}
|
||||
|
||||
if(config->close_reason_file != NULL)
|
||||
{
|
||||
cfg->close_reason_file = strdup(config->close_reason_file);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("close_reason_file is NULL. set to empty\n");
|
||||
}
|
||||
|
||||
if(config->crud_config_file != NULL)
|
||||
{
|
||||
cfg->crud_config_file = strdup(config->crud_config_file);
|
||||
@@ -825,4 +893,26 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void setWebpaInterface(char *value)
|
||||
{
|
||||
pthread_mutex_lock (&config_mut);
|
||||
parStrncpy(get_parodus_cfg()->webpa_interface_used, value, sizeof(get_parodus_cfg()->webpa_interface_used));
|
||||
pthread_mutex_unlock (&config_mut);
|
||||
}
|
||||
#endif
|
||||
|
||||
char *getWebpaInterface(void)
|
||||
{
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n");
|
||||
pthread_mutex_lock (&config_mut);
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
pthread_mutex_unlock (&config_mut);
|
||||
#else
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
#endif
|
||||
ParodusPrint("webpa_interface:%s\n", webpa_interface);
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
#include <pthread.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -75,7 +76,7 @@ typedef struct
|
||||
char hw_serial_number[64];
|
||||
char hw_manufacturer[64];
|
||||
char hw_mac[64];
|
||||
char hw_last_reboot_reason[64];
|
||||
char hw_last_reboot_reason[128];
|
||||
char fw_name[64];
|
||||
unsigned int boot_time;
|
||||
unsigned int webpa_ping_timeout;
|
||||
@@ -102,6 +103,7 @@ typedef struct
|
||||
char *client_cert_path;
|
||||
char *token_server_url;
|
||||
char *connection_health_file;
|
||||
char *close_reason_file;
|
||||
char *mtls_client_key_path;
|
||||
char *mtls_client_cert_path;
|
||||
char *crud_config_file;
|
||||
@@ -138,6 +140,10 @@ void set_parodus_cfg(ParodusCfg *);
|
||||
char *get_token_application(void) ;
|
||||
void set_cloud_disconnect_reason(ParodusCfg *cfg, char *disconn_reason);
|
||||
void reset_cloud_disconnect_reason(ParodusCfg *cfg);
|
||||
char *getWebpaInterface(void);
|
||||
void set_cloud_status(char *status);
|
||||
char *get_cloud_status(void);
|
||||
|
||||
/**
|
||||
* parse a webpa url. Extract the server address, the port
|
||||
* and return whether it's secure or not
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include "spin_thread.h"
|
||||
#include "service_alive.h"
|
||||
#include "seshat_interface.h"
|
||||
#include "event_handler.h"
|
||||
#include "crud_interface.h"
|
||||
#include "heartBeat.h"
|
||||
#include "close_retry.h"
|
||||
@@ -73,8 +74,10 @@ void createSocketConnection(void (* initKeypress)())
|
||||
{
|
||||
//ParodusCfg *tmpCfg = (ParodusCfg*)config_in;
|
||||
noPollCtx *ctx;
|
||||
server_list_t server_list;
|
||||
bool seshat_registered = false;
|
||||
int create_conn_rtn = 0;
|
||||
int nopoll_returnvalue = 0;
|
||||
unsigned int webpa_ping_timeout_ms = 1000 * get_parodus_cfg()->webpa_ping_timeout;
|
||||
unsigned int heartBeatTimer = 0;
|
||||
struct timespec start_svc_alive_timer;
|
||||
@@ -95,9 +98,10 @@ void createSocketConnection(void (* initKeypress)())
|
||||
nopoll_log_set_handler (ctx, __report_log, NULL);
|
||||
#endif
|
||||
|
||||
start_conn_in_progress ();
|
||||
create_conn_rtn = createNopollConnection(ctx);
|
||||
stop_conn_in_progress ();
|
||||
EventHandler();
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
create_conn_rtn = createNopollConnection(ctx, &server_list);
|
||||
if(!create_conn_rtn)
|
||||
{
|
||||
ParodusError("Unrecovered error, terminating the process\n");
|
||||
@@ -109,6 +113,13 @@ void createSocketConnection(void (* initKeypress)())
|
||||
UpStreamMsgQ = NULL;
|
||||
StartThread(handle_upstream, &upstream_tid);
|
||||
StartThread(processUpstreamMessage, &upstream_msg_tid);
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
subscribeRBUSevent();
|
||||
regXmidtSendDataMethod();
|
||||
#endif
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
subscribeCurrentActiveInterfaceEvent();
|
||||
#endif
|
||||
ParodusMsgQ = NULL;
|
||||
StartThread(messageHandlerTask, &downstream_tid);
|
||||
StartThread(serviceAliveTask, &svc_alive_tid);
|
||||
@@ -128,14 +139,17 @@ void createSocketConnection(void (* initKeypress)())
|
||||
struct timespec start, stop, diff;
|
||||
int time_taken_ms;
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &start);
|
||||
nopoll_loop_wait(ctx, 5000000);
|
||||
clock_gettime(CLOCK_REALTIME, &stop);
|
||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||
nopoll_returnvalue = nopoll_loop_wait(ctx, 5000000);
|
||||
clock_gettime(CLOCK_MONOTONIC, &stop);
|
||||
|
||||
timespec_diff(&start, &stop, &diff);
|
||||
time_taken_ms = diff.tv_sec * 1000 + (diff.tv_nsec / 1000000);
|
||||
|
||||
// ParodusInfo("nopoll_loop_wait() time %d msec\n", time_taken_ms);
|
||||
if(time_taken_ms/1000 != 5)
|
||||
{
|
||||
ParodusInfo("nopoll_loop_wait value %d,nopoll_loop_wait() time %d msec\n",nopoll_returnvalue, time_taken_ms);
|
||||
}
|
||||
ParodusPrint("webpa_ping_timeout_ms %d msec\n", webpa_ping_timeout_ms);
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
if(heartBeatTimer >= webpa_ping_timeout_ms)
|
||||
{
|
||||
@@ -168,11 +182,15 @@ void createSocketConnection(void (* initKeypress)())
|
||||
if( false == seshat_registered ) {
|
||||
seshat_registered = __registerWithSeshat();
|
||||
}
|
||||
|
||||
if (get_interface_down_event ())
|
||||
if (0 != wait_while_interface_down ())
|
||||
break;
|
||||
|
||||
if(get_close_retry())
|
||||
{
|
||||
ParodusInfo("close_retry is %d, hence closing the connection and retrying\n", get_close_retry());
|
||||
close_and_unref_connection(get_global_conn());
|
||||
close_and_unref_connection(get_global_conn(), false);
|
||||
set_global_conn(NULL);
|
||||
|
||||
if(get_parodus_cfg()->cloud_disconnect !=NULL)
|
||||
@@ -186,11 +204,10 @@ void createSocketConnection(void (* initKeypress)())
|
||||
free(get_parodus_cfg()->cloud_disconnect);
|
||||
reset_cloud_disconnect_reason(get_parodus_cfg());
|
||||
}
|
||||
start_conn_in_progress ();
|
||||
createNopollConnection(ctx);
|
||||
stop_conn_in_progress ();
|
||||
createNopollConnection(ctx, &server_list);
|
||||
}
|
||||
} while(!get_close_retry() && !g_shutdown);
|
||||
//process exit only when g_shutdown is true.
|
||||
} while(FOREVER() && !g_shutdown);
|
||||
|
||||
pthread_mutex_lock (get_global_svc_mut());
|
||||
pthread_cond_signal (get_global_svc_con());
|
||||
@@ -214,13 +231,17 @@ void createSocketConnection(void (* initKeypress)())
|
||||
|
||||
deleteAllClients ();
|
||||
|
||||
close_and_unref_connection(get_global_conn());
|
||||
ParodusInfo ("reconnect reason at close %s\n", get_global_reconnect_reason());
|
||||
close_and_unref_connection(get_global_conn(), true);
|
||||
nopoll_ctx_unref(ctx);
|
||||
nopoll_cleanup_library();
|
||||
curl_global_cleanup();
|
||||
}
|
||||
|
||||
void shutdownSocketConnection(void) {
|
||||
void shutdownSocketConnection(char *reason) {
|
||||
set_global_shutdown_reason (reason);
|
||||
g_shutdown = true;
|
||||
reset_interface_down_event ();
|
||||
terminate_backoff_delay ();
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ extern UpStreamMsg *UpStreamMsgQ;
|
||||
* and creates the intial connection and manages the connection wait, close mechanisms.
|
||||
*/
|
||||
void createSocketConnection(void (* initKeypress)());
|
||||
void shutdownSocketConnection(void);
|
||||
void shutdownSocketConnection(char *reason);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
350
src/connection.c
350
src/connection.c
@@ -38,11 +38,38 @@
|
||||
|
||||
#define HTTP_CUSTOM_HEADER_COUNT 5
|
||||
#define INITIAL_CJWT_RETRY -2
|
||||
#define UPDATE_HEALTH_FILE_INTERVAL_SECS 240
|
||||
|
||||
/* Close codes defined in RFC 6455, section 11.7. */
|
||||
enum {
|
||||
CloseNormalClosure = 1000,
|
||||
CloseGoingAway = 1001,
|
||||
CloseProtocolError = 1002,
|
||||
CloseUnsupportedData = 1003,
|
||||
CloseNoStatus = 1005,
|
||||
CloseAbnormalClosure = 1006,
|
||||
CloseInvalidFramePayloadData = 1007,
|
||||
ClosePolicyViolation = 1008,
|
||||
CloseMessageTooBig = 1009,
|
||||
CloseMandatoryExtension = 1010,
|
||||
CloseInternalServerErr = 1011,
|
||||
CloseServiceRestart = 1012,
|
||||
CloseTryAgainLater = 1013,
|
||||
CloseTLSHandshake = 1015
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
parodusOnConnStatusChangeHandler on_conn_status_change;
|
||||
|
||||
parodusOnPingStatusChangeHandler on_ping_status_change;
|
||||
|
||||
pthread_mutex_t backoff_delay_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t backoff_delay_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
static char *shutdown_reason = SHUTDOWN_REASON_PARODUS_STOP; /* goes in the close message */
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
static int cloud_disconnect_max_time = 5;
|
||||
static noPollConn *g_conn = NULL;
|
||||
@@ -65,6 +92,16 @@ void set_global_conn(noPollConn *conn)
|
||||
g_conn = conn;
|
||||
}
|
||||
|
||||
char *get_global_shutdown_reason()
|
||||
{
|
||||
return shutdown_reason;
|
||||
}
|
||||
|
||||
void set_global_shutdown_reason(char *reason)
|
||||
{
|
||||
shutdown_reason = reason;
|
||||
}
|
||||
|
||||
char *get_global_reconnect_reason()
|
||||
{
|
||||
return reconnect_reason;
|
||||
@@ -199,30 +236,114 @@ void init_backoff_timer (backoff_timer_t *timer, int max_count)
|
||||
timer->count = 1;
|
||||
timer->max_count = max_count;
|
||||
timer->delay = 1;
|
||||
clock_gettime (CLOCK_REALTIME, &timer->ts);
|
||||
timer->start_time = time(NULL);
|
||||
}
|
||||
|
||||
int update_backoff_delay (backoff_timer_t *timer)
|
||||
unsigned update_backoff_delay (backoff_timer_t *timer)
|
||||
{
|
||||
if (timer->count < timer->max_count) {
|
||||
timer->count += 1;
|
||||
timer->delay = timer->delay + timer->delay + 1;
|
||||
// 3,7,15,31 ..
|
||||
}
|
||||
return timer->delay;
|
||||
return (unsigned) timer->delay;
|
||||
}
|
||||
|
||||
static void backoff_delay (backoff_timer_t *timer)
|
||||
void add_timespec (struct timespec *t1, struct timespec *t2)
|
||||
{
|
||||
update_backoff_delay (timer);
|
||||
t2->tv_sec += t1->tv_sec;
|
||||
t2->tv_nsec += t1->tv_nsec;
|
||||
if (t2->tv_nsec >= 1000000000) {
|
||||
t2->tv_sec += 1;
|
||||
t2->tv_nsec -= 1000000000;
|
||||
}
|
||||
}
|
||||
|
||||
// Update retry time for conn progress
|
||||
if(timer->count == timer->max_count)
|
||||
{
|
||||
start_conn_in_progress();
|
||||
unsigned calc_random_secs (int random_num, unsigned max_secs)
|
||||
{
|
||||
unsigned delay_secs = (unsigned) random_num & max_secs;
|
||||
if (delay_secs < 3)
|
||||
return delay_secs + 3;
|
||||
else
|
||||
return delay_secs;
|
||||
}
|
||||
|
||||
unsigned calc_random_nsecs (int random_num)
|
||||
{
|
||||
/* random _num is in range 0..2147483648 */
|
||||
unsigned n = (unsigned) random_num >> 1;
|
||||
/* n is in range 0..1073741824 */
|
||||
if (n < 1000000000)
|
||||
return n;
|
||||
return n - 1000000000;
|
||||
}
|
||||
|
||||
void calc_random_expiration (int random_num1, int random_num2, backoff_timer_t *timer, struct timespec *ts)
|
||||
{
|
||||
unsigned max_secs = update_backoff_delay (timer); // 3,7,15,31
|
||||
struct timespec ts_delay = {3, 0};
|
||||
|
||||
if (max_secs > 3) {
|
||||
ts_delay.tv_sec = calc_random_secs (random_num1, max_secs);
|
||||
ts_delay.tv_nsec = calc_random_nsecs (random_num2);
|
||||
}
|
||||
ParodusInfo("Waiting max delay %u backoffRetryTime %ld secs %ld usecs\n",
|
||||
max_secs, ts_delay.tv_sec, ts_delay.tv_nsec/1000);
|
||||
|
||||
/* Add delay to expire time */
|
||||
add_timespec (&ts_delay, ts);
|
||||
}
|
||||
|
||||
void terminate_backoff_delay (void)
|
||||
{
|
||||
pthread_mutex_lock (&backoff_delay_mut);
|
||||
pthread_cond_signal(&backoff_delay_con);
|
||||
pthread_mutex_unlock (&backoff_delay_mut);
|
||||
}
|
||||
|
||||
#define BACKOFF_ERR -1
|
||||
#define BACKOFF_SHUTDOWN 1
|
||||
#define BACKOFF_DELAY_TAKEN 0
|
||||
|
||||
void start_conn_in_progress (unsigned long start_time);
|
||||
|
||||
/* backoff_delay
|
||||
*
|
||||
* delays for the number of seconds specified in parameter timer
|
||||
* g_shutdown can break out of the delay.
|
||||
*
|
||||
* returns -1 pthread_cond_timedwait error
|
||||
* 1 shutdown
|
||||
* 0 delay taken
|
||||
*/
|
||||
static int backoff_delay (backoff_timer_t *timer)
|
||||
{
|
||||
struct timespec ts;
|
||||
int rtn;
|
||||
|
||||
// periodically update the health file.
|
||||
clock_gettime (CLOCK_REALTIME, &ts);
|
||||
if ((ts.tv_sec - timer->ts.tv_sec) >= UPDATE_HEALTH_FILE_INTERVAL_SECS) {
|
||||
start_conn_in_progress (timer->start_time);
|
||||
timer->ts.tv_sec += UPDATE_HEALTH_FILE_INTERVAL_SECS;
|
||||
}
|
||||
|
||||
calc_random_expiration (random(), random(), timer, &ts);
|
||||
|
||||
pthread_mutex_lock (&backoff_delay_mut);
|
||||
// The condition variable will only be set if we shut down.
|
||||
rtn = pthread_cond_timedwait (&backoff_delay_con, &backoff_delay_mut, &ts);
|
||||
pthread_mutex_unlock (&backoff_delay_mut);
|
||||
|
||||
if (g_shutdown)
|
||||
return BACKOFF_SHUTDOWN;
|
||||
if ((rtn != 0) && (rtn != ETIMEDOUT)) {
|
||||
ParodusError ("pthread_cond_timedwait error (%d) in backoff_delay.\n", rtn);
|
||||
return BACKOFF_ERR;
|
||||
}
|
||||
|
||||
ParodusInfo("Waiting with backoffRetryTime %d seconds\n", timer->delay);
|
||||
sleep (timer->delay);
|
||||
return BACKOFF_DELAY_TAKEN;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -300,7 +421,7 @@ char *build_extra_hdrs (header_info_t *header_info)
|
||||
//--------------------------------------------------------------------
|
||||
void set_current_server (create_connection_ctx_t *ctx)
|
||||
{
|
||||
ctx->current_server = get_current_server (&ctx->server_list);
|
||||
ctx->current_server = get_current_server (ctx->server_list);
|
||||
}
|
||||
|
||||
void free_extra_headers (create_connection_ctx_t *ctx)
|
||||
@@ -326,7 +447,8 @@ void free_connection_ctx (create_connection_ctx_t *ctx)
|
||||
{
|
||||
free_extra_headers (ctx);
|
||||
free_header_info (&ctx->header_info);
|
||||
free_server_list (&ctx->server_list);
|
||||
if (NULL != ctx->server_list)
|
||||
free_server_list (ctx->server_list);
|
||||
}
|
||||
|
||||
|
||||
@@ -343,8 +465,10 @@ int find_servers (server_list_t *server_list)
|
||||
|
||||
free_server_list (server_list);
|
||||
// parse default server URL
|
||||
if (parse_server_url (get_parodus_cfg()->webpa_url, default_server) < 0)
|
||||
return FIND_INVALID_DEFAULT; // must have valid default url
|
||||
if (parse_server_url (get_parodus_cfg()->webpa_url, default_server) < 0) {
|
||||
ParodusError ("Invalid Default URL\n");
|
||||
return FIND_INVALID_DEFAULT;
|
||||
}
|
||||
ParodusInfo("default server_Address %s\n", default_server->server_addr);
|
||||
ParodusInfo("default port %u\n", default_server->port);
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
@@ -362,7 +486,6 @@ int find_servers (server_list_t *server_list)
|
||||
return FIND_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// connect to current server
|
||||
int nopoll_connect (create_connection_ctx_t *ctx, int is_ipv6)
|
||||
@@ -436,12 +559,12 @@ int wait_connection_ready (create_connection_ctx_t *ctx)
|
||||
if(wait_status == 307 || wait_status == 302 || wait_status == 303) // only when there is a http redirect
|
||||
{
|
||||
char *redirect_ptr = redirectURL;
|
||||
ParodusError("Received temporary redirection response message %s\n", redirectURL);
|
||||
ParodusInfo("Received temporary redirection response message %s\n", redirectURL);
|
||||
// Extract server Address and port from the redirectURL
|
||||
if (strncmp (redirect_ptr, "Redirect:", 9) == 0)
|
||||
redirect_ptr += 9;
|
||||
free_server (&ctx->server_list.redirect);
|
||||
if (parse_server_url (redirect_ptr, &ctx->server_list.redirect) < 0) {
|
||||
free_server (&ctx->server_list->redirect);
|
||||
if (parse_server_url (redirect_ptr, &ctx->server_list->redirect) < 0) {
|
||||
ParodusError ("Redirect url error %s\n", redirectURL);
|
||||
free (redirectURL);
|
||||
return WAIT_FAIL;
|
||||
@@ -470,7 +593,7 @@ int wait_connection_ready (create_connection_ctx_t *ctx)
|
||||
// Return codes for connect_and_wait
|
||||
#define CONN_WAIT_SUCCESS 0
|
||||
#define CONN_WAIT_ACTION_RETRY 1 // if wait_status is 307, 302, 303, or 403
|
||||
#define CONN_WAIT_RETRY_DNS 2
|
||||
#define CONN_WAIT_FAIL 2
|
||||
|
||||
int connect_and_wait (create_connection_ctx_t *ctx)
|
||||
{
|
||||
@@ -501,7 +624,7 @@ int connect_and_wait (create_connection_ctx_t *ctx)
|
||||
} // nopoll_connected
|
||||
|
||||
if (nopoll_connected) {
|
||||
close_and_unref_connection(get_global_conn());
|
||||
close_and_unref_connection(get_global_conn(), false);
|
||||
set_global_conn(NULL);
|
||||
}
|
||||
|
||||
@@ -514,7 +637,7 @@ int connect_and_wait (create_connection_ctx_t *ctx)
|
||||
continue;
|
||||
}
|
||||
|
||||
return CONN_WAIT_RETRY_DNS;
|
||||
return CONN_WAIT_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -527,7 +650,7 @@ int keep_trying_to_connect (create_connection_ctx_t *ctx,
|
||||
{
|
||||
int rtn;
|
||||
|
||||
while (true)
|
||||
while (!g_shutdown)
|
||||
{
|
||||
set_extra_headers (ctx);
|
||||
|
||||
@@ -537,13 +660,52 @@ int keep_trying_to_connect (create_connection_ctx_t *ctx,
|
||||
|
||||
if (rtn == CONN_WAIT_ACTION_RETRY) // if redirected or build_headers
|
||||
continue;
|
||||
backoff_delay (backoff_timer); // 3,7,15,31 ..
|
||||
if (rtn == CONN_WAIT_RETRY_DNS)
|
||||
return false; //find_server again
|
||||
// If interface down event is set, stop retry
|
||||
// and wait till interface is up again.
|
||||
if(get_interface_down_event()) {
|
||||
if (0 != wait_while_interface_down())
|
||||
return false;
|
||||
start_conn_in_progress(backoff_timer->start_time);
|
||||
ParodusInfo("Interface is back up, re-initializing the convey header\n");
|
||||
// Reset the reconnect reason by initializing the convey header again
|
||||
((header_info_t *)(&ctx->header_info))->conveyHeader = getWebpaConveyHeader();
|
||||
ParodusInfo("Received reconnect_reason as:%s\n", reconnect_reason);
|
||||
} else {
|
||||
if (backoff_delay (backoff_timer) // 3,7,15,31 ..
|
||||
!= BACKOFF_DELAY_TAKEN) // shutdown or cond wait error
|
||||
return false;
|
||||
}
|
||||
if (rtn == CONN_WAIT_FAIL) {
|
||||
return false;
|
||||
}
|
||||
// else retry
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int wait_while_interface_down()
|
||||
|
||||
{
|
||||
int rtn;
|
||||
|
||||
ParodusError("Interface is down, hence waiting until its up\n");
|
||||
close_and_unref_connection (get_global_conn(), false);
|
||||
set_global_conn(NULL);
|
||||
|
||||
while (get_interface_down_event ()) {
|
||||
pthread_mutex_lock(get_interface_down_mut());
|
||||
rtn = pthread_cond_wait(get_interface_down_con(), get_interface_down_mut());
|
||||
pthread_mutex_unlock (get_interface_down_mut());
|
||||
if (rtn != 0)
|
||||
ParodusError
|
||||
("Error on pthread_cond_wait (%d) in wait_while_interface_down\n", rtn);
|
||||
if (g_shutdown) {
|
||||
ParodusInfo("Received g_shutdown during interface down wait, returning\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
@@ -551,14 +713,13 @@ int keep_trying_to_connect (create_connection_ctx_t *ctx,
|
||||
* @brief createNopollConnection interface to create WebSocket client connections.
|
||||
*Loads the WebPA config file and creates the intial connection and manages the connection wait, close mechanisms.
|
||||
*/
|
||||
int createNopollConnection(noPollCtx *ctx)
|
||||
int createNopollConnection(noPollCtx *ctx, server_list_t *server_list)
|
||||
{
|
||||
create_connection_ctx_t conn_ctx;
|
||||
int max_retry_count;
|
||||
int query_dns_status;
|
||||
struct timespec connect_time,*connectTimePtr;
|
||||
connectTimePtr = &connect_time;
|
||||
backoff_timer_t backoff_timer;
|
||||
static int init_conn_failure=1;
|
||||
struct sysinfo l_sSysInfo;
|
||||
|
||||
if(ctx == NULL) {
|
||||
return nopoll_false;
|
||||
@@ -575,31 +736,41 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
conn_ctx.nopoll_ctx = ctx;
|
||||
init_expire_timer (&conn_ctx.connect_timer);
|
||||
init_header_info (&conn_ctx.header_info);
|
||||
set_server_list_null (&conn_ctx.server_list);
|
||||
init_backoff_timer (&backoff_timer, max_retry_count);
|
||||
/* look up server information if we don't already have it */
|
||||
if (server_is_null (&server_list->defaults))
|
||||
if (find_servers (server_list) == FIND_INVALID_DEFAULT) {
|
||||
return nopoll_false;
|
||||
}
|
||||
conn_ctx.server_list = server_list;
|
||||
init_backoff_timer (&backoff_timer, max_retry_count);
|
||||
start_conn_in_progress (backoff_timer.start_time);
|
||||
|
||||
while (!g_shutdown)
|
||||
{
|
||||
query_dns_status = find_servers (&conn_ctx.server_list);
|
||||
if (query_dns_status == FIND_INVALID_DEFAULT)
|
||||
return nopoll_false;
|
||||
set_current_server (&conn_ctx);
|
||||
if (keep_trying_to_connect (&conn_ctx, &backoff_timer))
|
||||
if (keep_trying_to_connect (&conn_ctx, &backoff_timer)) {
|
||||
// Don't reuse the redirect server during reconnect
|
||||
free_server (&conn_ctx.server_list->redirect);
|
||||
break;
|
||||
// retry dns query
|
||||
|
||||
// If interface down event is set, stop retry
|
||||
// and wait till interface is up again.
|
||||
if(get_interface_down_event()) {
|
||||
ParodusError("Interface is down, hence pausing retry and waiting until its up\n");
|
||||
pthread_mutex_lock(get_interface_down_mut());
|
||||
pthread_cond_wait(get_interface_down_con(), get_interface_down_mut());
|
||||
pthread_mutex_unlock (get_interface_down_mut());
|
||||
ParodusInfo("Interface is back up, re-initializing the convey header\n");
|
||||
// Reset the reconnect reason by initializing the convey header again
|
||||
((header_info_t *)(&conn_ctx.header_info))->conveyHeader = getWebpaConveyHeader();
|
||||
ParodusInfo("Received reconnect_reason as:%s\n", reconnect_reason);
|
||||
}
|
||||
/* if we failed to connect, don't reuse the redirect server */
|
||||
free_server (&conn_ctx.server_list->redirect);
|
||||
|
||||
/* On initial connect failure, invoke conn status change event as "failed" only 1 time*/
|
||||
if((NULL != on_conn_status_change) && init && init_conn_failure)
|
||||
{
|
||||
on_conn_status_change("failed");
|
||||
init_conn_failure=0;
|
||||
}
|
||||
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
/* if we don't already have a valid jwt, look up server information */
|
||||
if (server_is_null (&conn_ctx.server_list->jwt))
|
||||
if (find_servers (conn_ctx.server_list) == FIND_INVALID_DEFAULT) {
|
||||
/* since we already found a default server, we don't expect FIND_INVALID_DEFAULT */
|
||||
g_shutdown = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if(conn_ctx.current_server->allow_insecure <= 0)
|
||||
@@ -613,8 +784,14 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
OnboardLog("Connected to server\n");
|
||||
}
|
||||
|
||||
get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE;
|
||||
ParodusInfo("cloud_status set as %s after successful connection\n", get_parodus_cfg()->cloud_status);
|
||||
set_cloud_status(CLOUD_STATUS_ONLINE);
|
||||
ParodusInfo("cloud_status set as %s after successful connection\n", get_cloud_status());
|
||||
|
||||
/* On initial connect success, invoke conn status change event as "success" */
|
||||
if((NULL != on_conn_status_change) && init)
|
||||
{
|
||||
on_conn_status_change("success");
|
||||
}
|
||||
|
||||
// Invoke the ping status change event callback as "received" ping
|
||||
if(NULL != on_ping_status_change)
|
||||
@@ -622,15 +799,14 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
on_ping_status_change("received");
|
||||
}
|
||||
|
||||
if((get_parodus_cfg()->boot_time != 0) && init) {
|
||||
getCurrentTime(connectTimePtr);
|
||||
ParodusInfo("connect_time-diff-boot_time=%d\n", connectTimePtr->tv_sec - get_parodus_cfg()->boot_time);
|
||||
if(init) {
|
||||
sysinfo(&l_sSysInfo);
|
||||
ParodusInfo("connect_time-diff-boot_time=%ld\n", l_sSysInfo.uptime);
|
||||
init = 0; //set init to 0 so that this is logged only during process start up and not during reconnect
|
||||
}
|
||||
|
||||
free_extra_headers (&conn_ctx);
|
||||
free_header_info (&conn_ctx.header_info);
|
||||
free_server_list (&conn_ctx.server_list);
|
||||
free_header_info (&conn_ctx.header_info);
|
||||
|
||||
// Reset close_retry flag and heartbeatTimer once the connection retry is successful
|
||||
ParodusPrint("createNopollConnection(): reset_close_retry\n");
|
||||
@@ -640,7 +816,7 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
set_global_reconnect_status(false);
|
||||
ParodusPrint("LastReasonStatus reset after successful connection\n");
|
||||
setMessageHandlers();
|
||||
|
||||
stop_conn_in_progress ();
|
||||
return nopoll_true;
|
||||
}
|
||||
|
||||
@@ -685,23 +861,52 @@ static noPollConnOpts * createConnOpts (char * extra_headers, bool secure)
|
||||
nopoll_conn_opts_ssl_peer_verify (opts, nopoll_true);
|
||||
nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_TLSV1_2);
|
||||
}
|
||||
nopoll_conn_opts_set_interface (opts,get_parodus_cfg()->webpa_interface_used);
|
||||
nopoll_conn_opts_set_interface (opts,getWebpaInterface());
|
||||
nopoll_conn_opts_set_extra_headers (opts,extra_headers);
|
||||
return opts;
|
||||
}
|
||||
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn)
|
||||
static void close_conn ( noPollConn *conn, bool is_shutting_down)
|
||||
{
|
||||
const char *effective_reason = get_global_shutdown_reason();
|
||||
|
||||
if (NULL == effective_reason) {
|
||||
effective_reason = SHUTDOWN_REASON_SYSTEM_RESTART;
|
||||
}
|
||||
else if (strcmp (effective_reason, SHUTDOWN_REASON_SIGTERM) == 0) {
|
||||
char *sigterm_reason;
|
||||
char *reason_file = get_parodus_cfg()->close_reason_file;
|
||||
if ((NULL != reason_file) && readFromFile (reason_file, &sigterm_reason) &&
|
||||
(strlen(sigterm_reason) != 0))
|
||||
{
|
||||
nopoll_conn_close_ext(conn, CloseNormalClosure, sigterm_reason,
|
||||
strlen (sigterm_reason));
|
||||
ParodusInfo ("Closed by SIGTERM, reason: %s\n", sigterm_reason);
|
||||
if (is_shutting_down)
|
||||
ParodusInfo ("shutdown reason at close %s\n", sigterm_reason);
|
||||
free (sigterm_reason);
|
||||
return;
|
||||
}
|
||||
/* file could not be read. use canned message. */
|
||||
effective_reason = SHUTDOWN_REASON_SYSTEM_RESTART;
|
||||
ParodusError ("Closed by SIGTERM, but no reason file\n");
|
||||
}
|
||||
nopoll_conn_close_ext(conn, CloseNormalClosure, effective_reason,
|
||||
strlen (effective_reason));
|
||||
if (is_shutting_down)
|
||||
ParodusInfo ("shutdown reason at close %s\n", effective_reason);
|
||||
}
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn, bool is_shutting_down)
|
||||
{
|
||||
if (conn) {
|
||||
nopoll_conn_close(conn);
|
||||
|
||||
get_parodus_cfg()->cloud_status = CLOUD_STATUS_OFFLINE;
|
||||
ParodusInfo("cloud_status set as %s after connection close\n", get_parodus_cfg()->cloud_status);
|
||||
close_conn (conn, is_shutting_down);
|
||||
set_cloud_status(CLOUD_STATUS_OFFLINE);
|
||||
ParodusInfo("cloud_status set as %s after connection close\n", get_cloud_status());
|
||||
}
|
||||
}
|
||||
|
||||
void write_conn_in_prog_file (const char *msg)
|
||||
void write_conn_in_prog_file (bool is_starting, unsigned long start_time)
|
||||
{
|
||||
int fd;
|
||||
FILE *fp;
|
||||
@@ -722,18 +927,22 @@ void write_conn_in_prog_file (const char *msg)
|
||||
return;
|
||||
}
|
||||
timestamp = (unsigned long) time(NULL);
|
||||
fprintf (fp, "{%s=%lu}\n", msg, timestamp);
|
||||
if (is_starting)
|
||||
fprintf (fp, "{START=%lu,%lu}\n", start_time, timestamp);
|
||||
else
|
||||
fprintf (fp, "{STOP=%lu}\n", timestamp);
|
||||
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
void start_conn_in_progress (void)
|
||||
void start_conn_in_progress (unsigned long start_time)
|
||||
{
|
||||
write_conn_in_prog_file ("START");
|
||||
write_conn_in_prog_file (true, start_time);
|
||||
}
|
||||
|
||||
void stop_conn_in_progress (void)
|
||||
{
|
||||
write_conn_in_prog_file ("STOP");
|
||||
write_conn_in_prog_file (false, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -742,3 +951,8 @@ void registerParodusOnPingStatusChangeHandler(parodusOnPingStatusChangeHandler c
|
||||
on_ping_status_change = callback_func;
|
||||
}
|
||||
|
||||
void registerParodusOnConnStatusChangeHandler(parodusOnConnStatusChangeHandler callback_func)
|
||||
{
|
||||
on_conn_status_change = callback_func;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,18 @@ extern "C" {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define SHUTDOWN_REASON_PARODUS_STOP "parodus_stopping"
|
||||
#define SHUTDOWN_REASON_SYSTEM_RESTART "system_restarting"
|
||||
#define SHUTDOWN_REASON_SIGTERM "SIGTERM"
|
||||
|
||||
/**
|
||||
* parodusOnConnStatusChangeHandler - Function pointer
|
||||
* Used to define callback function to do additional processing
|
||||
* when websocket cloud connection status change event
|
||||
* i.e. "cloud-conn-status" as "fail" or "success"
|
||||
*/
|
||||
typedef void (*parodusOnConnStatusChangeHandler) (char * status);
|
||||
extern parodusOnConnStatusChangeHandler on_conn_status_change;
|
||||
|
||||
/**
|
||||
* parodusOnPingStatusChangeHandler - Function pointer
|
||||
@@ -41,22 +53,26 @@ extern "C" {
|
||||
* i.e. ping_miss or ping receive after miss
|
||||
*/
|
||||
typedef void (*parodusOnPingStatusChangeHandler) (char * status);
|
||||
parodusOnPingStatusChangeHandler on_ping_status_change;
|
||||
extern parodusOnPingStatusChangeHandler on_ping_status_change;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int createNopollConnection(noPollCtx *);
|
||||
void set_server_list_null (server_list_t *server_list);
|
||||
int createNopollConnection(noPollCtx *, server_list_t *);
|
||||
|
||||
/**
|
||||
* @brief Interface to terminate WebSocket client connections and clean up resources.
|
||||
*/
|
||||
void close_and_unref_connection(noPollConn *);
|
||||
void close_and_unref_connection(noPollConn *conn, bool is_shutting_down);
|
||||
|
||||
noPollConn *get_global_conn(void);
|
||||
void set_global_conn(noPollConn *);
|
||||
|
||||
char *get_global_shutdown_reason();
|
||||
void set_global_shutdown_reason(char *reason);
|
||||
|
||||
char *get_global_reconnect_reason();
|
||||
void set_global_reconnect_reason(char *reason);
|
||||
|
||||
@@ -69,12 +85,20 @@ void set_cloud_disconnect_time(int disconnTime);
|
||||
/**
|
||||
* @brief Interface to self heal connection in progress getting stuck
|
||||
*/
|
||||
void start_conn_in_progress (void);
|
||||
void start_conn_in_progress (unsigned long start_time);
|
||||
void stop_conn_in_progress (void);
|
||||
|
||||
// To Register parodusOnConnStatusChangeHandler Callback function
|
||||
void registerParodusOnConnStatusChangeHandler(parodusOnConnStatusChangeHandler on_conn_status_change);
|
||||
|
||||
// To Register parodusOnPingStatusChangeHandler Callback function
|
||||
void registerParodusOnPingStatusChangeHandler(parodusOnPingStatusChangeHandler on_ping_status_change);
|
||||
|
||||
// To stop connection and wait duing interface down state
|
||||
int wait_while_interface_down (void);
|
||||
|
||||
void terminate_backoff_delay (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
#include "config.h"
|
||||
#include "connection.h"
|
||||
#include "close_retry.h"
|
||||
#include "client_list.h"
|
||||
|
||||
#define SERVICE_STATUS "service-status"
|
||||
|
||||
static void freeObjArray(char *(*obj)[], int size);
|
||||
static int writeIntoCrudJson(cJSON *res_obj, char * object, cJSON *objValue, int freeFlag);
|
||||
@@ -33,6 +36,7 @@ static int parse_dest_elements_to_string(wrp_msg_t *reqMsg, char *(*obj)[]);
|
||||
static char* strdupptr( const char *s, const char *e );
|
||||
static int ConnDisconnectFromCloud(char *reason);
|
||||
static int validateDisconnectString(char *reason);
|
||||
static int getClientStatus(char *service, cJSON **jsonresponse);
|
||||
|
||||
int writeToJSON(char *data)
|
||||
{
|
||||
@@ -58,22 +62,7 @@ int writeToJSON(char *data)
|
||||
|
||||
int readFromJSON(char **data)
|
||||
{
|
||||
FILE *fp;
|
||||
int ch_count = 0;
|
||||
fp = fopen(get_parodus_cfg()->crud_config_file, "r+");
|
||||
if (fp == NULL)
|
||||
{
|
||||
ParodusError("Failed to open file %s\n", get_parodus_cfg()->crud_config_file);
|
||||
return 0;
|
||||
}
|
||||
fseek(fp, 0, SEEK_END);
|
||||
ch_count = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
*data = (char *) malloc(sizeof(char) * (ch_count + 1));
|
||||
fread(*data, 1, ch_count,fp);
|
||||
(*data)[ch_count] ='\0';
|
||||
fclose(fp);
|
||||
return 1;
|
||||
return readFromFile (get_parodus_cfg()->crud_config_file, data);
|
||||
}
|
||||
/*
|
||||
* @res_obj json object to add it in crud config json file
|
||||
@@ -548,13 +537,13 @@ int retrieveFromMemory(char *keyName, cJSON **jsonresponse)
|
||||
}
|
||||
else if(strcmp(WEBPA_INTERFACE, keyName)==0)
|
||||
{
|
||||
if((get_parodus_cfg()->webpa_interface_used !=NULL)&& (strlen(get_parodus_cfg()->fw_name)==0))
|
||||
if((getWebpaInterface() !=NULL)&& (strlen(get_parodus_cfg()->fw_name)==0))
|
||||
{
|
||||
ParodusError("retrieveFromMemory: webpa_interface_used value is NULL\n");
|
||||
return -1;
|
||||
}
|
||||
ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n",keyName,get_parodus_cfg()->webpa_interface_used);
|
||||
cJSON_AddItemToObject( *jsonresponse, WEBPA_INTERFACE , cJSON_CreateString(get_parodus_cfg()->webpa_interface_used));
|
||||
ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n",keyName,getWebpaInterface());
|
||||
cJSON_AddItemToObject( *jsonresponse, WEBPA_INTERFACE , cJSON_CreateString(getWebpaInterface()));
|
||||
}
|
||||
else if(strcmp(WEBPA_URL, keyName)==0)
|
||||
{
|
||||
@@ -588,20 +577,20 @@ int retrieveFromMemory(char *keyName, cJSON **jsonresponse)
|
||||
}
|
||||
else if(strcmp(CLOUD_STATUS, keyName)==0)
|
||||
{
|
||||
if(get_parodus_cfg()->cloud_status ==NULL)
|
||||
if(get_cloud_status() ==NULL)
|
||||
{
|
||||
ParodusError("retrieveFromMemory: cloud_status value is NULL\n");
|
||||
return -1;
|
||||
}
|
||||
else if((get_parodus_cfg()->cloud_status !=NULL) && (strlen(get_parodus_cfg()->cloud_status)==0))
|
||||
else if((get_cloud_status() !=NULL) && (strlen(get_cloud_status())==0))
|
||||
{
|
||||
ParodusError("retrieveFromMemory: cloud_status value is empty\n");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n", keyName, get_parodus_cfg()->cloud_status);
|
||||
cJSON_AddItemToObject( *jsonresponse, CLOUD_STATUS , cJSON_CreateString(get_parodus_cfg()->cloud_status));
|
||||
ParodusInfo("retrieveFromMemory: keyName:%s value:%s\n", keyName, get_cloud_status());
|
||||
cJSON_AddItemToObject( *jsonresponse, CLOUD_STATUS , cJSON_CreateString(get_cloud_status()));
|
||||
}
|
||||
}
|
||||
else if(strcmp(BOOT_TIME, keyName)==0)
|
||||
@@ -654,10 +643,17 @@ int retrieveObject( wrp_msg_t *reqMsg, wrp_msg_t **response )
|
||||
}
|
||||
|
||||
ParodusInfo( "Number of object level %d\n", objlevel );
|
||||
|
||||
if(objlevel == 3 && ((obj[3] !=NULL) && strstr(obj[3] ,"tags") == NULL))
|
||||
if((objlevel == 3 && ((obj[3] !=NULL) && strstr(obj[3] ,"tags") == NULL)) || (objlevel == 4 && ((obj[3] !=NULL) && strstr(obj[3] ,"service-status") != NULL)))
|
||||
{
|
||||
inMemStatus = retrieveFromMemory(obj[3], &inMemResponse );
|
||||
//To support dest "mac:14xxxxxxxxxx/parodus/service-status/service" to retrieve online/offline status of registered clients.
|
||||
if(strstr(obj[3] ,"service-status") !=NULL)
|
||||
{
|
||||
inMemStatus = getClientStatus(obj[4], &inMemResponse );
|
||||
}
|
||||
else
|
||||
{
|
||||
inMemStatus = retrieveFromMemory(obj[3], &inMemResponse );
|
||||
}
|
||||
|
||||
if(inMemStatus == 0)
|
||||
{
|
||||
@@ -1628,3 +1624,27 @@ static int validateDisconnectString(char *reason)
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int getClientStatus(char *service, cJSON **jsonresponse)
|
||||
{
|
||||
char regstatus[16] ={0};
|
||||
*jsonresponse = cJSON_CreateObject();
|
||||
|
||||
if(service == NULL)
|
||||
{
|
||||
ParodusError("service is NULL\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(checkClientStatus(service))
|
||||
{
|
||||
strncpy(regstatus, "online", sizeof(regstatus)-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(regstatus, "offline", sizeof(regstatus)-1);
|
||||
}
|
||||
ParodusPrint("getClientStatus: service:%s value:%s\n", service, regstatus);
|
||||
cJSON_AddItemToObject( *jsonresponse, SERVICE_STATUS , cJSON_CreateString(regstatus));
|
||||
return 0;
|
||||
}
|
||||
|
||||
26
src/event_handler.c
Normal file
26
src/event_handler.c
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* If not stated otherwise in this file or this component's Licenses.txt file the
|
||||
* following copyright and licenses apply:
|
||||
*
|
||||
* Copyright 2016 RDK Management
|
||||
* Copyright [2014] [Cisco Systems, Inc.]
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* This is a stub file that will be overridden in a patch */
|
||||
|
||||
#include "event_handler.h"
|
||||
|
||||
void EventHandler()
|
||||
{
|
||||
}
|
||||
21
src/event_handler.h
Normal file
21
src/event_handler.h
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* If not stated otherwise in this file or this component's Licenses.txt file the
|
||||
* following copyright and licenses apply:
|
||||
*
|
||||
* Copyright 2016 RDK Management
|
||||
* Copyright [2014] [Cisco Systems, Inc.]
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
void EventHandler();
|
||||
#define LOGGING_INTERVAL_SECS ( 60 * 60 )
|
||||
68
src/main.c
68
src/main.c
@@ -19,14 +19,15 @@
|
||||
#include "stdlib.h"
|
||||
#include "config.h"
|
||||
#include "auth_token.h"
|
||||
#include "connection.h"
|
||||
#include "conn_interface.h"
|
||||
#include "parodus_log.h"
|
||||
#include <curl/curl.h>
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
#include "breakpad_wrapper.h"
|
||||
#else
|
||||
#include "signal.h"
|
||||
#endif
|
||||
#include "signal.h"
|
||||
#include "privilege.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -36,48 +37,75 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
typedef void Sigfunc(int);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
int numLoops;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig);
|
||||
|
||||
Sigfunc *
|
||||
signal (int signo, Sigfunc *func)
|
||||
{
|
||||
struct sigaction act, oact;
|
||||
|
||||
act.sa_handler = func;
|
||||
sigemptyset (&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
if (signo == SIGALRM) {
|
||||
#ifdef SA_INTERRUPT
|
||||
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
|
||||
#endif
|
||||
} else {
|
||||
#ifdef SA_RESTART
|
||||
act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */
|
||||
#endif
|
||||
}
|
||||
if (sigaction (signo, &act, &oact) < 0) {
|
||||
ParodusError ("Signal Handler for signal %d not installed!\n", signo);
|
||||
return (SIG_ERR);
|
||||
}
|
||||
return (oact.sa_handler);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( int argc, char **argv)
|
||||
{
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
breakpad_ExceptionHandler();
|
||||
#else
|
||||
set_global_shutdown_reason (SHUTDOWN_REASON_PARODUS_STOP);
|
||||
signal(SIGTERM, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGUSR1, sig_handler);
|
||||
signal(SIGUSR2, sig_handler);
|
||||
signal(SIGQUIT, sig_handler);
|
||||
signal(SIGHUP, sig_handler);
|
||||
signal(SIGALRM, sig_handler);
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
/* breakpad handles the signals SIGSEGV, SIGBUS, SIGFPE, and SIGILL */
|
||||
breakpad_ExceptionHandler();
|
||||
#else
|
||||
signal(SIGSEGV, sig_handler);
|
||||
signal(SIGBUS, sig_handler);
|
||||
signal(SIGKILL, sig_handler);
|
||||
signal(SIGFPE, sig_handler);
|
||||
signal(SIGILL, sig_handler);
|
||||
signal(SIGQUIT, sig_handler);
|
||||
signal(SIGHUP, sig_handler);
|
||||
signal(SIGALRM, sig_handler);
|
||||
#endif
|
||||
ParodusCfg *cfg;
|
||||
|
||||
ParodusInfo ("RAND_MAX is %ld (0x%lx)\n", RAND_MAX, RAND_MAX);
|
||||
srandom (getpid());
|
||||
|
||||
/* TODO not ideal, but it fixes a more major problem for now. */
|
||||
cfg = get_parodus_cfg();
|
||||
memset(cfg,0,sizeof(ParodusCfg));
|
||||
|
||||
ParodusInfo("********** Starting component: Parodus **********\n ");
|
||||
drop_root_privilege();
|
||||
setDefaultValuesToCfg(cfg);
|
||||
if (0 != parseCommandLine(argc,argv,cfg)) {
|
||||
abort();
|
||||
@@ -97,7 +125,6 @@ const char *rdk_logger_module_fetch(void)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig)
|
||||
{
|
||||
|
||||
@@ -105,17 +132,25 @@ static void sig_handler(int sig)
|
||||
{
|
||||
signal(SIGINT, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGINT received!\n");
|
||||
shutdownSocketConnection();
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_PARODUS_STOP);
|
||||
}
|
||||
else if ( sig == SIGUSR1 )
|
||||
{
|
||||
signal(SIGUSR1, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGUSR1 received!\n");
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_SYSTEM_RESTART);
|
||||
}
|
||||
else if ( sig == SIGUSR2 )
|
||||
{
|
||||
signal(SIGUSR2, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGUSR2 received!\n");
|
||||
}
|
||||
else if ( sig == SIGTERM )
|
||||
{
|
||||
signal(SIGTERM, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGTERM received!\n");
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_SIGTERM);
|
||||
}
|
||||
else if ( sig == SIGCHLD )
|
||||
{
|
||||
signal(SIGCHLD, sig_handler); /* reset it to this function */
|
||||
@@ -134,8 +169,7 @@ static void sig_handler(int sig)
|
||||
else
|
||||
{
|
||||
ParodusInfo("Signal %d received!\n", sig);
|
||||
shutdownSocketConnection();
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_PARODUS_STOP);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "nopoll_helpers.h"
|
||||
#include "nopoll_handlers.h"
|
||||
#include "time.h"
|
||||
#include "config.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -49,60 +50,36 @@ void setMessageHandlers()
|
||||
nopoll_conn_set_on_close(get_global_conn(), (noPollOnCloseHandler)listenerOnCloseMessage, NULL);
|
||||
}
|
||||
|
||||
static int cloud_status_is_online (void)
|
||||
{
|
||||
const char *status = get_cloud_status();
|
||||
if (NULL == status)
|
||||
return false;
|
||||
return (strcmp (status, CLOUD_STATUS_ONLINE) == 0);
|
||||
}
|
||||
|
||||
/** To send upstream msgs to server ***/
|
||||
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
int sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
{
|
||||
int bytesWritten = 0;
|
||||
static int connErr=0;
|
||||
long timeDiff = 0;
|
||||
|
||||
if (!cloud_status_is_online ()) {
|
||||
ParodusError("Failed to send msg upstream as connection is not OK\n");
|
||||
OnboardLog("Failed to send msg upstream as connection is not OK\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
ParodusInfo("sendMessage length %zu\n", len);
|
||||
|
||||
if(nopoll_conn_is_ok(conn) && nopoll_conn_is_ready(conn))
|
||||
bytesWritten = sendResponse(conn, msg, len);
|
||||
ParodusPrint("Number of bytes written: %d\n", bytesWritten);
|
||||
if (bytesWritten != (int) len)
|
||||
{
|
||||
//bytesWritten = nopoll_conn_send_binary(conn, msg, len);
|
||||
bytesWritten = sendResponse(conn, msg, len);
|
||||
ParodusPrint("Number of bytes written: %d\n", bytesWritten);
|
||||
if (bytesWritten != (int) len)
|
||||
{
|
||||
ParodusError("Failed to send bytes %zu, bytes written were=%d (errno=%d, %s)..\n", len, bytesWritten, errno, strerror(errno));
|
||||
}
|
||||
connErr = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to send msg upstream as connection is not OK\n");
|
||||
OnboardLog("Failed to send msg upstream as connection is not OK\n");
|
||||
|
||||
if(get_interface_down_event())
|
||||
{
|
||||
ParodusError("Unable to connect to server since interface is down\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (connErr == 0)
|
||||
{
|
||||
getCurrentTime(connStuck_startPtr);
|
||||
ParodusInfo("Conn got stuck, initialized the first timer\n");
|
||||
connErr = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
getCurrentTime(connStuck_endPtr);
|
||||
timeDiff = timeValDiff(connStuck_startPtr, connStuck_endPtr);
|
||||
ParodusPrint("checking timeout difference:%ld\n", timeDiff);
|
||||
|
||||
if( timeDiff >= (10*60*1000))
|
||||
{
|
||||
ParodusError("conn got stuck for over 10 minutes; crashing service.\n");
|
||||
OnboardLog("conn got stuck for over 10 minutes; crashing service.\n");
|
||||
kill(getpid(),SIGTERM);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
ParodusError("Failed to send bytes %zu, bytes written were=%d (errno=%d, %s)..\n", len, bytesWritten, errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sendResponse(noPollConn * conn, void * buffer, size_t length)
|
||||
|
||||
@@ -41,7 +41,7 @@ extern "C" {
|
||||
*/
|
||||
int sendResponse(noPollConn * conn,void *str, size_t bufferSize);
|
||||
void setMessageHandlers();
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len);
|
||||
int sendMessage(noPollConn *conn, void *msg, size_t len);
|
||||
|
||||
/**
|
||||
* @brief __report_log Nopoll log handler
|
||||
|
||||
6
src/privilege.c
Normal file
6
src/privilege.c
Normal file
@@ -0,0 +1,6 @@
|
||||
#include "privilege.h"
|
||||
|
||||
void drop_root_privilege()
|
||||
{
|
||||
|
||||
}
|
||||
2
src/privilege.h
Normal file
2
src/privilege.h
Normal file
@@ -0,0 +1,2 @@
|
||||
/* This is a stub function that will be overridden in a patch */
|
||||
void drop_root_privilege();
|
||||
@@ -34,7 +34,7 @@ uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer)
|
||||
ParodusPrint("timer->tv_sec : %lu\n",timer->tv_sec);
|
||||
ParodusPrint("timer->tv_nsec : %lu\n",timer->tv_nsec);
|
||||
systime = (uint64_t)timer->tv_sec * 1000000L + timer->tv_nsec/ 1000;
|
||||
return systime;
|
||||
return systime;
|
||||
}
|
||||
|
||||
long timeValDiff(struct timespec *starttime, struct timespec *finishtime)
|
||||
|
||||
@@ -83,7 +83,6 @@ void packMetaData()
|
||||
//Pack the metadata initially to reuse for every upstream msg sending to server
|
||||
ParodusPrint("-------------- Packing metadata ----------------\n");
|
||||
sprintf(boot_time, "%d", get_parodus_cfg()->boot_time);
|
||||
|
||||
struct data meta_pack[METADATA_COUNT] = {
|
||||
{HW_MODELNAME, get_parodus_cfg()->hw_model},
|
||||
{HW_SERIALNUMBER, get_parodus_cfg()->hw_serial_number},
|
||||
@@ -95,10 +94,9 @@ void packMetaData()
|
||||
{LAST_RECONNECT_REASON, get_global_reconnect_reason()},
|
||||
{WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol},
|
||||
{WEBPA_UUID,get_parodus_cfg()->webpa_uuid},
|
||||
{WEBPA_INTERFACE, get_parodus_cfg()->webpa_interface_used},
|
||||
{WEBPA_INTERFACE, getWebpaInterface()},
|
||||
{PARTNER_ID, get_parodus_cfg()->partner_id}
|
||||
};
|
||||
|
||||
const data_t metapack = {METADATA_COUNT, meta_pack};
|
||||
|
||||
metaPackSize = wrp_pack_metadata( &metapack , &metadataPack );
|
||||
@@ -330,6 +328,7 @@ void *processUpstreamMessage()
|
||||
if(ret == 1)
|
||||
{
|
||||
wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset( eventMsg, 0, sizeof( wrp_msg_t ) );
|
||||
eventMsg->msg_type = msgType;
|
||||
eventMsg->u.event.content_type=msg->u.event.content_type;
|
||||
eventMsg->u.event.source=msg->u.event.source;
|
||||
@@ -339,6 +338,15 @@ void *processUpstreamMessage()
|
||||
eventMsg->u.event.headers=msg->u.event.headers;
|
||||
eventMsg->u.event.metadata=msg->u.event.metadata;
|
||||
eventMsg->u.event.partner_ids = partnersList;
|
||||
if(msg->u.event.transaction_uuid)
|
||||
{
|
||||
ParodusPrint("Inside Trans id in PARODUS\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Assigning NULL to trans id\n");
|
||||
eventMsg->u.event.transaction_uuid = NULL;
|
||||
}
|
||||
|
||||
int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes );
|
||||
if(size > 0)
|
||||
@@ -417,12 +425,43 @@ void *processUpstreamMessage()
|
||||
{
|
||||
ParodusError("Failed to get device_id\n");
|
||||
}
|
||||
} else if (WRP_MSG_TYPE__SVC_ALIVE != msgType) {
|
||||
}
|
||||
else if((WRP_MSG_TYPE__UPDATE == msgType) || (WRP_MSG_TYPE__DELETE == msgType))
|
||||
{
|
||||
ParodusPrint("UPDATE/DELETE request\n");
|
||||
ret = getDeviceId(&device_id, &device_id_len);
|
||||
if(ret == 0)
|
||||
{
|
||||
ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len);
|
||||
/* Match dest based on device_id. Check dest start with: "mac:112233445xxx" ? */
|
||||
if( 0 == strncasecmp(device_id, msg->u.crud.dest, device_id_len-1) )
|
||||
{
|
||||
/* For this device. For nanomsg clients.*/
|
||||
getServiceNameAndSendResponse(msg, &message->msg, message->len);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Not for this device. Send upstream */
|
||||
ParodusInfo("sendUpstreamMsgToServer \n");
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
if(device_id != NULL)
|
||||
{
|
||||
free(device_id);
|
||||
device_id = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to get device_id\n");
|
||||
}
|
||||
}
|
||||
else if (WRP_MSG_TYPE__SVC_ALIVE != msgType) {
|
||||
/* Don't reply to service alive message */
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -565,11 +604,12 @@ void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_
|
||||
}
|
||||
}
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
void *appendData;
|
||||
size_t encodedSize;
|
||||
bool close_retry = false;
|
||||
int sendRetStatus = 1;
|
||||
//appending response with metadata
|
||||
if(metaPackSize > 0)
|
||||
{
|
||||
@@ -584,12 +624,13 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
//TODO: Upstream and downstream messages in queue should be handled and queue should be empty before parodus forcefully disconnect from cloud.
|
||||
if(!close_retry || (get_parodus_cfg()->cloud_disconnect !=NULL))
|
||||
{
|
||||
sendMessage(get_global_conn(),appendData, encodedSize);
|
||||
sendRetStatus = sendMessage(get_global_conn(),appendData, encodedSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("close_retry is %d, unable to send response as connection retry is in progress\n", close_retry);
|
||||
OnboardLog("close_retry is %d, unable to send response as connection retry is in progress\n", close_retry);
|
||||
sendRetStatus = 1;
|
||||
}
|
||||
free(appendData);
|
||||
appendData =NULL;
|
||||
@@ -597,6 +638,9 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to send upstream as metadata packing is not successful\n");
|
||||
sendRetStatus = 1;
|
||||
}
|
||||
ParodusPrint("sendRetStatus is %d\n", sendRetStatus);
|
||||
|
||||
return sendRetStatus;
|
||||
}
|
||||
|
||||
@@ -47,11 +47,15 @@ typedef struct UpStreamMsg__
|
||||
void packMetaData();
|
||||
void *handle_upstream();
|
||||
void *processUpstreamMessage();
|
||||
void registerRBUSlistener();
|
||||
int getDeviceId(char **device_id, size_t *device_id_len);
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size);
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size);
|
||||
void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_size);
|
||||
void createUpstreamRetrieveMsg(wrp_msg_t *message, wrp_msg_t **retrieve_msg);
|
||||
void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ);
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
int subscribeCurrentActiveInterfaceEvent();
|
||||
#endif
|
||||
UpStreamMsg * get_global_UpStreamMsgQ(void);
|
||||
pthread_cond_t *get_global_nano_con(void);
|
||||
pthread_mutex_t *get_global_nano_mut(void);
|
||||
|
||||
183
src/upstream_rbus.c
Normal file
183
src/upstream_rbus.c
Normal file
@@ -0,0 +1,183 @@
|
||||
/**
|
||||
* Copyright 2021 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file upstream_rbus.c
|
||||
*
|
||||
* @description This is used for parodus-RBUS communication
|
||||
* to send notification events upstream to cloud.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rbus.h>
|
||||
#include "upstream.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "partners_check.h"
|
||||
|
||||
#define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream"
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
#define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterface"
|
||||
#endif
|
||||
|
||||
rbusHandle_t rbus_Handle;
|
||||
rbusError_t err;
|
||||
|
||||
void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription);
|
||||
|
||||
void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error);
|
||||
|
||||
rbusHandle_t get_parodus_rbus_Handle(void)
|
||||
{
|
||||
return rbus_Handle;
|
||||
}
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription );
|
||||
#endif
|
||||
|
||||
/* API to register RBUS listener to receive messages from webconfig */
|
||||
void subscribeRBUSevent()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
err = rbus_open(&rbus_Handle, "parodus");
|
||||
if (err)
|
||||
{
|
||||
ParodusError("rbus_open failed :%s\n", rbusError_ToString(err));
|
||||
return;
|
||||
}
|
||||
rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBCFG_UPSTREAM_EVENT,processWebconfigUpstreamEvent,subscribeAsyncHandler,"parodus",10*60);
|
||||
if(rc != RBUS_ERROR_SUCCESS)
|
||||
ParodusError("rbusEvent_Subscribe failed: %d, %s\n", rc, rbusError_ToString(rc));
|
||||
else
|
||||
ParodusInfo("rbusEvent_Subscribe was successful\n");
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
/* API to subscribe Active Interface name on value change event*/
|
||||
int subscribeCurrentActiveInterfaceEvent()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
ParodusPrint("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterface Event\n");
|
||||
rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBPA_INTERFACE,eventReceiveHandler,subscribeAsyncHandler,"parodusInterface",10*20);
|
||||
if(rc != RBUS_ERROR_SUCCESS)
|
||||
{
|
||||
ParodusError("%s subscribe failed : %d - %s\n", WEBPA_INTERFACE, rc, rbusError_ToString(rc));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription)
|
||||
{
|
||||
(void)handle;
|
||||
(void)subscription;
|
||||
|
||||
int rv=-1;
|
||||
wrp_msg_t *event_msg;
|
||||
void *bytes;
|
||||
const uint8_t* bytesVal = NULL;
|
||||
int len;
|
||||
rbusValue_t value = NULL;
|
||||
|
||||
value = rbusObject_GetValue(event->data, "value");
|
||||
bytesVal = rbusValue_GetBytes(value, &len);
|
||||
|
||||
bytes = (void*) bytesVal;
|
||||
rv = wrp_to_struct( bytes, len, WRP_BYTES, &event_msg );
|
||||
if(rv > 0)
|
||||
{
|
||||
ParodusInfo(" Received upstream event data: dest '%s'\n", event_msg->u.event.dest);
|
||||
partners_t *partnersList = NULL;
|
||||
int j = 0;
|
||||
|
||||
int ret = validate_partner_id(event_msg, &partnersList);
|
||||
if(ret == 1)
|
||||
{
|
||||
wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset( eventMsg, 0, sizeof( wrp_msg_t ) );
|
||||
eventMsg->msg_type = event_msg->msg_type;
|
||||
eventMsg->u.event.content_type=event_msg->u.event.content_type;
|
||||
eventMsg->u.event.source=event_msg->u.event.source;
|
||||
eventMsg->u.event.dest=event_msg->u.event.dest;
|
||||
eventMsg->u.event.payload=event_msg->u.event.payload;
|
||||
eventMsg->u.event.payload_size=event_msg->u.event.payload_size;
|
||||
eventMsg->u.event.headers=event_msg->u.event.headers;
|
||||
eventMsg->u.event.metadata=event_msg->u.event.metadata;
|
||||
eventMsg->u.event.partner_ids = partnersList;
|
||||
if(event_msg->u.event.transaction_uuid)
|
||||
{
|
||||
ParodusPrint("Inside Trans id in PARODUS_rbus\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Assigning NULL to trans id RBUS\n");
|
||||
eventMsg->u.event.transaction_uuid = NULL;
|
||||
}
|
||||
|
||||
int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes );
|
||||
if(size > 0)
|
||||
{
|
||||
sendUpstreamMsgToServer(&bytes, size);
|
||||
}
|
||||
free(eventMsg);
|
||||
free(bytes);
|
||||
bytes = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
sendUpstreamMsgToServer((void **)(&bytes), len);
|
||||
}
|
||||
if(partnersList != NULL)
|
||||
{
|
||||
for(j=0; j<(int)partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
partnersList = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error)
|
||||
{
|
||||
(void)handle;
|
||||
ParodusInfo("subscribeAsyncHandler event %s, error %d - %s\n",subscription->eventName, error, rbusError_ToString(error));
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription )
|
||||
{
|
||||
(void)subscription;
|
||||
ParodusPrint("Handling event inside eventReceiveHandler\n");
|
||||
(void)rbus_Handle;
|
||||
char * interface = NULL;
|
||||
rbusValue_t newValue = rbusObject_GetValue(event->data, "value");
|
||||
rbusValue_t oldValue = rbusObject_GetValue(event->data, "oldValue");
|
||||
ParodusInfo("Consumer received ValueChange event for param %s\n", event->name);
|
||||
|
||||
if(newValue) {
|
||||
interface = (char *) rbusValue_GetString(newValue, NULL);
|
||||
setWebpaInterface(interface);
|
||||
}
|
||||
if(newValue !=NULL && oldValue!=NULL && interface!=NULL) {
|
||||
ParodusInfo("New Value: %s Old Value: %s New Interface Value: %s\n", rbusValue_GetString(newValue, NULL), rbusValue_GetString(oldValue, NULL), interface);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
846
src/xmidtsend_rbus.c
Normal file
846
src/xmidtsend_rbus.c
Normal file
@@ -0,0 +1,846 @@
|
||||
/**
|
||||
* Copyright 2022 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file xmidtsend_rbus.c
|
||||
*
|
||||
* @ To provide Xmidt send RBUS method to send events upstream.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rbus.h>
|
||||
#include "upstream.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "partners_check.h"
|
||||
#include "xmidtsend_rbus.h"
|
||||
#include "config.h"
|
||||
|
||||
static pthread_t processThreadId = 0;
|
||||
static int XmidtQsize = 0;
|
||||
|
||||
XmidtMsg *XmidtMsgQ = NULL;
|
||||
|
||||
pthread_mutex_t xmidt_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
pthread_cond_t xmidt_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
bool highQosValueCheck(int qos)
|
||||
{
|
||||
if(qos > 24)
|
||||
{
|
||||
ParodusInfo("The qos value is high\n");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("The qos value is low\n");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* @brief To handle xmidt rbus messages received from various components.
|
||||
*/
|
||||
void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle)
|
||||
{
|
||||
XmidtMsg *message;
|
||||
|
||||
ParodusPrint("XmidtQsize is %d\n" , XmidtQsize);
|
||||
if(XmidtQsize == MAX_QUEUE_SIZE)
|
||||
{
|
||||
char * errorMsg = strdup("Max Queue Size Exceeded");
|
||||
ParodusError("Queue Size Exceeded\n");
|
||||
createOutParamsandSendAck(msg, asyncHandle, errorMsg , QUEUE_SIZE_EXCEEDED);
|
||||
wrp_free_struct(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
ParodusPrint ("Add Xmidt Upstream message to queue\n");
|
||||
message = (XmidtMsg *)malloc(sizeof(XmidtMsg));
|
||||
|
||||
if(message)
|
||||
{
|
||||
message->msg = msg;
|
||||
message->asyncHandle =asyncHandle;
|
||||
//Increment queue size to handle max queue limit
|
||||
XmidtQsize++;
|
||||
message->next=NULL;
|
||||
pthread_mutex_lock (&xmidt_mut);
|
||||
//Producer adds the rbus msg into queue
|
||||
if(XmidtMsgQ == NULL)
|
||||
{
|
||||
XmidtMsgQ = message;
|
||||
|
||||
ParodusPrint("Producer added xmidt message\n");
|
||||
pthread_cond_signal(&xmidt_con);
|
||||
pthread_mutex_unlock (&xmidt_mut);
|
||||
ParodusPrint("mutex unlock in xmidt producer\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
XmidtMsg *temp = XmidtMsgQ;
|
||||
while(temp->next)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
temp->next = message;
|
||||
pthread_mutex_unlock (&xmidt_mut);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char * errorMsg = strdup("Unable to enqueue");
|
||||
ParodusError("failure in allocation for xmidt message\n");
|
||||
createOutParamsandSendAck(msg, asyncHandle, errorMsg , ENQUEUE_FAILURE);
|
||||
wrp_free_struct(msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//Xmidt consumer thread to process the rbus events.
|
||||
void processXmidtData()
|
||||
{
|
||||
int err = 0;
|
||||
err = pthread_create(&processThreadId, NULL, processXmidtUpstreamMsg, NULL);
|
||||
if (err != 0)
|
||||
{
|
||||
ParodusError("Error creating processXmidtData thread :[%s]\n", strerror(err));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("processXmidtData thread created Successfully\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Consumer to Parse and process rbus data.
|
||||
void* processXmidtUpstreamMsg()
|
||||
{
|
||||
int rv = 0;
|
||||
while(FOREVER())
|
||||
{
|
||||
pthread_mutex_lock (&xmidt_mut);
|
||||
ParodusPrint("mutex lock in xmidt consumer thread\n");
|
||||
if(XmidtMsgQ != NULL)
|
||||
{
|
||||
XmidtMsg *Data = XmidtMsgQ;
|
||||
|
||||
pthread_mutex_unlock (&xmidt_mut);
|
||||
ParodusPrint("mutex unlock in xmidt consumer thread\n");
|
||||
rv = processData(Data->msg, Data->asyncHandle);
|
||||
if(!rv)
|
||||
{
|
||||
ParodusPrint("Data->msg wrp free\n");
|
||||
wrp_free_struct(Data->msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(Data->msg);
|
||||
}
|
||||
free(Data);
|
||||
Data = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_shutdown)
|
||||
{
|
||||
pthread_mutex_unlock (&xmidt_mut);
|
||||
break;
|
||||
}
|
||||
ParodusPrint("Before cond wait in xmidt consumer thread\n");
|
||||
pthread_cond_wait(&xmidt_con, &xmidt_mut);
|
||||
pthread_mutex_unlock (&xmidt_mut);
|
||||
ParodusPrint("mutex unlock in xmidt thread after cond wait\n");
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//To validate and send events upstream
|
||||
int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle)
|
||||
{
|
||||
int rv = 0;
|
||||
char *errorMsg = "none";
|
||||
int statuscode =0;
|
||||
|
||||
wrp_msg_t * xmidtMsg = msg;
|
||||
if (xmidtMsg == NULL)
|
||||
{
|
||||
ParodusError("xmidtMsg is NULL\n");
|
||||
errorMsg = strdup("Unable to enqueue");
|
||||
createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg, ENQUEUE_FAILURE);
|
||||
xmidtQDequeue();
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = validateXmidtData(xmidtMsg, &errorMsg, &statuscode);
|
||||
ParodusPrint("validateXmidtData, errorMsg %s statuscode %d\n", errorMsg, statuscode);
|
||||
if(rv)
|
||||
{
|
||||
ParodusPrint("validation successful, send event to server\n");
|
||||
sendXmidtEventToServer(xmidtMsg, asyncHandle);
|
||||
return rv;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("validation failed, send failure ack\n");
|
||||
createOutParamsandSendAck(xmidtMsg, asyncHandle, errorMsg , statuscode);
|
||||
xmidtQDequeue();
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
//To remove an event from Queue
|
||||
void xmidtQDequeue()
|
||||
{
|
||||
pthread_mutex_lock (&xmidt_mut);
|
||||
if(XmidtMsgQ != NULL)
|
||||
{
|
||||
XmidtMsgQ = XmidtMsgQ->next;
|
||||
XmidtQsize -= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("XmidtMsgQ is NULL\n");
|
||||
}
|
||||
pthread_mutex_unlock (&xmidt_mut);
|
||||
}
|
||||
|
||||
int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode)
|
||||
{
|
||||
if(eventMsg == NULL)
|
||||
{
|
||||
ParodusError("eventMsg is NULL\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(eventMsg->msg_type != WRP_MSG_TYPE__EVENT)
|
||||
{
|
||||
*errorMsg = strdup("Message format is invalid");
|
||||
*statusCode = INVALID_MSG_TYPE;
|
||||
ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(eventMsg->u.event.source == NULL)
|
||||
{
|
||||
*errorMsg = strdup("Missing source");
|
||||
*statusCode = MISSING_SOURCE;
|
||||
ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(eventMsg->u.event.dest == NULL)
|
||||
{
|
||||
*errorMsg = strdup("Missing dest");
|
||||
*statusCode = MISSING_DEST;
|
||||
ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(eventMsg->u.event.content_type == NULL)
|
||||
{
|
||||
*errorMsg = strdup("Missing content_type");
|
||||
*statusCode = MISSING_CONTENT_TYPE;
|
||||
ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(eventMsg->u.event.payload == NULL)
|
||||
{
|
||||
*errorMsg = strdup("Missing payload");
|
||||
*statusCode = MISSING_PAYLOAD;
|
||||
ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(eventMsg->u.event.payload_size == 0)
|
||||
{
|
||||
*errorMsg = strdup("Missing payloadlen");
|
||||
*statusCode = MISSING_PAYLOADLEN;
|
||||
ParodusError("errorMsg: %s, statusCode: %d\n", *errorMsg, *statusCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ParodusPrint("validateXmidtData success. errorMsg %s statusCode %d\n", *errorMsg, *statusCode);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle)
|
||||
{
|
||||
wrp_msg_t *notif_wrp_msg = NULL;
|
||||
ssize_t msg_len;
|
||||
void *msg_bytes;
|
||||
int ret = -1;
|
||||
char sourceStr[64] = {'\0'};
|
||||
char *device_id = NULL;
|
||||
size_t device_id_len = 0;
|
||||
int sendRetStatus = 1;
|
||||
char *errorMsg = NULL;
|
||||
int qos = 0;
|
||||
|
||||
notif_wrp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t));
|
||||
if(notif_wrp_msg != NULL)
|
||||
{
|
||||
memset(notif_wrp_msg, 0, sizeof(wrp_msg_t));
|
||||
notif_wrp_msg->msg_type = WRP_MSG_TYPE__EVENT;
|
||||
|
||||
ParodusPrint("msg->u.event.source: %s\n",msg->u.event.source);
|
||||
|
||||
if(msg->u.event.source !=NULL)
|
||||
{
|
||||
//To get device_id in the format "mac:112233445xxx"
|
||||
ret = getDeviceId(&device_id, &device_id_len);
|
||||
if(ret == 0)
|
||||
{
|
||||
ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len);
|
||||
snprintf(sourceStr, sizeof(sourceStr), "%s/%s", device_id, msg->u.event.source);
|
||||
ParodusPrint("sourceStr formed is %s\n" , sourceStr);
|
||||
notif_wrp_msg->u.event.source = strdup(sourceStr);
|
||||
ParodusInfo("source:%s\n", notif_wrp_msg->u.event.source);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to get device_id\n");
|
||||
}
|
||||
if(device_id != NULL)
|
||||
{
|
||||
free(device_id);
|
||||
device_id = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if(msg->u.event.dest != NULL)
|
||||
{
|
||||
notif_wrp_msg->u.event.dest = msg->u.event.dest;
|
||||
ParodusInfo("destination: %s\n", notif_wrp_msg->u.event.dest);
|
||||
}
|
||||
|
||||
if(msg->u.event.transaction_uuid != NULL)
|
||||
{
|
||||
notif_wrp_msg->u.event.transaction_uuid = msg->u.event.transaction_uuid;
|
||||
ParodusPrint("Notification transaction_uuid %s\n", notif_wrp_msg->u.event.transaction_uuid);
|
||||
}
|
||||
|
||||
if(msg->u.event.content_type != NULL)
|
||||
{
|
||||
if(strcmp(msg->u.event.content_type , "JSON") == 0)
|
||||
{
|
||||
notif_wrp_msg->u.event.content_type = strdup("application/json");
|
||||
}
|
||||
ParodusPrint("content_type is %s\n",notif_wrp_msg->u.event.content_type);
|
||||
}
|
||||
|
||||
if(msg->u.event.payload != NULL)
|
||||
{
|
||||
ParodusInfo("Notification payload: %s\n",msg->u.event.payload);
|
||||
notif_wrp_msg->u.event.payload = (void *)msg->u.event.payload;
|
||||
notif_wrp_msg->u.event.payload_size = msg->u.event.payload_size;
|
||||
ParodusPrint("payload size %lu\n", notif_wrp_msg->u.event.payload_size);
|
||||
}
|
||||
|
||||
if(msg->u.event.qos != 0)
|
||||
{
|
||||
notif_wrp_msg->u.event.qos = msg->u.event.qos;
|
||||
qos = notif_wrp_msg->u.event.qos;
|
||||
ParodusInfo("Notification qos: %d\n",notif_wrp_msg->u.event.qos);
|
||||
}
|
||||
msg_len = wrp_struct_to (notif_wrp_msg, WRP_BYTES, &msg_bytes);
|
||||
|
||||
ParodusPrint("Encoded xmidt wrp msg, msg_len %lu\n", msg_len);
|
||||
if(msg_len > 0)
|
||||
{
|
||||
ParodusPrint("sendUpstreamMsgToServer\n");
|
||||
sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("wrp msg_len is zero\n");
|
||||
errorMsg = strdup("Wrp message encoding failed");
|
||||
createOutParamsandSendAck(msg, asyncHandle, errorMsg, WRP_ENCODE_FAILURE);
|
||||
xmidtQDequeue();
|
||||
|
||||
ParodusPrint("wrp_free_struct\n");
|
||||
if(notif_wrp_msg != NULL)
|
||||
{
|
||||
wrp_free_struct(notif_wrp_msg);
|
||||
}
|
||||
|
||||
if(msg_bytes != NULL)
|
||||
{
|
||||
free(msg_bytes);
|
||||
msg_bytes = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while(sendRetStatus) //If SendMessage is failed condition
|
||||
{
|
||||
ParodusError("sendXmidtEventToServer is Failed\n");
|
||||
if(highQosValueCheck(qos))
|
||||
{
|
||||
ParodusPrint("The event is having high qos retry again\n");
|
||||
ParodusInfo("Wait till connection is Up\n");
|
||||
|
||||
pthread_mutex_lock(get_global_cloud_status_mut());
|
||||
pthread_cond_wait(get_global_cloud_status_cond(), get_global_cloud_status_mut());
|
||||
pthread_mutex_unlock(get_global_cloud_status_mut());
|
||||
ParodusInfo("Received cloud status signal proceed to retry\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
errorMsg = strdup("send failed due to client disconnect");
|
||||
ParodusInfo("The event is having low qos proceed to dequeue\n");
|
||||
createOutParamsandSendAck(msg, asyncHandle, errorMsg, CLIENT_DISCONNECT);
|
||||
xmidtQDequeue();
|
||||
break;
|
||||
}
|
||||
sendRetStatus = sendUpstreamMsgToServer(&msg_bytes, msg_len);
|
||||
}
|
||||
|
||||
if(sendRetStatus == 0)
|
||||
{
|
||||
errorMsg = strdup("send to server success");
|
||||
createOutParamsandSendAck(msg, asyncHandle, errorMsg, DELIVERED_SUCCESS);
|
||||
xmidtQDequeue();
|
||||
}
|
||||
|
||||
ParodusPrint("B4 notif wrp_free_struct\n");
|
||||
if(notif_wrp_msg != NULL)
|
||||
{
|
||||
wrp_free_struct(notif_wrp_msg);
|
||||
}
|
||||
|
||||
if(msg_bytes != NULL)
|
||||
{
|
||||
free(msg_bytes);
|
||||
msg_bytes = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
errorMsg = strdup("Memory allocation failed");
|
||||
ParodusError("Memory allocation failed\n");
|
||||
createOutParamsandSendAck(msg, asyncHandle, errorMsg, MSG_PROCESSING_FAILED);
|
||||
xmidtQDequeue();
|
||||
}
|
||||
|
||||
if(msg->u.event.source !=NULL)
|
||||
{
|
||||
free(msg->u.event.source);
|
||||
msg->u.event.source = NULL;
|
||||
}
|
||||
if(msg->u.event.content_type !=NULL)
|
||||
{
|
||||
free(msg->u.event.content_type);
|
||||
msg->u.event.content_type = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode)
|
||||
{
|
||||
rbusObject_t outParams;
|
||||
rbusError_t err;
|
||||
rbusValue_t value;
|
||||
char qosstring[20] = "";
|
||||
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetString(value, "event");
|
||||
rbusObject_Init(&outParams, NULL);
|
||||
rbusObject_SetValue(outParams, "msg_type", value);
|
||||
rbusValue_Release(value);
|
||||
|
||||
ParodusPrint("statuscode %d errorMsg %s\n", statuscode, errorMsg);
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetInt32(value, statuscode);
|
||||
rbusObject_SetValue(outParams, "status", value);
|
||||
rbusValue_Release(value);
|
||||
|
||||
if(errorMsg !=NULL)
|
||||
{
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetString(value, errorMsg);
|
||||
rbusObject_SetValue(outParams, "error_message", value);
|
||||
rbusValue_Release(value);
|
||||
free(errorMsg);
|
||||
}
|
||||
|
||||
if(msg != NULL)
|
||||
{
|
||||
if(msg->u.event.source !=NULL)
|
||||
{
|
||||
ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source);
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetString(value, msg->u.event.source);
|
||||
rbusObject_SetValue(outParams, "source", value);
|
||||
rbusValue_Release(value);
|
||||
}
|
||||
|
||||
if(msg->u.event.dest !=NULL)
|
||||
{
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetString(value, msg->u.event.dest);
|
||||
rbusObject_SetValue(outParams, "dest", value);
|
||||
rbusValue_Release(value);
|
||||
}
|
||||
|
||||
if(msg->u.event.content_type !=NULL)
|
||||
{
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetString(value, msg->u.event.content_type);
|
||||
rbusObject_SetValue(outParams, "content_type", value);
|
||||
rbusValue_Release(value);
|
||||
}
|
||||
|
||||
rbusValue_Init(&value);
|
||||
snprintf(qosstring, sizeof(qosstring), "%d", msg->u.event.qos);
|
||||
ParodusPrint("qosstring is %s\n", qosstring);
|
||||
rbusValue_SetString(value, qosstring);
|
||||
rbusObject_SetValue(outParams, "qos", value);
|
||||
rbusValue_Release(value);
|
||||
|
||||
if(msg->u.event.transaction_uuid !=NULL)
|
||||
{
|
||||
rbusValue_Init(&value);
|
||||
rbusValue_SetString(value, msg->u.event.transaction_uuid);
|
||||
rbusObject_SetValue(outParams, "transaction_uuid", value);
|
||||
rbusValue_Release(value);
|
||||
ParodusPrint("outParams msg->u.event.transaction_uuid %s\n", msg->u.event.transaction_uuid);
|
||||
}
|
||||
}
|
||||
|
||||
if(outParams !=NULL)
|
||||
{
|
||||
//rbusObject_fwrite(outParams, 1, stdout);
|
||||
if(asyncHandle == NULL)
|
||||
{
|
||||
ParodusError("asyncHandle is NULL\n");
|
||||
return;
|
||||
}
|
||||
|
||||
err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_SUCCESS, outParams);
|
||||
//err = rbusMethod_SendAsyncResponse(asyncHandle, RBUS_ERROR_INVALID_RESPONSE_FROM_DESTINATION, outParams); //for negative case
|
||||
|
||||
if(err != RBUS_ERROR_SUCCESS)
|
||||
{
|
||||
ParodusError("rbusMethod_SendAsyncResponse failed err: %d\n", err);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("rbusMethod_SendAsyncResponse success: %d\n", err);
|
||||
}
|
||||
|
||||
rbusObject_Release(outParams);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to create outParams\n");
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief This function handles check method call from t2 before the actual inParams SET and to not proceed with inParams processing.
|
||||
*/
|
||||
int checkInputParameters(rbusObject_t inParams)
|
||||
{
|
||||
rbusValue_t check = rbusObject_GetValue(inParams, "check");
|
||||
if(check)
|
||||
{
|
||||
ParodusPrint("Rbus check method. Not proceeding to process this inparam\n");
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
//To generate unique transaction id for xmidt send requests
|
||||
char* generate_transaction_uuid()
|
||||
{
|
||||
char *transID = NULL;
|
||||
uuid_t transaction_Id;
|
||||
char *trans_id = NULL;
|
||||
trans_id = (char *)malloc(37);
|
||||
uuid_generate_random(transaction_Id);
|
||||
uuid_unparse(transaction_Id, trans_id);
|
||||
|
||||
if(trans_id !=NULL)
|
||||
{
|
||||
transID = trans_id;
|
||||
}
|
||||
return transID;
|
||||
}
|
||||
|
||||
void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg)
|
||||
{
|
||||
char *msg_typeStr = NULL;
|
||||
char *sourceVal = NULL;
|
||||
char *destStr = NULL, *contenttypeStr = NULL;
|
||||
char *payloadStr = NULL, *qosVal = NULL;
|
||||
unsigned int payloadlength = 0;
|
||||
wrp_msg_t *msg = NULL;
|
||||
|
||||
msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) );
|
||||
if(msg == NULL)
|
||||
{
|
||||
ParodusError("Wrp msg allocation failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
memset( msg, 0, sizeof( wrp_msg_t ) );
|
||||
|
||||
rbusValue_t msg_type = rbusObject_GetValue(inParams, "msg_type");
|
||||
if(msg_type)
|
||||
{
|
||||
if(rbusValue_GetType(msg_type) == RBUS_STRING)
|
||||
{
|
||||
msg_typeStr = (char *) rbusValue_GetString(msg_type, NULL);
|
||||
ParodusPrint("msg_type value received is %s\n", msg_typeStr);
|
||||
if(msg_typeStr !=NULL)
|
||||
{
|
||||
if(strcmp(msg_typeStr, "event") ==0)
|
||||
{
|
||||
msg->msg_type = WRP_MSG_TYPE__EVENT;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("msg_type received is not event : %s\n", msg_typeStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("msg_type is empty\n");
|
||||
}
|
||||
|
||||
rbusValue_t source = rbusObject_GetValue(inParams, "source");
|
||||
if(source)
|
||||
{
|
||||
if(rbusValue_GetType(source) == RBUS_STRING)
|
||||
{
|
||||
sourceVal = (char *)rbusValue_GetString(source, NULL);
|
||||
if(sourceVal !=NULL)
|
||||
{
|
||||
ParodusInfo("source value received is %s\n", sourceVal);
|
||||
msg->u.event.source = strdup(sourceVal);
|
||||
}
|
||||
ParodusPrint("msg->u.event.source is %s\n", msg->u.event.source);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("source is empty\n");
|
||||
}
|
||||
|
||||
rbusValue_t dest = rbusObject_GetValue(inParams, "dest");
|
||||
if(dest)
|
||||
{
|
||||
if(rbusValue_GetType(dest) == RBUS_STRING)
|
||||
{
|
||||
destStr = (char *)rbusValue_GetString(dest, NULL);
|
||||
if(destStr !=NULL)
|
||||
{
|
||||
ParodusPrint("dest value received is %s\n", destStr);
|
||||
msg->u.event.dest = strdup(destStr);
|
||||
ParodusPrint("msg->u.event.dest is %s\n", msg->u.event.dest);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("dest is empty\n");
|
||||
}
|
||||
|
||||
rbusValue_t contenttype = rbusObject_GetValue(inParams, "content_type");
|
||||
if(contenttype)
|
||||
{
|
||||
if(rbusValue_GetType(contenttype) == RBUS_STRING)
|
||||
{
|
||||
contenttypeStr = (char *)rbusValue_GetString(contenttype, NULL);
|
||||
if(contenttypeStr !=NULL)
|
||||
{
|
||||
ParodusPrint("contenttype value received is %s\n", contenttypeStr);
|
||||
msg->u.event.content_type = strdup(contenttypeStr);
|
||||
ParodusPrint("msg->u.event.content_type is %s\n", msg->u.event.content_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("contenttype is empty\n");
|
||||
}
|
||||
|
||||
rbusValue_t payload = rbusObject_GetValue(inParams, "payload");
|
||||
if(payload)
|
||||
{
|
||||
if((rbusValue_GetType(payload) == RBUS_STRING))
|
||||
{
|
||||
payloadStr = (char *)rbusValue_GetString(payload, NULL);
|
||||
if(payloadStr !=NULL)
|
||||
{
|
||||
ParodusPrint("payload received is %s\n", payloadStr);
|
||||
msg->u.event.payload = strdup(payloadStr);
|
||||
ParodusPrint("msg->u.event.payload is %s\n", msg->u.event.payload);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("payloadStr is empty\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("payload is empty\n");
|
||||
}
|
||||
|
||||
rbusValue_t payloadlen = rbusObject_GetValue(inParams, "payloadlen");
|
||||
if(payloadlen)
|
||||
{
|
||||
if(rbusValue_GetType(payloadlen) == RBUS_INT32)
|
||||
{
|
||||
ParodusPrint("payloadlen type %d RBUS_INT32 %d\n", rbusValue_GetType(payloadlen), RBUS_INT32);
|
||||
payloadlength = rbusValue_GetInt32(payloadlen);
|
||||
ParodusPrint("payloadlen received is %lu\n", payloadlength);
|
||||
msg->u.event.payload_size = (size_t) payloadlength;
|
||||
ParodusPrint("msg->u.event.payload_size is %lu\n", msg->u.event.payload_size);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("payloadlen is empty\n");
|
||||
}
|
||||
|
||||
ParodusPrint("check qos\n");
|
||||
rbusValue_t qos = rbusObject_GetValue(inParams, "qos");
|
||||
if(qos)
|
||||
{
|
||||
if(rbusValue_GetType(qos) == RBUS_STRING)
|
||||
{
|
||||
ParodusPrint("qos type %d RBUS_STRING %d\n", rbusValue_GetType(qos), RBUS_STRING);
|
||||
qosVal = (char *)rbusValue_GetString(qos, NULL);
|
||||
ParodusPrint("qos received is %s\n", qosVal);
|
||||
if(qosVal !=NULL)
|
||||
{
|
||||
msg->u.event.qos = atoi(qosVal);
|
||||
ParodusPrint("msg->u.event.qos is %d\n", msg->u.event.qos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(trans_id !=NULL)
|
||||
{
|
||||
ParodusPrint("Add trans_id %s to wrp message\n", trans_id);
|
||||
msg->u.event.transaction_uuid = strdup(trans_id);
|
||||
free(trans_id);
|
||||
trans_id = NULL;
|
||||
ParodusPrint("msg->u.event.transaction_uuid is %s\n", msg->u.event.transaction_uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("transaction_uuid is empty\n");
|
||||
}
|
||||
|
||||
*eventMsg = msg;
|
||||
ParodusPrint("parseRbusInparamsToWrp End\n");
|
||||
}
|
||||
|
||||
static rbusError_t sendDataHandler(rbusHandle_t handle, char const* methodName, rbusObject_t inParams, rbusObject_t outParams, rbusMethodAsyncHandle_t asyncHandle)
|
||||
{
|
||||
(void) handle;
|
||||
(void) outParams;
|
||||
int inStatus = 0;
|
||||
char *transaction_uuid = NULL;
|
||||
wrp_msg_t *wrpMsg= NULL;
|
||||
ParodusInfo("methodHandler called: %s\n", methodName);
|
||||
//printRBUSParams(inParams, INPARAMS_PATH);
|
||||
|
||||
if((methodName !=NULL) && (strcmp(methodName, XMIDT_SEND_METHOD) == 0))
|
||||
{
|
||||
inStatus = checkInputParameters(inParams);
|
||||
if(inStatus)
|
||||
{
|
||||
//generate transaction id to create outParams and send ack
|
||||
transaction_uuid = generate_transaction_uuid();
|
||||
ParodusInfo("xmidt transaction_uuid generated is %s\n", transaction_uuid);
|
||||
parseRbusInparamsToWrp(inParams, transaction_uuid, &wrpMsg);
|
||||
|
||||
//xmidt send producer
|
||||
addToXmidtUpstreamQ(wrpMsg, asyncHandle);
|
||||
ParodusInfo("sendDataHandler returned %d\n", RBUS_ERROR_ASYNC_RESPONSE);
|
||||
return RBUS_ERROR_ASYNC_RESPONSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("check method call received, ignoring input\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Method %s received is not supported\n", methodName);
|
||||
return RBUS_ERROR_BUS_ERROR;
|
||||
}
|
||||
ParodusPrint("send RBUS_ERROR_SUCCESS\n");
|
||||
return RBUS_ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int regXmidtSendDataMethod()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
rbusDataElement_t dataElements[1] = { { XMIDT_SEND_METHOD, RBUS_ELEMENT_TYPE_METHOD, { NULL, NULL, NULL, NULL, NULL, sendDataHandler } } };
|
||||
|
||||
rbusHandle_t rbus_handle = get_parodus_rbus_Handle();
|
||||
|
||||
ParodusPrint("Registering xmidt sendData method %s\n", XMIDT_SEND_METHOD);
|
||||
if(!rbus_handle)
|
||||
{
|
||||
ParodusError("regXmidtSendDataMethod failed as rbus_handle is empty\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = rbus_regDataElements(rbus_handle, 1, dataElements);
|
||||
|
||||
if(rc != RBUS_ERROR_SUCCESS)
|
||||
{
|
||||
ParodusError("Register xmidt sendData method failed: %d\n", rc);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("Register xmidt sendData method %s success\n", XMIDT_SEND_METHOD);
|
||||
|
||||
//start xmidt queue consumer thread .
|
||||
processXmidtData();
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
//To print and store params output to a file
|
||||
void printRBUSParams(rbusObject_t params, char* file_path)
|
||||
{
|
||||
if( NULL != params )
|
||||
{
|
||||
FILE *fd = fopen(file_path, "w+");
|
||||
rbusObject_fwrite(params, 1, fd);
|
||||
fclose(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Params is NULL\n");
|
||||
}
|
||||
}
|
||||
85
src/xmidtsend_rbus.h
Normal file
85
src/xmidtsend_rbus.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Copyright 2022 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file xmidtsend_rbus.h
|
||||
*
|
||||
* @description This header defines functions required to manage xmidt send messages via rbus.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _XMIDTSEND_RBUS_H_
|
||||
#define _XMIDTSEND_RBUS_H_
|
||||
#include <rbus.h>
|
||||
#include <uuid/uuid.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData"
|
||||
#define MAX_QUEUE_SIZE 10
|
||||
#define INPARAMS_PATH "/tmp/inparams.txt"
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct XmidtMsg__
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
rbusMethodAsyncHandle_t asyncHandle;
|
||||
struct XmidtMsg__ *next;
|
||||
} XmidtMsg;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DELIVERED_SUCCESS = 0,
|
||||
INVALID_MSG_TYPE,
|
||||
MISSING_SOURCE,
|
||||
MISSING_DEST,
|
||||
MISSING_CONTENT_TYPE,
|
||||
MISSING_PAYLOAD,
|
||||
MISSING_PAYLOADLEN,
|
||||
QUEUE_SIZE_EXCEEDED,
|
||||
WRP_ENCODE_FAILURE,
|
||||
MSG_PROCESSING_FAILED,
|
||||
ENQUEUE_FAILURE = 100,
|
||||
CLIENT_DISCONNECT = 101
|
||||
} XMIDT_STATUS;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
rbusHandle_t get_parodus_rbus_Handle(void);
|
||||
void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
void* processXmidtUpstreamMsg();
|
||||
void processXmidtData();
|
||||
int processData(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
void sendXmidtEventToServer(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
int checkInputParameters(rbusObject_t inParams);
|
||||
char* generate_transaction_uuid();
|
||||
void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg);
|
||||
void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode);
|
||||
int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode);
|
||||
void xmidtQDequeue();
|
||||
bool highQosValueCheck(int qos);
|
||||
void waitTillConnectionIsUp();
|
||||
void printRBUSParams(rbusObject_t params, char* file_path);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _XMIDTSEND_RBUS_H_ */
|
||||
|
||||
@@ -16,7 +16,9 @@ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -g -fprofile-arcs -ftest-coverage
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST ")
|
||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -W -g -fprofile-arcs -ftest-coverage -O0")
|
||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -O0")
|
||||
set (PARODUS_COMMON_SRC ../src/string_helpers.c ../src/mutex.c ../src/time.c ../src/config.c ../src/spin_thread.c ../src/token.c)
|
||||
set (PARODUS_COMMON_SRC ../src/string_helpers.c ../src/mutex.c
|
||||
../src/time.c ../src/config.c ../src/spin_thread.c
|
||||
../src/event_handler.c ../src/token.c)
|
||||
set (PARODUS_COMMON_LIBS gcov -lcunit -lcimplog -lwrp-c
|
||||
-luuid -lmsgpackc -lnopoll -lnanomsg -lpthread
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
@@ -30,6 +32,10 @@ if (FEATURE_DNS_QUERY)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lucresolv -lresolv)
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lrbus -lrbus-core)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if(NOT DISABLE_VALGRIND)
|
||||
set (MEMORY_CHECK valgrind --leak-check=full --show-reachable=yes -v)
|
||||
endif ()
|
||||
@@ -88,16 +94,16 @@ target_link_libraries (test_spin_thread_e ${PARODUS_COMMON_LIBS} )
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_spin_thread success
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_spin_thread_s COMMAND ${MEMORY_CHECK} ./test_spin_thread_s)
|
||||
add_executable(test_spin_thread_s test_spin_thread_s.c ../src/spin_thread.c)
|
||||
target_link_libraries (test_spin_thread_s ${PARODUS_COMMON_LIBS} )
|
||||
# add_test(NAME test_spin_thread_s COMMAND ${MEMORY_CHECK} ./test_spin_thread_s)
|
||||
# add_executable(test_spin_thread_s test_spin_thread_s.c ../src/spin_thread.c)
|
||||
# target_link_libraries (test_spin_thread_s ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_string_helpers
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_string_helpers COMMAND ${MEMORY_CHECK} ./test_string_helpers)
|
||||
add_executable(test_string_helpers test_string_helpers.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_string_helpers ${PARODUS_COMMON_LIBS} )
|
||||
# add_test(NAME test_string_helpers COMMAND ${MEMORY_CHECK} ./test_string_helpers)
|
||||
# add_executable(test_string_helpers test_string_helpers.c ../src/string_helpers.c)
|
||||
# target_link_libraries (test_string_helpers ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_nopoll_handlers
|
||||
@@ -152,7 +158,11 @@ set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
add_executable(test_client_list ${CLIST_SRC})
|
||||
#target_link_libraries (test_client_list ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS} -lcurl -luuid)
|
||||
@@ -170,6 +180,10 @@ else()
|
||||
set(SVA_SRC ${SVA_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(SVA_SRC ${SVA_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
add_executable(test_service_alive ${SVA_SRC})
|
||||
#target_link_libraries (test_service_alive ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS} -lcurl -luuid)
|
||||
@@ -222,7 +236,8 @@ target_link_libraries (test_crud_tasks -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
# test_crud_internal
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_crud_internal COMMAND ${MEMORY_CHECK} ./test_crud_internal)
|
||||
add_executable(test_crud_internal test_crud_internal.c ../src/config.c ../src/close_retry.c ../src/string_helpers.c ../src/crud_internal.c )
|
||||
add_executable(test_crud_internal test_crud_internal.c ../src/config.c ../src/close_retry.c
|
||||
../src/ParodusInternal.c ../src/string_helpers.c ../src/crud_internal.c ../src/client_list.c)
|
||||
target_link_libraries (test_crud_internal -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -233,7 +248,7 @@ add_executable(test_upstream test_upstream.c ../src/upstream.c ../src/close_retr
|
||||
target_link_libraries (test_upstream -lcmocka gcov -lcunit -lcimplog
|
||||
-lwrp-c -luuid -lpthread -lmsgpackc -lnopoll
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
-lssl -lcrypto -lrt -lm)
|
||||
-lssl -lcrypto -lrt -lm -lnanomsg)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_upstream_sock
|
||||
@@ -283,12 +298,17 @@ set(CONIFC_SRC test_conn_interface.c
|
||||
../src/mutex.c
|
||||
../src/heartBeat.c
|
||||
../src/close_retry.c
|
||||
../src/event_handler.c
|
||||
../src/client_list.c
|
||||
)
|
||||
if (ENABLE_SESHAT)
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
add_executable(test_conn_interface ${CONIFC_SRC})
|
||||
target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid )
|
||||
|
||||
@@ -320,7 +340,7 @@ set(TOKEN_SRC ../src/conn_interface.c ../src/config.c
|
||||
../src/thread_tasks.c ../src/time.c
|
||||
../src/string_helpers.c ../src/mutex.c
|
||||
../src/token.c ../src/heartBeat.c
|
||||
../src/close_retry.c
|
||||
../src/close_retry.c ../src/event_handler.c
|
||||
)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
@@ -335,6 +355,10 @@ else()
|
||||
set(TOKEN_SRC test_token_stub.c ${TOKEN_SRC})
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(TOKEN_SRC ${TOKEN_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
add_executable(test_token ${TOKEN_SRC} )
|
||||
#target_link_libraries (test_token ${PARODUS_COMMON_LIBS} ${PARODUS_JWT_LIBS} -lcmocka )
|
||||
target_link_libraries (test_token ${PARODUS_COMMON_LIBS} -lcmocka -lcurl -luuid)
|
||||
|
||||
104
tests/mock_event_handler.c
Normal file
104
tests/mock_event_handler.c
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* If not stated otherwise in this file or this component's Licenses.txt file the
|
||||
* following copyright and licenses apply:
|
||||
*
|
||||
* Copyright 2016 RDK Management
|
||||
* Copyright [2014] [Cisco Systems, Inc.]
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* This is a test version of event_handler.c that can be used
|
||||
* to simulate interface down, interface up event
|
||||
* You overwrite event_handler.c in the src diectory with this
|
||||
* version. It will generate interface down / interface up events
|
||||
* at random intervals between 60 secs and 124 secs
|
||||
*/
|
||||
|
||||
#include "parodus_log.h"
|
||||
#include "event_handler.h"
|
||||
#include "connection.h"
|
||||
#include "config.h"
|
||||
#include "heartBeat.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include "time.h"
|
||||
#include "close_retry.h"
|
||||
|
||||
extern bool g_shutdown;
|
||||
|
||||
static pthread_t sysevent_tid;
|
||||
|
||||
static void start_interface_down (void)
|
||||
{
|
||||
set_interface_down_event();
|
||||
ParodusInfo("Interface_down_event is set\n");
|
||||
pause_heartBeatTimer();
|
||||
}
|
||||
|
||||
static void end_interface_down (void)
|
||||
{
|
||||
reset_interface_down_event();
|
||||
ParodusInfo("Interface_down_event is reset\n");
|
||||
resume_heartBeatTimer();
|
||||
set_close_retry();
|
||||
}
|
||||
|
||||
// waits from 60 to 124 secs
|
||||
int wait_random (const char *msg)
|
||||
{
|
||||
#define HALF_SEC 500000l
|
||||
long delay = (random() >> 5) + 60000000l;
|
||||
long secs, usecs;
|
||||
struct timeval timeout;
|
||||
|
||||
secs = delay / 1000000;
|
||||
usecs = delay % 1000000;
|
||||
ParodusInfo ("Waiting %ld secs %ld usecs for %s\n", secs, usecs, msg);
|
||||
|
||||
while (!g_shutdown) {
|
||||
timeout.tv_sec = 0;
|
||||
if (delay <= HALF_SEC) {
|
||||
timeout.tv_usec = delay;
|
||||
select (0, NULL, NULL, NULL, &timeout);
|
||||
return 0;
|
||||
}
|
||||
timeout.tv_usec = HALF_SEC;
|
||||
delay -= HALF_SEC;
|
||||
select (0, NULL, NULL, NULL, &timeout);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static void *parodus_sysevent_handler (void *data)
|
||||
{
|
||||
while (!g_shutdown) {
|
||||
if (wait_random ("interface down") != 0)
|
||||
break;
|
||||
start_interface_down ();
|
||||
wait_random ("interface up");
|
||||
end_interface_down ();
|
||||
}
|
||||
ParodusInfo ("Exiting event handler\n");
|
||||
return data;
|
||||
}
|
||||
|
||||
void EventHandler()
|
||||
{
|
||||
ParodusInfo ("RAND_MAX is %ld (0x%lx)\n", RAND_MAX, RAND_MAX);
|
||||
srandom (getpid());
|
||||
|
||||
pthread_create(&sysevent_tid, NULL, parodus_sysevent_handler, NULL);
|
||||
}
|
||||
@@ -92,7 +92,7 @@ void test_set_parodus_cfg()
|
||||
CU_ASSERT_STRING_EQUAL(cfg.hw_last_reboot_reason,get_parodus_cfg()->hw_last_reboot_reason);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.fw_name,get_parodus_cfg()->fw_name);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_url, get_parodus_cfg()->webpa_url);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_interface_used , get_parodus_cfg()->webpa_interface_used);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_interface_used , getWebpaInterface());
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_protocol, get_parodus_cfg()->webpa_protocol);
|
||||
CU_ASSERT_EQUAL(cfg.boot_time, get_parodus_cfg()->boot_time);
|
||||
CU_ASSERT_EQUAL(cfg.webpa_ping_timeout, get_parodus_cfg()->webpa_ping_timeout);
|
||||
@@ -113,7 +113,7 @@ void test_getWebpaConveyHeader()
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->hw_manufacturer, cJSON_GetObjectItem(payload, HW_MANUFACTURER)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->hw_last_reboot_reason, cJSON_GetObjectItem(payload, HW_LAST_REBOOT_REASON)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->fw_name, cJSON_GetObjectItem(payload, FIRMWARE_NAME)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->webpa_interface_used, cJSON_GetObjectItem(payload, WEBPA_INTERFACE)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(getWebpaInterface(), cJSON_GetObjectItem(payload, WEBPA_INTERFACE)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->webpa_protocol, cJSON_GetObjectItem(payload, WEBPA_PROTOCOL)->valuestring);
|
||||
CU_ASSERT_EQUAL((int)get_parodus_cfg()->boot_time, cJSON_GetObjectItem(payload, BOOT_TIME)->valueint);
|
||||
|
||||
|
||||
@@ -55,14 +55,31 @@ int curl_easy_perform(CURL *curl)
|
||||
return rtn;
|
||||
}
|
||||
|
||||
extern int g_response_code;
|
||||
|
||||
void setGlobalResponseCode (int response_code)
|
||||
{
|
||||
g_response_code = response_code;
|
||||
}
|
||||
|
||||
int curl_easy_getinfo(CURL *curl, CURLINFO CURLINFO_RESPONSE_CODE, long response_code)
|
||||
{
|
||||
UNUSED(curl);
|
||||
UNUSED(CURLINFO_RESPONSE_CODE);
|
||||
UNUSED(response_code);
|
||||
if (0 != g_response_code)
|
||||
{
|
||||
response_code= g_response_code;
|
||||
ParodusInfo("response_code is %ld\n", response_code);
|
||||
}
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* get_global_reconnect_reason()
|
||||
{
|
||||
return "none";
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -166,6 +183,7 @@ void test_requestNewAuthToken ()
|
||||
|
||||
test_data.size = 0;
|
||||
test_data.data = token;
|
||||
setGlobalResponseCode(200);
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
@@ -216,6 +234,7 @@ void test_getAuthToken ()
|
||||
/* To test curl success case */
|
||||
test_data.size = 0;
|
||||
test_data.data = cfg.webpa_auth_token;
|
||||
setGlobalResponseCode(200);
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
@@ -313,6 +332,86 @@ void test_write_callback_fn ()
|
||||
free(data.data);
|
||||
}
|
||||
|
||||
void test_requestNewAuthToken_non200 ()
|
||||
{
|
||||
char token[1024];
|
||||
ParodusCfg cfg;
|
||||
int output;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
test_data.size = 0;
|
||||
test_data.data = token;
|
||||
setGlobalResponseCode(404);
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
output = requestNewAuthToken (token, sizeof(token), 1);
|
||||
assert_int_equal (output, -1);
|
||||
assert_string_equal (token, "");
|
||||
ParodusInfo("requestNewAuthToken output: %d token empty len: %lu\n", output, strlen(token));
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
void test_getAuthTokenFailure_non200 ()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
cfg.client_cert_path = strdup("testcert");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
setGlobalResponseCode(504);
|
||||
getAuthToken(&cfg);
|
||||
|
||||
assert_string_equal( cfg.webpa_auth_token, "");
|
||||
|
||||
free(cfg.client_cert_path);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -328,6 +427,8 @@ int main(void)
|
||||
cmocka_unit_test(getAuthToken_MacNull),
|
||||
cmocka_unit_test(test_getAuthToken),
|
||||
cmocka_unit_test(test_getAuthTokenFailure),
|
||||
cmocka_unit_test(test_requestNewAuthToken_non200),
|
||||
cmocka_unit_test(test_getAuthTokenFailure_non200)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
@@ -69,6 +69,13 @@ int curl_easy_getinfo(CURL *curl, CURLINFO CURLINFO_RESPONSE_CODE, long response
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* get_global_reconnect_reason()
|
||||
{
|
||||
return "none";
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -32,6 +32,8 @@ pthread_t test_tid2;
|
||||
static void *client_rcv_task();
|
||||
static void *client2_rcv_task();
|
||||
|
||||
int numLoops;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -53,6 +53,11 @@ void create_token_script(char *fname)
|
||||
system(command);
|
||||
}
|
||||
|
||||
char* get_global_reconnect_reason()
|
||||
{
|
||||
return "none";
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -98,7 +103,7 @@ void test_setParodusConfig()
|
||||
assert_string_equal(cfg.hw_last_reboot_reason, temp->hw_last_reboot_reason);
|
||||
assert_string_equal(cfg.webpa_path_url, temp->webpa_path_url);
|
||||
assert_string_equal(cfg.webpa_url, temp->webpa_url);
|
||||
assert_string_equal(cfg.webpa_interface_used, temp->webpa_interface_used);
|
||||
assert_string_equal(cfg.webpa_interface_used, getWebpaInterface());
|
||||
assert_string_equal(cfg.webpa_protocol, temp->webpa_protocol);
|
||||
assert_string_equal(cfg.webpa_uuid, temp->webpa_uuid);
|
||||
assert_string_equal(cfg.partner_id, temp->partner_id);
|
||||
@@ -116,6 +121,8 @@ void test_setParodusConfig()
|
||||
assert_string_equal(cfg.jwt_key, temp->jwt_key);
|
||||
#endif
|
||||
assert_string_equal(cfg.crud_config_file, temp->crud_config_file);
|
||||
|
||||
free(cfg.crud_config_file);
|
||||
}
|
||||
|
||||
void test_getParodusConfig()
|
||||
@@ -201,13 +208,11 @@ void test_parseCommandLine()
|
||||
|
||||
ParodusCfg parodusCfg;
|
||||
memset(&parodusCfg,0,sizeof(parodusCfg));
|
||||
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
write_key_to_file ("../../tests/jwt_key.tst", jwt_key);
|
||||
#endif
|
||||
create_token_script("/tmp/token.sh");
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), 0);
|
||||
|
||||
assert_string_equal( parodusCfg.hw_model, "TG1682");
|
||||
assert_string_equal( parodusCfg.hw_serial_number, "Fer23u948590");
|
||||
assert_string_equal( parodusCfg.hw_manufacturer, "ARRISGroup,Inc.");
|
||||
@@ -299,8 +304,9 @@ void test_loadParodusCfg()
|
||||
{
|
||||
ParodusCfg tmpcfg;
|
||||
ParodusCfg *Cfg = NULL;
|
||||
Cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
char protocol[32] = {'\0'};
|
||||
Cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
memset(Cfg, 0, sizeof(ParodusCfg));
|
||||
|
||||
parStrncpy(Cfg->hw_model, "TG1682", sizeof(Cfg->hw_model));
|
||||
parStrncpy(Cfg->hw_serial_number, "Fer23u948590", sizeof(Cfg->hw_serial_number));
|
||||
@@ -351,6 +357,14 @@ void test_loadParodusCfg()
|
||||
assert_string_equal(tmpcfg.seshat_url, "ipc://tmp/seshat_service.url");
|
||||
#endif
|
||||
assert_string_equal(tmpcfg.crud_config_file, "parodus_cfg.json");
|
||||
|
||||
free(tmpcfg.client_cert_path);
|
||||
free(tmpcfg.token_server_url);
|
||||
free(tmpcfg.crud_config_file);
|
||||
|
||||
free(Cfg->crud_config_file);
|
||||
free(Cfg->client_cert_path);
|
||||
free(Cfg->token_server_url);
|
||||
free(Cfg);
|
||||
}
|
||||
|
||||
@@ -422,6 +436,8 @@ void test_setDefaultValuesToCfg()
|
||||
assert_string_equal(cfg->webpa_path_url, WEBPA_PATH_URL);
|
||||
assert_string_equal(cfg->webpa_uuid, "1234567-345456546");
|
||||
assert_string_equal(cfg->cloud_status, CLOUD_STATUS_OFFLINE);
|
||||
|
||||
free(cfg);
|
||||
}
|
||||
|
||||
void err_setDefaultValuesToCfg()
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
UpStreamMsg *UpStreamMsgQ;
|
||||
ParodusMsg *ParodusMsgQ;
|
||||
pthread_mutex_t g_mutex=PTHREAD_MUTEX_INITIALIZER;
|
||||
@@ -41,14 +42,26 @@ pthread_mutex_t nano_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t nano_con=PTHREAD_COND_INITIALIZER;
|
||||
pthread_mutex_t svc_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t svc_con=PTHREAD_COND_INITIALIZER;
|
||||
int numLoops;
|
||||
parodusOnPingStatusChangeHandler on_ping_status_change;
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int createNopollConnection(noPollCtx *ctx)
|
||||
void set_server_list_null (server_list_t *server_list)
|
||||
{
|
||||
UNUSED(ctx);
|
||||
UNUSED(server_list);
|
||||
}
|
||||
|
||||
int find_servers (server_list_t *server_list)
|
||||
{
|
||||
UNUSED(server_list);
|
||||
return FIND_SUCCESS;
|
||||
}
|
||||
|
||||
int createNopollConnection(noPollCtx *ctx, server_list_t *server_list)
|
||||
{
|
||||
UNUSED(ctx); UNUSED(server_list);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
@@ -75,14 +88,57 @@ noPollMutexUnlock mutex_unlock
|
||||
function_called();
|
||||
}
|
||||
|
||||
void start_conn_in_progress (void)
|
||||
char *get_global_reconnect_reason()
|
||||
{
|
||||
return reconnect_reason;
|
||||
}
|
||||
|
||||
char *get_global_shutdown_reason()
|
||||
{
|
||||
return SHUTDOWN_REASON_PARODUS_STOP;
|
||||
}
|
||||
|
||||
void set_global_shutdown_reason(char *reason)
|
||||
{
|
||||
UNUSED(reason);
|
||||
}
|
||||
|
||||
int getDeviceId(char **device_id, size_t *device_id_len)
|
||||
{
|
||||
UNUSED(device_id); UNUSED(device_id_len);
|
||||
return 0;
|
||||
}
|
||||
void start_conn_in_progress (unsigned long start_time)
|
||||
{
|
||||
UNUSED(start_time);
|
||||
}
|
||||
|
||||
void stop_conn_in_progress (void)
|
||||
{
|
||||
}
|
||||
|
||||
void reset_interface_down_event (void)
|
||||
{
|
||||
}
|
||||
|
||||
bool get_interface_down_event (void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void set_interface_down_event (void)
|
||||
{
|
||||
}
|
||||
|
||||
int wait_while_interface_down (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void terminate_backoff_delay (void)
|
||||
{
|
||||
}
|
||||
|
||||
void packMetaData()
|
||||
{
|
||||
function_called();
|
||||
@@ -121,6 +177,18 @@ int serviceAliveTask()
|
||||
return 0;
|
||||
}
|
||||
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
UNUSED(msg); UNUSED(partnerIds);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
UNUSED(resp_bytes); UNUSED(resp_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nopoll_loop_wait(noPollCtx * ctx,long timeout)
|
||||
{
|
||||
UNUSED(ctx); UNUSED(timeout);
|
||||
@@ -140,12 +208,19 @@ void set_global_reconnect_status(bool status)
|
||||
function_called();
|
||||
}
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn)
|
||||
void close_and_unref_connection(noPollConn *conn, bool is_shutting_down)
|
||||
{
|
||||
UNUSED(conn);
|
||||
UNUSED(conn); UNUSED(is_shutting_down);
|
||||
function_called();
|
||||
}
|
||||
|
||||
int readFromFile(const char *file_name, char **data)
|
||||
{
|
||||
UNUSED(file_name);
|
||||
*data = strdup ("parodus_stopping");
|
||||
return 1;
|
||||
}
|
||||
|
||||
void nopoll_cleanup_library ()
|
||||
{
|
||||
function_called();
|
||||
@@ -234,9 +309,6 @@ void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
diff->tv_nsec = 1000;
|
||||
}
|
||||
|
||||
void deleteAllClients (void)
|
||||
{
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
@@ -280,6 +352,7 @@ void test_createSocketConnection()
|
||||
|
||||
void test_createSocketConnection1()
|
||||
{
|
||||
numLoops =0;
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0, sizeof(ParodusCfg));
|
||||
@@ -309,11 +382,11 @@ void test_createSocketConnection1()
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(NULL);
|
||||
|
||||
}
|
||||
|
||||
void test_PingMissIntervalTime()
|
||||
{
|
||||
numLoops = 6;
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
@@ -331,7 +404,6 @@ void test_PingMissIntervalTime()
|
||||
//Max ping timeout is 6 sec
|
||||
cfg.webpa_ping_timeout = 6;
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
reset_close_retry();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
@@ -367,11 +439,11 @@ void test_PingMissIntervalTime()
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(NULL);
|
||||
|
||||
}
|
||||
|
||||
void err_createSocketConnection()
|
||||
{
|
||||
numLoops =0;
|
||||
set_close_retry();
|
||||
reset_heartBeatTimer();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
@@ -404,6 +476,7 @@ void err_createSocketConnection()
|
||||
|
||||
void test_createSocketConnection_cloud_disconn()
|
||||
{
|
||||
numLoops =0;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
cfg.cloud_disconnect = strdup("XPC");
|
||||
|
||||
@@ -15,14 +15,12 @@
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <CUnit/Basic.h>
|
||||
#include <nopoll.h>
|
||||
#include <pthread.h>
|
||||
|
||||
@@ -39,6 +37,11 @@ extern void init_expire_timer (expire_timer_t *timer);
|
||||
extern int check_timer_expired (expire_timer_t *timer, long timeout_ms);
|
||||
extern void init_backoff_timer (backoff_timer_t *timer, int max_count);
|
||||
extern int update_backoff_delay (backoff_timer_t *timer);
|
||||
extern void add_timespec (struct timespec *t1, struct timespec *t2);
|
||||
extern unsigned calc_random_secs (int random_num, unsigned max_secs);
|
||||
extern unsigned calc_random_nsecs (int random_num);
|
||||
void calc_random_expiration (int random_num1, int random_num2,
|
||||
backoff_timer_t *timer, struct timespec *ts);
|
||||
extern int init_header_info (header_info_t *header_info);
|
||||
extern void free_header_info (header_info_t *header_info);
|
||||
extern char *build_extra_hdrs (header_info_t *header_info);
|
||||
@@ -59,10 +62,8 @@ extern int keep_trying_to_connect (create_connection_ctx_t *ctx,
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool close_retry;
|
||||
bool LastReasonStatus;
|
||||
bool interface_down_event = false;
|
||||
pthread_mutex_t close_mut;
|
||||
pthread_mutex_t interface_down_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t interface_down_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
@@ -113,6 +114,13 @@ pthread_mutex_t *get_interface_down_mut(void)
|
||||
return &interface_down_mut;
|
||||
}
|
||||
|
||||
int readFromFile(const char *file_name, char **data)
|
||||
{
|
||||
UNUSED(file_name);
|
||||
*data = strdup ("parodus_stopping");
|
||||
return 1;
|
||||
}
|
||||
|
||||
noPollConn * nopoll_conn_new_opts (noPollCtx * ctx, noPollConnOpts * opts, const char * host_ip, const char * host_port, const char * host_name,const char * get_url,const char * protocols, const char * origin)
|
||||
{
|
||||
UNUSED(host_port); UNUSED(host_name); UNUSED(get_url); UNUSED(protocols);
|
||||
@@ -181,6 +189,11 @@ void nopoll_conn_close (noPollConn *conn)
|
||||
UNUSED(conn);
|
||||
}
|
||||
|
||||
void nopoll_conn_close_ext (noPollConn *conn, int status, const char *reason, int reason_size)
|
||||
{
|
||||
UNUSED(conn); UNUSED(status); UNUSED(reason); UNUSED(reason_size);
|
||||
}
|
||||
|
||||
int checkHostIp(char * serverIP)
|
||||
{
|
||||
UNUSED(serverIP);
|
||||
@@ -253,7 +266,7 @@ void test_set_global_reconnect_reason()
|
||||
|
||||
void test_closeConnection()
|
||||
{
|
||||
close_and_unref_connection(get_global_conn());
|
||||
close_and_unref_connection(get_global_conn(), false);
|
||||
}
|
||||
|
||||
void test_server_is_null()
|
||||
@@ -330,13 +343,67 @@ void test_expire_timer()
|
||||
|
||||
void test_backoff_delay_timer()
|
||||
{
|
||||
struct timespec t1;
|
||||
struct timespec t2;
|
||||
backoff_timer_t btimer;
|
||||
|
||||
init_backoff_timer (&btimer, 5);
|
||||
assert_int_equal (3, update_backoff_delay (&btimer));
|
||||
assert_int_equal (7, update_backoff_delay (&btimer));
|
||||
assert_int_equal (15, update_backoff_delay (&btimer));
|
||||
assert_int_equal (31, update_backoff_delay (&btimer));
|
||||
assert_int_equal (31, update_backoff_delay (&btimer));
|
||||
|
||||
t1.tv_sec = 3; t1.tv_nsec = 0;
|
||||
t2.tv_sec = 3; t2.tv_nsec = 0;
|
||||
add_timespec (&t1, &t2);
|
||||
assert_int_equal (6, t2.tv_sec);
|
||||
assert_int_equal (0, t2.tv_nsec);
|
||||
|
||||
t1.tv_sec = 3; t1.tv_nsec = 500*1000000;
|
||||
t2.tv_sec = 3; t2.tv_nsec = 499*1000000;
|
||||
add_timespec (&t1, &t2);
|
||||
assert_int_equal (6, t2.tv_sec);
|
||||
assert_int_equal (999*1000000, t2.tv_nsec);
|
||||
|
||||
t1.tv_sec = 3; t1.tv_nsec = 500*1000000;
|
||||
t2.tv_sec = 3; t2.tv_nsec = 501*1000000;
|
||||
add_timespec (&t1, &t2);
|
||||
assert_int_equal (7, t2.tv_sec);
|
||||
assert_int_equal (1000000, t2.tv_nsec);
|
||||
|
||||
assert_int_equal (3, calc_random_secs (0, 7));
|
||||
assert_int_equal (4, calc_random_secs (1, 7));
|
||||
assert_int_equal (7, calc_random_secs (15, 7));
|
||||
assert_int_equal (3, calc_random_secs (16, 15));
|
||||
assert_int_equal (14, calc_random_secs (30,15));
|
||||
|
||||
assert_int_equal (250000, calc_random_nsecs (500000));
|
||||
assert_int_equal (1, calc_random_nsecs (2000000002));
|
||||
|
||||
init_backoff_timer (&btimer, 5);
|
||||
t1.tv_sec = 0; t1.tv_nsec = 0;
|
||||
/* max delay is 3 */
|
||||
calc_random_expiration (0, 0, &btimer, &t1);
|
||||
assert_int_equal (3, t1.tv_sec);
|
||||
assert_int_equal (0, t1.tv_nsec);
|
||||
|
||||
t1.tv_sec = 0; t1.tv_nsec = 0;
|
||||
/* max delay is 7*/
|
||||
calc_random_expiration (15, 1073741824, &btimer, &t1);
|
||||
assert_int_equal (7, t1.tv_sec);
|
||||
assert_int_equal (536870912, t1.tv_nsec);
|
||||
|
||||
t1.tv_sec = 0; t1.tv_nsec = 0;
|
||||
/* max delay is 15 */
|
||||
calc_random_expiration (30, 2000000002, &btimer, &t1);
|
||||
assert_int_equal (14, t1.tv_sec);
|
||||
assert_int_equal (1, t1.tv_nsec);
|
||||
|
||||
t1.tv_sec = 0; t1.tv_nsec = 0;
|
||||
/* max delay is 31 */
|
||||
calc_random_expiration (32, 1, &btimer, &t1);
|
||||
assert_int_equal (3, t1.tv_sec);
|
||||
assert_int_equal (0, t1.tv_nsec);
|
||||
}
|
||||
|
||||
|
||||
@@ -392,16 +459,19 @@ void test_extra_headers ()
|
||||
|
||||
void test_set_current_server()
|
||||
{
|
||||
server_list_t server_list;
|
||||
create_connection_ctx_t ctx;
|
||||
memset (&ctx, 0xFF, sizeof(ctx));
|
||||
memset (&server_list, 0xFF, sizeof(server_list));
|
||||
memset (&ctx, 0, sizeof(ctx));
|
||||
ctx.server_list = &server_list;
|
||||
set_current_server (&ctx);
|
||||
assert_ptr_equal (&ctx.server_list.redirect, ctx.current_server);
|
||||
set_server_null (&ctx.server_list.redirect);
|
||||
assert_ptr_equal (&ctx.server_list->redirect, ctx.current_server);
|
||||
set_server_null (&ctx.server_list->redirect);
|
||||
set_current_server (&ctx);
|
||||
assert_ptr_equal (&ctx.server_list.jwt, ctx.current_server);
|
||||
set_server_null (&ctx.server_list.jwt);
|
||||
assert_ptr_equal (&ctx.server_list->jwt, ctx.current_server);
|
||||
set_server_null (&ctx.server_list->jwt);
|
||||
set_current_server (&ctx);
|
||||
assert_ptr_equal (&ctx.server_list.defaults, ctx.current_server);
|
||||
assert_ptr_equal (&ctx.server_list->defaults, ctx.current_server);
|
||||
}
|
||||
|
||||
void init_cfg_header_info (ParodusCfg *cfg)
|
||||
@@ -617,10 +687,12 @@ void test_nopoll_connect ()
|
||||
|
||||
void test_wait_connection_ready ()
|
||||
{
|
||||
server_list_t server_list;
|
||||
create_connection_ctx_t ctx;
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
memset(&ctx,0,sizeof(ctx));
|
||||
set_server_list_null (&ctx.server_list);
|
||||
ctx.server_list = &server_list;
|
||||
|
||||
mock_wait_status = 0;
|
||||
mock_redirect = NULL;
|
||||
@@ -649,22 +721,22 @@ void test_wait_connection_ready ()
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_false);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
assert_int_equal (wait_connection_ready (&ctx), WAIT_ACTION_RETRY);
|
||||
assert_string_equal (ctx.server_list.redirect.server_addr, "mydns.mycom.net");
|
||||
assert_int_equal (ctx.server_list.redirect.port, 8080);
|
||||
assert_int_equal (0, ctx.server_list.redirect.allow_insecure);
|
||||
assert_ptr_equal (ctx.current_server, &ctx.server_list.redirect);
|
||||
free_server (&ctx.server_list.redirect);
|
||||
assert_string_equal (ctx.server_list->redirect.server_addr, "mydns.mycom.net");
|
||||
assert_int_equal (ctx.server_list->redirect.port, 8080);
|
||||
assert_int_equal (0, ctx.server_list->redirect.allow_insecure);
|
||||
assert_ptr_equal (ctx.current_server, &ctx.server_list->redirect);
|
||||
free_server (&ctx.server_list->redirect);
|
||||
|
||||
mock_wait_status = 303;
|
||||
mock_redirect = "http://mydns.mycom.net";
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_false);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
assert_int_equal (wait_connection_ready (&ctx), WAIT_ACTION_RETRY);
|
||||
assert_string_equal (ctx.server_list.redirect.server_addr, "mydns.mycom.net");
|
||||
assert_int_equal (ctx.server_list.redirect.port, 80);
|
||||
assert_int_equal (1, ctx.server_list.redirect.allow_insecure);
|
||||
assert_ptr_equal (ctx.current_server, &ctx.server_list.redirect);
|
||||
free_server (&ctx.server_list.redirect);
|
||||
assert_string_equal (ctx.server_list->redirect.server_addr, "mydns.mycom.net");
|
||||
assert_int_equal (ctx.server_list->redirect.port, 80);
|
||||
assert_int_equal (1, ctx.server_list->redirect.allow_insecure);
|
||||
assert_ptr_equal (ctx.current_server, &ctx.server_list->redirect);
|
||||
free_server (&ctx.server_list->redirect);
|
||||
|
||||
mock_wait_status = 403;
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_false);
|
||||
@@ -682,6 +754,7 @@ void test_wait_connection_ready ()
|
||||
|
||||
void test_connect_and_wait ()
|
||||
{
|
||||
server_list_t server_list;
|
||||
create_connection_ctx_t ctx;
|
||||
noPollCtx test_nopoll_ctx;
|
||||
server_t test_server;
|
||||
@@ -698,7 +771,9 @@ void test_connect_and_wait ()
|
||||
|
||||
mock_wait_status = 0;
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
memset(&ctx,0,sizeof(ctx));
|
||||
ctx.server_list = &server_list;
|
||||
ctx.nopoll_ctx = &test_nopoll_ctx;
|
||||
ctx.current_server = &test_server;
|
||||
ctx.extra_headers = test_extra_headers;
|
||||
@@ -813,9 +888,9 @@ void test_connect_and_wait ()
|
||||
void test_keep_trying ()
|
||||
{
|
||||
int rtn;
|
||||
server_list_t server_list;
|
||||
create_connection_ctx_t ctx;
|
||||
noPollCtx test_nopoll_ctx;
|
||||
server_t test_server;
|
||||
backoff_timer_t backoff_timer;
|
||||
ParodusCfg Cfg;
|
||||
|
||||
@@ -825,14 +900,16 @@ void test_keep_trying ()
|
||||
|
||||
mock_wait_status = 0;
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
memset(&ctx,0,sizeof(ctx));
|
||||
ctx.server_list = &server_list;
|
||||
ctx.nopoll_ctx = &test_nopoll_ctx;
|
||||
ctx.current_server = &test_server;
|
||||
|
||||
test_server.allow_insecure = 1;
|
||||
test_server.server_addr = "mydns.mycom.net";
|
||||
test_server.port = 8080;
|
||||
|
||||
server_list.defaults.allow_insecure = 1;
|
||||
server_list.defaults.server_addr = "mydns.mycom.net";
|
||||
server_list.defaults.port = 8080;
|
||||
set_current_server (&ctx);
|
||||
|
||||
Cfg.flags = 0;
|
||||
set_parodus_cfg(&Cfg);
|
||||
|
||||
@@ -846,7 +923,7 @@ void test_keep_trying ()
|
||||
rtn = keep_trying_to_connect (&ctx, &backoff_timer);
|
||||
assert_int_equal (rtn, true);
|
||||
|
||||
test_server.allow_insecure = 0;
|
||||
server_list.defaults.allow_insecure = 0;
|
||||
Cfg.flags = FLAGS_IPV4_ONLY;
|
||||
set_parodus_cfg(&Cfg);
|
||||
|
||||
@@ -913,9 +990,12 @@ void test_create_nopoll_connection()
|
||||
{
|
||||
int rtn;
|
||||
ParodusCfg cfg;
|
||||
server_list_t server_list;
|
||||
noPollCtx test_nopoll_ctx;
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.flags = 0;
|
||||
parStrncpy (cfg.webpa_url, "mydns.mycom.net:8080", sizeof(cfg.webpa_url));
|
||||
cfg.boot_time = 25;
|
||||
@@ -928,11 +1008,12 @@ void test_create_nopoll_connection()
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
set_parodus_cfg(&cfg);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_false);
|
||||
|
||||
parStrncpy (cfg.webpa_url, "http://mydns.mycom.net:8080", sizeof(cfg.webpa_url));
|
||||
set_parodus_cfg(&cfg);
|
||||
set_server_list_null (&server_list);
|
||||
|
||||
mock_wait_status = 0;
|
||||
|
||||
@@ -942,12 +1023,13 @@ void test_create_nopoll_connection()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
parStrncpy (cfg.webpa_url, "https://mydns.mycom.net:8080", sizeof(cfg.webpa_url));
|
||||
cfg.flags = 0;
|
||||
set_parodus_cfg(&cfg);
|
||||
set_server_list_null (&server_list);
|
||||
|
||||
will_return (nopoll_conn_tls_new6, &connection1);
|
||||
expect_function_call (nopoll_conn_tls_new6);
|
||||
@@ -959,9 +1041,11 @@ void test_create_nopoll_connection()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
|
||||
will_return (nopoll_conn_tls_new6, &connection1);
|
||||
expect_function_call (nopoll_conn_tls_new6);
|
||||
will_return (nopoll_conn_is_ok, nopoll_false);
|
||||
@@ -986,13 +1070,14 @@ void test_create_nopoll_connection()
|
||||
mock_wait_status = 0;
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
cfg.acquire_jwt = 1;
|
||||
cfg.flags = FLAGS_IPV4_ONLY;
|
||||
set_parodus_cfg(&cfg);
|
||||
set_server_list_null (&server_list);
|
||||
|
||||
will_return (allow_insecure_conn, -1);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
@@ -1010,11 +1095,32 @@ void test_create_nopoll_connection()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
set_server_list_null (&server_list);
|
||||
mock_server_addr = "mydns.myjwtcom.net";
|
||||
mock_port = 80;
|
||||
will_return (allow_insecure_conn, 0);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
will_return (nopoll_conn_tls_new, &connection1);
|
||||
expect_function_call (nopoll_conn_tls_new);
|
||||
will_return (nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_false);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
will_return (nopoll_conn_tls_new, &connection1);
|
||||
expect_function_call (nopoll_conn_tls_new);
|
||||
will_return (nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
cfg.flags = 0;
|
||||
set_parodus_cfg(&cfg);
|
||||
set_server_list_null (&server_list);
|
||||
|
||||
will_return (allow_insecure_conn, -1);
|
||||
expect_function_call (allow_insecure_conn);
|
||||
@@ -1029,13 +1135,12 @@ void test_create_nopoll_connection()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
void test_get_interface_down_event()
|
||||
{
|
||||
assert_false(get_interface_down_event());
|
||||
@@ -1056,6 +1161,7 @@ void test_interface_down_retry()
|
||||
int rtn;
|
||||
ParodusCfg cfg;
|
||||
noPollCtx test_nopoll_ctx;
|
||||
server_list_t server_list;
|
||||
pthread_t thread_a;
|
||||
|
||||
pthread_create(&thread_a, NULL, a, NULL);
|
||||
@@ -1073,7 +1179,8 @@ void test_interface_down_retry()
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
set_parodus_cfg(&cfg);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
set_server_list_null (&server_list);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_false);
|
||||
|
||||
parStrncpy (cfg.webpa_url, "http://mydns.mycom.net:8080", sizeof(cfg.webpa_url));
|
||||
@@ -1087,7 +1194,8 @@ void test_interface_down_retry()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
set_server_list_null (&server_list);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
parStrncpy (cfg.webpa_url, "https://mydns.mycom.net:8080", sizeof(cfg.webpa_url));
|
||||
@@ -1104,7 +1212,8 @@ void test_interface_down_retry()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
set_server_list_null (&server_list);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
will_return (nopoll_conn_tls_new6, &connection1);
|
||||
@@ -1131,7 +1240,8 @@ void test_interface_down_retry()
|
||||
mock_wait_status = 0;
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
set_server_list_null (&server_list);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
@@ -1155,7 +1265,8 @@ void test_interface_down_retry()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
set_server_list_null (&server_list);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
|
||||
cfg.flags = 0;
|
||||
@@ -1174,14 +1285,13 @@ void test_interface_down_retry()
|
||||
expect_function_call (nopoll_conn_is_ok);
|
||||
will_return (nopoll_conn_wait_for_status_until_connection_ready, nopoll_true);
|
||||
expect_function_call (nopoll_conn_wait_for_status_until_connection_ready);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx);
|
||||
set_server_list_null (&server_list);
|
||||
rtn = createNopollConnection (&test_nopoll_ctx, &server_list);
|
||||
assert_int_equal (rtn, nopoll_true);
|
||||
#endif
|
||||
pthread_join(thread_a, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -1208,7 +1318,7 @@ int main(void)
|
||||
cmocka_unit_test(test_wait_connection_ready),
|
||||
cmocka_unit_test(test_connect_and_wait),
|
||||
cmocka_unit_test(test_keep_trying),
|
||||
cmocka_unit_test(test_create_nopoll_connection),
|
||||
cmocka_unit_test(test_create_nopoll_connection),
|
||||
cmocka_unit_test(test_get_interface_down_event),
|
||||
cmocka_unit_test(test_interface_down_retry)
|
||||
};
|
||||
|
||||
@@ -341,7 +341,7 @@ void test_createConnection()
|
||||
|
||||
int ret = createNopollConnection(ctx);
|
||||
assert_int_equal(ret, nopoll_true);
|
||||
assert_string_equal(get_parodus_cfg()->cloud_status, CLOUD_STATUS_ONLINE);
|
||||
assert_string_equal(get_cloud_status(), CLOUD_STATUS_ONLINE);
|
||||
free(cfg);
|
||||
if (g_jwt_server_ip !=NULL)
|
||||
{
|
||||
|
||||
@@ -125,6 +125,10 @@ int processCrudRequest(wrp_msg_t *reqMsg, wrp_msg_t **responseMsg )
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
char* getWebpaInterface(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -32,8 +32,10 @@
|
||||
#include "../src/connection.h"
|
||||
#include "../src/close_retry.h"
|
||||
|
||||
bool LastReasonStatus;
|
||||
pthread_mutex_t close_mut;
|
||||
char *get_global_reconnect_reason()
|
||||
{
|
||||
return "parodus_stopping";
|
||||
}
|
||||
|
||||
void set_global_reconnect_reason(char *reason)
|
||||
{
|
||||
@@ -1528,7 +1530,7 @@ void test_retrieveObject_cloud_status()
|
||||
ret = retrieveObject(reqMsg, &respMsg);
|
||||
assert_int_equal (respMsg->u.crud.status, 200);
|
||||
assert_int_equal (ret, 0);
|
||||
assert_string_equal(get_parodus_cfg()->cloud_status, CLOUD_STATUS_ONLINE);
|
||||
assert_string_equal(get_cloud_status(), CLOUD_STATUS_ONLINE);
|
||||
assert_int_equal (respMsg->u.crud.payload_size, 25);
|
||||
|
||||
fp = fopen(cfg.crud_config_file, "r");
|
||||
|
||||
@@ -28,14 +28,11 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
volatile unsigned int heartBeatTimer;
|
||||
bool LastReasonStatus;
|
||||
bool interface_down_event = false;
|
||||
int closeReason = 0;
|
||||
pthread_mutex_t close_mut;
|
||||
pthread_mutex_t interface_down_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t interface_down_con=PTHREAD_COND_INITIALIZER;
|
||||
bool close_retry;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -30,10 +30,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
volatile unsigned int heartBeatTimer;
|
||||
bool LastReasonStatus;
|
||||
pthread_mutex_t close_mut;
|
||||
bool close_retry;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "../src/parodus_log.h"
|
||||
#include "../src/nopoll_helpers.h"
|
||||
#include "../src/config.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -32,7 +33,9 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static noPollConn *conn;
|
||||
static noPollConn *conn = NULL;
|
||||
static ParodusCfg cfg;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -54,6 +57,12 @@ nopoll_bool nopoll_conn_is_ready( noPollConn *conn )
|
||||
return (nopoll_bool)mock();
|
||||
}
|
||||
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
function_called();
|
||||
return &cfg;
|
||||
}
|
||||
|
||||
int __nopoll_conn_send_common (noPollConn * conn, const char * content, long length, nopoll_bool has_fin, long sleep_in_header, noPollOpCode frame_type)
|
||||
{
|
||||
UNUSED(has_fin); UNUSED(sleep_in_header); UNUSED(frame_type); UNUSED(content);
|
||||
@@ -122,6 +131,11 @@ bool get_interface_down_event()
|
||||
return false;
|
||||
}
|
||||
|
||||
char *get_cloud_status(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -212,13 +226,8 @@ void test_sendMessage()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_value(nopoll_conn_is_ready, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ready);
|
||||
cfg.cloud_status = CLOUD_STATUS_ONLINE;
|
||||
expect_function_calls (get_parodus_cfg, 1);
|
||||
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn, (intptr_t)conn);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
@@ -228,81 +237,23 @@ void test_sendMessage()
|
||||
sendMessage(conn, "Hello Parodus!", len);
|
||||
}
|
||||
|
||||
void connStuck_sendMessage()
|
||||
void test_sendMessageOffline()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
/* Initialize the timer when connection gets stuck */
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
/* When connection recovers within 10 mins, it should be able to re-connect */
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
will_return(timeValDiff, 5*60*1000);
|
||||
expect_function_call(timeValDiff);
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_value(nopoll_conn_is_ready, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ready);
|
||||
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn, (intptr_t)conn);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
will_return(__nopoll_conn_send_common, len);
|
||||
expect_function_calls(__nopoll_conn_send_common, 1);
|
||||
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
cfg.cloud_status = CLOUD_STATUS_OFFLINE;
|
||||
expect_function_calls (get_parodus_cfg, 1);
|
||||
sendMessage(conn, "Hello Parodus!", len);
|
||||
|
||||
/* When timer exceeds more than 10 mins kill the process */
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
will_return(timeValDiff, 10*60*1000);
|
||||
expect_function_call(timeValDiff);
|
||||
|
||||
will_return(kill, 1);
|
||||
expect_function_call(kill);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
}
|
||||
|
||||
void err_sendMessage()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_value(nopoll_conn_is_ready, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ready);
|
||||
|
||||
cfg.cloud_status = CLOUD_STATUS_ONLINE;
|
||||
expect_function_calls (get_parodus_cfg, 1);
|
||||
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn,(intptr_t) conn);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
will_return(__nopoll_conn_send_common, len-2);
|
||||
@@ -320,11 +271,13 @@ void err_sendMessageConnNull()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
cfg.cloud_status = CLOUD_STATUS_ONLINE;
|
||||
expect_function_calls (get_parodus_cfg, 1);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn, NULL);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
will_return(__nopoll_conn_send_common, len);
|
||||
expect_function_calls(__nopoll_conn_send_common, 1);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
}
|
||||
@@ -349,7 +302,7 @@ int main(void)
|
||||
cmocka_unit_test(err_sendResponseFlushWrites),
|
||||
cmocka_unit_test(err_sendResponseConnNull),
|
||||
cmocka_unit_test(test_sendMessage),
|
||||
cmocka_unit_test(connStuck_sendMessage),
|
||||
cmocka_unit_test(test_sendMessageOffline),
|
||||
cmocka_unit_test(err_sendMessage),
|
||||
cmocka_unit_test(err_sendMessageConnNull),
|
||||
cmocka_unit_test(test_reportLog),
|
||||
|
||||
@@ -32,6 +32,7 @@ static void *client_rcv_task();
|
||||
static void *keep_alive_thread();
|
||||
static void add_client();
|
||||
int sock1;
|
||||
int numLoops;
|
||||
pthread_t threadId;
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
@@ -160,6 +160,7 @@ extern unsigned int get_algo_mask (const char *algo_str);
|
||||
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
int numLoops;
|
||||
|
||||
pthread_cond_t *get_global_crud_con(void)
|
||||
{
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
#include <pthread.h>
|
||||
#include "../src/token.h"
|
||||
|
||||
int numLoops;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
|
||||
@@ -44,10 +44,12 @@ extern size_t metaPackSize;
|
||||
extern UpStreamMsg *UpStreamMsgQ;
|
||||
int numLoops = 1;
|
||||
int deviceIDNull =0;
|
||||
char webpa_interface[64]={'\0'};
|
||||
wrp_msg_t *temp = NULL;
|
||||
extern pthread_mutex_t nano_mut;
|
||||
extern pthread_cond_t nano_con;
|
||||
static int crud_test = 0;
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -116,6 +118,27 @@ ParodusCfg *get_parodus_cfg(void)
|
||||
return &parodusCfg;
|
||||
}
|
||||
|
||||
char *getWebpaInterface(void)
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used));
|
||||
#else
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
#endif
|
||||
set_parodus_cfg(&cfg);
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n");
|
||||
pthread_mutex_lock (&config_mut);
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
pthread_mutex_unlock (&config_mut);
|
||||
#else
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
#endif
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
ssize_t wrp_pack_metadata( const data_t *packData, void **data )
|
||||
{
|
||||
(void) packData; (void) data;
|
||||
|
||||
@@ -46,10 +46,11 @@ extern size_t metaPackSize;
|
||||
extern UpStreamMsg *UpStreamMsgQ;
|
||||
int numLoops = 1;
|
||||
int deviceIDNull =0;
|
||||
char webpa_interface[64]={'\0'};
|
||||
wrp_msg_t *reg_msg = NULL;
|
||||
extern pthread_mutex_t nano_mut;
|
||||
extern pthread_cond_t nano_con;
|
||||
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -101,6 +102,27 @@ ParodusCfg *get_parodus_cfg(void)
|
||||
return &parodusCfg;
|
||||
}
|
||||
|
||||
char *getWebpaInterface(void)
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used));
|
||||
#else
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
#endif
|
||||
set_parodus_cfg(&cfg);
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n");
|
||||
pthread_mutex_lock (&config_mut);
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
pthread_mutex_unlock (&config_mut);
|
||||
#else
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
#endif
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
/*-------------------------------------------
|
||||
int nn_connect (int s, const char *addr)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user